소스 검색

Merge remote-tracking branch 'origin/master'

吴树波 6 일 전
부모
커밋
609d62602e
23개의 변경된 파일573개의 추가작업 그리고 6개의 파일을 삭제
  1. 30 0
      fs-admin/src/main/java/com/fs/api/controller/StatisticManageController.java
  2. 19 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwDeptController.java
  3. 16 0
      fs-company/src/main/java/com/fs/company/controller/qw/QwUserController.java
  4. 48 0
      fs-service/src/main/java/com/fs/company/domain/CompanyDeptUserInfo.java
  5. 57 0
      fs-service/src/main/java/com/fs/company/dto/CompanyDeptUserInfoDTO.java
  6. 22 0
      fs-service/src/main/java/com/fs/company/mapper/StatisticManageMapper.java
  7. 17 0
      fs-service/src/main/java/com/fs/company/service/IStatisticManageService.java
  8. 2 1
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  9. 114 0
      fs-service/src/main/java/com/fs/company/service/impl/StatisticManageServiceImpl.java
  10. 2 0
      fs-service/src/main/java/com/fs/course/mapper/FsVideoResourceMapper.java
  11. 2 4
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  12. 47 0
      fs-service/src/main/java/com/fs/qw/domain/QwDeptTreeSelect.java
  13. 7 0
      fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java
  14. 5 0
      fs-service/src/main/java/com/fs/qw/param/QwUserListParam.java
  15. 3 0
      fs-service/src/main/java/com/fs/qw/service/IQwDeptService.java
  16. 1 0
      fs-service/src/main/java/com/fs/qw/service/IQwUserService.java
  17. 69 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwDeptServiceImpl.java
  18. 12 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java
  19. 6 0
      fs-service/src/main/resources/application-config-druid-fby.yml
  20. 1 1
      fs-service/src/main/resources/application-config-druid-heyantang.yml
  21. 65 0
      fs-service/src/main/resources/mapper/company/StatisticManageMapper.xml
  22. 14 0
      fs-service/src/main/resources/mapper/course/FsVideoResourceMapper.xml
  23. 14 0
      fs-service/src/main/resources/mapper/qw/QwUserMapper.xml

+ 30 - 0
fs-admin/src/main/java/com/fs/api/controller/StatisticManageController.java

@@ -0,0 +1,30 @@
+package com.fs.api.controller;
+
+
+import com.fs.common.core.domain.R;
+import com.fs.company.service.IStatisticManageService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @description: 统计管理
+ * @author: Guos
+ * @time: 2025/10/30 上午9:16
+ */
+@Slf4j
+@RestController
+@RequestMapping("/statistic/manage")
+public class StatisticManageController {
+
+    @Resource
+    private IStatisticManageService statisticManageService;
+
+    @PostMapping("/statisticMain")
+    public R statisticMain() {
+        return R.ok().put("data", statisticManageService.statisticMain());
+    }
+}

+ 19 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwDeptController.java

@@ -7,6 +7,7 @@ import com.fs.common.core.domain.R;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
@@ -120,4 +121,22 @@ public class QwDeptController extends BaseController
     {
         return toAjax(qwDeptService.deleteQwDeptByIds(ids));
     }
+
+    /**
+     * @Description: 获取企微部门 按Treeselect返回 每一个企微主体有自己的部门,按企微主体查询
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/30 9:33
+     */
+    @GetMapping("/treeselect")
+    public AjaxResult treeselect(QwDept qwDept)
+    {
+        if(StringUtils.isEmpty(qwDept.getCorpId())){
+            return AjaxResult.error("请选择企微主体");
+        }
+        List<QwDept> depts = qwDeptService.selectQwDeptList(qwDept);
+        return AjaxResult.success(qwDeptService.buildDeptTreeSelect(depts));
+    }
+
 }

+ 16 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwUserController.java

@@ -116,6 +116,22 @@ public class QwUserController extends BaseController
         startPage();
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         qwUser.setCompanyId(loginUser.getCompany().getCompanyId());
+        // 添加部门查询条件
+        //本部门
+        Long deptId = qwUser.getDeptId();
+        if(deptId!=null){
+            List<Long> qwDeptIdList = new ArrayList<>();
+            if (deptId!=null){
+                qwDeptIdList.add(deptId);
+            }
+            // 本部门的下级部门
+            List<Long> deptList = qwUserService.selectDeptByParentId(deptId,qwUser.getCorpId());
+            if (!deptList.isEmpty()){
+                qwDeptIdList.addAll(deptList);
+            }
+            qwUser.setQwDeptIdList(qwDeptIdList);
+        }
+
         List<QwUserVO> list = qwUserService.selectQwUserListStaffVO(qwUser);
         return getDataTable(list);
     }

