seyason пре 3 година
родитељ
комит
8bed20c85c
100 измењених фајлова са 7090 додато и 73 уклоњено
  1. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/aop/AopLogConfiguration.java
  2. 94 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/BusinessTripController.java
  3. 8 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  4. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SysRoleController.java
  5. 16 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  6. 135 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/BusinessTrip.java
  7. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BusinessTripMapper.java
  8. 29 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/BusinessTripService.java
  9. 139 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/BusinessTripServiceImpl.java
  10. 22 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  11. 1 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  12. 19 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  13. 10 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  14. 15 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  15. 4 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ListUtil.java
  16. 5 7
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-dev.yml
  17. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-prod.yml
  18. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  19. 30 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BusinessTripMapper.xml
  20. BIN
      fhKeeper/formulahousekeeper/ops-platform/0AAE1300
  21. BIN
      fhKeeper/formulahousekeeper/ops-platform/ED622300
  22. 1 0
      fhKeeper/formulahousekeeper/ops-platform/build_package.bat
  23. BIN
      fhKeeper/formulahousekeeper/ops-platform/chi_sim.traineddata
  24. BIN
      fhKeeper/formulahousekeeper/ops-platform/opencv/opencv-420.jar
  25. BIN
      fhKeeper/formulahousekeeper/ops-platform/opencv/x64/opencv_java420.dll
  26. BIN
      fhKeeper/formulahousekeeper/ops-platform/opencv/x86/opencv_java420.dll
  27. 225 0
      fhKeeper/formulahousekeeper/ops-platform/pom.xml
  28. 38 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/PlatformStartApplication.java
  29. 80 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/aop/AopLogConfiguration.java
  30. 97 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/aop/SensitiveWordConfig.java
  31. 35 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/BeanConfig.java
  32. 14 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/Config.java
  33. 84 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/RefererInterceptor.java
  34. 23 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/RefererProperties.java
  35. 22 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/SchedulerConfig.java
  36. 28 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/WebConfig.java
  37. 38 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/constant/Constant.java
  38. 27 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/constant/MybatisPlusPageConfig.java
  39. 44 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/constant/Parameter.java
  40. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/AlertTimeController.java
  41. 128 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/AuditWorkflowSettingController.java
  42. 141 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/AuditWorkflowTimeSettingController.java
  43. 155 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java
  44. 60 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CommonUploadController.java
  45. 92 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyController.java
  46. 43 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyCustomerContactController.java
  47. 39 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyDingdingController.java
  48. 108 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CustomerInfoController.java
  49. 123 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/DepartmentController.java
  50. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/DepartmentDingdingController.java
  51. 283 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/DingDingController.java
  52. 47 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/DirtyCleanController.java
  53. 99 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/EarningSnapshotController.java
  54. 39 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ExpenseItemController.java
  55. 94 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ExpenseSheetController.java
  56. 36 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ExpenseTypeController.java
  57. 48 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceAuditorController.java
  58. 125 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceController.java
  59. 23 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceFixedcolnameController.java
  60. 94 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceImportController.java
  61. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceProjectsController.java
  62. 128 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceTblcuscolController.java
  63. 105 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/GroupTemplateController.java
  64. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/GroupTmpstagesController.java
  65. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/GtemplateTaskController.java
  66. 37 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/InformationController.java
  67. 98 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/LeaveSheetController.java
  68. 42 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/OperationLogController.java
  69. 20 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ParticipationController.java
  70. 48 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/PdfFileController.java
  71. 96 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/PermissionController.java
  72. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/PicContentKeywordsController.java
  73. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/PpMembsController.java
  74. 115 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProfessionController.java
  75. 40 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectAuditorController.java
  76. 69 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectBasecostController.java
  77. 120 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java
  78. 106 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectCategoryController.java
  79. 386 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectController.java
  80. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectDocfolderController.java
  81. 321 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectDocumentController.java
  82. 72 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectNotifyUserController.java
  83. 45 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectPercentageController.java
  84. 57 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectProfessionController.java
  85. 148 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectTimerController.java
  86. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectUserSalaryController.java
  87. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportAlogMembdateController.java
  88. 89 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportAuditLogController.java
  89. 885 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportController.java
  90. 151 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java
  91. 52 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportImportLogController.java
  92. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportProfessionProgressController.java
  93. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SimpleFinanceController.java
  94. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SimpleProjectimeController.java
  95. 71 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SimpleReportController.java
  96. 292 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/StagesController.java
  97. 95 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SubProjectController.java
  98. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SysConfigController.java
  99. 21 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SysFunctionController.java
  100. 0 0
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SysModuleController.java

+ 3 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/aop/AopLogConfiguration.java

