Преглед на файлове

Merge remote-tracking branch 'origin/master'

yuhongqi преди 2 седмици
родител
ревизия
dc00140a70
променени са 23 файла, в които са добавени 294 реда и са изтрити 29 реда
  1. 96 0
      fs-company/src/main/java/com/fs/company/controller/company/CompanyAiWorkflowController.java
  2. 39 2
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  3. 11 3
      fs-company/src/main/java/com/fs/company/controller/course/FsCourseWatchLogController.java
  4. 12 3
      fs-company/src/main/java/com/fs/user/FsUserAdminController.java
  5. 3 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseMapper.java
  6. 3 0
      fs-service/src/main/java/com/fs/his/domain/FsAiWorkflow.java
  7. 5 0
      fs-service/src/main/java/com/fs/his/mapper/FsAiWorkflowMapper.java
  8. 8 0
      fs-service/src/main/java/com/fs/his/mapper/FsAiWorkflowNodeMapper.java
  9. 18 0
      fs-service/src/main/java/com/fs/his/service/IFsAiWorkflowService.java
  10. 46 0
      fs-service/src/main/java/com/fs/his/service/impl/FsAiWorkflowServiceImpl.java
  11. 11 10
      fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java
  12. 4 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveCouponServiceImpl.java
  13. 1 1
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  14. 1 0
      fs-service/src/main/java/com/fs/qw/mapper/QwFriendWelcomeMapper.java
  15. 1 0
      fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java
  16. 1 0
      fs-service/src/main/resources/mapper/course/FsCourseFinishTempParentMapper.xml
  17. 11 1
      fs-service/src/main/resources/mapper/his/FsAiWorkflowMapper.xml
  18. 12 0
      fs-service/src/main/resources/mapper/his/FsAiWorkflowNodeMapper.xml
  19. 2 2
      fs-service/src/main/resources/mapper/live/LiveAfterSalesMapper.xml
  20. 1 0
      fs-service/src/main/resources/mapper/qw/QwFriendWelcomeMapper.xml
  21. 2 2
      fs-service/src/main/resources/mapper/sop/QwSopTempVoiceMapper.xml
  22. 4 4
      fs-user-app/src/main/java/com/fs/app/controller/InquiryOrderController.java
  23. 2 1
      fs-user-app/src/main/java/com/fs/app/controller/live/LiveOrderController.java

+ 96 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyAiWorkflowController.java

@@ -0,0 +1,96 @@
+package com.fs.company.controller.company;
+
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.utils.ServletUtils;
+import com.fs.framework.security.LoginUser;
+import com.fs.framework.service.TokenService;
+import com.fs.his.domain.FsAiWorkflow;
+import com.fs.his.domain.FsAiWorkflowNode;
+import com.fs.his.service.IFsAiWorkflowService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 企业AI工作流Controller
+ *
+ * @author fs
+ * @date 2026-01-09
+ */
+@RestController
+@RequestMapping("/company/aiWorkflow")
+public class CompanyAiWorkflowController extends BaseController {
+
+    @Autowired
+    private IFsAiWorkflowService fsAiWorkflowService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 分页查询AI工作流列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(FsAiWorkflow fsAiWorkflow) {
+        startPage();
+        List<FsAiWorkflow> list = fsAiWorkflowService.selectFsAiWorkflowList(fsAiWorkflow);
+        return getDataTable(list);
+    }
+
+    /**
+     * 根据企业用户ID获取工作流的关键节点
+     * 节点类型: start(开始), end(结束), ai_chat(AI对话)
+     */
+    @GetMapping("/nodes/{companyUserId}")
+    public R getWorkflowNodes(@PathVariable("companyUserId") Long companyUserId) {
+        // 定义要查询的节点类型
+        List<String> nodeTypes = Arrays.asList("start", "end", "ai_chat");
+        List<FsAiWorkflowNode> nodes = fsAiWorkflowService.selectWorkflowNodesByCompanyUserId(companyUserId, nodeTypes);
+        return R.ok().put("data", nodes);
+    }
+
+    /**
+     * 获取当前登录企业用户的工作流关键节点
+     * 节点类型: start(开始), end(结束), ai_chat(AI对话)
+     */
+    @GetMapping("/myNodes")
+    public R getMyWorkflowNodes() {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (loginUser == null || loginUser.getUser() == null) {
+            return R.error("用户信息错误");
+        }
+        Long companyUserId = loginUser.getUser().getUserId();
+        List<String> nodeTypes = Arrays.asList("start", "end", "ai_chat");
+        List<FsAiWorkflowNode> nodes = fsAiWorkflowService.selectWorkflowNodesByCompanyUserId(companyUserId, nodeTypes);
+        return R.ok().put("data", nodes);
+    }
+
+    /**
+     * 更新节点的语音URL
+     * @param nodeId 节点ID
+     * @param voiceUrl 语音URL
+     */
+    @PutMapping("/node/voiceUrl")
+    public R updateNodeVoiceUrl(@RequestParam("nodeId") Long nodeId,
+                                @RequestParam("voiceUrl") String voiceUrl) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (loginUser == null || loginUser.getUser() == null) {
+            return R.error("用户信息错误");
+        }
+        Long companyUserId = loginUser.getUser().getUserId();
+
+        int result = fsAiWorkflowService.updateNodeVoiceUrl(nodeId, voiceUrl, companyUserId);
+        if (result == -1) {
+            return R.error("节点不存在");
+        } else if (result == -2) {
+            return R.error("无权限修改该节点");
+        } else if (result > 0) {
+            return R.ok("更新成功");
+        }
+        return R.error("更新失败");
+    }
+}