+ 48 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyDeptUserInfo.java

@@ -0,0 +1,48 @@
+package com.fs.company.domain;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/10/30 上午9:40
+ */
+@Data
+public class CompanyDeptUserInfo {
+
+   /**
+    * 公司id
+    */
+   private Integer companyId;
+
+   /**
+    * 公司名称
+    */
+   private String companyName;
+
+   /**
+    * 部门id
+    */
+   private Long deptId;
+
+   /**
+    * 部门名称
+    */
+   private String deptName;
+
+   /**
+    * 员工id
+    */
+   private Long userId;
+
+   /**
+    * 员工名称
+    */
+   private String userName;
+
+   /**
+    * 员工昵称
+    */
+   private String nickName;
+
+}

+ 57 - 0
fs-service/src/main/java/com/fs/company/dto/CompanyDeptUserInfoDTO.java

@@ -0,0 +1,57 @@
+package com.fs.company.dto;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/10/30 上午10:38
+ */
+@Data
+public class CompanyDeptUserInfoDTO {
+
+    /**
+     * 公司id
+     */
+    private Integer companyId;
+
+    /**
+     * 公司名称
+     */
+    private String companyName;
+
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 进线数量
+     */
+    private Long lineNum;
+
+    /**
+     * 激活数
+     */
+    private Long activeNum;
+
+    /**
+     * 完课数量
+     */
+    private Long completeNum;
+
+    /**
+     * 答题数量
+     */
+    private Long answerNum;
+
+    /**
+     * 红包数量
+     */
+    private Long redPacketNum;
+}

+ 22 - 0
fs-service/src/main/java/com/fs/company/mapper/StatisticManageMapper.java

@@ -0,0 +1,22 @@
+package com.fs.company.mapper;
+
+import com.fs.company.domain.CompanyDeptUserInfo;
+import com.fs.company.dto.CompanyDeptUserInfoDTO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/10/30 上午9:25
+ */
+public interface StatisticManageMapper {
+
+
+    //获取公司、部门、员工信息
+    List<CompanyDeptUserInfo> getCompanyAndDeptAndDeptUserList();
+
+
+    CompanyDeptUserInfoDTO getStatisticNum(@Param("userIds") Long[] userIds);
+}

+ 17 - 0
fs-service/src/main/java/com/fs/company/service/IStatisticManageService.java

@@ -0,0 +1,17 @@
+package com.fs.company.service;
+
+import com.fs.company.dto.CompanyDeptUserInfoDTO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/10/30 上午9:21
+ */
+public interface IStatisticManageService {
+
+    List<Map<String, Object>> statisticMain();
+
+}

+ 2 - 1
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -434,7 +434,8 @@ public class CompanyServiceImpl implements ICompanyService
                 orderMap.setOrderId(order.getId());
                 orderMap.setTuiMoneyStatus(1);
                 storeOrderMapper.updateFsStoreOrder(orderMap);
-                BigDecimal money = order.getPayMoney().add(order.getPayRemain());
+                // order.getPayRemain() 数据库实际没有这个字段了 直接使用 应付金额
+                BigDecimal money = order.getPayPrice();
                 company.setMoney(company.getMoney().add(money));
                 companyMapper.updateCompany(company);
                 CompanyMoneyLogs log=new CompanyMoneyLogs();

+ 114 - 0
fs-service/src/main/java/com/fs/company/service/impl/StatisticManageServiceImpl.java