@@ -21,7 +21,7 @@ import java.util.Arrays;
 @Configuration
 public class AopLogConfiguration {
     //切入点表达式
-    @Pointcut("execution(public * com.management.*.service.*.*(..)) || execution(public * com.management.*.controller.*.*(..))")
+    @Pointcut("execution(public * com.management.*.controller.*.*(..))")
     public void logPointcut(){
 
     }
@@ -41,7 +41,8 @@ public class AopLogConfiguration {
 
         String methodName = joinPoint.getSignature().getName();
         if (!"loginAdmin".equals(methodName)) {
-            log.info("请求方法:"+request.getRequestURL().toString()+", 参数: "+Arrays.toString(joinPoint.getArgs()));
+            String reqUrl = request.getRequestURL().toString().replaceAll("http://localhost:10010/","");
+            log.info("请求方法:"+reqUrl+", 参数: "+Arrays.toString(joinPoint.getArgs()));
         }
     }
 

+ 94 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/BusinessTripController.java

@@ -0,0 +1,94 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.BusinessTrip;
+import com.management.platform.entity.LeaveSheet;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.SysFunctionMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.BusinessTripService;
+import com.management.platform.service.LeaveSheetService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-08
+ */
+@RestController
+@RequestMapping("/business-trip")
+public class BusinessTripController {
+
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    BusinessTripService businessTripService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(BusinessTrip sheet) {
+        return businessTripService.add(sheet);
+
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        return businessTripService.delete(id);
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(BusinessTrip sheet, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部出差");
+        if (functionList.size() == 0) {
+            //普通员工只能看自己的
+            sheet.setOwnerId(user.getId());
+        }
+        sheet.setCompanyId(user.getCompanyId());
+        return businessTripService.queryList(sheet, pageIndex, pageSize);
+    }
+
+    @RequestMapping("/approve")
+    public HttpRespMsg approve(Integer id) {
+
+        return businessTripService.approve(id);
+
+    }
+    @RequestMapping("/deny")
+    public HttpRespMsg deny(Integer id, String denyReason) {
+
+        return businessTripService.deny(id, denyReason);
+
+    }
+
+    /**
+     *
+     * @param keyword 姓名(模糊匹配)
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @return
+     */
+    @RequestMapping("/summaryData")
+    public HttpRespMsg summaryData(String keyword, String startDate, String endDate) {
+        String userId = request.getHeader("Token");
+        return businessTripService.summaryData(keyword, startDate, endDate, userId);
+
+    }
+}
+

+ 8 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -153,6 +153,13 @@ public class ReportController {
                                     ) {
         List<Report> reportList = new ArrayList<>();
         String token = request.getHeader("Token");
+        User user = userService.getById(token);
+        //检查当前人员账号是否停用
+        if (user.getIsActive() == 0) {
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.setError("您的账号已停用,无法操作");
+            return msg;
+        }
         List<String> targetUidList = null;
         List<User> targetUserList = null;
         if (projectId == null) {
@@ -266,7 +273,7 @@ public class ReportController {
             }
             targetUserList = userService.list(new QueryWrapper<User>().in("id", targetUidList));
         }
-        User user = userService.getById(token);
+
         LocalDate now = LocalDate.now();
         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         BigDecimal hourCost = null;

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/SysRoleController.java

@@ -46,8 +46,8 @@ public class SysRoleController {
             queryWrapper.eq("id", 88)
                     .or().eq("id", 294).or().eq("id",309).or().eq("id", 7)
                     .or().eq("id", 10).or().eq("id", 424).or().eq("id", 317)
-                    .or().eq("id", 428).or().eq("id", 469)
-                    .or().eq("id", 481).or().eq("id", 528)
+                    .or().eq("id", 428).or().eq("id", 469).or().eq("id", 434)
+                    .or().eq("id", 481).or().eq("id", 528).or().eq("id", 443)
                     .or().eq("id", 529).or().eq("id", 541).or().gt("id", 565);
             //565是2月底最后一家
             List<Company> allCompany = companyMapper.selectList(queryWrapper);

+ 16 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -443,8 +443,6 @@ public class WeiXinCorpController {
                             projectBasecostSettingMapper.insert(setting);
                         }
 
-
-
                         //生成工作时长
                         TimeType timeType = new TimeType();
                         timeType.setCompanyId(company.getId());
@@ -467,11 +465,12 @@ public class WeiXinCorpController {
                             name = userId;
                         }
                         if (name.length() > 10) {
-                            name = name.substring(0,10);
+                            name = "未知";
                         }
                         User user = new User()
                                 .setId(id.toString())
-                                .setRole(managerRole.getId())
+                                .setRoleId(managerRole.getId())
+                                .setRoleName(managerRole.getRolename())
                                 .setName(name)
                                 .setPassword(MD5Util.getPassword("000000"))
                                 .setCorpwxUserid(userId)
@@ -864,6 +863,19 @@ public class WeiXinCorpController {
         List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
         //过滤一下,这个角色选中的模块
         moduleList = moduleList.stream().filter(m->ids.contains(m.getId())).collect(Collectors.toList());
+        if (company.getPackageEngineering() == 1) {
+            //生成虚拟的两个审核放进去
+            SysModule proModule = new SysModule();
+            proModule.setName("专业审核");
+            proModule.setPath("/reviewProfession");
+            proModule.setId(0);
+            moduleList.add(1,proModule);
+            SysModule deptModule = new SysModule();
+            deptModule.setName("部门审核");
+            deptModule.setPath("/reviewDepartment");
+            deptModule.setId(0);
+            moduleList.add(2,deptModule);
+        }
         //组装层级关系,默认只有两级
         List<SysModule> menuList = new ArrayList<>();
         for (SysModule module : moduleList) {

+ 135 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/BusinessTrip.java

@@ -0,0 +1,135 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class BusinessTrip extends Model<BusinessTrip> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 申请人id
+     */
+    @TableField("owner_id")
+    private String ownerId;
+
+    /**
+     * 申请人姓名
+     */
+    @TableField("owner_name")
+    private String ownerName;
+
+    /**
+     * 出差事由
+     */
+    @TableField("reason")
+    private String reason;
+
+    /**
+     * 开始时间
+     */
+    @TableField("start_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate startDate;
+
+    /**
+     * 结束时间
+     */
+    @TableField("end_date")
+
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate endDate;
+
+    /**
+     * 0-飞机,1-火车,2-汽车,3-轮船,4-其他
+     */
+    @TableField("way")
+    private Integer way;
+
+    /**
+     * 出发城市
+     */
+    @TableField("city_from")
+    private String cityFrom;
+
+    /**
+     * 目的城市
+     */
+    @TableField("city_to")
+    private String cityTo;
+
+    /**
+     * 0-单程,1-往返
+     */
+    @TableField("go_back")
+    private Integer goBack;
+
+    /**
+     * 出差天数
+     */
+    @TableField("day_count")
+    private Integer dayCount;
+
+    /**
+     * 备注
+     */
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 0-审核通过,1-待审核,2-驳回,3-已撤回
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 驳回原因
+     */
+    @TableField("deny_reason")
+    private String denyReason;
+
+    /**
+     * 申请时间
+     */
+    @TableField("indate")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime indate;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BusinessTripMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.BusinessTrip;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-08
+ */
+public interface BusinessTripMapper extends BaseMapper<BusinessTrip> {
+
+}

+ 29 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/BusinessTripService.java

@@ -0,0 +1,29 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.BusinessTrip;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.LeaveSheet;
+import com.management.platform.util.HttpRespMsg;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-08
+ */
+public interface BusinessTripService extends IService<BusinessTrip> {
+
+    HttpRespMsg summaryData(String keyword, String startDate, String endDate, String userId);
+
+    HttpRespMsg approve(Integer id);
+
+    HttpRespMsg deny(Integer id, String denyReason);
+
+    HttpRespMsg queryList(BusinessTrip sheet, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg delete(Integer id);
+
+    HttpRespMsg add(BusinessTrip sheet);
+}

+ 139 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/BusinessTripServiceImpl.java

@@ -0,0 +1,139 @@
+package com.management.platform.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.BusinessTrip;
+import com.management.platform.entity.LeaveSheet;
+import com.management.platform.entity.TimeType;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.BusinessTripMapper;
+import com.management.platform.mapper.LeaveSheetMapper;
+import com.management.platform.mapper.TimeTypeMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.BusinessTripService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-08
+ */
+@Service
+public class BusinessTripServiceImpl extends ServiceImpl<BusinessTripMapper, BusinessTrip> implements BusinessTripService {
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private BusinessTripMapper businessTripMapper;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private HttpServletRequest request;
+
+    @Override
+    public HttpRespMsg add(BusinessTrip sheet) {
+        HttpRespMsg msg = new HttpRespMsg();
+        boolean isNew = false;
+        if (sheet.getId() == null) {
+            isNew = true;
+        }
+        String userId = request.getHeader("TOKEN");
+        sheet.setOwnerId(userId);
+        User user = userMapper.selectById(userId);
+        sheet.setOwnerName(user.getName());
+        sheet.setCompanyId(user.getCompanyId());
+
+        if (isNew) {
+            //检查该时间段是否已经有按天请假
+            QueryWrapper<BusinessTrip> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("owner_id", sheet.getOwnerId());
+            queryWrapper.and(wrapper->wrapper.between("start_date", sheet.getStartDate(), sheet.getEndDate()).or().between("end_date", sheet.getStartDate(), sheet.getEndDate()));
+
+            int count = businessTripMapper.selectCount(queryWrapper);
+            if (count > 0) {
+                msg.setError("该时间段已有出差申请,不能重复请假");
+            }
+            businessTripMapper.insert(sheet);
+        } else {
+            businessTripMapper.updateById(sheet);
+        }
+
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg delete(Integer id) {
+        businessTripMapper.deleteById(id);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg queryList(BusinessTrip sheet, Integer pageIndex, Integer pageSize) {
+        QueryWrapper<BusinessTrip> queryWrapper = new QueryWrapper<BusinessTrip>();
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
+
+        //增加状态
+        if (sheet.getStatus() != null) {
+            queryWrapper.eq("status", sheet.getStatus());
+        }
+        if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+            queryWrapper.eq("owner_id", sheet.getOwnerId());
+        }
+        if (sheet.getWay() != null) {
+            queryWrapper.eq("way", sheet.getWay());
+        }
+        if (sheet.getStartDate() != null && sheet.getEndDate() != null) {
+            queryWrapper.and(wrapper->
+                    wrapper.between("start_date", sheet.getStartDate(), sheet.getEndDate()).or().between("end_date", sheet.getStartDate(), sheet.getEndDate()));
+        }
+        IPage<BusinessTrip> listIPager = businessTripMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<BusinessTrip> records = listIPager.getRecords();
+        Long total = listIPager.getTotal();
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", records);
+        map.put("total", total);
+        httpRespMsg.data = map;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg approve(Integer id) {
+        BusinessTrip sheet = new BusinessTrip();
+        sheet.setId(id);
+        sheet.setStatus(0);
+        businessTripMapper.updateById(sheet);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg deny(Integer id, String denyReason) {
+        BusinessTrip sheet = new BusinessTrip();
+        sheet.setId(id);
+        sheet.setStatus(2);
+        sheet.setDenyReason(denyReason);
+        businessTripMapper.updateById(sheet);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg summaryData(String keyword, String startDate, String endDate, String userId) {
+        Integer companyId = userMapper.selectById(userId).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+//        msg.data = businessTripMapper.summaryData(keyword, startDate, endDate, companyId);
+        return msg;
+    }
+}

+ 22 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -49,8 +49,8 @@ public class DingDingServiceImpl implements DingDingService {
     public static String PRE_AUTH_CODE = null;
     public static long expireTime = 0L;
 
-    private Object deptLock = new Object();
-    private Object userLock = new Object();
+    private static Object deptLock = new Object();
+    private static Object userLock = new Object();
     @Resource
     SysRoleModuleMapper sysRoleModuleMapper;
     @Resource
@@ -469,6 +469,19 @@ public class DingDingServiceImpl implements DingDingService {
         List<SysModule> moduleList = sysModuleMapper.selectList(queryWrapper);
         //过滤一下,这个角色选中的模块
         moduleList = moduleList.stream().filter(m->ids.contains(m.getId())).collect(Collectors.toList());
+        if (company.getPackageEngineering() == 1) {
+            //生成虚拟的两个审核放进去
+            SysModule proModule = new SysModule();
+            proModule.setName("专业审核");
+            proModule.setPath("/reviewProfession");
+            proModule.setId(0);
+            moduleList.add(1,proModule);
+            SysModule deptModule = new SysModule();
+            deptModule.setName("部门审核");
+            deptModule.setPath("/reviewDepartment");
+            deptModule.setId(0);
+            moduleList.add(2,deptModule);
+        }
         //组装层级关系,默认只有两级
         List<SysModule> menuList = new ArrayList<>();
         for (SysModule module : moduleList) {
@@ -797,14 +810,6 @@ public class DingDingServiceImpl implements DingDingService {
         if (resp.getInteger("errcode") == 0) {
             JSONObject userJson = resp.getJSONObject("result");
             User user = new User();
-//            int roleId = 0;
-//            if (userJson.getBooleanValue("boss")) {
-//                role = Constant.ROLE_MASTER;
-//            } else if (userJson.getBooleanValue("admin")) {
-//                role = Constant.ROLE_MANAGER;
-//            } else if (userJson.getBooleanValue("senior")) {
-//                role = Constant.ROLE_LEADER;
-//            }
             user.setId(SnowFlake.nextId()+"")
                     .setRoleId(roleId)
                     .setCompanyId(companyId)
@@ -819,19 +824,22 @@ public class DingDingServiceImpl implements DingDingService {
             }
             //检查用户是否已经存在
             synchronized (userLock) {
-                User oldUser = userMapper.selectOne(new QueryWrapper<User>().eq("dingding_userid", dingdingUserid).eq("company_id", companyId));
-                if (oldUser == null) {
+                List<User> oldList = userMapper.selectList(new QueryWrapper<User>().eq("dingding_userid", dingdingUserid).eq("company_id", companyId));
+                if (oldList.size() == 0) {
                     System.out.println("新增钉钉用户==" + user.getName());
                     userMapper.insert(user);
                 } else {
-//                    System.out.println("该人员已存在:dingdingUserid==" + dingdingUserid);
                     //可能需要更新姓名
-                    if (oldUser.getName() == null) {
+                    User oldUser = oldList.get(0);
+                    if (oldUser.getName() == null || !oldUser.getName().equals(userJson.getString("name"))) {
                         oldUser.setName(userJson.getString("name"));
                         oldUser.setDingdingUnionid(userJson.getString("unionid"));
                         userMapper.updateById(oldUser);
                         System.out.println("更新用户姓名==" + oldUser.getName());
                     }
+                    if (oldList.size() > 1) {
+                        System.err.println("Exception 存在重复用户 dingdingUserId="+oldUser.getDingdingUserid()+", name="+oldUser.getName()+", companyId"+oldUser.getCompanyId());
+                    }
                 }
             }
         }

+ 1 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -141,22 +141,12 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
 //            XSSFSheet sheet = workbook.getSheetAt(0);
             //要插入的账号列表
             List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
-            List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
             List<Finance> financeList = new ArrayList<Finance>();
             List<Finance> oldFinanceList = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth", yearMonth));
             //获取月成本列表
-            DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-            String dateStr = yearMonth+"-01 00:00:00";
-            LocalDateTime startDate = LocalDateTime.parse(dateStr,df);
-            LocalDateTime endDate = LocalDateTime.parse(dateStr,df);
-            endDate = endDate.plusMonths(1);
-
             TimeType timeType = timeTypeMapper.selectById(companyId);
-            BigDecimal monthHours = timeType.getMonthDays().multiply(new BigDecimal(timeType.getAllday()));
-
             //需要更新成本的人员数据
             List<User> updateUserList = new ArrayList<>();
-
             String startStr = yearMonth + "-01";
             String endStr = yearMonth + "-31";
             //获取人员该月份填写的日报的总时长
@@ -168,7 +158,6 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             List<FinanceTblcuscol> cusColList = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
 
             //由于第一行需要指明列对应的标题
-            int rowNum = sheet.getLastRowNum();
             for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
                 Row row = sheet.getRow(rowIndex);
                 if (row == null) {
@@ -273,13 +262,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                         finance.setHouseFund(value);
                         total = total.add(value);
                     }
-//                    if (otherCell != null) {
-//                        otherCell.setCellType(CellType.STRING);
-//                        String item = otherCell.getStringCellValue();
-//                        BigDecimal value = item != null ? new BigDecimal(item.trim().replaceAll("\\u00a0", "")) : BigDecimal.valueOf(0);
-//                        finance.setOthers(value);
-//                        total = total.add(value);
-//                    }
+
                     if (field1 != null) {
                         field1.setCellType(CellType.STRING);
                         String item = field1.getStringCellValue();

+ 19 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -2496,15 +2496,24 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if ((Integer)map.get("multiWorktime") == 1) {
                         String data = (String)map.get("content");
                         JSONArray array = JSONArray.parseArray(data);
-                        for (int i=0;i<array.size(); i++) {
-                            JSONObject obj = array.getJSONObject(i);
-                            WorktimeItem worktimeItem = JSONObject.toJavaObject(obj, WorktimeItem.class);
+                        if (array != null) {
+                            for (int i=0;i<array.size(); i++) {
+                                JSONObject obj = array.getJSONObject(i);
+                                WorktimeItem worktimeItem = JSONObject.toJavaObject(obj, WorktimeItem.class);
+                                HashMap<String, Object> newMap = new HashMap<>();
+                                newMap.putAll(map);
+                                newMap.put("startTime", worktimeItem.getStartTime());
+                                newMap.put("endTime", worktimeItem.getEndTime());
+                                newMap.put("content", worktimeItem.getContent());
+                                newMap.put("duration", df.format(worktimeItem.getTime()));
+                                dealDataList.add(newMap);
+                            }
+                        } else {
                             HashMap<String, Object> newMap = new HashMap<>();
                             newMap.putAll(map);
-                            newMap.put("startTime", worktimeItem.getStartTime());
-                            newMap.put("endTime", worktimeItem.getEndTime());
-                            newMap.put("content", worktimeItem.getContent());
-                            newMap.put("duration", df.format(worktimeItem.getTime()));
+                            newMap.put("startTime", "");
+                            newMap.put("endTime", "");
+                            newMap.put("content", "");
                             dealDataList.add(newMap);
                         }
                     } else {
@@ -2761,7 +2770,9 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (collect.size() > 0) {
                     List<Participation> participationList = participationMapper.selectList(new QueryWrapper<Participation>().in("project_id", collect));
                     List<String> collect1 = participationList.stream().map(Participation::getUserId).collect(Collectors.toList());
-                    allRangeUserList = userMapper.selectList(new QueryWrapper<User>().in("id", collect1));
+                    if (collect1.size() > 0) {
+                        allRangeUserList = userMapper.selectList(new QueryWrapper<User>().in("id", collect1));
+                    }
                 }
             }
         } else {

+ 10 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -229,9 +229,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
         //返回菜单
         List<SysRoleModule> rModules = sysRoleModuleMapper.selectList(new QueryWrapper<SysRoleModule>().eq("role_id", roleId));
-        System.out.println("============角色选中的模块有========");
-        System.out.println(rModules);
-
         List<Integer> ids = rModules.stream().map(SysRoleModule::getModuleId).collect(Collectors.toList());
         //项目报告审核模块,如果参与日报的审核,需要自动加上
         if (user.isLeader() || user.isHasAuditDept()) {
@@ -529,7 +526,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     .setName(name)
                     .setPassword(MD5Util.getPassword(password))
                     .setPhone(phone)
-                    .setRole(smanager.getId())
+                    .setRoleId(smanager.getId())
+                    .setRoleName((smanager.getRolename()))
                     .setColor(ColorUtil.randomColor())
                     .setCompanyId(company.getId());
             //生成项目的成本基线默认条目
@@ -1419,6 +1417,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         HttpRespMsg httpRespMsg = new HttpRespMsg();
 
         User user = userMapper.selectById(userId);
+        if (user == null) {
+            httpRespMsg.setError("账号不存在");
+            return httpRespMsg;
+        }
+        if (user.getIsActive() == 0) {
+            httpRespMsg.setError("该账号已停用");
+            return httpRespMsg;
+        }
         //查看该公司非会员公司,只能允许试用三天,超时不可登录
         Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", user.getCompanyId()));
         //公司未办理会员

+ 15 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -1,11 +1,11 @@
 package com.management.platform.task;
 
+import java.text.DecimalFormat;
 import java.time.LocalDate;
 import java.time.Period;
 import java.time.format.DateTimeFormatter;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.CompanyDingdingService;
@@ -37,6 +37,9 @@ import java.util.stream.Collectors;
 @EnableScheduling
 @Component
 public class TimingTask {
+    //是否是开发环境
+    @Value("${configEnv.isDev}")
+    boolean isDev;
 
     @Value("${wx.template_report_fill}")
     public String TEMPLATE_REPORT_FILL;
@@ -73,6 +76,7 @@ public class TimingTask {
     //检查项目到期,距离到期时间3天内的,每天提醒
     @Scheduled(cron = "0 0 10 ? * *")
     private void projectDeadlineAlert() {
+        if (isDev) return;
         LocalDate start = LocalDate.now();
         start = start.plusDays(1);
         LocalDate end = LocalDate.now();
@@ -101,6 +105,7 @@ public class TimingTask {
     //每天7点同步昨天的企业微信考勤考勤打卡记录
     @Scheduled(cron = "0 0 7 ? * *")
     private void synCorpWXCardTime() {
+        if (isDev) return;
         LocalDateTime yestoday = LocalDateTime.now().minusDays(1);
         yestoday = yestoday.withHour(0).withMinute(0).withSecond(0).withNano(0);
 
@@ -114,6 +119,7 @@ public class TimingTask {
     //每周日晚上11点 同步一次本月的考勤打卡记录
     @Scheduled(cron = "0 0 23 ? * 7")
     private void weeklySyncCorpWXCardTime() {
+        if (isDev) return;
         LocalDateTime current = LocalDateTime.now();
         LocalDateTime start = current.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
         LocalDateTime now = LocalDateTime.now();
@@ -129,6 +135,7 @@ public class TimingTask {
     //每个月6号早上6点同步上个月的企业微信考勤考勤打卡记录
     @Scheduled(cron = "0 0 6 6 * ?")
     private void synMonthCorpWXCardTime() {
+        if (isDev) return;
         LocalDateTime lastMonth = LocalDateTime.now().minusMonths(1);
         LocalDateTime start = lastMonth.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
         LocalDateTime now = LocalDateTime.now().withDayOfMonth(1);
@@ -144,6 +151,7 @@ public class TimingTask {
     //发送上周填写的工时统计
     @Scheduled(cron = "0 0 8 ? * *")
     private void lastWeekFillTimeAlert() {
+        if (isDev) return;
         //每日检查是否是周一,提醒上周工时汇总
         LocalDate curDay = LocalDate.now();
         if (curDay.getDayOfWeek().getValue() == 1) {
@@ -164,8 +172,9 @@ public class TimingTask {
                 double waiting = reportList.stream().filter(r -> r.getState() == 0).mapToDouble(Report::getWorkingTime).sum();
                 double reject = reportList.stream().filter(r -> r.getState() == 2).mapToDouble(Report::getWorkingTime).sum();
                 double pass = reportList.stream().filter(r -> r.getState() == 1).mapToDouble(Report::getWorkingTime).sum();
-                String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + sum+"小时。其中审核通过"+pass
-                        +"小时, 待审核"+waiting+"小时,驳回"+reject+"小时。";
+                DecimalFormat df = new DecimalFormat("#0.0");
+                String str = "您上周共参与了" + projectList.size()+"个项目,总工时为" + df.format(sum)+"小时。其中审核通过"+df.format(pass)
+                        +"小时, 待审核"+df.format(waiting)+"小时,驳回"+df.format(reject)+"小时。";
                 pushLastWeekReportFill(u, str);
             }
         }
@@ -174,6 +183,9 @@ public class TimingTask {
     //每分钟校验是否有需要提醒的填报
     @Scheduled(fixedRate = 60 * 1000)
     private void process() {
+        if (isDev) {
+            return;
+        }
         LocalDateTime now = LocalDateTime.now();
         LocalDate localDate = LocalDate.now();
 
@@ -204,8 +216,6 @@ public class TimingTask {
         });
 
         List<Map<String, Object>> dingdingUserList = userMapper.getPushDingdingUserList(str);
-        System.out.println("=============查询钉钉推送未填提醒的人员列表=====, size=" + dingdingUserList.size());
-
         //钉钉平台的用批量发送, 每分钟5000个
         int minuteSize = 5000;
         int minuteTimes = dingdingUserList.size()/minuteSize + (dingdingUserList.size()%minuteSize==0?0:1);

+ 4 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/ListUtil.java

@@ -1,6 +1,7 @@
 package com.management.platform.util;
 
 import java.lang.reflect.Field;
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -141,12 +142,9 @@ public class ListUtil {
 	}
 	
 	public static void main(String[] args) {
-		Integer a = new Integer(1);
-		Integer b = new Integer(1);
-		List<Integer> list = new ArrayList<>();
-		list.add(a);
-
-		System.out.println(list.contains(b));
+		DecimalFormat df = new DecimalFormat("#0.0");
+		double a = 100.483258435;
+		System.out.println(df.format(a));
 	}
 
 	public static List<Integer> fromIntegers(int[] data) {

+ 5 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-dev.yml

@@ -53,7 +53,8 @@ logging:
     org.springframework.web: trace
     #打印sql语句
     com.management.platform.mapper: debug
-  path: E:/
+  path: /log/
+  file: worktime.log
 ##########
 mybatis-plus:
   #  mapper-locations: classpath:mapper/*/*.xml
@@ -79,12 +80,9 @@ mybatis:
   mapper-locations: mappers/*Mapper.xml
 #####配置图片上传路径####
 upload:
-  path: E:/staticproject/timesheet/upload/
-picrecongnize:
-  browser: E:/picrecongnize/browser/
-  develop: E:/picrecongnize/develop/
-  im: E:/picrecongnize/im/
-  design: E:/picrecongnize/design/
+  path: /www/worktime/client/timesheet/upload/
 
+configEnv:
+  isDev: true
 
 

+ 4 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application-prod.yml

@@ -99,4 +99,7 @@ management:
 
   health:
     redis:
-      enabled: false
+      enabled: false
+
+configEnv:
+  isDev: false

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -129,6 +129,7 @@ token: Mhi7ehNX61UN4MB7PHnC
 encodingAesKey: PHVMkME1XMrImmGJZ4OZJxSysI7hFEhtDDUQrlHAfIS
 
 
-
+configEnv:
+  isDev: true
 
 

+ 30 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BusinessTripMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.BusinessTripMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.BusinessTrip">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="owner_id" property="ownerId" />
+        <result column="owner_name" property="ownerName" />
+        <result column="reason" property="reason" />
+        <result column="start_date" property="startDate" />
+        <result column="end_date" property="endDate" />
+        <result column="way" property="way" />
+        <result column="city_from" property="cityFrom" />
+        <result column="city_to" property="cityTo" />
+        <result column="go_back" property="goBack" />
+        <result column="day_count" property="dayCount" />
+        <result column="remark" property="remark" />
+        <result column="status" property="status" />
+        <result column="deny_reason" property="denyReason" />
+        <result column="indate" property="indate" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, owner_id, owner_name, reason, start_date, end_date, way, city_from, city_to, go_back, day_count, remark, status, deny_reason, indate
+    </sql>
+
+</mapper>

BIN
fhKeeper/formulahousekeeper/ops-platform/0AAE1300


BIN
fhKeeper/formulahousekeeper/ops-platform/ED622300


+ 1 - 0
fhKeeper/formulahousekeeper/ops-platform/build_package.bat

@@ -0,0 +1 @@
+mvn package

BIN
fhKeeper/formulahousekeeper/ops-platform/chi_sim.traineddata


BIN
fhKeeper/formulahousekeeper/ops-platform/opencv/opencv-420.jar


BIN
fhKeeper/formulahousekeeper/ops-platform/opencv/x64/opencv_java420.dll


BIN
fhKeeper/formulahousekeeper/ops-platform/opencv/x86/opencv_java420.dll


+ 225 - 0
fhKeeper/formulahousekeeper/ops-platform/pom.xml

@@ -0,0 +1,225 @@
+<?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>formulahousekeeper</artifactId>
+        <groupId>com.hssx.parent</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.hssx.parent</groupId>
+    <artifactId>ops-platform</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <!-- mybatis-plus代码生成器依赖 -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+        </dependency>
+
+        <!-- velocity模板引擎 -->
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+        </dependency>
+
+        <!-- freemarker 模板引擎-->
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!-- openoffice -->
+        <dependency>
+            <groupId>com.artofsolving</groupId>
+            <artifactId>jodconverter</artifactId>
+            <version>2.2.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.artofsolving</groupId>
+            <artifactId>jodconverter-core-3.0.jar</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/jodconverter-core-3.0.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.dingtalk</groupId>
+            <artifactId>taobao-sdk-java-auto_1479188381469-20210623.jar</artifactId>
+            <version>1.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/src/main/resources/lib/taobao-sdk-java-auto_1479188381469-20210623.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>1.1.50</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baidu.aip</groupId>
+            <artifactId>java-sdk</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+        <!--开启aop支持-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+        </dependency>
+
+        <!--     tess4j相关依赖   -->
+        <!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
+        <dependency>
+            <groupId>net.sourceforge.tess4j</groupId>
+            <artifactId>tess4j</artifactId>
+        </dependency>
+
+        <!--手动引入opencv 否则无法maven打包-->
+        <dependency>
+            <groupId>org.opencv</groupId>
+            <artifactId>opencv</artifactId>
+            <version>4.2.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/opencv/opencv-420.jar</systemPath>
+        </dependency>
+
+        <!--微信模版消息推送三方sdk-->
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-mp</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <!-- 获取客户端信息 -->
+        <!-- https://mvnrepository.com/artifact/eu.bitwalker/UserAgentUtils -->
+        <dependency>
+            <groupId>eu.bitwalker</groupId>
+            <artifactId>UserAgentUtils</artifactId>
+            <version>1.21</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <includeSystemScope>true</includeSystemScope>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <!--配置阿里云仓库-->
+    <repositories>
+        <repository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>bintray-qcloud-maven-repo</id>
+            <name>qcloud-maven-repo</name>
+            <url>https://dl.bintray.com/qcloud/maven-repo/</url>
+            <layout>default</layout>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>public</id>
+            <name>aliyun nexus</name>
+            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+</project>

+ 38 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/PlatformStartApplication.java

@@ -0,0 +1,38 @@
+package com.management.platform;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+/**
+ * Author: 屈跃庭
+ * Date : 2019 - 12 - 31 9:23
+ * Description:<描述>
+ * Version: 1.0
+ */
+@SpringBootApplication
+@MapperScan("com.management.platform.mapper")
+@EnableTransactionManagement //开启事务支持
+public class PlatformStartApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(PlatformStartApplication.class, args);
+    }
+
+    //防止存入redis数据后乱码
+    @Bean(name = "redisTemplate")
+    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
+        RedisTemplate<String, String> template = new RedisTemplate<>();
+        template.setConnectionFactory(factory);
+        template.setKeySerializer(new StringRedisSerializer());
+        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
+        template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());
+        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
+        template.afterPropertiesSet();
+        return template;
+    }
+}

+ 80 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/aop/AopLogConfiguration.java

@@ -0,0 +1,80 @@
+package com.management.platform.aop;
+
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+/**
+ * Author: 屈跃庭 cuiyi@itany.com
+ * Date : 2019 - 08 - 30 13:59
+ * Description:<描述> 开启aop配置
+ * Version: 1.0
+ */
+@Slf4j
+@Aspect
+@Configuration
+public class AopLogConfiguration {
+    //切入点表达式
+    @Pointcut("execution(public * com.management.*.service.*.*(..)) || execution(public * com.management.*.controller.*.*(..))")
+    public void logPointcut(){
+
+    }
+
+    /**
+     * 前置通知
+     */
+    @Before("logPointcut()")
+    public void  methodBefore(JoinPoint joinPoint){
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
+        if (requestAttributes == null) return;
+        HttpServletRequest request = requestAttributes.getRequest();
+        if(request.getRequestURL().toString().contains("/imageProcessing")){
+            return;
+        }
+        //打印请求内容
+
+        String methodName = joinPoint.getSignature().getName();
+        if (!"loginAdmin".equals(methodName)) {
+            log.info("请求方法:"+request.getRequestURL().toString()+", 参数: "+Arrays.toString(joinPoint.getArgs()));
+        }
+    }
+
+    /**
+     * 后置通知
+     */
+    @AfterReturning(returning = "o",pointcut = "logPointcut()")
+    public void methodAfterReturning(Object o){
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
+        if (requestAttributes == null) return;
+        HttpServletRequest request = requestAttributes.getRequest();
+        if(request.getRequestURL().toString().contains("/imageProcessing")){
+            return;
+        }
+    }
+
+    /**
+     * 异常通知
+     */
+    @AfterThrowing(pointcut = "logPointcut()",throwing = "e")
+    public void logThrowing(JoinPoint joinPoint,Throwable e){
+        ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
+        if (requestAttributes == null) {
+            return ;
+        }
+        HttpServletRequest request = requestAttributes.getRequest();
+        if(request.getRequestURL().toString().contains("/imageProcessing")){
+            return;
+        }
+        log.info("***************抛出异常***************");
+        log.info("请求类方法:"+joinPoint.getSignature().getName());
+        log.info("异常内容:"+e);
+        log.info("***************抛出异常***************");
+    }
+
+}

+ 97 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/aop/SensitiveWordConfig.java

@@ -0,0 +1,97 @@
+package com.management.platform.aop;
+
+import com.management.platform.util.RedisUtil;
+import com.management.platform.util.WordFilter;
+import lombok.SneakyThrows;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.time.LocalDate;
+
+/**
+ * 敏感词过滤
+ */
+//@Aspect
+//@Component
+public class SensitiveWordConfig {
+    @Autowired
+    RedisUtil redisUtils;
+    @Autowired
+    WordFilter wordFilter;
+
+    @Around("@annotation(org.springframework.web.bind.annotation.RequestMapping)||@annotation(org.springframework.web.bind.annotation.PutMapping)||@annotation(org.springframework.web.bind.annotation.PostMapping)")
+    @SneakyThrows
+    public Object doBefore(ProceedingJoinPoint point) {
+        System.out.println("####################进入敏感词检测#######");
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        if (request.getRequestURI().contains("/word/sensitiveword")) {
+            return point.proceed();
+        }
+        //所有的参数对象
+        boolean hasSentiveWords = false;
+        for (int i=0;i<point.getArgs().length; i++) {
+            Object arg = point.getArgs()[i];
+            //参数对象,通过反射将String类型的值进行敏感词过滤
+            System.out.println("获取到参数:");
+            if (arg != null) {
+                Class<?> aClass = arg.getClass();
+                System.out.println("获取到aClass:"+aClass);
+                if(aClass == String.class) {
+                    //本身就是string类型
+                    String afterValue = wordFilter.replaceWords((String)(arg));
+                    System.out.println("替换后=" + afterValue);
+                    point.getArgs()[i] = afterValue;
+                    if (!afterValue.equals(arg)) {
+                        hasSentiveWords = true;
+                        break;
+                    }
+                } else if (aClass != Integer.class && aClass != LocalDate.class) {
+                    //递归遍历,将所有String参数进行敏感词匹配
+                    foundString(aClass,arg);
+                }
+            }
+        }
+        return  point.proceed(point.getArgs());
+    }
+
+    /**
+     * 递归将string替换
+     * @param clazz
+     * @param arg
+     * @return
+     */
+    @SneakyThrows
+    public Class<?> foundString(Class clazz,Object arg ){
+        Field[] declaredFields = clazz.getDeclaredFields();
+        for (Field declaredField : declaredFields) {
+            Class<?> type = declaredField.getType();
+            if (type==String.class&&!Modifier.toString(declaredField.getModifiers()).contains("final")){
+                //如果是String类型,进行关键词匹配 且要排除final修饰的字段
+                declaredField.setAccessible(true);
+                String value=(String)declaredField.get(arg);
+                System.out.println("参数值:"+value);
+                declaredField.set(arg, wordFilter.replaceWords(value));
+            }else if (type.getPackage()!=null&&type.getPackage().getName().contains("com.bysk")){
+                Method[] methods = clazz.getMethods();
+                for (Method method : methods) {
+                    String name = method.getName();
+                    if (name.toLowerCase().contains("get"+declaredField.getName().toLowerCase())){
+                        Object invoke = method.invoke(arg);
+                        this.foundString(type,invoke);
+                        break;
+                    }
+                }
+            }
+        }
+        return  clazz;
+    }
+}

+ 35 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/BeanConfig.java

@@ -0,0 +1,35 @@
+package com.management.platform.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+@Configuration
+@EnableAsync
+public class BeanConfig {
+
+    @Bean
+    public TaskExecutor taskExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        // 设置核心线程数
+        executor.setCorePoolSize(5);
+        // 设置最大线程数
+        executor.setMaxPoolSize(10);
+        // 设置队列容量
+        executor.setQueueCapacity(20);
+        // 设置线程活跃时间(秒)
+        executor.setKeepAliveSeconds(60);
+        // 设置默认线程名称
+        executor.setThreadNamePrefix("worktime-");
+        // 设置拒绝策略
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        // 等待所有任务结束后再关闭线程池
+        executor.setWaitForTasksToCompleteOnShutdown(true);
+        System.out.println("初始化TaskExecutor");
+        return executor;
+    }
+}

+ 14 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/Config.java

@@ -0,0 +1,14 @@
+package com.management.platform.config;
+
+import org.springframework.boot.web.client.RestTemplateBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class Config {
+  @Bean
+  public RestTemplate restTemplate(RestTemplateBuilder builder){
+    return builder.build();
+  }
+}

+ 84 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/RefererInterceptor.java

@@ -0,0 +1,84 @@
+package com.management.platform.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.util.StringUtils;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.net.MalformedURLException;
+
+public class RefererInterceptor extends HandlerInterceptorAdapter {
+    static final Logger LOGGER = LoggerFactory.getLogger(RefererInterceptor.class);
+
+    // URL匹配器
+    private AntPathMatcher matcher = new AntPathMatcher();
+    @Resource
+    private RefererProperties properties;
+
+    @Value(value = "${excludeUrls}")
+    private String excludeUrls;
+
+    @Override
+    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
+        String referer = req.getHeader("referer");
+        String host = req.getServerName();
+        //对外开放的回调url排除在外
+        String reqUrl = req.getRequestURI();
+//        System.out.println(reqUrl);
+        if (!StringUtils.isEmpty(excludeUrls)) {
+            String[] split = excludeUrls.split(",");
+            boolean isPass = false;
+            for (String pattern: split) {
+                if (matcher.match(pattern, reqUrl)) {
+                    isPass = true;
+                    break;
+                }
+            }
+            if (isPass) {
+                return true;
+            }
+        }
+        // 只验证POST请求
+        if ("POST".equals(req.getMethod())) {
+            if (referer == null) {
+                System.out.println("===referer为Null, 返回404,拦截==");
+                // 状态置为404
+                resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
+                return false;
+            }
+            java.net.URL url = null;
+            try {
+                url = new java.net.URL(referer);
+            } catch (MalformedURLException e) {
+                // URL解析异常,也置为404
+                resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
+                return false;
+            }
+            LOGGER.info("host="+host+", refer host="+url.getHost());
+            boolean isSame = false;
+            if (host.equals(url.getHost())) {
+                isSame = true;
+            }
+            // 首先判断请求域名和referer域名是否相同
+            if (!isSame) {
+                // 如果不等,判断是否在白名单中
+                if (properties.getRefererDomain() != null) {
+                    for (String s : properties.getRefererDomain()) {
+                        if (s.equals(url.getHost())) {
+                            return true;
+                        }
+                    }
+                }
+                return false;
+            }
+        }
+        return true;
+    }
+}
+

+ 23 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/RefererProperties.java

@@ -0,0 +1,23 @@
+package com.management.platform.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@ConfigurationProperties(prefix = "referer")
+public class RefererProperties {
+    // 白名单域名
+    private List<String> refererDomain;
+    //setter,getter方法
+
+
+    public List<String> getRefererDomain() {
+        return refererDomain;
+    }
+
+    public void setRefererDomain(List<String> refererDomain) {
+        this.refererDomain = refererDomain;
+    }
+}

+ 22 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/SchedulerConfig.java

@@ -0,0 +1,22 @@
+package com.management.platform.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+
+@Configuration
+@EnableScheduling
+public class SchedulerConfig {
+    @Bean
+    public TaskScheduler taskScheduler() {
+        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
+        //线程池大小
+        scheduler.setPoolSize(10);
+        //线程名字前缀
+        scheduler.setThreadNamePrefix("spring-task-thread");
+        return scheduler;
+    }
+}
+

+ 28 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/config/WebConfig.java

@@ -0,0 +1,28 @@
+package com.management.platform.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@EnableWebMvc
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+    @Bean
+    public RefererInterceptor refererInterceptor() {
+        return new RefererInterceptor();
+    }
+
+    /**
+     * 注册拦截器
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        //referer拦截
+        registry.addInterceptor(refererInterceptor());
+    }
+
+
+}

+ 38 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/constant/Constant.java

@@ -0,0 +1,38 @@
+package com.management.platform.constant;
+
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Author: 屈跃庭
+ * Date : 2019 - 07 - 24 16:00
+ * Description:<描述>常量配置类
+ * Version: 1.0
+ */
+@Component
+public class Constant {
+//    public static final String API_KEY = "gtImOYhgcFBzwuT29tB7tM0Z";//百度文字识别apiKey
+//    public static final String SECRET_KEY = "RipT5kfF3Zqp7S2vTXPlNcMiYcA76jfq";//百度文字识别secretKey
+    public static final String API_KEY = "UgceK95dGkVbQKicVDU9D6s2";//百度文字识别apiKey
+    public static final String SECRET_KEY = "fGCbfC9CR1v8Pf1u6kG4fM9KEXHgitAA";//百度文字识别secretKey
+    public static final Integer UN_HANDLE = 0;//定时任务未处理的状态码
+    public static final String PIC_PATH_PREFIX = "";//定时任务未处理的状态码
+    public static final String COMMON_SOFTWARE_KEYWORDS = "keyWords";//常用软件关键字
+    public static final String[] keyWords = new String[]{"IntelliJ IDEA","Eclipse",
+            "Postman","MyEclipse","Visual Studio Code",
+            "Navicat","Pycharm","Android Studio",
+            "WebStorm","SQLyog","PhpStorm",
+            "JetBrains Datagrip","JetBrains Rider",
+            "Android Studio","Photoshop","Illustrator",
+            "Adobe After Effects","Axure RP","Sketch"};//定时任务未处理的状态码
+//    public static final String ACCESS_KEY = "280d6f0e4a774117905ba789a9f0b978";//百度图像识别accessKey
+//    public static final String SECRET_KEY = "43b460e124eb474c8cdb7441dc30d66d";//百度图像识别secretKey
+    //角色定义
+    public static final String[] ROLE_NAMES = {"普通员工","超级管理员", "系统管理员", "无","财务管理员","项目管理员","公司领导","项目经理"};
+
+    public static final String ROLE_SUPER_MANAGER = "超级管理员";
+
+    public static String[] DEFAULT_BASE_COST_ITEMS = {"人工成本","一般费用","外包费用","其他"};
+}

+ 27 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/constant/MybatisPlusPageConfig.java

@@ -0,0 +1,27 @@
+package com.management.platform.constant;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+//Spring boot方式
+@EnableTransactionManagement
+@Configuration
+@MapperScan("com.management.platform.mapper")
+public class MybatisPlusPageConfig {
+
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
+        // paginationInterceptor.setOverflow(false);
+        // 设置最大单页限制数量,默认 500 条,-1 不受限制
+        // paginationInterceptor.setLimit(500);
+        // 开启 count 的 join 优化,只针对部分 left join
+        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
+        return paginationInterceptor;
+    }
+}

+ 44 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/constant/Parameter.java

@@ -0,0 +1,44 @@
+package com.management.platform.constant;
+
+/**
+ * Author: 屈跃庭
+ * Date : 2020 - 01 - 06 11:19
+ * Description:<描述> 参数枚举
+ * Version: 1.0
+ */
+public enum Parameter {
+    //accessToken
+    ACCESS_TOKEN("accessToken", "accessToken"),
+    //accessToken 的有效时间 单位:s
+    EXPIRES_IN("expiresIn", "expiresIn");
+
+    private String code;
+    private String name;
+
+    private Parameter(String code, String name) {
+        this.code = code;
+//        this.name = name();
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+//    public static void main(String[] args) {
+//        System.out.println(Parameter.API_KEY.getName());
+//    }
+
+}

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/AlertTimeController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-31
+ */
+@RestController
+@RequestMapping("/alert-time")
+public class AlertTimeController {
+
+}
+

+ 128 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/AuditWorkflowSettingController.java

@@ -0,0 +1,128 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.AuditWorkflowSetting;
+import com.management.platform.entity.AuditWorkflowSetting;
+import com.management.platform.entity.Department;
+import com.management.platform.entity.Report;
+import com.management.platform.mapper.*;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-28
+ */
+@RestController
+@RequestMapping("/audit-workflow-setting")
+public class AuditWorkflowSettingController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    AuditWorkflowSettingMapper auditWorkflowSettingMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    DepartmentMapper departmentMapper;
+    @Resource
+    ReportMapper reportMapper;
+
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(String json, Integer deptId) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        auditWorkflowSettingMapper.delete(new QueryWrapper<AuditWorkflowSetting>().eq("dept_id", deptId));
+        JSONArray array = JSONArray.parseArray(json);
+
+        if (array.size() == 1 && array.getJSONObject(0).getInteger("auditorType") == 0) {
+            //只有一个项目负责人审核,不保存
+        } else {
+            //检查是否有重复的部门
+            List<Integer> auditDeptIds = new ArrayList<>();
+            for (int i=0;i<array.size(); i++) {
+                JSONObject obj = array.getJSONObject(i);
+                AuditWorkflowSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowSetting.class);
+                if (auditWorkflowTimeSetting.getAuditDeptId() != null) {
+                    if (auditDeptIds.contains(auditWorkflowTimeSetting.getAuditDeptId())) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("保存失败: 部门["+auditWorkflowTimeSetting.getAuditDeptName()+"]存在重复");
+                        return msg;
+                    } else {
+                        auditDeptIds.add(auditWorkflowTimeSetting.getAuditDeptId());
+                    }
+                }
+            }
+
+            for (int i=0;i<array.size(); i++) {
+                JSONObject obj = array.getJSONObject(i);
+                AuditWorkflowSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowSetting.class);
+                auditWorkflowTimeSetting.setCompanyId(companyId);
+                auditWorkflowTimeSetting.setSeq(i+1);
+                if (i == array.size() -1) {
+                    auditWorkflowTimeSetting.setIsFinal(1);
+                } else {
+                    auditWorkflowTimeSetting.setIsFinal(0);
+                }
+                auditWorkflowTimeSetting.setDeptId(deptId);
+                auditWorkflowSettingMapper.insert(auditWorkflowTimeSetting);
+            }
+        }
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/checkNodeInUse")
+    public HttpRespMsg checkNodeInUse(String auditDeptId, Integer deptId) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+        List<AuditWorkflowSetting> targetNode = auditWorkflowSettingMapper.selectList(new QueryWrapper<AuditWorkflowSetting>().eq("dept_id", deptId).eq("audit_dept_id", auditDeptId));
+        if (targetNode.size() > 0) {
+            //要删除的部门节点是存在的,需要检测是否有待审核的走到这个流程点了
+            long num = reportMapper.selectCount(new QueryWrapper<Report>().eq("state", 0).eq("is_dept_audit", 1).eq("audit_deptid", auditDeptId));
+            if (num > 0) {
+                msg.setError("当前部门存在待审核报告,无法操作!");
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer deptId) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        List<AuditWorkflowSetting> auditWorkflowTimeSettings = auditWorkflowSettingMapper.selectList(new QueryWrapper<AuditWorkflowSetting>().eq("dept_id", deptId).orderByAsc("seq"));
+        HttpRespMsg msg = new HttpRespMsg();
+        if (auditWorkflowTimeSettings.size() == 0) {
+            int seq = 1;
+            //未独立设置,获取默认的设置,默认直接就是项目负责人审批
+            Department dept = departmentMapper.selectById(deptId);
+            AuditWorkflowSetting setting = new AuditWorkflowSetting();
+            setting.setSeq(seq);
+            setting.setCompanyId(companyId);
+            setting.setDeptId(dept.getDepartmentId());
+            setting.setIsFinal(1);
+            setting.setAuditorType(0);
+            auditWorkflowTimeSettings.add(setting);
+        }
+        msg.data = auditWorkflowTimeSettings;
+        return msg;
+    }
+
+}
+

+ 141 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/AuditWorkflowTimeSettingController.java

@@ -0,0 +1,141 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.AuditWorkflowTimeSetting;
+import com.management.platform.entity.Department;
+import com.management.platform.entity.Report;
+import com.management.platform.mapper.AuditWorkflowTimeSettingMapper;
+import com.management.platform.mapper.DepartmentMapper;
+import com.management.platform.mapper.ReportMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-07-25
+ */
+@RestController
+@RequestMapping("/audit-workflow-time-setting")
+public class AuditWorkflowTimeSettingController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    DepartmentMapper departmentMapper;
+    @Resource
+    ReportMapper reportMapper;
+
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(String json, Integer deptId) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        auditWorkflowTimeSettingMapper.delete(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", deptId));
+        JSONArray array = JSONArray.parseArray(json);
+
+        if (array.size() == 1 && array.getJSONObject(0).getInteger("isDeptAudit") == 0) {
+            //只有一个项目负责人审核,不保存
+        } else {
+            //检查是否有重复的部门
+            List<Integer> auditDeptIds = new ArrayList<>();
+            for (int i=0;i<array.size(); i++) {
+                JSONObject obj = array.getJSONObject(i);
+                AuditWorkflowTimeSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowTimeSetting.class);
+                if (auditDeptIds.contains(auditWorkflowTimeSetting.getAuditDeptId())) {
+                    HttpRespMsg msg = new HttpRespMsg();
+                    msg.setError("保存失败: 部门["+auditWorkflowTimeSetting.getAuditDeptName()+"]存在重复");
+                    return msg;
+                } else {
+                    auditDeptIds.add(auditWorkflowTimeSetting.getAuditDeptId());
+                }
+            }
+
+            for (int i=0;i<array.size(); i++) {
+                JSONObject obj = array.getJSONObject(i);
+                AuditWorkflowTimeSetting auditWorkflowTimeSetting = JSONObject.toJavaObject(obj, AuditWorkflowTimeSetting.class);
+                auditWorkflowTimeSetting.setCompanyId(companyId);
+                auditWorkflowTimeSetting.setSeq(i+1);
+                if (i == array.size() -1) {
+                    auditWorkflowTimeSetting.setIsFinal(1);
+                } else {
+                    auditWorkflowTimeSetting.setIsFinal(0);
+                }
+                auditWorkflowTimeSetting.setDeptId(deptId);
+                auditWorkflowTimeSettingMapper.insert(auditWorkflowTimeSetting);
+            }
+        }
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/checkNodeInUse")
+    public HttpRespMsg checkNodeInUse(String auditDeptId, Integer deptId) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        HttpRespMsg msg = new HttpRespMsg();
+        List<AuditWorkflowTimeSetting> targetNode = auditWorkflowTimeSettingMapper.selectList(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", deptId).eq("audit_dept_id", auditDeptId));
+        if (targetNode.size() > 0) {
+            //要删除的部门节点是存在的,需要检测是否有待审核的走到这个流程点了
+            long num = reportMapper.selectCount(new QueryWrapper<Report>().eq("state", 0).eq("is_dept_audit", 1).eq("audit_deptid", auditDeptId));
+            if (num > 0) {
+                msg.setError("当前部门存在待审核报告,无法操作!");
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer deptId) {
+        String token = request.getHeader("TOKEN");
+        Integer companyId = userMapper.selectById(token).getCompanyId();
+        List<AuditWorkflowTimeSetting> auditWorkflowTimeSettings = auditWorkflowTimeSettingMapper.selectList(new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", deptId).orderByAsc("seq"));
+        HttpRespMsg msg = new HttpRespMsg();
+        if (auditWorkflowTimeSettings.size() == 0) {
+            int seq = 1;
+            //未独立设置,获取默认的设置,默认直接就是项目负责人审批
+            Department dept = departmentMapper.selectById(deptId);
+            AuditWorkflowTimeSetting setting = new AuditWorkflowTimeSetting();
+            setting.setSeq(seq);
+            setting.setCompanyId(companyId);
+            setting.setDeptId(dept.getDepartmentId());
+            setting.setIsFinal(1);
+            setting.setIsDeptAudit(0);
+            auditWorkflowTimeSettings.add(setting);
+//            while (dept.getSuperiorId() != null && dept.getSuperiorId() > 0) {
+//                seq++;
+//                dept = departmentMapper.selectById(dept.getSuperiorId());
+//                setting = new AuditWorkflowTimeSetting();
+//                setting.setCompanyId(companyId);
+//                setting.setDeptId(dept.getDepartmentId());
+//                setting.setSeq(seq);
+//                setting.setAuditDeptId(dept.getDepartmentId());
+//                setting.setAuditDeptName(dept.getDepartmentName());
+//                auditWorkflowTimeSettings.add(setting);
+//            }
+
+        }
+        msg.data = auditWorkflowTimeSettings;
+        return msg;
+    }
+
+
+}
+

+ 155 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java

@@ -0,0 +1,155 @@
+package com.management.platform.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Company;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.SysConfig;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.UserVO;
+import com.management.platform.mapper.CompanyMapper;
+import com.management.platform.mapper.SysConfigMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.UserAgentUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.*;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.view.RedirectView;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+public class AuthRedirectController {
+    @Resource
+    HttpServletRequest request;
+    @Value("${suitId}")
+    private String suitId;
+    @Value("${suitSecret}")
+    private String suitSecret;
+    @Value("${token}")
+    private String token;
+    @Value("${encodingAesKey}")
+    private String encodingAesKey;
+    @Value("${corpId}")
+    private String corpId;
+
+    @Resource
+    SysConfigMapper sysConfigMapper;
+    @Autowired
+    RestTemplate restTemplate;
+    @Resource
+    UserMapper userMapper;
+
+    @RequestMapping("/corpWXAuth")
+    public ModelAndView auth(String code, int state) {
+        Map<String,Object> reqParam = new HashMap<String,Object>(16);
+        String userAgent = request.getHeader("User-Agent");
+        //获取设备类型
+        String deviceType = UserAgentUtils.getDeviceType(userAgent);
+        if ("MOBILE".equals(deviceType)) {
+            state = 0;
+        } else {
+            state = 1;
+        }
+        System.out.println("code="+code);
+        String url = WeiXinCorpController.GET_CORP_USERINFO_URL.replace("SUITE_ACCESS_TOKEN", getSuiteAccessToken()).replace("CODE", code);
+        String forObject = this.restTemplate.getForObject(url, String.class);
+        JSONObject obj = JSONObject.parseObject(forObject);
+        String wxUserId = obj.getString("UserId");
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("corpwx_userid", wxUserId).eq("is_active", 1));
+        if (userList.size() > 0) {
+            //该用户已存在
+            User curUser = userList.get(0);
+            reqParam.put("userId", curUser.getId());
+        }
+        reqParam.put("hasTriedAutoLogin", 1);
+        String redirecUrl = null;
+        if (state == 0) {
+            redirecUrl = "http://mobworktime.ttkuaiban.com";
+        } else if (state == 1) {
+            redirecUrl = "http://worktime.ttkuaiban.com";
+        }
+        ModelAndView modelAndView = new ModelAndView(
+                new RedirectView(redirecUrl), reqParam);
+
+        return modelAndView;
+    }
+
+    @GetMapping("testClient")
+    @ResponseBody
+    public String test(HttpServletRequest request) {
+        String userAgent = request.getHeader("user-agent");
+        System.out.println("agent: " + userAgent);
+        if (userAgent.toLowerCase().contains("micromessenger")) {
+            System.out.println("===微信平台");
+        } else if (userAgent.toLowerCase().contains("wxwork")) {
+            System.out.println("===企业微信平台");
+        }
+        System.out.println("浏览器组:" + UserAgentUtils.getBorderGroup(userAgent));
+        System.out.println("浏览器名字:" + UserAgentUtils.getBorderName(userAgent));
+        System.out.println("浏览器类型" + UserAgentUtils.getBorderType(userAgent));
+        System.out.println("浏览器生产商:" + UserAgentUtils.getBrowserManufacturer(userAgent));
+        System.out.println("浏览器版本:" + UserAgentUtils.getBrowserVersion(userAgent));
+        System.out.println("设备生产厂商:" + UserAgentUtils.getDeviceManufacturer(userAgent));
+        System.out.println("设备类型:" + UserAgentUtils.getDeviceType(userAgent));
+        System.out.println("设备操作系统:" + UserAgentUtils.getOs(userAgent));
+        System.out.println("操作系统的名字:" + UserAgentUtils.getOsName(userAgent));
+        System.out.println("操作系统的版本号:" + UserAgentUtils.getOsVersion(userAgent));
+        System.out.println("操作系统浏览器的渲染引擎:" + UserAgentUtils.getBorderRenderingEngine(userAgent));
+        String os = UserAgentUtils.getOs(userAgent);
+        if (os.contains("Windows")) {
+            System.out.println("是Windows");
+        } else if (os.contains("Linux")) {
+            System.out.println("是Linux");
+        } else {
+            System.out.println("无法匹配: {" + os + "}");
+        }
+
+        return "Success";
+    }
+
+    //获取第三方应用临时凭证
+    private String getSuiteAccessToken() {
+        if (WeiXinCorpController.SUITE_ACCESS_TOKEN == null || WeiXinCorpController.suiteTokenExpireTime < System.currentTimeMillis()) {
+            //失效了,需要重新获取
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            JSONObject reqParam = new JSONObject();
+            reqParam.put("suite_id",  suitId);
+            reqParam.put("suite_secret", suitSecret);
+            SysConfig param = sysConfigMapper.selectOne(new QueryWrapper<SysConfig>().eq("param_key", "wx_suite_ticket"));
+            if (param != null) {
+                reqParam.put("suite_ticket",param.getParamValue());
+            }
+
+            HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
+            ResponseEntity<String> responseEntity = this.restTemplate.exchange(WeiXinCorpController.GET_SUITE_ACCESS_TOKEN_URL,
+                    HttpMethod.POST, requestEntity, String.class);
+            if (responseEntity.getStatusCode() == HttpStatus.OK) {
+                String resp = responseEntity.getBody();
+                System.out.println("获取企业微信suitAccessToken返回"+resp);
+                JSONObject obj = JSONObject.parseObject(resp);
+                if (obj.getIntValue("errcode") == 0) {
+                    WeiXinCorpController.SUITE_ACCESS_TOKEN = obj.getString("suite_access_token");
+                    WeiXinCorpController.suiteTokenExpireTime = System.currentTimeMillis() + obj.getIntValue("expires_in")*1000;
+                }
+            }
+        }
+        return WeiXinCorpController.SUITE_ACCESS_TOKEN;
+    }
+
+}

+ 60 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CommonUploadController.java

@@ -0,0 +1,60 @@
+package com.management.platform.controller;
+
+import com.management.platform.util.HttpRespMsg;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.UUID;
+
+@RestController
+@RequestMapping("/common")
+public class CommonUploadController {
+
+    Logger logger = LogManager.getLogger(org.apache.logging.log4j.LogManager.ROOT_LOGGER_NAME);
+    @Value(value = "${upload.path}")
+    private String path;
+
+    @RequestMapping(value="uploadFile")
+    public HttpRespMsg uploadFile(MultipartFile multipartFile) {
+        HttpRespMsg msg = new HttpRespMsg();
+
+        //然后处理文件
+        String fileName = multipartFile.getOriginalFilename();
+        String[] split = fileName.split("\\.");
+        String serverName = UUID.randomUUID().toString().replaceAll("-", "") + "."+split[split.length-1];
+
+        //检查目录
+        File dir = new File(path);
+        if (!dir.exists()) {
+            dir.mkdir();
+        }
+        File file = new File(dir, serverName);
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            inputStream = multipartFile.getInputStream();
+            outputStream = new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
+            msg.data = serverName;
+        } catch (Exception exception) {
+            exception.printStackTrace();
+            logger.error(exception.getMessage());
+        }
+
+        return msg;
+    }
+}

+ 92 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyController.java

@@ -0,0 +1,92 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.Company;
+import com.management.platform.entity.VcompanyCustomerContact;
+import com.management.platform.mapper.CompanyMapper;
+import com.management.platform.service.CompanyService;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.el.parser.BooleanNode;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 屈跃庭
+ * @since 2020-01-13
+ */
+@RestController
+@RequestMapping("/company")
+public class CompanyController {
+    @Resource
+    CompanyMapper companyMapper;
+    @Resource
+    CompanyService companyService;
+    /**
+     * 获取企业列表,显示到期时间
+     * @return
+     */
+    @RequestMapping("getList")
+    public HttpRespMsg getList(String companyName, @RequestParam(required = false, defaultValue = "false") Boolean isMeal, Integer pageIndex, Integer pageSize) {
+        QueryWrapper<Company> queryWrapper = new QueryWrapper<Company>();
+        if (!StringUtils.isEmpty(companyName)) {
+            queryWrapper.like("company_name", companyName);
+        }
+        if (isMeal) {
+            queryWrapper.eq("set_meal", 1);
+        }
+        queryWrapper.orderByDesc("id");
+        HttpRespMsg msg = new HttpRespMsg();
+
+        msg.data = companyMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
+        return msg;
+    }
+
+    /**
+     * 添加人员上限
+     * @param companyId
+     * @param addCount
+     * @return
+     */
+    @RequestMapping("/addMembCount")
+    public HttpRespMsg addMembCount(Integer companyId, int addCount) {
+        return companyService.addMembCount(companyId, addCount);
+    }
+
+    /**
+     * 标记为已签约
+     * @param companyId
+     * @return
+     */
+    @RequestMapping("/setMeal")
+    public HttpRespMsg setMeal(Integer companyId) {
+        return companyService.setMeal(companyId);
+    }
+
+    /**
+     * 设置有效期
+     * @param companyId
+     * @param date
+     * @return
+     */
+    @RequestMapping("/setExpDate")
+    public HttpRespMsg setExpDate(Integer companyId, String date) {
+        return companyService.setExpDate(companyId, date);
+    }
+
+    @RequestMapping("/setPackageList")
+    public HttpRespMsg setPackageList(Company company) {
+        return companyService.setPackageList(company);
+    }
+}
+

+ 43 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyCustomerContactController.java

@@ -0,0 +1,43 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.service.CompanyCustomerContactService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-04-07
+ */
+@RestController
+@RequestMapping("/company-customer-contact")
+public class CompanyCustomerContactController {
+
+    @Resource
+    CompanyCustomerContactService companyCustomerContactService;
+
+    /**
+     * 获取公司列表
+     */
+    @RequestMapping("/getList")
+    public HttpRespMsg getList(Integer pageIndex, Integer pageSize) {
+        return companyCustomerContactService.getList(pageIndex, pageSize);
+    }
+
+    /**
+     * 处理,标记为联系
+     */
+    @RequestMapping("/handle")
+    public HttpRespMsg handle(Integer companyId, String feedback) {
+        return companyCustomerContactService.handle(companyId, feedback);
+    }
+}
+

+ 39 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CompanyDingdingController.java

@@ -0,0 +1,39 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.CompanyDingding;
+import com.management.platform.mapper.CompanyDingdingMapper;
+import com.management.platform.service.CompanyDingdingService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-06-27
+ */
+@RestController
+@RequestMapping("/company-dingding")
+public class CompanyDingdingController {
+    @Resource
+    private CompanyDingdingService companyDingdingService;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+
+
+    @RequestMapping("/pushAlertMsg")
+    public HttpRespMsg pushAlertMsg(String corpid, String userDingId) {
+        CompanyDingding companyDingding = companyDingdingMapper.selectById(corpid);
+        companyDingdingService.sendFillReportAlertMsg(companyDingding.getCompanyId(), 1339030842L, "填入日报哦", "040534176023851922");
+        return new HttpRespMsg();
+    }
+
+}
+

+ 108 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/CustomerInfoController.java

@@ -0,0 +1,108 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.CustomerInfo;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.CustomerInfoMapper;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-07-31
+ */
+@RestController
+@RequestMapping("/customer-info")
+public class CustomerInfoController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ProjectMapper projectMapper;
+    @Resource
+    CustomerInfoMapper customerInfoMapper;
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(CustomerInfo info) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        if (info.getId() == null) {
+            info.setCompanyId(user.getCompanyId());
+            customerInfoMapper.insert(info);
+        } else {
+            info.setCompanyId(user.getCompanyId());
+            customerInfoMapper.updateById(info);
+            //更新项目表中的客户名称
+            Project p = new Project();
+            p.setCustomerName(info.getCustomerName());
+            projectMapper.update(p, new QueryWrapper<Project>().eq("customer_id", info.getId()));
+        }
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        int r = customerInfoMapper.delete(new QueryWrapper<CustomerInfo>().eq("id", id).eq("company_id", user.getCompanyId()));
+        if (r <= 0) {
+            msg.setError("无权删除");
+        }
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String keyword) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        QueryWrapper<CustomerInfo> queryWrapper = new QueryWrapper<CustomerInfo>().eq("company_id", user.getCompanyId()).orderByDesc("id");
+        if (!StringUtils.isEmpty(keyword)) {
+            queryWrapper.like("customer_name", keyword);
+        }
+        IPage<CustomerInfo> projectIPage = customerInfoMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<CustomerInfo> list = projectIPage.getRecords();
+        Long total = projectIPage.getTotal();
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", list);
+        map.put("total", total);
+        msg.data = map;
+        return msg;
+    }
+
+    @RequestMapping("/getAll")
+    public HttpRespMsg getAll() {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<CustomerInfo> all = customerInfoMapper.getAll(user.getCompanyId());
+        msg.data = all;
+        return msg;
+    }
+
+}
+

+ 123 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/DepartmentController.java

@@ -0,0 +1,123 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.service.DepartmentService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ * 部门 前端控制器
+ * </p>
+ *
+ * @author 屈跃庭
+ * @since 2020-02-11
+ */
+@RestController
+@RequestMapping("/department")
+public class DepartmentController {
+
+    @Autowired
+    private DepartmentService departmentService;
+
+    /**
+     * 获取带有层级的部门列表
+     */
+    @RequestMapping("/list")
+    public HttpRespMsg getDepartment(HttpServletRequest request) {
+        return departmentService.getDepartmentList(request);
+    }
+
+    @RequestMapping("/listAllMemb")
+    public HttpRespMsg listAllMemb(HttpServletRequest request) {
+        return departmentService.listAllMemb(request);
+    }
+
+    //获取我可以管辖到的人员列表,进行代填时选择的人员列表用到
+    @RequestMapping("/listMyMembs")
+    public HttpRespMsg listMyMembs(HttpServletRequest request) {
+        return departmentService.listMyMembs(request);
+    }
+
+    /**
+     * 获取不带有层级的部门列表
+     */
+    @RequestMapping("/normalList")
+    public HttpRespMsg getDepartmentNormal(HttpServletRequest request) {
+        return departmentService.getNormalDepartmentList(request);
+    }
+
+
+    /**
+     * 新增部门
+     * name 部门名称
+     * parentId 父级部门id
+     */
+    @RequestMapping("/add")
+    public HttpRespMsg insertDepartment(@RequestParam String name, Integer parentId, String managerId, String reportAuditUserid, HttpServletRequest request) {
+        return departmentService.insertDepartment(name, parentId, managerId, reportAuditUserid, request);
+    }
+
+    /**
+     * 修改部门名称
+     * id 部门id
+     * name 部门名称
+     */
+    @RequestMapping("/edit")
+    public HttpRespMsg updateDepartment(@RequestParam Integer id, @RequestParam String name, String managerId, String reportAuditUserid, HttpServletRequest request) {
+        return departmentService.updateDepartment(id, name, managerId, reportAuditUserid, request);
+    }
+
+    /**
+     * 删除部门
+     * id 部门id
+     */
+    @RequestMapping("/delete")
+    public HttpRespMsg deleteDepartment(@RequestParam Integer id, HttpServletRequest request) {
+        return departmentService.deleteDepartment(id, request);
+    }
+
+    /**
+     * 获取部门的统计工时成本
+     */
+    @RequestMapping("/departmentStatistic")
+    public HttpRespMsg getDepartmentStatistics(Integer parentDeptId, String startDate, String endDate, HttpServletRequest request) {
+        return departmentService.getDepartmentStatistics(parentDeptId, startDate, endDate, request);
+    }
+
+    /**
+     * 获取某个部门或者公司全部的人员的统计
+     * departmentId 要查询的项目
+     */
+    @RequestMapping("/userStatistic")
+    public HttpRespMsg getUserStatistics(String startDate, String endDate, Integer departmentId, HttpServletRequest request) {
+        return departmentService.getUserStatistics(startDate, endDate, departmentId, request);
+    }
+
+    @RequestMapping("/getUserCustomDataStatistic")
+    public HttpRespMsg getUserCustomDataStatistic(String startDate, String endDate, Integer departmentId, HttpServletRequest request) {
+        return departmentService.getUserCustomDataStatistic(startDate, endDate, departmentId, request);
+    }
+
+    /**
+     * 按人员导出工时统计,可选人员
+     * departmentId 要查询的项目
+     */
+    @RequestMapping("/exportUserStatistic")
+    public HttpRespMsg exportUserStatistic(String startDate, String endDate, String userIds, HttpServletRequest request) {
+        return departmentService.exportUserStatistic(startDate, endDate, userIds, request);
+    }
+
+
+    @RequestMapping("/exportDeptStatistic")
+    public HttpRespMsg exportDeptStatistic(String startDate, String endDate, HttpServletRequest request) {
+        return departmentService.exportDeptStatistic(startDate, endDate, request);
+    }
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/DepartmentDingdingController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-06-27
+ */
+@RestController
+@RequestMapping("/department-dingding")
+public class DepartmentDingdingController {
+
+}
+

+ 283 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -0,0 +1,283 @@
+package com.management.platform.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.OapiServiceGetSuiteTokenRequest;
+import com.dingtalk.api.request.OapiServiceGetUnactiveCorpRequest;
+import com.dingtalk.api.response.OapiServiceGetSuiteTokenResponse;
+import com.dingtalk.api.response.OapiServiceGetUnactiveCorpResponse;
+import com.management.platform.entity.CompanyDingding;
+import com.management.platform.entity.SysConfig;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.CompanyDingdingService;
+import com.management.platform.service.DingDingService;
+import com.management.platform.util.*;
+import com.taobao.api.ApiException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.http.*;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@RestController
+@RequestMapping("/dingding")
+public class DingDingController {
+
+    private final Logger bizLogger = LoggerFactory.getLogger(getClass());
+    String token = "cf776d62c5fb3508b5d8c2cbb9f3df0c";
+    String aesKey = "ktmbamhymjsf60ndwp6n81mnu92847oynsgj9e0zr9v";
+    String suiteKey = "suitejwoq9dw4bxv4stdb";
+    String suiteSecret = "o-TWFLkFe8YbJsa_025JOj_JEWydP5GR3eigt1Yn1rtx5dTcryTJiSA6KEih3Bi4";
+
+    @Resource
+    private DingDingService dingDingService;
+    static ExecutorService executorService = Executors.newCachedThreadPool();
+    @Resource
+    private CompanyDingdingService companyDingdingService;
+    @Resource
+    private UserMapper userMapper;
+
+    @RequestMapping("/callback")
+    public Map<String, String> dingCallback(
+            @RequestParam(value = "signature") String signature,
+            @RequestParam(value = "timestamp") String timestamp,
+            @RequestParam(value = "nonce") String nonce,
+            @RequestBody(required = false) JSONObject body
+    ) {
+        System.out.println("接收到ding call back");
+        bizLogger.info("接收到ding call back=" + body.toJSONString());
+        try {
+            // 1. 从http请求中获取加解密参数
+
+            // 2. 使用加解密类型
+            // Constant.OWNER_KEY 说明:
+            // 1、开发者后台配置的订阅事件为应用级事件推送,
+            //      此时OWNER_KEY为应用的APP_KEY(企业内部应用)或SUITE_KEY(三方应用)。
+            // 2、调用订阅事件接口订阅的事件为企业级事件推送,
+            //      此时OWNER_KEY为:企业的CORP_ID(企业内部应用)或SUITE_KEY(三方应用)
+            DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(token, aesKey, suiteKey);
+            String encryptMsg = body.getString("encrypt");
+            String decryptMsg = callbackCrypto.getDecryptMsg(signature, timestamp, nonce, encryptMsg);
+
+            // 3. 反序列化回调事件json数据
+            JSONObject eventJson = JSON.parseObject(decryptMsg);
+            String eventType = eventJson.getString("EventType");
+            bizLogger.info("DingDing回调触发了");
+            bizLogger.info(eventJson.toJSONString());
+            // 4. 根据EventType分类处理
+            if ("check_url".equals(eventType)) {
+                // 测试回调url的正确性
+                bizLogger.info("测试回调url的正确性");
+            } else if ("user_add_org".equals(eventType)) {
+                // 处理通讯录用户增加事件
+                bizLogger.info("发生了:" + eventType + "事件");
+            } else {
+                // 添加其他已注册的
+                bizLogger.info("发生了:" + eventType + "事件");
+                //推送suit ticket事件
+                /**
+                 * {
+                 *   "SuiteKey": "xxxxxx",
+                 *   "EventType": "suite_ticket ",
+                 *   "TimeStamp": 123456,
+                 *   "SuiteTicket": "xxxxxx"
+                 * }
+                 */
+                if ("suite_ticket".equals(eventType)) {
+                    System.out.println("==推送SuiteTicket===");
+                    dingDingService.updateSuiteTicket(eventJson.getString("SuiteTicket"));
+                } else if ("tmp_auth_code".equals(eventType)) {
+                    //企业授权开通应用
+                    /**
+                     * {
+                     *    "TimeStamp":1553709079062,
+                     *    "AuthCode": "xxxxxx",
+                     *    "AuthCorpId":"xxxxxx",
+                     *    "EventType":"tmp_auth_code",
+                     *    "SuiteKey":"xxxxxx"
+                     *  }
+                     */
+                    System.out.println("==企业授权开通应用===");
+
+                } else if ("SYNC_HTTP_PUSH_HIGH".equals(eventType)) {
+                    /**
+                     * {"EventType":"SYNC_HTTP_PUSH_HIGH",
+                     * "bizData":[{"gmt_create":1624757980000,"biz_type":2,"open_cursor":0,
+                     * "subscribe_id":"16822005_0","id":15275,"gmt_modified":1624757980000,
+                     * "biz_id":"16822005",
+                     * "biz_data":"{\"syncAction\":\"suite_ticket\",
+                     * \"suiteTicket\":\"IaIbq7a9S36R2uAbUh02VNlWoMB2LkorhyFCFhdpSWxJPZhIsIEhxIoIS7HQRn0zxMGh57gGd56RRh2Ntmcuzq\",
+                     * \"syncSeq\":\"AE815E12E6908BDEE8CA8D33A9\"}","corp_id":"ding169917db7f1ee5f435c2f4657eb6378f","status":0}]}
+                     */
+                    JSONArray bizData = eventJson.getJSONArray("bizData");
+                    if (bizData.size() > 0) {
+                        for (int i=0;i<bizData.size(); i++) {
+                            JSONObject bizItem = bizData.getJSONObject(i);
+                            int bizType = bizItem.getInteger("biz_type");
+                            if (bizType == 2) {
+                                //SuteTicket推送事件
+                                JSONObject biz_data = JSONObject.parseObject(bizItem.getString("biz_data"));
+                                String syncAction = biz_data.getString("syncAction");
+                                if ("suite_ticket".equals(syncAction)) {
+                                    System.out.println("==Push 推送事件 suite_ticket===");
+                                    dingDingService.updateSuiteTicket(biz_data.getString("suiteTicket"));
+                                }
+                            } else if (bizType == 4) {
+                                //企业授权变更,包含授权、解除授权、授权变更。
+                                JSONObject biz_data = JSONObject.parseObject(bizItem.getString("biz_data"));
+                                System.out.println("授权变更数据===@@");
+                                System.out.println(biz_data);
+                                String syncAction = biz_data.getString("syncAction");
+                                if ("org_suite_auth".equals(syncAction) || "org_suite_change".equals(syncAction)) {
+                                    //开通授权应用
+                                    JSONObject authCorpInfo = biz_data.getJSONObject("auth_corp_info");
+                                    String corp_name = authCorpInfo.getString("corp_name");
+                                    boolean isAuthenticated = authCorpInfo.getBooleanValue("is_authenticated");
+                                    Long agentId = null;
+                                    if ("org_suite_auth".equals(syncAction)) {
+                                        System.out.println("==Push 推送事件 开通授权应用===" + corp_name);
+                                        //此处在授权开通时强制赋值
+                                        isAuthenticated = true;
+                                        JSONObject authInfo = biz_data.getJSONObject("auth_info");
+
+                                        if (authInfo != null) {
+                                            JSONArray agents = authInfo.getJSONArray("agent");
+                                            for (int j=0;j<agents.size(); j++) {
+                                                JSONObject item = agents.getJSONObject(j);
+                                                if (item.getString("agent_name").equals("工时管家")) {
+                                                    agentId = item.getLong("agentid");
+                                                }
+                                            }
+                                        }
+                                    } else {
+                                        System.out.println("==Push 推送事件 授权变更==="+ corp_name+"=="+(isAuthenticated?"启用":"停用"));
+                                    }
+                                    if (isAuthenticated) {
+                                        String corpid = authCorpInfo.getString("corpid");
+                                        String authUserId = biz_data.getJSONObject("auth_user_info").getString("userId");
+                                        try {
+                                            dingDingService.corpAuth(corpid, corp_name, authUserId, agentId);
+                                        } catch (ApiException e) {
+                                            e.printStackTrace();
+                                            System.out.println(e.getMessage());
+                                        }
+                                    } else {
+                                        System.out.println("===未授权启用===");
+                                    }
+
+                                } else {
+                                    System.out.println("==Push 推送授权类型 ==="+syncAction);
+
+                                }
+                            } else if (bizType == 7) {
+                                JSONObject biz_data = JSONObject.parseObject(bizItem.getString("biz_data"));
+                                String syncAction = biz_data.getString("syncAction");
+                                if ("org_micro_app_scope_update".equals(syncAction)) {
+                                    //授权范围变更,我们尝试重新获取组织结构
+                                    String corpid = bizItem.getString("corp_id");
+                                    System.out.println("==Push 推送事件 使用范围变更=调用syncCorpMembs, corpid==="+corpid);
+                                    try {
+                                        dingDingService.syncCorpMembs(corpid);
+                                    } catch (ApiException e) {
+                                        e.printStackTrace();
+                                    }
+                                } else if ("org_micro_app_restore".equals(syncAction)) {
+                                    String corpid = bizItem.getString("corp_id");
+                                    System.out.println("==Push 推送事件 app 工时管家恢复启用, corpid==="+corpid);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            // 5. 返回success的加密数据
+            Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
+            LocalDateTime now = LocalDateTime.now();
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
+            System.out.println(dtf.format(now)+" 给钉钉返回数据了:"+successMap);
+            return successMap;
+        } catch (DingCallbackCrypto.DingTalkEncryptException e) {
+            e.printStackTrace();
+            System.out.println(e.getMessage());
+        }
+        return null;
+    }
+
+
+    @RequestMapping("/syncCorpMembs")
+    public HttpRespMsg syncCorpMembs(String corpid) {
+        try {
+            System.out.println("===========手动调用syncCorpMembs请求接口===========");
+            String rest = dingDingService.syncCorpMembs(corpid);
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.data = rest;
+            return msg;
+        } catch (ApiException e) {
+            e.printStackTrace();
+            System.err.println(e.getMessage());
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.setError(e.getMessage());
+            return msg;
+        }
+
+    }
+
+    @RequestMapping("/getUserByCode")
+    public HttpRespMsg getUserByCode(String code, String corpid) {
+        return dingDingService.getUserByCode(code, corpid);
+    }
+
+    @RequestMapping("/testAsync")
+    public HttpRespMsg testAsync() {
+        HttpRespMsg msg = new HttpRespMsg();
+        dingDingService.testAsync();
+        return msg;
+    }
+
+    @RequestMapping("/syncCorpInfo")
+    public HttpRespMsg syncCorpInfo(String corpid) {
+        return dingDingService.syncCorpInfo(corpid);
+    }
+
+
+    @RequestMapping("/syncCorpAgent")
+    public HttpRespMsg syncCorpAgent(String corpid) {
+        return dingDingService.syncCorpAgent(corpid);
+
+    }
+
+    @RequestMapping("/getUnActiveCorp")
+    public HttpRespMsg getUnActiveCorp() {
+        return dingDingService.getUnActiveCorp();
+    }
+
+    @RequestMapping("/reAuthCorp")
+    public HttpRespMsg reAuthCorp(String corpid) {
+        return dingDingService.reAuthCorp(corpid);
+    }
+
+    @RequestMapping("/pushLeaveAuditAlert")
+    public HttpRespMsg pushLeaveAuditAlert(String userId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(userId);
+        System.out.println("测试发送审批给=="+user.getName());
+        CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+
+        companyDingdingService.sendLeaveApplyAlertMsg(dingding.getCompanyId(), dingding.getAgentId(), "", user.getDingdingUserid());
+
+        return msg;
+    }
+}

+ 47 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/DirtyCleanController.java

@@ -0,0 +1,47 @@
+package com.management.platform.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Report;
+import com.management.platform.mapper.ReportMapper;
+import com.management.platform.service.ReportService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ListUtil;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/clean")
+public class DirtyCleanController {
+    @Resource
+    private ReportService reportService;
+    @Resource
+    private ReportMapper reportMapper;
+
+
+
+    @RequestMapping("/removeDuplicate")
+    public HttpRespMsg removeDuplicate(Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<Map<String, Object>> list = reportMapper.getDuplicate(companyId);
+        System.out.println("共=="+list.size()+"条重复记录");
+        List<Integer> reportIds = new ArrayList<>();
+        for(int i=0;i<list.size(); i++) {
+            Map map = list.get(i);
+            String ids = (String)map.get("reportIds");
+            reportIds.addAll(ListUtil.convertIntegerIdsArrayToList(ids));
+        }
+        System.out.println(reportIds);
+        System.out.println("日报记录report ="+reportIds.size());
+//        QueryWrapper<Report> queryWrapper = new QueryWrapper<Report>().in("id", reportIds).eq("company_id", companyId);
+//        reportMapper.delete(queryWrapper);
+//        List<Report> rList = reportMapper.selectList();
+//        System.out.println("去查找的日报数量="+rList.size());
+
+        return msg;
+    }
+}

+ 99 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/EarningSnapshotController.java

@@ -0,0 +1,99 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.EarningSnapshot;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.SysFunctionMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.EarningSnapshotService;
+import com.management.platform.service.FinanceService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ListUtil;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-15
+ */
+@RestController
+@RequestMapping("/earning-snapshot")
+public class EarningSnapshotController {
+    @Resource
+    private HttpServletRequest request;
+
+    @Resource
+    private EarningSnapshotService earningSnapshotService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(Integer projectId) {
+        String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+        HttpRespMsg msg = new HttpRespMsg();
+        Project project = projectMapper.selectById(projectId);
+
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看成本基线");
+        if (userId.equals(project.getInchargerId()) || userId.equals(project.getCreatorId()) || functionList.size() > 0) {
+            List<EarningSnapshot> list = earningSnapshotService.list(new QueryWrapper<EarningSnapshot>().eq("project_id", projectId).orderByDesc("id"));
+            for (EarningSnapshot snapshot : list) {
+                if (snapshot.getCostData() != null) {
+                    JSONArray array = JSONArray.parseArray(snapshot.getCostData());
+                    List<ProjectBasecost> costList = new ArrayList<>();
+                    for (int i=0;i<array.size();i++) {
+                        ProjectBasecost projectBasecost = JSONObject.toJavaObject(array.getJSONObject(i), ProjectBasecost.class);
+                        costList.add(projectBasecost);
+                    }
+                    snapshot.setCostList(costList);
+                    snapshot.setCostData(null);
+                }
+            }
+            msg.data = list;
+        } else {
+            msg.setError("无权查看");
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer projectId, String ids) {
+        String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "校正成本基线");
+        HttpRespMsg msg = new HttpRespMsg();
+        Project project = projectMapper.selectById(projectId);
+        if (userId.equals(project.getInchargerId()) || userId.equals(project.getCreatorId()) || functionList.size() > 0) {
+            List<Integer> idArray = ListUtil.convertIntegerIdsArrayToList(ids);
+            earningSnapshotService.removeByIds(idArray);
+        } else {
+            msg.setError("无权操作");
+        }
+
+        return msg;
+    }
+}
+

+ 39 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ExpenseItemController.java

@@ -0,0 +1,39 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ExpenseItem;
+import com.management.platform.entity.vo.ExpenseItemVO;
+import com.management.platform.mapper.ExpenseItemMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-17
+ */
+@RestController
+@RequestMapping("/expense-item")
+public class ExpenseItemController {
+
+    @Resource
+    private ExpenseItemMapper expenseItemMapper;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ExpenseItemVO> userExpenseDetail = expenseItemMapper.getUserExpenseDetail(projectId);
+        msg.data = userExpenseDetail;
+        return msg;
+    }
+}
+

+ 94 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ExpenseSheetController.java

@@ -0,0 +1,94 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ExpenseSheet;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.SysFunctionMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ExpenseSheetService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-17
+ */
+@RestController
+@RequestMapping("/expense-sheet")
+public class ExpenseSheetController {
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ExpenseSheetService expenseSheetService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
+
+    @RequestMapping("/getNextCode")
+    public HttpRespMsg getNextCode() {
+        String userId = request.getHeader("Token");
+        return expenseSheetService.getNextCode(userId);
+    }
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(ExpenseSheet sheet, String items) {
+        String userId = request.getHeader("Token");
+        return expenseSheetService.add(sheet, items, userId);
+
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        return expenseSheetService.delete(id);
+
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(ExpenseSheet sheet,String startDate, String endDate, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部报销单");
+        if (functionList.size() == 0) {
+            //普通员工只能看自己的
+            sheet.setOwnerId(user.getId());
+        }
+        sheet.setCompanyId(user.getCompanyId());
+        return expenseSheetService.queryList(sheet, startDate, endDate, pageIndex, pageSize);
+    }
+
+    @RequestMapping("/getDetail")
+    public HttpRespMsg getDetail(Integer id) {
+
+        return expenseSheetService.getDetail(id);
+
+    }
+
+    @RequestMapping("/approve")
+    public HttpRespMsg approve(Integer id) {
+
+        return expenseSheetService.approve(id);
+
+    }
+    @RequestMapping("/deny")
+    public HttpRespMsg deny(Integer id) {
+
+        return expenseSheetService.deny(id);
+
+    }
+
+}
+

+ 36 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ExpenseTypeController.java

@@ -0,0 +1,36 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ExpenseType;
+import com.management.platform.mapper.ExpenseTypeMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-06-18
+ */
+@RestController
+@RequestMapping("/expense-type")
+public class ExpenseTypeController {
+    @Resource
+    private ExpenseTypeMapper expenseTypeMapper;
+
+    @RequestMapping("/getList")
+    public HttpRespMsg getList() {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = expenseTypeMapper.selectList(new QueryWrapper<>());
+        return msg;
+    }
+
+}
+

+ 48 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceAuditorController.java

@@ -0,0 +1,48 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.Finance;
+import com.management.platform.entity.FinanceAuditor;
+import com.management.platform.mapper.FinanceAuditorMapper;
+import com.management.platform.service.FinanceAuditorService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-22
+ */
+@RestController
+@RequestMapping("/finance-auditor")
+public class FinanceAuditorController {
+
+    @Resource
+    private FinanceAuditorService financeAuditorService;
+    @Resource
+    private HttpServletRequest request;
+
+    @RequestMapping("/save")
+    public HttpRespMsg save(FinanceAuditor item) {
+        HttpRespMsg msg = new HttpRespMsg();
+        financeAuditorService.saveOrUpdate(item);
+        return msg;
+    }
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        FinanceAuditor item = financeAuditorService.getById(companyId);
+        msg.data = item;
+        return msg;
+    }
+}
+

+ 125 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceController.java

@@ -0,0 +1,125 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Company;
+import com.management.platform.entity.FinanceFixedcolname;
+import com.management.platform.entity.FinanceTblcuscol;
+import com.management.platform.mapper.CompanyMapper;
+import com.management.platform.mapper.FinanceTblcuscolMapper;
+import com.management.platform.service.FinanceFixedcolnameService;
+import com.management.platform.service.FinanceService;
+import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-02-18
+ */
+@RestController
+@RequestMapping("/finance")
+public class FinanceController {
+
+    @Resource
+    private FinanceService financeService;
+    @Resource
+    private FinanceTblcuscolMapper financeTblcuscolMapper;
+    @Resource
+    private CompanyMapper companyMapper;
+    @Resource
+    private FinanceFixedcolnameService financeFixedcolnameService;
+
+    @Value(value = "${upload.path}")
+    private String path;
+
+    @RequestMapping("/getByMonth")
+    public HttpRespMsg getByMonth(Integer companyId, String yearMonth) {
+        return financeService.getByMonth(companyId, yearMonth);
+    }
+
+    @RequestMapping("/getProjects")
+    public HttpRespMsg getProjects(Integer companyId, String yearMonth) {
+        return financeService.getProjects(companyId, yearMonth);
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(Integer companyId, String yearMonth,
+                                  Boolean syncUserCost, Boolean syncHistoryReport,
+                                  MultipartFile file, HttpServletRequest request) {
+        return financeService.importData(companyId, yearMonth, syncUserCost, syncHistoryReport, file, request);
+    }
+
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(@RequestParam String date, Boolean assignNoProUser,HttpServletRequest request) {
+        return financeService.exportData(date, assignNoProUser, request);
+    }
+
+    @RequestMapping("/exportFinance")
+    public HttpRespMsg exportFinance(@RequestParam String date, HttpServletRequest request) {
+        return financeService.exportFinance(date, request);
+    }
+
+    //按照项目分配财务成本
+    @RequestMapping("/getTimeCost")
+    public HttpRespMsg getTimeCost(String yearMonth, Boolean assignNoProUser,HttpServletRequest request) {
+        return financeService.getTimeCost(yearMonth, assignNoProUser,request);
+    }
+
+    @RequestMapping("/getNoProjectUsers")
+    public HttpRespMsg getNoProjectUsers(String yearMonth, HttpServletRequest request) {
+        return financeService.getNoProjectUsers(yearMonth, request);
+    }
+
+
+    /**
+     * 获取财务报表模板
+     * @param companyId
+     * @return
+     */
+    @RequestMapping("/getTemplate")
+    public HttpRespMsg getTemplate(Integer companyId) {
+        List<FinanceTblcuscol> list = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
+        HttpRespMsg msg = new HttpRespMsg();
+        FinanceFixedcolname item = financeFixedcolnameService.getById(companyId);
+
+        List<String> heads = new ArrayList<>();
+        Company company = companyMapper.selectById(companyId);
+        heads.add("姓名");
+        heads.add(item.getMonthCost());//heads.add("工资");
+        heads.add(item.getBonus());//heads.add("奖金");
+        heads.add(item.getAllowance());//heads.add("津贴");
+        heads.add(item.getInsuranceOld());//heads.add("养老保险");
+        heads.add(item.getInsuranceMedical());//heads.add("医疗保险");
+        heads.add(item.getInsuranceLosejob());//heads.add("失业保险");
+        heads.add(item.getInsuranceInjury());//heads.add("工伤保险");
+        heads.add(item.getHouseFund());//heads.add("住房公积金");
+//            heads.add("其他");
+        if (list.size() > 0) {
+            List<String> collect = list.stream().map(FinanceTblcuscol::getFieldName).collect(Collectors.toList());
+            heads.addAll(collect);
+        }
+        List<List<String>> allList = new ArrayList<>();
+        allList.add(heads);
+        String fileName = company.getCompanyName()+"_财务人员成本模板";
+        msg.data = ExcelUtil.exportGeneralExcelByTitleAndList(fileName, allList, path);
+
+        return msg;
+    }
+}
+

+ 23 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceFixedcolnameController.java

@@ -0,0 +1,23 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-15
+ */
+@RestController
+@RequestMapping("/finance-fixedcolname")
+public class FinanceFixedcolnameController {
+
+}
+

+ 94 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceImportController.java

@@ -0,0 +1,94 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.FinanceImport;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.FinanceImportService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-22
+ */
+@RestController
+@RequestMapping("/finance-import")
+public class FinanceImportController {
+
+    @Resource
+    private FinanceImportService financeImportService;
+    @Resource
+    private UserMapper userMapper;
+
+    @RequestMapping("submitImport")
+    public HttpRespMsg submitImport(Integer companyId, String yearMonth,
+                                  Boolean syncUserCost, Boolean syncHistoryReport,
+                                  MultipartFile file, HttpServletRequest request) {
+        return financeImportService.submitImport(companyId, yearMonth, syncUserCost, syncHistoryReport, file, request);
+    }
+
+    @RequestMapping("list")
+    public HttpRespMsg list(Integer companyId, HttpServletRequest request) {
+        return financeImportService.list(companyId, request);
+    }
+
+    @RequestMapping("/agree")
+    public HttpRespMsg agree(Integer id, HttpServletRequest request) {
+
+        return financeImportService.agree(id, request);
+    }
+
+    @RequestMapping("/getStatus")
+    public HttpRespMsg getStatus(Integer companyId, String yearMonth) {
+        FinanceImport item = financeImportService.getOne(new QueryWrapper<FinanceImport>().eq("company_id", companyId).eq("ymonth", yearMonth).orderByDesc("indate").last("limit 1"));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = item;
+        return msg;
+    }
+
+    @RequestMapping("/deny")
+    public HttpRespMsg deny(Integer id, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        FinanceImport item = new FinanceImport();
+        item.setId(id);
+        item.setState(2);
+        FinanceImport old = financeImportService.getById(id);
+        if (old.getState() == 0) {
+            User auditor = userMapper.selectById(request.getHeader("TOKEN"));
+            item.setAuditorId(auditor.getId());
+            item.setAuditorName(auditor.getName());
+            financeImportService.updateById(item);
+        } else {
+            msg.setError("只有待审核状态才可以操作");
+        }
+        return msg;
+    }
+
+    @RequestMapping("/cancel")
+    public HttpRespMsg cancel(Integer id, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        FinanceImport item = new FinanceImport();
+        item.setId(id);
+        item.setState(-1);
+        FinanceImport old = financeImportService.getById(id);
+        if (old.getState() == 1) {
+            financeImportService.updateById(item);
+        } else {
+            msg.setError("只有审核通过状态才可以撤销");
+        }
+        return msg;
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceProjectsController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-02-26
+ */
+@RestController
+@RequestMapping("/finance-projects")
+public class FinanceProjectsController {
+
+}
+

+ 128 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/FinanceTblcuscolController.java

@@ -0,0 +1,128 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Finance;
+import com.management.platform.entity.FinanceFixedcolname;
+import com.management.platform.entity.FinanceTblcuscol;
+import com.management.platform.mapper.FinanceFixedcolnameMapper;
+import com.management.platform.mapper.FinanceTblcuscolMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.FinanceFixedcolnameService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-17
+ */
+@RestController
+@RequestMapping("/finance-tblcuscol")
+public class FinanceTblcuscolController {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private FinanceTblcuscolMapper financeTblcuscolMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private FinanceFixedcolnameService financeFixedcolnameService;
+
+//    @RequestMapping("/get")
+//    public HttpRespMsg get(Integer companyId) {
+//        List<FinanceTblcuscol> list = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
+//        HttpRespMsg msg = new HttpRespMsg();
+//        msg.data = list;
+//        return msg;
+//    }
+
+    @RequestMapping("/getAll")
+    public HttpRespMsg getAll(Integer companyId) {
+        List<FinanceTblcuscol> list = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
+        HttpRespMsg msg = new HttpRespMsg();
+        FinanceFixedcolname item = financeFixedcolnameService.getFixed(companyId);
+        if (list.size() > 0) {
+            item.setField1(list.get(0).getFieldName());
+        }
+        if (list.size() > 1) {
+            item.setField2(list.get(1).getFieldName());
+        }
+        if (list.size() > 2) {
+            item.setField3(list.get(2).getFieldName());
+        }
+        msg.data = item;
+
+        return msg;
+    }
+//
+//    @RequestMapping("/getFixed")
+//    public HttpRespMsg getFixed(Integer companyId) {
+//        HttpRespMsg msg = new HttpRespMsg();
+//        msg.data = financeFixedcolnameService.getFixed(companyId);
+//        return msg;
+//    }
+
+    @RequestMapping("/save")
+    public HttpRespMsg addOrMod(FinanceFixedcolname item) {
+        String token = request.getHeader("TOKEN");
+        int companyId = userMapper.selectById(token).getCompanyId();
+        financeTblcuscolMapper.delete(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
+        if (!StringUtils.isEmpty(item.getField1())) {
+            FinanceTblcuscol col = new FinanceTblcuscol();
+            col.setCompanyId(companyId);
+            col.setFieldName(item.getField1());
+            financeTblcuscolMapper.insert(col);
+        }
+
+        if (!StringUtils.isEmpty(item.getField2())) {
+            FinanceTblcuscol col = new FinanceTblcuscol();
+            col.setCompanyId(companyId);
+            col.setFieldName(item.getField2());
+            financeTblcuscolMapper.insert(col);
+        }
+
+        if (!StringUtils.isEmpty(item.getField3())) {
+            FinanceTblcuscol col = new FinanceTblcuscol();
+            col.setCompanyId(companyId);
+            col.setFieldName(item.getField3());
+            financeTblcuscolMapper.insert(col);
+        }
+
+        //存储自定义的固定字段
+        if (item.getMonthCost() != null || item.getBonus() != null || item.getAllowance() != null || item.getInsuranceInjury() != null
+            || item.getInsuranceLosejob() != null || item.getInsuranceMedical() != null || item.getInsuranceOld() != null || item.getHouseFund() != null) {
+            item.setCompanyId(companyId);
+            financeFixedcolnameService.saveOrUpdate(item);
+        }
+
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        int companyId = userMapper.selectById(token).getCompanyId();
+        FinanceTblcuscol financeTblcuscol = financeTblcuscolMapper.selectById(id);
+        if (financeTblcuscol.getCompanyId() == companyId) {
+            financeTblcuscolMapper.deleteById(id);
+        } else {
+            msg.setError("无权操作");
+        }
+        return msg;
+    }
+}
+

+ 105 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/GroupTemplateController.java

@@ -0,0 +1,105 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.GroupTemplate;
+import com.management.platform.entity.GroupTmpstages;
+import com.management.platform.entity.User;
+import com.management.platform.service.GroupTemplateService;
+import com.management.platform.service.GroupTmpstagesService;
+import com.management.platform.service.UserService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-05
+ */
+@RestController
+@RequestMapping("/group-template")
+public class GroupTemplateController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private GroupTemplateService groupTemplateService;
+    @Resource
+    private GroupTmpstagesService groupTmpstagesService;
+    @Resource
+    private UserService userService;
+
+    @RequestMapping("/initData")
+    public HttpRespMsg initData() {
+        if (groupTemplateService.count() == 0) {
+            //系统中没有数据,需要初始化
+            String[] templateNames = {"工程设计","软硬件研发","客服工单处理"};
+            String[][] stages = {{"信息收集","策划","原型图","效果图","审核中","修改调整","完成"},
+                                {"需求分析","设计中","研发中","测试中","修改BUG","已发布"},
+                                {"用户问题","解决中","已解决","反馈用户&问题解决"}
+                                };
+            for (int i=0;i<templateNames.length;i++) {
+                String s = templateNames[i];
+                GroupTemplate template = new GroupTemplate();
+                template.setName(s);
+                template.setIsSystem(1);
+                groupTemplateService.save(template);
+                String[] curStages = stages[i];
+                int seq = 1;
+                for(String name:curStages) {
+                    GroupTmpstages sItem = new GroupTmpstages();
+                    sItem.setSequence(seq);
+                    sItem.setTemplateId(template.getId());
+                    sItem.setStagesName(name);
+                    groupTmpstagesService.save(sItem);
+                    seq++;
+                }
+            }
+        }
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/getList")
+    public HttpRespMsg getList() {
+        if (groupTemplateService.count() == 0) {
+            initData();
+        }
+        String uid = request.getHeader("Token");
+        User user = userService.getById(uid);
+        QueryWrapper<GroupTemplate> templateQueryWrapper = new QueryWrapper<>();
+        templateQueryWrapper.eq("company_id", user.getCompanyId()).or().eq("is_system",1).orderByDesc("id");
+        List<GroupTemplate> list = groupTemplateService.list(templateQueryWrapper);
+        //查找任务列表名称
+        for (GroupTemplate template:list) {
+            List<GroupTmpstages> groupTmpstages = groupTmpstagesService.list(new QueryWrapper<GroupTmpstages>().eq("template_id", template.getId()));
+            template.setStagesList(groupTmpstages);
+
+            //TODO: 查找每个阶段模板任务/里程碑/风险
+
+        }
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = list;
+        return msg;
+    }
+
+    @RequestMapping("/addTemplate")
+    public HttpRespMsg addTemplate(Integer groupId, String name, Boolean saveTask, Boolean saveMileStone, Boolean saveRisk) {
+        String uid = request.getHeader("Token");
+        return groupTemplateService.addTemplate(uid, groupId, name, saveTask, saveMileStone, saveRisk);
+    }
+
+    @RequestMapping("/deleteTemplate")
+    public HttpRespMsg deleteTemplate(Integer id) {
+        groupTemplateService.removeById(id);
+        return new HttpRespMsg();
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/GroupTmpstagesController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-05
+ */
+@RestController
+@RequestMapping("/group-tmpstages")
+public class GroupTmpstagesController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/GtemplateTaskController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-27
+ */
+@RestController
+@RequestMapping("/gtemplate-task")
+public class GtemplateTaskController {
+
+}
+

+ 37 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/InformationController.java

@@ -0,0 +1,37 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.service.InformationService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author 屈跃庭
+ * @since 2020-02-18
+ */
+@RestController
+@RequestMapping("/information")
+public class InformationController {
+    @Autowired
+    private InformationService informationService;
+
+    @RequestMapping("/list")
+    public HttpRespMsg getInformationList(HttpServletRequest request) {
+        return informationService.getInformationList(request);
+    }
+
+    @RequestMapping("/check")
+    public HttpRespMsg checkInformation(@RequestParam Integer id, HttpServletRequest request) {
+        return informationService.checkInformation(id, request);
+    }
+}
+

+ 98 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/LeaveSheetController.java

@@ -0,0 +1,98 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.ExpenseSheet;
+import com.management.platform.entity.LeaveSheet;
+import com.management.platform.entity.SysFunction;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.SysFunctionMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ExpenseSheetService;
+import com.management.platform.service.LeaveSheetService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-09
+ */
+@RestController
+@RequestMapping("/leave-sheet")
+public class LeaveSheetController {
+
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    LeaveSheetService leaveSheetService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
+
+
+    @RequestMapping("/add")
+    public HttpRespMsg add(LeaveSheet sheet) {
+        String userId = request.getHeader("Token");
+        return leaveSheetService.add(sheet, userId);
+
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        return leaveSheetService.delete(id);
+
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(LeaveSheet sheet, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部报销单");
+        if (functionList.size() == 0) {
+            //普通员工只能看自己的
+            sheet.setOwnerId(user.getId());
+        }
+        sheet.setCompanyId(user.getCompanyId());
+        return leaveSheetService.queryList(sheet, pageIndex, pageSize);
+    }
+
+    @RequestMapping("/approve")
+    public HttpRespMsg approve(Integer id) {
+
+        return leaveSheetService.approve(id);
+
+    }
+    @RequestMapping("/deny")
+    public HttpRespMsg deny(Integer id) {
+
+        return leaveSheetService.deny(id);
+
+    }
+
+    /**
+     *
+     * @param keyword 姓名(模糊匹配)
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @return
+     */
+    @RequestMapping("/summaryData")
+    public HttpRespMsg summaryData(String keyword, String startDate, String endDate) {
+        String userId = request.getHeader("Token");
+        return leaveSheetService.summaryData(keyword, startDate, endDate, userId);
+
+    }
+}
+

+ 42 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/OperationLogController.java

@@ -0,0 +1,42 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.OperationLog;
+import com.management.platform.mapper.OperationLogMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-04-07
+ */
+@RestController
+@RequestMapping("/operation-log")
+public class OperationLogController {
+
+    @Resource
+    OperationLogMapper operationLogMapper;
+
+    /*
+    获取操作日志
+     */
+    @RequestMapping("list")
+    public HttpRespMsg list(Integer pageIndex, Integer pageSize) {
+        HttpRespMsg msg = new HttpRespMsg();
+        QueryWrapper<OperationLog> queryWrapper = new QueryWrapper<>();
+        queryWrapper.orderByDesc("id");
+        msg.data = operationLogMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
+        return msg;
+    }
+}
+

+ 20 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ParticipationController.java

@@ -0,0 +1,20 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 人员参与项目的情况 前端控制器
+ * </p>
+ *
+ * @author 屈跃庭
+ * @since 2020-02-12
+ */
+@RestController
+@RequestMapping("/participation")
+public class ParticipationController {
+
+}
+

+ 48 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/PdfFileController.java

@@ -0,0 +1,48 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.PdfFile;
+import com.management.platform.service.PdfFileService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-04-27
+ */
+@RestController
+@RequestMapping("/pdf-file")
+public class PdfFileController {
+    @Resource
+    private PdfFileService pdfFileService;
+
+    /**
+     * 获取项目文档
+     * @param fileId
+     * @return
+     */
+    @RequestMapping("/getProjectFile")
+    public HttpRespMsg getProjectFile(Integer fileId) {
+        List<PdfFile> pdfFileList = pdfFileService.list(new QueryWrapper<PdfFile>().eq("type", 1).eq("file_id", fileId));
+        HttpRespMsg msg = new HttpRespMsg();
+        if (pdfFileList.size() > 0) {
+            msg.data = pdfFileList.get(0).getPdfUrl();
+        } else {
+            msg.setError("该格式不支持在线预览");
+        }
+
+        return msg;
+    }
+}
+

+ 96 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/PermissionController.java

@@ -0,0 +1,96 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.SysRole;
+import com.management.platform.service.PermissionService;
+import com.management.platform.service.SysRoleService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author Reiskuchen
+ * @since 2019-10-28
+ */
+@RestController
+@RequestMapping("/permission")
+public class PermissionController {
+    @Autowired
+    private PermissionService permissionService;
+    @Resource
+    private HttpServletRequest httpServletRequest;
+    @Resource
+    private SysRoleService sysRoleService;
+
+    @RequestMapping("/getFrontRoleList")
+    public HttpRespMsg getFrontRoleList(Integer companyId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<SysRole> list = sysRoleService.list(new QueryWrapper<SysRole>().eq("company_id", companyId));
+        msg.data = list.stream().filter(item->!item.getRolename().equals("超级管理员")).collect(Collectors.toList());
+        return msg;
+    }
+
+    @RequestMapping("/getCrewByPage")
+    public HttpRespMsg getCrewByPage(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return permissionService.getCrewByPage(pageIndex, pageSize);
+    }
+
+    @RequestMapping("/switchRole")
+    public HttpRespMsg switchRole(@RequestParam Integer[] ids, @RequestParam Integer roleId) {
+        return permissionService.switchRole(ids, roleId, httpServletRequest);
+    }
+
+    @RequestMapping("/getSimpleUserList")
+    public HttpRespMsg getSimpleUserList() {
+        return permissionService.getSimpleUserList();
+    }
+
+    @RequestMapping("/getRoleList")
+    public HttpRespMsg getRoleList(Integer companyId) {
+        return permissionService.getRoleList(companyId);
+    }
+
+    @RequestMapping("/editRole")
+    public HttpRespMsg editRole(Integer id, @RequestParam String name, @RequestParam String description, Integer companyId) {
+        return permissionService.editRole(id, name, description, companyId);
+    }
+
+    @RequestMapping("/setDefaultRole")
+    public HttpRespMsg setDefaultRole(Integer id, Integer companyId) {
+        return permissionService.setDefaultRole(id, companyId);
+    }
+
+    @RequestMapping("/deleteRole")
+    public HttpRespMsg deleteRole(@RequestParam Integer id) {
+        return permissionService.deleteRole(id);
+    }
+
+    @RequestMapping("/getAuthority")
+    public HttpRespMsg getAuthority(@RequestParam Integer role, @RequestParam Integer companyId) {
+        return permissionService.getAuthority(role, companyId);
+    }
+
+    @RequestMapping("/switchAuthority")
+    public HttpRespMsg switchAuthority(@RequestParam Integer role, @RequestParam Integer id) {
+        return permissionService.switchAuthority(role, id);
+    }
+
+    @RequestMapping(value = "/savePermission", method = RequestMethod.POST)
+    public HttpRespMsg savePermission(@RequestParam Integer role, @RequestParam String moduleList) {
+        return permissionService.savePermission(role, moduleList);
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/PicContentKeywordsController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 屈跃庭
+ * @since 2020-01-08
+ */
+@RestController
+@RequestMapping("/pic-content-keywords")
+public class PicContentKeywordsController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/PpMembsController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-28
+ */
+@RestController
+@RequestMapping("/pp-membs")
+public class PpMembsController {
+
+}
+

+ 115 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProfessionController.java

@@ -0,0 +1,115 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.ProfessionMapper;
+import com.management.platform.mapper.ProjectProfessionMapper;
+import com.management.platform.mapper.ReportProfessionProgressMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-28
+ */
+@RestController
+@RequestMapping("/profession")
+public class ProfessionController {
+    @Resource
+    HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ProfessionMapper professionMapper;
+    @Resource
+    ReportProfessionProgressMapper reportProfessionProgressMapper;
+    @Resource
+    ProjectProfessionMapper projectProfessionMapper;
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(Profession info) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        if (info.getId() == null) {
+            info.setCompanyId(user.getCompanyId());
+            professionMapper.insert(info);
+        } else {
+            info.setCompanyId(user.getCompanyId());
+            professionMapper.updateById(info);
+            //更新项目专业表中的专业名称
+            ProjectProfession p = new ProjectProfession();
+            p.setProfessionName(info.getName());
+            projectProfessionMapper.update(p, new QueryWrapper<ProjectProfession>().eq("profession_id", info.getId()));
+        }
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        //检查,该专业是否已经被日报使用
+        Integer cnt = reportProfessionProgressMapper.selectCount(new QueryWrapper<ReportProfessionProgress>().eq("profession_id", id));
+        if (cnt > 0) {
+            msg.setError("该专业已经存在相关日报,无法删除");
+        } else {
+            int r = professionMapper.delete(new QueryWrapper<Profession>().eq("id", id).eq("company_id", user.getCompanyId()));
+            if (r <= 0) {
+                msg.setError("无权删除");
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String keyword) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        QueryWrapper<Profession> queryWrapper = new QueryWrapper<Profession>().eq("company_id", user.getCompanyId()).orderByDesc("id");
+        if (!StringUtils.isEmpty(keyword)) {
+            queryWrapper.like("name", keyword);
+        }
+        IPage<Profession> projectIPage = professionMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<Profession> list = projectIPage.getRecords();
+        Long total = projectIPage.getTotal();
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", list);
+        map.put("total", total);
+        msg.data = map;
+        return msg;
+    }
+
+    @RequestMapping("/getAll")
+    public HttpRespMsg getAll() {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<Profession> all = professionMapper.selectList(new QueryWrapper<Profession>().eq("company_id", user.getCompanyId()));
+        msg.data = all;
+        return msg;
+    }
+}
+

+ 40 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectAuditorController.java

@@ -0,0 +1,40 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectAuditor;
+import com.management.platform.mapper.ProjectAuditorMapper;
+import com.management.platform.service.ProjectAuditorService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-13
+ */
+@RestController
+@RequestMapping("/project-auditor")
+public class ProjectAuditorController {
+
+    @Resource
+    private ProjectAuditorMapper projectAuditorMapper;
+
+    @RequestMapping("/getList")
+    private HttpRespMsg getList(Integer projectId) {
+        List<ProjectAuditor> auditorList = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", projectId));
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = auditorList;
+        return msg;
+    }
+}
+

+ 69 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectBasecostController.java

@@ -0,0 +1,69 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.ProjectBasecostSetting;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.ProjectBasecostMapper;
+import com.management.platform.mapper.ProjectBasecostSettingMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-02
+ */
+@RestController
+@RequestMapping("/project-basecost")
+public class ProjectBasecostController {
+
+    @Resource
+    ProjectBasecostMapper projectBasecostMapper;
+    @Resource
+    ProjectBasecostSettingMapper projectBasecostSettingMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    HttpServletRequest request;
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectBasecost> list = projectBasecostMapper.selectList(new QueryWrapper<ProjectBasecost>().eq("project_id", projectId));
+        //检查最新的字段是否有
+        User user = userMapper.selectById(request.getHeader("TOKEN"));
+        List<ProjectBasecostSetting> allSettings = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", user.getCompanyId()));
+        List<ProjectBasecost> additionalList = new ArrayList<>();
+        allSettings.forEach(all->{
+            if (!list.stream().filter(costItem->costItem.getBaseId().equals(all.getId())).findAny().isPresent()) {
+                ProjectBasecost add = new ProjectBasecost();
+                add.setBaseName(all.getName());
+                add.setBaseId(all.getId());
+                add.setProjectId(projectId);
+                add.setBaseAmount(0.0);
+                additionalList.add(add);
+            }
+        });
+        if (additionalList.size() > 0) {
+            list.addAll(additionalList);
+        }
+        msg.data = list;
+        return msg;
+    }
+
+
+}
+

+ 120 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectBasecostSettingController.java

@@ -0,0 +1,120 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.constant.Constant;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.ProjectBasecostSetting;
+import com.management.platform.mapper.ProjectBasecostMapper;
+import com.management.platform.mapper.ProjectBasecostSettingMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-02
+ */
+@RestController
+@RequestMapping("/project-basecost-setting")
+public class ProjectBasecostSettingController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ProjectBasecostSettingMapper projectBasecostSettingMapper;
+
+    @Resource
+    ProjectBasecostMapper projectBasecostMapper;
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(ProjectBasecostSetting setting) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (StringUtils.isEmpty(setting.getName())) {
+            msg.setError("名称不能为空");
+            return msg;
+        }
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (setting.getId() == null) {
+            setting.setCompanyId(companyId);
+            int count = projectBasecostSettingMapper.selectCount(new QueryWrapper<ProjectBasecostSetting>().eq("name", setting.getName()).eq("company_id", setting.getCompanyId()));
+            if (count > 0) {
+                msg.setError("该名称已存在");
+            } else {
+                projectBasecostSettingMapper.insert(setting);
+                msg.data = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+            }
+        } else {
+            int count = projectBasecostSettingMapper.selectCount(new QueryWrapper<ProjectBasecostSetting>().eq("name", setting.getName())
+                    .eq("company_id", companyId).ne("id", setting.getId()));
+            if (count > 0) {
+                msg.setError("该名称已存在");
+            } else {
+                //检查名称是否有变化
+                ProjectBasecostSetting oldSetting = projectBasecostSettingMapper.selectById(setting.getId());
+                if (!setting.getName().equals(oldSetting.getName())) {
+                    projectBasecostSettingMapper.updateById(setting);
+                    ProjectBasecost cost = new ProjectBasecost();
+                    cost.setBaseName(setting.getName());
+                    projectBasecostMapper.update(cost, new QueryWrapper<ProjectBasecost>().eq("base_id", setting.getId()));
+                }
+                msg.data = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list() {
+        HttpRespMsg msg = new HttpRespMsg();
+
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        List<ProjectBasecostSetting> list = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+        if (list.size() == 0) {
+            //生成项目的成本基线默认条目
+            String[] array = Constant.DEFAULT_BASE_COST_ITEMS;
+            for (String baseItem : array) {
+                ProjectBasecostSetting setting = new ProjectBasecostSetting();
+                setting.setName(baseItem);
+                setting.setCompanyId(companyId);
+                projectBasecostSettingMapper.insert(setting);
+            }
+            list = projectBasecostSettingMapper.selectList(new QueryWrapper<ProjectBasecostSetting>().eq("company_id", companyId));
+        }
+        msg.data = list;
+
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        ProjectBasecostSetting projectBasecostSetting = projectBasecostSettingMapper.selectById(id);
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (!projectBasecostSetting.getCompanyId().equals(companyId)) {
+            msg.setError("无权操作");
+        } else {
+            projectBasecostSettingMapper.deleteById(id);
+        }
+
+        return msg;
+    }
+
+
+
+
+}
+

+ 106 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectCategoryController.java

@@ -0,0 +1,106 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectBasecost;
+import com.management.platform.entity.ProjectCategory;
+import com.management.platform.entity.ProjectCategory;
+import com.management.platform.mapper.*;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-24
+ */
+@RestController
+@RequestMapping("/project-category")
+public class ProjectCategoryController {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ProjectCategoryMapper projectCategoryMapper;
+
+    @Resource
+    ProjectMapper projectMapper;
+
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(ProjectCategory setting) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (StringUtils.isEmpty(setting.getName())) {
+            msg.setError("名称不能为空");
+            return msg;
+        }
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (setting.getId() == null) {
+            setting.setCompanyId(companyId);
+            int count = projectCategoryMapper.selectCount(new QueryWrapper<ProjectCategory>().eq("name", setting.getName()).eq("company_id", setting.getCompanyId()));
+            if (count > 0) {
+                msg.setError("该名称已存在");
+            } else {
+                projectCategoryMapper.insert(setting);
+                msg.data = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", companyId));
+            }
+        } else {
+            int count = projectCategoryMapper.selectCount(new QueryWrapper<ProjectCategory>().eq("name", setting.getName())
+                    .eq("company_id", companyId).ne("id", setting.getId()));
+            if (count > 0) {
+                msg.setError("该名称已存在");
+            } else {
+                //检查名称是否有变化
+                ProjectCategory oldSetting = projectCategoryMapper.selectById(setting.getId());
+                if (!setting.getName().equals(oldSetting.getName())) {
+                    projectCategoryMapper.updateById(setting);
+                    Project cost = new Project();
+                    cost.setCategoryName(setting.getName());
+                    projectMapper.update(cost, new QueryWrapper<Project>().eq("category", setting.getId()));
+                }
+                msg.data = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", companyId));
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/list")
+    public HttpRespMsg list() {
+        HttpRespMsg msg = new HttpRespMsg();
+
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        List<ProjectCategory> list = projectCategoryMapper.selectList(new QueryWrapper<ProjectCategory>().eq("company_id", companyId));
+        msg.data = list;
+
+        return msg;
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        ProjectCategory ProjectCategory = projectCategoryMapper.selectById(id);
+        Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+        if (!ProjectCategory.getCompanyId().equals(companyId)) {
+            msg.setError("无权操作");
+        } else {
+            projectCategoryMapper.deleteById(id);
+        }
+
+        return msg;
+    }
+
+}
+

+ 386 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -0,0 +1,386 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.Project;
+import com.management.platform.service.ProjectService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author 屈跃庭
+ * @since 2020-01-03
+ */
+@RestController
+@RequestMapping("/project")
+public class ProjectController {
+    @Autowired
+    private ProjectService projectService;
+    @Resource
+    private HttpServletRequest request;
+
+
+    /**
+     * 获取项目列表
+     */
+    @RequestMapping("/getProjectList")
+    public HttpRespMsg getProjectList() {
+        return projectService.getProjectList(request);
+    }
+
+    /**
+     * 分页获取项目列表
+     * pageIndex 页数
+     * pageSize 页面大小
+     */
+    @RequestMapping("/getProjectPage")
+    public HttpRespMsg getProjectPage(@RequestParam Integer pageIndex, @RequestParam Integer pageSize, String keyword,
+                                      @RequestParam(required = false, defaultValue = "1") Integer searchField,
+                                      Integer status, Integer category) {
+        return projectService.getProjectPage(pageIndex, pageSize, keyword,searchField, status, category, request);
+    }
+
+    /**
+     * 添加或编辑项目
+     * id 要编辑项目的id 可填
+     * name 项目的名称
+     * userId 用户id数组
+     */
+    @RequestMapping("/editProject")
+    public HttpRespMsg editProject(Integer id, @RequestParam String name, String code, String[] userId, String inchargerId,
+                                   Integer isPublic,
+                                   String planStartDate,
+                                   String planEndDate,
+                                   Integer level,
+                                   Double contractAmount,
+                                   Double budget,
+                                   Integer customerId,
+                                   String projectBaseCostData,
+                                   String chosenLeaders,
+                                   String associateDegrees,
+                                   String associateDegreeNames,
+                                   Integer taskGpIncharge,
+                                   String auditUserIds,
+                                   Integer category
+                                   ) {
+        return projectService.editProject(id, name, code, userId, inchargerId, isPublic, planStartDate, planEndDate, level, contractAmount,
+                projectBaseCostData,
+                 budget,customerId,chosenLeaders, associateDegrees, associateDegreeNames, taskGpIncharge,auditUserIds, category, request);
+    }
+
+    @RequestMapping("/adjustBase")
+    public HttpRespMsg adjustBase(String baseCostData, Project project, String remark
+    ) {
+        return projectService.adjustBase(baseCostData, project, remark, request);
+    }
+
+
+    /**
+     * 更新项目进度
+     * @param id
+     * @param progress
+     * @return
+     */
+    @RequestMapping("/updateProgress")
+    public HttpRespMsg updateProgress(Integer id,
+                                   Integer progress) {
+
+        return projectService.updateProgress(id, progress,request);
+    }
+
+    @RequestMapping("/updateStatus")
+    public HttpRespMsg updateStatus(Integer id,
+                                      Integer status, LocalDate finishDate) {
+
+        return projectService.updateStatus(id, status,finishDate, request);
+    }
+
+
+    /**
+     * 删除项目
+     * id 要删除的项目的id
+     */
+    @RequestMapping("/deleteProject")
+    public HttpRespMsg deleteProject(@RequestParam Integer id, @RequestParam(required = false, defaultValue = "0") Integer force) {
+        return projectService.deleteProject(id, force);
+    }
+
+    /**
+     * 获取查询者所在公司每个项目的工时成本
+     */
+    @RequestMapping("/getTimeCost")
+    public HttpRespMsg getTimeCost(String startDate, String endDate, String userId) {
+        return projectService.getTimeCost(startDate, endDate, userId, request);
+    }
+
+    /**
+     * 导出查询者所在公司每个项目的工时成本
+     */
+    @RequestMapping("/exportTimeCost")
+    public HttpRespMsg exportTimeCost(String startDate, String endDate, Integer projectId, String userId, Boolean projectSum) {
+        return projectService.exportTimeCost(startDate, endDate, projectId, userId, projectSum, request);
+    }
+
+    /**
+     * 获取查询者所在公司每个项目的自定义数值累计
+     */
+    @RequestMapping("/getCustomDataSum")
+    public HttpRespMsg getCustomDataSum(String startDate, String endDate, String userId) {
+        return projectService.getCustomDataSum(startDate, endDate, userId, request);
+    }
+
+    @RequestMapping("/exportCustomDataSum")
+    public HttpRespMsg exportCustomDataSum(String startDate, String endDate, Integer projectId, String userId) {
+        return projectService.exportCustomDataSum(startDate, endDate, projectId, userId, request);
+    }
+
+    /**
+     * 获取某个项目每个人分别需要的工时
+     * id 项目id
+     */
+    @RequestMapping("/getProjectCost")
+    public HttpRespMsg getProjectCost(String startDate, String endDate, @RequestParam Integer id) {
+        return projectService.getProjectCost(startDate, endDate, id, request);
+    }
+
+    /**
+     * 获取项目内的阶段汇总统计工时成本
+     * @param startDate
+     * @param endDate
+     * @param id 项目id
+     * @return
+     */
+    @RequestMapping("/getCostInStage")
+    public HttpRespMsg getCostInStage(String startDate, String endDate, @RequestParam Integer id) {
+        return projectService.getCostInStage(startDate, endDate, id, request);
+    }
+
+    @RequestMapping("/getAllMembCost")
+    public HttpRespMsg getAllMembCost(String startDate, String endDate, Integer id) {
+        return projectService.getAllMembCost(startDate, endDate, id, request);
+    }
+
+    /**
+     * 获取项目详细信息
+     * @param id
+     * @return
+     */
+    @RequestMapping("/detail")
+    public HttpRespMsg detail(@RequestParam Integer id) {
+        return projectService.detail(id, request);
+    }
+
+    /**
+     * 项目统计任务数量分布
+     * @param id
+     * @return
+     */
+    @RequestMapping("/taskSum")
+    public HttpRespMsg taskSum(@RequestParam Integer id) {
+        return projectService.taskSum(id, request);
+    }
+
+    @RequestMapping("/finish")
+    public HttpRespMsg finish(Integer id) {
+        Project project = new Project();
+        project.setId(id);
+        project.setStatus(2);
+        project.setFinishDate(LocalDate.now());
+        projectService.updateById(project);
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/cancel")
+    public HttpRespMsg cancel(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        Project old = projectService.getById(id);
+        if (old.getStatus() == 2) {
+            msg.setError("该项目已完成,无法撤销");
+        } else {
+            Project project = new Project();
+            project.setId(id);
+            project.setStatus(3);
+            projectService.updateById(project);
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/start")
+    public HttpRespMsg start(Integer id) {
+        projectService.restartProject(id);
+        return new HttpRespMsg();
+    }
+
+    @RequestMapping("/addMemb")
+    public HttpRespMsg addMemb(Integer id, String[] userId) {
+        return projectService.addMemb(id, userId);
+    }
+
+    @RequestMapping("/exportProfit")
+    public HttpRespMsg exportProfit() {
+        return projectService.exportProfit(request);
+    }
+
+    //导出项目报表
+    @RequestMapping("/exportProject")
+    public HttpRespMsg exportProject() {
+        return projectService.exportProject(request);
+    }
+
+    //分页查询项目任务报表
+    @RequestMapping("/getProjectTask")
+    public HttpRespMsg getProjectTask(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return projectService.getProjectTask(pageIndex, pageSize, request);
+    }
+
+    //分页查询项目各个阶段的汇总工时成本
+    @RequestMapping("/getProjectStagesCost")
+    public HttpRespMsg getProjectStagesCost(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return projectService.getProjectStagesCost(pageIndex, pageSize, request);
+    }
+    @RequestMapping("/exportProjectStagesCost")
+    public HttpRespMsg exportProjectStagesCost() {
+        return projectService.exportProjectStagesCost(request);
+    }
+    //导出项目任务报表
+    @RequestMapping("/exportProjectTask")
+    public HttpRespMsg exportProjectTask() {
+        return projectService.exportProjectTask(request);
+    }
+
+    //分页查询项目成本报表
+    @RequestMapping("/getAllProjectCost")
+    public HttpRespMsg getAllProjectCost(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return projectService.getAllProjectCost(pageIndex, pageSize, request);
+    }
+    //导出项目成本报表
+    @RequestMapping("/exportAllProjectCost")
+    public HttpRespMsg exportAllProjectCost() {
+        return projectService.exportAllProjectCost(request);
+    }
+
+
+    //分页查询项目收支平衡表
+    @RequestMapping("/getProjectInAndOut")
+    public HttpRespMsg getProjectInAndOut(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return projectService.getProjectInAndOut(pageIndex, pageSize, request);
+    }
+
+
+    //导出项目收支平衡表
+    @RequestMapping("/exportProjectInAndOut")
+    public HttpRespMsg exportProjectInAndOut() {
+        return projectService.exportProjectInAndOut(request);
+    }
+
+    //分页查询客户项目统计报表
+    @RequestMapping("/getCustomerProjectInAndOut")
+    public HttpRespMsg getCustomerProjectInAndOut(@RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        return projectService.getCustomerProjectInAndOut(pageIndex, pageSize, request);
+    }
+    //导出项目收支平衡表
+    @RequestMapping("/exportCustomerProjectInAndOut")
+    public HttpRespMsg exportCustomerProjectInAndOut() {
+        return projectService.exportCustomerProjectInAndOut(request);
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(String userId, MultipartFile file, HttpServletRequest request) {
+        return projectService.importData(userId, file, request);
+    }
+
+    @RequestMapping("/getGanttData")
+    public HttpRespMsg getGanttData(@RequestParam(required = false, defaultValue = "0") Integer type, String startDate, String endDate, String userId, Integer projectId, HttpServletRequest request) {
+        return projectService.getGanttData(type, startDate, endDate, userId, projectId, request);
+    }
+
+    /**
+     *
+     * @param projectId 项目id, 非必传
+     * @param startDate 开始日期 必传
+     * @param endDate  结束日期 必传
+     * @return
+     */
+    @RequestMapping("/getOvertimeList")
+    public HttpRespMsg getOvertimeList(Integer projectId, String startDate, String endDate) {
+        return projectService.getOvertimeList(projectId, startDate, endDate, request);
+    }
+
+
+    /**
+     * 导出加班统计报表
+     * @param projectId
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    @RequestMapping("/exportOvertimeList")
+    public HttpRespMsg exportOvertimeList(Integer projectId, String startDate, String endDate) {
+        return projectService.exportOvertimeList(projectId, startDate, endDate, request);
+    }
+
+    /**
+     * 获取项目相关的维度数据列表
+     * @param projectId
+     * @return
+     */
+    @RequestMapping("/getDegreeList")
+    public HttpRespMsg getDegreeList(Integer projectId) {
+        Project project = projectService.getById(projectId);
+        String associateDegrees = project.getAssociateDegrees();
+        String names = project.getAssociateDegreeNames();
+        HttpRespMsg msg = new HttpRespMsg();
+        List<HashMap> list = new ArrayList<>();
+        if (!StringUtils.isEmpty(associateDegrees)) {
+            String[] id = associateDegrees.split("\\,");
+            String[] n = names.split("\\,");
+            for (int i=0;i<id.length; i++) {
+                HashMap map = new HashMap();
+                map.put("id", id[i]);
+                map.put("name", n[i]);
+                list.add(map);
+            }
+        }
+        msg.data = list;
+        return msg;
+    }
+
+    /**
+     * 获取查询者所在公司每个自定义维度的工时成本
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @param projectId 项目id, 可不传
+     */
+    @RequestMapping("/getDegreeCost")
+    public HttpRespMsg getDegreeCost(String startDate, String endDate, Integer projectId) {
+        return projectService.getDegreeCost(startDate, endDate, projectId, request);
+    }
+
+    @RequestMapping("exportData")
+    public HttpRespMsg exportData() {
+        return projectService.exportData(request);
+    }
+
+    @RequestMapping("/getMyUsers")
+    public HttpRespMsg getMyUsers() {
+        return projectService.getMyUsers(request);
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectDocfolderController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-04-19
+ */
+@RestController
+@RequestMapping("/project-docfolder")
+public class ProjectDocfolderController {
+
+}
+

+ 321 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectDocumentController.java

@@ -0,0 +1,321 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.constant.Constant;
+import com.management.platform.entity.PdfFile;
+import com.management.platform.entity.ProjectDocfolder;
+import com.management.platform.entity.ProjectDocument;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.PdfFileMapper;
+import com.management.platform.mapper.ProjectDocfolderMapper;
+import com.management.platform.mapper.ProjectDocumentMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProjectDocumentService;
+import com.management.platform.util.DocumentTypeUtil;
+import com.management.platform.util.FileUtil;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.OpenOfficeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-04-19
+ */
+@RestController
+@RequestMapping("/document")
+public class ProjectDocumentController {
+    @Resource
+    private HttpServletRequest request;
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProjectDocumentMapper projectDocumentMapper;
+    @Resource
+    private ProjectDocumentService projectDocumentService;
+    @Resource
+    private ProjectDocfolderMapper projectDocfolderMapper;
+    @Resource
+    private PdfFileMapper pdfFileMapper;
+    @Value("${upload.path}")
+    private String uploadPath;
+
+    /**
+     * 上传文件
+     * @param projectId 项目id
+     * @param folderId 文件夹id
+     * @param files 上传的文件
+     * @param response
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value="uploadDocument")
+    public HttpRespMsg uploadDocument(
+            @RequestParam Integer projectId,
+            @RequestParam(required=false) Integer folderId,
+            @RequestParam("file") MultipartFile[] files,
+            HttpServletResponse response) throws Exception {
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = (User) userMapper.selectById(request.getHeader("Token"));
+
+//        OpenOfficeService openOfficeService = new OpenOfficeService();
+//        List<Part> partLists = partMapper.selectList(new QueryWrapper<Part>().eq("mould_id", userVO.getMouldId()));
+//        openOfficeService.start();
+        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
+        for (MultipartFile file : files) {
+            ProjectDocument record = new ProjectDocument();
+            record.setCreatorId(user.getId());
+            record.setCreatorName(user.getName());
+            record.setDocumentName(file.getOriginalFilename());
+            record.setFolderId(folderId);
+            record.setProjectId(projectId);
+            if (file != null && !file.isEmpty()) {
+                //截取文件后缀
+                String fileSuffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
+                record.setDocumentType(DocumentTypeUtil.DocumentType(fileSuffix));
+                //处理文件
+                File dir = new File(uploadPath);
+                if (!dir.exists()) {
+                    dir.mkdir();
+                }
+                String fileName= "";
+                if (file!=null && !file.isEmpty()) {
+                    fileName = file.getOriginalFilename();
+
+                    int pos = fileName.lastIndexOf(".");
+                    String suffix = fileName.substring(pos).toLowerCase();
+                    //用uuid替换原始的文件名
+                    String purFName = UUID.randomUUID().toString().replaceAll("-", "");
+                    fileName = purFName + suffix;
+                    File saveFile = new File(dir, fileName);
+                    try {
+                        saveFile.createNewFile();
+                        file.transferTo(saveFile);
+                        //计算文件大小
+                        long fileSize = saveFile.length();
+                        String fileLength = FileUtil.getReadableFileSize(fileSize);
+                        record.setServerName(uploadPath + fileName);
+                        record.setSize(fileLength);
+                        String pathPrefix = "/upload/";
+                        record.setUrl(pathPrefix + fileName);
+                        //上传图片到OSS
+//                        OSSClient ossClient=AliyunOSSClientUtil.getOSSClient();
+//                        String md5key = AliyunOSSClientUtil.uploadObject2OSS(ossClient, saveFile, OSSClientConstants.BUCKET_NAME, OSSClientConstants.FOLDER);
+//                        String url = AliyunOSSClientUtil.getFullUrl(fileName);
+//                        record.setUrl(url);
+                        projectDocumentMapper.insert(record);
+                        String path = uploadPath;
+//                        if (OpenOfficeService.canTransferToPdf(suffix)) {
+//                            //上传完,需要生成pdf
+//                            String dFile1 = path + UUID.randomUUID().toString().replaceAll("-", "") + ".pdf";
+//                            File newFile = new File(dFile1);
+//                            if (!newFile.exists()) {
+//                                openOfficeService.office2PDF(path + fileName, dFile1);
+//                                PdfFile pdfFile = new PdfFile();
+//                                pdfFile.setPdfUrl(pathPrefix + dFile1.substring(path.length()));
+//                                pdfFile.setFileId(record.getId());
+//                                pdfFile.setType(1);
+//                                pdfFile.setSourceFileUrl(record.getUrl());
+//                                pdfFileMapper.insert(pdfFile);
+//                            }
+//                        }
+
+                        //生成原文件名称与服务器文件名称对应
+                        msg.data = record;
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                        fileName = null;
+                        msg.setError(e.getMessage()+", path="+dir.getAbsolutePath());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        fileName = null;
+                        msg.setError(e.getMessage()+", path="+dir.getAbsolutePath());
+                    }
+                } else {
+                    msg.setError("文件不存在");
+                }
+            }
+        }
+
+        return msg;
+    }
+    //在线预览
+    //inputFilePath 文件路径
+    @RequestMapping(value="onlineShow")
+    public HttpRespMsg onlineShow(@RequestParam String inputFilePath) {
+        String destFileName = inputFilePath.substring(0, inputFilePath.lastIndexOf(".")+1)+"pdf";
+        File dir = new File(uploadPath);
+        if (!dir.exists()) {
+            dir.mkdir();
+        }
+
+        HttpRespMsg msg = new HttpRespMsg();
+        Map<String,String> map = new HashMap<String,String>();
+        File destFile = new File(dir, destFileName);
+        if(destFile.exists()) {
+            //文件已存在直接显示
+            map.put("pdfFileName", uploadPath + destFile.getName());
+        }else {
+            //文件不存在,转化后显示
+            OpenOfficeService service = new OpenOfficeService();
+            service.start();
+            File inputFile = new File(dir, inputFilePath);
+            Integer state = service.office2PDF(inputFile.getAbsolutePath(),destFile.getAbsolutePath());
+            if(state == 0){
+                //转换成功
+                map.put("pdfFileName", uploadPath + destFile.getName());
+            }else {
+                //转换失败
+            }
+            service.shutdown();
+        }
+        msg.data = map;
+        return msg;
+    }
+    @RequestMapping(value="delete")
+    public HttpRespMsg delDocument(@RequestParam Integer id, Integer isFolder) {
+        ProjectDocument record = new ProjectDocument();
+        record.setId(id);
+        record.setIsDeleted(1);
+        projectDocumentMapper.updateById(record);
+        //全部子文件都移到回收站
+        if (isFolder == 1) {
+            deleteSubFiles(record);
+        }
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data="删除成功";
+        return msg;
+    }
+
+    private void deleteSubFiles(ProjectDocument record) {
+        List<ProjectDocument> projectDocumentList = projectDocumentMapper.selectList(new QueryWrapper<ProjectDocument>().eq("folder_id", record.getId()));
+        projectDocumentList.forEach(p->{
+            //删除自己
+            ProjectDocument d = new ProjectDocument();
+            d.setId(p.getId());
+            d.setIsDeleted(1);
+            projectDocumentMapper.updateById(d);
+
+            if (p.getIsFolder() == 1) {
+                deleteSubFiles(p);
+            }
+        });
+    }
+
+    @RequestMapping(value="createDocument")
+    public HttpRespMsg createDocument(Integer id, Integer projectId, String documentName, Integer folderId, Integer isFolder) {
+        User user = userMapper.selectById(request.getHeader("Token"));
+        ProjectDocument record = new ProjectDocument();
+        record.setId(id);
+        record.setIsFolder(isFolder);
+        record.setDocumentName(documentName);
+        record.setFolderId(folderId);
+        record.setProjectId(projectId);
+        record.setCreatorId(user.getId());
+        record.setCreatorName(user.getName());
+        projectDocumentService.saveOrUpdate(record);
+        HttpRespMsg msg = new HttpRespMsg();
+        return msg;
+    }
+
+    /**
+     * 最近更新文件列表
+     * projectId 项目id
+     */
+    @RequestMapping(value="recentlyList")
+    public HttpRespMsg getRecentlyList(@RequestParam String projectId) {
+        QueryWrapper<ProjectDocument> exp = new QueryWrapper<ProjectDocument>();
+        exp.eq("project_id", projectId).eq("is_deleted", 0).eq("is_folder", 0).orderByDesc("indate").last("limit 20");
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = projectDocumentMapper.selectList(exp);
+        return msg;
+    }
+    /**
+     * 所有文件列表
+     * projectId 项目id
+     */
+    @RequestMapping(value="allList")
+    public HttpRespMsg getAllList(Integer projectId, Integer parentFid) {
+        //检查,如果是首次使用没有数据,需要创建数据
+        String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+        if (parentFid == null) {
+            QueryWrapper<ProjectDocument> firstQuery = new QueryWrapper<ProjectDocument>();
+            firstQuery.eq("project_id", projectId);
+            if (projectDocumentMapper.selectCount(firstQuery) == 0) {
+                String[] names = new String[]{"立项准备材料","项目过程文档","项目交付件"};
+                for (String name : names) {
+                    ProjectDocument doc = new ProjectDocument();
+                    doc.setProjectId(projectId);
+                    doc.setIsFolder(1);
+                    doc.setDocumentName(name);
+                    doc.setCreatorId(userId);
+                    doc.setCreatorName(user.getName());
+                    projectDocumentMapper.insert(doc);
+                }
+            }
+        }
+
+
+        QueryWrapper<ProjectDocument> exp = new QueryWrapper<ProjectDocument>();
+        exp.eq("project_id", projectId).ne("is_deleted",1);
+
+        if (parentFid != null) {
+            exp.eq("folder_id", parentFid);
+        } else {
+            exp.isNull("folder_id");
+        }
+        exp.orderByDesc("is_folder","indate");
+        List<ProjectDocument> docList = projectDocumentMapper.selectList(exp);
+        Map<String,Object> map = new HashMap<String,Object>();
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data=docList;
+        return msg;
+    }
+    /**
+     * 子文件及文件夹列表
+     * projectId 项目id
+     */
+    @RequestMapping(value="sonList")
+    public HttpRespMsg getsonList(@RequestParam("parentFid") Integer folderId, @RequestParam String projectId) {
+        QueryWrapper<ProjectDocument> exp = new QueryWrapper<ProjectDocument>();
+        exp.eq("project_id", projectId).ne("is_deleted",1).eq("folder_id", folderId);
+        exp.orderByDesc("indate");
+        List<ProjectDocument> docList = projectDocumentMapper.selectList(exp);
+        QueryWrapper<ProjectDocfolder> gde = new QueryWrapper<ProjectDocfolder>();
+        gde.eq("project_id", projectId).eq("parent_fid", folderId);
+        gde.orderByDesc("update_time");
+        List<ProjectDocfolder> folderList = projectDocfolderMapper.selectList(gde);
+        Map<String,Object>map = new HashMap<String,Object>();
+        map.put("docList", docList);
+        map.put("folderList", folderList);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data=map;
+        return msg;
+    }
+}
+

+ 72 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectNotifyUserController.java

@@ -0,0 +1,72 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectNotifyUser;
+import com.management.platform.service.ProjectNotifyUserService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-09-01
+ */
+@RestController
+@RequestMapping("/project-notify-user")
+public class ProjectNotifyUserController {
+    @Resource
+    ProjectNotifyUserService projectNotifyUserService;
+
+    @RequestMapping("/modify")
+    public HttpRespMsg add(Integer projectId, String chosenLeaders) {
+        HttpRespMsg msg = new HttpRespMsg();
+        projectNotifyUserService.remove(new QueryWrapper<ProjectNotifyUser>().eq("project_id", projectId));
+
+        if (chosenLeaders != null && chosenLeaders.length() > 0) {
+            JSONArray array = JSONArray.parseArray(chosenLeaders);
+            List<ProjectNotifyUser> notifyUsers = new ArrayList<>();
+            for (int i = 0;i<array.size(); i++) {
+                JSONObject jsonObject = array.getJSONObject(i);
+                ProjectNotifyUser projectNotifyUser = JSONObject.toJavaObject(jsonObject, ProjectNotifyUser.class);
+                projectNotifyUser.setProjectId(projectId);
+                notifyUsers.add(projectNotifyUser);
+            }
+            projectNotifyUserService.saveBatch(notifyUsers);
+        }
+        return msg;
+
+    }
+
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        boolean success = projectNotifyUserService.removeById(id);
+        if (!success) {
+            msg.setError("记录不存在,操作失败");
+        }
+        return msg;
+    }
+
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data= projectNotifyUserService.list(new QueryWrapper<ProjectNotifyUser>().eq("project_id", projectId));
+        return msg;
+    }
+
+
+
+}
+

+ 45 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectPercentageController.java

@@ -0,0 +1,45 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.service.ProjectPercentageService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-02-26
+ */
+@RestController
+@RequestMapping("/project-percentage")
+public class ProjectPercentageController {
+
+    @Resource
+    private ProjectPercentageService projectPercentageService;
+
+    @RequestMapping("/saveMonthSetting")
+    public HttpRespMsg saveMonthSetting(String projectCols, String userSettings, String ymonth) {
+        return projectPercentageService.saveMonthSetting(projectCols, userSettings, ymonth);
+    }
+
+    @RequestMapping("/getMonthSetting")
+    public HttpRespMsg getMonthSetting(String ymonth) {
+        return projectPercentageService.getMonthSetting(ymonth);
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(Integer companyId, Integer withCheckIn,
+                                  MultipartFile file, HttpServletRequest request){
+        return projectPercentageService.importData(companyId,withCheckIn, file, request);
+    }
+}
+

+ 57 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectProfessionController.java

@@ -0,0 +1,57 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.PpMembs;
+import com.management.platform.entity.ProjectProfession;
+import com.management.platform.mapper.ProjectProfessionMapper;
+import com.management.platform.service.ProjectProfessionService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-28
+ */
+@RestController
+@RequestMapping("/project-profession")
+public class ProjectProfessionController {
+    @Resource
+    ProjectProfessionService projectProfessionService;
+    @RequestMapping("/modify")
+    public HttpRespMsg modify(Integer projectId, String json) {
+        projectProfessionService.modify(projectId, json);
+        return projectProfessionService.get(projectId);
+    }
+
+    //获取项目相关的工程专业列表
+    @RequestMapping("/get")
+    public HttpRespMsg get(Integer projectId) {
+        return projectProfessionService.get(projectId);
+    }
+
+    //获取项目相关的工程专业列表
+    @RequestMapping("/getMyProfession")
+    public HttpRespMsg getMyProfession(Integer projectId) {
+        return projectProfessionService.getMyProfession(projectId);
+    }
+
+    @RequestMapping("/getProgressData")
+    public HttpRespMsg getProgressData(Integer projectId) {
+        return projectProfessionService.getProgressData(projectId);
+    }
+
+}
+

+ 148 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectTimerController.java

@@ -0,0 +1,148 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectTimer;
+import com.management.platform.entity.Report;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.ProjectTimerMapper;
+import com.management.platform.mapper.ReportMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProjectService;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.log4j.helpers.DateTimeDateFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-03-17
+ */
+@RestController
+@RequestMapping("/project-timer")
+public class ProjectTimerController {
+    @Resource
+    private ProjectTimerMapper projectTimerMapper;
+    @Resource
+    private ReportMapper reportMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private HttpServletRequest request;
+
+    /**
+     * 获取定时器
+     */
+    @RequestMapping("/getMyTimer")
+    public HttpRespMsg getMyTimer() {
+        QueryWrapper<ProjectTimer> query = new QueryWrapper<ProjectTimer>();
+        String userId = request.getHeader("Token");
+
+        query.eq("user_id", userId);
+        query.orderByDesc("id");
+        HttpRespMsg msg = new HttpRespMsg();
+        List<ProjectTimer> list = projectTimerMapper.selectList(query);
+        LocalDateTime now = LocalDateTime.now();
+        list.forEach(t->{
+            if (t.getEndTime() == null) {
+                t.setTimer(now.toEpochSecond(ZoneOffset.ofHours(8)) - t.getStartTime().toEpochSecond(ZoneOffset.ofHours(8)));
+            } else {
+                t.setTimer(t.getEndTime().toEpochSecond(ZoneOffset.ofHours(8)) - t.getStartTime().toEpochSecond(ZoneOffset.ofHours(8)));
+            }
+        });
+        msg.data = list;
+        return msg;
+    }
+
+    @RequestMapping("/addTimer")
+    public HttpRespMsg addTimer(ProjectTimer timer) {
+        String userId = request.getHeader("Token");
+        timer.setUserId(userId);
+        timer.setStartTime(LocalDateTime.now());
+        projectTimerMapper.insert(timer);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = timer;
+        return msg;
+    }
+
+
+    @RequestMapping("/deleteTimer")
+    public HttpRespMsg deleteTimer(Integer id) {
+        String userId = request.getHeader("Token");
+        HttpRespMsg msg = new HttpRespMsg();
+        ProjectTimer timer = projectTimerMapper.selectById(id);
+        if (!timer.getUserId().equals(userId)) {
+            msg.setError("非创建人无权删除");
+        } else {
+            projectTimerMapper.deleteById(id);
+        }
+        return msg;
+    }
+
+
+    @RequestMapping("/endTimer")
+    public HttpRespMsg endTimer(Integer id) {
+        String userId = request.getHeader("Token");
+        HttpRespMsg msg = new HttpRespMsg();
+        ProjectTimer timer = projectTimerMapper.selectById(id);
+        if (!timer.getUserId().equals(userId)) {
+            msg.setError("非创建人无权结束");
+        } else {
+            timer.setEndTime(LocalDateTime.now());
+            projectTimerMapper.updateById(timer);
+            msg.data = timer;
+        }
+        return msg;
+    }
+
+    @RequestMapping("/tranferToReport")
+    public HttpRespMsg tranferToReport(Integer id, String content) {
+        String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+        HttpRespMsg msg = new HttpRespMsg();
+        ProjectTimer timer = projectTimerMapper.selectById(id);
+        if (!timer.getUserId().equals(userId)) {
+            msg.setError("非创建人无权操作");
+        } else {
+            //创建日报
+            DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm");
+            Report report = new Report();
+            report.setSubProjectId(timer.getSubProjectId());
+            report.setProjectId(timer.getProjectId());
+            report.setCreatorId(timer.getUserId());
+            report.setContent(content);
+            report.setCreateDate(timer.getStartTime().toLocalDate());
+            report.setStartTime(df.format(timer.getStartTime()));
+            report.setEndTime(df.format(timer.getEndTime()));
+            report.setReportTimeType(2);//2-按时间段录入
+            //计算时长
+            long time = timer.getEndTime().toEpochSecond(ZoneOffset.ofHours(8)) - timer.getStartTime().toEpochSecond(ZoneOffset.ofHours(8));
+            int minutes = (int)time/60;
+            double hours = (minutes*1.0f/60);
+            report.setWorkingTime(hours);
+            report.setCost(user.getCost().multiply(new BigDecimal(hours)));
+
+            reportMapper.insert(report);
+            timer.setReportId(report.getId());
+            projectTimerMapper.updateById(timer);
+            msg.data = timer;
+        }
+        return msg;
+    }
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ProjectUserSalaryController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-05-19
+ */
+@RestController
+@RequestMapping("/project-user-salary")
+public class ProjectUserSalaryController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportAlogMembdateController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-24
+ */
+@RestController
+@RequestMapping("/report-alog-membdate")
+public class ReportAlogMembdateController {
+
+}
+

+ 89 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportAuditLogController.java

@@ -0,0 +1,89 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.ReportAlogMembdate;
+import com.management.platform.entity.ReportAuditLog;
+import com.management.platform.entity.ReportImportLog;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.ReportAlogMembdateMapper;
+import com.management.platform.mapper.ReportAuditLogMapper;
+import com.management.platform.mapper.SysFunctionMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-24
+ */
+@RestController
+@RequestMapping("/report-audit-log")
+public class ReportAuditLogController {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    ReportAuditLogMapper reportAuditLogMapper;
+    @Resource
+    ReportAlogMembdateMapper reportAlogMembdateMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
+
+    @RequestMapping("getImportAuditLog")
+    public HttpRespMsg getImportAuditLog(Integer companyId, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        HttpRespMsg msg = new HttpRespMsg();
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "导入日报审核记录");
+        if (functionList.size() > 0) {
+            QueryWrapper<ReportAuditLog> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("company_id", companyId).eq("audit_channel", 0).orderByDesc("indate");
+            IPage<ReportAuditLog> iPage = reportAuditLogMapper.selectPage(new Page<>(pageIndex, pageSize),
+                    queryWrapper);
+            List<ReportAuditLog> list = iPage.getRecords();
+            if (list.size() > 0) {
+                //还有获取各项的人员日期名单
+                List<Integer> ids = list.stream().map(ReportAuditLog::getId).collect(Collectors.toList());
+
+                List<ReportAlogMembdate> membList = reportAlogMembdateMapper.selectList(new QueryWrapper<ReportAlogMembdate>().in("rlog_id", ids));
+                list.forEach(l->{
+                    l.setMembdateList(membList.stream().filter(m->m.getRlogId().equals(l.getId())).collect(Collectors.toList()));
+                });
+            }
+
+            Long total = iPage.getTotal();
+            Map<String, Object> map = new HashMap<>();
+            map.put("records", list);
+            map.put("total", total);
+            msg.data = map;
+        } else {
+            Map<String, Object> map = new HashMap<>();
+            map.put("records", new ArrayList<>());
+            map.put("total", 0);
+            msg.data = map;
+        }
+        return msg;
+    }
+}
+

+ 885 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -0,0 +1,885 @@
+package com.management.platform.controller;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.pagehelper.util.StringUtil;
+import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.entity.vo.WorktimeItem;
+import com.management.platform.mapper.*;
+import com.management.platform.service.ReportService;
+import com.management.platform.service.UserSalaryService;
+import com.management.platform.service.UserService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ListUtil;
+import com.management.platform.util.WorkDayCalculateUtils;
+import org.apache.log4j.helpers.DateTimeDateFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author 屈跃庭
+ * @since 2019-12-31
+ */
+@RestController
+@RequestMapping("/report")
+public class ReportController {
+    @Autowired
+    private ReportService reportService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private AuditWorkflowTimeSettingMapper auditWorkflowTimeSettingMapper;
+    @Resource
+    private UserService userService;
+    @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
+    private UserSalaryService userSalaryService;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
+
+
+
+    /**
+     * 根据时间 按照人分类 获取报告信息
+     * date 日期 格式yyyy-mm-dd
+     */
+    @RequestMapping("/getReportFillStatus")
+    public HttpRespMsg getReportFillStatus(String startDate, String endDate, String userId) {
+        return reportService.getReportFillStatus(startDate, endDate, userId, request);
+    }
+
+    @RequestMapping("/getReportList")
+    public HttpRespMsg getReportList(@RequestParam String date, @RequestParam(required = false) Integer deptId, @RequestParam(required = false) String userId) {
+        return reportService.getReportList(date, deptId, userId, request);
+    }
+
+    /**
+     * 导出报告
+     * date 日期 格式yyyy-mm-dd
+     */
+    @RequestMapping("/exportReport")
+    public HttpRespMsg exportReport(String startDate, String endDate, Integer projectId) {
+        return reportService.exportReport(startDate, endDate, projectId, request);
+    }
+
+
+    /**
+     * 根据时间 获取本人报告信息 以及工时
+     * date 日期 格式yyyy-mm-dd
+     */
+    @RequestMapping("/getReport")
+    public HttpRespMsg getReport(@RequestParam String date) {
+        return reportService.getReport(date, request);
+    }
+
+    private void fillReportProgress(Report report, String professionProgress) {
+        if (!StringUtil.isEmpty(professionProgress)) {
+            professionProgress = professionProgress.replaceAll("@",",");
+            System.out.println("JSON=="+professionProgress);
+            JSONArray array = JSONArray.parseArray(professionProgress);
+            List<ReportProfessionProgress> list = new ArrayList<ReportProfessionProgress>();
+            for(int i=0;i<array.size();i++) {
+                JSONObject jsonObject = array.getJSONObject(i);
+                ReportProfessionProgress item = new ReportProfessionProgress();
+                item.setProfessionId(jsonObject.getInteger("professionId"));
+                item.setProgress(jsonObject.getInteger("progress"));
+                item.setProjectId(report.getProjectId());
+                list.add(item);
+            }
+            report.setProfessionProgressList(list);
+        }
+    }
+
+
+    /**
+     * 新增或编辑报告
+     * id 报告id 数组
+     * projectId 报告相关项目id 数组
+     * workingTime 工作时间 数组
+     * content 工作内容 数组
+     * createDate 报告日期 数组
+     * draft 草稿
+     */
+    @RequestMapping("/editReport")
+    public HttpRespMsg editReport(Integer[] id, Integer[] projectId,
+                                  Integer[] subProjectId,
+                                  Double[] workingTime,
+                                  String[] content,
+                                  Integer[] timeType,
+                                  String[] startTime,
+                                  String[] endTime,
+                                  Integer[] reportTimeType,
+                                  String[] createDate,
+                                  Integer[] taskId,
+                                  Integer[] isOvertime,
+                                  Integer[] progress,
+                                  String[] targetUids,
+                                  String[] professionProgress,
+                                  String[] stage,
+                                  String[] pics,
+                                  Integer[] multiWorktime,
+                                  Integer[] degreeId,
+                                  @RequestParam(required = false, defaultValue = "0") Integer draft,
+                                  Integer[] groupId,//任务分组id
+                                  Double[] customData,//自定义的数值
+                                  String[] projectAuditorId
+                                    ) {
+        List<Report> reportList = new ArrayList<>();
+        String token = request.getHeader("Token");
+        List<String> targetUidList = null;
+        List<User> targetUserList = null;
+        if (projectId == null) {
+            HttpRespMsg msg = new HttpRespMsg();
+            msg.setError("项目不能为空");
+            return msg;
+        }
+        if (subProjectId == null) {
+            System.out.println("!!===!!有空的子项目");
+            subProjectId = new Integer[projectId.length];
+            for(int i=0;i<subProjectId.length; i++) {
+                subProjectId[i] = 0;
+            }
+        }
+        //初始化,防止老版本无此字段奔溃报错
+        if (multiWorktime == null) {
+            multiWorktime = new Integer[projectId.length];
+            for(int i=0;i<multiWorktime.length; i++) {
+                multiWorktime[i] = 0;
+            }
+        }
+        if (degreeId == null) {
+            degreeId = new Integer[projectId.length];
+            for(int i=0;i<degreeId.length; i++) {
+                degreeId[i] = -1;
+            }
+        }
+        if (groupId == null) {
+            groupId = new Integer[projectId.length];
+            for(int i=0;i<groupId.length; i++) {
+                groupId[i] = 0;
+            }
+        }
+        if (customData == null) {
+            customData = new Double[projectId.length];
+            for(int i=0;i<customData.length; i++) {
+                customData[i] = 0.0;
+            }
+        }
+        if (projectAuditorId == null) {
+            projectAuditorId = new String[projectId.length];
+            for(int i=0;i<projectAuditorId.length; i++) {
+                projectAuditorId[i] = null;
+            }
+        }
+
+        //检查项目是否截止
+        List<Integer> integers = Arrays.asList(projectId);
+        DateTimeFormatter localDtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", integers));
+        for (int i=0;i<projectId.length; i++) {
+            int pid = projectId[i];
+            Optional<Project> findP = projectList.stream().filter(p->p.getId().equals(pid)).findFirst();
+            if (findP.isPresent()) {
+                Project curP = findP.get();
+                if (!createDate[i].contains("@")) {
+                    if (curP.getStatus() == 2) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("项目["+curP.getProjectName()+"]已完成。");
+                        return msg;
+                    }
+                    if (curP.getStatus() == 3) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("项目["+curP.getProjectName()+"]已撤销。");
+                        return msg;
+                    }
+                    if (curP.getPlanEndDate() != null && curP.getPlanEndDate().isBefore(LocalDate.parse(createDate[i], localDtf))) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("项目["+curP.getProjectName()+"]截止于"+localDtf.format(curP.getPlanEndDate())+",请修改。");
+                        return msg;
+                    }
+                } else {
+                    //批量填报
+                    String[] dateArr = createDate[i].split("@");
+                    for (String curDate : dateArr) {
+                        if (curP.getStatus() == 2) {
+                            HttpRespMsg msg = new HttpRespMsg();
+                            msg.setError("项目["+curP.getProjectName()+"]已完成。");
+                            return msg;
+                        }
+                        if (curP.getStatus() == 3) {
+                            HttpRespMsg msg = new HttpRespMsg();
+                            msg.setError("项目["+curP.getProjectName()+"]已撤销。");
+                            return msg;
+                        }
+                        if (curP.getPlanEndDate() != null && curP.getPlanEndDate().isBefore(LocalDate.parse(curDate, localDtf))) {
+                            HttpRespMsg msg = new HttpRespMsg();
+                            msg.setError("项目["+curP.getProjectName()+"]截止于"+localDtf.format(curP.getPlanEndDate())+",请修改。");
+                            return msg;
+                        }
+                    }
+                }
+            }
+        }
+
+        //自动填充项目审核人
+        for (int i=0;i<projectAuditorId.length; i++) {
+            if (projectAuditorId[i] == null) {
+                final int index = i;
+                projectAuditorId[i] = projectList.stream().filter(p->p.getId().equals(projectId[index])).findFirst().get().getInchargerId();
+            }
+        }
+
+        //代填
+        if (targetUids != null && targetUids.length > 0) {
+            String val = targetUids[0];
+            String[] ids = val.split("@");
+            targetUidList = new ArrayList<>();
+            for (int i = 0; i < ids.length; i++) {
+                targetUidList.add(ids[i]);
+            }
+            targetUserList = userService.list(new QueryWrapper<User>().in("id", targetUidList));
+        }
+        User user = userService.getById(token);
+        LocalDate now = LocalDate.now();
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        BigDecimal hourCost = null;
+        //自己填写的情况,计算个人自己的时薪
+        if (targetUidList == null) {
+            if (user.getCostApplyDate() != null) {
+                //检查有效期
+                if (user.getCostApplyDate().compareTo(dtf.format(now)) > 0) {
+                    //取上一个历史成本
+                    List<UserSalary> list = userSalaryService.list(new QueryWrapper<UserSalary>().eq("user_id", user.getId()).orderByDesc("indate").last("limit 2"));
+                    if (list.size() > 1) {
+                        hourCost = list.get(1).getCost();
+                    } else {
+                        //没有记录,又没有达到预设的起效时间,则默认为0
+                        hourCost = new BigDecimal(0);
+                    }
+                } else {
+                    hourCost = user.getCost();
+                }
+            } else {
+                hourCost = user.getCost();
+            }
+
+            if (hourCost == null) {
+                hourCost = new BigDecimal(0);
+            }
+        } else {
+            //代填的情况,计算每个人的时薪
+            for (User subsUser : targetUserList) {
+                BigDecimal tempCost = new BigDecimal(0);
+                if (subsUser.getCostApplyDate() != null) {
+                    //检查有效期
+                    if (subsUser.getCostApplyDate().compareTo(dtf.format(now)) > 0) {
+                        //取上一个历史成本
+                        List<UserSalary> list = userSalaryService.list(new QueryWrapper<UserSalary>().eq("user_id", subsUser.getId()).orderByDesc("indate").last("limit 2"));
+                        if (list.size() > 1) {
+                            tempCost = list.get(1).getCost();
+                        } else {
+                            //没有记录,又没有达到预设的起效时间,则默认为0
+                            tempCost = new BigDecimal(0);
+                        }
+                    } else {
+                        tempCost = subsUser.getCost();
+                    }
+                } else {
+                    tempCost = subsUser.getCost();
+                }
+
+                if (tempCost == null) {
+                    tempCost = new BigDecimal(0);
+                }
+                //设置好时薪
+                subsUser.setCost(tempCost);
+            }
+        }
+
+        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+        //判断当前操作的人员,是不是系统管理员
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "代填日报");
+        if (functionList.size() == 0) {
+            //非系统管理员,检查填报时间
+            TimeType compTimeType = timeTypeMapper.selectById(user.getCompanyId());
+            Integer fillMonths = compTimeType.getFillMonths();
+
+            if (fillMonths > 0) {
+                //有限制的情况
+                LocalDate curMonth = LocalDate.now();
+                LocalDate targetDate = null;
+                if (fillMonths <=3) {
+                    targetDate = curMonth.minusMonths(fillMonths-1);
+                    targetDate = targetDate.withDayOfMonth(1);//修改日期为1号
+                } else if (fillMonths == 4) {
+                    //7天内
+                    targetDate = curMonth.minusDays(7);
+                }else if(fillMonths ==5){
+                    //前一天
+                    targetDate=curMonth.minusDays(1);
+                }
+
+                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                //检查填报日期,是否早于限制的日期
+                boolean isForbidden = false;
+                if (createDate.length > 0) {
+                    //日期都是一样的,取第一个就行了
+                    String createDateOne = createDate[0];
+                    if (createDateOne.contains("@")) {
+                        String[] dateArray = createDateOne.split("@");
+                        String startDate = dateArray[0];
+                        LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
+                        if (localStartDate.isBefore(targetDate)) {
+                            isForbidden = true;
+                        }
+                    } else {
+                        //单日填报,检查日期是否早于限制时间
+                        if (LocalDate.parse(createDateOne, dateTimeFormatter).isBefore(targetDate)) {
+                            isForbidden = true;
+                        }
+                    }
+                }
+                if (isForbidden) {
+                    HttpRespMsg msg = new HttpRespMsg();
+                    msg.setError("补填日报不可早于"+dateTimeFormatter.format(targetDate)+",请联系系统管理员代填。");
+                    return msg;
+                }
+            }
+        }
+        try {
+            List<AuditWorkflowTimeSetting> auditWorkflowList
+                    = auditWorkflowTimeSettingMapper.selectList(
+                    new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", user.getDepartmentId()).orderByAsc("seq"));
+            List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()));
+
+            for (int i = 0; i < id.length; i++) {
+                if (createDate[i].contains("@")) {
+                    DateTimeFormatter mdFormatter = DateTimeFormatter.ofPattern("MM-dd");
+                    System.out.println("============这是批量填报=");
+                    //这是批量填报的情况,日期有范围
+                    String[] dateArray = createDate[i].split("@");
+                    String startDate = dateArray[0];
+                    String endDate = dateArray[1];
+                    //检查该时间范围是否已经有填写过的日报了
+                    List<Report> oldReportList = reportService.list(new QueryWrapper<Report>().between("create_date", startDate, endDate).eq("creator_id", token));
+                    if (oldReportList.size() > 0) {
+                        List<LocalDate> collect = oldReportList.stream().map(Report::getCreateDate).collect(Collectors.toList());
+                        StringBuilder sb = new StringBuilder();
+                        collect.forEach(c->{
+                            sb.append(mdFormatter.format(c)).append(",");
+                        });
+                        String s = sb.toString();
+                        s = s.substring(0, s.length() -1);
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("已存在填写日报: " + s+", 请重新选择日期范围");
+                        return msg;
+                    }
+
+//                    LocalDate localStartDate = LocalDate.parse(startDate, ddtf);
+//                    LocalDate localEndDate = LocalDate.parse(endDate, ddtf);
+                    List<LocalDate> workDaysListInRange = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate);
+                    //获取当前填报人所在部门的自定义审核流程
+                    for (LocalDate localStartDate : workDaysListInRange) {
+                        if (targetUserList == null) {
+                            Report report = new Report();
+                            report.setId(id[i] == -1 ? null : id[i]);
+                            report.setProjectId(projectId[i]);
+                            report.setSubProjectId(subProjectId[i]);
+                            report.setGroupId(groupId[i]);
+                            report.setReportTimeType(reportTimeType[i]);
+                            report.setMultiWorktime(multiWorktime[i]);
+                            report.setContent(content[i]);
+                            report.setDegreeId(degreeId.length > 0?degreeId[i]:null);
+                            report.setCustomData(customData[i]);
+                            report.setState(draft==0?0:3);
+                            report.setCompanyId(user.getCompanyId());
+                            report.setPicAdd(pics!=null?pics[i]:null);
+                            report.setStage(stage[i]);
+                            report.setCreateDate(localStartDate);
+                            report.setCreatorId(token);
+                            report.setProjectAuditState(0);
+                            report.setProjectAuditorId(projectAuditorId[i]);
+                            if (auditWorkflowList.size() == 0) {
+                                //没有自定义审核流,默认的直接是项目负责人审核
+                                report.setIsDeptAudit(0);
+                                report.setIsFinalAudit(1);
+                            } else {
+                                //取第一个审核节点
+                                AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
+                                report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
+                                report.setIsDeptAudit(firstNode.getIsDeptAudit());
+                                report.setAuditDeptid(firstNode.getAuditDeptId());
+                                report.setAuditDeptManagerid(firstNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
+                            }
+                            if (taskId != null && taskId[i] != null && taskId[i] != 0) {
+                                report.setTaskId(taskId[i]);
+                            }
+                            if (isOvertime != null && isOvertime[i] != null) {
+                                report.setIsOvertime(isOvertime[i]);
+                            }
+                            if (progress != null && progress[i] != null) {
+                                report.setProgress(progress[i]);
+                            }
+                            //计算工时和成本
+                            if (report.getMultiWorktime() == 0) {
+                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i],  sdf);
+                            } else {
+                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf);
+                            }
+
+                            //项目专业的进展
+                            fillReportProgress(report, professionProgress[i]);
+                            reportList.add(report);
+                        } else {
+                            //批量代填报的
+                            for (User subsUser : targetUserList) {
+                                Report report = new Report()
+                                        .setId(id[i] == -1 ? null : id[i])
+                                        .setProjectId(projectId[i])
+                                        .setSubProjectId(subProjectId[i])
+                                        .setGroupId(groupId[i])
+                                        .setReportTimeType(reportTimeType[i])
+                                        .setMultiWorktime(multiWorktime[i])
+                                        .setContent(content[i])
+                                        .setDegreeId(degreeId.length > 0?degreeId[i]:null)
+                                        .setCustomData(customData[i])
+                                        .setStage(stage[i])
+                                        .setState(1)//代填,直接是审核通过状态
+                                        .setCompanyId(user.getCompanyId())
+                                        .setPicAdd(pics!=null?pics[i]:null)
+                                        .setCreateDate(localStartDate)
+                                        .setCreatorId(subsUser.getId())
+                                        .setProjectAuditorId(projectAuditorId[i]);;
+                                report.setProjectAuditState(0);
+                                if (auditWorkflowList.size() == 0) {
+                                    //没有自定义审核流,默认的直接是项目负责人审核
+                                    report.setIsDeptAudit(0);
+                                    report.setIsFinalAudit(1);
+                                } else {
+                                    //取第一个审核节点
+                                    AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
+                                    report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
+                                    report.setIsDeptAudit(firstNode.getIsDeptAudit());
+                                    report.setAuditDeptid(firstNode.getAuditDeptId());
+                                    report.setAuditDeptManagerid(firstNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
+                                }
+                                if (taskId != null && taskId[i] != null && taskId[i] != 0) {
+                                    report.setTaskId(taskId[i]);
+                                }
+                                if (isOvertime != null && isOvertime[i] != null) {
+                                    report.setIsOvertime(isOvertime[i]);
+                                }
+                                if (progress != null && progress[i] != null) {
+                                    report.setProgress(progress[i]);
+                                }
+                                //计算工时和成本
+                                if (report.getMultiWorktime() == 0) {
+                                    fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i],  sdf);
+                                } else {
+                                    fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf);
+                                }
+
+                                fillReportProgress(report, professionProgress[i]);
+                                reportList.add(report);
+                            }
+                        }
+                    }
+                } else {
+                    if (targetUidList == null) {
+                        Report report = new Report();
+                        report.setId(id[i] == -1 ? null : id[i]);
+                        report.setProjectId(projectId[i]);
+                        report.setSubProjectId(subProjectId[i]);
+                        report.setGroupId(groupId[i]);
+                        report.setReportTimeType(reportTimeType[i]);
+                        report.setMultiWorktime(multiWorktime.length > 0?multiWorktime[i]:0);
+                        report.setContent(content.length > 0?content[i]:"-");
+                        report.setDegreeId(degreeId.length > 0?degreeId[i]:null);
+                        report.setCustomData(customData[i]);
+                        report.setStage(stage != null && stage.length>0?stage[i]:"-");
+                        report.setState(draft==0?0:3);
+                        report.setCompanyId(user.getCompanyId());
+                        report.setPicAdd(pics!=null && pics.length>0?pics[i]:null);
+                        report.setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+                        report.setCreatorId(token);
+                        report.setProjectAuditState(0);
+                        report.setProjectAuditorId(projectAuditorId[i]);
+                        if (auditWorkflowList.size() == 0) {
+                            //没有自定义审核流,默认的直接是项目负责人审核
+                            report.setIsDeptAudit(0);
+                            report.setIsFinalAudit(1);
+                        } else {
+                            //取第一个审核节点
+                            AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
+                            report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
+                            report.setIsDeptAudit(firstNode.getIsDeptAudit());
+                            report.setAuditDeptid(firstNode.getAuditDeptId());
+                            report.setAuditDeptManagerid(firstNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
+                        }
+                        if (taskId != null && taskId[i] != null && taskId[i] != 0) {
+                            report.setTaskId(taskId[i]);
+                        }
+                        if (isOvertime != null && isOvertime[i] != null) {
+                            report.setIsOvertime(isOvertime[i]);
+                        }
+                        if (progress != null && progress[i] != null) {
+                            report.setProgress(progress[i]);
+                        }
+                        //计算工时和成本
+                        if (report.getMultiWorktime() == 0) {
+                            fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i], sdf);
+                        } else {
+                            fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf);
+                        }
+
+                        fillReportProgress(report, professionProgress[i]);
+                        reportList.add(report);
+                        /*后续需要加入状态*/
+                        if (createDate[i] == null || projectId[i] == null) {
+                            HttpRespMsg httpRespMsg = new HttpRespMsg();
+                            httpRespMsg.setError("缺少数据");
+                            return httpRespMsg;
+                        }
+                    } else {
+                        //批量代填的情况
+                        for (User subsUser : targetUserList) {
+                            Report report = new Report()
+                                    .setId(id[i] == -1 ? null : id[i])
+                                    .setProjectId(projectId[i])
+                                    .setSubProjectId(subProjectId[i])
+                                    .setGroupId(groupId[i])
+                                    .setReportTimeType(reportTimeType[i])
+                                    .setMultiWorktime(multiWorktime[i])
+                                    .setContent(content[i])
+                                    .setDegreeId(degreeId.length > 0?degreeId[i]:null)
+                                    .setCustomData(customData[i])
+                                    .setStage(stage[i])
+//                                    .setState(auditWorkflowList.size() == 0?1:0)//代填的如果没有自定义审核流程就直接审核通过了
+                                    .setCompanyId(user.getCompanyId())
+                                    .setPicAdd(pics!=null?pics[i]:null)
+                                    .setCreateDate(LocalDate.parse(createDate[i], DateTimeFormatter.ofPattern("yyyy-MM-dd")))
+                                    .setCreatorId(subsUser.getId())
+                                    .setProjectAuditorId(projectAuditorId[i])
+                                    .setFillUserid(token);
+                            report.setProjectAuditState(1);
+                            if (auditWorkflowList.size() == 0) {
+                                //没有自定义审核流,直接代填的,就算审核通过
+                                report.setIsDeptAudit(0);
+                                report.setIsFinalAudit(1);
+                                report.setState(1);
+                            } else {
+                                //有审核流程的,取项目经理后面的流程节点
+                                int projectLeaderNodeIndex = 0;
+                                for (int t=0;t<auditWorkflowList.size(); t++) {
+                                    if (auditWorkflowList.get(t).getIsDeptAudit() == 0) {
+                                        projectLeaderNodeIndex = t;
+                                        break;
+                                    }
+                                }
+                                if (projectLeaderNodeIndex == auditWorkflowList.size() -1) {
+                                    //最后一个节点就是项目经理,那就不用审核了,直接通过
+                                    report.setState(1);
+                                } else {
+                                    //否则取下一个节点,待审核
+                                    report.setState(0);
+                                    int nextIndex = projectLeaderNodeIndex + 1;
+                                    AuditWorkflowTimeSetting nextNode = auditWorkflowList.get(nextIndex);
+                                    report.setIsFinalAudit((nextIndex == auditWorkflowList.size()-1)?1:0);
+                                    report.setIsDeptAudit(nextNode.getIsDeptAudit());
+                                    report.setAuditDeptid(nextNode.getAuditDeptId());
+                                    report.setAuditDeptManagerid(nextNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
+                                }
+                            }
+
+                            if (taskId != null && taskId[i] != null && taskId[i] != 0) {
+                                report.setTaskId(taskId[i]);
+                            }
+                            if (isOvertime != null && isOvertime[i] != null) {
+                                report.setIsOvertime(isOvertime[i]);
+                            }
+                            if (progress != null && progress[i] != null) {
+                                report.setProgress(progress[i]);
+                            }
+                            hourCost = subsUser.getCost();
+                            //计算工时和成本
+                            if (report.getMultiWorktime() == 0) {
+                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], startTime==null?null:startTime[i], endTime==null?null:endTime[i],  sdf);
+                            } else {
+                                fillReportHours(report, hourCost, workingTime==null?null:workingTime[i], timeType==null?null:timeType[i], null, null, sdf);
+                            }
+
+                            fillReportProgress(report, professionProgress[i]);
+                            reportList.add(report);
+                            /*后续需要加入状态*/
+                            if (createDate[i] == null || projectId[i] == null) {
+                                HttpRespMsg httpRespMsg = new HttpRespMsg();
+                                httpRespMsg.setError("缺少数据");
+                                return httpRespMsg;
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            HttpRespMsg httpRespMsg = new HttpRespMsg();
+            httpRespMsg.setError("验证失败");
+            return httpRespMsg;
+        }
+        //校验工作时长
+        for (Report report : reportList) {
+            if (report.getWorkingTime() == null || report.getWorkingTime() <= 0.0) {
+                HttpRespMsg httpRespMsg = new HttpRespMsg();
+                httpRespMsg.setError("请填写工作时长");
+                return httpRespMsg;
+            }
+        }
+
+        return reportService.editReport(reportList, createDate.length > 0 ? createDate[0] : null, targetUserList, hourCost, user.getCompanyId());
+    }
+
+    private void fillReportHours(Report report, BigDecimal hourCost, Double workingTime, Integer timeType, String startTime, String endTime, SimpleDateFormat sdf) {
+        if (report.getMultiWorktime() == 0) {
+            //普通工时成本计算
+            if (report.getReportTimeType() == 0) {
+                report.setWorkingTime(workingTime)
+                        .setCost(hourCost.multiply(new BigDecimal(workingTime)))
+                        .setTimeType(timeType);
+            } else if (report.getReportTimeType() == 1|| report.getReportTimeType() == 3) {
+                report.setWorkingTime(workingTime)
+                        .setCost(hourCost.multiply(new BigDecimal(workingTime)));
+            } else if (report.getReportTimeType() == 2) {
+                //时间范围填报, 计算一下时长
+                try {
+                    report.setStartTime(startTime).setEndTime(endTime);
+                    long time = sdf.parse(report.getEndTime()).getTime() - sdf.parse(report.getStartTime()).getTime();
+                    int minutes = (int)time/1000/60;
+                    double hours = minutes*1.0f/60;
+                    report.setWorkingTime(hours);
+                    report.setCost(hourCost.multiply(new BigDecimal(hours)));
+                } catch (ParseException e) {
+                    e.printStackTrace();
+                }
+            }
+        } else {
+            //getMultiWorktime==1, content中含有多个工时
+            String str = report.getContent().replaceAll("@",",");
+            JSONArray array = JSONArray.parseArray(str);
+            try {
+                double totalHours = 0;
+                for (int t=0;t<array.size(); t++) {
+                    JSONObject jsonObject = array.getJSONObject(t);
+                    WorktimeItem item = JSONObject.toJavaObject(jsonObject, WorktimeItem.class);
+                    long time = sdf.parse(item.getEndTime()).getTime() - sdf.parse(item.getStartTime()).getTime();
+                    int minutes = (int)time/1000/60;
+                    double hours = minutes*1.0f/60;
+                    item.setTime(hours);
+                    jsonObject.put("time", hours);
+                    totalHours += hours;
+                }
+                report.setWorkingTime(totalHours);
+                report.setCost(hourCost.multiply(new BigDecimal(totalHours)));
+                report.setContent(array.toJSONString());
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 删除报告
+     * id 要删除的报告的id
+     */
+    @RequestMapping("/delete")
+    public HttpRespMsg deleteReport(String userId, String date) {
+        return reportService.deleteReport(userId, date);
+    }
+
+    /**
+     * 根据审核状态获取报告
+     * state 筛选状态 0-未审核 1-已通过 2-未通过
+     */
+    @RequestMapping("/listByState")
+    public HttpRespMsg getListByState(@RequestParam Integer state,
+                                      Integer departmentId,
+                                      Integer projectId,
+                                      String date,
+                                      String startDate,
+                                      String endDate,
+                                      String userId,
+                                      HttpServletRequest request) {
+        return reportService.getListByState(state, departmentId,
+                projectId,
+                date, startDate, endDate, userId,
+                request);
+    }
+
+    /**
+     * 获取专业待审核的报告
+     * @param state
+     * @param departmentId
+     * @param projectId
+     * @param date
+     * @param request
+     * @return
+     */
+    @RequestMapping("/listByStateProfession")
+    public HttpRespMsg listByStateProfession(@RequestParam Integer state,
+                                      Integer departmentId,
+                                      Integer projectId,
+                                      String date,
+                                      HttpServletRequest request) {
+        return reportService.listByStateProfession(state, departmentId,
+                projectId,
+                date,request);
+    }
+
+    @RequestMapping("/listByStateDepartment")
+    public HttpRespMsg listByStateDepartment(@RequestParam Integer state,
+                                             Integer projectId,
+                                             String date,
+                                             HttpServletRequest request) {
+        return reportService.listByStateDepartment(state,
+                projectId,
+                date,request);
+    }
+
+    /**
+     * 按某人某日期审批通过报告
+     * id 要通过的报告的用户id
+     * reportIds 报告id
+     */
+    @RequestMapping("/approve")
+    public HttpRespMsg approveReport(@RequestParam String reportIds, Integer isDepartment, HttpServletRequest request) {
+        return reportService.approveReport(reportIds,isDepartment, request);
+    }
+
+
+    /**
+     * 按某人某日期审批未通过报告 撤销通过报告
+     * id 要未通过的报告的用户id
+     * date 日期 格式yyyy-mm-dd
+     */
+    @RequestMapping("/deny")
+    public HttpRespMsg denyReport(@RequestParam String date, @RequestParam String reportIds, String reason, Integer isDepartment, HttpServletRequest request) {
+        return reportService.denyReport(date,reportIds, reason, isDepartment, request);
+    }
+
+    /**
+     * 撤回报告
+     * @param reportIds
+     * @param request
+     * @return
+     */
+    @RequestMapping("/cancel")
+    public HttpRespMsg cancelReport(@RequestParam String userId, @RequestParam String reportIds,HttpServletRequest request) {
+        return reportService.cancelReport(userId, reportIds, request);
+    }
+
+
+    @RequestMapping("/getMembList")
+    public HttpRespMsg getMembList(@RequestParam(required=false) String date, Integer manageDeptId, HttpServletRequest request) {
+        if (date == null) {
+            //默认获取今天的
+            date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
+        }
+        return reportService.getMembList(date, manageDeptId, request);
+    }
+
+    @RequestMapping("/batchApproveReport")
+    public HttpRespMsg batchApproveReport(@RequestParam String ids, Integer isDepartment, HttpServletRequest request) {
+        return reportService.batchApproveReport(ids, isDepartment, request);
+    }
+
+    @RequestMapping("/batchDenyReport")
+    public HttpRespMsg batchDenyReport(@RequestParam String ids, Integer isDepartment, HttpServletRequest request) {
+        return reportService.batchDenyReport(ids, isDepartment, request);
+    }
+
+    @RequestMapping("/getUserDailyWorkTime")
+    public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
+        return reportService.getUserDailyWorkTime(request, startDate, endDate);
+    }
+
+    @RequestMapping("/getNoReportUserList")
+    public HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate) {
+        return reportService.getNoReportUserList(request, startDate, endDate);
+    }
+
+    @RequestMapping("/exportNoReportUserList")
+    public HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate) {
+        return reportService.exportNoReportUserList(request, startDate, endDate);
+    }
+
+    @RequestMapping("/exportUserDailyWorkTime")
+    public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
+        return reportService.exportUserDailyWorkTime(request, startDate, endDate);
+    }
+
+    /**
+     * 计算给定时间段内的工作日数量
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @return
+     */
+    @RequestMapping("/getWorkDays")
+    public HttpRespMsg getWorkDays(String startDate, String endDate) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = WorkDayCalculateUtils.getWorkDaysCountInRange(startDate, endDate);
+        return msg;
+    }
+
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(Integer companyId, Integer withCheckIn,
+                                  MultipartFile file, HttpServletRequest request) {
+        return reportService.importData(companyId,withCheckIn, file, request);
+    }
+
+    @RequestMapping("/listImportByState")
+    public HttpRespMsg listDeptImportByState(
+                                      Integer projectId,
+                                      @RequestParam(required = false, defaultValue = "0") Integer dateType,
+                                      String date,
+                                      Integer departmentId,
+                                      HttpServletRequest request) {
+        String token = request.getHeader("TOKEN");
+        User user = userService.getById(token);
+        return reportService.listDeptImportByState(user.getId(),
+                projectId,dateType,
+                date, departmentId, request);
+    }
+
+    @RequestMapping("/getlastWeekFillTime")
+    public HttpRespMsg getlastWeekFillTime(String userId) {
+        return reportService.getlastWeekFillTime(userId);
+    }
+}
+

+ 151 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportExtraDegreeController.java

@@ -0,0 +1,151 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.CustomerInfo;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ReportExtraDegree;
+import com.management.platform.entity.User;
+import com.management.platform.mapper.CustomerInfoMapper;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.ReportExtraDegreeMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProjectService;
+import com.management.platform.service.ReportExtraDegreeService;
+import com.management.platform.service.ReportService;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.poi.util.StringUtil;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-16
+ */
+@RestController
+@RequestMapping("/report-extra-degree")
+public class ReportExtraDegreeController {
+
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    ReportExtraDegreeMapper reportExtraDegreeMapper;
+    @Resource
+    ProjectMapper projectMapper;
+    @Resource
+    ProjectService projectService;
+
+    /**
+     * addOrMod添加或者修改
+     * @param info
+     * @return
+     */
+    @RequestMapping("/addOrMod")
+    public HttpRespMsg addOrMod(ReportExtraDegree info) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        if (info.getId() == null) {
+            info.setCompanyId(user.getCompanyId());
+            reportExtraDegreeMapper.insert(info);
+        } else {
+            info.setCompanyId(user.getCompanyId());
+            //检查名字是否发生变化
+            ReportExtraDegree reportExtraDegree = reportExtraDegreeMapper.selectById(info.getId());
+            if (!reportExtraDegree.getName().equals(info.getName())) {
+                //检查是否已经被使用
+                int id = info.getId();
+                List<Project> existsProjects = projectMapper.selectList(new QueryWrapper<Project>()
+                        .eq("company_id", user.getCompanyId())
+                        .and(wrapper->wrapper.eq("associate_degrees", id)
+                                .or().like("associate_degrees", id+",%")
+                                .or().like("associate_degrees", "%,"+id+",%")
+                                .or().like("associate_degrees", "%,"+id)));
+                if (existsProjects.size() > 0) {
+                    List<Project> updateList = new ArrayList<>();
+                    for (Project p : existsProjects) {
+                        String associateDegrees = p.getAssociateDegrees();
+                        String[] split = associateDegrees.split("\\,");
+                        String[] names = p.getAssociateDegreeNames().split("\\,");
+
+                        for (int i=0;i<split.length; i++) {
+                            if (split[i].equals(id+"")) {
+                                names[i] = info.getName();//更换新名字
+                            }
+                        }
+                        String replaceNames = StringUtil.join(names, ",");
+                        Project newP = new Project();
+                        newP.setId(p.getId());
+                        newP.setAssociateDegreeNames(replaceNames);
+                        updateList.add(newP);
+                    }
+                    projectService.updateBatchById(updateList);
+                }
+                reportExtraDegreeMapper.updateById(info);
+            }
+        }
+        return msg;
+    }
+
+    /**
+     * delete删除
+     * @param id
+     * @return
+     */
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        //检查是否已经被使用
+        List<Project> existsProjects = projectMapper.selectList(new QueryWrapper<Project>()
+                        .eq("associate_degrees", id)
+                        .or().like("associate_degrees", id+",%")
+                        .or().like("associate_degrees", "%,"+id+",%")
+                        .or().like("associate_degrees", "%,"+id));
+        if (existsProjects.size() > 0) {
+            String names = existsProjects.stream().map(Project::getProjectName).collect(Collectors.joining(","));
+            msg.setError("该数据已经被以下项目关联,无法删除:"+names);
+            return msg;
+        }
+        int r = reportExtraDegreeMapper.delete(new QueryWrapper<ReportExtraDegree>().eq("id", id).eq("company_id", user.getCompanyId()));
+        if (r <= 0) {
+            msg.setError("无权删除");
+        }
+        return msg;
+    }
+
+    /**
+     * 获取全部getAll
+     * @return
+     */
+    @RequestMapping("/getAll")
+    public HttpRespMsg getAll() {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<ReportExtraDegree> all = reportExtraDegreeMapper.getAll(user.getCompanyId());
+        msg.data = all;
+        return msg;
+    }
+}
+

+ 52 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportImportLogController.java

@@ -0,0 +1,52 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ReportImportLog;
+import com.management.platform.mapper.ReportImportLogMapper;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-03-20
+ */
+@RestController
+@RequestMapping("/report-import-log")
+public class ReportImportLogController {
+
+    @Resource
+    private ReportImportLogMapper reportImportLogMapper;
+
+    @RequestMapping("/getList")
+    public HttpRespMsg getList(Integer companyId, @RequestParam Integer pageIndex, @RequestParam Integer pageSize) {
+        HttpRespMsg msg = new HttpRespMsg();
+        QueryWrapper<ReportImportLog> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("company_id", companyId).orderByDesc("indate");
+        IPage<ReportImportLog> iPage = reportImportLogMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<ReportImportLog> list = iPage.getRecords();
+        Long total = iPage.getTotal();
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", list);
+        map.put("total", total);
+        msg.data = map;
+        return msg;
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/ReportProfessionProgressController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-29
+ */
+@RestController
+@RequestMapping("/report-profession-progress")
+public class ReportProfessionProgressController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SimpleFinanceController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-10-22
+ */
+@RestController
+@RequestMapping("/simple-finance")
+public class SimpleFinanceController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SimpleProjectimeController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-10-22
+ */
+@RestController
+@RequestMapping("/simple-projectime")
+public class SimpleProjectimeController {
+
+}
+

+ 71 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SimpleReportController.java

@@ -0,0 +1,71 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.SimpleReport;
+import com.management.platform.service.FinanceService;
+import com.management.platform.service.SimpleReportService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-10-22
+ */
+@RestController
+@RequestMapping("/simple-report")
+public class SimpleReportController {
+
+    @Resource
+    HttpServletRequest request;
+
+    @Resource
+    private SimpleReportService simpleReportService;
+
+    @RequestMapping("/getByMonth")
+    public HttpRespMsg getByMonth(Integer companyId, String yearMonth) {
+        return simpleReportService.getByMonth(companyId, yearMonth);
+    }
+
+    @RequestMapping("/getReportByMonth")
+    public HttpRespMsg getReportByMonth(Integer companyId, String yearMonth) {
+        return simpleReportService.getReportByMonth(companyId, yearMonth);
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(Integer companyId, String yearMonth,
+                                  MultipartFile file, HttpServletRequest request) {
+        return simpleReportService.importData(companyId, yearMonth, file, request);
+    }
+
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(String yearMonth, Integer companyId, String type, HttpServletRequest request) {
+        return simpleReportService.exportData(yearMonth, companyId, type, request);
+    }
+
+    //按照项目分配财务成本
+    @RequestMapping("/getTimeCost")
+    public HttpRespMsg getTimeCost(String yearMonth, Integer companyId, String type, HttpServletRequest request) {
+        return simpleReportService.getTimeCost(yearMonth, companyId, type, request);
+    }
+
+    public static void main(String[] args) {
+        LocalDate now = LocalDate.now();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/M/d");
+        now = LocalDate.parse("2021/1/02",dateTimeFormatter);
+        System.out.println(dateTimeFormatter.format(now));
+    }
+}
+

+ 292 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/StagesController.java

@@ -0,0 +1,292 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.api.R;
+import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.SysFunctionMapper;
+import com.management.platform.mapper.TaskGroupMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.StagesService;
+import com.management.platform.service.TaskGroupService;
+import com.management.platform.service.TaskService;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.ListUtil;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-04-19
+ */
+@RestController
+@RequestMapping("/stages")
+public class StagesController {
+    @Resource
+    private HttpServletRequest request;
+
+    @Resource
+    private StagesService stagesService;
+    @Resource
+    private TaskService taskService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private TaskGroupMapper taskGroupMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private SysFunctionMapper sysFunctionMapper;
+    /**
+     * 保存任务列表
+     */
+    @RequestMapping("/save")
+    public HttpRespMsg save(Stages item) {
+        HttpRespMsg msg = new HttpRespMsg();
+        //检查名称是否已经存在
+        boolean findSameName = false;
+        if (item.getId() == null) {
+            QueryWrapper<Stages> queryWrapper = new QueryWrapper<Stages>();
+            queryWrapper.eq("group_id", item.getGroupId()).eq("stages_name", item.getStagesName());
+            int cnt = stagesService.count(queryWrapper);
+            findSameName = cnt>0?true: false;
+        } else {
+            QueryWrapper<Stages> queryWrapper = new QueryWrapper<Stages>();
+            queryWrapper.eq("group_id", item.getGroupId()).eq("stages_name", item.getStagesName()).ne("id", item.getId());
+            int cnt = stagesService.count(queryWrapper);
+            findSameName = cnt>0?true: false;
+        }
+        if (findSameName) {
+            msg.setError("当前分组中已存在该任务列表,无法重复添加");
+            return msg;
+        }
+        //给seq排序
+        QueryWrapper<Stages> queryWrapper = new QueryWrapper<Stages>();
+        queryWrapper.eq("group_id", item.getGroupId());
+        queryWrapper.orderByDesc("sequence");
+        queryWrapper.last("limit 1");
+        if (item.getId() == null) {
+            List<Stages> one = stagesService.list(queryWrapper);
+            if (one.size() == 0) {
+                item.setSequence(1);
+            } else {
+                item.setSequence(one.get(0).getSequence() + 1);
+            }
+        }
+
+        stagesService.saveOrUpdate(item);
+        queryWrapper = new QueryWrapper<Stages>();
+        queryWrapper.eq("group_id", item.getGroupId());
+        queryWrapper.orderByAsc("sequence");
+
+        List<Stages> list = stagesService.list(queryWrapper);
+
+        QueryWrapper<Task> taskQueryWrapper = new QueryWrapper<Task>();
+        taskQueryWrapper.in("group_id", item.getGroupId());
+        taskQueryWrapper.isNull("parent_tid");
+        taskQueryWrapper.orderByAsc("task_status","seq");
+
+        List<Task> tasks = taskService.list(taskQueryWrapper);
+        List<Integer> collect = tasks.stream().map(Task::getId).collect(Collectors.toList());
+        collect.add(-1);
+        List<Task> subTasks = taskService.list(new QueryWrapper<Task>().in("parent_tid", collect));
+
+        list.forEach(stages -> {
+            List<Task> taskList = tasks.stream().filter(t -> t.getStagesId().equals(stages.getId())).collect(Collectors.toList());
+            stages.setTaskList(taskList);
+            //设置子任务
+            taskList.forEach(t->{
+                List<Task> subList = subTasks.stream().filter(s -> s.getParentTid().equals(t.getId())).collect(Collectors.toList());
+                t.setSubTaskList(subList);
+                long count = subList.stream().filter(s -> s.getTaskStatus() == 1).count();
+                t.setSubTaskFinishNum((int)count);
+            });
+        });
+
+        msg.data = list;
+        return msg;
+    }
+
+    /**
+     * 删除任务列表
+     * @param item
+     * @return
+     */
+    @RequestMapping("/delete")
+    public HttpRespMsg delete(Stages item) {
+        HttpRespMsg msg = new HttpRespMsg();
+        //检查,如果分组下有任务,不得删除
+        int cnt = taskService.count(new QueryWrapper<Task>().eq("stages_id", item.getId()));
+        if (cnt > 0) {
+            msg.setError("该任务列表下存在任务,不可删除");
+        } else {
+            //查询当前要删除的任务列表的位置排序,重新调整后面的列表排序
+            Stages stages = stagesService.getById(item.getId());
+            stages.getSequence();
+            QueryWrapper<Stages> stagesQueryWrapper = new QueryWrapper<>();
+            stagesQueryWrapper.eq("group_id", item.getGroupId()).gt("sequence", stages.getSequence());
+            stagesService.removeById(item.getId());
+            List<Stages> afterList = stagesService.list(stagesQueryWrapper);
+            if (afterList.size() > 0) {
+                afterList.forEach(a->{
+                    a.setSequence(a.getSequence() -1);
+                });
+                stagesService.updateBatchById(afterList);
+            }
+
+
+            return msg;
+        }
+
+        return msg;
+    }
+
+    /**
+     * 查看任务列表
+     * @param item
+     * @return
+     */
+    @RequestMapping("/list")
+    public HttpRespMsg list(Stages item, String order, boolean isDesc) {
+        HttpRespMsg msg = new HttpRespMsg();
+        QueryWrapper<Stages> stagesQueryWrapper = new QueryWrapper<Stages>();
+        stagesQueryWrapper.eq("group_id", item.getGroupId());
+        String userId = request.getHeader("Token");
+        User user = userMapper.selectById(userId);
+
+        stagesQueryWrapper.orderByAsc("sequence");
+        if (stagesService.count(stagesQueryWrapper) == 0) {
+            //创建默认列表
+            Stages stage = new Stages();
+            stage.setGroupId(item.getGroupId());
+            stage.setSequence(1);
+            stage.setProjectId(item.getProjectId());
+            stage.setStagesName("工作开展");
+            stagesService.save(stage);
+        }
+        List<Stages> list = stagesService.list(stagesQueryWrapper);
+        Integer projectId = taskGroupMapper.selectById(item.getGroupId()).getProjectId();
+        Project project = projectMapper.selectById(projectId);
+        QueryWrapper<Task> queryWrapper = new QueryWrapper<Task>();
+        //按任务分组查看
+        queryWrapper.eq("group_id", item.getGroupId());
+        queryWrapper.isNull("parent_tid");
+        //排序根据前端传过来的字段
+        if (isDesc) {
+            queryWrapper.orderByDesc(order);
+        } else {
+            queryWrapper.orderByAsc(order);
+        }
+        List<Task> tasks = taskService.simpleList(queryWrapper);
+        //没有权限只能看到自己创建的,负责的和待分配的任务
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部任务");
+        if (functionList.size() == 0 && !userId.equals(project.getInchargerId())) {
+            tasks = tasks.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().contains(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
+        }
+        List<Task> subTasks = new ArrayList<>();
+        if (tasks.size() > 0) {
+            List<Integer> collect = tasks.stream().map(Task::getId).collect(Collectors.toList());
+            List<Task> subLists = taskService.simpleList(new QueryWrapper<Task>().in("parent_tid", collect));
+            if (functionList.size() == 0 && !userId.equals(project.getInchargerId())) {
+                subLists = subLists.stream().filter(t->t.getExecutorId() == null || t.getExecutorId().contains(userId) || t.getCreaterId().equals(userId)).collect(Collectors.toList());
+            }
+            subTasks.addAll(subLists);
+        }
+        for (int i = 0; i < list.size(); i++) {
+            Stages stages = list.get(i);
+            List<Task> taskList = tasks.stream().filter(t -> t.getStagesId().equals(stages.getId())).collect(Collectors.toList());
+            stages.setTaskList(taskList);
+            if (taskList.size() > 0) {
+                //设置子任务
+                taskList.forEach(t->{
+                    List<Task> subList = subTasks.stream().filter(s -> s.getParentTid().equals(t.getId())).collect(Collectors.toList());
+                    t.setSubTaskList(subList);
+                    long count = subList.stream().filter(s -> s.getTaskStatus() == 1).count();
+                    t.setSubTaskFinishNum((int)count);
+                });
+            }
+        }
+
+        msg.data = list;
+        return msg;
+    }
+
+    @RequestMapping("/changeStageOrder")
+    public HttpRespMsg changeStageOrder(Integer groupId, Integer oldIndex, Integer newIndex) {
+        QueryWrapper<Stages> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("group_id", groupId).orderByAsc("sequence").last("limit " + oldIndex+",1");
+        List<Stages> sList = stagesService.list(queryWrapper);
+        //先按顺序取到移动的元素
+        Stages curItem = sList.get(0);
+
+        queryWrapper = new QueryWrapper<>();
+        int startSeq = 0;
+        if (newIndex > 0) {
+            int beforeItemIndex = 0;
+            beforeItemIndex = newIndex > oldIndex?newIndex:newIndex-1;
+
+            queryWrapper.eq("group_id", groupId).orderByAsc("sequence").last("limit " +beforeItemIndex+", 1");
+            List<Stages> dataList = stagesService.list(queryWrapper);
+            if (dataList.size() > 0) {
+                Stages beforeItem = dataList.get(0);
+                startSeq = beforeItem.getSequence() + 1;
+            } else {
+                startSeq = 1;
+            }
+        } else {
+            //移动到了第一个位置
+            startSeq = 1;
+        }
+
+        curItem.setSequence(startSeq);
+        //在新位置下面的包括原来占据新位置的,全部调整,从startSeq开始递增
+        queryWrapper = new QueryWrapper<Stages>();
+        queryWrapper.eq("group_id", groupId).ge("sequence", startSeq).orderByAsc("sequence");
+        List<Stages> dataList = stagesService.list(queryWrapper);
+        if (dataList.size() > 0) {
+            List<Stages> batchList = new ArrayList<>();
+            for (Stages t:dataList) {
+                Stages item = new Stages();
+                item.setId(t.getId());
+                startSeq++;
+                item.setSequence(startSeq);
+                batchList.add(item);
+            }
+            stagesService.updateBatchById(batchList);
+        }
+
+        stagesService.updateById(curItem);
+
+        return new HttpRespMsg();
+    }
+
+    //按照项目选择任务列表名称,也可以做为工序/工种/岗位来筛选
+    @RequestMapping("/getProjectStages")
+    public HttpRespMsg changeStageOrder(Integer projectId) {
+        return stagesService.getProjectStages(projectId);
+    }
+
+    //获取分组下的阶段列表
+    @RequestMapping("/getProjectStagesByGroup")
+    public HttpRespMsg getProjectStagesByGroup(Integer groupId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = stagesService.list(new QueryWrapper<Stages>().eq("group_id", groupId));
+        return msg;
+    }
+}
+

+ 95 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SubProjectController.java

@@ -0,0 +1,95 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.ProjectTimer;
+import com.management.platform.entity.SubProject;
+import com.management.platform.mapper.ProjectTimerMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProjectService;
+import com.management.platform.service.SubProjectService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-03-17
+ */
+@RestController
+@RequestMapping("/sub-project")
+public class SubProjectController {
+    @Autowired
+    private SubProjectService subProjectService;
+    @Resource
+    private ProjectTimerMapper projectTimerMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+
+    /**
+     * 获取子项目列表
+     */
+    @RequestMapping("/list")
+    public HttpRespMsg list(Integer projectId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = subProjectService.list(new QueryWrapper<SubProject>().eq("project_id", projectId));
+        return msg;
+    }
+
+    /**
+     * 添加或编辑项目
+     * id 要编辑项目的id 可填
+     * name 子项目的名称
+     * projectId 父项目id
+     */
+    @RequestMapping("/saveOrUpdate")
+    public HttpRespMsg saveOrUpdate(SubProject item) {
+        if (item.getId() == null) {
+            //赋予公司id
+            Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
+            item.setCompanyId(companyId);
+        }
+        subProjectService.saveOrUpdate(item);
+        if (item.getId() != null) {
+            //修改相关表
+            ProjectTimer timer = new ProjectTimer();
+            timer.setSubProjectName(item.getName());
+            projectTimerMapper.update(timer, new QueryWrapper<ProjectTimer>().eq("sub_project_id", item.getId()));
+        }
+        return new HttpRespMsg();
+    }
+
+    /**
+     * 删除项目
+     * id 要删除的项目的id
+     */
+    @RequestMapping("/deleteProject")
+    public HttpRespMsg deleteProject(@RequestParam Integer id) {
+        subProjectService.removeById(id);
+        return new HttpRespMsg();
+    }
+
+    /**
+     * 查询某个项目内子项目的统计成本
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    @RequestMapping("/getTimeCost")
+    public HttpRespMsg getTimeCost(String startDate, String endDate, Integer id) {
+        return subProjectService.getTimeCost(startDate, endDate,id);
+    }
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SysConfigController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-06-26
+ */
+@RestController
+@RequestMapping("/sys-config")
+public class SysConfigController {
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SysFunctionController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 菜单功能权限关联表 前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-06-03
+ */
+@RestController
+@RequestMapping("/sys-function")
+public class SysFunctionController {
+
+}
+

+ 0 - 0
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/controller/SysModuleController.java


Неке датотеке нису приказане због велике количине промена