Jelajahi Sumber

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

15376779826 3 minggu lalu
induk
melakukan
04fe00b35b
24 mengubah file dengan 956 tambahan dan 94 penghapusan
  1. 114 0
      fs-admin/src/main/java/com/fs/his/controller/FsStoreActivityController.java
  2. 94 0
      fs-admin/src/main/java/com/fs/his/controller/FsUserExtractController.java
  3. 1 1
      fs-live-app/src/main/resources/application.yml
  4. 5 0
      fs-service/src/main/java/com/fs/company/domain/CompanyDeptUserInfo.java
  5. 103 48
      fs-service/src/main/java/com/fs/company/service/impl/StatisticManageServiceImpl.java
  6. 3 3
      fs-service/src/main/java/com/fs/hisStore/domain/FsUserBillScrm.java
  7. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  8. 6 1
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserBillScrmServiceImpl.java
  9. 49 22
      fs-service/src/main/java/com/fs/qw/service/impl/QwWatchLogServiceImpl.java
  10. 2 0
      fs-service/src/main/java/com/fs/statis/dto/ComprehensiveStatisticsDTO.java
  11. 2 0
      fs-service/src/main/java/com/fs/statis/param/ComprehensiveStatisticsParam.java
  12. 131 0
      fs-service/src/main/java/com/fs/store/domain/FsStoreActivity.java
  13. 69 0
      fs-service/src/main/java/com/fs/store/mapper/FsStoreActivityMapper.java
  14. 66 0
      fs-service/src/main/java/com/fs/store/service/IFsStoreActivityService.java
  15. 106 0
      fs-service/src/main/java/com/fs/store/service/impl/FsStoreActivityServiceImpl.java
  16. 1 1
      fs-service/src/main/resources/application-config-druid-bjzm.yml
  17. 1 1
      fs-service/src/main/resources/application-config-druid-heyantang.yml
  18. 2 2
      fs-service/src/main/resources/application-config-druid-yxj.yml
  19. 2 2
      fs-service/src/main/resources/application-druid-yxj.yml
  20. 1 1
      fs-service/src/main/resources/mapper/company/CourseWatchLogStatisticsMapper.xml
  21. 23 11
      fs-service/src/main/resources/mapper/company/StatisticManageMapper.xml
  22. 95 0
      fs-service/src/main/resources/mapper/store/FsStoreActivityMapper.xml
  23. 63 0
      fs-user-app/src/main/java/com/fs/app/controller/StoreActivityController.java
  24. 16 0
      fs-user-app/src/main/java/com/fs/app/controller/store/H5ScrmController.java

+ 114 - 0
fs-admin/src/main/java/com/fs/his/controller/FsStoreActivityController.java

@@ -0,0 +1,114 @@
+package com.fs.his.controller;
+
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+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.StringUtils;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.his.domain.FsPackage;
+import com.fs.his.service.IFsPackageService;
+import com.fs.store.domain.FsStoreActivity;
+import com.fs.store.service.IFsStoreActivityService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 活动Controller
+ *
+ * @author fs
+ * @date 2022-11-18
+ */
+@RestController
+@RequestMapping("/his/storeActivity")
+public class FsStoreActivityController extends BaseController
+{
+    @Autowired
+    private IFsStoreActivityService fsStoreActivityService;
+    @Autowired
+    private IFsPackageService packageService;
+    /**
+     * 查询活动列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:storeActivity:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FsStoreActivity fsStoreActivity)
+    {
+        startPage();
+        List<FsStoreActivity> list = fsStoreActivityService.selectFsStoreActivityList(fsStoreActivity);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出活动列表
+     */
+    @PreAuthorize("@ss.hasPermi('his:storeActivity:export')")
+    @Log(title = "活动", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FsStoreActivity fsStoreActivity)
+    {
+        List<FsStoreActivity> list = fsStoreActivityService.selectFsStoreActivityList(fsStoreActivity);
+        ExcelUtil<FsStoreActivity> util = new ExcelUtil<FsStoreActivity>(FsStoreActivity.class);
+        return util.exportExcel(list, "storeActivity");
+    }
+
+    /**
+     * 获取活动详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('his:storeActivity:query')")
+    @GetMapping(value = "/{activityId}")
+    public R getInfo(@PathVariable("activityId") Long activityId)
+    {
+        FsStoreActivity activity=fsStoreActivityService.selectFsStoreActivityById(activityId);
+        List<FsPackage> packages =new ArrayList<>();
+        String productIds = activity.getProductIds();
+        if(StringUtils.isNotBlank(productIds)){
+            Long[] list = Arrays.stream(productIds.split(","))
+                    .map(Long::valueOf)
+                    .toArray(Long[]::new);
+            packages = packageService.selectFsPackageListByIds(list);
+        }
+        return R.ok().put("activity",activity).put("packages",packages);
+    }
+
+    /**
+     * 新增活动
+     */
+    @PreAuthorize("@ss.hasPermi('his:storeActivity:add')")
+    @Log(title = "活动", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FsStoreActivity fsStoreActivity)
+    {
+        return toAjax(fsStoreActivityService.insertFsStoreActivity(fsStoreActivity));
+    }
+
+    /**
+     * 修改活动
+     */
+    @PreAuthorize("@ss.hasPermi('his:storeActivity:edit')")
+    @Log(title = "活动", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FsStoreActivity fsStoreActivity)
+    {
+        return toAjax(fsStoreActivityService.updateFsStoreActivity(fsStoreActivity));
+    }
+
+    /**
+     * 删除活动
+     */
+    @PreAuthorize("@ss.hasPermi('his:storeActivity:remove')")
+    @Log(title = "活动", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{activityIds}")
+    public AjaxResult remove(@PathVariable Long[] activityIds)
+    {
+        return toAjax(fsStoreActivityService.deleteFsStoreActivityByIds(activityIds));
+    }
+}

+ 94 - 0
fs-admin/src/main/java/com/fs/his/controller/FsUserExtractController.java

@@ -3,17 +3,35 @@ package com.fs.his.controller;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
+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.IPUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.core.config.WxPayProperties;
+import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserExtract;
 import com.fs.his.param.FsUserExtractParam;
+import com.fs.his.service.IFsUserBillService;
 import com.fs.his.service.IFsUserExtractService;
+import com.fs.his.service.IFsUserService;
 import com.fs.his.vo.FsUserExtractVO;
+import com.fs.hisStore.enums.BillDetailEnum;
+import com.fs.hisStore.service.IFsUserBillScrmService;
+import com.github.binarywang.wxpay.bean.entpay.EntPayRequest;
+import com.github.binarywang.wxpay.bean.entpay.EntPayResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.EntPayService;
+import com.github.binarywang.wxpay.service.WxPayService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 
 /**
@@ -29,6 +47,17 @@ public class FsUserExtractController extends BaseController
     @Autowired
     private IFsUserExtractService fsUserExtractService;
 
+    @Autowired
+    private WxPayProperties wxPayProperties;
+    @Autowired
+    private IFsUserService fsUserService;
+
+    @Autowired
+    private WxPayService wxPayService;
+
+    @Autowired
+    private IFsUserBillScrmService billService;
+
     /**
      * 查询用户提现管理列表
      */
@@ -96,4 +125,69 @@ public class FsUserExtractController extends BaseController
     {
         return toAjax(fsUserExtractService.deleteFsUserExtractByExtractIds(extractIds));
     }
+
+
+
+    @PreAuthorize("@ss.hasPermi('his:userExtract:audit')")
+    @PostMapping("/audit")
+    @Transactional
+    public R audit(@RequestBody FsUserExtract fsUserExtract, HttpServletRequest servletRequest)
+    {
+        FsUserExtract extract=fsUserExtractService.selectFsUserExtractByExtractId(fsUserExtract.getExtractId());
+        if(extract.getStatus().equals(0)){
+            FsUser user=fsUserService.selectFsUserById(Long.valueOf(extract.getUserId()));
+            if(fsUserExtract.getStatus()==1){
+                WxPayConfig payConfig = new WxPayConfig();
+                payConfig.setAppId(wxPayProperties.getAppId());
+                payConfig.setMchId(wxPayProperties.getMchId());
+                payConfig.setMchKey(wxPayProperties.getMchKey());
+                payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setKeyPath(null);
+                payConfig.setNotifyUrl(wxPayProperties.getNotifyUrl());
+                wxPayService.setConfig(payConfig);
+                EntPayService entPayService=wxPayService.getEntPayService();
+                EntPayRequest request=new EntPayRequest();
+                request.setAppid(wxPayProperties.getAppId());
+                request.setMchId(wxPayProperties.getMchId());
+                request.setOpenid(user.getMaOpenId());
+                request.setCheckName("NO_CHECK");
+                request.setSpbillCreateIp(IPUtils.getIpAddr(servletRequest));
+                request.setReUserName(user.getRealName());
+                request.setPartnerTradeNo(extract.getExtractId().toString());
+                request.setDescription("会员提现");
+                request.setAmount(WxPayUnifiedOrderRequest.yuanToFen(extract.getExtractPrice().toString()));
+                try {
+                    EntPayResult result=entPayService.entPay(request);
+                    if(result.getResultCode().equals(0)){
+                        extract.setStatus(1L);
+                        fsUserExtractService.updateFsUserExtract(extract);
+                    }
+                    return R.ok();
+                } catch (WxPayException e) {
+                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                    e.printStackTrace();
+                    return R.error(e.getMessage());
+                }
+
+            }
+            else if(fsUserExtract.getStatus()==-1){
+                extract.setStatus(-1L);
+                extract.setFailMsg(fsUserExtract.getFailMsg());
+                fsUserExtractService.updateFsUserExtract(extract);
+                user.setNowMoney(user.getNowMoney().add(extract.getExtractPrice()));
+                fsUserService.updateFsUser(user);
+                //插入流水
+                billService.addBill(user.getUserId(), BillDetailEnum.CATEGORY_1.getValue(),1,BillDetailEnum.TYPE_5.getDesc(),extract.getExtractPrice(),user.getNowMoney(),"提现申请驳回",extract.getExtractId().toString(),0l);
+                return R.ok();
+            }
+            else{
+                return R.error("非法操作");
+            }
+        }
+        else{
+            return R.error("非法操作");
+        }
+
+    }
 }

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