@@ -0,0 +1,114 @@
+package com.fs.company.service.impl;
+
+import com.fs.company.domain.CompanyDeptUserInfo;
+import com.fs.company.dto.CompanyDeptUserInfoDTO;
+import com.fs.company.mapper.StatisticManageMapper;
+import com.fs.company.service.IStatisticManageService;
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import com.google.common.collect.Lists;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @description:
+ * @author: Guos
+ * @time: 2025/10/30 上午9:21
+ */
+@Slf4j
+@Service
+public class StatisticManageServiceImpl implements IStatisticManageService {
+
+    @Resource
+    private StatisticManageMapper statisticManageMapper;
+
+
+    /**
+     * 统计
+     * 按照部门分组情况
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> statisticMain() {
+        List<CompanyDeptUserInfo> companyDeptdUserList = statisticManageMapper.getCompanyAndDeptAndDeptUserList();
+        if(CollectionUtils.isEmpty(companyDeptdUserList)){return null;}
+        //按照部门分组
+        Map<Long, List<CompanyDeptUserInfo>> deptInfos = companyDeptdUserList.stream()
+            .collect(Collectors.groupingBy(CompanyDeptUserInfo::getDeptId));
+        //创建一个新的List来接收
+        List<CompanyDeptUserInfoDTO> companyDeptUserInfoDTOS = Lists.newArrayList();
+        deptInfos.forEach((deptId, companyDeptUserInfos) -> {
+            //目前没看见没部门的情况,第一个判断是size为1的情况并且userId为null的情况或者0L的情况,就不用走数据去查询,直接都是0
+            int size = companyDeptUserInfos.size();
+            if(size == 1 && (companyDeptUserInfos.get(0).getUserId() == null || 0L == companyDeptUserInfos.get(0).getUserId())) {
+                CompanyDeptUserInfo companyDeptUserInfo = companyDeptUserInfos.get(0);
+                companyDeptUserInfoDTOS.add(component(companyDeptUserInfo));
+            }else{
+                //将所有userId统计为一个数组
+                Long[] userIds = companyDeptUserInfos.stream().map(CompanyDeptUserInfo::getUserId).toArray(Long[]::new);
+                CompanyDeptUserInfo companyDeptUserInfo = companyDeptUserInfos.get(0);
+                CompanyDeptUserInfoDTO statisticNum = statisticManageMapper.getStatisticNum(userIds);
+                companyDeptUserInfoDTOS.add(component(companyDeptUserInfo, statisticNum));
+            }
+        });
+        //在这里按照公司分组
+//        return companyDeptUserInfoDTOS;
+       return groupByCompanyAndCompanyName(companyDeptUserInfoDTOS);
+    }
+
+    /**
+     * 组装数据(主要针对userId是空或者是0L情况)
+     * @param companyDeptUserInfo
+     * @return
+     */
+    private static CompanyDeptUserInfoDTO component(CompanyDeptUserInfo companyDeptUserInfo) {
+        CompanyDeptUserInfoDTO companyDeptUserInfoDTO = new CompanyDeptUserInfoDTO();
+        BeanUtils.copyProperties(companyDeptUserInfo, companyDeptUserInfoDTO);
+        companyDeptUserInfoDTO.setLineNum(0L);
+        companyDeptUserInfoDTO.setActiveNum(0L);
+        companyDeptUserInfoDTO.setCompleteNum(0L);
+        companyDeptUserInfoDTO.setAnswerNum(0L);
+        companyDeptUserInfoDTO.setRedPacketNum(0L);
+        return companyDeptUserInfoDTO;
+    }
+
+    /**
+     * 组装数据
+     * @param source
+     * @param target
+     * @return
+     */
+    private static CompanyDeptUserInfoDTO component(CompanyDeptUserInfo source, CompanyDeptUserInfoDTO target) {
+        target.setCompanyId(source.getCompanyId());
+        target.setCompanyName(source.getCompanyName());
+        target.setDeptId(source.getDeptId());
+        target.setDeptName(source.getDeptName());
+        return target;
+    }
+
+    private List<Map<String, Object>> groupByCompanyAndCompanyName(List<CompanyDeptUserInfoDTO> source){
+        //按照companyId和companyName分组
+        Map<Integer, List<CompanyDeptUserInfoDTO>> companyInfos = source.stream()
+                .collect(Collectors.groupingBy(CompanyDeptUserInfoDTO::getCompanyId));
+        List<Map<String, Object>> resultList = Lists.newArrayList();
+        companyInfos.forEach((companyId, companyDeptUserInfoDTOS) -> {
+            CompanyDeptUserInfoDTO companyDeptUserInfoDTO = companyDeptUserInfoDTOS.get(0);
+            Map<String, Object> companyInfoMap = Maps.newHashMap();
+            companyInfoMap.put("companyId", companyId);
+            companyInfoMap.put("companyName", companyDeptUserInfoDTO.getCompanyName());
+            companyInfoMap.put("deptInfos", companyDeptUserInfoDTOS);
+            resultList.add(companyInfoMap);
+        });
+        return resultList;
+    }
+
+
+}
+
+

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

