zhouyy 1 mese fa
parent
commit
b8860cf444
43 ha cambiato i file con 31082 aggiunte e 16722 eliminazioni
  1. 7 0
      fhKeeper/formulahousekeeper/management-crm/pom.xml
  2. 2509 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ReportController.java
  3. 433 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Report.java
  4. 106 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportBatch.java
  5. 66 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportExtraDegree.java
  6. 75 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportImportLog.java
  7. 90 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportLog.java
  8. 72 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportLogDetail.java
  9. 58 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportProfessionProgress.java
  10. 3 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/DepartmentVO.java
  11. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/DepartmentMapper.java
  12. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportBatchMapper.java
  13. 19 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportExtraDegreeMapper.java
  14. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportImportLogMapper.java
  15. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportLogDetailMapper.java
  16. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportLogMapper.java
  17. 209 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportMapper.java
  18. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportProfessionProgressMapper.java
  19. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportPushLogMapper.java
  20. 40 40
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CompanyDingdingService.java
  21. 55 56
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/DingDingService.java
  22. 42 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/LeaveSheetService.java
  23. 294 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProjectService.java
  24. 23 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportExtraDegreeService.java
  25. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportLogDetailService.java
  26. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportLogService.java
  27. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportProfessionProgressService.java
  28. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportPushLogService.java
  29. 155 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportService.java
  30. 589 589
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java
  31. 10 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CustomServiceImpl.java
  32. 2515 2516
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  33. 820 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  34. 13517 13519
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  35. 184 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java
  36. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportLogDetailServiceImpl.java
  37. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportLogServiceImpl.java
  38. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportProfessionProgressServiceImpl.java
  39. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportPushLogServiceImpl.java
  40. 8906 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  41. 3 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml
  42. 17 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/DepartmentMapper.xml
  43. 23 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ReportExtraDegreeMapper.xml

+ 7 - 0
fhKeeper/formulahousekeeper/management-crm/pom.xml

@@ -14,6 +14,13 @@
     <version>3.4.0</version>
 
     <dependencies>
+        <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.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>

File diff suppressed because it is too large
+ 2509 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ReportController.java


+ 433 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Report.java

