Browse Source

Merge branch 'usky-zyj' into server-165

james 3 months ago
parent
commit
98bb35c120
21 changed files with 974 additions and 232 deletions
  1. 3 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/controller/web/EgDeviceController.java
  2. 3 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/RuoYiSystemApplication.java
  3. 3 3
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/MybatisGeneratorUtils.java
  4. 13 5
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmProjectController.java
  5. 25 6
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkContentController.java
  6. 1 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java
  7. 17 2
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/PmWorkContentService.java
  8. 48 48
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/CrmDeviceRepairServiceImpl.java
  9. 175 100
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmProjectServiceImpl.java
  10. 98 11
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java
  11. 82 56
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java
  12. 26 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/PmWorkReportSlideVO.java
  13. 20 0
      service-oa/pom.xml
  14. 27 0
      service-oa/service-oa-api/pom.xml
  15. 146 0
      service-oa/service-oa-biz/pom.xml
  16. 0 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/MybatisGeneratorUtils.java
  17. 45 0
      service-oa/service-oa-biz/src/main/java/com/usky/oa/ServiceOaApplication.java
  18. 25 0
      service-oa/service-oa-biz/src/main/resources/bootstrap.yml
  19. 108 0
      service-oa/service-oa-biz/src/main/resources/doc/index.adoc
  20. 94 0
      service-oa/service-oa-biz/src/main/resources/logback.xml
  21. 15 0
      service-oa/service-oa-biz/src/main/resources/smart-doc.json

+ 3 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/controller/web/EgDeviceController.java

@@ -3,6 +3,8 @@ package com.usky.eg.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.eg.domain.EgDevice;
 import com.usky.eg.service.EgDeviceService;
 import com.usky.eg.service.vo.EgDeviceRequestVO;