@@ -27,4 +27,6 @@ public interface FsVideoResourceMapper extends BaseMapper<FsVideoResource> {
 
     @Select("select * from fs_video_resource where file_key = #{fileKey} limit 1")
     FsVideoResource selectByFileKey(String fileKey);
+
+    List<FsVideoResource> selectByIds(@Param("ids") long[] ids);
 }

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

@@ -2471,10 +2471,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
 
     @Override
     public void batchSaveVideo(BatchVideoSvae vo) {
-        List<FsVideoResource> videoResourceList = fsVideoResourceMapper.selectBatchIds(vo.getIds());
-        videoResourceList = videoResourceList.stream()
-                .sorted(Comparator.comparing(FsVideoResource::getSort).thenComparing(FsVideoResource::getId))
-                .collect(Collectors.toList());
+        long[] idArray = vo.getIds().stream().mapToLong(Long::longValue).toArray();
+        List<FsVideoResource> videoResourceList = fsVideoResourceMapper.selectByIds(idArray);
         FsUserCourseVideo param = new FsUserCourseVideo();
         param.setCourseId(vo.getCourseId());
         List<FsUserCourseVideo> videoList = selectFsUserCourseVideoList(param);

+ 47 - 0
fs-service/src/main/java/com/fs/qw/domain/QwDeptTreeSelect.java

@@ -0,0 +1,47 @@
+package com.fs.qw.domain;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class QwDeptTreeSelect implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+    private String label;
+    private List<QwDeptTreeSelect> children;
+
+    // 构造方法
+    public QwDeptTreeSelect() {
+    }
+
+    public QwDeptTreeSelect(Long id, String label) {
+        this.id = id;
+        this.label = label;
+    }
+
+    // getter和setter
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    public List<QwDeptTreeSelect> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<QwDeptTreeSelect> children) {
+        this.children = children;
+    }
+}

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

@@ -163,6 +163,12 @@ public interface QwUserMapper extends BaseMapper<QwUser>
             "                       #{item} " +
             "                   </foreach> " +
             "            </if>" +
+            "            <if test=\"qwDeptIdList != null and !qwDeptIdList.isEmpty() and  userType != '00' \">" +
+            "               AND qd.dept_id IN " +
+            "                   <foreach collection='qwDeptIdList' item='item' open='(' separator=',' close=')'> " +
+            "                       #{item} " +
+            "                   </foreach> " +
+            "            </if>" +
             "ORDER BY  qu.login_status asc,qu.tool_status desc " +
             "</script>"})
     List<QwUserVO> selectQwUserListStaffVO(QwUserListParam qwUser);
@@ -442,4 +448,5 @@ public interface QwUserMapper extends BaseMapper<QwUser>
 
     List<QwOptionsVO> selectQwCompanyListOptionsVOBySys();
 
+    List<Long> selectDeptByParentId(@Param("deptId")Long deptId,@Param("corpId") String corpId);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/qw/param/QwUserListParam.java

@@ -57,6 +57,11 @@ public class QwUserListParam {
      * 销售部门
      */
     private List<Long> cuDeptIdList;
+    /**
+     * 企微部门
+     */
+    private List<Long> qwDeptIdList;
+
 
     /**
      * 部门类型 00 管理员 01 员工

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

@@ -2,6 +2,7 @@ package com.fs.qw.service;
 
 import com.fs.common.core.domain.R;
 import com.fs.qw.domain.QwDept;
+import com.fs.qw.domain.QwDeptTreeSelect;
 
 import java.util.List;
 
@@ -69,4 +70,6 @@ public interface IQwDeptService
      * @return 结果
      */
     public int deleteQwDeptById(Long id);
+
+    List<QwDeptTreeSelect> buildDeptTreeSelect(List<QwDept> depts);
 }

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

@@ -199,4 +199,5 @@ public interface IQwUserService
 
     List<QwOptionsVO> selectQwCompanyListOptionsVOBySys();
 
+    List<Long> selectDeptByParentId(Long deptId,String cropId);
 }

