Browse Source

Merge branch 'fu-normal-push' of uskycloud/usky-modules into master

gez 4 months ago
parent
commit
62a558bca2

+ 5 - 5
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmProjectController.java

@@ -54,14 +54,14 @@ public class PmProjectController {
      * @return
      */
     @GetMapping("/page")
-    public ApiResult<CommonPage<PmProject>> pageList(@RequestParam(value = "projectName", required = false, defaultValue = "") String projectName,
-                                                     @RequestParam(value = "projectType", required = false, defaultValue = "0") Integer projectType,
-                                                     @RequestParam(value = "projectStatus", required = false, defaultValue = "0") Integer projectStatus,
+    public ApiResult<CommonPage<PmProject>> pageList(@RequestParam(value = "projectName", required = false) String projectName,
+                                                     @RequestParam(value = "projectType", required = false) Integer projectType,
+                                                     @RequestParam(value = "projectStatus", required = false) Integer projectStatus,
                                                      @RequestParam(value = "projectAscription", required = false, defaultValue = "0") Integer projectAscription,
                                                      @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
                                                      @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize,
                                                      @RequestParam(value = "projectId", required = false) Integer projectId,
-                                                     @RequestParam(value = "visibleRange", required = false, defaultValue = "1") Byte visibleRange) {
+                                                     @RequestParam(value = "visibleRange", required = false) Byte visibleRange) {
         return ApiResult.success(pmProjectService.projectList(projectName, projectType, projectStatus, projectAscription, pageNum, pageSize, projectId, visibleRange));
     }
 
@@ -90,7 +90,7 @@ public class PmProjectController {
      *
      * @param projectId 项目id
      */
-    @DeleteMapping("/delNew")
+    @DeleteMapping("/{projectId}")
     public void del(@RequestParam Integer projectId) {
         pmProjectService.delProject(projectId);
     }

+ 18 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java

@@ -10,17 +10,19 @@ import com.usky.iot.domain.PmWorkContent;
 import com.usky.iot.domain.PmWorkReport;
 import com.usky.iot.service.PmWorkContentService;
 import com.usky.iot.service.vo.PmWorkHourStatisticRequestVO;
+import com.usky.iot.service.vo.PmWorkReportSlideVO;
 import com.usky.iot.service.vo.WorkTimeExportTwoVO;
 import com.usky.iot.service.vo.WorkTimeExportVO;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.xmlbeans.impl.xb.xsdschema.Public;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.temporal.TemporalAdjusters;
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -86,7 +88,7 @@ public class PmWorkContentController {
      * @return
      */
     @GetMapping("/page")
-    public ApiResult<CommonPage<PmWorkReport>> page(@RequestParam(value = "projectAscription", required = false, defaultValue = "2") Integer projectAscription,
+    public ApiResult<CommonPage<PmWorkReport>> page(@RequestParam(value = "projectAscription", required = false) Integer projectAscription,
                                                     @RequestParam(value = "pageNum") Integer pageNum,
                                                     @RequestParam(value = "pageSize") Integer pageSize,
                                                     @RequestParam(value = "reportId", required = false) Integer reportId,
@@ -97,6 +99,20 @@ public class PmWorkContentController {
         return ApiResult.success(pmWorkContentService.reportPage(projectAscription, pageNum, pageSize, reportId, startDate, endDate, projectId, submitterId));
     }
 
+    /**
+     * 上下滑动
+     * @param upOrDown 0:上滑;1:下滑
+     * @param slideSum 滑动数量
+     * @param submitDate 提交时间
+     * @return
+     */
+    @GetMapping("/slide")
+    public ApiResult<PmWorkReportSlideVO> slide(@RequestParam(value = "upOrDown", required = false) Integer upOrDown,
+                                                @RequestParam(value = "slideSum", required = false) Integer slideSum,
+                                                @RequestParam(value = "submitDate", required = true) LocalDateTime submitDate){
+        return ApiResult.success(pmWorkContentService.slide(upOrDown, slideSum, submitDate));
+    }
+
     /**
      * 工时统计-新
      * @return

+ 11 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java

@@ -6,11 +6,13 @@ import com.usky.iot.domain.PmWorkContent;
 import com.usky.common.mybatis.core.CrudService;
 import com.usky.iot.domain.PmWorkReport;
 import com.usky.iot.service.vo.PmWorkHourStatisticRequestVO;
+import com.usky.iot.service.vo.PmWorkReportSlideVO;
 import com.usky.iot.service.vo.WorkTimeExportTwoVO;
 import com.usky.iot.service.vo.WorkTimeExportVO;
 
 import com.usky.system.domain.SysUser;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -69,6 +71,15 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
      */
     CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize, Integer report, String startDate, String endDate, Integer projectId, Long userId);
 
+    /**
+     * @description:
+     * @author: fu
+     * @date: 2024/12/9 23:01
+     * @param: [upOrDown 上下滑动(0:上滑;1:下滑), slideSum(滑动数量), submitDate(提交时间)]
+     * @return: java.util.List<com.usky.iot.service.vo.PmWorkReportSlideVO>
+     **/
+    PmWorkReportSlideVO slide(Integer upOrDown, Integer slideSum, LocalDateTime submitDate);
+
     /** 工时统计页面
      * @return 返回项目名(或牛马名)以及项目工时
      */

+ 103 - 42
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.datascope.annotation.DataScope;
+import com.ruoyi.common.datascope.context.DataScopeContextHolder;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.core.exception.BusinessException;
 import com.usky.common.security.utils.SecurityUtils;
@@ -67,7 +69,7 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         Integer tenantId = SecurityUtils.getTenantId();
         LocalDateTime now = LocalDateTime.now();
 
-        if (project.getVisibleRange() == null){
+        if (project.getVisibleRange() == null) {
             project.setVisibleRange((byte) 1);
         }
 
@@ -154,7 +156,7 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
                 )
                 .in(PmProject::getProjectStatus, 1, 2, 3);
         List<PmProject> list = this.list(wrapper);
-        if (list.isEmpty()){
+        if (list.isEmpty()) {
             return list;
         }
 
@@ -165,8 +167,8 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
                 .in(PmWorkContent::getProjectId, projectIds)
                 .between(PmWorkContent::getCreateTime, LocalDateTime.now().minusDays(29), LocalDateTime.now());
         List<PmWorkContent> pmWorkContents = pmWorkContentMapper.selectList(queryWrapper);
-        if (pmWorkContents.isEmpty()){
-            for (PmProject project : list){
+        if (pmWorkContents.isEmpty()) {
+            for (PmProject project : list) {
                 project.setSubmissions(0L);
             }
             return list;
@@ -177,10 +179,10 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
 
         for (PmProject project : list) {
             Integer id = project.getId();
-            Long aLong = projectIdCountMap.getOrDefault(id,0L);
+            Long aLong = projectIdCountMap.getOrDefault(id, 0L);
             project.setSubmissions(aLong);
         }
-        //降序排序
+        // 降序排序
         Collections.sort(list, new Comparator<PmProject>() {
             @Override
             public int compare(PmProject p1, PmProject p2) {
@@ -210,46 +212,81 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         String username = SecurityUtils.getUsername();
         String nickName = SecurityUtils.getLoginUser().getSysUser().getNickName();
         Integer tenantId = SecurityUtils.getTenantId();
+
         LambdaQueryWrapper<PmProject> lambdaQuery = Wrappers.lambdaQuery();
-        lambdaQuery.eq(PmProject::getTenantId, SecurityUtils.getTenantId()).eq(PmProject::getDelFlag, 0)
+        lambdaQuery.eq(PmProject::getTenantId, tenantId)
+                .eq(PmProject::getDelFlag, 0)
                 .eq(visibleRange != null, PmProject::getVisibleRange, visibleRange);
+
         if (projectId != null && projectId != 0) {
             lambdaQuery.eq(PmProject::getId, projectId);
             page = this.page(page, lambdaQuery);
             return new CommonPage<>(page.getRecords(), page.getTotal(), pageSize, pageNum);
         }
+
         switch (projectAscription) {
             case 0:
-                if (visibleRange != null && visibleRange == 1) {
-                    break;
+                if (StringUtils.isNotBlank(projectName) || projectType != null || projectStatus != null) {
+                    lambdaQuery.eq(PmProject::getDelFlag, 0)
+                            .like(StringUtils.isNotBlank(projectName), PmProject::getProjectName, projectName)
+                            .eq(projectType != null, PmProject::getProjectType, projectType)
+                            .eq(projectStatus != null, PmProject::getProjectStatus, projectStatus)
+                            .and(qw -> qw
+                                    .eq(PmProject::getProjectHead, userId)
+                                    .or()
+                                    .apply("FIND_IN_SET('" + userId + "', project_member) > 0")
+                                    .or()
+                                    .eq(PmProject::getCreateBy, username));
                 }
-                lambdaQuery.and(q -> q.eq(PmProject::getProjectHead, userId)
-                        .or().apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0")
-                        .or().eq(PmProject::getCreateBy, username));
+                if (visibleRange == null) {
+                    lambdaQuery.eq(PmProject::getDelFlag, 0)
+                            .and(wrapper -> wrapper
+                                    .eq(PmProject::getVisibleRange, 2)
+                                    .and(qw -> qw
+                                            .eq(PmProject::getProjectHead, userId)
+                                            .or()
+                                            .apply("FIND_IN_SET('" + userId + "', project_member) > 0")
+                                            .or()
+                                            .eq(PmProject::getCreateBy, username))
+                            )
+                            .or()
+                            .eq(PmProject::getVisibleRange, 1)
+                            .eq(PmProject::getDelFlag, 0);
+                } else if (visibleRange == 2) {
+                    lambdaQuery.and(wrapper -> wrapper
+                            .eq(PmProject::getProjectHead, userId)
+                            .or()
+                            .apply("FIND_IN_SET('" + userId + "', project_member) > 0")
+                            .or()
+                            .eq(PmProject::getCreateBy, username)
+                    );
+                }
+                lambdaQuery.like(StringUtils.isNotBlank(projectName), PmProject::getProjectName, projectName)
+                        .eq(projectType != null, PmProject::getProjectType, projectType)
+                        .eq(projectStatus != null, PmProject::getProjectStatus, projectStatus);
                 break;
             case 1:
-                lambdaQuery.eq(PmProject::getProjectHead, userId);
+                lambdaQuery.eq(PmProject::getProjectHead, userId)
+                        .like(StringUtils.isNotBlank(projectName), PmProject::getProjectName, projectName)
+                        .eq(projectType != null, PmProject::getProjectType, projectType)
+                        .eq(projectStatus != null, PmProject::getProjectStatus, projectStatus);
                 break;
             case 2:
-                lambdaQuery.apply("FIND_IN_SET('" + userId + "', project_member) > 0");
+                lambdaQuery.apply("FIND_IN_SET('" + userId + "', project_member) > 0")
+                        .like(StringUtils.isNotBlank(projectName), PmProject::getProjectName, projectName)
+                        .eq(projectType != null, PmProject::getProjectType, projectType)
+                        .eq(projectStatus != null, PmProject::getProjectStatus, projectStatus);
                 break;
             default:
                 throw new BusinessException("查询项目列表参数错误");
         }
-        if (StringUtils.isNotBlank(projectName)) {
-            lambdaQuery.like(PmProject::getProjectName, projectName);
-        }
-        if (projectType != 0) {
-            lambdaQuery.eq(PmProject::getProjectType, projectType);
-        }
-        if (projectStatus != 0) {
-            lambdaQuery.eq(PmProject::getProjectStatus, projectStatus);
-        }
         lambdaQuery.orderByDesc(PmProject::getCreateTime);
         List<PmProject> pmProjects = pmProjectMapper.selectList(lambdaQuery);
-        if (pmProjects.isEmpty()){
+        if (pmProjects.isEmpty()) {
             return new CommonPage<>(pmProjects, 0, pageSize, pageNum);
         }
+        // Set<PmProject> uniqueProjects = new HashSet<>(pmProjects);
+        // pmProjects = new ArrayList<>(uniqueProjects);
 
         // 替换创建人和更新人名字(username→nickname)
         LambdaQueryWrapper<SysUser> query = Wrappers.lambdaQuery();
@@ -307,25 +344,35 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
      */
     @Override
     public Map<String, Integer> sum() {
+        Integer tenantId = SecurityUtils.getTenantId();
+        Long userId = SecurityUtils.getUserId();
+
         LambdaQueryWrapper<PmProject> lambdaQuery = Wrappers.lambdaQuery();
-        lambdaQuery.eq(PmProject::getTenantId, SecurityUtils.getTenantId())
-                .and(q -> q.eq(PmProject::getProjectHead, SecurityUtils.getUserId())
-                        .or().eq(PmProject::getVisibleRange, 1)
-                        .or().apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0")
-                        .or().eq(PmProject::getCreateBy, SecurityUtils.getUsername()))
+        lambdaQuery.eq(PmProject::getTenantId, tenantId)
+                .eq(PmProject::getDelFlag, 0)
+                .eq(PmProject::getVisibleRange, 2)
+                .and(q -> q.or().eq(PmProject::getProjectHead, userId)
+                        .or().apply("FIND_IN_SET('" + userId + "', project_member) > 0")
+                        .or().eq(PmProject::getCreateBy, SecurityUtils.getUsername()));
+        Integer allA = this.count(lambdaQuery);
+
+        LambdaQueryWrapper<PmProject> lambdaQuery3 = Wrappers.lambdaQuery();
+        lambdaQuery3.eq(PmProject::getTenantId, tenantId)
+                .eq(PmProject::getVisibleRange, 1)
                 .eq(PmProject::getDelFlag, 0);
-        Integer all = this.count(lambdaQuery);
+        Integer allB = this.count(lambdaQuery3);
+        int all = allA + allB;
 
         LambdaQueryWrapper<PmProject> lambdaQuery1 = Wrappers.lambdaQuery();
-        lambdaQuery1.eq(PmProject::getTenantId, SecurityUtils.getTenantId())
+        lambdaQuery1.eq(PmProject::getTenantId, tenantId)
                 .eq(PmProject::getDelFlag, 0)
-                .eq(PmProject::getProjectHead, SecurityUtils.getUserId());
+                .eq(PmProject::getProjectHead, userId);
         Integer head = this.count(lambdaQuery1);
 
         LambdaQueryWrapper<PmProject> lambdaQuery2 = Wrappers.lambdaQuery();
-        lambdaQuery2.eq(PmProject::getTenantId, SecurityUtils.getTenantId())
+        lambdaQuery2.eq(PmProject::getTenantId, tenantId)
                 .eq(PmProject::getDelFlag, 0)
-                .apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0");
+                .apply("FIND_IN_SET('" + userId + "', project_member) > 0");
         Integer join = this.count(lambdaQuery2);
 
         Map<String, Integer> sumMap = new HashMap<>();
@@ -345,13 +392,17 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
     public List<Map<String, Object>> projectUsers(Long userId) {
         List<Map<String, Object>> returnList = new ArrayList<>();
         List<SysUser> userList = new ArrayList<>();
+        LambdaQueryWrapper<SysUser> queryNameId = Wrappers.lambdaQuery();
         if (userId != null) {
-            LambdaQueryWrapper<SysUser> queryNameId = Wrappers.lambdaQuery();
-            queryNameId.select(SysUser::getUserId, SysUser::getNickName)
+            queryNameId.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName)
                     .eq(SysUser::getUserId, userId);
-            userList = sysUserMapper.selectList(queryNameId);
         } else {
-            LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
+            queryNameId.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName)
+                    .eq(SysUser::getDelFlag, 0)
+                    .eq(SysUser::getStatus, "0")
+                    .apply(Objects.nonNull(DataScopeContextHolder.getDataScopeSql()), DataScopeContextHolder.getDataScopeSql());
+
+/*            LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
             wrapper.select(PmProject::getProjectHead, PmProject::getProjectMember)
                     .eq(PmProject::getTenantId, SecurityUtils.getTenantId())
                     .eq(PmProject::getDelFlag, 0);
@@ -372,8 +423,9 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
             LambdaQueryWrapper<SysUser> wrapper2 = Wrappers.lambdaQuery();
             wrapper2.select(SysUser::getUserId, SysUser::getNickName)
                     .in(SysUser::getUserId, finalList);
-            userList = sysUserMapper.selectList(wrapper2);
+            userList = sysUserMapper.selectList(wrapper2);*/
         }
+        userList = sysUserMapper.selectList(queryNameId);
         for (SysUser user : userList) {
             Map<String, Object> map = new HashMap<>();
             map.put("id", user.getUserId());
@@ -388,16 +440,25 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
      *
      * @return
      */
+    @DataScope
     @Override
     public List<Map<String, Object>> projectIdName(Integer projectId) {
+        Long userId = SecurityUtils.getUserId();
         List<Map<String, Object>> returnList = new ArrayList<>();
         LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
-        wrapper.select(PmProject::getId, PmProject::getProjectName)
-                .eq(PmProject::getTenantId, SecurityUtils.getTenantId())
-                .eq(PmProject::getDelFlag, 0);
+        wrapper.select(PmProject::getId, PmProject::getProjectName);
         if (projectId != null) {
             wrapper.eq(PmProject::getId, projectId);
+        } else {
+            wrapper.eq(PmProject::getDelFlag, 0)
+                    .and(qw -> qw
+                            .apply(Objects.nonNull(DataScopeContextHolder.getDataScopeSql()), DataScopeContextHolder.getDataScopeSql())
+                            .or().eq(PmProject::getProjectHead, userId)
+                            .or().eq(PmProject::getCreateBy, SecurityUtils.getUsername())
+                            .or().apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0")
+                    );
         }
+
         List<PmProject> projects = pmProjectMapper.selectList(wrapper);
         for (PmProject project : projects) {
             Map<String, Object> returnMap = new HashMap<>();

+ 51 - 4
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java

@@ -116,7 +116,10 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         Long userId = SecurityUtils.getUserId();
         Integer tenantId = SecurityUtils.getTenantId();
         LambdaQueryWrapper<PmWorkReport> reportQuery = Wrappers.lambdaQuery();
-        reportQuery.select(PmWorkReport::getId).eq(PmWorkReport::getTenantId, tenantId).apply("FIND_IN_SET(" + userId + ", cc_to) > 0").orderByDesc(PmWorkReport::getReportDate);
+        reportQuery.select(PmWorkReport::getId)
+                .eq(PmWorkReport::getTenantId, tenantId)
+                .apply("FIND_IN_SET(" + userId + ", cc_to) > 0")
+                .orderByDesc(PmWorkReport::getReportDate);
         return pmWorkReportMapper.selectList(reportQuery).stream().map(PmWorkReport::getId).collect(Collectors.toList());
     }
 
@@ -529,7 +532,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         }
 
         LambdaQueryWrapper<PmWorkContent> contentLambdaQuery = Wrappers.lambdaQuery();
-        if (reportId != null && reportId >= 0) {
+        if (reportId != null && reportId > 0) {
             contentLambdaQuery.eq(PmWorkContent::getReportId, reportId);
             pmWorkContentList = pmWorkContentMapper.selectList(contentLambdaQuery);
             if (pmWorkContentList.isEmpty()) {
@@ -665,6 +668,50 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         return new CommonPage<PmWorkReport>(reportList, reportPage.getTotal(), pageSize, pageNum);
     }
 
+    /**
+     * @description: 日报上下滑动
+     * @author: fu
+     * @date: 2024/8/8 19:22
+     * @param: [upOrDown, slideSum, submitDate]
+     * @return: java.util.List<com.usky.iot.vo.PmWorkReportSlideVO>
+     **/
+    @Override
+    public PmWorkReportSlideVO slide(Integer upOrDown, Integer slideSum, LocalDateTime submitDate) {
+        PmWorkReportSlideVO reportSlide = new PmWorkReportSlideVO();
+        if (slideSum <= 0) {
+            throw new BusinessException("slideSum 必须为正整数!");
+        }
+        if (submitDate == null) {
+            return reportSlide;
+        }
+
+        List<PmWorkReport> reportUp = new ArrayList<>();
+        List<PmWorkReport> reportDown = new ArrayList<>();
+        LambdaQueryWrapper<PmWorkReport> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.last("LIMIT " + slideSum);
+        if (upOrDown == 1) {
+            queryWrapper.gt(PmWorkReport::getSubmitDate, submitDate)
+                    .orderByAsc(PmWorkReport::getSubmitDate);
+            reportUp = pmWorkReportMapper.selectList(queryWrapper);
+            if (reportUp.isEmpty()) {
+                throw new BusinessException("已经是第一篇报告了!");
+            }
+            reportSlide.setSlideUp(reportUp);
+        } else if (upOrDown == 2) {
+            queryWrapper.lt(PmWorkReport::getSubmitDate, submitDate)
+                    .orderByDesc(PmWorkReport::getSubmitDate);
+            reportDown = pmWorkReportMapper.selectList(queryWrapper);
+            if (reportDown.isEmpty()) {
+                throw new BusinessException("已经是最后一篇报告了!");
+            }
+            reportSlide.setSlideDown(reportDown);
+        } else {
+            throw new BusinessException("upOrDown 参数无效!");
+        }
+
+        return reportSlide;
+    }
+
 
     /**
      * @description: 获取报告接收人-工具
@@ -876,7 +923,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         }
         List<WorkHoursStatisticsVO> userAndProjectD = userAndProject;
 
-        //判断是否为项目维度
+        // 判断是否为项目维度
         if (workerOrProject != 1) {
             returnList.add(nickName);
             // 重组返回数据结构
@@ -974,7 +1021,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                 }
             }
 
-            if (filter == 2){
+            if (filter == 2) {
                 for (int i = pmProjectName.size() - 1; i >= 0; i--) {
                     if (!nonZeroProjectIndices.contains(i)) {
                         pmProjectName.remove(i);

+ 60 - 55
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java

@@ -212,6 +212,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         LocalDateTime currentTimePlusMinutes = dateTime.plusMinutes(5);
         String ccTo = pmWorkReport.getCcTo();
         Integer rid = pmWorkReport.getId();
+        List<PmWorkContent> contents = pmWorkReport.getWorkContents();
 
         List<PmWorkContent> workContents = pmWorkReport.getWorkContents();
         if (workContents == null) {
@@ -252,7 +253,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
             throw new BusinessException("一天24小时都不够你用,请检查当日总工时!");
         }
 
-        // 判断是否携带reportId,不写带则为新增报告,携带则为编辑(更新)项目
+        // 判断是否携带reportId,不写带则为新增报告,携带则为编辑(更新)报告
         if (rid == null) {
             PmWorkReport newReport = new PmWorkReport();
             newReport.setReportDate(pmWorkReport.getReportDate());
@@ -269,6 +270,7 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
             newReport.setSendDingTalk(pmWorkReport.getSendDingTalk());
             newReport.setReportFile(pmWorkReport.getReportFile());
             newReport.setReportImage(pmWorkReport.getReportImage());
+            newReport.setReportStatus(1);
             if (pmWorkReport.getIsRegularlySend() == 1 && timingTime != null) {
                 if (timingTime.isAfter(currentTimePlusMinutes)) {
                     newReport.setIsRegularlySend(pmWorkReport.getIsRegularlySend());
@@ -333,72 +335,75 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                     }*/
                     dingTalkAndMessage.sendDingTalkDailyReport(newReport, pmWorkContents);
                 }
-
             }
         } else {
             PmWorkReport rp = new PmWorkReport();
-            rp.setId(rid);
-            // rp.setReportDate(pmWorkReport.getReportDate());
-            rp.setSubmitterId(pmWorkReport.getSubmitterId());
-            // rp.setSubmitDate(pmWorkReport.getSubmitDate());
-            if (pmWorkReport.getReportStatus().equals(0)) {
-                rp.setCcTo(ccTo);
-            }
-            rp.setCoordinateWork(pmWorkReport.getCoordinateWork());
-            rp.setTomorrowPlan(pmWorkReport.getTomorrowPlan());
-            rp.setCreateBy(pmWorkReport.getCreateBy());
-            // rp.setCreateTime(pmWorkReport.getCreateTime());
-            // rp.setDeptId(pmWorkReport.getDeptId());
-            // rp.setTenantId(pmWorkReport.getTenantId());
-            rp.setUpdateBy(userName);
-            rp.setUpdateTime(dateTime);
-            rp.setTotalHours(totalWorkTime);
-            rp.setIsRegularlySend(pmWorkReport.getIsRegularlySend());
-            rp.setReportFile(pmWorkReport.getReportFile());
-            rp.setReportImage(pmWorkReport.getReportImage());
-            if (timingTime == null) {
-                rp.setTimingTime(timingTime);
-            } else if (timingTime.isAfter(currentTimePlusMinutes)) {
-                rp.setTimingTime(timingTime);
-            } else {
-                throw new BusinessException("定时发送支持选中5分钟后的时间,请重新选择时间!");
-            }
-            rp.setSendDingTalk(pmWorkReport.getSendDingTalk());
-            pmWorkReportMapper.updateById(rp);
-
             LambdaQueryWrapper<PmWorkContent> queryWrapper = Wrappers.lambdaQuery();
             queryWrapper.select(PmWorkContent::getReportId, PmWorkContent::getSubmitterId, PmWorkContent::getCreateBy, PmWorkContent::getCreateTime, PmWorkContent::getDeptId, PmWorkContent::getTenantId)
                     .eq(PmWorkContent::getReportId, rid)
                     .last("LIMIT 1");
             PmWorkContent f = pmWorkContentMapper.selectOne(queryWrapper);
-            pmWorkContentService.deleteContent(rid);
-            List<PmWorkContent> contents = pmWorkReport.getWorkContents();
-            List<PmWorkContent> contentsList = new ArrayList<>();
-            for (PmWorkContent e : contents) {
-                e.setReportId(f.getReportId());
-                e.setUpdateBy(userName);
-                e.setUpdateTime(dateTime);
-                e.setSubmitterId(f.getSubmitterId());
-                e.setCreateTime(f.getCreateTime());
-                e.setCreateBy(f.getCreateBy());
-                e.setDeptId(f.getDeptId());
-                e.setTenantId(f.getTenantId());
-                pmWorkContentMapper.insert(e);
-                contentsList.add(e);
-            }
-            if (pmWorkReport.getIsRegularlySend().equals(0)) {
-                rp.setTimingTime(null);
-                if (rp.getReportStatus() == null){
-                    dingTalkAndMessage.sendDingTalkDailyReport(rp, contents);
+
+            if (pmWorkReport.getReportStatus().equals(0)) {
+                if (timingTime == null) {
+                    rp.setTimingTime(timingTime);
+                } else if (timingTime.isAfter(currentTimePlusMinutes)) {
+                    rp.setTimingTime(timingTime);
+                } else {
+                    throw new BusinessException("定时发送支持选中5分钟后的时间,请重新选择时间!");
                 }
-                rp.setReportStatus(1);
+                rp.setId(rid);
+                rp.setSubmitterId(pmWorkReport.getSubmitterId());
+                rp.setCcTo(ccTo);
+                rp.setCoordinateWork(pmWorkReport.getCoordinateWork());
+                rp.setTomorrowPlan(pmWorkReport.getTomorrowPlan());
+                rp.setCreateBy(pmWorkReport.getCreateBy());
+                rp.setUpdateBy(userName);
+                rp.setUpdateTime(dateTime);
+                rp.setTotalHours(totalWorkTime);
+                rp.setIsRegularlySend(pmWorkReport.getIsRegularlySend());
+                rp.setReportFile(pmWorkReport.getReportFile());
+                rp.setReportImage(pmWorkReport.getReportImage());
+                rp.setSendDingTalk(pmWorkReport.getSendDingTalk());
                 pmWorkReportMapper.updateById(rp);
-                if (StringUtils.isNotBlank(ccTo)) {
-                    receiveMessages(ccTo, rid);
+
+                if (pmWorkReport.getIsRegularlySend().equals(0)) {
+                    if (pmWorkReport.getSendDingTalk().equals(1)) {
+                        dingTalkAndMessage.sendDingTalkDailyReport(rp, contents);
+                    }
+                    rp.setReportStatus(1);
+                    pmWorkReportMapper.updateById(rp);
+                    if (StringUtils.isNotBlank(ccTo)) {
+                        dingTalkAndMessage.sendAsyncMessage(rp);
+                        receiveMessages(ccTo, rid);
+                    }
                 }
-                dingTalkAndMessage.sendAsyncMessage(rp);
-            }
+            } else {
+                rp.setId(rid);
+                rp.setCcTo(ccTo);
+                rp.setCoordinateWork(pmWorkReport.getCoordinateWork());
+                rp.setTomorrowPlan(pmWorkReport.getTomorrowPlan());
+                rp.setUpdateBy(userName);
+                rp.setUpdateTime(dateTime);
+                rp.setIsRegularlySend(pmWorkReport.getIsRegularlySend());
+                rp.setSendDingTalk(pmWorkReport.getSendDingTalk());
+                pmWorkReportMapper.updateById(rp);
 
+                pmWorkContentService.deleteContent(rid);
+                List<PmWorkContent> contentsList = new ArrayList<>();
+                for (PmWorkContent e : contents) {
+                    e.setReportId(f.getReportId());
+                    e.setUpdateBy(userName);
+                    e.setUpdateTime(dateTime);
+                    e.setSubmitterId(f.getSubmitterId());
+                    e.setCreateTime(f.getCreateTime());
+                    e.setCreateBy(f.getCreateBy());
+                    e.setDeptId(f.getDeptId());
+                    e.setTenantId(f.getTenantId());
+                    pmWorkContentMapper.insert(e);
+                    contentsList.add(e);
+                }
+            }
         }
     }
 

+ 26 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/PmWorkReportSlideVO.java

@@ -0,0 +1,26 @@
+package com.usky.iot.service.vo;
+
+import com.usky.iot.domain.PmWorkReport;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ *
+ * @author fu
+ * @date 2024/12/9
+ */
+@Data
+public class PmWorkReportSlideVO {
+
+    /**
+     * 上滑动
+     **/
+    List<PmWorkReport> slideUp;
+
+    /**
+     * 下滑动
+     **/
+    List<PmWorkReport> slideDown;
+
+}

+ 20 - 0
service-oa/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>usky-modules</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-oa</artifactId>
+
+    <packaging>pom</packaging>
+    <version>0.0.1</version>
+
+    <modules>
+        <module>service-oa-biz</module>
+        <module>service-oa-api</module>
+    </modules>
+</project>

+ 27 - 0
service-oa/service-oa-api/pom.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>service-oa</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-oa-api</artifactId>
+    <!-- SpringCloud Openfeign -->
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>usky-common-core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+</project>

+ 146 - 0
service-oa/service-oa-biz/pom.xml

@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>service-oa</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-oa-biz</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>common-cloud-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-backend-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-oa-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.5.16</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>1.1.0</version>
+        </dependency>
+
+        <!--MQTT依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-integration</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-mqtt</artifactId>
+        </dependency>
+        <!--websocket依赖-->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-websocket</artifactId>
+            <version>5.2.8.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-agbox-api</artifactId>
+            <version>0.0.1</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-system-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-mp</artifactId>
+            <version>4.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-alarm-api</artifactId>
+            <version>0.0.1</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
+        <!--钉钉-->
+        <!--获取企业accessToken(企业内部应用) 新版SDK-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>2.1.34</version>
+        </dependency>
+        <!--旧版SDK-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
+            <version>2.0.0</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.2.6.RELEASE</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.shalousun</groupId>
+                <artifactId>smart-doc-maven-plugin</artifactId>
+                <version>2.1.1</version>
+                <configuration>
+                    <!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
+                    <configFile>./src/main/resources/smart-doc.json</configFile>
+                    <!--指定项目名称-->
+                    <projectName>test</projectName>
+                    <!--                    <excludes>-->
+                    <!--                        <exclude>com.bizmatics:product-service-provider</exclude>-->
+                    <!--                        <exclude>cn.afterturn:easypoi-web</exclude>-->
+                    <!--                    </excludes>-->
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 0 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/MybatisGeneratorUtils.java


+ 45 - 0
service-oa/service-oa-biz/src/main/java/com/usky/oa/ServiceOaApplication.java

@@ -0,0 +1,45 @@
+package com.usky.oa;
+import io.swagger.annotations.SwaggerDefinition;
+import org.mybatis.spring.annotation.MapperScan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * 系统模块
+ * 
+ * @author ruoyi
+ */
+
+//@EnableSwagger2
+@EnableFeignClients(basePackages = "com.usky")
+@MapperScan(value = "com.usky.oa.mapper")
+@ComponentScan("com.usky")
+@SpringBootApplication
+@EnableRabbit
+public class ServiceOaApplication
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceOaApplication.class);
+
+    public static void main(String[] args) throws UnknownHostException {
+        ConfigurableApplicationContext application = SpringApplication.run(ServiceOaApplication.class, args);
+        Environment env = application.getEnvironment();
+        String ip = InetAddress.getLocalHost().getHostAddress();
+        String port = env.getProperty("server.port");
+        String path = env.getProperty("server.servlet.context-path");
+        LOGGER.info("\n----------------------------------------------------------\n\t" +
+                "Application is running! Access URLs:\n\t" +
+                "Local: \t\thttp://localhost:" + port + (null==path?"":path) + "/\n\t" +
+                "External: \thttp://" + ip + ":" + port + (null==path?"":path) + "/\n\t" +
+                "Api: \t\thttp://" + ip + ":" + port + (null==path?"":path) + "/swagger-ui/index.html\n\t" +
+                "----------------------------------------------------------");
+    }
+}

+ 25 - 0
service-oa/service-oa-biz/src/main/resources/bootstrap.yml

@@ -0,0 +1,25 @@
+# Tomcat
+server:
+  port: 9889
+
+# Spring
+spring: 
+  application:
+    # 应用名称
+    name: service-oa
+  profiles:
+    # 环境配置
+    active: dev
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: usky-cloud-nacos:8848
+      config:
+        # 配置中心地址
+        server-addr: usky-cloud-nacos:8848
+        # 配置文件格式
+        file-extension: yml
+        # 共享配置
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

+ 108 - 0
service-oa/service-oa-biz/src/main/resources/doc/index.adoc

@@ -0,0 +1,108 @@
+= oa项目
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Version |  Update Time  | Status | Author |  Description
+|v2022-04-21 16:57:08|2022-04-21 16:57:08|auto|@yq|Created by smart-doc
+|====================
+
+
+== &lt;p&gt;参数配置表 前端控制器&lt;/p&gt;
+== &lt;p&gt;部门信息&lt;/p&gt;
+=== 查看部门信息
+*URL:* http:10.23.39.1:8082/sysDept/list
+
+*Type:* POST
+
+*Author:* ya
+
+*Content-Type:* application/json; charset=utf-8
+
+
+
+
+*Body-parameters:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Parameter | Type|Description|Required|Since
+|deptId|int64|部门id|false|-
+|parentId|int64|父部门id|false|-
+|ancestors|string|祖级列表|false|-
+|deptName|string|部门名称|false|-
+|orderNum|int32|显示顺序|false|-
+|leader|string|负责人|false|-
+|phone|string|联系电话|false|-
+|email|string|邮箱|false|-
+|status|string|部门状态(0正常 1停用)|false|-
+|delFlag|string|删除标志(0代表存在 2代表删除)|false|-
+|createBy|string|创建者|false|-
+|createTime|string|创建时间|false|-
+|updateBy|string|更新者|false|-
+|updateTime|string|更新时间|false|-
+|bId|int64|建筑id|false|-
+|====================
+
+*Response-fields:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Field | Type|Description|Since
+|status|object|No comments found.|-
+|code|string|No comments found.|-
+|msg|string|No comments found.|-
+|data|object|No comments found.|-
+|└─deptId|int64|部门id|-
+|└─parentId|int64|父部门id|-
+|└─ancestors|string|祖级列表|-
+|└─deptName|string|部门名称|-
+|└─orderNum|int32|显示顺序|-
+|└─leader|string|负责人|-
+|└─phone|string|联系电话|-
+|└─email|string|邮箱|-
+|└─status|string|部门状态(0正常 1停用)|-
+|└─delFlag|string|删除标志(0代表存在 2代表删除)|-
+|└─createBy|string|创建者|-
+|└─createTime|string|创建时间|-
+|└─updateBy|string|更新者|-
+|└─updateTime|string|更新时间|-
+|└─bId|int64|建筑id|-
+|exception|string|No comments found.|-
+|====================
+
+*Response-example:*
+----
+{
+	"status": {
+		
+	},
+	"code": "97564",
+	"msg": "wnr5qt",
+	"data": [
+		{
+			"deptId": 540,
+			"parentId": 858,
+			"ancestors": "o5lg60",
+			"deptName": "文.沈",
+			"orderNum": 260,
+			"leader": "ufz93p",
+			"phone": "17852835049",
+			"email": "智渊.徐@yahoo.com",
+			"status": "nu6cnp",
+			"delFlag": "72oiji",
+			"createBy": "5fxr6j",
+			"createTime": "2022-04-21 16:57:10",
+			"updateBy": "4kcs4e",
+			"updateTime": "2022-04-21 16:57:10",
+			"bId": 977
+		}
+	],
+	"exception": "53u6bg"
+}
+----
+
+== &lt;p&gt;用户信息表 前端控制器&lt;/p&gt;
+

+ 94 - 0
service-oa/service-oa-biz/src/main/resources/logback.xml

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+    <property name="log.path" value="/var/log/uskycloud/service-oa" />
+    <!-- 日志输出格式 -->
+    <property name="log.pattern" value="%d{MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{26}:%line: %msg%n" />
+    <!--    	<property name="log.pattern" value="%gray(%d{MM-dd HH:mm:ss.SSS}) %highlight(%-5level) &#45;&#45; [%gray(%thread)] %cyan(%logger{26}:%line): %msg%n" />-->
+
+
+    <property name="SQL_PACKAGE" value="com.usky.oa.mapper"/>
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="file_sql" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/sql.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sql.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>3</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- 系统日志输出 -->
+    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>3</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统模块日志级别控制  -->
+    <!--	<logger name="com.usky" level="info" />-->
+    <!-- Spring日志级别控制  -->
+    <!--	<logger name="org.springframework" level="warn" />-->
+
+    <logger name="${SQL_PACKAGE}" additivity="false" level="debug">
+        <appender-ref ref="console"/>
+        <appender-ref ref="file_sql"/>
+    </logger>
+
+    <!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+        <appender-ref ref="console" />
+    </root>
+</configuration>

+ 15 - 0
service-oa/service-oa-biz/src/main/resources/smart-doc.json

@@ -0,0 +1,15 @@
+{
+  "outPath":"./src/main/resources/doc",
+  "serverUrl": "http:10.23.39.1:9887/",
+  "isStrict": false,
+  "coverOld": true,
+  "allInOne": true,
+  "packageFilters": "com.usky.iot.controller.web",
+  "requestExample":"false",
+  "responseExample":"true",
+  "projectName": "iot项目",
+  "appKey": "20211216921084883495813120",
+  "appToken":"967031b0cc6f474aaf73616cbf2b25c2",
+  "secret": "N@Pd,KXAHki*BW3=zK.XPNykf!=CM79J",
+  "openUrl": "http://101.133.214.75:7700/api"
+}