@@ -0,0 +1,433 @@
+package com.management.platform.entity;
+
+import java.math.BigDecimal;
+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 java.util.HashMap;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.management.platform.entity.vo.WorktimeItem;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-01-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class Report extends Model<Report> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * user表外键 报告的作者
+     */
+    @TableField("creator_id")
+    private String creatorId;
+
+    /**
+     * project表外键 相关项目
+     */
+    @TableField("project_id")
+    private Integer projectId;
+
+    /**
+     * 工作日期
+     */
+    @TableField("create_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate createDate;
+
+    /**
+     * 工作时间
+     */
+    @TableField("working_time")
+    private Double workingTime;
+
+    /**
+     * 报告内容; 根据multi_worktime的取值,形式有差别
+     */
+    @TableField("content")
+    private String content;
+
+    /**
+     * 审查状态 0-未审核 1-已通过 2-未通过, -1-导入待审核, 3草稿
+     */
+    @TableField("state")
+    private Integer state;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    private LocalDateTime createTime;
+
+    /**
+     * 0-全天, 1-上午,2-下午
+     */
+    @TableField("time_type")
+    private Integer timeType;
+
+    /**
+     * 成本
+     */
+    @TableField("cost")
+    private BigDecimal cost;
+
+    /**
+     * 开始时间
+     */
+    @TableField("start_time")
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    @TableField("end_time")
+    private String endTime;
+
+    /**
+     * 员工填写时长类型
+     */
+    @TableField("report_time_type")
+    private Integer reportTimeType;
+
+    /**
+     * 子项目id
+     */
+    @TableField("sub_project_id")
+    private Integer subProjectId;
+
+    /**
+     * 任务id
+     */
+    @TableField("task_id")
+    private Integer taskId;
+
+    /**
+     * 是否是加班
+     */
+    @TableField("is_overtime")
+    private Integer isOvertime;
+
+    /**
+     * 用时占比
+     */
+    @TableField("progress")
+    private Integer progress;
+
+
+    @TableField(exist = false)
+    private List<SubProject> subProjectList;
+    @TableField(exist = false)
+    private List<UserRecentTask> taskList;
+    @TableField(exist = false)
+    private List<ReportProfessionProgress> professionProgressList;
+    @TableField(exist = false)
+    private List<Stages> stages;
+
+    /**
+     * 部门审核状态: -1 专业未审核,0-部门未审核,1-已通过,2-未通过
+     */
+    @TableField("department_audit_state")
+    private Integer departmentAuditState;
+
+
+    /**
+     * 阶段/岗位/工序
+     */
+    @TableField("stage")
+    private String stage;
+
+
+    /**
+     * 图片的数组字符串
+     */
+    @TableField("pic_str")
+    private String picStr;
+
+
+    @TableField(exist = false)
+    private String picAdd;
+
+    /**
+     * 传给客户端的图片数组
+     */
+    @TableField(exist = false)
+    private List<String> pics;
+    /**
+     * 是否是多个时间工作事项
+     */
+    @TableField("multi_worktime")
+    private Integer multiWorktime;
+
+
+    @TableField(exist = false)
+    private List<WorktimeItem> worktimeList;
+    /**
+     * 驳回原因
+     */
+    @TableField("reject_reason")
+    private String rejectReason;
+
+    /**
+     * 驳回人姓名
+     */
+    @TableField("reject_username")
+    private String rejectUsername;
+
+    /**
+     * 驳回人id
+     */
+    @TableField("reject_userid")
+    private String rejectUserid;
+
+
+    /**
+     * 选择的自定义维度
+     */
+    @TableField("degree_id")
+    private Integer degreeId;
+
+
+    @TableField(exist = false)
+    private List<HashMap> degreeList;
+    /**
+     * 公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 代填或者导入的用户id
+     */
+    @TableField("fill_userid")
+    private String fillUserid;
+
+    /**
+     * 审核流程:当前审核的部门id
+     */
+    @TableField("audit_deptid")
+    private Integer auditDeptid;
+
+    /**
+     * 审核流程: 是否是部门审核
+     */
+    @TableField("is_dept_audit")
+    private Integer isDeptAudit;
+
+    /**
+     * 审核流程:当前审核的部门负责人id
+     */
+    @TableField("audit_dept_managerid")
+    private String auditDeptManagerid;
+
+    /**
+     * 是否是最后一步审核
+     */
+    @TableField("is_final_audit")
+    private Integer isFinalAudit;
+
+    /**
+     * 审核流程:审核过程中,项目的审核状态; 0-待审核,1-审核通过
+     */
+    @TableField("project_audit_state")
+    private Integer projectAuditState;
+
+
+    /**
+     * 任务分组id
+     */
+    @TableField("group_id")
+    private Integer groupId;
+
+    @TableField(exist = false)
+    private String groupName;
+
+    @TableField(exist = false)
+    private List<TaskGroup> taskGroups;
+    /**
+     * 自定义的数值
+     */
+    @TableField("custom_data")
+    private Double customData;
+
+    /**
+     * 项目审核人id
+     */
+    @TableField("project_auditor_id")
+    private String projectAuditorId;
+
+    @TableField(exist = false)
+    private List<ProjectAuditor> auditUserList;
+
+    @TableField(exist = false)
+    private String projectAuditorName;
+
+
+    /**
+     * 工时日报所属部门id
+     */
+    @TableField("dept_id")
+    private Integer deptId;
+
+    /**
+     * 加班时长
+     */
+    @TableField("overtime_hours")
+    private Double overtimeHours;
+
+
+    /**
+     * 加班薪资
+     */
+    @TableField("overtime_cost")
+    private BigDecimal overtimeCost;
+
+
+    @TableField(exist = false)
+    private Integer taskFinish;
+
+    /**
+     * 自定义文本信息内容
+     */
+    @TableField("custom_text")
+    private String customText;
+
+    /**
+     * 对应成本项的id
+     */
+    @TableField("basecost_id")
+    private Integer basecostId;
+
+
+    /**
+     * 项目日报审核时间
+     */
+    @TableField("project_audit_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    private LocalDateTime projectAuditTime;
+
+
+    /**
+     * 任务分组负责人审核状态: 0-待审核,1-审核通过
+     */
+    @TableField("group_audit_state")
+    private Integer groupAuditState;
+
+    /**
+     * 评价
+     */
+    @TableField("evaluate")
+    private String evaluate;
+
+    /**
+     * 是否属于自动审核通过  0-不属于 1-属于
+     */
+    @TableField("report_auto_approve")
+    private Integer reportAutoApprove;
+
+
+    @TableField(exist = false)
+    private ReportAuditorSetting auditorSetting;
+
+    @TableField(exist = false)
+    private User auditorFirst;
+    @TableField(exist = false)
+    private User auditorSec;
+    @TableField(exist = false)
+    private User auditorThird;
+    @TableField(exist = false)
+    private User ccUserid;
+    /**
+     * 批量填报时的report_batch表id
+     */
+    @TableField("batch_id")
+    private Integer batchId;
+
+
+    /**
+     * 昱众-角色类型:0-PM,1-CRC
+     */
+    @TableField("extra_field1")
+    private Integer extraField1;
+
+    /**
+     * 昱众-工作职责
+     */
+    @TableField("extra_field2")
+    private Integer extraField2;
+
+    /**
+     * 昱众-工作内容
+     */
+    @TableField("extra_field3")
+    private Integer extraField3;
+
+    @TableField(exist = false)
+    private List<ProFunWorkContext> workContentList;
+
+    @TableField(exist = false)
+    private Integer extraField2Name;
+
+    @TableField(exist = false)
+    private Integer extraField3Name;
+
+
+    /**
+     * SAP项目服务ID
+     */
+    @TableField("sap_service_id")
+    private Integer sapServiceId;
+
+    @TableField(exist = false)
+    private String sapServiceName;
+
+    @TableField(exist = false)
+    private List<SapProjectService> serviceList;
+
+    @TableField(exist = false)
+    private String projectName;
+    @TableField(exist = false)
+    private String taskName;
+
+    /**
+     * 多选自定义维度id
+     */
+    @TableField("multi_degr_id")
+    private String multiDegrId;
+
+    //用于后端传递给前端的数组
+    @TableField(exist = false)
+    private List<Integer> multiDegrIdList;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 106 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportBatch.java

@@ -0,0 +1,106 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportBatch extends Model<ReportBatch> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("creator_id")
+    private String creatorId;
+
+    /**
+     * 开始日期
+     */
+    @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;
+
+    /**
+     * 总工作时长
+     */
+    @TableField("total_work_time")
+    private Double totalWorkTime;
+    @TableField(exist = false)
+    private Double reportTime;
+
+    /**
+     * 0-待审核,1-已通过,2-已驳回
+     */
+    @TableField("state")
+    private Integer state;
+
+    @TableField("create_time")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField(exist = false)
+    private String name;
+
+    @TableField(exist = false)
+    private String departmentName;
+
+    @TableField(exist = false)
+    private List<Map> data;
+
+    @TableField(exist = false)
+    private String dateStr;
+
+
+    @TableField(exist = false)
+    private String reportIds;
+
+    /**
+     * 周总结
+     */
+    @TableField("summary")
+    private String summary;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 66 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportExtraDegree.java

@@ -0,0 +1,66 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportExtraDegree extends Model<ReportExtraDegree> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 自定义数据内容
+     */
+    @TableField("name")
+    private String name;
+
+    /**
+     * 编号
+     */
+    @TableField("code")
+    private String code;
+
+    /**
+     * 备注
+     */
+    @TableField("rmark")
+    private String rmark;
+
+    @TableField(exist = false)
+    private String projects;
+
+    @TableField(exist = false)
+    private Integer projectNum;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 75 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportImportLog.java

@@ -0,0 +1,75 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+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-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportImportLog extends Model<ReportImportLog> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 导入人id
+     */
+    @TableField("user_id")
+    private String userId;
+
+    /**
+     * 导入人姓名
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 原文件名称
+     */
+    @TableField("file_name")
+    private String fileName;
+
+    /**
+     * 服务器上的文件名称
+     */
+    @TableField("server_name")
+    private String serverName;
+
+    /**
+     * 导入时间
+     */
+    @TableField("indate")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private LocalDateTime indate;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 90 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportLog.java

@@ -0,0 +1,90 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-06-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportLog extends Model<ReportLog> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 日报创建人
+     */
+    @TableField("creator_id")
+    private String creatorId;
+
+    /**
+     * 日报所属日期
+     */
+    @TableField("create_date")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate createDate;
+
+    /**
+     * 相关项目日报id
+     */
+    @TableField("report_ids")
+    private String reportIds;
+
+    /**
+     * 日志内容
+     */
+    @TableField("msg")
+    private String msg;
+
+    /**
+     * 操作人
+     */
+    @TableField("operator_id")
+    private String operatorId;
+
+    /**
+     * 所属公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("operate_date")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
+    private LocalDateTime operateDate;
+
+    @TableField(exist = false)
+    private String creatorName;
+
+    @TableField(exist = false)
+    private String operateName;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 72 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportLogDetail.java

@@ -0,0 +1,72 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportLogDetail extends Model<ReportLogDetail> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 日报的id
+     */
+    @TableField("report_id")
+    private Integer reportId;
+
+    /**
+     * 审核内容
+     */
+    @TableField("msg")
+    private String msg;
+
+    /**
+     * 操作人id
+     */
+    @TableField("operator_id")
+    private String operatorId;
+
+    /**
+     * 操作日期
+     */
+    @TableField("operate_date")
+    private LocalDateTime operateDate;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 日报所属工作日期
+     */
+    @TableField("work_date")
+    private LocalDate workDate;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 58 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/ReportProfessionProgress.java

@@ -0,0 +1,58 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-31
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ReportProfessionProgress extends Model<ReportProfessionProgress> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("project_id")
+    private Integer projectId;
+
+    @TableField("report_id")
+    private Integer reportId;
+
+    @TableField("profession_id")
+    private Integer professionId;
+
+    @TableField("progress")
+    private Integer progress;
+
+    /**
+     * 0-待审核,1-审核通过,2-驳回
+     */
+    @TableField("audit_state")
+    private Integer auditState;
+
+
+    @TableField(exist = false)
+    private String professionName;
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 3 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/vo/DepartmentVO.java

@@ -24,10 +24,12 @@ public class DepartmentVO {
     private Integer ddDeptid;
     private Integer pushToSap;
 
-    private Integer customertotal;//客户总量
+    private Integer customertotal;//客户总量 新增客户数
     private Integer customerDeal;//客户成交量
     private Double dealRate;//客户成交量率
     private Integer num;//客户数量
     private Integer saleNum;//交易客户数量
     private String departmentName;
+
+    private Integer earlierCusTotal;//客户总量
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/DepartmentMapper.java

@@ -36,4 +36,6 @@ public interface DepartmentMapper extends BaseMapper<Department> {
     List<DepartmentVO> getCustomerTotalCount(String startDate, String endDate, Integer departmentId, Integer companyId);
 
     List<DepartmentVO> getCustomerTransferRate(String startDate, String endDate, Integer departmentId, Integer companyId);
+
+    List<DepartmentVO> getEarlierCusCount(String endDate, Integer departmentId, Integer companyId);
 }

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

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

+ 19 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportExtraDegreeMapper.java

@@ -0,0 +1,19 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ReportExtraDegree;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-16
+ */
+public interface ReportExtraDegreeMapper extends BaseMapper<ReportExtraDegree> {
+
+    public List<ReportExtraDegree> getAll(Integer companyId);
+}

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

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

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

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

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

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

+ 209 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -0,0 +1,209 @@
+package com.management.platform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.management.platform.entity.Report;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2019-12-31
+ */
+public interface ReportMapper extends BaseMapper<Report> {
+    List<HashMap<String, Object>> getAllReportByDate(@Param("startDate") String startDate,
+                                                     @Param("companyId") Integer companyId,
+                                                     @Param("userId") String userId,
+                                                     @Param("endDate") String endDate,
+                                                     @Param("projectId") Integer projectId,
+                                                     @Param("stateKey") Integer stateKey,
+                                                     @Param("branchDepartment")List<Integer> branchDepartment
+    );
+    List<HashMap<String, Object>> getAllReportByDateWithReportLog(@Param("startDate") String startDate,
+                                                                  @Param("companyId") Integer companyId,
+                                                                  @Param("userId") String userId,
+                                                                  @Param("endDate") String endDate,
+                                                                  @Param("projectId") Integer projectId,
+                                                                  @Param("stateKey") Integer stateKey,
+                                                                  @Param("branchDepartment")List<Integer> branchDepartment
+    );
+    List<HashMap<String, Object>> getProjectMembReportByDate(@Param("startDate") String startDate,
+                                                             @Param("companyId") Integer companyId,
+                                                             @Param("leaderId") String leaderId,
+                                                             @Param("endDate") String endDate,
+                                                             @Param("projectId") Integer projectId,
+                                                             @Param("stateKey") Integer stateKey,
+                                                             @Param("branchDepartment")List<Integer> branchDepartment,
+                                                             @Param("ccProjectIds")List<Integer> ccProjectIds);
+    List<HashMap<String, Object>> getProjectMembReportByDateWithReportLog(@Param("startDate") String startDate,
+                                                                          @Param("companyId") Integer companyId,
+                                                                          @Param("leaderId") String leaderId,
+                                                                          @Param("endDate") String endDate,
+                                                                          @Param("projectId") Integer projectId,
+                                                                          @Param("stateKey") Integer stateKey,
+                                                                          @Param("branchDepartment")List<Integer> branchDepartment,
+                                                                          @Param("ccProjectIds")List<Integer> ccProjectIds);
+    //获取部门下的人员的日报
+    List<HashMap<String, Object>> getDeptMembReportByDate(@Param("startDate") String startDate,
+                                                          @Param("companyId") Integer companyId,
+                                                          @Param("deptIds") List<Integer> deptIds,
+                                                          @Param("endDate") String endDate, @Param("projectId") Integer projectId,@Param("stateKey")Integer stateKey,@Param("branchDepartment")List<Integer> branchDepartment);
+
+    //按当前人员获取本人报告
+    List<Map<String, Object>> getReportByDate(@Param("date") String date, @Param("id") String id);
+    //获取项目经理所管理的人员的报告
+    List<Map<String, Object>> getInchargeReportByDate(@Param("date") String date, @Param("id") String id, @Param("state") Integer state);
+
+    //获取待日报审核的列表
+    List<Map<String, Object>> getAuditReportList(@Param("date") String date, @Param("companyId") Integer companyId,
+                                                 @Param("departmentId") Integer departmentId,
+                                                 @Param("projectId") Integer projectId,
+                                                 @Param("auditorId") String auditorId,
+                                                 @Param("isEngeering") Integer isEngeering,
+                                                 @Param("startDate") String startDate,
+                                                 @Param("endDate") String endDate,
+                                                 @Param("targetUserId") List<String> targetUserId,
+                                                 @Param("auditUserId")String auditUserId
+    );
+
+    //获取本人负责的专业的相关的日报
+    List<Map<String, Object>> getProfessionInchargeReportByDate(@Param("date") String date,
+                                                                @Param("id") String id,
+                                                                @Param("state") Integer state
+    );
+
+    List<Map<String, Object>> getUserReportByDate(@Param("date") String date, @Param("userIds") List<String> userIds);
+
+    List<Map<String, Object>> getReportByTask(@Param("taskId") Integer taskId);
+
+    List<Map<String, Object>> getReportNameByDate(@Param("date") String date, @Param("companyId") Integer companyId, @Param("leaderId") String leaderId);
+
+    List<Map<String, Object>> getReportNameByDateAndDept(@Param("date") String date,
+                                                         @Param("deptIds") List<Integer> deptIds,
+                                                         @Param("userId") String userId,
+                                                         @Param("companyId") Integer company);
+    List<Map<String, Object>> getDetailByStateInMyProfession(@Param("state") Integer state,
+                                                             @Param("companyId") Integer companyId,
+                                                             @Param("leaderId") String leaderId);
+
+    List<Map<String, Object>> getRealProjectTime(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate, Integer companyId);
+
+    List<Map<String, Object>> getReportFillStatus(String startDate, String endDate, String userId);
+
+    List<Map<String, Object>> getDepartmentDetailByState(@Param("departmentIds") List<Integer> departmentIds,
+                                                         @Param("companyId") Integer companyId);
+
+    List<Map<String, Object>> getUserDailyWorkTime(Integer companyId, String startDate, String endDate, List<Integer> deptIds, String leaderId);
+
+    List<Map<String, Object>> getUserWorkingTimeByRange(Integer companyId, String startDate, String endDate);
+
+    List<Report> selectSimpleTime(Integer companyId, String startDate, String endDate);
+
+    List<Map<String, Object>> getDeptImportAuditList(@Param("companyId") Integer companyId,
+                                                     @Param("leaderId") String leaderId,
+                                                     @Param("startDate") String startDate,
+                                                     @Param("endDate") String endDate,
+                                                     @Param("departmentIdList") List<Integer> departmentIdList,
+                                                     @Param("projectId") Integer projectId,
+                                                     @Param("startIndex") Integer startIndex,
+                                                     @Param("pageSize") Integer pageSize
+    );
+    void approveAllDeptImportList(@Param("companyId") Integer companyId,
+                                  @Param("leaderId") String leaderId);
+    Long getDeptImportAuditListCount(@Param("companyId") Integer companyId,
+                                     @Param("leaderId") String leaderId,
+                                     @Param("startDate") String startDate,
+                                     @Param("endDate") String endDate,
+                                     @Param("departmentIdList") List<Integer> departmentIdList,
+                                     @Param("projectId") Integer projectId);
+    List<Map<String, Object>> selectFillReportUserList(Integer companyId, String startDate, String endDate);
+
+    List<Map<String, Object>> getMonthReportProjectList(Integer companyId, String startDate, String endDate);
+
+    void deleteUserSameDayReport(Integer companyId, @Param("dateReportList") List<Report> dateReportList, Integer needDeptAudit);
+
+    List<Map<String, Object>> getDuplicate(Integer companyId);
+
+    List<Map> getSameDayPassReport(Integer companyId, @Param("dateReportList") List<Report> dateReportList);
+
+    double getMyOvertime(String userId, String startDate);
+
+    List<Map<String, Object>> getProWaitingApproveCnt(Integer companyId);
+
+    List<Map<String, Object>> getDeptWaitingApproveCnt(Integer companyId);
+
+    List<Map<String, Object>> getProjectCost(Integer companyId, List<Integer> projectIds);
+
+    //获取项目填报的成本,包括已审核和待审核的
+    List<Map<String, Object>> getProjectFillCost(Integer companyId, List<Integer> projectIds);
+
+    List<Map<String, Object>> getOneProjectBaseCost(Integer projectId);
+
+    @Update("update report set task_id = null where task_id=#{taskId}")
+    void deleteReportTask(Integer taskId);
+
+    List<Map<String, Object>> getUserReportTimelinessRate(Integer companyId,String startDate, String endDate,String userId,List<Integer> deptIds);
+    @Select("SELECT report.id, report.creator_id,  DATE_FORMAT(report.`create_date`, '%Y-%m-%d') AS create_date FROM report WHERE report.state = 1  AND report.`project_audit_state`=0 \n" +
+            "AND EXISTS(SELECT 1 FROM audit_workflow_time_setting s, `user` u WHERE s.dept_id = u.department_id AND u.id = report.`creator_id` AND s.audit_dept_id IS NOT NULL)\n" +
+            "AND EXISTS(SELECT 1 FROM report r WHERE report.`creator_id` = r.creator_id AND report.`create_date` = r.create_date AND report.id <> r.id AND r.state = 0)\n" +
+            "AND report.audit_dept_managerid IS NULL AND report.`company_id` = #{companyId}\n")
+    List<Map<String, Object>> getErrorData(Integer companyId);
+    //获取审批流程中卡住的数据,项目审核过了,但是没有进入到部门审核,也没最终审核
+    @Select("SELECT report.id, user.name, create_date, creator_id, state, report.create_time, project_audit_time,u.name AS auditorName FROM report\n" +
+            "LEFT JOIN `user` ON user.id = report.`creator_id` \n" +
+            "LEFT JOIN `user` u ON u.id = report.`project_auditor_id`\n" +
+            "WHERE state = 0 AND project_audit_state = 1 AND is_dept_audit=0 AND is_final_audit=0 \n" +
+            "AND NOT EXISTS(SELECT 1 FROM report r WHERE r.id <> report.id AND r.`creator_id` = report.`creator_id` AND r.`create_date` = report.`create_date` AND r.project_audit_state = 0)\n" +
+            "AND EXISTS (SELECT 1 FROM report r WHERE r.id <> report.id AND r.`creator_id` = report.`creator_id` AND r.`create_date` = report.`create_date`)\n")
+    List<Map<String, Object>> getProcessErrorData();
+
+    List<Map<String, Object>> getUploadThirdReportData(Integer companyId,@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
+
+    List<HashMap<String, Object>> geReportByProject(String startDate, Integer companyId, String endDate);
+
+    Map<String, Object> getDefaultDegree(Integer companyId, String userId, Integer projectId);
+
+    Map<String, Object> selectCostTimeByProject(String startDate, String endDate, Integer projectId);
+
+    List<HashMap<String, Object>> selectFill(String userId,LocalDate startDate, LocalDate endDate);
+
+    List<Map<String, Object>> getCcReportNameByDate(String date, Integer companyId, String leaderId);
+
+    List<Map<String, Object>> getCcReportByDate(@Param("date") String date, @Param("id") String id, @Param("state") Integer state);
+
+    List<Map<String, Object>> getPushProjectReportToSap(Integer companyId, String startDate, String endDate,String userId,Integer reportId);
+
+    List<Report> getSumWorkingTime(ArrayList<Integer> deptIds, String startDate, String endDate);
+
+    Double getReallWorkingTimeByProjectId(Integer id);
+
+    Double getReallWorkingTimeByProjectAndGroup(Integer projectId, Integer taskGroupId);
+
+    List<Map<String, Object>> getProjectPlanData(Integer companyId,@Param("list") List<Integer> taskIds, String startDate, String endDate);
+
+    List<String> getUserIds(ArrayList<Integer> deptIds, String startDate, String endDate);
+
+    List<Map<String, Object>> getProjectTimeCost(Integer companyId,Integer projectId);
+
+    List<Map<String, Object>> getProjectMainTimeCost(Integer companyId,String requestProjectMainCode);
+
+    List<Map<String, Object>> getTaskGroupPlanTime(@Param("list") List<Integer> projectIds);
+
+    List<Map<String, Object>> getUserWorkTimeByCategory(Integer categoryId, String userId,Integer companyId,@Param("list")List<Integer> deptIds, Integer deptId, String startDate, String endDate);
+
+    List<Map<String, Object>> selectReallyTimeWithMap(Integer companyId,Integer projectId);
+    List<Map<String, Object>> getCustomDataWithDate(String startDate, String endDate, Integer companyId);
+
+    @Select("SELECT report.id,report.creator_id,  report.`create_date`, report.`create_time`, group_id, task_group.`name`,report.project_id, task_group.`project_id` AS error_pid FROM report LEFT JOIN task_group ON task_group.id = report.`group_id` WHERE report.`company_id`=#{companyId} AND report.project_id <> task_group.`project_id`  AND create_date BETWEEN #{startDate} AND #{endDate} ORDER BY report.id DESC")
+    List<Map<String, Object>> selectErrorGroupData(Integer companyId, String startDate, String endDate);
+}

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

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

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

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ReportPushLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-17
+ */
+public interface ReportPushLogMapper extends BaseMapper<ReportPushLog> {
+
+}

+ 40 - 40
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CompanyDingdingService.java

@@ -1,40 +1,40 @@
-//package com.management.platform.service;
-//
-//import com.baomidou.mybatisplus.extension.service.IService;
-//import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
-//import com.management.platform.entity.CompanyDingding;
-//
-//import java.time.LocalDate;
-//import java.util.List;
-//
-///**
-// * <p>
-// *  服务类
-// * </p>
-// *
-// * @author Seyason
-// * @since 2021-06-27
-// */
-//public interface CompanyDingdingService extends IService<CompanyDingding> {
-//
-//    public void sendFillReportAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
-//
-//    public void sendRejectReportMsg(Integer companyId, String date, String projectNames, String reason, String auditorName, String useridList);
-//
-//    public void sendLeaveApplyAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
-//
-//    public void sendReportWaitingApplyMsg(Integer companyId, Long agentId, Long auditNum, String useridList);
-//
-//    public void sendReportApproveMsg(Integer companyId, Long agentId, String auditorName, String evaluate, LocalDate date, String useridList);
-//
-//    public void sendBusinessTripSettingMsg(Integer companyId, Long agentId, String useridList);
-//
-//    public void sendNewTaskMsg(CompanyDingding dingding, String userId, String title, String endDate);
-//
-//
-//    public void sendFinishMileStoneMsg(CompanyDingding dingding, String useridList, String taskName, Integer projectId, String project, String finishDate);
-//
-//    public void sendOAMsg(CompanyDingding dingding, String useridList,String titleText,String content, List<OapiMessageCorpconversationAsyncsendV2Request.Form> form,Integer projectId);
-//
-//    public void sendInnerLinkMsg(CompanyDingding dingding, String useridList, String title, String alertMsg);
-//}
+package com.management.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
+import com.management.platform.entity.CompanyDingding;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-06-27
+ */
+public interface CompanyDingdingService extends IService<CompanyDingding> {
+
+    public void sendFillReportAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
+
+    public void sendRejectReportMsg(Integer companyId, String date, String projectNames, String reason, String auditorName, String useridList);
+
+    public void sendLeaveApplyAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
+
+    public void sendReportWaitingApplyMsg(Integer companyId, Long agentId, Long auditNum, String useridList);
+
+    public void sendReportApproveMsg(Integer companyId, Long agentId, String auditorName, String evaluate, LocalDate date, String useridList);
+
+    public void sendBusinessTripSettingMsg(Integer companyId, Long agentId, String useridList);
+
+    public void sendNewTaskMsg(CompanyDingding dingding, String userId, String title, String endDate);
+
+
+    public void sendFinishMileStoneMsg(CompanyDingding dingding, String useridList, String taskName, Integer projectId, String project, String finishDate);
+
+    public void sendOAMsg(CompanyDingding dingding, String useridList,String titleText,String content, List<OapiMessageCorpconversationAsyncsendV2Request.Form> form,Integer projectId);
+
+    public void sendInnerLinkMsg(CompanyDingding dingding, String useridList, String title, String alertMsg);
+}

+ 55 - 56
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/DingDingService.java

@@ -1,56 +1,55 @@
-//package com.management.platform.service;
-//
-//import com.alibaba.fastjson.JSONArray;
-//import com.management.platform.entity.CompanyDingding;
-//import com.management.platform.entity.UserDingdingTime;
-//import com.management.platform.util.HttpRespMsg;
-//import com.taobao.api.ApiException;
-//
-//import java.time.LocalDate;
-//
-//public interface DingDingService {
-//    public HttpRespMsg initSystem(String corpid) throws ApiException;
-//
-//    public void corpAuth(String corpid, String corpName, String authUserId, Long agentId) throws ApiException;
-//
-//    public String syncCorpMembs(String corpid) throws ApiException;
-//
-//    public void updateSuiteTicket(String suiteTicket);
-//
-//    HttpRespMsg getUserByCode(String code, String corpid);
-//
-//    public void asyncHandleMsg(String decryptMsg);
-//
-//    HttpRespMsg syncCorpInfo(String corpid);
-//
-//    HttpRespMsg syncCorpAgent(String corpid);
-//
-//    HttpRespMsg getUnActiveCorp();
-//
-//    HttpRespMsg reAuthCorp(String corpid);
-//
-//
-//    public void syncCardTime(Integer companyId, String userId, String startDate, String endDate);
-//
-//    void syncLeaveTime(Integer companyId, String userId, String startDate, String endDate);
-//
-//    void syncUserWorkData(CompanyDingding dingding,String userId, String startDate, String endDate, boolean showLog, boolean onlySyncAttendance);
-//
-//    void getCorpSelfDefSmartReport(CompanyDingding dingding);
-//
-////    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, Integer departmentId, String userId, Integer pageIndex);
-//
-//    public HttpRespMsg syncLeaveQuotaData(Integer companyId);
-//
-//    HttpRespMsg removeCompInfo(String corpid);
-//
-//    HttpRespMsg initSuperManager(String corpid, String name);
-//
-//    void userLeaveOrg(String corpId, JSONArray userIdArray, LocalDate leaveDate);
-//
-//    void userAddOrg(String corpId, JSONArray userIdArray);
-//
-//    String inactiveUserNotInAuthRange(String corpid);
-//
-//    HttpRespMsg fixAttendance(Integer companyId);
-//}
+package com.management.platform.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.management.platform.entity.CompanyDingding;
+import com.management.platform.util.HttpRespMsg;
+import com.taobao.api.ApiException;
+
+import java.time.LocalDate;
+
+public interface DingDingService {
+    public HttpRespMsg initSystem(String corpid) throws ApiException;
+
+    public void corpAuth(String corpid, String corpName, String authUserId, Long agentId) throws ApiException;
+
+    public String syncCorpMembs(String corpid) throws ApiException;
+
+    public void updateSuiteTicket(String suiteTicket);
+
+    HttpRespMsg getUserByCode(String code, String corpid);
+
+    public void asyncHandleMsg(String decryptMsg);
+
+    HttpRespMsg syncCorpInfo(String corpid);
+
+    HttpRespMsg syncCorpAgent(String corpid);
+
+    HttpRespMsg getUnActiveCorp();
+
+    HttpRespMsg reAuthCorp(String corpid);
+
+
+    public void syncCardTime(Integer companyId, String userId, String startDate, String endDate);
+
+    void syncLeaveTime(Integer companyId, String userId, String startDate, String endDate);
+
+    void syncUserWorkData(CompanyDingding dingding,String userId, String startDate, String endDate, boolean showLog, boolean onlySyncAttendance);
+
+    void getCorpSelfDefSmartReport(CompanyDingding dingding);
+
+//    public HttpRespMsg getLeaveTypeList(String leaveCode, Integer companyId, Integer departmentId, String userId, Integer pageIndex);
+
+    public HttpRespMsg syncLeaveQuotaData(Integer companyId);
+
+    HttpRespMsg removeCompInfo(String corpid);
+
+    HttpRespMsg initSuperManager(String corpid, String name);
+
+    void userLeaveOrg(String corpId, JSONArray userIdArray, LocalDate leaveDate);
+
+    void userAddOrg(String corpId, JSONArray userIdArray);
+
+    String inactiveUserNotInAuthRange(String corpid);
+
+    HttpRespMsg fixAttendance(Integer companyId);
+}

+ 42 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/LeaveSheetService.java

@@ -0,0 +1,42 @@
+package com.management.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.LeaveSheet;
+import com.management.platform.util.HttpRespMsg;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-09
+ */
+public interface LeaveSheetService extends IService<LeaveSheet> {
+
+    HttpRespMsg add(LeaveSheet sheet, String userId);
+
+    HttpRespMsg delete(Integer id);
+
+    HttpRespMsg queryList(LeaveSheet sheet,  Integer pageIndex,  Integer pageSize);
+
+    HttpRespMsg approve(Integer id);
+
+    HttpRespMsg deny(Integer id, String reason);
+
+    HttpRespMsg summaryData(String keyword, String startDate, String endDate, String userId);
+
+    HttpRespMsg getOTAvaiDays(String userId);
+
+    HttpRespMsg exportLeaveData(String userId,Integer status, Integer leaveType, String startTime,String endTime);
+
+    HttpRespMsg cancel(Integer id, String userId);
+
+    HttpRespMsg auditList(LeaveSheet sheet, Integer pageIndex, Integer pageSize);
+
+    float leaveTimeSum(Integer companyId, String startDate, String endDate, float standardHours, float allDay, List<LeaveSheet> leaveSheets);
+
+    HttpRespMsg leaveDays(String startDate, String endDate);
+}

+ 294 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProjectService.java

@@ -0,0 +1,294 @@
+package com.management.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.Project;
+import com.management.platform.entity.ProjectSeparate;
+import com.management.platform.entity.vo.OvertimeListVO;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2020-01-03
+ */
+public interface ProjectService extends IService<Project> {
+    HttpRespMsg getProjectList(Integer forReport, HttpServletRequest request);
+
+    HttpRespMsg getProjectPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField,
+                               Integer status, Integer category, Integer projectId,Integer projectMainId,Integer deptId, String sortProp, Integer sortOrder,String inchagerId,String participation,String startDate,String endDate, HttpServletRequest request);
+
+    HttpRespMsg editProject(Integer id, String name, String code, String[] userIds, String inchargerId,
+                            Integer isPublic,
+                            String planStartDate,
+                            String planEndDate,
+                            Integer level,
+                            Double contractAmount,
+                            String changeContractReason,
+                            String projectBaseCostData,
+                            String projectKeyNodesData,
+                            Double budget,
+                            Integer customerId,
+                            String chosenLeaders,
+                            String associateDegrees,
+                            String associateDegreeNames,
+                            Integer taskGpIncharge,
+                            String auditUserIds,
+                            String ccUserIds,
+                            Integer category,
+                            String projectDesc,
+                            Integer projectMainId,
+                            String providerIds,
+                            String providerNames,
+                            HttpServletRequest request,
+                            ProjectSeparate projectSeparate,Double outputValue,Integer deptId,boolean onlyChangeParticipate,String buId,Integer manDay,String manDayStartDate,String plate1,
+                            String plate2,
+                            String plate3,
+                            String plate4,
+                            String plate5,
+                            String plate6,
+                            String plate7,
+                            String plate8,
+                            String plate9,
+                            String plate10);
+
+    HttpRespMsg deleteProject(Integer id, Integer force);
+
+    HttpRespMsg getTimeCost(String startDate, String endDate, String userIds,Integer projectId, Integer type,HttpServletRequest request);
+
+    HttpRespMsg getProjectCost(String startDate, String endDate, Integer projectId,Integer stateKey, HttpServletRequest request);
+
+    HttpRespMsg getCostInStage(String startDate, String endDate, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg getAllMembCost(String startDate, String endDate, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg exportTimeCost(Integer withMainProject, String exportContent,String startDate, String endDate, Integer projectId,String userIds, Boolean projectSum,Integer type,Integer deptId,Integer stateKey, Integer withPercent,Integer projectCategoryId, HttpServletRequest request);
+
+    HttpRespMsg updateProgress(Integer id, Integer progress, HttpServletRequest request);
+
+    HttpRespMsg updateStatus(Integer id, Integer status, LocalDate finishDate, HttpServletRequest request);
+
+    HttpRespMsg detail(Integer id, HttpServletRequest request);
+
+    HttpRespMsg detailTwo(Integer id, HttpServletRequest request);
+
+    HttpRespMsg taskSum(Integer id, HttpServletRequest request);
+
+    HttpRespMsg restartProject(Integer id);
+
+    HttpRespMsg addMemb(Integer id, String[] userId);
+
+    HttpRespMsg adjustBase(String baseCostData, Project project, String remark, HttpServletRequest request);
+
+    HttpRespMsg exportProfit(HttpServletRequest request);
+
+    HttpRespMsg exportProject(HttpServletRequest request);
+
+    HttpRespMsg getProjectTask(Integer pageIndex, Integer pageSize, Integer projectId,Integer groupId, HttpServletRequest request,Integer taskType);
+
+    HttpRespMsg exportProjectTask(HttpServletRequest request,Integer taskType);
+
+    HttpRespMsg getAllProjectCost(Integer pageIndex, Integer pageSize, Integer projectId,HttpServletRequest request);
+
+    HttpRespMsg exportAllProjectCost(HttpServletRequest request);
+
+    HttpRespMsg exportProjectEstimatedWorkTime(HttpServletRequest request,Integer projectId);
+
+    HttpRespMsg getProjectInAndOut(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg exportProjectInAndOut(HttpServletRequest request);
+
+    HttpRespMsg importData(String userId, MultipartFile file,Integer key,@RequestParam(defaultValue = "0") Integer changeParticipation, HttpServletRequest request);
+
+    HttpRespMsg getCustomerProjectInAndOut(Integer pageIndex, Integer pageSize, HttpServletRequest request,Integer customerId,Integer projectId);
+
+    HttpRespMsg exportCustomerProjectInAndOut(HttpServletRequest request);
+
+    HttpRespMsg getGanttData(Integer type, String startDate, String endDate, String userId, Integer projectId, String groupName,Integer taskType, HttpServletRequest request);
+
+    HttpRespMsg getProjectStagesCost(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request,String stageNames,String startDate,String endDate);
+
+    HttpRespMsg exportProjectStagesCost( HttpServletRequest request,String stageNames,String startDate,String endDate, Integer projectId);
+
+    HttpRespMsg getOvertimeList(OvertimeListVO overtimeListVO);
+
+    HttpRespMsg exportOvertimeList(OvertimeListVO overtimeListVO, HttpServletRequest request);
+
+    HttpRespMsg getDegreeCost(String startDate, String endDate, Integer projectId, String userId,HttpServletRequest request);
+
+    HttpRespMsg exportData(String keyword,
+                           @RequestParam(required = false, defaultValue = "1") Integer searchField,
+                           Integer projectId, //可以直接传projectId来进行匹配
+                           Integer status, Integer category,Integer projectMainId,Integer deptId,String inchagerId,String participation,HttpServletRequest request);
+
+    HttpRespMsg exportGroupData(Integer projectCategorySubId,HttpServletRequest request);
+
+    HttpRespMsg getCustomDataSum(String startDate, String endDate, String userId, HttpServletRequest request);
+
+    HttpRespMsg exportCustomDataSum(String startDate, String endDate, Integer projectId, String userId, HttpServletRequest request);
+
+    HttpRespMsg getMyUsers(HttpServletRequest request);
+
+    HttpRespMsg getMyParticiPMList(HttpServletRequest request);
+
+    HttpRespMsg getOvertimeDetail(String userId, Integer projectId, String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg saveBatchAccoDegrees(String ids, String associateDegrees, String associateDegreeNames, HttpServletRequest request);
+
+    HttpRespMsg getProjectCostAlarm(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg addBatchAccoDegrees(String ids, String associateDegrees, String associateDegreeNames, HttpServletRequest request);
+
+    HttpRespMsg getBaseCostAndRealCost(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg exportBaseCostAndRealCost(HttpServletRequest request);
+
+    HttpRespMsg getProjectsGroups(String projectIdArray);
+
+    HttpRespMsg batchAddMembToGroup(String membIdArray, String groupIds);
+
+    HttpRespMsg getProjectByCustomer(Integer customerId, HttpServletRequest request);
+
+    HttpRespMsg getTimeCostByCategory(String startDate, String endDate, String userIds, HttpServletRequest request);
+
+    HttpRespMsg exportTimeCostByCategory(String exportContent,String startDate, String endDate, Integer projectCategoryId, String userIds, Boolean projectSum, Integer type, HttpServletRequest request);
+
+    HttpRespMsg getUserWorkingTimeList(String userId, Integer projectId, String startDate, String endDate, Integer pageIndex, Integer pageSize,HttpServletRequest request,Integer departmentId);
+
+    HttpRespMsg exportUserWorkingTimeList(String userId, Integer projectId, String startDate, String endDate,HttpServletRequest request,Integer departmentId);
+
+    HttpRespMsg getUserReportTimelinessRate(HttpServletRequest request, String startDate, String endDate, Integer departmentId, String userId,Integer pageIndex,Integer pageSize);
+
+    HttpRespMsg exportReportTimelinessRate(HttpServletRequest request, String startDate, String endDate);
+
+    HttpRespMsg getWaitingReviewList(HttpServletRequest request, Integer stateKey, String userId,Integer pageIndex,Integer pageSize,String startDate,String endDate,Integer departmentId);
+
+    HttpRespMsg exportWaitingReviewList(HttpServletRequest request, Integer stateKey, String userId,String startDate,String endDate);
+
+    HttpRespMsg batchSetParticipation(HttpServletRequest request,String projectIdArray , String userIds);
+
+    HttpRespMsg suspendProject(Integer id);
+
+    HttpRespMsg getUserWorkingTimeStatic(String startDate, String endDate, Integer pageIndex, Integer pageSize, HttpServletRequest request,String userId,Integer departmentId);
+
+    HttpRespMsg exportUserWorkingTimeStatic(String startDate, String endDate, HttpServletRequest request, String userId, Integer departmentId);
+
+    HttpRespMsg batchDeleteProject(String projectIdArray, HttpServletRequest request);
+
+    HttpRespMsg modifyContract(Integer projectId, Double oldContractAmount, Double newContractAmount,String reason,HttpServletRequest request);
+
+    HttpRespMsg getTimeCostByMainProject(String startDate, String endDate, String userId, HttpServletRequest request);
+
+    HttpRespMsg getCostByGroup(String startDate, String endDate, Integer id, HttpServletRequest request);
+
+    HttpRespMsg getTimeCostByGroup(String startDate, String endDate, Integer pageIndex, Integer pageSize, Integer groupId, Integer projectId,HttpServletRequest request);
+
+    HttpRespMsg getTimeCostByGroupProject(String startDate, String endDate, Integer pageIndex, Integer pageSize, Integer groupId, Integer projectId,Integer projectCategorySubId, HttpServletRequest request);
+
+    HttpRespMsg exportGroupWithProjectTimeCost(String startDate, String endDate, Integer pageIndex, Integer pageSize, Integer groupId, Integer projectId,Integer projectCategorySubId, HttpServletRequest request);
+
+    HttpRespMsg getProjectBaseCost(Integer projectId, HttpServletRequest request, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportProjectBaseCost(HttpServletRequest request);
+
+    HttpRespMsg getTimeCostByUserCustom(String startDate, String endDate, String subCustomName, Integer customId,HttpServletRequest request,String fieldName);
+
+    HttpRespMsg exportTimeCostByUserCustom(String startDate, String endDate, String subCustomName, Integer customId, HttpServletRequest request, String fieldName);
+
+    HttpRespMsg importPersonnelWithGroup(MultipartFile file, HttpServletRequest request);
+
+    HttpRespMsg batchExchangeIncharger(String projectIds, String inchargerId, HttpServletRequest request);
+
+    HttpRespMsg fixParticipators(Integer companyId, HttpServletRequest request);
+
+    HttpRespMsg removeDuplicateParticipators(Integer companyId, HttpServletRequest request);
+
+    HttpRespMsg synchronizationProject(String dataJson);
+
+    HttpRespMsg testRead(String jobId);
+
+    HttpRespMsg testAdd(String jobId);
+
+    HttpRespMsg getEmpMonthHours(Integer pageIndex, Integer pageSize, String month,Integer departmentId,String userId,Integer whether,HttpServletRequest request);
+
+    HttpRespMsg exportEmpMonthHours(String month, HttpServletRequest request, String userId, Integer departmentId,Integer whether);
+
+    HttpRespMsg deptPartInProjects(Integer pageIndex, Integer pageSize, String month, Integer departmentId, HttpServletRequest request);
+
+    HttpRespMsg exportDeptPartInProjects(String month, Integer departmentId, HttpServletRequest request);
+
+    HttpRespMsg exportReportTimelinessRateByQuarter(HttpServletRequest request, String year, Integer quarter);
+
+    HttpRespMsg getGanttDataNew(Integer type, String startDate, String endDate, String userId, Integer projectId, String groupName, Integer taskType, HttpServletRequest request);
+
+    HttpRespMsg projectGroupAndCategoryWorkTime(HttpServletRequest request, String startDate, String endDate, Integer projectId, String groupNames, Integer pageIndex,Integer pageSize);
+
+    HttpRespMsg exportProjectGroupAndCategoryWorkTime(HttpServletRequest request, String startDate, String endDate, Integer projectId, String groupNames);
+
+    HttpRespMsg getSubProjectTimeCost(HttpServletRequest request, String startDate, String endDate, Integer projectId,Integer pageIndex,Integer pageSize);
+
+    HttpRespMsg exportSubProjectTimeCost(HttpServletRequest request,String startDate,String endDate, Integer projectId);
+
+    HttpRespMsg exportDegreeCost(String startDate, String endDate, Integer projectId,Integer deptId, HttpServletRequest request);
+
+    HttpRespMsg timeCostAndExpenseByProject(HttpServletRequest request, String startDate, String endDate, Integer projectId);
+
+    HttpRespMsg nearProject(HttpServletRequest request);
+
+    HttpRespMsg getFTEData(Integer pageIndex, Integer pageSize,String monthStart,String monthEnd, String area,String sortProp, Integer sortOrder, HttpServletRequest request);
+
+    HttpRespMsg exportFTEData(String monthStart,String monthEnd, String area, HttpServletRequest request);
+
+    HttpRespMsg getProjectListByToken(String json);
+
+    HttpRespMsg getTimeCostByToken(String json);
+
+    HttpRespMsg editFunctionalDivision(String json);
+
+    HttpRespMsg deleteFunctionalDivision(Integer id);
+
+    HttpRespMsg getFunctionalDivisionList();
+
+    HttpRespMsg editFunWorkContext(String json);
+
+    HttpRespMsg deleteFunWorkContext(Integer id);
+
+    HttpRespMsg getFunWorkContextList(Integer id);
+
+    HttpRespMsg syncProjectWithSap(String startDate,String endDate,String projectCodes);
+
+    HttpRespMsg getEffectiveLaborHourRate(String startDate, String endDate);
+
+    HttpRespMsg getProjectEstimatedWork(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg getProjectFillTime(HttpServletRequest request, Integer projectId);
+
+    HttpRespMsg getMembProjectCateRatio(String startDate, String endDate,Integer departmentId,String subUserCustomName, Integer onlyShowWarning);
+
+    HttpRespMsg exportMembProjectCateRatio(String startDate, String endDate,Integer departmentId,String subUserCustomName, Integer onlyShowWarning);
+
+    HttpRespMsg userProjectProcessList(Integer deptId, String userId, Integer projectId, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportUserProjectProcessList(Integer deptId, String userId, Integer projectId);
+
+    HttpRespMsg groupExpendProcessList(String startDate, String endDate,Integer pageIndex,Integer pageSize);
+
+    HttpRespMsg exportGroupExpendProcessList(String startDate, String endDate);
+
+    HttpRespMsg projectExpendProcessList(String startDate,String endDate,Integer projectId, Integer categoryId, String userId, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportProjectExpendProcessList(String startDate,String endDate,Integer projectId, Integer categoryId, String userId);
+
+    HttpRespMsg userTaskProcessList(Integer deptId, String userId, Integer projectId,String startDate,String endDate, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportUserTaskProcessList(Integer deptId, String userId, Integer projectId,String startDate,String endDate);
+
+    HttpRespMsg exportEffectiveLaborHourRate(String startDate, String endDate);
+}

+ 23 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportExtraDegreeService.java

@@ -0,0 +1,23 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportExtraDegree;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-16
+ */
+public interface ReportExtraDegreeService extends IService<ReportExtraDegree> {
+
+    HttpRespMsg importData(HttpServletRequest request, MultipartFile file);
+
+    HttpRespMsg exportData(HttpServletRequest request);
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportLogDetailService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportLogDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-19
+ */
+public interface ReportLogDetailService extends IService<ReportLogDetail> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportLogService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-06-24
+ */
+public interface ReportLogService extends IService<ReportLog> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportProfessionProgressService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportProfessionProgress;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-29
+ */
+public interface ReportProfessionProgressService extends IService<ReportProfessionProgress> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportPushLogService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ReportPushLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-17
+ */
+public interface ReportPushLogService extends IService<ReportPushLog> {
+
+}

+ 155 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportService.java

@@ -0,0 +1,155 @@
+package com.management.platform.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.Report;
+import com.management.platform.entity.User;
+import com.management.platform.entity.vo.MonthWorkingTimeVO;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author 吴涛涛
+ * @since 2019-12-31
+ */
+public interface ReportService extends IService<Report> {
+    HttpRespMsg getReportList(String date, Integer deptId, String userId, HttpServletRequest request);
+
+    HttpRespMsg exportReport(@RequestParam String startDate, @RequestParam String endDate,Integer exportType, Integer projectId,Integer stateKey,Integer departmentId, HttpServletRequest request);
+
+    HttpRespMsg getReport(String date, HttpServletRequest request);
+
+    HttpRespMsg getCardTime(String date, HttpServletRequest request);
+
+    HttpRespMsg editReport(List<Report> reportList, String date, List<User> userList, BigDecimal hourCost, Integer companyId, String summary);
+
+    HttpRespMsg deleteReport(String userId, String date);
+
+    HttpRespMsg getListByState(Integer state, Integer departmentId,
+                               Integer projectId,
+                               String date,
+                               String startDate,
+                               String endDate,
+                               String userId,String auditUserId,
+                               HttpServletRequest request);
+
+    HttpRespMsg approveReport(String reportIds, Integer isDepartment, HttpServletRequest request,String evaluate);
+
+    HttpRespMsg denyReport(String date, String reportIds, String reason, Integer isDepartment, HttpServletRequest request);
+
+    HttpRespMsg getMembList(String date, HttpServletRequest request);
+
+    HttpRespMsg batchApproveReport(String ids, Integer isDepartment, HttpServletRequest request,String evaluate);
+    HttpRespMsg batchDenyReport(String ids, Integer isDepartment, String reason, HttpServletRequest request);
+
+    HttpRespMsg cancelReport(String userId, String reportIds, HttpServletRequest request);
+
+    HttpRespMsg getReportFillStatus(String startDate, String endDate, String userId, HttpServletRequest request);
+
+    HttpRespMsg listByStateProfession(Integer state, Integer departmentId, Integer projectId, String date, HttpServletRequest request);
+
+    HttpRespMsg listByStateDepartment(Integer state, Integer projectId, String date, HttpServletRequest request);
+
+    HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate);
+
+    HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate);
+
+    HttpRespMsg importData(Integer companyId, Integer withCheckIn, MultipartFile file, HttpServletRequest request);
+
+    //新版导入日报,采用项目在行上的模式
+    HttpRespMsg importNewData(Integer companyId, MultipartFile file, HttpServletRequest request);
+
+    HttpRespMsg saveProjectTime(Integer companyId, List<Report> reportList, JSONArray userReportArray);
+
+    HttpRespMsg listDeptImportByState(String leaderId,
+                                      Integer projectId,
+                                      Integer dateType,
+                                      String date,
+                                      Integer pageIndex, Integer pageSize,
+                                      Integer deprarmtentId, HttpServletRequest request);
+
+    HttpRespMsg getlastWeekFillTime(String userId);
+
+    HttpRespMsg getNoReportUserList(HttpServletRequest request, String startDate, String endDate,Integer noReportDeptId);
+
+    List<Map<String, Object>> getNotFullReportUserList(Integer companyId, LocalDate startDate, LocalDate endDate);
+
+    HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate,Integer noReportDeptId);
+
+    HttpRespMsg approveAllImport(HttpServletRequest request);
+
+    HttpRespMsg denyHisReport(Integer hisId, String reason, HttpServletRequest request);
+
+    HttpRespMsg getReportListByToken(String json);
+
+    HttpRespMsg fixIssue(Integer companyId, String startDate, String endDate);
+
+    HttpRespMsg getWeeklyCardTime(String dateStr, HttpServletRequest request);
+
+    HttpRespMsg getWeeklyWorkTime(String dateStr, HttpServletRequest request);
+
+    HttpRespMsg getProcessErrorData();
+
+    HttpRespMsg uploadThirdReportData(String yearMonth,HttpServletRequest request);
+
+    HttpRespMsg pushReportDataToThird(String yearMonth,HttpServletRequest request);
+
+    List<Map<String, Object>> getTaskReportList(Integer taskId);
+
+    HttpRespMsg correctWorkingTime(String userIds, String startDate, String endDate);
+
+    HttpRespMsg defaultDegree(Integer projectId, HttpServletRequest request);
+
+    HttpRespMsg approveDeptAuditReport(User user, String auditDeptId);
+
+    void moveReport(User sourceUser,User targetUser);
+
+    HttpRespMsg fillWorkingHours(String yearMonth, MonthWorkingTimeVO monthVO, HttpServletRequest request);
+
+    HttpRespMsg fillAll(String month, String userId, Integer departmentId, Integer whether,HttpServletRequest request);
+
+    HttpRespMsg getAIReport(HttpServletRequest request);
+
+    HttpRespMsg getWeeklyReportData(String targetDate, HttpServletRequest request);
+
+    HttpRespMsg batchDelete(String userIds, Integer deptId, String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg batchApproveByDate(String startDate, String endDate, Integer departmentId, HttpServletRequest request);
+
+    List getAuditWorkflowList(Integer reportId);
+
+    HttpRespMsg getWeeklyFillReportData(String targetDate, HttpServletRequest request);
+
+    HttpRespMsg pushProjectReportToSap(String pushDate,Integer reportId);
+
+    HttpRespMsg getReportById(Integer reportId, HttpServletRequest request);
+
+    HttpRespMsg geProjectTimeCostByThird(String json);
+
+    HttpRespMsg getUserTimeCostByThird(String json);
+
+    HttpRespMsg getUserWorkTimeByCategory(Integer categoryId, Integer deptId, String userId, String startDate, String endDate, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg exportUserWorkTimeByCategory(Integer categoryId, Integer deptId, String userId, String startDate, String endDate);
+
+    HttpRespMsg cannelAllReport();
+
+    HttpRespMsg getHasPushForSap(String startDate, String endDate, String employeeID);
+
+    HttpRespMsg getCustomDataWithDate(String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg exportCustomerTotalCount(String startDate, String endDate, String userId, Integer departmentId, Integer exportType, HttpServletRequest request) throws Exception;
+
+    HttpRespMsg exportCustomerTransferRate(String startDate, String endDate, String userId, Integer departmentId, Integer exportType, HttpServletRequest request) throws Exception;
+}

File diff suppressed because it is too large
+ 589 - 589
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java


+ 10 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CustomServiceImpl.java

@@ -19,6 +19,7 @@ import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.FileUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFRow;
@@ -631,8 +632,17 @@ public class CustomServiceImpl extends ServiceImpl<CustomMapper, Custom> impleme
             msg.setData(userVoList);
         } else {
             List<DepartmentVO> departmentVoList = departmentMapper.getCustomerTotalCount(startDate, endDate, departmentId, companyId);
+            //部门总数
+            List<DepartmentVO> earlierCusCountList = departmentMapper.getEarlierCusCount(endDate,departmentId, companyId);
+            Map<Integer, Integer> earlierMap = new HashMap<>();
+            if(CollectionUtils.isEmpty(earlierCusCountList)){
+                earlierMap = earlierCusCountList.stream()
+                        .collect(Collectors.toMap(DepartmentVO::getId, DepartmentVO::getEarlierCusTotal));
+            }
             if (departmentVoList != null && !departmentVoList.isEmpty()) {
                 for (DepartmentVO departmentVO : departmentVoList) {
+                    Integer earlierNum = earlierMap.getOrDefault(departmentVO.getId(),null);
+                    departmentVO.setEarlierCusTotal(earlierNum);
                     if (departmentVO.getCustomertotal() == 0) {
                         departmentVO.setDealRate((double) 0);
                     } else {

File diff suppressed because it is too large
+ 2515 - 2516
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java


+ 820 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java

@@ -0,0 +1,820 @@
+package com.management.platform.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.controller.AuditWorkflowSettingController;
+import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.*;
+import com.management.platform.service.*;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import com.management.platform.util.WorkDayCalculateUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-09
+ */
+@Service
+@Transactional
+public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSheet> implements LeaveSheetService {
+    public static final Integer exLeaveDay = 6;
+    public static final String[] LEAVE_TYPES = new String[]{"事假","病假","年假","产假","婚假","丧假","调休假","陪产假","其他"};
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private LeaveSheetMapper leaveSheetMapper;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+    @Resource
+    private ReportMapper reportMapper;
+    @Resource
+    private AuditWorkflowSettingService auditWorkflowSettingService;
+    @Resource
+    private AuditWorkflowSettingMapper auditWorkflowSettingMapper;
+    @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    SysFunctionMapper sysFunctionMapper;
+    @Resource
+    DepartmentService departmentService;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    ExcelExportService excelExportService;
+    @Resource
+    LeaveAuditLogMapper leaveAuditLogMapper;
+    @Resource
+    WxCorpInfoService wxCorpInfoService;
+    @Resource
+    InformationMapper informationMapper;
+
+    @Value(value = "${upload.path}")
+    private String path;
+
+    @Override
+    public HttpRespMsg add(LeaveSheet sheet, String userId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        boolean isNew = false;
+        if (sheet.getId() == null) {
+            isNew = true;
+        }
+        sheet.setOperatorId(userId);//设置操作人id
+        User user = userMapper.selectById(userId);
+        sheet.setOwnerName(userMapper.selectById(sheet.getOwnerId()).getName());
+        sheet.setCompanyId(user.getCompanyId());
+        sheet.setStatus(1);//待审核状态
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        if (sheet.getTimeType() == 0) {
+            //按天请假时,计算小时数
+            float v = timeType.getAllday() * sheet.getTimeDays();
+            sheet.setTimeHours(v);
+        }
+        if (isNew) {
+            //检查该时间段是否已经有按天请假
+            QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("owner_id", sheet.getOwnerId());
+            queryWrapper.le("start_date", sheet.getEndDate()).ge("end_date", sheet.getStartDate());
+
+            int count = leaveSheetMapper.selectCount(queryWrapper);
+            if (count > 0) {
+                //msg.setError("该时间段已有请假申请,不能重复请假");
+                msg.setError(MessageUtils.message("leave.repeatedLeave"));
+                return msg;
+            }
+        }
+
+        //获取第一个审批人
+        User owner = userMapper.selectById(sheet.getOwnerId());
+        if (owner.getDepartmentId() == 0) {
+            //没有部门,不能提交请假申请
+            msg.setError("请联系管理员设置您所在部门");
+            return msg;
+        } else {
+            List<AuditWorkflowSetting> auditList = auditWorkflowSettingService.get(owner.getDepartmentId(), AuditWorkflowSettingController.TYPE_LEAVE);
+            if (auditList.size() > 0) {
+                AuditWorkflowSetting workflowNode = auditList.get(0);
+                if (workflowNode.getAuditorType() == 1) {
+                    //部门负责人
+                    Department dept = departmentMapper.selectById(workflowNode.getAuditDeptId());
+                    if (dept.getManagerId() == null) {
+                        msg.setError("请联系管理员设置您所在部门的主要负责人");
+                        return msg;
+                    }
+                    sheet.setAuditorId(dept.getManagerId());
+                    sheet.setAuditorName(userMapper.selectById(dept.getManagerId()).getName());
+                } else if (workflowNode.getAuditorType() == 2) {
+                    //指定一个人审批
+                    sheet.setAuditorId(workflowNode.getUserId());
+                    sheet.setAuditorName(workflowNode.getUserName());
+                }
+                sheet.setCurAuditSettingId(workflowNode.getId());
+            }
+        }
+
+        if (isNew) {
+            leaveSheetMapper.insert(sheet);
+        } else {
+            //编辑修改
+            leaveSheetMapper.updateById(sheet);
+            //之前的审批流程要删除
+            leaveAuditLogMapper.delete(new QueryWrapper<LeaveAuditLog>().eq("sheet_id", sheet.getId()));
+        }
+        sheet = leaveSheetMapper.selectById(sheet.getId());
+        saveNotifyToAuditor(sheet);
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        if (wxCorpInfo != null) {
+            sendAuditNotifyMsg(wxCorpInfo, user, sheet);
+        }
+        return msg;
+    }
+
+    //发送审核结果消息提醒
+    private void sendAuditResult(WxCorpInfo wxCorpInfo, User auditor, LeaveSheet sheet, String denyReason) {
+        //推送到企业微信
+        JSONObject json=new JSONObject();
+        JSONArray dataJson=new JSONArray();
+        JSONObject jsonObj=new JSONObject();
+        jsonObj.put("key", "审核结果");
+        jsonObj.put("value",sheet.getStatus() == 0?"通过":"驳回");
+//        jsonObj.put("value",("$userName="+applier.getCorpwxUserid()+"$"));
+        JSONObject jsonObj1=new JSONObject();
+        jsonObj1.put("key", "审核人");
+        jsonObj1.put("value",("$userName="+auditor.getCorpwxUserid()+"$"));
+        String applyTimeDesc = "";
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
+        if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) + ", "+sheet.getTimeHours()+"小时";
+        } else {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate()) + ", "+sheet.getTimeHours()+"小时";
+        }
+
+        JSONObject jsonObj2=new JSONObject();
+        jsonObj2.put("key", "请假时间");
+        jsonObj2.put("value",applyTimeDesc);
+        JSONObject jsonObj4=new JSONObject();
+        jsonObj4.put("key", "备注");
+        jsonObj4.put("value",sheet.getStatus()==2?("原因:"+denyReason):"请假申请通过了");
+        dataJson.add(jsonObj);
+        dataJson.add(jsonObj1);
+        dataJson.add(jsonObj2);
+        dataJson.add(jsonObj4);
+        json.put("template_id","tty9TkCAAARfwRKiqfj47qNE70KvGhqg");
+        json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=leave#wechat_redirect");
+        json.put("content_item",dataJson);
+        String ownerId = sheet.getOwnerId();
+        User owner = userMapper.selectById(ownerId);
+        wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,owner.getCorpwxUserid(), json);
+    }
+
+    private void saveNotifyToApplier(LeaveSheet sheet) {
+        //推送到企业微信
+        String applyTimeDesc = "";
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
+        if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) + ", "+sheet.getTimeHours()+"小时";
+        } else {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate()) + ", "+sheet.getTimeHours()+"小时";
+        }
+        String ownerId = sheet.getOwnerId();
+        User owner = userMapper.selectById(ownerId);
+        User auditor = userMapper.selectById(sheet.getAuditorId());
+        //系统内消息
+        Information information=new Information();
+        information.setUserId(owner.getId());
+        information.setTime(new Date());
+        information.setMsg("您"+applyTimeDesc + "请假申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
+                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getName()));
+        information.setType(4);
+        information.setContent(sheet.getId()+"");
+        information.setPath("/leave-sheet");
+        informationMapper.insert(information);
+    }
+
+    private void saveNotifyToAuditor(LeaveSheet sheet) {
+        //系统内消息
+        Information information=new Information();
+        information.setUserId(sheet.getAuditorId());
+        information.setTime(new Date());
+        User owner = userMapper.selectById(sheet.getOwnerId());
+        information.setMsg("请假待审核, 请假人:" + (owner.getCorpwxUserid() != null?("$userName="+owner.getCorpwxUserid()+"$"):owner.getName()));
+        information.setType(4);
+        information.setContent(sheet.getId()+"");
+        information.setPath("/leave-sheet");
+        informationMapper.insert(information);
+    }
+
+    //发送待审核提醒
+    private void sendAuditNotifyMsg(WxCorpInfo wxCorpInfo, User applier, LeaveSheet sheet) {
+        //推送到企业微信
+        JSONObject json=new JSONObject();
+        JSONArray dataJson=new JSONArray();
+        JSONObject jsonObj=new JSONObject();
+        jsonObj.put("key", "请假人");
+        jsonObj.put("value",("$userName="+applier.getCorpwxUserid()+"$"));
+        JSONObject jsonObj1=new JSONObject();
+        jsonObj1.put("key", "请假类型");
+        jsonObj1.put("value",LEAVE_TYPES[sheet.getLeaveType()]);
+        String applyTimeDesc = "";
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
+        if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) + ", "+sheet.getTimeHours()+"小时";
+        } else {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate()) + ", "+sheet.getTimeHours()+"小时";
+        }
+
+        JSONObject jsonObj2=new JSONObject();
+        jsonObj2.put("key", "请假时间");
+        jsonObj2.put("value",applyTimeDesc);
+        JSONObject jsonObj4=new JSONObject();
+        jsonObj4.put("key", "备注");
+        jsonObj4.put("value",sheet.getRemark()==null?"":sheet.getRemark());
+        dataJson.add(jsonObj);
+        dataJson.add(jsonObj1);
+        dataJson.add(jsonObj2);
+        dataJson.add(jsonObj4);
+        json.put("template_id","tty9TkCAAA4WvYmTnsAVoUmdYxHdSG9A");
+        json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwdd1137a65ce0fc87&redirect_uri=http://crm.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=leave#wechat_redirect");
+        json.put("content_item",dataJson);
+        String auditorId = sheet.getAuditorId();
+        User auditor = userMapper.selectById(auditorId);
+        wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,auditor.getCorpwxUserid(), json);
+    }
+
+    @Override
+    public HttpRespMsg delete(Integer id) {
+        leaveSheetMapper.deleteById(id);
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg queryList(LeaveSheet sheet, Integer pageIndex, Integer pageSize) {
+        QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部请假单");
+        if (functionList.size() == 0) {
+            //部门负责人可以看这个部门的
+            List<Integer> mdids = departmentService.getAllManagedDeptIdList(user, null);
+//            List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()));
+            if (mdids.size() > 0) {
+                //负责的部门的人员
+                //先是自己的
+                List<String> userIds = new ArrayList<>();
+                userIds.add(user.getId());
+                List<User> userList = userMapper.selectList(new QueryWrapper<User>().select("id").in("department_id", mdids));
+                List<String> collect = userList.stream().map(User::getId).collect(Collectors.toList());
+                userIds.addAll(collect);
+                queryWrapper.in("owner_id", userIds);
+            } else {
+                //普通员工只能看自己的
+                sheet.setOwnerId(user.getId());
+            }
+        }
+        sheet.setCompanyId(user.getCompanyId());
+
+        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.getLeaveType() != null) {
+            queryWrapper.eq("leave_type", sheet.getLeaveType());
+        }
+        if (sheet.getStartDate() != null && sheet.getEndDate() != null) {
+            queryWrapper.le("start_date", sheet.getEndDate()).ge("end_date", sheet.getStartDate());
+        }
+        IPage<LeaveSheet> listIPager = leaveSheetMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<LeaveSheet> records = listIPager.getRecords();
+        List<String> userIds = records.stream().map(LeaveSheet::getOwnerId).collect(Collectors.toList());
+        if (userIds.size() > 0) {
+            List<User> userList = userMapper.getUserWithDept(new QueryWrapper<User>().in("id", userIds));
+            records.stream().forEach(r->{
+                Optional<User> find = userList.stream().filter(u->u.getId().equals(r.getOwnerId())).findFirst();
+                if (find.isPresent()) {
+                    r.setDept(find.get().getDepartmentName());
+                }
+            });
+        }
+
+        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) {
+        String token = request.getHeader("TOKEN");
+        //检查操作人权限
+        User user = userMapper.selectById(token);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        LeaveSheet originSheet = leaveSheetMapper.selectById(id);
+        if (user.getId().equals(originSheet.getAuditorId())) {
+            //是当前的审核人,获取下个审核节点
+            AuditWorkflowSetting auditWorkflowSetting = auditWorkflowSettingMapper.selectById(originSheet.getCurAuditSettingId());
+            LeaveSheet sheet = new LeaveSheet();
+            sheet.setId(id);
+            if (auditWorkflowSetting == null) {
+                //当前审核节点已不存在,直接审核通过
+                sheet.setStatus(0);
+            } else {
+                Integer seq = auditWorkflowSetting.getSeq();
+                AuditWorkflowSetting nextAuditNode = auditWorkflowSettingMapper.selectOne(new QueryWrapper<AuditWorkflowSetting>().eq("type", 1).eq("seq", (seq + 1)).eq("dept_id", auditWorkflowSetting.getDeptId()));
+                if (nextAuditNode == null) {
+                    sheet.setStatus(0);
+                } else {
+                    //进入下个审核节点
+                    if (nextAuditNode.getAuditorType() == 1) {
+                        //部门负责人审核
+                        Department department = departmentMapper.selectById(nextAuditNode.getAuditDeptId());
+                        if (department == null) {
+                            //部门已被删除,直接审核通过
+                            sheet.setStatus(0);
+                        } else {
+                            if (department.getManagerId() == null) {
+                                httpRespMsg.setError("尚未设置下个节点的部门负责人,请联系管理员");
+                                return httpRespMsg;
+                            } else {
+                                sheet.setCurAuditSettingId(nextAuditNode.getId());
+                                sheet.setAuditorId(department.getManagerId());
+                                sheet.setAuditorName(userMapper.selectById(department.getManagerId()).getName());
+                                sheet.setAuditorType(nextAuditNode.getAuditorType());
+                            }
+                        }
+                    } else if (nextAuditNode.getAuditorType() == 2){
+                        //指定人员审核
+                        sheet.setCurAuditSettingId(nextAuditNode.getId());
+                        sheet.setAuditorId(nextAuditNode.getUserId());
+                        sheet.setAuditorName(nextAuditNode.getUserName());
+                        sheet.setAuditorType(nextAuditNode.getAuditorType());
+                    }
+                }
+            }
+            leaveSheetMapper.updateById(sheet);
+            //保存审核记录
+            saveAgreeLog(id, auditWorkflowSetting, user);
+            //最终审核通过,发送通过消息
+            sheet = leaveSheetMapper.selectById(id);
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            if (wxCorpInfo != null) {
+                if (sheet.getStatus() == 0) {
+                    //最终通过
+                    sendAuditResult(wxCorpInfo, user, sheet, null);
+                } else {
+                    //通知下个节点的审核人去审核
+                    sendAuditNotifyMsg(wxCorpInfo, user, sheet);
+                }
+            }
+            if (sheet.getStatus() == 0) {
+                //最终通过
+                saveNotifyToApplier(sheet);
+            } else {
+                //通知下个节点的审核人去审核
+                saveNotifyToAuditor(sheet);
+            }
+        }
+        return httpRespMsg;
+    }
+
+    private void saveAgreeLog(int sheetId, AuditWorkflowSetting curAuditNode, User operator) {
+        LeaveAuditLog log = new LeaveAuditLog();
+        log.setSheetId(sheetId);
+        if (curAuditNode != null) {
+            log.setAuditNodeId(curAuditNode.getId());
+        }
+        log.setAuditorId(operator.getId());
+        log.setAuditorName(operator.getName());
+        log.setIsPass(1);
+        leaveAuditLogMapper.insert(log);
+    }
+    private void saveDenyLog(int sheetId, AuditWorkflowSetting curAuditNode, User operator, String reason) {
+        LeaveAuditLog log = new LeaveAuditLog();
+        log.setSheetId(sheetId);
+        if (curAuditNode != null) {
+            log.setAuditNodeId(curAuditNode.getId());
+        }
+        log.setAuditorId(operator.getId());
+        log.setAuditorName(operator.getName());
+        log.setIsPass(0);
+        log.setDenyReason(reason);
+        leaveAuditLogMapper.insert(log);
+    }
+
+
+    @Override
+    public HttpRespMsg deny(Integer id, String reason) {
+        String token = request.getHeader("TOKEN");
+        //检查操作人权限
+        User user = userMapper.selectById(token);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        LeaveSheet originSheet = leaveSheetMapper.selectById(id);
+        if (user.getId().equals(originSheet.getAuditorId())) {
+            //是当前的审核人,获取当前审核节点
+            AuditWorkflowSetting auditWorkflowSetting = auditWorkflowSettingMapper.selectById(originSheet.getCurAuditSettingId());
+            LeaveSheet sheet = new LeaveSheet();
+            sheet.setId(id);
+            sheet.setStatus(2);
+            leaveSheetMapper.updateById(sheet);
+            saveDenyLog(id, auditWorkflowSetting, user, reason);
+            sheet = leaveSheetMapper.selectById(id);
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            if (wxCorpInfo != null) {
+                sendAuditResult(wxCorpInfo, user, sheet, reason);
+            }
+            saveNotifyToApplier(sheet);
+        }
+
+        return 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 = leaveSheetMapper.summaryData(keyword, startDate, endDate, companyId);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getOTAvaiDays(String userId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String startDate = null;
+        User user = userMapper.selectById(userId);
+
+        if (user.getCompanyId() == 7) {
+            //火石闪信,从2023年8月1日开始计算加班工时
+            startDate = "2023-08-01";
+            //获取startDate之前的,2023年的全部非工作日加班
+            String firstDay = "2023-01-01";
+            String endDate = startDate;
+            List<String> allHolidays = WorkDayCalculateUtils.getAllHolidays(firstDay, endDate);
+            double beforeHours = 0;
+            if (allHolidays.size() > 0) {
+                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().select("IFNULL(sum(overtime_hours),0) as working_time").in("create_date", allHolidays).eq("creator_id", userId));
+                double sum = reportList.stream().mapToDouble(Report::getWorkingTime).sum();
+                beforeHours = sum;
+            }
+
+            //只统计2023年1月1日之后的调休假
+            List<LeaveSheet> list = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>()
+                    .eq("owner_id", userId).eq("leave_type", exLeaveDay).ne("status", 2).ne("status", 3).ge("start_date", firstDay));
+            double alreadyHours = list.stream().mapToDouble(LeaveSheet::getTimeHours).sum();
+            double overtime = reportMapper.getMyOvertime(userId, startDate);
+            double leftHours = beforeHours + overtime - alreadyHours;
+            if (leftHours < 0) {
+                leftHours = 0;
+            }
+            float allDayHours = timeTypeMapper.selectById(userMapper.selectById(userId).getCompanyId()).getAllday();
+            double d = leftHours/allDayHours;
+            msg.data = d;
+        } else {
+            //非驳回和撤回状态的都要统计进去
+            List<LeaveSheet> list = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>().eq("owner_id", userId).eq("leave_type", exLeaveDay).ne("status", 2).ne("status", 3));
+            double alreadyHours = list.stream().mapToDouble(LeaveSheet::getTimeHours).sum();
+            double overtime = reportMapper.getMyOvertime(userId, startDate);
+            double leftHours = overtime - alreadyHours;
+            if (leftHours < 0) {
+                leftHours = 0;
+            }
+            float allDayHours = timeTypeMapper.selectById(userMapper.selectById(userId).getCompanyId()).getAllday();
+            double d = leftHours/allDayHours;
+            msg.data = d;
+        }
+
+        return msg;
+    }
+
+
+    @Override
+    public HttpRespMsg exportLeaveData(String userId,Integer status,Integer leaveType,String startTime,String endTime) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        Integer companyId = userMapper.selectById(userId).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).select("id","name","corpwx_userid"));
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<>();
+        LeaveSheet sheet = new LeaveSheet();
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部请假单");
+        if (functionList.size() == 0) {
+            //部门负责人可以看这个部门的
+            List<Integer> mdids = departmentService.getAllManagedDeptIdList(user, null);
+//            List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("manager_id", user.getId()));
+            if (mdids.size() > 0) {
+                //负责的部门的人员
+                //先是自己的
+                List<String> userIds = new ArrayList<>();
+                userIds.add(user.getId());
+                List<User> deptUserList = userMapper.selectList(new QueryWrapper<User>().select("id").in("department_id", mdids));
+                List<String> collect = deptUserList.stream().map(User::getId).collect(Collectors.toList());
+                userIds.addAll(collect);
+                queryWrapper.in("owner_id", userIds);
+            } else {
+                //普通员工只能看自己的
+                sheet.setOwnerId(user.getId());
+            }
+        }
+        sheet.setCompanyId(user.getCompanyId());
+
+        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.getLeaveType() != null) {
+            queryWrapper.eq("leave_type", leaveType);
+        }
+        if (sheet.getStartDate() != null && sheet.getEndDate() != null) {
+            queryWrapper.le("start_date", startTime).ge("end_date", endTime);
+        }
+
+        List<LeaveSheet> leaveSheets = leaveSheetMapper.selectList(queryWrapper);
+        if (leaveSheets.size()==0){
+            return httpRespMsg;
+        };
+        List<List<String>> allList = new ArrayList<>();
+        List<String> headList = new ArrayList<String>();
+//        headList.add("请假人");
+//        headList.add("电话");
+//        headList.add("请假类型");
+//        headList.add("请假开始时间");
+//        headList.add("请假结束时间");
+//        headList.add("请假天数");
+//        headList.add("请假时长");
+//        headList.add("状态");
+//        headList.add("备注");
+        headList.add(MessageUtils.message("leave.perForLeave"));
+        headList.add(MessageUtils.message("leave.telephone"));
+        headList.add(MessageUtils.message("leave.leaveType"));
+        headList.add(MessageUtils.message("leave.LStartTime"));
+        headList.add(MessageUtils.message("leave.LEndTime"));
+        headList.add(MessageUtils.message("leave.LDays"));
+        headList.add(MessageUtils.message("leave.duration"));
+        headList.add(MessageUtils.message("leave.state"));
+        headList.add(MessageUtils.message("leave.remark"));
+        allList.add(headList);
+        for (LeaveSheet leaveSheet : leaveSheets) {
+            List<String> item = new ArrayList<>();
+            Boolean present = userList.stream().filter(ul -> ul.getId().equals(leaveSheet.getOwnerId())).findFirst().isPresent();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                if (present){
+                    User us = userList.stream().filter(ul -> ul.getId().equals(leaveSheet.getOwnerId())).findFirst().get();
+                    item.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
+                }else {
+                    item.add("");
+                }
+            }else {
+                item.add(leaveSheet.getOwnerName()==null?"":leaveSheet.getOwnerName());
+            }
+            item.add(leaveSheet.getTel()==null?"":leaveSheet.getTel());
+            String lts = "";
+            switch (leaveSheet.getLeaveType()){
+                case 0:
+                    lts = MessageUtils.message("leave.thing");
+                    break;
+                case 1:
+                    lts = MessageUtils.message("leave.illness");
+                    break;
+                case 2:
+                    lts = MessageUtils.message("leave.year");
+                    break;
+                case 3:
+                    lts = MessageUtils.message("leave.maternity");
+                    break;
+                case 4:
+                    lts = MessageUtils.message("leave.marry");
+                    break;
+                case 5:
+                    lts = MessageUtils.message("leave.die");
+                    break;
+                case 6:
+                    lts = MessageUtils.message("leave.compensatory");
+                    break;
+                case 7:
+                    lts = MessageUtils.message("leave.paternity");
+                    break;
+                case 8:
+                    lts = MessageUtils.message("leave.other");
+                    break;
+            }
+            item.add(lts);
+            DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            String sds = leaveSheet.getStartDate().format(df);
+            String eds = leaveSheet.getEndDate().format(df);
+            item.add(sds);
+            item.add(eds);
+            item.add(leaveSheet.getTimeDays()==null?"":leaveSheet.getTimeDays().toString());
+            item.add(leaveSheet.getTimeHours()==null?"":leaveSheet.getTimeHours().toString());
+            Optional<User> first = userList.stream().filter(u -> u.getId().equals(leaveSheet.getAuditorId())).findFirst();
+            String auditorName = first.isPresent()?first.get().getName():"";
+            //转译处理
+            if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
+                auditorName = "$userName="+auditorName+"$";
+            }
+            String statusS = "";
+            switch (leaveSheet.getStatus()){
+                case 0:
+                    //statusS = "审核通过";
+                    statusS = MessageUtils.message("stages.approved");
+                    break;
+                case 1:
+                    //statusS = "待审核";
+                    statusS = MessageUtils.message("stages.reviewed")
+                            + "-" + auditorName;
+                    break;
+                case 2:
+                    //statusS = "驳回";
+                    statusS = MessageUtils.message("stages.reject");
+                    break;
+                case 3:
+                    //statusS = "已撤销";
+                    statusS = MessageUtils.message("stages.withdrawn");
+                    break;
+            }
+            item.add(statusS);
+            item.add(leaveSheet.getRemark());
+            allList.add(item);
+        }
+        //String fileName = "请假信息_"+System.currentTimeMillis();
+        String fileName = MessageUtils.message("fileName.leaveInfo")+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , allList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg cancel(Integer id, String userId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        LeaveSheet oldSheet = leaveSheetMapper.selectById(id);
+        if (oldSheet.getStatus() == 0) {
+            msg.setError("当前请假申请已通过,无法撤销");
+        } else if (oldSheet.getStatus() == 2) {
+            msg.setError("当前请假申请已驳回,无法撤销");
+        } else {
+            LeaveSheet sheet = new LeaveSheet();
+            sheet.setId(id);
+            sheet.setStatus(3);//撤销状态
+            leaveSheetMapper.updateById(sheet);
+            //删除相关的审批记录
+            leaveAuditLogMapper.delete(new QueryWrapper<LeaveAuditLog>().eq("sheet_id", id));
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg auditList(LeaveSheet sheet, Integer pageIndex, Integer pageSize) {
+        QueryWrapper<LeaveSheet> queryWrapper = new QueryWrapper<LeaveSheet>();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+
+        sheet.setCompanyId(user.getCompanyId());
+
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
+        queryWrapper.eq("status", 1);
+        queryWrapper.eq("auditor_id", user.getId());
+
+        if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+            queryWrapper.eq("owner_id", sheet.getOwnerId());
+        }
+        if (sheet.getLeaveType() != null) {
+            queryWrapper.eq("leave_type", sheet.getLeaveType());
+        }
+        if (sheet.getStartDate() != null && sheet.getEndDate() != null) {
+            queryWrapper.le("start_date", sheet.getEndDate()).ge("end_date", sheet.getStartDate());
+        }
+        IPage<LeaveSheet> listIPager = leaveSheetMapper.selectPage(new Page<>(pageIndex, pageSize),
+                queryWrapper);
+        List<LeaveSheet> records = listIPager.getRecords();
+        List<String> userIds = records.stream().map(LeaveSheet::getOwnerId).collect(Collectors.toList());
+        if (userIds.size() > 0) {
+            List<User> userList = userMapper.getUserWithDept(new QueryWrapper<User>().in("id", userIds));
+            records.stream().forEach(r->{
+                Optional<User> find = userList.stream().filter(u->u.getId().equals(r.getOwnerId())).findFirst();
+                if (find.isPresent()) {
+                    r.setDept(find.get().getDepartmentName());
+                }
+            });
+        }
+
+        Long total = listIPager.getTotal();
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", records);
+        map.put("total", total);
+        httpRespMsg.data = map;
+        return httpRespMsg;
+    }
+
+    /**
+     * 返回某段时间内请假时间总和
+     * @param companyId
+     * @param startDate
+     * @param endDate
+     * @param standardHours 该月总工时
+     * @param allDay 该公司每天工时
+     * @param leaveSheets
+     * @return
+     */
+    @Override
+    public float leaveTimeSum(Integer companyId, String startDate, String endDate, float standardHours, float allDay, List<LeaveSheet> leaveSheets) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
+        LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
+        float leaveTime = 0;
+        for (LeaveSheet leaveSheet : leaveSheets) {
+            //请假期间的工作日
+            int leaveDays = WorkDayCalculateUtils.getWorkDaysListInRange(leaveSheet.getStartDate().toString(), leaveSheet.getEndDate().toString(), 0).size();
+            //当请假时间在筛选时间段内
+            if ((leaveSheet.getStartDate().isEqual(localStartDate) || leaveSheet.getStartDate().isAfter(localStartDate)) && (leaveSheet.getEndDate().isEqual(localEndDate) || leaveSheet.getEndDate().isBefore(localEndDate))){
+                //请假期间的非工作日
+                int nonWorkDays = WorkDayCalculateUtils.getNonWorkDaysListInRange(leaveSheet.getStartDate().toString(), leaveSheet.getEndDate().toString()).size();
+                if (leaveSheet.getStartDate().isEqual(leaveSheet.getEndDate()) || nonWorkDays == 0){
+                    leaveTime+=leaveSheet.getTimeHours();
+                }else {
+                    leaveTime+= leaveDays * allDay;
+                }
+            }else{
+                //请假时间首尾超出
+                if(leaveSheet.getStartDate().isBefore(localStartDate) && leaveSheet.getEndDate().isAfter(localEndDate)){
+                    leaveTime+= standardHours;
+                }else {
+                    //当请假时间开始时间超出
+                    if (leaveSheet.getStartDate().isBefore(localStartDate)){
+                        //超出的天数
+                        int startDay = WorkDayCalculateUtils.getWorkDaysListInRange(leaveSheet.getStartDate().toString(), localStartDate.minusDays(1).toString(), 0).size();
+                        float DifDay = leaveDays - startDay;
+                        leaveTime+= allDay*DifDay;
+                    }else {
+                        //当请假时间结束时间超出
+                        //超出的天数
+                        int endDay = WorkDayCalculateUtils.getWorkDaysListInRange(localEndDate.plusDays(1).toString(),leaveSheet.getEndDate().toString(),  0).size();
+                        float DifDay = leaveDays - endDay;
+                        leaveTime+= allDay*DifDay;
+                    }
+                }
+            }
+        }
+        leaveTime = new BigDecimal(leaveTime).setScale(1,BigDecimal.ROUND_HALF_UP).floatValue();
+        return leaveTime;
+    }
+
+    /**
+     * 计算两个日期之间的工作日
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    @Override
+    public HttpRespMsg leaveDays(String startDate, String endDate) {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        Integer leaveDays = 0;
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate localStartDate = LocalDate.parse(startDate, dateTimeFormatter);
+        LocalDate localEndDate = LocalDate.parse(endDate, dateTimeFormatter);
+        if (localStartDate.isBefore(localEndDate) || localStartDate.isEqual(localEndDate)){
+            leaveDays = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate, 0).size();
+        }
+        httpRespMsg.data = leaveDays;
+        return httpRespMsg;
+    }
+}

File diff suppressed because it is too large
+ 13517 - 13519
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java


+ 184 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java

@@ -0,0 +1,184 @@
+package com.management.platform.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.entity.ReportExtraDegree;
+import com.management.platform.entity.TimeType;
+import com.management.platform.entity.User;
+import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.mapper.ReportExtraDegreeMapper;
+import com.management.platform.mapper.TimeTypeMapper;
+import com.management.platform.mapper.UserMapper;
+import com.management.platform.mapper.WxCorpInfoMapper;
+import com.management.platform.service.ExcelExportService;
+import com.management.platform.service.ReportExtraDegreeService;
+import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import com.qq.weixin.mp.aes.WXBizMsgCrypt;
+import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-12-16
+ */
+@Service
+public class ReportExtraDegreeServiceImpl extends ServiceImpl<ReportExtraDegreeMapper, ReportExtraDegree> implements ReportExtraDegreeService {
+    @Value(value = "${upload.path}")
+    String path;
+    @Resource
+    ReportExtraDegreeMapper reportExtraDegreeMapper;
+    @Resource
+    UserMapper userMapper;
+    @Resource
+    TimeTypeMapper timeTypeMapper;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    ExcelExportService excelExportService;
+    @Override
+    public HttpRespMsg importData(HttpServletRequest request, MultipartFile multipartFile) {
+        HttpRespMsg msg=new HttpRespMsg();
+        String fileName=multipartFile.getOriginalFilename();
+        File file=new File(fileName == null?"file":fileName);
+        InputStream inputStream=null;
+        OutputStream outputStream=null;
+        Integer companyId=userMapper.selectById(request.getHeader("token")).getCompanyId();
+        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();
+
+            //然后解析表格
+            Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            //获取公司所有客户
+            List<ReportExtraDegree> allReportExtraDegree = reportExtraDegreeMapper.selectList(new QueryWrapper<ReportExtraDegree>().eq("company_id", companyId));
+            Sheet sheet = workbook.getSheetAt(0);
+            //由于第一行需要指明列对应的标题
+            int rowNum = sheet.getLastRowNum();
+            if (rowNum == 0) {
+                //msg.setError("请填写研究中心数据");
+                msg.setError(MessageUtils.message("research.addData"));
+                return msg;
+            }
+            List<String> nameList=new ArrayList<>();
+            int dataCount = 0;
+            for (int rowIndex = 1; rowIndex <= rowNum; rowIndex++) {
+                Row row = sheet.getRow(rowIndex);
+                dataCount++;
+                if (row == null) {
+                    continue;
+                }
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                if (row.getCell(0) == null) {
+                    //msg.setError("第"+dataCount+"行缺少中心名称");
+                    msg.setError(MessageUtils.message("research.nameNull",dataCount));
+                    return msg;
+                }
+                if(nameList.contains(row.getCell(0).toString())){
+                    //msg.setError("当前导入数据存在重复中心名称["+row.getCell(0).toString()+"]");
+                    msg.setError(MessageUtils.message("research.nameRepeat",row.getCell(0).toString()));
+                    return msg;
+                }
+                nameList.add(row.getCell(0).toString());
+                ReportExtraDegree reportExtraDegree=new ReportExtraDegree();
+                List<ReportExtraDegree> collect = allReportExtraDegree.stream().filter(ap -> ap.getName().equals(row.getCell(0).toString())).collect(Collectors.toList());
+                reportExtraDegree.setName(row.getCell(0).toString());
+                reportExtraDegree.setCompanyId(companyId);
+                if(collect.size()>0){
+                    Integer id=collect.get(0).getId();
+                    reportExtraDegree.setId(id);
+                    reportExtraDegreeMapper.updateById(reportExtraDegree);
+                }else{
+                    reportExtraDegreeMapper.insert(reportExtraDegree);
+                }
+            }
+            msg.data=dataCount;
+            return msg;
+        } catch (IOException e){
+            e.printStackTrace();
+            //msg.setError("文件处理出错");
+            msg.setError(MessageUtils.message("file.error"));
+            return msg;
+        } catch (InvalidFormatException e) {
+            e.printStackTrace();
+            //msg.setError("文件格式错误,如果安装了加密软件需要先解密再上传");
+            msg.setError(MessageUtils.message("file.FormatErrorAndDecrypt"));
+            return msg;
+        }catch (EncryptedDocumentException e) {
+            e.printStackTrace();
+            //msg.setError("文件加密状态,需要先解除加密状态再上传");
+            msg.setError(MessageUtils.message("file.encryption"));
+            return msg;
+        }finally {
+            //关闭流
+            try {
+                if (outputStream != null && inputStream != null) {
+                    outputStream.close();
+                    inputStream.close();
+                    System.out.println("流已关闭");
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+//            file.deleteOnExit();//程序退出时删除临时文件
+            System.out.println(file.delete());
+        }
+    }
+
+    @Override
+    public HttpRespMsg exportData(HttpServletRequest request) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        List<ReportExtraDegree> reportExtraDegreeList = reportExtraDegreeMapper.selectList(new QueryWrapper<ReportExtraDegree>().eq("company_id", user.getCompanyId()));
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        List<String> titleList=new ArrayList<>();
+        titleList.add(timeType.getCustomDegreeName()+MessageUtils.message("excel.name"));
+        List<List<String>> dataList=new ArrayList<>();
+        dataList.add(titleList);
+        for (ReportExtraDegree reportExtraDegree : reportExtraDegreeList) {
+            List<String> itemList=new ArrayList<>();
+            itemList.add(reportExtraDegree.getName());
+            dataList.add(itemList);
+        }
+        //生成excel文件导出
+        String fileName = timeType.getCustomDegreeName()+"_"+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportLogDetailServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ReportLogDetail;
+import com.management.platform.mapper.ReportLogDetailMapper;
+import com.management.platform.service.ReportLogDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-09-19
+ */
+@Service
+public class ReportLogDetailServiceImpl extends ServiceImpl<ReportLogDetailMapper, ReportLogDetail> implements ReportLogDetailService {
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ReportLog;
+import com.management.platform.mapper.ReportLogMapper;
+import com.management.platform.service.ReportLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2022-06-24
+ */
+@Service
+public class ReportLogServiceImpl extends ServiceImpl<ReportLogMapper, ReportLog> implements ReportLogService {
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportProfessionProgressServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ReportProfessionProgress;
+import com.management.platform.mapper.ReportProfessionProgressMapper;
+import com.management.platform.service.ReportProfessionProgressService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2021-08-29
+ */
+@Service
+public class ReportProfessionProgressServiceImpl extends ServiceImpl<ReportProfessionProgressMapper, ReportProfessionProgress> implements ReportProfessionProgressService {
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportPushLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ReportPushLog;
+import com.management.platform.mapper.ReportPushLogMapper;
+import com.management.platform.service.ReportPushLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-11-17
+ */
+@Service
+public class ReportPushLogServiceImpl extends ServiceImpl<ReportPushLogMapper, ReportPushLog> implements ReportPushLogService {
+
+}

File diff suppressed because it is too large
+ 8906 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java


+ 3 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml

@@ -112,7 +112,9 @@ wx:
   app_id: wx1c1d8fc81bc073a8
   app_secret: 17ad07f90ee845f99f4c1605647ef755
   template_report_pass: dbMuR2v7lxXLwRaorIWQ4T6ilvn0vzqmDDkD_3ZsaXc
-
+  template_project_deadline: kY2Qzec64uOANNXA0yn-PV09ZnNjCeGXwWjTaVmQiLU
+  template_report_reject: TICiRkvCpF4NCbkPOjefXTpz7jXgpt0SZGkNjCMIt3M
+  template_report_week: lhwkaW9BKwCvMtCuoAxLw4lZoGgMaucL0Ap0Vz-5KOY
 #钉钉参数配置
 dingding:
   appId: 71020

+ 17 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/DepartmentMapper.xml

@@ -174,4 +174,21 @@
         </where>
         group by  u.department_id
     </select>
+    <select id="getEarlierCusCount" resultType="com.management.platform.entity.vo.DepartmentVO">
+        select count(*) as earlierCusTotal,u.department_id as id,d.department_name as departmentName
+        from business_opportunity b
+        left join user u on b.incharger_id=u.id
+        left join department d on d.department_id=u.department_id
+        <where>
+            1=1 AND u.department_id IS NOT NULL and b.company_id=#{companyId}
+
+            <if test="endDate !=null and endDate !=''">
+                AND  b.create_time &lt; #{endDate}
+            </if>
+            <if test="departmentId !=null ">
+                AND  u.department_id=#{departmentId}
+            </if>
+        </where>
+        group by u.department_id
+    </select>
 </mapper>

+ 23 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ReportExtraDegreeMapper.xml

@@ -0,0 +1,23 @@
+<?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.ReportExtraDegreeMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ReportExtraDegree">
+        <id column="id" property="id" />
+        <result column="company_id" property="companyId" />
+        <result column="name" property="name" />
+        <result column="code" property="code" />
+        <result column="rmark" property="rmark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, company_id, name, code, rmark
+    </sql>
+
+    <select id="getAll" resultMap="BaseResultMap">
+        select id, name,rmark,code from report_extra_degree where company_id = #{companyId}
+        ORDER BY id DESC
+    </select>
+</mapper>