+ 39 - 2
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -135,6 +135,7 @@ public class CompanyUserController extends BaseController {
     /**
      * 获取用户列表
      */
+    @PreAuthorize("@ss.hasPermi('company:user:deptList')")
     @GetMapping("/deptList")
     public TableDataInfo deptList(CompanyUser user)
     {
@@ -160,7 +161,6 @@ public class CompanyUserController extends BaseController {
         return getDataTable(list);
     }
 
-
     @GetMapping("/getUserList")
     public R getUserList()
     {
@@ -215,6 +215,43 @@ public class CompanyUserController extends BaseController {
         return getDataTable(list);
     }
 
+    @GetMapping("/myQwList")
+    public TableDataInfo myQwList(CompanyUserQwParam user) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+//        user.setCompanyId(loginUser.getCompany().getCompanyId());
+        user.setUserId(loginUser.getUser().getUserId());
+        List<CompanyUserQwListVO> list = companyUserService.selectCompanyUserQwListVO(user);
+        if (!list.isEmpty()){
+            String json = configService.selectConfigByKey("course.config");
+            CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+            Long sendDelayTime = config.getSendDelayTime();
+            List<CompletableFuture<Void>> futures = new ArrayList<>();
+            for (CompanyUserQwListVO companyUserQwListVO : list) {
+                CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                    CompanyUserDelayTime companyUserDelayTime = companyUserDelayTimeService.selectCompanyUserDelayTimeByCompanyUser(companyUserQwListVO.getCompanyId(), companyUserQwListVO.getUserId());
+                    if (ObjectUtil.isEmpty(companyUserDelayTime)) {
+                        companyUserQwListVO.setSendDelayTime(sendDelayTime);
+                    } else {
+                        companyUserQwListVO.setSendDelayTime(companyUserDelayTime.getSendDelayTime());
+                    }
+                    //是否绑定
+                    if(QwStatusEnum.BOUND.getCode() == companyUserQwListVO.getQwStatus()){
+                        if(!StringUtil.strIsNullOrEmpty(companyUserQwListVO.getQwUserId())){
+                            Long[] ids = Arrays.stream(companyUserQwListVO.getQwUserId().split(","))
+                                    .map(Long::parseLong)
+                                    .toArray(Long[]::new);
+                            List<QwUserVO> qwUserVOS = qwUserService.selectQwUserVOByIds(ids);
+                            companyUserQwListVO.setQwUsers(qwUserVOS);
+                        }
+                    }
+                });
+                futures.add(future);
+            }
+            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+        }
+        return getDataTable(list);
+    }
+
     @Log(title = "用户管理导出", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('company:user:export')")
     @GetMapping("/export")
@@ -414,7 +451,7 @@ public class CompanyUserController extends BaseController {
     /**
      * 重置密码
      */
-    @PreAuthorize("@ss.hasPermi('company:user:edit')")
+    @PreAuthorize("@ss.hasPermi('company:user:resetPwd')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PutMapping("/resetPwd")
     public AjaxResult resetPwd(@RequestBody CompanyUser user)

+ 11 - 3
fs-company/src/main/java/com/fs/company/controller/course/FsCourseWatchLogController.java

@@ -104,11 +104,19 @@ public class FsCourseWatchLogController extends BaseController
 
 
         List<Long> combinedList = new ArrayList<>();
-        //本部门
-        Long deptId = loginUser.getUser().getDeptId();
-        if (deptId!=null){
+        Long deptId;
+
+        if(param.getDeptId() != null){
+            deptId = param.getDeptId();
             combinedList.add(deptId);
+        }else{
+            //本部门
+            deptId = loginUser.getUser().getDeptId();
+            if (deptId!=null){
+                combinedList.add(deptId);
+            }
         }
+
         //本部门的下级部门
         List<Long> deptList = companyDeptService.selectCompanyDeptByParentId(deptId);
         if (!deptList.isEmpty()){

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

@@ -36,6 +36,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
+import java.util.List;
 
 @Api(tags = "会员管理接口")
 @RestController
@@ -47,9 +48,6 @@ public class FsUserAdminController extends BaseController {
     @Autowired
     private IFsUserService fsUserService;
 
-    @Autowired
-    private ICompanyUserCacheService companyUserCacheService;
-
     @Autowired
     private TokenService tokenService;
 
@@ -65,6 +63,7 @@ public class FsUserAdminController extends BaseController {
     @Autowired
     private IFsUserCompanyUserService fsUserCompanyUserService;
 
+
     @PreAuthorize("@ss.hasPermi('user:fsUser:list')")
     @PostMapping("/list")
     @ApiOperation("会员列表(与移动端使用的相同查询)")
@@ -192,4 +191,14 @@ public class FsUserAdminController extends BaseController {
         return openIMService.batchSendCourse(batchSendCourseDTO);
     }
 
+    @PreAuthorize("@ss.hasPermi('his:user:unbind')")
+    @Log(title = "批量解绑会员(删除销售和会员的关系)", businessType = BusinessType.DELETE)
+    @DeleteMapping("/batchUnbind")
+    public AjaxResult batchUnbind(@RequestBody List<Long> userIds){
+        if(!userIds.isEmpty()){
+            return toAjax(fsUserCompanyUserService.batchUnbind(userIds));
+        } else {
+            return error("请先选择会员");
+        }
+    }
 }

+ 3 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseMapper.java

@@ -220,6 +220,9 @@ public interface FsUserCourseMapper
             "<if test = ' maps.cateId !=null '> " +
             "and (cc.cate_id =#{maps.cateId} or cc.pid=#{maps.cateId} )" +
             "</if>" +
+            "<if test = ' maps.courseId !=null '> " +
+            "and (c.course_id =#{maps.courseId})" +
+            "</if>" +
             "<if test = ' maps.courseName!=null and maps.courseName != \"\" '> " +
             "and c.course_name like concat('%', #{maps.courseName}, '%') " +
             "</if>" +

+ 3 - 0
fs-service/src/main/java/com/fs/his/domain/FsAiWorkflow.java

@@ -41,4 +41,7 @@ public class FsAiWorkflow extends BaseEntity {
 
     /** 删除标志 0正常 1删除 */
     private Integer delFlag;
+
+    /** 企业用户ID */
+    private Long companyUserId;
 }

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

@@ -15,6 +15,11 @@ public interface FsAiWorkflowMapper {
 
     List<FsAiWorkflow> selectFsAiWorkflowList(FsAiWorkflow fsAiWorkflow);
 
+    /**
+     * 根据企业用户ID查询工作流列表
+     */
+    List<FsAiWorkflow> selectFsAiWorkflowByCompanyUserId(Long companyUserId);
+
     int insertFsAiWorkflow(FsAiWorkflow fsAiWorkflow);
 
     int updateFsAiWorkflow(FsAiWorkflow fsAiWorkflow);

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

@@ -1,6 +1,8 @@
 package com.fs.his.mapper;
 
 import com.fs.his.domain.FsAiWorkflowNode;
+import org.apache.ibatis.annotations.Param;
+
 import java.util.List;
 
 /**
@@ -15,6 +17,12 @@ public interface FsAiWorkflowNodeMapper {
 
     List<FsAiWorkflowNode> selectFsAiWorkflowNodeByWorkflowId(Long workflowId);
 
+    /**
+     * 根据工作流ID和节点类型列表查询节点
+     */
+    List<FsAiWorkflowNode> selectNodesByWorkflowIdAndTypes(@Param("workflowId") Long workflowId,
+                                                           @Param("nodeTypes") List<String> nodeTypes);
+
     int insertFsAiWorkflowNode(FsAiWorkflowNode node);
 
     int batchInsertFsAiWorkflowNode(List<FsAiWorkflowNode> nodes);

+ 18 - 0
fs-service/src/main/java/com/fs/his/service/IFsAiWorkflowService.java

@@ -1,6 +1,7 @@
 package com.fs.his.service;
 
 import com.fs.his.domain.FsAiWorkflow;
+import com.fs.his.domain.FsAiWorkflowNode;
 import com.fs.his.domain.FsAiWorkflowNodeType;
 import com.fs.his.param.FsAiWorkflowSaveParam;
 import com.fs.his.vo.FsAiWorkflowExportVO;
@@ -54,4 +55,21 @@ public interface IFsAiWorkflowService {
      * 导出工作流JSON(包含节点、连接顺序、节点类型)
      */
     FsAiWorkflowExportVO exportWorkflowJson(Long workflowId);
+
+    /**
+     * 根据企业用户ID查询工作流的指定类型节点
+     * @param companyUserId 企业用户ID
+     * @param nodeTypes 节点类型列表(如: start, end, ai_chat)
+     * @return 节点列表
+     */
+    List<FsAiWorkflowNode> selectWorkflowNodesByCompanyUserId(Long companyUserId, List<String> nodeTypes);
+
+    /**
+     * 更新节点的voiceUrl
+     * @param nodeId 节点ID
+     * @param voiceUrl 语音URL
+     * @param companyUserId 企业用户ID(用于校验归属)
+     * @return 1成功 0失败 -1节点不存在 -2无权限
+     */
+    int updateNodeVoiceUrl(Long nodeId, String voiceUrl, Long companyUserId);
 }

+ 46 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsAiWorkflowServiceImpl.java

@@ -253,4 +253,50 @@ public class FsAiWorkflowServiceImpl implements IFsAiWorkflowService {
             default: return "";
         }
     }
+
+    @Override
+    public List<FsAiWorkflowNode> selectWorkflowNodesByCompanyUserId(Long companyUserId, List<String> nodeTypes) {
+        // 根据企业用户ID查询工作流
+        List<FsAiWorkflow> workflows = fsAiWorkflowMapper.selectFsAiWorkflowByCompanyUserId(companyUserId);
+        if (workflows == null || workflows.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        // 收集所有工作流的指定类型节点
+        List<FsAiWorkflowNode> result = new ArrayList<>();
+        for (FsAiWorkflow workflow : workflows) {
+            List<FsAiWorkflowNode> nodes = fsAiWorkflowNodeMapper.selectNodesByWorkflowIdAndTypes(
+                    workflow.getWorkflowId(), nodeTypes);
+            if (nodes != null) {
+                result.addAll(nodes);
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public int updateNodeVoiceUrl(Long nodeId, String voiceUrl, Long companyUserId) {
+        // 1. 查询节点是否存在
+        FsAiWorkflowNode node = fsAiWorkflowNodeMapper.selectFsAiWorkflowNodeById(nodeId);
+        if (node == null) {
+            return -1; // 节点不存在
+        }
+
+        // 2. 查询节点所属的工作流
+        FsAiWorkflow workflow = fsAiWorkflowMapper.selectFsAiWorkflowById(node.getWorkflowId());
+        if (workflow == null) {
+            return -1; // 工作流不存在
+        }
+
+        // 3. 校验工作流是否属于该企业用户
+        if (workflow.getCompanyUserId() == null || !workflow.getCompanyUserId().equals(companyUserId)) {
+            return -2; // 无权限
+        }
+
+        // 4. 更新voiceUrl
+        FsAiWorkflowNode updateNode = new FsAiWorkflowNode();
+        updateNode.setNodeId(nodeId);
+        updateNode.setVoiceUrl(voiceUrl);
+        return fsAiWorkflowNodeMapper.updateFsAiWorkflowNode(updateNode);
+    }
 }

+ 11 - 10
fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java

@@ -397,7 +397,7 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
                 if (remainingIntegral < 0) {
                     throw new CustomException("积分不足,无法创建订单");
                 }
-                
+
                 //写入日志
                 FsUser userMap=new FsUser();
                 userMap.setUserId(user.getUserId());
@@ -749,7 +749,7 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
             }
 
             List<Long> goodsIds = new ArrayList<>();
-            
+
             // 解析订单商品信息,获取商品ID列表
             if (order.getItemJson().startsWith("[") && order.getItemJson().endsWith("]")) {
                 // 多个商品
@@ -862,10 +862,11 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
             fsUserIntegralLogs.setBalance(fsUser.getIntegral());
             fsUserIntegralLogs.setBusinessId(fsIntegralOrder.getOrderId().toString());
             fsUserIntegralLogs.setUserId(fsIntegralOrder.getUserId());
-            fsUserIntegralLogs.setLogType(20);
+            fsUserIntegralLogs.setLogType(FsUserIntegralLogTypeEnum.TYPE_27.getValue());//20
             fsUserIntegralLogs.setIntegral(Long.parseLong(fsIntegralOrder.getIntegral()));
             fsUserIntegralLogs.setBusinessType(2);
             fsUserIntegralLogs.setStatus(0);
+            fsUserIntegralLogs.setCreateTime(new Date());
             i = fsUserIntegralLogsMapper.insertFsUserIntegralLogs(fsUserIntegralLogs);
         }
         return i;
@@ -1105,11 +1106,11 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
             throw new ServiceException("导入数据不能为空!");
         }
         FsIntegralOrderImportResultVO result = new FsIntegralOrderImportResultVO();
-        
+
         for (int i = 0; i < list.size(); i++) {
             FsIntegralOrderExcelVO vo = list.get(i);
             int rowNum = i + 2; // Excel行号从2开始(第1行是表头)
-            
+
             try {
                 //1.必填参数
                 ExcelUtils.validateRequiredFields(vo, rowNum);
@@ -1124,11 +1125,11 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
                     result.setFailureNum(result.getFailureNum() + 1);
                     continue;
                 }
-                
+
                 FsIntegralOrder param = new FsIntegralOrder(); //修改订单的参数
                 param.setOrderCode(vo.getOrderCode());
                 param.setOrderId(order.getOrderId());
-                
+
                 if ("6".equals(vo.getStatus())) {
                     FsIntegralOrderImportResultVO.ImportResultItem item = new FsIntegralOrderImportResultVO.ImportResultItem();
                     item.setRowNum(rowNum);
@@ -1183,7 +1184,7 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
                         continue;
                     }
                 }
-                
+
                 // 处理物流字段(非必须,填了就更新)
                 if (StringUtils.isNotBlank(vo.getDeliveryCode())) {
                     param.setDeliveryCode(vo.getDeliveryCode());
@@ -1194,7 +1195,7 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
                 if (StringUtils.isNotBlank(vo.getDeliverySn())) {
                     param.setDeliverySn(vo.getDeliverySn());
                 }
-                
+
                 param.setDeliveryStatus((vo.getDeliveryStatus()==null|| vo.getDeliveryStatus().isEmpty())?null:Integer.valueOf(vo.getDeliveryStatus()));
                 param.setDeliveryType(vo.getDeliveryType().isEmpty()?null:vo.getDeliveryType());
                 param.setUpdateTime(DateUtils.getNowDate());
@@ -1216,7 +1217,7 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
                 result.setFailureNum(result.getFailureNum() + 1);
             }
         }
-        
+
         return result;
     }
 

+ 4 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveCouponServiceImpl.java

@@ -350,6 +350,10 @@ public class LiveCouponServiceImpl implements ILiveCouponService
         userRecord.setIsDel(0);
         userRecord.setGoodsId(coupon.getGoodsId());
         userRecord.setType("live-"+coupon.getLiveId());
+        //库存 remain_count
+        issue.setRemainCount(issue.getRemainCount()-1);
+        liveCouponIssueService.updateLiveCouponIssue(issue);
+
         liveCouponUserService.insertLiveCouponUser(userRecord);
         liveCouponIssueUserService.insertLiveCouponIssueUser(record);
 

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

@@ -237,6 +237,7 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "left join qw_contact_way cw on cw.id = ec.way_id " +
             "left join qw_contact_way_group wg on wg.id=cw.group_id" +
             "<where>  \n" +
+            "            <if test=\"id != null  and id != ''\"> and ec.id   like concat( #{id}, '%') </if>\n" +
             "            <if test=\"userId != null  and userId != ''\"> and ec.user_id   like concat( #{userId}, '%') </if>\n" +
             "            <if test=\"qwUserName != null  and qwUserName != ''\"> and qu.qw_user_name   like concat( #{qwUserName}, '%') </if>\n" +
             "            <if test=\"externalUserId != null  and externalUserId != ''\"> and ec.external_user_id = #{externalUserId}</if>\n" +
@@ -270,7 +271,6 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "            <if test=\"companyUserId != null \"> and ec.company_user_id = #{companyUserId}</if>\n" +
             "            <if test=\"customerId != null \"> and ec.customer_id = #{customerId}</if>\n" +
             "            <if test=\"status != null \"> and ec.status = #{status}</if>\n" +
-            "            <if test=\"status != null \"> and ec.status = #{status}</if>\n" +
             "<if test = \"statusCondition != null and  statusCondition.length > 0 \" > " +
             "   AND ec.status in " +
             "   <foreach collection='statusCondition' item='item' open='(' separator=',' close=')'> " +

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

@@ -88,6 +88,7 @@ public interface QwFriendWelcomeMapper
             "           AND qu.qw_user_id = #{qwUserIds} " +
             "       ) AND " +
             "   </if>" +
+            "   <if test=\"id != null  and id != ''\"> qfw.id like concat( #{id}, '%') AND </if>\n" +
             "   <if test=\"isSendMsg != null\"> qfw.is_send_msg = #{isSendMsg} AND </if>" +
             "  <if test=\"createTime != null \"> DATE(qfw.create_time) = DATE(#{createTime}) AND</if>\n" +
             "  <if test=\"updateTime != null \"> DATE(qfw.update_time) = DATE(#{updateTime}) AND</if>\n" +

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

@@ -151,6 +151,7 @@ public interface QwUserMapper extends BaseMapper<QwUser>
             "RIGHT JOIN qw_dept qd on qu.department=qd.dept_id and qd.corp_id=qu.corp_id " +
             "left join fastgpt_role fr on fr.role_id=qu.fastGpt_role_id " +
             "where qu.company_user_id is not null "+
+            "            <if test=\"id != null  and id != ''\"> and qu.id = #{id}</if>\n" +
             "            <if test=\"qwUserId != null  and qwUserId != ''\"> and qu.qw_user_id = #{qwUserId}</if>\n" +
             "            <if test=\"loginStatus != null \"> and qu.ipad_status = #{loginStatus}</if>\n" +
             "            <if test=\"appKey != null  and appKey != ''\"> and qu.app_key = #{appKey}</if>\n" +

+ 1 - 0
fs-service/src/main/resources/mapper/course/FsCourseFinishTempParentMapper.xml

@@ -23,6 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectFsCourseFinishTempParentList" parameterType="FsCourseFinishTempParent" resultMap="FsCourseFinishTempParentResult">
         <include refid="selectFsCourseFinishTempParentVo"/>
         <where>
+            <if test="id != null "> and id = #{id}</if>
             <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
             <if test="courseId != null "> and course_id = #{courseId}</if>
             <if test="companyId != null "> and company_id = #{companyId}</if>

+ 11 - 1
fs-service/src/main/resources/mapper/his/FsAiWorkflowMapper.xml

@@ -16,11 +16,12 @@
         <result property="updateTime" column="update_time"/>
         <result property="remark" column="remark"/>
         <result property="delFlag" column="del_flag"/>
+        <result property="companyUserId" column="company_user_id"/>
     </resultMap>
 
     <sql id="selectFsAiWorkflowVo">
         select workflow_id, workflow_name, workflow_desc, workflow_type, status, version,
-               canvas_data, create_by, create_time, update_by, update_time, remark, del_flag
+               canvas_data, create_by, create_time, update_by, update_time, remark, del_flag, company_user_id
         from fs_ai_workflow
     </sql>
 
@@ -33,6 +34,7 @@
             </if>
             <if test="workflowType != null">and workflow_type = #{workflowType}</if>
             <if test="status != null">and status = #{status}</if>
+            <if test="companyUserId != null">and company_user_id = #{companyUserId}</if>
         </where>
         order by create_time desc
     </select>
@@ -42,6 +44,12 @@
         where workflow_id = #{workflowId} and del_flag = 0
     </select>
 
+    <select id="selectFsAiWorkflowByCompanyUserId" parameterType="Long" resultMap="FsAiWorkflowResult">
+        <include refid="selectFsAiWorkflowVo"/>
+        where company_user_id = #{companyUserId} and del_flag = 0 and status = 1
+        order by create_time desc
+    </select>
+
     <insert id="insertFsAiWorkflow" parameterType="FsAiWorkflow" useGeneratedKeys="true" keyProperty="workflowId">
         insert into fs_ai_workflow
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -54,6 +62,7 @@
             <if test="createBy != null">create_by,</if>
             <if test="createTime != null">create_time,</if>
             <if test="remark != null">remark,</if>
+            <if test="companyUserId != null">company_user_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="workflowName != null and workflowName != ''">#{workflowName},</if>
@@ -65,6 +74,7 @@
             <if test="createBy != null">#{createBy},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="remark != null">#{remark},</if>
+            <if test="companyUserId != null">#{companyUserId},</if>
         </trim>
     </insert>
 

+ 12 - 0
fs-service/src/main/resources/mapper/his/FsAiWorkflowNodeMapper.xml

@@ -18,6 +18,7 @@
         <result property="sortOrder" column="sort_order"/>
         <result property="createTime" column="create_time"/>
         <result property="updateTime" column="update_time"/>
+        <result property="voiceUrl" column="voice_url"/>
     </resultMap>
 
     <select id="selectFsAiWorkflowNodeById" parameterType="Long" resultMap="FsAiWorkflowNodeResult">
@@ -28,6 +29,16 @@
         select * from fs_ai_workflow_node where workflow_id = #{workflowId} order by sort_order
     </select>
 
+    <select id="selectNodesByWorkflowIdAndTypes" resultMap="FsAiWorkflowNodeResult">
+        select * from fs_ai_workflow_node
+        where workflow_id = #{workflowId}
+        and node_type in
+        <foreach collection="nodeTypes" item="nodeType" open="(" separator="," close=")">
+            #{nodeType}
+        </foreach>
+        order by sort_order
+    </select>
+
     <insert id="insertFsAiWorkflowNode" parameterType="FsAiWorkflowNode" useGeneratedKeys="true" keyProperty="nodeId">
         insert into fs_ai_workflow_node (workflow_id, node_key, node_name, node_type, node_icon, node_color,
             pos_x, pos_y, width, height, node_config, sort_order, create_time)
@@ -58,6 +69,7 @@
             <if test="height != null">height = #{height},</if>
             <if test="nodeConfig != null">node_config = #{nodeConfig},</if>
             <if test="sortOrder != null">sort_order = #{sortOrder},</if>
+            <if test="voiceUrl != null">voice_url = #{voiceUrl},</if>
             update_time = now(),
         </trim>
         where node_id = #{nodeId}

+ 2 - 2
fs-service/src/main/resources/mapper/live/LiveAfterSalesMapper.xml

@@ -90,7 +90,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="refundType != null "> and las.refund_type = #{refundType}</if>
             <if test="status != null "> and las.status = #{status}</if>
             <if test="salesStatus != null "> and las.sales_status = #{salesStatus}</if>
-            <if test="orderStatus != null "> and las.order_status = #{orderStatus}</if>
+            <if test="orderStatus != null "> and lo.status = #{orderStatus}</if>
             <if test="reasons != null  and reasons != ''"> and las.reasons = #{reasons}</if>
             <if test="explains != null  and explains != ''"> and las.explains = #{explains}</if>
             <if test="explainImg != null  and explainImg != ''"> and las.explain_img = #{explainImg}</if>
@@ -99,7 +99,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deliveryName != null  and deliveryName != ''"> and las.delivery_name like concat('%', #{deliveryName}, '%')</if>
             <if test="status != null "> and las.status = #{status}</if>
             <if test="salesStatus != null "> and las.sales_status = #{salesStatus}</if>
-            <if test="orderStatus != null "> and las.order_status = #{orderStatus}</if>
+            <!--<if test="orderStatus != null "> and las.order_status = #{orderStatus}</if>-->
             <if test="deliveryStatus != null and deliveryStatus!= ''"> and las.order_status = #{deliveryStatus}</if>
             <if test="isDel != null  and isDel != ''"> and las.is_del = #{isDel}</if>
             <if test="userId != null "> and las.user_id = #{userId}</if>

+ 1 - 0
fs-service/src/main/resources/mapper/qw/QwFriendWelcomeMapper.xml

@@ -48,6 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             w.*
         from qw_friend_welcome w
         <where>
+            <if test="id != null  and id != ''"> and w.id like concat( #{id}, '%') </if>
             <if test="qwUserIds != null  and qwUserIds != ''">
                 and FIND_IN_SET(#{qwUserIds},REPLACE(REPLACE(REPLACE(qw_user_ids, '[', ''), ']', ''), ' ', '')) > 0
             </if>

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

@@ -64,8 +64,8 @@
         select id,company_user_id companyUserId,voice_txt voiceTxt from qw_sop_temp_voice where id = #{id}
                                                                                             and voice_txt = #{voiceTxt} and record_type in (0,1) limit 1
     </select>
-    <select id="selectQwSopTempVoiceByIdAndUserVoiceUrl" resultType="com.fs.sop.domain.QwSopTempVoice">
-        select id,company_user_id companyUserId from qw_sop_temp_voice where id = #{id} and record_type in (0,1,2) limit 1
+    <select id="selectQwSopTempVoiceByIdAndUserVoiceUrl" resultType="com.fs.sop.domain.QwSopTempVoice" >
+        select id,company_user_id companyUserId,voice_txt voiceTxt from qw_sop_temp_voice where id = #{id} and record_type in (0,1,2) limit 1
     </select>
     <select id="selectQwSopTempVoiceNewList" resultType="com.fs.sop.domain.QwSopTempVoice">
         select id,voice_txt voiceTxt,company_user_id companyUserId,voice_url voiceUrl,duration,record_type recordType,

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

@@ -364,7 +364,7 @@ public class InquiryOrderController extends  AppBaseController {
             storePayment.setUserId(user.getUserId());
             storePayment.setBusinessId(order.getOrderId().toString());
             if(storePaymentService.insertFsStorePayment(storePayment)>0){
-                if(merchantAppConfig.getMerchantId().equals("wx")){
+                if(merchantAppConfig.getMerchantType().equals("wx")){
                     //创建微信订单
                     WxPayConfig payConfig = new WxPayConfig();
                     payConfig.setAppId(appId);
@@ -392,7 +392,7 @@ public class InquiryOrderController extends  AppBaseController {
                         throw new CustomException("支付失败"+e.getMessage());
                     }
                 }
-                else if(merchantAppConfig.getMerchantId().equals("yb")){
+                else if(merchantAppConfig.getMerchantType().equals("yb")){
                     WxJspayDTO p = new WxJspayDTO();
                     // 使用setter方法为对象赋值
                     p.setPayMoney(storePayment.getPayMoney().toString());
@@ -414,7 +414,7 @@ public class InquiryOrderController extends  AppBaseController {
                         throw new CustomException("支付失败");
                     }
                 }
-                else if(merchantAppConfig.getMerchantId().equals("tz")){
+                else if(merchantAppConfig.getMerchantType().equals("tz")){
                     PayCreateOrder o = new PayCreateOrder();
                     o.setOrderNo("inquiry"+storePayment.getPayCode()); // 业务系统订单号
                     o.setTrxAmt(storePayment.getPayMoney().doubleValue()); // 交易金额
@@ -439,7 +439,7 @@ public class InquiryOrderController extends  AppBaseController {
                     mt.setTradeNo(result.getBody().getOrderFlowNo());
                     storePaymentService.updateFsStorePayment(mt);
                     return R.ok().put("isPay",0).put("data",result).put("type","tz");
-                }else if(merchantAppConfig.getMerchantId().equals("hf")){
+                }else if(merchantAppConfig.getMerchantType().equals("hf")){
                     HuiFuCreateOrder o = new HuiFuCreateOrder();
                     o.setTradeType("T_MINIAPP");
                     o.setOpenid(openId);

+ 2 - 1
fs-user-app/src/main/java/com/fs/app/controller/live/LiveOrderController.java

@@ -351,7 +351,7 @@ public class LiveOrderController extends AppBaseController
         LiveOrder liveOrder = orderService.selectLiveOrderByOrderId(orderId);
         //订单总价 临时处理 为 商品支付金额(商品支付金额=订单总价-快递费)
         if(ObjectUtil.isNotEmpty(liveOrder)) {
-            liveOrder.setTotalPrice(liveOrder.getTotalPrice().subtract(liveOrder.getPayDelivery()));
+            liveOrder.setTotalPrice(liveOrder.getTotalPrice().subtract(liveOrder.getPayPostage()));
         }
         return AjaxResult.success(liveOrder);
     }
@@ -909,6 +909,7 @@ public class LiveOrderController extends AppBaseController
         if (order.getStatus() !=0) {
             throw new CustomException("非法操作");
         }
+        order.setCouponUserId(Long.parseLong(getUserId()));
         orderService.cancelOrder(order);
 
         return R.ok("操作成功");