+ 69 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwDeptServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.qw.service.impl;
 
 import com.fs.common.core.domain.R;
 import com.fs.qw.domain.QwDept;
+import com.fs.qw.domain.QwDeptTreeSelect;
 import com.fs.qw.mapper.QwDeptMapper;
 import com.fs.qw.service.IQwDeptService;
 import com.fs.qwApi.domain.QwDeptResult;
@@ -10,7 +11,11 @@ import com.fs.qwApi.service.QwApiService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 企业微信部门Service业务层处理
@@ -129,4 +134,68 @@ public class QwDeptServiceImpl implements IQwDeptService
     {
         return qwDeptMapper.deleteQwDeptById(id);
     }
+
+    /**
+     * @Description: 按TreeSelect结构返回部门
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/30 9:37
+     */
+    @Override
+    /**
+     * 将部门列表转换为TreeSelect树形结构
+     */
+    public List<QwDeptTreeSelect> buildDeptTreeSelect(List<QwDept> deptList) {
+        if (deptList == null || deptList.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        // 按父部门ID分组
+        Map<Long, List<QwDept>> deptMap = deptList.stream()
+                .collect(Collectors.groupingBy(QwDept::getParentid));
+
+        // 获取所有根部门(parentId = 0)
+        List<QwDept> rootDepts = deptMap.getOrDefault(0L, new ArrayList<>());
+
+        // 构建树形结构
+        return rootDepts.stream()
+                .map(dept -> buildTreeSelect(dept, deptMap))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 递归构建TreeSelect节点
+     */
+    private QwDeptTreeSelect buildTreeSelect(QwDept dept, Map<Long, List<QwDept>> deptMap) {
+        return buildTreeSelect(dept, deptMap, 0);
+    }
+
+    /**
+     * 递归构建TreeSelect节点,最多5级
+     */
+    private QwDeptTreeSelect buildTreeSelect(QwDept dept, Map<Long, List<QwDept>> deptMap, int depth) {
+        // 限制最多5级,避免死循环
+        if (depth > 5) {
+            return new QwDeptTreeSelect(dept.getDeptId(), dept.getDeptName());
+        }
+
+        QwDeptTreeSelect treeSelect = new QwDeptTreeSelect(dept.getDeptId(), dept.getDeptName());
+
+        // 获取当前部门的子部门
+        List<QwDept> children = deptMap.get(dept.getDeptId());
+        if (children != null && !children.isEmpty()) {
+            // 递归构建子节点
+            List<QwDeptTreeSelect> childNodes = children.stream()
+                    .map(child -> buildTreeSelect(child, deptMap, depth + 1))
+                    .collect(Collectors.toList());
+            treeSelect.setChildren(childNodes);
+        }
+
+        return treeSelect;
+    }
+
+
+
+
 }

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

@@ -1559,6 +1559,18 @@ public class QwUserServiceImpl implements IQwUserService
         return qwUserMapper.selectQwCompanyListOptionsVOBySys();
     }
 