@@ -6,4 +6,4 @@ server:
 # Spring配置
 spring:
   profiles:
-    active: dev
+    active: druid-bjzm-test

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

@@ -2,6 +2,8 @@ package com.fs.company.domain;
 
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @description:
  * @author: Guos
@@ -50,4 +52,7 @@ public class CompanyDeptUserInfo {
     */
    private String nickName;
 
+
+   private List<CompanyDeptUserInfo> children;
+
 }

+ 103 - 48
fs-service/src/main/java/com/fs/company/service/impl/StatisticManageServiceImpl.java

@@ -8,6 +8,7 @@ import com.fs.company.domain.CourseWatchLogStatistics;
 import com.fs.company.mapper.CourseWatchLogStatisticsMapper;
 import com.fs.company.mapper.StatisticManageMapper;
 import com.fs.company.service.IStatisticManageService;
+import java.util.function.Function;
 import com.fs.statis.dto.ComprehensiveStatisticsDTO;
 import com.fs.statis.param.ComprehensiveStatisticsParam;
 import com.google.common.collect.Lists;
@@ -45,38 +46,33 @@ public class StatisticManageServiceImpl implements IStatisticManageService {
     @Override
     public Object statisticMain(ComprehensiveStatisticsParam param) {
         if(param.getDimension() == DimensionEnum.COMPANY.getValue()){
-            Assert.notNull(param.getId(), "按公司展示查询条件不能为空!");
-            return getStatisticNumByCompanyId(param);
+            return getStatisticNumByCompany(param);
         }
         if(param.getDimension() == DimensionEnum.DEPARTMENT.getValue()){
             Assert.notNull(param.getId(), "按部门展示查询条件不能为空!");
-            return getStatisticNumByDeptId(param);
+            return getStatisticNumByCompanyId(param);
         }
         if (param.getDimension() == DimensionEnum.PERSONAL.getValue()){
             Assert.notNull(param.getId(), "按个人展示查询条件不能为空!");
-            return getStatisticNumByPersonal(param);
+            return getStatisticNumByDeptId(param);
         }
         return null;
     }
 
     /**
-     * 获取个人统计数据
+     * 按照公司维度统计数据
      */
-    public List getStatisticNumByDeptId(ComprehensiveStatisticsParam param){
-        //先获取部门下的用户的信息
-        Long id = param.getId();
-        List<CompanyDeptUserInfo> searchUserInfo = statisticManageMapper.getSearchUserInfo(id);
+    public List getStatisticNumByCompany(ComprehensiveStatisticsParam param) {
+        List<CompanyDeptUserInfo> companyInfo = statisticManageMapper.getCompanyInfo();
         List result = Lists.newArrayList();
         List<Date> dates = generateDateList(param.getStartTime(), param.getEndTime());
         for (Date date : dates){
             param.setStartTime(date);
             param.setEndTime(date);
-            for (CompanyDeptUserInfo companyDeptUserInfo : searchUserInfo) {
-                String deptName = companyDeptUserInfo.getDeptName();
+            for (CompanyDeptUserInfo companyDeptUserInfo : companyInfo) {
                 String companyName = companyDeptUserInfo.getCompanyName();
-                Long deptId = companyDeptUserInfo.getDeptId();
                 Long companyId = companyDeptUserInfo.getCompanyId();
-                param.setUserId(companyDeptUserInfo.getUserId());
+                param.setCompanyId(companyId);
                 ComprehensiveStatisticsDTO statisticDataByDeptId =
                         statisticManageMapper.getStatisticDataByDeptId(param);
                 if(ObjectUtils.isEmpty(statisticDataByDeptId)){
@@ -85,11 +81,10 @@ public class StatisticManageServiceImpl implements IStatisticManageService {
                     statisticDataByDeptId.setRedPacketNum(BigDecimal.ZERO.intValue());
                     statisticDataByDeptId.setSendCount(BigDecimal.ZERO.intValue());
                     statisticDataByDeptId.setRedPacketAmount(BigDecimal.ZERO);
+                    statisticDataByDeptId.setCompleteNum(BigDecimal.ZERO.intValue());
                 }
                 statisticDataByDeptId.setCompanyUserName(companyDeptUserInfo.getNickName());
                 statisticDataByDeptId.setCompanyUserId(companyDeptUserInfo.getUserId());
-                statisticDataByDeptId.setDeptName(deptName);
-                statisticDataByDeptId.setDeptId(deptId.intValue());
                 statisticDataByDeptId.setCompanyName(companyName);
                 statisticDataByDeptId.setCompanyId(companyId);
                 statisticDataByDeptId.setStatisticsTime(date);
@@ -100,54 +95,74 @@ public class StatisticManageServiceImpl implements IStatisticManageService {
     }
 
     /**
-     * 获取个人统计数据
+     * 根据部门id获取个人统计数据
      */
-    public List getStatisticNumByPersonal(ComprehensiveStatisticsParam param){
-        //先获取用户的信息
+    public List getStatisticNumByDeptId(ComprehensiveStatisticsParam param){
+        //先获取部门下的用户的信息
         Long id = param.getId();
-        CompanyDeptUserInfo userInfoByUserId = statisticManageMapper.getUserInfoByUserId(id);
+        List<CompanyDeptUserInfo> searchUserInfo = statisticManageMapper.getSearchUserInfo(id);
         List result = Lists.newArrayList();
         List<Date> dates = generateDateList(param.getStartTime(), param.getEndTime());
-        for (Date date : dates){
+        for (Date date : dates) {
             param.setStartTime(date);
             param.setEndTime(date);
-            param.setDeptId(userInfoByUserId.getDeptId());
-            param.setUserId(id);
-            ComprehensiveStatisticsDTO statisticDataByDeptId = statisticManageMapper.getStatisticDataByDeptId(param);
-            if(ObjectUtils.isEmpty(statisticDataByDeptId)){
-                statisticDataByDeptId = new ComprehensiveStatisticsDTO();
-                statisticDataByDeptId.setAnswerNum(BigDecimal.ZERO.intValue());
-                statisticDataByDeptId.setRedPacketNum(BigDecimal.ZERO.intValue());
-                statisticDataByDeptId.setSendCount(BigDecimal.ZERO.intValue());
-                statisticDataByDeptId.setRedPacketAmount(BigDecimal.ZERO);
+            for (CompanyDeptUserInfo companyDeptUserInfo : searchUserInfo) {
+                Long parentId = companyDeptUserInfo.getParentId();
+                Long deptId = companyDeptUserInfo.getDeptId();
+                if (parentId != BigDecimal.ZERO.longValue()) {
+                    Optional<CompanyDeptUserInfo> first = searchUserInfo.stream().filter(dept -> dept.getDeptId().equals(parentId)).findFirst();
+                    if (first.isPresent()){
+                        CompanyDeptUserInfo findParentDept = first.get();
+                        String parentDeptName = findParentDept.getDeptName();
+                        String deptName = companyDeptUserInfo.getDeptName();
+                        companyDeptUserInfo.setDeptName(parentDeptName + "/" + deptName);
+                    }
+                }
+                String companyName = companyDeptUserInfo.getCompanyName();
+                Long companyId = companyDeptUserInfo.getCompanyId();
+                param.setUserId(companyDeptUserInfo.getUserId());
+                ComprehensiveStatisticsDTO statisticDataByDeptId =
+                        statisticManageMapper.getStatisticDataByDeptId(param);
+                if(ObjectUtils.isEmpty(statisticDataByDeptId)){
+                    statisticDataByDeptId = new ComprehensiveStatisticsDTO();
+                    statisticDataByDeptId.setAnswerNum(BigDecimal.ZERO.intValue());
+                    statisticDataByDeptId.setRedPacketNum(BigDecimal.ZERO.intValue());
+                    statisticDataByDeptId.setSendCount(BigDecimal.ZERO.intValue());
+                    statisticDataByDeptId.setRedPacketAmount(BigDecimal.ZERO);
+                    statisticDataByDeptId.setCompleteNum(BigDecimal.ZERO.intValue());
+                }
+                statisticDataByDeptId.setCompanyUserName(companyDeptUserInfo.getNickName());
+                statisticDataByDeptId.setCompanyUserId(companyDeptUserInfo.getUserId());
+                statisticDataByDeptId.setDeptName(companyDeptUserInfo.getDeptName());
+                statisticDataByDeptId.setDeptId(deptId.intValue());
+                statisticDataByDeptId.setCompanyName(companyName);
+                statisticDataByDeptId.setCompanyId(companyId);
+                statisticDataByDeptId.setStatisticsTime(date);
+                result.add(statisticDataByDeptId);
             }
-            statisticDataByDeptId.setDeptName(userInfoByUserId.getDeptName());
-            statisticDataByDeptId.setCompanyUserName(userInfoByUserId.getNickName());
-            statisticDataByDeptId.setCompanyUserId(userInfoByUserId.getUserId());
-            statisticDataByDeptId.setDeptName(userInfoByUserId.getDeptName());
-            statisticDataByDeptId.setDeptId(userInfoByUserId.getDeptId().intValue());
-            statisticDataByDeptId.setCompanyName(userInfoByUserId.getCompanyName());
-            statisticDataByDeptId.setCompanyId(userInfoByUserId.getCompanyId());
-            statisticDataByDeptId.setStatisticsTime(date);
-            result.add(statisticDataByDeptId);
         }
         return result;
     }
 
     /**
-     * 根据公司获取统计数据
+     * 根据公司获取统部门的计数据
      */
     public List getStatisticNumByCompanyId(ComprehensiveStatisticsParam param){
         //先从公司拿到公司和部门的信息
-        List<CompanyDeptUserInfo> searchDeptInfo = getSearchDeptInfo(param.getId());
+        List<CompanyDeptUserInfo> searchDeptInfo = statisticManageMapper.getSearchDeptInfo(param.getId());;
         List result = Lists.newArrayList();
-
         List<Date> dates = generateDateList(param.getStartTime(), param.getEndTime());
         for (Date date : dates){
             param.setStartTime(date);
             param.setEndTime(date);
             for (CompanyDeptUserInfo companyDeptUserInfo : searchDeptInfo) {
-                String deptName = companyDeptUserInfo.getDeptName();
+                //判断当前部门的父级id不是0就组装名称
+                Long parentId = companyDeptUserInfo.getParentId();
+                if(parentId != BigDecimal.ZERO.longValue()){
+                    String parentDeptName = searchDeptInfo.stream().filter(dept -> dept.getDeptId().equals(parentId)).findFirst().get().getDeptName();
+                    String deptName = companyDeptUserInfo.getDeptName();
+                    companyDeptUserInfo.setDeptName(parentDeptName + "/" + deptName);
+                }
                 String companyName = companyDeptUserInfo.getCompanyName();
                 Long deptId = companyDeptUserInfo.getDeptId();
                 Long companyId = companyDeptUserInfo.getCompanyId();
@@ -160,8 +175,9 @@ public class StatisticManageServiceImpl implements IStatisticManageService {
                     statisticDataByDeptId.setRedPacketNum(BigDecimal.ZERO.intValue());
                     statisticDataByDeptId.setSendCount(BigDecimal.ZERO.intValue());
                     statisticDataByDeptId.setRedPacketAmount(BigDecimal.ZERO);
+                    statisticDataByDeptId.setCompleteNum(BigDecimal.ZERO.intValue());
                 }
-                statisticDataByDeptId.setDeptName(deptName);
+                statisticDataByDeptId.setDeptName(companyDeptUserInfo.getDeptName());
                 statisticDataByDeptId.setDeptId(deptId.intValue());
                 statisticDataByDeptId.setCompanyName(companyName);
                 statisticDataByDeptId.setCompanyId(companyId);
@@ -229,12 +245,51 @@ public class StatisticManageServiceImpl implements IStatisticManageService {
     }
 
     /**
-     * 根据公司id获取部门下拉搜索信息
-     * @param id
+     * 根据公司id获取部门下拉搜索信息(递归获取完整部门树)
+     * @param id 公司ID
      */
     @Override
     public List<CompanyDeptUserInfo> getSearchDeptInfo(Long id){
-        return statisticManageMapper.getSearchDeptInfo(id);
+        List<CompanyDeptUserInfo> allDepts = statisticManageMapper.getSearchDeptInfo(id);
+        if(CollectionUtils.isEmpty(allDepts)){
+            return allDepts;
+        }
+
+        // 构建ID到部门的映射,方便查找
+        Map<Long, CompanyDeptUserInfo> deptMap = allDepts.stream()
+                .collect(Collectors.toMap(CompanyDeptUserInfo::getDeptId, Function.identity()));
+
+        // 找到所有根部门(父级ID为0或null的部门)
+        List<CompanyDeptUserInfo> rootDepts = allDepts.stream()
+                .filter(dept -> dept.getParentId() == null ||
+                        dept.getParentId().equals(BigDecimal.ZERO.longValue()))
+                .collect(Collectors.toList());
+
+        // 递归构建部门树
+        buildDeptTree(rootDepts, deptMap);
+
+        return rootDepts;
+    }
+
+    /**
+     * 递归构建部门树结构
+     * @param parentDepts 父部门列表
+     * @param deptMap 部门映射表
+     */
+    private void buildDeptTree(List<CompanyDeptUserInfo> parentDepts, Map<Long, CompanyDeptUserInfo> deptMap) {
+        for (CompanyDeptUserInfo parentDept : parentDepts) {
+            // 查找当前部门的所有直接子部门
+            List<CompanyDeptUserInfo> children = deptMap.values().stream()
+                    .filter(dept -> dept.getParentId() != null &&
+                            dept.getParentId().equals(parentDept.getDeptId()))
+                    .collect(Collectors.toList());
+
+            if (!children.isEmpty()) {
+                // 递归构建子部门的子树
+                buildDeptTree(children, deptMap);
+                parentDept.setChildren(children);
+            }
+        }
     }
 
     /**
@@ -264,7 +319,7 @@ public class StatisticManageServiceImpl implements IStatisticManageService {
         companyDeptdUserList.forEach(companyDeptUserInfo -> {
             Long userId = companyDeptUserInfo.getUserId();
             courseWatchLogStatisticsMapper.deleteByStatisticsTimeAndDeptId(userId, companyDeptUserInfo.getDeptId(), finalDateTime);
-            //第一步通过人去查询【课程,项目,视频id】,【发送,看视频状态】
+            //第一步通过人去查询【课程,项目,视频id】,【发送,看视频状态】userId空就按照部门删除,但是要先将userId为空的先删除
             List<CourseWatchLogData> courseWatchLogData = statisticManageMapper.getCourseWatchLogData(userId, finalDateTime);
             CourseWatchLogStatistics courseWatchLogStatistics = component(companyDeptUserInfo, finalDateTime);
             if(CollectionUtils.isEmpty(courseWatchLogData)){
@@ -343,7 +398,7 @@ public class StatisticManageServiceImpl implements IStatisticManageService {
         //上面代码其实都是差不多,为了方便之后优化代码,保持整个逻辑清晰,先将整个数据保存后,再反查数据将答题数量、红包领取数量,以及金额统计更新
         updateCourseRedPacket(finalDateTime);
         stopWatch.stop();
-        log.info("gs-执行数据统计任务完成,耗时:{}", stopWatch.getTotalTimeSeconds());
+        log.info("gs-执行数据统计任务完成,耗时:{}", stopWatch.prettyPrint());
     }
 
     /**

+ 3 - 3
fs-service/src/main/java/com/fs/hisStore/domain/FsUserBillScrm.java

@@ -46,7 +46,7 @@ public class FsUserBillScrm extends BaseEntity
 
     /** 明细数字 */
     @Excel(name = "明细数字")
-    private Double number;
+    private BigDecimal number;
 
     @Excel(name = "金额")
     private BigDecimal money;
@@ -139,11 +139,11 @@ public class FsUserBillScrm extends BaseEntity
         this.title = title;
     }
 
-    public Double getNumber() {
+    public BigDecimal getNumber() {
         return number;
     }
 
-    public void setNumber(Double number) {
+    public void setNumber(BigDecimal number) {
         this.number = number;
     }
 

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

@@ -509,7 +509,7 @@ public interface FsStoreOrderScrmMapper
     @Select("select * from fs_store_order_scrm where extend_order_id=#{extendOrderId}")
     FsStoreOrderScrm selectFsStoreOrderByExtendOrderId(String extendOrderId);
     @Select({"<script> " +
-            "select b.number as tui_price,b.bill_type,b.create_time,o.id as order_id,o.order_code,o.pay_price,u.nickname,u.avatar from fs_user_bill b inner join  fs_store_order_scrm o on b.business_id=o.id left join fs_user u on u.user_id=o.user_id  " +
+            "select b.money as tui_price,b.bill_type,b.create_time,o.id as order_id,o.order_code,o.pay_price,u.nickname,u.avatar from fs_user_bill b inner join  fs_store_order_scrm o on b.business_id=o.id left join fs_user u on u.user_id=o.user_id  " +
             "where b.user_id=#{userId} and b.category='brokerage_price'   " +
             " order by b.bill_id desc"+
             "</script>"})

+ 6 - 1
fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserBillScrmServiceImpl.java

@@ -3,6 +3,7 @@ package com.fs.hisStore.service.impl;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 
 import cn.hutool.json.JSONUtil;
 import com.fs.common.utils.DateUtils;
@@ -55,7 +56,11 @@ public class FsUserBillScrmServiceImpl implements IFsUserBillScrmService
     @Override
     public List<FsUserBillScrm> selectFsUserBillList(FsUserBillScrm fsUserBill)
     {
-        return fsUserBillMapper.selectFsUserBillList(fsUserBill);
+        List<FsUserBillScrm> bills=fsUserBillMapper.selectFsUserBillList(fsUserBill);
+        Optional.ofNullable( bills).ifPresent(list -> list.forEach(bill -> {
+            bill.setNumber(bill.getMoney());
+        }));
+        return bills;
     }
 
     /**

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

@@ -31,6 +31,7 @@ import com.fs.store.service.cache.IFsUserCacheService;
 import com.fs.store.service.cache.IFsUserCourseCacheService;
 import com.hc.openapi.tool.util.StringUtils;
 import org.apache.commons.collections4.CollectionUtils;
+import org.jetbrains.annotations.Nullable;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -149,17 +150,13 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
     @Override
     public List<QwWatchLogStatisticsListVO> selectQwWatchLogStatisticsListVOExport(FsCourseWatchLogListParam param) {
         List<Long> deptIds = param.getDeptIds();
-        if (deptIds !=null && !deptIds.isEmpty()){
-            List<CompanyDept> companyDeptList  = companyDeptMapper.selectCompanyDeptByIds(deptIds);
-            if (companyDeptList!=null && !companyDeptList.isEmpty()){
-                for (CompanyDept c : companyDeptList) {
-                    if (c.getParentId() == 0L) {
-                        param.setDeptId(null);
-                        param.setDeptIds(null);
-                        break;
-                    }
-                }
-            }
+        List<Long> allDeptIds = getAllDeptIds(deptIds);
+        if (allDeptIds == null){
+            param.setDeptId(null);
+            param.setDeptIds(null);
+        } else if (!allDeptIds.isEmpty()){
+            param.setDeptIds(allDeptIds);
+            param.setDeptId(null);
         } else {
             CompanyDept companyDept = companyDeptMapper.selectCompanyDeptById(param.getDeptId());
             if (ObjectUtils.isNotEmpty(companyDept)&&companyDept.getParentId()==0L){
@@ -225,23 +222,20 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
     @Override
     public TableDataInfo selectQwWatchLogStatisticsListVO(QwWatchLogStatisticsListParam param) {
         List<Long> deptIds = param.getDeptIds();
-        if (deptIds !=null && !deptIds.isEmpty()){
-            List<CompanyDept> companyDeptList  = companyDeptMapper.selectCompanyDeptByIds(deptIds);
-            if (companyDeptList!=null && !companyDeptList.isEmpty()){
-                for (CompanyDept c : companyDeptList) {
-                    if (c.getParentId() == 0L) {
-                        param.setDeptId(null);
-                        param.setDeptIds(null);
-                        break;
-                    }
-                }
-            }
+        List<Long> allDeptIds = getAllDeptIds(deptIds);
+        if (allDeptIds == null){
+            param.setDeptId(null);
+            param.setDeptIds(null);
+        } else if (!allDeptIds.isEmpty()){
+            param.setDeptIds(allDeptIds);
+            param.setDeptId(null);
         } else {
             CompanyDept companyDept = companyDeptMapper.selectCompanyDeptById(param.getDeptId());
             if (ObjectUtils.isNotEmpty(companyDept)&&companyDept.getParentId()==0L){
                 param.setDeptId(null);
             }
         }
+
         TableDataInfo rspData = new TableDataInfo();
         rspData.setCode(HttpStatus.SUCCESS);
         rspData.setMsg("查询成功");
@@ -277,6 +271,39 @@ public class QwWatchLogServiceImpl extends ServiceImpl<QwWatchLogMapper, QwWatch
         return rspData;
     }
 
+    /**
+     * 根据部门id查询所有子部门
+     * @param deptIds
+     * @return
+     */
+    private @Nullable List<Long> getAllDeptIds( List<Long> deptIds) {
+        List<Long> allDeptIds = new ArrayList<>();
+        if (deptIds == null || deptIds.isEmpty()){
+            return allDeptIds;
+        } else {
+            allDeptIds.addAll(deptIds);
+        }
+        while (true){
+            if (deptIds.isEmpty()){
+                break;
+            }
+            List<CompanyDept> companyDeptList  = companyDeptMapper.selectCompanyDeptByIds(deptIds);
+            if (companyDeptList.isEmpty()){
+               break;
+            }
+            deptIds = new ArrayList<>();
+            for (CompanyDept c : companyDeptList) {
+                List<Long> ids = companyDeptMapper.selectCompanyDeptByParentId(c.getDeptId());
+                allDeptIds.addAll(ids);
+                deptIds.addAll(ids);
+                if (c.getParentId() == 0L) {
+                    return null;
+                }
+            }
+        }
+        return allDeptIds;
+    }
+
     /**
      * 查询进线统计,排除掉转接的数据
      * @param param

+ 2 - 0
fs-service/src/main/java/com/fs/statis/dto/ComprehensiveStatisticsDTO.java

@@ -29,6 +29,8 @@ public class ComprehensiveStatisticsDTO {
 
     private Integer logType;
 
+    private Integer completeNum; //完成数
+
     private Integer answerNum;
 
     private Integer redPacketNum;

+ 2 - 0
fs-service/src/main/java/com/fs/statis/param/ComprehensiveStatisticsParam.java

@@ -47,6 +47,8 @@ public class ComprehensiveStatisticsParam {
 
     private Long projectId;
 
+    private Long companyId;
+
     private String companyName;
 
     private String deptName;

+ 131 - 0
fs-service/src/main/java/com/fs/store/domain/FsStoreActivity.java

@@ -0,0 +1,131 @@
+package com.fs.store.domain;
+
+import com.fs.common.annotation.Excel;
+import com.fs.common.core.domain.BaseEntity;
+
+/**
+ * 活动对象 fs_store_activity
+ * 
+ * @author fs
+ * @date 2022-11-18
+ */
+public class FsStoreActivity extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long activityId;
+
+    /** 标题 */
+    @Excel(name = "标题")
+    private String title;
+
+    /** 描述 */
+    @Excel(name = "描述")
+    private String descs;
+
+    /** 封面图 */
+    @Excel(name = "封面图")
+    private String logoUrl;
+
+    /** 活动图 */
+    @Excel(name = "活动图")
+    private String images;
+
+    /** 活动商品 */
+    @Excel(name = "活动商品")
+    private String productIds;
+
+    /** 活动内容 */
+    @Excel(name = "活动内容")
+    private String content;
+
+    /** 状态 0禁用 1启用 */
+    @Excel(name = "状态 0禁用 1启用")
+    private Integer status;
+
+    private Integer shareNumber;
+
+    public Integer getShareNumber() {
+        return shareNumber;
+    }
+
+    public void setShareNumber(Integer shareNumber) {
+        this.shareNumber = shareNumber;
+    }
+
+    public String getDescs() {
+        return descs;
+    }
+
+    public void setDescs(String descs) {
+        this.descs = descs;
+    }
+
+    public void setActivityId(Long activityId)
+    {
+        this.activityId = activityId;
+    }
+
+    public Long getActivityId() 
+    {
+        return activityId;
+    }
+    public void setTitle(String title) 
+    {
+        this.title = title;
+    }
+
+    public String getTitle() 
+    {
+        return title;
+    }
+
+    public void setLogoUrl(String logoUrl) 
+    {
+        this.logoUrl = logoUrl;
+    }
+
+    public String getLogoUrl() 
+    {
+        return logoUrl;
+    }
+    public void setImages(String images) 
+    {
+        this.images = images;
+    }
+
+    public String getImages() 
+    {
+        return images;
+    }
+    public void setProductIds(String productIds) 
+    {
+        this.productIds = productIds;
+    }
+
+    public String getProductIds() 
+    {
+        return productIds;
+    }
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+    public void setStatus(Integer status) 
+    {
+        this.status = status;
+    }
+
+    public Integer getStatus() 
+    {
+        return status;
+    }
+
+
+}

+ 69 - 0
fs-service/src/main/java/com/fs/store/mapper/FsStoreActivityMapper.java

@@ -0,0 +1,69 @@
+package com.fs.store.mapper;
+
+import com.fs.store.domain.FsStoreActivity;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * 活动Mapper接口
+ *
+ * @author fs
+ * @date 2022-11-18
+ */
+public interface FsStoreActivityMapper
+{
+    /**
+     * 查询活动
+     *
+     * @param activityId 活动ID
+     * @return 活动
+     */
+    public FsStoreActivity selectFsStoreActivityById(Long activityId);
+
+    /**
+     * 查询活动列表
+     *
+     * @param fsStoreActivity 活动
+     * @return 活动集合
+     */
+    public List<FsStoreActivity> selectFsStoreActivityList(FsStoreActivity fsStoreActivity);
+
+    /**
+     * 新增活动
+     *
+     * @param fsStoreActivity 活动
+     * @return 结果
+     */
+    public int insertFsStoreActivity(FsStoreActivity fsStoreActivity);
+
+    /**
+     * 修改活动
+     *
+     * @param fsStoreActivity 活动
+     * @return 结果
+     */
+    public int updateFsStoreActivity(FsStoreActivity fsStoreActivity);
+
+    /**
+     * 删除活动
+     *
+     * @param activityId 活动ID
+     * @return 结果
+     */
+    public int deleteFsStoreActivityById(Long activityId);
+
+    /**
+     * 批量删除活动
+     *
+     * @param activityIds 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteFsStoreActivityByIds(Long[] activityIds);
+    @Select("select * from fs_store_activity where status=1 order by activity_id desc limit 1")
+    FsStoreActivity selectFsStoreActivityByTop();
+
+    @Update("update fs_store_activity set share_number=share_number+1 where activity_id=#{activityId} ")
+    int addShare(Long activityId);
+}

+ 66 - 0
fs-service/src/main/java/com/fs/store/service/IFsStoreActivityService.java

@@ -0,0 +1,66 @@
+package com.fs.store.service;
+
+import com.fs.store.domain.FsStoreActivity;
+
+import java.util.List;
+
+/**
+ * 活动Service接口
+ *
+ * @author fs
+ * @date 2022-11-18
+ */
+public interface IFsStoreActivityService
+{
+    /**
+     * 查询活动
+     *
+     * @param activityId 活动ID
+     * @return 活动
+     */
+    public FsStoreActivity selectFsStoreActivityById(Long activityId);
+
+    /**
+     * 查询活动列表
+     *
+     * @param fsStoreActivity 活动
+     * @return 活动集合
+     */
+    public List<FsStoreActivity> selectFsStoreActivityList(FsStoreActivity fsStoreActivity);
+
+    /**
+     * 新增活动
+     *
+     * @param fsStoreActivity 活动
+     * @return 结果
+     */
+    public int insertFsStoreActivity(FsStoreActivity fsStoreActivity);
+
+    /**
+     * 修改活动
+     *
+     * @param fsStoreActivity 活动
+     * @return 结果
+     */
+    public int updateFsStoreActivity(FsStoreActivity fsStoreActivity);
+
+    /**
+     * 批量删除活动
+     *
+     * @param activityIds 需要删除的活动ID
+     * @return 结果
+     */
+    public int deleteFsStoreActivityByIds(Long[] activityIds);
+
+    /**
+     * 删除活动信息
+     *
+     * @param activityId 活动ID
+     * @return 结果
+     */
+    public int deleteFsStoreActivityById(Long activityId);
+
+    FsStoreActivity selectFsStoreActivityByTop();
+
+    int addShare(Long activityId);
+}

+ 106 - 0
fs-service/src/main/java/com/fs/store/service/impl/FsStoreActivityServiceImpl.java

@@ -0,0 +1,106 @@
+package com.fs.store.service.impl;
+
+import com.fs.common.utils.DateUtils;
+import com.fs.store.domain.FsStoreActivity;
+import com.fs.store.mapper.FsStoreActivityMapper;
+import com.fs.store.service.IFsStoreActivityService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 活动Service业务层处理
+ *
+ * @author fs
+ * @date 2022-11-18
+ */
+@Service
+public class FsStoreActivityServiceImpl implements IFsStoreActivityService
+{
+    @Autowired
+    private FsStoreActivityMapper fsStoreActivityMapper;
+
+    /**
+     * 查询活动
+     *
+     * @param activityId 活动ID
+     * @return 活动
+     */
+    @Override
+    public FsStoreActivity selectFsStoreActivityById(Long activityId)
+    {
+        return fsStoreActivityMapper.selectFsStoreActivityById(activityId);
+    }
+
+    /**
+     * 查询活动列表
+     *
+     * @param fsStoreActivity 活动
+     * @return 活动
+     */
+    @Override
+    public List<FsStoreActivity> selectFsStoreActivityList(FsStoreActivity fsStoreActivity)
+    {
+        return fsStoreActivityMapper.selectFsStoreActivityList(fsStoreActivity);
+    }
+
+    /**
+     * 新增活动
+     *
+     * @param fsStoreActivity 活动
+     * @return 结果
+     */
+    @Override
+    public int insertFsStoreActivity(FsStoreActivity fsStoreActivity)
+    {
+        fsStoreActivity.setCreateTime(DateUtils.getNowDate());
+        return fsStoreActivityMapper.insertFsStoreActivity(fsStoreActivity);
+    }
+
+    /**
+     * 修改活动
+     *
+     * @param fsStoreActivity 活动
+     * @return 结果
+     */
+    @Override
+    public int updateFsStoreActivity(FsStoreActivity fsStoreActivity)
+    {
+        return fsStoreActivityMapper.updateFsStoreActivity(fsStoreActivity);
+    }
+
+    /**
+     * 批量删除活动
+     *
+     * @param activityIds 需要删除的活动ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreActivityByIds(Long[] activityIds)
+    {
+        return fsStoreActivityMapper.deleteFsStoreActivityByIds(activityIds);
+    }
+
+    /**
+     * 删除活动信息
+     *
+     * @param activityId 活动ID
+     * @return 结果
+     */
+    @Override
+    public int deleteFsStoreActivityById(Long activityId)
+    {
+        return fsStoreActivityMapper.deleteFsStoreActivityById(activityId);
+    }
+
+    @Override
+    public FsStoreActivity selectFsStoreActivityByTop() {
+        return fsStoreActivityMapper.selectFsStoreActivityByTop();
+    }
+
+    @Override
+    public int addShare(Long activityId) {
+        return fsStoreActivityMapper.addShare(activityId);
+    }
+}

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

@@ -71,7 +71,7 @@ nuonuo:
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
   secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
-  bucket: bjzm-1323137866
+  bucket: bjzmky-1323137866
   app_id: 1323137866
   region: ap-guangzhou
   proxy: bjzm

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

@@ -79,7 +79,7 @@ tencent_cloud_config:
   proxy: cdhyt
 cloud_host:
   company_name: 鹤颜堂
-  projectCode: HEYANTANG
+  projectCode: CDHYT
 headerImg:
   imgUrl: https
 ipad:

+ 2 - 2
fs-service/src/main/resources/application-config-druid-yxj.yml

@@ -75,10 +75,10 @@ nuonuo:
 tencent_cloud_config:
   secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
   secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
-  bucket: syysy-1323137866
+  bucket: yxj-1323137866
   app_id: 1323137866
   region: ap-chongqing
-  proxy: syysy
+  proxy: yxj
 cloud_host:
   company_name: 易行健
   projectCode: whyxj

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

@@ -168,6 +168,6 @@ openIM:
 im:
     type: OPENIM
 #是否为新商户,新商户不走mpOpenId
-isNewWxMerchant: true
-enableRedPackAccount: 0
+isNewWxMerchant: false
+enableRedPackAccount: 1
 

+ 1 - 1
fs-service/src/main/resources/mapper/company/CourseWatchLogStatisticsMapper.xml

@@ -43,7 +43,7 @@
             #{companyUserId},
             #{companyId},
             #{deptId},
-            #{statisticsTime},
+            DATE_FORMAT(#{statisticsTime}, '%Y-%m-%d' ),
             #{courseId},
             #{videoId},
             #{projectId},

+ 23 - 11
fs-service/src/main/resources/mapper/company/StatisticManageMapper.xml

@@ -246,6 +246,7 @@
 
     <select id="getSearchUserInfo" resultMap="CompanyDeptUserListMap">
         SELECT
+            cd.parent_id,
             ci.company_id,
             ci.company_name,
             cd.dept_id,
@@ -256,22 +257,26 @@
         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 and cu.dept_id = #{id}
+        WHERE ci.is_del = 0
+          AND cd.del_flag = 0
+          and (cd.dept_id = #{id} OR FIND_IN_SET(#{id}, cd.ancestors) > 0)
+        order by cd.dept_id
     </select>
 
     <select id="getCourseWatchLogData" resultType="com.fs.company.domain.CourseWatchLogData">
         SELECT
-            company_user_id,
-            video_id,
-            course_id,
-            project,
-            log_type,
-            create_time
+            fcwl.company_user_id,
+            fcwl.video_id,
+            fcwl.course_id,
+            fuc.project,
+            fcwl.log_type,
+            fcwl.create_time
         FROM
-            fs_course_watch_log
+            fs_course_watch_log as fcwl
+            left join fs_user_course as fuc on fcwl.course_id = fuc.course_id and fuc.is_del = 0
         WHERE
-            company_user_id = #{companyUserId}
-          and DATE_FORMAT(create_time, '%Y-%m-%d') = DATE_FORMAT(#{dateTime}, '%Y-%m-%d')
+            fcwl.company_user_id = #{companyUserId}
+          and DATE_FORMAT(fcwl.create_time, '%Y-%m-%d') = DATE_FORMAT(#{dateTime}, '%Y-%m-%d')
     </select>
 
     <select id="getAnswerAndRedPacketData" resultType="com.fs.company.domain.CourseWatchLogData">
@@ -302,6 +307,7 @@
 
     <select id="getStatisticDataByDeptId" resultType="com.fs.statis.dto.ComprehensiveStatisticsDTO">
         SELECT
+            SUM(CASE WHEN fs.log_type != 2 THEN 0 ELSE fs.send_count END) AS completeNum,
             SUM(IFNULL(fs.send_count, 0)) as sendCount,
             SUM(IFNULL(fs.log_type, 0)) as logType,
             SUM(IFNULL(fs.answer_num, 0)) as answerNum,
@@ -313,6 +319,9 @@
         WHERE
           DATE_FORMAT(fs.statistics_time, '%Y-%m-%d' ) >= DATE_FORMAT(#{startTime}, '%Y-%m-%d' )
           ANd DATE_FORMAT(fs.statistics_time, '%Y-%m-%d' ) &lt;= DATE_FORMAT(#{endTime}, '%Y-%m-%d' )
+        <if test="companyId != null">
+          and company_id = #{companyId}
+        </if>
         <if test="deptId != null">
              and fs.dept_id = #{deptId}
         </if>
@@ -335,9 +344,12 @@
         order by fs.statistics_time
         <if test="dimension != null">
             <if test="dimension == 2">
-                , fs.dept_id
+                , fs.company_id
             </if>
             <if test="dimension == 3">
+                , fs.dept_id
+            </if>
+            <if test="dimension == 1">
                 , fs.company_user_id
             </if>
         </if>

+ 95 - 0
fs-service/src/main/resources/mapper/store/FsStoreActivityMapper.xml

@@ -0,0 +1,95 @@
+<?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.store.mapper.FsStoreActivityMapper">
+
+    <resultMap type="FsStoreActivity" id="FsStoreActivityResult">
+        <result property="activityId"    column="activity_id"    />
+        <result property="title"    column="title"    />
+        <result property="descs"    column="descs"    />
+        <result property="logoUrl"    column="logo_url"    />
+        <result property="images"    column="images"    />
+        <result property="productIds"    column="product_ids"    />
+        <result property="content"    column="content"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="status"    column="status"    />
+        <result property="shareNumber"    column="share_number"    />
+    </resultMap>
+
+    <sql id="selectFsStoreActivityVo">
+        select activity_id, title, descs, logo_url, images, product_ids, content, create_time, status,share_number from fs_store_activity
+    </sql>
+
+    <select id="selectFsStoreActivityList" parameterType="FsStoreActivity" resultMap="FsStoreActivityResult">
+        <include refid="selectFsStoreActivityVo"/>
+        <where>
+            <if test="title != null  and title != ''"> and title = #{title}</if>
+            <if test="logoUrl != null  and logoUrl != ''"> and logo_url = #{logoUrl}</if>
+            <if test="images != null  and images != ''"> and images = #{images}</if>
+            <if test="productIds != null  and productIds != ''"> and product_ids = #{productIds}</if>
+            <if test="content != null  and content != ''"> and content = #{content}</if>
+            <if test="status != null "> and status = #{status}</if>
+        </where>
+        order by activity_id desc
+    </select>
+
+    <select id="selectFsStoreActivityById" parameterType="Long" resultMap="FsStoreActivityResult">
+        <include refid="selectFsStoreActivityVo"/>
+        where activity_id = #{activityId}
+    </select>
+
+    <insert id="insertFsStoreActivity" parameterType="FsStoreActivity" useGeneratedKeys="true" keyProperty="activityId">
+        insert into fs_store_activity
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="title != null">title,</if>
+            <if test="descs != null">descs,</if>
+            <if test="logoUrl != null">logo_url,</if>
+            <if test="images != null">images,</if>
+            <if test="productIds != null">product_ids,</if>
+            <if test="content != null">content,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="status != null">status,</if>
+            <if test="shareNumber != null">share_number,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="title != null">#{title},</if>
+            <if test="descs != null">#{descs},</if>
+            <if test="logoUrl != null">#{logoUrl},</if>
+            <if test="images != null">#{images},</if>
+            <if test="productIds != null">#{productIds},</if>
+            <if test="content != null">#{content},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="status != null">#{status},</if>
+            <if test="shareNumber != null">#{shareNumber},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsStoreActivity" parameterType="FsStoreActivity">
+        update fs_store_activity
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="title != null">title = #{title},</if>
+            <if test="descs != null">descs = #{descs},</if>
+            <if test="logoUrl != null">logo_url = #{logoUrl},</if>
+            <if test="images != null">images = #{images},</if>
+            <if test="productIds != null">product_ids = #{productIds},</if>
+            <if test="content != null">content = #{content},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="shareNumber != null">share_number = #{shareNumber},</if>
+        </trim>
+        where activity_id = #{activityId}
+    </update>
+
+    <delete id="deleteFsStoreActivityById" parameterType="Long">
+        delete from fs_store_activity where activity_id = #{activityId}
+    </delete>
+
+    <delete id="deleteFsStoreActivityByIds" parameterType="String">
+        delete from fs_store_activity where activity_id in
+        <foreach item="activityId" collection="array" open="(" separator="," close=")">
+            #{activityId}
+        </foreach>
+    </delete>
+
+</mapper>

+ 63 - 0
fs-user-app/src/main/java/com/fs/app/controller/StoreActivityController.java

@@ -0,0 +1,63 @@
+package com.fs.app.controller;
+
+
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.StringUtils;
+import com.fs.his.domain.FsPackage;
+import com.fs.his.service.IFsPackageService;
+import com.fs.store.domain.FsStoreActivity;
+import com.fs.store.service.IFsStoreActivityService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+
+@Api("活动接口")
+@RestController
+@RequestMapping(value="/app/activity")
+public class StoreActivityController extends  AppBaseController {
+
+    @Autowired
+    private IFsStoreActivityService activityService;
+
+    @Autowired
+    private IFsPackageService packageService;
+
+    @ApiOperation("获取活动")
+    @GetMapping("/getStoreActivity")
+    public R getStoreActivity( HttpServletRequest request){
+        FsStoreActivity activity=activityService.selectFsStoreActivityByTop();
+        return R.ok().put("activity",activity);
+    }
+
+
+    @ApiOperation("获取活动详情")
+    @GetMapping("/getStoreActivityDetails")
+    public R getStoreActivityDetails(@RequestParam(value = "activityId")Long activityId, HttpServletRequest request){
+        FsStoreActivity activity=activityService.selectFsStoreActivityById(activityId);
+        List<FsPackage> products =new ArrayList<>();
+        String productIds = activity.getProductIds();
+        if(StringUtils.isNotBlank(productIds)){
+            Long[] list = Arrays.stream(productIds.split(","))
+                    .map(Long::valueOf)
+                    .toArray(Long[]::new);
+            products = packageService.selectFsPackageListByIds(list);
+        }
+        return R.ok().put("activity",activity).put("products",products);
+    }
+    @ApiOperation("分享")
+    @PostMapping("/share")
+    public R share(@RequestParam(value = "activityId")Long activityId, HttpServletRequest request){
+        activityService.addShare(activityId);
+        return R.ok();
+    }
+
+
+
+}

+ 16 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/H5ScrmController.java

@@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 @Controller
@@ -31,6 +32,21 @@ public class H5ScrmController
         //return R.ok().put("userAgreement", config.getUserRegister());
         return mv;
     }
+    @GetMapping("/userAgreementNew")
+    @ResponseBody
+    public String userAgreementNew(){
+        String json=configService.selectConfigByKey("store.agreement");
+        AgreementConfig config= JSONUtil.toBean(json, AgreementConfig.class);
+        return config.getUserAgreement();
+    }
+    @GetMapping("/privacyPolicyNew")
+    @ResponseBody
+    public String privacyPolicyNew( )
+    {
+        String json=configService.selectConfigByKey("store.agreement");
+        AgreementConfig config= JSONUtil.toBean(json, AgreementConfig.class);
+        return config.getPrivacyPolicy();
+    }
     @GetMapping("/privacyPolicy")
     public ModelAndView privacyPolicy( )
     {