@@ -66,6 +68,7 @@ public class EgDeviceController {
     /**
      * 下发设备控制命令
      */
+    @Log(title = "门禁系统人员校验开门", businessType = BusinessType.OTHER)
     @GetMapping("/control")
     public ApiResult<Map<String,Object>> control(@RequestParam("productCode") String productCode,
                                                  @RequestParam("deviceUuid") String deviceUuid,

+ 3 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/RuoYiSystemApplication.java

@@ -19,6 +19,7 @@ import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.EnableAsync;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -34,6 +35,8 @@ import java.net.UnknownHostException;
 @MapperScan(value = "com.usky.iot.mapper")
 @ComponentScan("com.usky")
 @SpringBootApplication
+//开启异步
+@EnableAsync
 //@EnableRabbit
 public class RuoYiSystemApplication
 {

+ 3 - 3
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/MybatisGeneratorUtils.java

@@ -33,7 +33,7 @@ public class MybatisGeneratorUtils {
         projectPath+="/"+model;
         gc.setOutputDir(projectPath+ "/src/main/java");  //生成路径(一般都是生成在此项目的src/main/java下面)
         //修改为自己的名字
-        gc.setAuthor("han"); //设置作者
+        gc.setAuthor("fu"); //设置作者
         gc.setOpen(false);
         gc.setFileOverride(true); //第二次生成会把第一次生成的覆盖掉
         gc.setServiceName("%sService"); //生成的service接口名字首字母是否为I,这样设置就没有
@@ -43,7 +43,7 @@ public class MybatisGeneratorUtils {
         //2、数据源配置
         //修改数据源
         DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://192.168.123.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setUrl("jdbc:mysql://192.168.10.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
         dsc.setDriverName("com.mysql.jdbc.Driver");
         dsc.setUsername("root");
         dsc.setPassword("yt123456");
@@ -71,7 +71,7 @@ public class MybatisGeneratorUtils {
         // strategy.setTablePrefix("t_"); // 表名前缀
         strategy.setEntityLombokModel(true); //使用lombok
         //修改自己想要生成的表
-        strategy.setInclude("vc_stream");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        strategy.setInclude("pm_time_conf");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
         mpg.setStrategy(strategy);
 
         // 关闭默认 xml 生成,调整生成 至 根目录

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

@@ -3,6 +3,8 @@ package com.usky.iot.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.domain.PmProject;
 import com.usky.iot.service.PmProjectService;
@@ -54,14 +56,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));
     }
 
@@ -80,6 +82,7 @@ public class PmProjectController {
      *
      * @param pmProject
      */
+    @Log(title = "新增/编辑项目", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public void add(@RequestBody PmProject pmProject) {
         pmProjectService.addProject(pmProject);
@@ -90,12 +93,14 @@ public class PmProjectController {
      *
      * @param projectId 项目id
      */
-    @DeleteMapping("/delNew")
+    @Log(title = "删除项目", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{projectId}")
     public void del(@RequestParam Integer projectId) {
         pmProjectService.delProject(projectId);
     }
 
     //回退代码
+    @Log(title = "删除项目", businessType = BusinessType.DELETE)
     @GetMapping("/del")
     public void del2(@RequestParam Integer projectId) {
         pmProjectService.delProject(projectId);
@@ -117,6 +122,7 @@ public class PmProjectController {
      *
      * @param projectId 项目id
      */
+    @Log(title = "退出项目", businessType = BusinessType.UPDATE)
     @GetMapping("/exitProject")
     public void exitProject(@RequestParam Integer projectId) {
         pmProjectService.exitProject(projectId);
@@ -150,6 +156,8 @@ public class PmProjectController {
         return ApiResult.success(pmProjectService.usersProjectWorkTime(projectId, startDate, endDate));
     }
 
+    // 加入项目
+    @Log(title = "加入项目", businessType = BusinessType.UPDATE)
     @GetMapping("/joinProject")
     public void projectIdName(@RequestParam(value = "projectId") Integer projectId) {
         pmProjectService.joinProject(projectId);

+ 25 - 6
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,15 +88,32 @@ public class PmWorkContentController {
      * @return
      */
     @GetMapping("/page")
-    public ApiResult<CommonPage<PmWorkReport>> page(@RequestParam(value = "projectAscription", required = false, defaultValue = "2") Integer projectAscription,
-                                                    @RequestParam(value = "pageNum") Integer pageNum,
-                                                    @RequestParam(value = "pageSize") Integer pageSize,
+    public ApiResult<CommonPage<PmWorkReport>> page(@RequestParam(value = "projectAscription", required = false, defaultValue = "-1") Integer projectAscription,
+                                                    @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
+                                                    @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize,
                                                     @RequestParam(value = "reportId", required = false) Integer reportId,
                                                     @RequestParam(value = "startDate", required = false) String startDate,
                                                     @RequestParam(value = "endDate", required = false) String endDate,
                                                     @RequestParam(value = "projectId", required = false) Integer projectId,
-                                                    @RequestParam(value = "submitterId", required = false) Long submitterId) {
-        return ApiResult.success(pmWorkContentService.reportPage(projectAscription, pageNum, pageSize, reportId, startDate, endDate, projectId, submitterId));
+                                                    @RequestParam(value = "submitterId", required = false) Long submitterId,
+                                                    @RequestParam(value = "upOrDown", required = false) Integer upOrDown,
+                                                    @RequestParam(value = "slideSum", required = false) Integer slideSum,
+                                                    @RequestParam(value = "submitDate", required = false) String submitDate) {
+        return ApiResult.success(pmWorkContentService.reportPage(projectAscription, pageNum, pageSize, reportId, startDate, endDate, projectId, submitterId, upOrDown, slideSum, submitDate));
+    }
+
+    /**
+     * 上下滑动
+     * @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));
     }
 
     /**

+ 1 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/PmWorkReportController.java

@@ -51,7 +51,7 @@ public class PmWorkReportController {
      *
      * @param
      */
-    @Log(title = "添加工作报告", businessType = BusinessType.INSERT)
+    @Log(title = "新增/编辑工作报告", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     public void add(@RequestBody PmWorkReport pmWorkReport) {
         pmWorkReportService.addReport(pmWorkReport);

+ 17 - 2
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;
 
 /**
@@ -65,9 +67,22 @@ public interface PmWorkContentService extends CrudService<PmWorkContent> {
      * @param projectAscription 1:我负责;2:我收到;3:我发出
      * @param pageNum 页数
      * @param pageSize 页大小
-     * @return
+     * @param upOrDown 上下滑动(0:下滑;1:上滑)
+     * @param slideSum 滑动数量
+     * @param submitDate 提交时间
+     * @return''
      */
-    CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize, Integer report, String startDate, String endDate, Integer projectId, Long userId);
+    CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize, Integer report, String startDate,
+                                        String endDate, Integer projectId, Long userId, Integer upOrDown, Integer slideSum, String submitDate);
+
+    /**
+     * @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 返回项目名(或牛马名)以及项目工时

+ 48 - 48
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/CrmDeviceRepairServiceImpl.java

@@ -213,57 +213,57 @@ public class CrmDeviceRepairServiceImpl extends AbstractCrudService<CrmDeviceRep
         crmDeviceRepair1.setHandleTime(LocalDateTime.now());
         this.updateById(crmDeviceRepair1);
 
-        CrmDeviceRepair crmDeviceRepair = this.getById(crmDeviceRepair1.getId());
-
-        //发送短信
-        StringBuffer sendStatus = new StringBuffer();
-        StringBuffer sendContext = new StringBuffer();
-        DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "LTAI5tH3VvRL5BUkovCokHJX", "SaaWUouNqvcA0C746gcNOH9m6SRYN4");
-        IAcsClient client = new DefaultAcsClient(profile);
-        SendSmsRequest request = new SendSmsRequest();
-        request.setPhoneNumbers(crmDeviceRepair.getReflectPhone());//接收短信的手机号码
-        request.setSignName("上海永天科技股份有限公司");//短信签名名称
-        request.setTemplateCode("SMS_463206001");//短信模板CODE
-
-        String custom = "#/pages/common/evaluate/index?statusBool=true&repairCode="+crmDeviceRepair.getRepairCode();
-        request.setTemplateParam("{\"name\":\""+crmDeviceRepair.getReflectName()+"\","+"\"date\":\""+crmDeviceRepair.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+"\","+"\"custom\":\""+custom+"\"}");//短信模板变量对应的实际值
-
-        try {
-            SendSmsResponse response = client.getAcsResponse(request);
-            if(response.getCode() != null){
-                if(response.getCode().equals("OK")){
-//                    sendStatus.append("1");
-//                    //查询发送短信内容
+//        CrmDeviceRepair crmDeviceRepair = this.getById(crmDeviceRepair1.getId());
+
+//        //发送短信
+//        StringBuffer sendStatus = new StringBuffer();
+//        StringBuffer sendContext = new StringBuffer();
+//        DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "LTAI5tH3VvRL5BUkovCokHJX", "SaaWUouNqvcA0C746gcNOH9m6SRYN4");
+//        IAcsClient client = new DefaultAcsClient(profile);
+//        SendSmsRequest request = new SendSmsRequest();
+//        request.setPhoneNumbers(crmDeviceRepair.getReflectPhone());//接收短信的手机号码
+//        request.setSignName("上海永天科技股份有限公司");//短信签名名称
+//        request.setTemplateCode("SMS_463206001");//短信模板CODE
 //
-//                    try {
-//                        Thread.sleep(3000);
-//                    } catch (InterruptedException e) {
-//                        e.printStackTrace();
-//                    }
+//        String custom = "#/pages/common/evaluate/index?statusBool=true&repairCode="+crmDeviceRepair.getRepairCode();
+//        request.setTemplateParam("{\"name\":\""+crmDeviceRepair.getReflectName()+"\","+"\"date\":\""+crmDeviceRepair.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+"\","+"\"custom\":\""+custom+"\"}");//短信模板变量对应的实际值
 //
-//                    QuerySendDetailsRequest request1 = new QuerySendDetailsRequest();
-//                    request1.setPhoneNumber(crmDeviceRepair.getReflectPhone());
-//                    request1.setSendDate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
-//                    request1.setPageSize((long)10);
-//                    request1.setCurrentPage((long)1);
-//                    QuerySendDetailsResponse response1 = client.getAcsResponse(request1);
-//                    if(response1.getCode() != null){
-//                        if(response1.getCode().equals("OK")){
-//                            sendContext.append(response1.getSmsSendDetailDTOs().get(0).getContent());
-//                        }
+//        try {
+//            SendSmsResponse response = client.getAcsResponse(request);
+//            if(response.getCode() != null){
+//                if(response.getCode().equals("OK")){
+////                    sendStatus.append("1");
+////                    //查询发送短信内容
+////
+////                    try {
+////                        Thread.sleep(3000);
+////                    } catch (InterruptedException e) {
+////                        e.printStackTrace();
+////                    }
+////
+////                    QuerySendDetailsRequest request1 = new QuerySendDetailsRequest();
+////                    request1.setPhoneNumber(crmDeviceRepair.getReflectPhone());
+////                    request1.setSendDate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
+////                    request1.setPageSize((long)10);
+////                    request1.setCurrentPage((long)1);
+////                    QuerySendDetailsResponse response1 = client.getAcsResponse(request1);
+////                    if(response1.getCode() != null){
+////                        if(response1.getCode().equals("OK")){
+////                            sendContext.append(response1.getSmsSendDetailDTOs().get(0).getContent());
+////                        }
+////
+////                    }
 //
-//                    }
-
-                }else{
-//                    sendStatus.append("2");
-                }
-            }
-            System.out.println(new Gson().toJson(response));
-        } catch (ClientException e) {
-            System.out.println("ErrCode:" + e.getErrCode());
-            System.out.println("ErrMsg:" + e.getErrMsg());
-            System.out.println("RequestId:" + e.getRequestId());
-        }
+//                }else{
+////                    sendStatus.append("2");
+//                }
+//            }
+//            System.out.println(new Gson().toJson(response));
+//        } catch (ClientException e) {
+//            System.out.println("ErrCode:" + e.getErrCode());
+//            System.out.println("ErrMsg:" + e.getErrMsg());
+//            System.out.println("RequestId:" + e.getRequestId());
+//        }
 
     }
 

+ 175 - 100
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;
@@ -20,6 +22,7 @@ import com.usky.iot.service.PmWorkContentService;
 import com.usky.iot.service.vo.PmProjectWorkTimeTwoVo;
 import com.usky.iot.service.vo.PmUsersProjectWorkTimeVO;
 import com.usky.system.domain.SysUser;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -40,6 +43,7 @@ import java.util.stream.IntStream;
  * @author fu
  * @since 2024-05-20
  */
+@Slf4j
 @Service
 public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, PmProject> implements PmProjectService {
 
@@ -67,55 +71,87 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         Integer tenantId = SecurityUtils.getTenantId();
         LocalDateTime now = LocalDateTime.now();
 
-        if (project.getVisibleRange() == null){
-            project.setVisibleRange((byte) 1);
+        // 检查项目名称是否为空或超过长度限制
+        String projectName = project.getProjectName();
+        if (StringUtils.isBlank(projectName)) {
+            throw new BusinessException("项目名称不能为空!");
+        }else if (projectName.length() > 50) {
+            throw new BusinessException("项目名称长度不能超过50个字符!");
         }
 
+        // 检查项目名称是否已存在
         if (Objects.isNull(project.getId())) {
-            String projectName = project.getProjectName();
-            LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
-            wrapper.eq(PmProject::getProjectName, projectName)
-                    .eq(PmProject::getTenantId, tenantId)
-                    .eq(PmProject::getDelFlag, 0);
-            PmProject pmProject = pmProjectMapper.selectOne(wrapper);
-            if (Objects.nonNull(pmProject)) {
-                throw new BusinessException("已存在同名项目!请检查后重试");
-            }
+            checkProjectNameExistence(project, tenantId);
+        }
+
+        // 检查项目类型是否为空或不在有效范围内
+        Integer projectType = project.getProjectType();
+        if (projectType == null) {
+            throw new BusinessException("项目类型不能为空且");
+        }else if (projectType < 1 || projectType > 6) {
+            throw new BusinessException("项目类型传参有误!");
+        }
+
+        // 检查项目状态是否为空或不在有效范围内
+        Integer projectStatus = project.getProjectStatus();
+        if (projectStatus == null) {
+            throw new BusinessException("项目状态不能为空且!");
+        }else if (projectStatus < 1 || projectStatus > 5) {
+            throw new BusinessException("项目状态传参有误!");
+        }
+
+        // 设置项目工作量和校验
+        handleProjectWorkload(project);
+
+        // 保存或更新项目
+        saveOrUpdateProject(project, userName, now, deptId, tenantId);
+    }
+
+    // 检查项目名称是否已存在
+    private void checkProjectNameExistence(PmProject project, Integer tenantId) {
+        LambdaQueryWrapper<PmProject> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(PmProject::getProjectName, project.getProjectName())
+                .eq(PmProject::getTenantId, tenantId)
+                .eq(PmProject::getDelFlag, 0);
+        PmProject existingProject = pmProjectMapper.selectOne(wrapper);
+        if (Objects.nonNull(existingProject)) {
+            throw new BusinessException("已存在同名项目!请检查后重试");
         }
+    }
 
+    // 处理项目工作量
+    private void handleProjectWorkload(PmProject project) {
         if (Objects.isNull(project.getProjectWorkload())) {
-            if (Objects.isNull(project.getId())) {
-                project.setCreateBy(userName);
-                project.setCreateTime(now);
-                project.setTenantId(tenantId);
-                project.setDeptId(deptId);
-                this.save(project);
-            } else {
-                project.setUpdateBy(userName);
-                project.setUpdateTime(now);
-                this.updateById(project);
-            }
+            return;
+        }
+
+        if (project.getProjectWorkload().scale() > 1) {
+            throw new BusinessException("计划人/天小数位超出长度,请重新输入!");
+        } else if (project.getProjectWorkload().precision() - project.getProjectWorkload().scale() > 5) {
+            throw new BusinessException("计划人/天整数位超出长度,请重新输入!");
+        }
+    }
+
+    // 保存或更新项目
+    private void saveOrUpdateProject(PmProject project, String userName, LocalDateTime now, Long deptId, Integer tenantId) {
+        if (Objects.isNull(project.getId())) {
+            project.setCreateBy(userName);
+            project.setCreateTime(now);
+            project.setDeptId(deptId);
+            project.setTenantId(tenantId);
+            this.save(project);
         } else {
-            if (project.getProjectWorkload().scale() > 1) {
-                throw new BusinessException("计划人/天小数位超出长度,请重新输入!");
-            } else if (project.getProjectWorkload().precision() - project.getProjectWorkload().scale() > 5) {
-                throw new BusinessException("计划人/天整数位超出长度,请重新输入!");
-            } else {
-                if (Objects.isNull(project.getId())) {
-                    project.setCreateBy(userName);
-                    project.setCreateTime(now);
-                    project.setDeptId(deptId);
-                    project.setTenantId(tenantId);
-                    this.save(project);
-                } else {
-                    project.setUpdateBy(userName);
-                    project.setUpdateTime(now);
-                    this.updateById(project);
-                }
-            }
+            project.setUpdateBy(userName);
+            project.setUpdateTime(now);
+            this.updateById(project);
         }
     }
 
+    /**
+     * 删除项目
+     *
+     * @param projectId 项目id
+     */
     @Override
     public void delProject(Integer projectId) {
         LambdaQueryWrapper<PmWorkContent> queryWrapper = Wrappers.lambdaQuery();
@@ -154,7 +190,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 +201,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 +213,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,44 +246,77 @@ 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);
         }
 
@@ -307,25 +376,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,35 +424,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();
-            wrapper.select(PmProject::getProjectHead, PmProject::getProjectMember)
-                    .eq(PmProject::getTenantId, SecurityUtils.getTenantId())
-                    .eq(PmProject::getDelFlag, 0);
-            List<PmProject> users = pmProjectMapper.selectList(wrapper);
-
-            List<Long> userIds = new ArrayList<>();
-            for (PmProject user : users) {
-                Long projectHead = user.getProjectHead();
-                userIds.add(projectHead);
-                if (user.getProjectMember() != null && StringUtils.isNotBlank(user.getProjectMember())) {
-                    Set<Long> projectMembers = Arrays.stream(user.getProjectMember().split(","))
-                            .map(Long::parseLong)
-                            .collect(Collectors.toSet());
-                    userIds.addAll(projectMembers);
-                }
-            }
-            List<Long> finalList = userIds.stream().distinct().collect(Collectors.toList());
-            LambdaQueryWrapper<SysUser> wrapper2 = Wrappers.lambdaQuery();
-            wrapper2.select(SysUser::getUserId, SysUser::getNickName)
-                    .in(SysUser::getUserId, finalList);
-            userList = sysUserMapper.selectList(wrapper2);
+            queryNameId.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName)
+                    .eq(SysUser::getDelFlag, 0)
+                    .eq(SysUser::getStatus, "0")
+                    .apply(Objects.nonNull(DataScopeContextHolder.getDataScopeSql()), DataScopeContextHolder.getDataScopeSql());
         }
+        userList = sysUserMapper.selectList(queryNameId);
         for (SysUser user : userList) {
             Map<String, Object> map = new HashMap<>();
             map.put("id", user.getUserId());
@@ -388,16 +449,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<>();
@@ -580,6 +650,11 @@ public class PmProjectServiceImpl extends AbstractCrudService<PmProjectMapper, P
         }
 
         List<Long> userIds1 = new ArrayList<>(userIds);
+
+        if (userIds1.isEmpty()) {
+            return workTimeCount;
+        }
+
         List<SysUser> sysUsers = pmWorkContentService.nickNames(userIds1);
         BigDecimal totalWorkTime = BigDecimal.ZERO;
 

+ 98 - 11
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());
     }
 
@@ -425,7 +428,9 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     @Override
     public List<SysUser> nickNames(List<Long> userIds) {
         LambdaQueryWrapper<SysUser> usersQuery = Wrappers.lambdaQuery();
-        usersQuery.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName, SysUser::getPhonenumber, SysUser::getAvatar, SysUser::getSex, SysUser::getDeptId).eq(SysUser::getTenantId, SecurityUtils.getTenantId()).eq(SysUser::getDelFlag, 0);
+        usersQuery.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName, SysUser::getPhonenumber, SysUser::getAvatar, SysUser::getSex, SysUser::getDeptId)
+                .eq(SysUser::getTenantId, SecurityUtils.getTenantId())
+                .eq(SysUser::getDelFlag, 0);
         if (!userIds.isEmpty()) {
             usersQuery.in(SysUser::getUserId, userIds);
         }
@@ -440,15 +445,30 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
      * @return: java.util.List<com.usky.system.domain.PmWorkContent>
      **/
     @Override
-    public CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize, Integer reportId,
-                                               String startDate, String endDate, Integer projectId, Long userId) {
+    public CommonPage<PmWorkReport> reportPage(Integer projectAscription, Integer pageNum, Integer pageSize, Integer reportId, String startDate,
+                                               String endDate, Integer projectId, Long userId, Integer upOrDown, Integer slideSum, String submitDate) {
+        if (pageNum < 1 || pageSize < 1) {
+            throw new BusinessException("页码和每页数量不能小于1");
+        }
+
+        List<PmWorkReport> reportList = new ArrayList<>();
+        IPage<PmWorkReport> reportPage = new Page<>(pageNum, pageSize);
         LocalDateTime startDateTime = null;
         LocalDateTime endDateTime = null;
+        LocalDateTime submitDateTime = null;
+        if (StringUtils.isNotBlank(submitDate)) {
+            DateTimeFormatter submitDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            try {
+                submitDateTime = LocalDateTime.parse(submitDate, submitDateFormatter);
+            } catch (Exception e) {
+                throw new BusinessException("滑动时间传参格式不正确,请重试" + e);
+            }
+        }
         Integer tenantId = SecurityUtils.getTenantId();
         LocalDate start = null;
         LocalDate end = null;
         List<Integer> reportIds = new ArrayList<>();
-        CommonPage<PmWorkReport> returnPage = new CommonPage<>(new ArrayList<>(), 0, pageSize, pageNum);
+        CommonPage<PmWorkReport> returnPage = new CommonPage<>(reportList, reportPage.getTotal(), pageSize, pageNum);
 
         Set<Integer> reportIdsByUser = new HashSet<>();
         Set<Integer> reportIdsByDate = new HashSet<>();
@@ -529,7 +549,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()) {
@@ -573,10 +593,33 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         if (reportId != null && reportId != 0) {
             reportQuery.eq(PmWorkReport::getId, reportId);
         } else {
-            reportQuery.in(PmWorkReport::getId, reportIds2).orderByDesc(PmWorkReport::getSubmitDate);
+            reportQuery.in(PmWorkReport::getId, reportIds2);
+            // 判断上下滑动以及数量
+            if (upOrDown != null && slideSum != null && submitDateTime != null) {
+                if (slideSum > 0) {
+                    // 向下滑动
+                    if (upOrDown == 0) {
+                        reportQuery.lt(PmWorkReport::getSubmitDate, submitDateTime).orderByDesc(PmWorkReport::getSubmitDate);
+                    }
+                    // 向上滑动
+                    else if (upOrDown == 1) {
+                        reportQuery.gt(PmWorkReport::getSubmitDate, submitDateTime).orderByAsc(PmWorkReport::getSubmitDate);
+                    } else {
+                        throw new BusinessException("上下滑动参数异常");
+                    }
+                    // 设置pageSize为slideSum,确保返回的数据量为slideSum
+                    pageNum = 1;
+                    pageSize = slideSum;
+                } else {
+                    throw new BusinessException("滑动数量参数必须是大于0正整数");
+                }
+            } else {
+                reportQuery.orderByDesc(PmWorkReport::getSubmitDate);
+            }
         }
-        IPage<PmWorkReport> reportPage = pmWorkReportMapper.selectPage(new Page<>(pageNum, pageSize), reportQuery);
-        List<PmWorkReport> reportList = reportPage.getRecords();
+
+        reportPage = pmWorkReportMapper.selectPage(new Page<>(pageNum, pageSize), reportQuery);
+        reportList = reportPage.getRecords();
 
         // 查询已读状态
         LambdaQueryWrapper<PmReceive> statusQuery = Wrappers.lambdaQuery();
@@ -665,6 +708,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 +963,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         }
         List<WorkHoursStatisticsVO> userAndProjectD = userAndProject;
 
-        //判断是否为项目维度
+        // 判断是否为项目维度
         if (workerOrProject != 1) {
             returnList.add(nickName);
             // 重组返回数据结构
@@ -974,7 +1061,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);

+ 82 - 56
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkReportServiceImpl.java

@@ -23,6 +23,7 @@ import com.usky.system.domain.SysUser;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -212,6 +213,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 +254,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 +271,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 +336,90 @@ 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.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);
+
+                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);
+                }
+
+                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);
+                    }
                 }
-                rp.setReportStatus(1);
+            } 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);
-                if (StringUtils.isNotBlank(ccTo)) {
-                    receiveMessages(ccTo, rid);
+
+                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);
                 }
-                dingTalkAndMessage.sendAsyncMessage(rp);
             }
-
         }
     }
 
@@ -657,8 +678,13 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
         if (timedReports.isEmpty()) {
             return timedReports;
         }
+
         List<Integer> reportIds = timedReports.stream().map(PmWorkReport::getId).collect(Collectors.toList());
 
+        List<Long> userIds = timedReports.stream().map(PmWorkReport::getSubmitterId).collect(Collectors.toList());
+        List<SysUser> sysUsers = pmWorkContentService.nickNames(userIds);
+        Map<Long, String> userNicknameMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, SysUser::getNickName));
+
         LambdaQueryWrapper<PmWorkContent> reportContents = Wrappers.lambdaQuery();
         reportContents.in(PmWorkContent::getReportId, reportIds);
         List<PmWorkContent> pmWorkContentList = pmWorkContentMapper.selectList(reportContents);
@@ -672,8 +698,8 @@ public class PmWorkReportServiceImpl extends AbstractCrudService<PmWorkReportMap
                 }
             }
             report.setWorkContents(workContents);
+            report.setCreateBy(userNicknameMap.get(report.getSubmitterId()));
         }
-
         return timedReports;
     }
 

+ 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"
+}