+    /**
+     * @Description: 根据企微部门查询下级部门id
+     * @Param:
+     * @Return:
+     * @Author xgb
+     * @Date 2025/10/30 14:27
+     */
+    @Override
+    public List<Long> selectDeptByParentId(Long deptId,String cropId) {
+        return qwUserMapper.selectDeptByParentId(deptId,cropId);
+    }
+
 
     /**
      * 构建查询条件

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

@@ -81,6 +81,12 @@ fs :
 nuonuo:
   key: 10924508
   secret: A2EB20764D304D16
+  jwt:
+    # 加密秘钥
+    secret: f4e2e52034348f86b67cde581c0f9eb5
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
 
 # 存储捅配置
 tencent_cloud_config:

+ 1 - 1
fs-service/src/main/resources/application-config-druid-heyantang.yml

@@ -29,7 +29,7 @@ wx:
     subAppId:  #服务商模式下的子商户公众账号ID
     subMchId:  #服务商模式下的子商户号
     keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
-    notifyUrl: https://userapp.his.runtzh.com/app/wxpay/wxPayNotify
+    notifyUrl: https://userapp.yytcdta.com/app/wxpay/wxPayNotify
   mp:
     useRedis: false
     redisConfig:

+ 65 - 0
fs-service/src/main/resources/mapper/company/StatisticManageMapper.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fs.company.mapper.StatisticManageMapper">
+
+    <resultMap id="CompanyDeptUserListMap" type="com.fs.company.domain.CompanyDeptUserInfo">
+        <id column="company_id" property="companyId" />
+        <result column="company_name" property="companyName"/>
+        <result column="dept_id" property="deptId"/>
+        <result column="dept_name" property="deptName"/>
+        <result column="user_id" property="userId"/>
+        <result column="user_name" property="userName"/>
+        <result column="nick_name" property="nickName"/>
+    </resultMap>
+
+    <select id="getCompanyAndDeptAndDeptUserList" resultMap="CompanyDeptUserListMap">
+        SELECT
+            ci.company_id,
+            ci.company_name,
+            cd.dept_id,
+            cd.dept_name,
+            cu.user_id,
+            cu.user_name,
+            cu.nick_name
+        FROM company AS ci
+        LEFT JOIN company_dept AS cd ON ci.company_id = cd.company_id AND cd.STATUS = 0
+        LEFT JOIN company_user AS cu ON cu.dept_id = cd.dept_id AND cu.del_flag = 0
+        WHERE ci.is_del = 0 AND cd.del_flag = 0
+    </select>
+
+    <select id="getStatisticNum" resultType="com.fs.company.dto.CompanyDeptUserInfoDTO">
+        with t1 as (
+            SELECT
+            qec.id,
+            qec.company_user_id,
+            qec.fs_user_id,
+            qec.qw_user_id,
+            qec.user_id
+            FROM
+            qw_external_contact AS qec
+            WHERE
+            date_format(qec.create_time,'%y%m%d') >= date_format(now(),'%y%m%d') and
+            qec.create_time &lt;= now()
+            and qec.company_user_id IN (
+            <foreach collection="userIds" item="i" separator=",">
+                #{i}
+            </foreach>
+            )
+        ),t2 as (
+            select count(t1.id) as lineNum from t1
+        ),t3 as (
+            select count(t1.id) as activeNum from t1 where t1.fs_user_id is not null
+        ),t4 as(
+            select count(fcwl.qw_external_contact_id) as completeNum from t1 inner join fs_course_watch_log as fcwl on t1.id = fcwl.qw_external_contact_id where fcwl.log_type = 2
+        ),t5 as (
+            select count(fcal.log_id) as answerNum  from t1 inner join fs_course_answer_logs as fcal where fcal.user_id = t1.user_id
+        ), t6 as (
+            select count(fcrpl.log_id) as redPacketNum  from t1 inner join fs_course_red_packet_log as fcrpl where fcrpl.user_id = t1.user_id
+        )
+        select t2.lineNum, t3.activeNum, t4.completeNum, t5.answerNum, t6.redPacketNum from t2, t3, t4, t5, t6
+    </select>
+
+
+</mapper>

+ 14 - 0
fs-service/src/main/resources/mapper/course/FsVideoResourceMapper.xml

@@ -26,4 +26,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </if>
         order by rr.sort,rr.id desc
     </select>
+
+    <select id="selectByIds" parameterType="String" resultType="com.fs.course.domain.FsVideoResource">
+        SELECT *
+        FROM fs_video_resource
+        WHERE id IN
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+        ORDER BY FIELD(id,
+        <foreach collection="ids" item="id" separator=",">
+            #{id}
+        </foreach>
+        )
+    </select>
 </mapper>

+ 14 - 0
fs-service/src/main/resources/mapper/qw/QwUserMapper.xml

@@ -289,5 +289,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and qu.qw_user_name like concat('%', #{nickName}, '%')
         </if>
     </select>
+    <!--  递归查询子部门,不包括自己,深度5   -->
+    <select id="selectDeptByParentId" resultType="java.lang.Long">
+        WITH RECURSIVE sub_dept AS (
+        SELECT dept_id, parentid, 1 as depth
+        FROM qw_dept
+        WHERE parentid = #{deptId} and corp_id=#{corpId}
+        UNION ALL
+        SELECT qd.dept_id, qd.parentid, sd.depth + 1
+        FROM qw_dept qd
+        INNER JOIN sub_dept sd ON qd.parentid = sd.dept_id
+        WHERE sd.depth &lt; 5 and qd.corp_id=#{corpId}
+        )
+        SELECT dept_id FROM sub_dept
+    </select>
 
 </mapper>