Преглед на файлове

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper

QuYueTing преди 1 месец
родител
ревизия
b33053fb88
променени са 61 файла, в които са добавени 32263 реда и са изтрити 16783 реда
  1. 15 4
      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. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/BusinessOpportunityService.java
  21. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ClueService.java
  22. 40 40
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CompanyDingdingService.java
  23. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ContactsService.java
  24. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ContractService.java
  25. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CustomService.java
  26. 55 56
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/DingDingService.java
  27. 42 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/LeaveSheetService.java
  28. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProductService.java
  29. 294 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProjectService.java
  30. 23 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportExtraDegreeService.java
  31. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportLogDetailService.java
  32. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportLogService.java
  33. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportProfessionProgressService.java
  34. 16 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportPushLogService.java
  35. 155 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ReportService.java
  36. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/SalesOrderService.java
  37. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/TaskService.java
  38. 215 50
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AIQuestionServiceImpl.java
  39. 140 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/BusinessOpportunityServiceImpl.java
  40. 109 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ClueServiceImpl.java
  41. 589 589
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java
  42. 81 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java
  43. 83 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java
  44. 90 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CustomServiceImpl.java
  45. 2515 2516
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  46. 19 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java
  47. 820 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  48. 94 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  49. 13517 13519
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  50. 184 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportExtraDegreeServiceImpl.java
  51. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportLogDetailServiceImpl.java
  52. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportLogServiceImpl.java
  53. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportProfessionProgressServiceImpl.java
  54. 20 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportPushLogServiceImpl.java
  55. 8906 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  56. 125 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java
  57. 208 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  58. 3 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml
  59. 18 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/DepartmentMapper.xml
  60. 23 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ReportExtraDegreeMapper.xml
  61. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/UserMapper.xml

+ 15 - 4
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>
@@ -64,10 +71,9 @@
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-generator</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-        </dependency>
+
+
+
 
         <!-- fastjson -->
         <dependency>
@@ -116,6 +122,11 @@
             <artifactId>aspectjweaver</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
         <!-- logback -->
         <!--<dependency>
             <groupId>net.logstash.logback</groupId>

Файловите разлики са ограничени, защото са твърде много
+ 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> {
+
+}

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/BusinessOpportunityService.java

@@ -74,4 +74,6 @@ public interface BusinessOpportunityService extends IService<BusinessOpportunity
     HttpRespMsg pinBusinessOpportunity(BusinessOpportunity bo, HttpServletRequest request);
 
     HttpRespMsg undoPin(BusinessOpportunity bo, HttpServletRequest request);
+
+    HttpRespMsg exportDataAI(BusinessOpportunity bo, HttpServletRequest request)  throws Exception ;
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ClueService.java

@@ -21,6 +21,8 @@ import java.util.List;
  */
 public interface ClueService extends IService<Clue> {
 
+    HttpRespMsg exportDataAI(Clue clue,HttpServletRequest request) throws Exception;
+
     void insert(Clue clue);
     void update(Clue clue);
 

+ 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);
+}

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ContactsService.java

@@ -9,6 +9,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -57,4 +58,6 @@ public interface ContactsService extends IService<Contacts> {
     HttpRespMsg pageContactsByPin(Integer pageIndex, Integer pageSize, Integer customId, String name, String email, String creatorId, String phone, String ownerId, HttpServletRequest request);
 
     HttpRespMsg undoPin(Contacts contacts, HttpServletRequest request);
+
+    HttpRespMsg exportDataAI(Map<String, Object> map, HttpServletRequest request) throws Exception;
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ContractService.java

@@ -48,4 +48,6 @@ public interface ContractService extends IService<Contract> {
     HttpRespMsg getContractDetail(HttpServletRequest request, Integer id);
 
     HttpRespMsg importContractNew(HttpServletRequest request, MultipartFile file);
+
+    HttpRespMsg exportDataAI(String startDate, String endDate, HttpServletRequest request) throws Exception;
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/CustomService.java

@@ -70,4 +70,6 @@ public interface CustomService extends IService<Custom> {
     HttpRespMsg getPrivilegedCustom(HttpServletRequest request);
 
     HttpRespMsg delete(Custom custom);
+
+    HttpRespMsg exportDataAI(Custom custom, HttpServletRequest request) throws Exception;
 }

+ 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);
+}

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProductService.java

@@ -38,4 +38,6 @@ public interface ProductService extends IService<Product> {
     HttpRespMsg orderWithProduct(Integer id);
 
     HttpRespMsg businessListWithProduct(Integer id);
+
+    HttpRespMsg exportDataAI(String startDate, String endDate, HttpServletRequest request) throws Exception;
 }

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

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/SalesOrderService.java

@@ -43,4 +43,6 @@ public interface SalesOrderService extends IService<SalesOrder> {
     HttpRespMsg undoPin(SalesOrder order, HttpServletRequest request);
 
     HttpRespMsg paymentCollectionList(Integer orderId, User user);
+
+    HttpRespMsg exportDataAI(String startTime, String endTime, HttpServletRequest request) throws Exception;
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/TaskService.java

@@ -44,4 +44,6 @@ public interface TaskService extends IService<Task> {
     HttpRespMsg getTaskDetail(Integer id, HttpServletRequest request);
 
     HttpRespMsg getTaskListByStartAndEnd(String startDate, String endDate, HttpServletRequest request);
+
+    HttpRespMsg exportDataAI(TaskDto task, HttpServletRequest request) throws Exception;
 }

+ 215 - 50
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AIQuestionServiceImpl.java

@@ -6,10 +6,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.entity.*;
 import com.management.platform.entity.bo.FormStorePageBO;
 import com.management.platform.entity.bo.QuestionBO;
+import com.management.platform.entity.dto.TaskDto;
 import com.management.platform.mapper.*;
-import com.management.platform.service.AIQuestionService;
-import com.management.platform.service.CusTableColumnService;
-import com.management.platform.service.ExcelExportService;
+import com.management.platform.service.*;
 import com.management.platform.util.ExcelConverter;
 import com.management.platform.util.HttpRespMsg;
 import org.apache.commons.collections.CollectionUtils;
@@ -38,14 +37,17 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.sql.*;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
-import java.util.stream.Collectors;
 
 @Service
 public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuestion>  implements AIQuestionService {
@@ -71,6 +73,30 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
     @Resource
     private CusTableColumnMapper cusTableColumnMapper;
 
+    @Resource
+    private ClueService clueService;
+
+    @Resource
+    private BusinessOpportunityService businessOpportunityService;
+
+    @Resource
+    private TaskService taskService;
+
+    @Resource
+    private CustomService customService;
+
+    @Resource
+    private ContactsService contactsService;
+
+    @Resource
+    private ProductService productService;
+
+    @Resource
+    private SalesOrderService salesOrderService;
+
+    @Resource
+    private ContractService contractService;
+
     @Resource
     private ExcelExportService excelExportService;
 
@@ -209,60 +235,199 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
 
             String tableName = questionBO.getSourceContent();
 
-            //排除relation表中的关联字段
-            List<BusObjRelation> busObjRelations = busObjRelationMapper.selectList(new LambdaQueryWrapper<BusObjRelation>()
-                    .eq(BusObjRelation::getFromTbl, tableName)
-            );
-            List<CusTableColumn> checkColumns = cusTableColumnMapper.getStructByTableName(tableName,busObjRelations);
-            //映射字段和comment
-            Map<String, String> columnCommentMap = checkColumns.stream().collect(Collectors.toMap(CusTableColumn::getColumnName, CusTableColumn::getColumnComment));
-
-            StringBuilder stringBuilder = new StringBuilder();
-            stringBuilder.append(" select ");
-            for (String key : columnCommentMap.keySet()) {
-                stringBuilder.append(" ").append(key).append(",");
+            HttpRespMsg dataMsg = new HttpRespMsg();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            switch (tableName){
+                case "business_opportunity" :
+                    BusinessOpportunity bo = new BusinessOpportunity();
+                    if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+                        bo.setStartTime(sdf.format(questionBO.getStartDate())) ;
+                        bo.setEndTime(sdf.format(questionBO.getEndDate())) ;
+                    }
+                    try {
+                        dataMsg = businessOpportunityService.exportDataAI(bo,request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "clue" :
+                    Clue clue = new Clue();
+                    if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+                        clue.setStartTime(sdf.format(questionBO.getStartDate())) ;
+                        clue.setEndTime(sdf.format(questionBO.getEndDate())) ;
+                    }
+                    try {
+                        dataMsg = clueService.exportDataAI(clue,request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "custom" :
+                    Custom custom = new Custom();
+                    if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+                        custom.setStartTime(sdf.format(questionBO.getStartDate())) ;
+                        custom.setEndTime(sdf.format(questionBO.getEndDate())) ;
+                    }
+                    try {
+                        dataMsg = customService.exportDataAI(custom,request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "contacts" :
+                    Map<String,Object> map = new HashMap<>();
+                    map.put("isDelete", 0);
+                    map.put("companyId",user.getCompanyId());
+//                    if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//
+//                    }
+                    try {
+                        dataMsg = contactsService.exportDataAI(map,request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "task" :
+                    TaskDto task = new TaskDto();
+                    if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+                        task.setStartDate(LocalDateTime.parse(sdf.format(questionBO.getStartDate()), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); ;
+                        task.setEndDate(LocalDateTime.parse(sdf.format(questionBO.getEndDate()), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) ;
+                    }
+                    try {
+                        dataMsg = taskService.exportDataAI(task,request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "product" :
+                    try {
+                        dataMsg = productService.exportDataAI(sdf.format(questionBO.getStartDate()),sdf.format(questionBO.getEndDate()),request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "sales_order" :
+                    try {
+                        dataMsg = salesOrderService.exportDataAI(sdf.format(questionBO.getStartDate()),sdf.format(questionBO.getEndDate()),request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
+                case "contract" :
+                    try {
+                        dataMsg = contractService.exportDataAI(sdf.format(questionBO.getStartDate()),sdf.format(questionBO.getEndDate()),request);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        dataMsg.setError("系统表生成数据有误,请联系管理员");
+                    }
+                    break;
             }
-            stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
-            stringBuilder.append(" from ")
-                    .append(tableName)
-                    .append(" where company_id =")
-                    .append(user.getCompanyId());
-            if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
-                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-                stringBuilder.append(" and date_format(create_time,'%Y-%m-%d') between ")
-                        .append("'").append(sdf.format(questionBO.getStartDate())).append("'")
-                        .append(" and ")
-                        .append("'").append(sdf.format(questionBO.getEndDate())).append("'");
+
+            if(dataMsg.getCode().equals("error")){
+                return dataMsg;
             }
 
-            List<Map<String,Object>> columnList = new ArrayList<>();
-            try (Connection connection = dataSource.getConnection()) {
-                PreparedStatement preparedStatement = connection.prepareStatement(stringBuilder.toString());
-                ResultSet resultSet = preparedStatement.executeQuery();
-                columnList = this.convertListWithComment(resultSet,columnCommentMap);
-            }catch (SQLException e) {
+            String filePath = dataMsg.getMsg();
+
+            RestTemplate restTemplate = new RestTemplate();
+            //转换为MultipartFile 准备表单数据
+            MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
+            body.add("question", questionBO.getContent());
+            ByteArrayResource byteArrayResource = null;
+            File f = new File(path,filePath);
+            try {
+                MultipartFile multipartFileFromPath = getMultipartFileFromPath(f.getAbsolutePath());
+                byteArrayResource = new ByteArrayResource(multipartFileFromPath.getBytes()) {
+                    @Override
+                    public String getFilename() {
+                        return multipartFileFromPath.getOriginalFilename();
+                    }
+                };
+            }catch (IOException e){
                 e.printStackTrace();
-                httpRespMsg.setError("查询系统表有误,请联系管理员");
-                return httpRespMsg;
             }
+            body.add("file",byteArrayResource);
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.MULTIPART_FORM_DATA);
 
-            if(CollectionUtils.isNotEmpty(columnList)){
-                ResponseEntity<String> responseEntity = getResponseEntityWithFileAI(columnList, questionBO.getContent());
-                if(responseEntity.getStatusCode().is2xxSuccessful()){
-                    JSONObject jsonObject = JSONObject.parseObject(responseEntity.getBody());
-                    System.out.println("jsonObject=== "+jsonObject);
-                    if (jsonObject.getString("code").equals("ok")) {
-                        queryRes = jsonObject.getString("data");
-                    } else {
-                        queryRes = jsonObject.getString("msg");
-                    }
-                }else{
-                    queryRes = "AI分析有误,稍后再试";
-                }
+            HttpEntity<MultiValueMap<String, Object>> requestEntity =
+                    new HttpEntity<>(body, headers);
+            ResponseEntity<String> response = restTemplate.exchange(
+                    aiFileAskUrl,
+                    HttpMethod.POST,
+                    requestEntity,
+                    String.class);
+            if(response.getStatusCode().is2xxSuccessful()){
+                JSONObject jsonObject = JSONObject.parseObject(response.getBody());
+                System.out.println("jsonObject=== "+jsonObject);
+                queryRes = jsonObject.getString("data");
             }else{
-                queryRes = "无数据";
+                queryRes = "AI分析有误,稍后再试";
             }
 
+
+            //排除relation表中的关联字段
+//            List<BusObjRelation> busObjRelations = busObjRelationMapper.selectList(new LambdaQueryWrapper<BusObjRelation>()
+//                    .eq(BusObjRelation::getFromTbl, tableName)
+//            );
+//            List<CusTableColumn> checkColumns = cusTableColumnMapper.getStructByTableName(tableName,busObjRelations);
+//            //映射字段和comment
+//            Map<String, String> columnCommentMap = checkColumns.stream().collect(Collectors.toMap(CusTableColumn::getColumnName, CusTableColumn::getColumnComment));
+//
+//            StringBuilder stringBuilder = new StringBuilder();
+//            stringBuilder.append(" select ");
+//            for (String key : columnCommentMap.keySet()) {
+//                stringBuilder.append(" ").append(key).append(",");
+//            }
+//            stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
+//            stringBuilder.append(" from ")
+//                    .append(tableName)
+//                    .append(" where company_id =")
+//                    .append(user.getCompanyId());
+//            if(null != questionBO.getStartDate() && null != questionBO.getEndDate()){
+//                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+//                stringBuilder.append(" and date_format(create_time,'%Y-%m-%d') between ")
+//                        .append("'").append(sdf.format(questionBO.getStartDate())).append("'")
+//                        .append(" and ")
+//                        .append("'").append(sdf.format(questionBO.getEndDate())).append("'");
+//            }
+//
+//            List<Map<String,Object>> columnList = new ArrayList<>();
+//            try (Connection connection = dataSource.getConnection()) {
+//                PreparedStatement preparedStatement = connection.prepareStatement(stringBuilder.toString());
+//                ResultSet resultSet = preparedStatement.executeQuery();
+//                columnList = this.convertListWithComment(resultSet,columnCommentMap);
+//            }catch (SQLException e) {
+//                e.printStackTrace();
+//                httpRespMsg.setError("查询系统表有误,请联系管理员");
+//                return httpRespMsg;
+//            }
+//
+//            if(CollectionUtils.isNotEmpty(columnList)){
+//                ResponseEntity<String> responseEntity = getResponseEntityWithFileAI(columnList, questionBO.getContent());
+//                if(responseEntity.getStatusCode().is2xxSuccessful()){
+//                    JSONObject jsonObject = JSONObject.parseObject(responseEntity.getBody());
+//                    System.out.println("jsonObject=== "+jsonObject);
+//                    if (jsonObject.getString("code").equals("ok")) {
+//                        queryRes = jsonObject.getString("data");
+//                    } else {
+//                        queryRes = jsonObject.getString("msg");
+//                    }
+//                }else{
+//                    queryRes = "AI分析有误,稍后再试";
+//                }
+//            }else{
+//                queryRes = "无数据";
+//            }
+
         } else if (2 == questionBO.getQuestionDataSource()) {
             /**
              * 自定义报表

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

@@ -39,6 +39,7 @@ import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -821,6 +822,145 @@ public class BusinessOpportunityServiceImpl extends ServiceImpl<BusinessOpportun
         return respMsg;
     }
 
+    @Override
+    public HttpRespMsg exportDataAI(BusinessOpportunity bo, HttpServletRequest request)  throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "business").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        Company company = companyMapper.selectById(user.getCompanyId());
+        String str = company.getIsExistBusiness() == 1 ? "商机" : "项目";
+
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+        for (int i = 0; i < titleList.size(); i++) {
+            String s = titleList.get(i);
+            if (s.contains("商机")) {
+                s = s.replaceAll("商机", str);
+                titleList.set(i, s);
+            }
+        }
+
+        HttpRespMsg respMsg = listAI(bo,request);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<BusinessOpportunity> list = (List<BusinessOpportunity>) msgData.get("data");
+
+        for (BusinessOpportunity data : list) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends BusinessOpportunity> aClass = data.getClass();
+                String value = "";
+
+                if(model.equals("inchargerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getInchargerName").invoke(data)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                        }
+//                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
+                    }
+                }else {
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(data)==null?"":aClass.getMethod("get" + targetName).invoke(data));
+                }
+
+                if(model.equals("contactsId")){
+                    value = String.valueOf(aClass.getMethod("getContactsName").invoke(data)).equals("null")?"":String.valueOf(aClass.getMethod("getContactsName").invoke(data));
+                }
+                if(model.equals("customerId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerName").invoke(data)?"":aClass.getMethod("getCustomerName").invoke(data));
+                }
+                if(model.equals("expectedTransactionDate")){
+                    LocalDate date = (LocalDate) aClass.getMethod("getExpectedTransactionDate").invoke(data);
+                    // 如果日期不为空,格式化日期
+                    if (date != null) {
+                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
+                        value = date.format(formatter);
+                    } else {
+                        value = "";
+                    }                }
+                if(model.equals("stageId")){
+                    value = String.valueOf(null == aClass.getMethod("getStageValue").invoke(data)?"":aClass.getMethod("getStageValue").invoke(data));
+                }
+                if(model.equals("creatorId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getCreatorName").invoke(data)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getCreatorName").invoke(data))+"$";
+                        }
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getCreatorName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getCreatorName").invoke(data));
+                    }
+//                    value = String.valueOf(null == aClass.getMethod("getCreatorName").invoke(data)?"":aClass.getMethod("getCreatorName").invoke(data));
+                }
+
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName=str+"表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
+
+    private HttpRespMsg listAI(BusinessOpportunity bo, HttpServletRequest request) {
+        HashMap<Object, Object> r = new HashMap<>();
+        User user = userMapper.selectById(request.getHeader("Token"));
+        bo.setIsDelete(0);
+        bo.setCompanyId(user.getCompanyId());
+        bo.setUserId(user.getId());
+        bo.setEndTime(bo.getEndTime() + " 23:59:59");
+        bo.setPageIndex((bo.getPageIndex()-1) * bo.getPageFrom());
+        List<BusinessOpportunity> list = new ArrayList<>();
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部商机");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门商机");
+        int i = 0;
+        if (isAll) {
+            list = getAll(bo);
+            i = getTotal(bo);
+        } else if (isNotAll) {
+            list = getAll1(bo, user);
+            i = getTotal1(bo, user);
+        } else {
+            list = getAll2(bo, user);
+            i = getTotal2(bo, user);
+        }
+        r.put("data", list);
+        r.put("total",i);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(r);
+        return msg;
+    }
+
 
     private BusinessOpportunity setNull(BusinessOpportunity bo) {
         if (bo.getPlate1() == "") {

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

@@ -82,6 +82,115 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
     @Autowired
     private ApplicationContext applicationContext;
 
+    private HttpRespMsg listAI(Clue clue,HttpServletRequest request){
+        User user = userMapper.selectById(request.getHeader("Token"));
+        clue.setCompanyId(user.getCompanyId());
+        clue.setIsDelete(0);
+        clue.setEndTime(clue.getEndTime() + " 23:59:59");
+        clue.setPageIndex((clue.getPageIndex() - 1) * clue.getPageFrom());
+        boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部线索");
+        boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门线索");
+        List<Clue> list = new ArrayList<>();
+        int i = 0;
+        if (isAll) {
+            //查看全部线索
+            list = getList(clue);
+            i = getTotal(clue);
+        } else if (isNotAll) {
+            //查看负责部门线索 找出所处部门下所有的负责人
+            list = getList1(clue, user);
+            i = getTotal1(clue, user);
+        } else {
+            // 查看负责人为 自己 和 null的数据
+            list = getList2(clue, user);
+            i = getTotal2(clue, user);
+        }
+        HashMap<Object, Object> map = new HashMap<>();
+        map.put("data", list);
+        map.put("total", i);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.setData(map);
+        return msg;
+    }
+
+
+    @Override
+    public HttpRespMsg exportDataAI(Clue clue,HttpServletRequest request) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Thread").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+
+        HttpRespMsg respMsg = this.listAI(clue,request);
+
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<Clue> list = (List<Clue>) msgData.get("data");
+
+        for (Clue data : list) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends Clue> aClass = data.getClass();
+                String value = "";
+
+                if(model.equals("inchargerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getInchargerName").invoke(data)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                        }
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
+                    }
+                }else {
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(data)==null?"":aClass.getMethod("get" + targetName).invoke(data));
+                }
+
+                if(model.equals("clueSourceId")){
+                    value = String.valueOf(null == aClass.getMethod("getClueSourceValue").invoke(data)?"":aClass.getMethod("getClueSourceValue").invoke(data));
+                }
+                if(model.equals("customerLevelId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerLevelValue").invoke(data)?"":aClass.getMethod("getCustomerLevelValue").invoke(data));
+                }
+                if(model.equals("customerIndustryId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerIndustryValue").invoke(data)?"":aClass.getMethod("getCustomerIndustryValue").invoke(data));
+                }
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName="线索表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
 
     @Override
     @Transactional(rollbackFor = Exception.class)

Файловите разлики са ограничени, защото са твърде много
+ 589 - 589
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java


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

@@ -975,5 +975,86 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportDataAI(Map<String, Object> map, HttpServletRequest request) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Contacts").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+
+        Page<ContactsVo> pageContacts = contactsMapper.pageContacts(new Page<>(-1,-1), map);
+        List<ContactsVo> records = pageContacts.getRecords();
+
+        for (ContactsVo contactsVo : records) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends ContactsVo> aClass = contactsVo.getClass();
+                String value = "";
+
+                if(model.equals("customId")){
+                    value = String.valueOf(aClass.getMethod("getCustomName").invoke(contactsVo)).equals("null") ?"" :String.valueOf(aClass.getMethod("getCustomName").invoke(contactsVo));
+                }
+                else if(model.equals("sex")){
+                    value = String.valueOf(aClass.getMethod("getSex").invoke(contactsVo)).equals("null") ?"":String.valueOf(aClass.getMethod("getSex").invoke(contactsVo));
+                    if (StringUtils.isNotEmpty(value)){
+                        if (value.equals("0")){
+                            value="女";
+                        }else {
+                            value="男";
+                        }
+                    }
+
+                }
+                else if(model.equals("ownerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        if(null == aClass.getMethod("getOwnerName").invoke(contactsVo)){
+                            value = "";
+                        }else{
+                            value = "$userName="+String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo))+"$";
+                        }
+//                        value = "$userName="+String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo))+"$";
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo)).equals("null") ? "" :String.valueOf(aClass.getMethod("getOwnerName").invoke(contactsVo));
+                    }
+                }else
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(contactsVo)==null?"":aClass.getMethod("get" + targetName).invoke(contactsVo));
+
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName="联系人表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
+
 
 }

+ 83 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.ContractPageVO;
 import com.management.platform.entity.vo.ContractVo;
@@ -65,7 +64,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
     @Resource
     private LocaleInformationMapper localeInformationMapper;
     @Resource
-    private ExcelExportService excelExportService;
+    private ExcelExportServiceImpl excelExportService;
     @Resource
     private WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
@@ -2182,4 +2181,86 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
         }
         return msg;
     }
+
+    @Override
+    public HttpRespMsg exportDataAI(String startDate, String endDate, HttpServletRequest request) throws Exception {
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<SysRichFunction> functionContractList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "导出合同");
+        if(functionContractList.size() <= 0){
+            httpRespMsg.setError(MessageUtils.message("access.operationError"));
+            return httpRespMsg;
+        }
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        HttpRespMsg contractPage = getContractPage(request, null, null, null, null, null, null, startDate, endDate, null, null, null,null,null);
+        HashMap<String, Object> resultDate = (HashMap<String, Object>) contractPage.data;
+        List<ContractPageVO> data = (List<ContractPageVO>)resultDate.get("data");
+        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("备注");
+        headList.add(MessageUtils.message("entry.contractNo"));
+        headList.add("部门");
+        headList.add(MessageUtils.message("contract.name"));
+        headList.add(MessageUtils.message("Contract.startDate"));
+        headList.add(MessageUtils.message("Contract.endDate"));
+        headList.add(MessageUtils.message("Contract.creatorName"));
+        headList.add(MessageUtils.message("entry.contract"));
+        headList.add(MessageUtils.message("contract.type"));
+        headList.add(MessageUtils.message("leave.status"));
+        headList.add(MessageUtils.message("excel.creatTime"));
+        headList.add(MessageUtils.message("leave.task"));
+        ArrayList<List<String>> allList = new ArrayList<>();
+        allList.add(headList);
+        for (ContractPageVO contract : data) {
+            ArrayList<String> item = new ArrayList<>();
+            item.add(contract.getNumber()==null?"":contract.getNumber());
+            item.add(StringUtils.isEmpty(contract.getDepartmentName())?"":contract.getDepartmentName());
+            item.add(null == contract.getName()?"":contract.getName());
+            item.add(contract.getStartDate()==null?"":contract.getStartDate()+"");
+            item.add(contract.getEndDate()==null?"":contract.getEndDate()+"");
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                contract.setCreatorName("$userName=" + contract.getCreatorWxCorpId() + "$");
+            }else {
+                contract.setCreatorName(contract.getCreatorName());
+            }
+            item.add(contract.getCreatorName());
+            BigDecimal bigDecimal = null;
+            if (contract.getAmounts() != null){
+                bigDecimal = new BigDecimal(contract.getAmounts().toString()).setScale(2, BigDecimal.ROUND_HALF_UP);
+            }
+            item.add(contract.getAmounts()==null?"":bigDecimal + "");
+            item.add(null == contract.getTypeName()?"":contract.getTypeName());
+            switch (contract.getStatus()){
+                case 0 :
+                    item.add("审核通过");
+                    break;
+                case 1 :
+                    item.add("待审核");
+                    break;
+                case 2 :
+                    item.add("驳回");
+                    break;
+                default:
+                    item.add("_");
+            }
+            item.add(null == contract.getIndate()?"":contract.getIndate().toString());
+            item.add(contract.getRemarks()==null?"":contract.getRemarks());
+            allList.add(item);
+        }
+        String fileName = "合同AI_"+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,allList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
 }

+ 90 - 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.isNotEmpty(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 {
@@ -1063,6 +1073,86 @@ public class CustomServiceImpl extends ServiceImpl<CustomMapper, Custom> impleme
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportDataAI(Custom custom, HttpServletRequest request) throws Exception {
+        System.out.println("========导出客户信息==========");
+        long startTimeSec = System.currentTimeMillis();
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Customer").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);
+
+        HttpRespMsg respMsg = getList(custom,request);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<Custom> list = (List<Custom>) msgData.get("data");
+
+        for (Custom data : list) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < modelList.size(); i++) {
+
+                String model = modelList.get(i);
+                String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                Class<? extends Custom> aClass = data.getClass();
+                String value = "";
+
+                if(model.equals("inchargerId")){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(data))+"$";
+                    }else {
+                        value = String.valueOf(aClass.getMethod("getInchargerName").invoke(data)).equals("null") ? "" :String.valueOf(aClass.getMethod("getInchargerName").invoke(data));
+                    }
+                }else {
+                    value= String.valueOf(aClass.getMethod("get" + targetName).invoke(data)==null?"":aClass.getMethod("get" + targetName).invoke(data));
+                }
+
+                if(model.equals("clueSourceId")){
+                    value = String.valueOf(null == aClass.getMethod("getClueSourceValue").invoke(data)?"":aClass.getMethod("getClueSourceValue").invoke(data));
+                }
+                if(model.equals("customerLevelId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerLevelValue").invoke(data)?"":aClass.getMethod("getCustomerLevelValue").invoke(data));
+                }
+                if(model.equals("customerIndustryId")){
+                    value = String.valueOf(null == aClass.getMethod("getCustomerIndustryValue").invoke(data)?"":aClass.getMethod("getCustomerIndustryValue").invoke(data));
+                }
+                item.add(value);
+            }
+            dataList.add(item);
+        }
+        String fileName="客户表AI_"+ System.currentTimeMillis();
+        long endTimeSec = System.currentTimeMillis();
+        System.out.println("========客户信息导出数据准备结束==========耗时"+(endTimeSec-startTimeSec)+"毫秒");
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
+
+    @Value(value = "${upload.path}")
+    private String path;
+
 
     private Custom setNull(Custom clue) {
         if (clue.getPlate1() == "") {

Файловите разлики са ограничени, защото са твърде много
+ 2515 - 2516
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java


+ 19 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ExcelExportServiceImpl.java

@@ -1,7 +1,5 @@
 package com.management.platform.service.impl;
 
-import com.management.platform.controller.TaskController;
-import com.management.platform.controller.UserController;
 import com.management.platform.entity.CorpwxJobResult;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.mapper.CorpwxJobResultMapper;
@@ -72,6 +70,25 @@ public class ExcelExportServiceImpl implements ExcelExportService {
         }
     }
 
+    public HttpRespMsg exportGeneralExcelByTitleAndListAI(String title, List<List<String>> list, String downloadPath) throws Exception {
+        long startTimeSec = System.currentTimeMillis();
+        System.out.println("excel导出数据开始");
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        if (title.contains("/")) {
+            //文件名不能含有路径,得替换掉
+            title = title.replace("/", "@");
+        }
+        if (title.contains("\\")) {
+            //文件名不能含有路径,得替换掉
+            title = title.replace("\\", "@");
+        }
+        String resp = ExcelUtil.exportGeneralExcelByTitleAndList(title, list, downloadPath);
+        httpRespMsg.data = resp;
+        long endTimeSec = System.currentTimeMillis();
+        System.out.println("========excel导出数据结束==========耗时"+(endTimeSec-startTimeSec)+"毫秒");
+        return httpRespMsg;
+    }
+
     public HttpRespMsg exportGeneralExcelByTitleAndList(WxCorpInfo wxCorpInfo, String title, List<List<String>> list, String downloadPath) throws Exception {
         long startTimeSec = System.currentTimeMillis();
         System.out.println("excel导出数据开始");

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

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

@@ -912,4 +912,98 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         msg.setData(opportunityList);
         return msg;
     }
+
+    @Override
+    public HttpRespMsg exportDataAI(String startDate, String endDate, HttpServletRequest request) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Product").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            titleList.add(item.getString("label"));
+        }
+        dataList.add(titleList);
+        HttpRespMsg respMsg = getList(user.getCompanyId(), null, null, null,null,null,startDate,endDate, null, null);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<Product> productList = (List<Product>) msgData.get("record");
+        for (Product product : productList) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < configObJSONArray.size(); i++) {
+                JSONObject target = configObJSONArray.getJSONObject(i);
+                if(target.getString("type").equals("grid")){
+                    JSONArray columns = target.getJSONArray("columns");
+                    for (int i1 = 0; i1 < columns.size(); i1++) {
+                        JSONObject columnsJSONObject = columns.getJSONObject(i1);
+                        JSONArray list = columnsJSONObject.getJSONArray("list");
+                        for (int i2 = 0; i2 < list.size(); i2++) {
+                            JSONObject object = list.getJSONObject(i2);
+                            String model = object.getString("model");
+                            String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                            Class<? extends Product> aClass = product.getClass();
+                            String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(product)==null?"":aClass.getMethod("get" + targetName).invoke(product));
+                            if(model.equals("inchargerId")){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if(null != aClass.getMethod("getInchargerName").invoke(product)){
+                                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                                    }
+//                                    value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                                }else {
+                                    value = String.valueOf(null == aClass.getMethod("getInchargerName").invoke(product)?"":aClass.getMethod("getInchargerName").invoke(product));
+                                }
+                            }
+                            if(model.equals("unit")){
+                                value = String.valueOf(null == aClass.getMethod("getUnitName").invoke(product)?"":aClass.getMethod("getUnitName").invoke(product));
+                            }
+                            if(model.equals("type")){
+                                value = String.valueOf(null == aClass.getMethod("getTypeName").invoke(product)?"":aClass.getMethod("getTypeName").invoke(product));
+                            }
+                            if(model.equals("status")){
+                                if(null != aClass.getMethod("getStatus").invoke(product)){
+                                    value = Integer.valueOf(String.valueOf(aClass.getMethod("getStatus").invoke(product)))==0?"下架":"上架";
+                                }
+//                                value = Integer.valueOf(String.valueOf(aClass.getMethod("getStatus").invoke(product)))==0?"下架":"上架";
+                            }
+                            item.add(value);
+                        }
+                    }
+                }else {
+                    String model = target.getString("model");
+                    String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                    Class<? extends Product> aClass = product.getClass();
+                    String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(product)==null?"":aClass.getMethod("get" + targetName).invoke(product));
+                    if(model.equals("inchargerId")){
+                        if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            if(null != aClass.getMethod("getInchargerName").invoke(product)){
+                                value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                            }
+//                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(product))+"$";
+                        }else {
+                            value = String.valueOf(null == aClass.getMethod("getInchargerName").invoke(product)?"":aClass.getMethod("getInchargerName").invoke(product));
+                        }
+                    }
+                    if(model.equals("unit")){
+                        value = String.valueOf(null == aClass.getMethod("getUnitName").invoke(product)?"":aClass.getMethod("getUnitName").invoke(product));
+                    }
+                    if(model.equals("type")){
+                        value = String.valueOf(null == aClass.getMethod("getTypeName").invoke(product)?"":aClass.getMethod("getTypeName").invoke(product));
+                    }
+                    if(model.equals("status")){
+                        if(null != aClass.getMethod("getStatus").invoke(product)){
+                            value = Integer.valueOf(String.valueOf(aClass.getMethod("getStatus").invoke(product)))==0?"下架":"上架";
+                        }
+//                        value = Integer.valueOf(String.valueOf(aClass.getMethod("getStatus").invoke(product)))==0?"下架":"上架";
+                    }
+                    item.add(value);
+                }
+            }
+            dataList.add(item);
+        }
+        String fileName="产品表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
 }

Файловите разлики са ограничени, защото са твърде много
+ 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 {
+
+}

Файловите разлики са ограничени, защото са твърде много
+ 8906 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java


+ 125 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java

@@ -68,7 +68,7 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
     @Resource
     private SysDictMapper sysDictMapper;
     @Resource
-    private ExcelExportService excelExportService;
+    private ExcelExportServiceImpl excelExportService;
     @Resource
     private SysFormMapper sysFormMapper;
     @Resource
@@ -568,6 +568,130 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportDataAI(String startTime, String endTime, HttpServletRequest request) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Order").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            if(item.getString("type").equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int i1 = 0; i1 < columns.size(); i1++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(i1);
+                    JSONArray list = columnsJSONObject.getJSONArray("list");
+                    for (int i2 = 0; i2 < list.size(); i2++) {
+                        JSONObject object = list.getJSONObject(i2);
+                        titleList.add(object.getString("label"));
+                    }
+                }
+            }else {
+                titleList.add(item.getString("label"));
+            }
+        }
+        dataList.add(titleList);
+        HttpRespMsg respMsg = getList( null,null, null,null,null,null,null,startTime,endTime,null, null,null,0);
+        Map<String, Object> msgData = (Map<String, Object>) respMsg.getData();
+        List<SalesOrder> salesOrderList = (List<SalesOrder>) msgData.get("record");
+        for (SalesOrder salesOrder : salesOrderList) {
+            List<String> item=new ArrayList<>();
+            for (int i = 0; i < configObJSONArray.size(); i++) {
+                JSONObject target = configObJSONArray.getJSONObject(i);
+                if(target.getString("type").equals("grid")){
+                    JSONArray columns = target.getJSONArray("columns");
+                    for (int i1 = 0; i1 < columns.size(); i1++) {
+                        JSONObject columnsJSONObject = columns.getJSONObject(i1);
+                        JSONArray list = columnsJSONObject.getJSONArray("list");
+                        for (int i2 = 0; i2 < list.size(); i2++) {
+                            JSONObject object = list.getJSONObject(i2);
+                            String model = object.getString("model");
+                            String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                            Class<? extends SalesOrder> aClass = salesOrder.getClass();
+                            String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(salesOrder)==null?"":aClass.getMethod("get" + targetName).invoke(salesOrder));
+                            if(model.equals("inchargerId")){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    if(null != aClass.getMethod("getInchargerName").invoke(salesOrder)){
+                                        value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
+                                    }
+//                                    value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
+                                }else {
+                                    value = String.valueOf(null == aClass.getMethod("getInchargerName").invoke(salesOrder)?"":aClass.getMethod("getInchargerName").invoke(salesOrder));
+                                }
+                            }
+                            if(model.equals("customId")){
+                                value = String.valueOf(null == aClass.getMethod("getCustomName").invoke(salesOrder)?"":aClass.getMethod("getCustomName").invoke(salesOrder));
+                            }
+                            if(model.equals("businessOpportunityId")){
+                                value = String.valueOf(null == aClass.getMethod("getBusinessOpportunityName").invoke(salesOrder)?"":aClass.getMethod("getBusinessOpportunityName").invoke(salesOrder));
+                            }
+                            if(model.equals("customSigner")){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    String tmpStr = String.valueOf(aClass.getMethod("getCustomSignerName").invoke(salesOrder) == null ? "" : aClass.getMethod("getCustomSignerName").invoke(salesOrder));
+                                    value = org.apache.commons.lang3.StringUtils.isNotBlank(tmpStr)?"$userName="+tmpStr+"$":"";
+                                }else {
+                                    value = String.valueOf(aClass.getMethod("getCustomSignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCustomSignerName").invoke(salesOrder));
+                                }
+//                                value = String.valueOf(aClass.getMethod("getCustomSignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCustomSignerName").invoke(salesOrder));
+                            }
+                            if(model.equals("companySigner")){
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    String tmpStr = String.valueOf(aClass.getMethod("getCompanySignerName").invoke(salesOrder) == null ? "" : aClass.getMethod("getCompanySignerName").invoke(salesOrder));
+                                    value = org.apache.commons.lang3.StringUtils.isNotBlank(tmpStr)?"$userName="+tmpStr+"$":"";
+                                }else {
+                                    value = String.valueOf(aClass.getMethod("getCompanySignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCompanySignerName").invoke(salesOrder));
+                                }
+//                                value = String.valueOf(aClass.getMethod("getCompanySignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCompanySignerName").invoke(salesOrder));
+                            }
+                            if(model.equals("type")){
+                                value = String.valueOf(null == aClass.getMethod("getTypeName").invoke(salesOrder)?"":aClass.getMethod("getTypeName").invoke(salesOrder));
+                            }
+                            item.add(value);
+                        }
+                    }
+                }else {
+                    String model = target.getString("model");
+                    String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                    Class<? extends SalesOrder> aClass = salesOrder.getClass();
+                    String value = String.valueOf(aClass.getMethod("get" + targetName).invoke(salesOrder)==null?"":aClass.getMethod("get" + targetName).invoke(salesOrder));
+                    if(model.equals("inchargerId")){
+                        if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            if(null != aClass.getMethod("getInchargerName").invoke(salesOrder)){
+                                value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
+                            }
+//                            value = "$userName="+String.valueOf(aClass.getMethod("getInchargerName").invoke(salesOrder))+"$";
+                        }else {
+                            value = String.valueOf(null == aClass.getMethod("getInchargerName").invoke(salesOrder)?"":aClass.getMethod("getInchargerName").invoke(salesOrder));
+                        }
+                    }
+                    if(model.equals("customId")){
+                        value = String.valueOf(null == aClass.getMethod("getCustomName").invoke(salesOrder)?"":aClass.getMethod("getCustomName").invoke(salesOrder));
+                    }
+                    if(model.equals("businessOpportunityId")){
+                        value = String.valueOf(null == aClass.getMethod("getBusinessOpportunityName").invoke(salesOrder)?"":aClass.getMethod("getBusinessOpportunityName").invoke(salesOrder));
+                    }
+                    if(model.equals("customSigner")){
+                        value = String.valueOf(aClass.getMethod("getCustomSignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCustomSignerName").invoke(salesOrder));
+                    }
+                    if(model.equals("companySigner")){
+                        value = String.valueOf(aClass.getMethod("getCompanySignerName").invoke(salesOrder)==null?"":aClass.getMethod("getCompanySignerName").invoke(salesOrder));
+                    }
+                    if(model.equals("type")){
+                        value = String.valueOf(null == aClass.getMethod("getTypeName").invoke(salesOrder)?"":aClass.getMethod("getTypeName").invoke(salesOrder));
+                    }
+                    item.add(value);
+                }
+            }
+            dataList.add(item);
+        }
+        String fileName="销售表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
+
     @Override
     @Transactional
     public HttpRespMsg importData(MultipartFile multipartFile) {

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

@@ -2683,6 +2683,214 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
 
     }
 
+    @Override
+    public HttpRespMsg exportDataAI(TaskDto taskDto, HttpServletRequest request) throws Exception {
+        User user = userMapper.selectById(request.getHeader("token"));
+//        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, user.getCompanyId()).eq(SysForm::getCode, "Task").eq(SysForm::getIsCurrent, 1));
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, user.getCompanyId()));
+        List<TaskExecutor> taskExecutorList = taskExecutorMapper.selectList(new LambdaQueryWrapper<TaskExecutor>().eq(TaskExecutor::getCompanyId,user.getCompanyId()));
+        List<TaskLog> taskLogList = taskLogMapper.selectList(new LambdaQueryWrapper<TaskLog>().eq(TaskLog::getCompanyId,user.getCompanyId()));
+        Company company = companyMapper.selectById(user.getCompanyId());
+        String config = getTaskSysFromConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        List<List<String>> dataList=new ArrayList<>();
+        List<String> titleList=new ArrayList<>();
+        List<String> modelList=new ArrayList<>();
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            String type = item.getString("type");
+            if (type.equals("grid")){
+                JSONArray columns = item.getJSONArray("columns");
+                for (int j = 0; j < columns.size(); j++) {
+                    JSONObject columnsJSONObject = columns.getJSONObject(j);
+                    JSONArray listJsonArray = columnsJSONObject.getJSONArray("list");
+                    for (int k = 0; k < listJsonArray.size(); k++) {
+                        JSONObject listJsonArrayJSONObject = listJsonArray.getJSONObject(k);
+                        titleList.add(listJsonArrayJSONObject.getString("label"));
+                        modelList.add(listJsonArrayJSONObject.getString("model"));
+                    }
+                }
+            }
+            else {
+                titleList.add(item.getString("label"));
+                modelList.add(item.getString("model"));
+            }
+        }
+        dataList.add(titleList);//设置表头
+
+        taskDto.setCompanyId(user.getCompanyId());
+        taskDto.setPageIndex(null).setPageSize(null);
+        List<TasKVo> taskVoList =taskMapper.getPageListTask(taskDto);
+        if (!taskVoList.isEmpty()){
+            for (TasKVo tasKVo : taskVoList) {
+                if (!taskExecutorList.isEmpty()){
+                    List<TaskExecutor> collect = taskExecutorList.stream().
+                            filter(taskExecutor -> taskExecutor.getTaskId().equals(tasKVo.getId())).
+                            filter(taskExecutor -> taskExecutor.getCompanyId().equals(user.getCompanyId()))
+                            .collect(Collectors.toList());
+                    if (!collect.isEmpty()){
+                        List<String> collect1 = collect.stream().map(TaskExecutor::getExecutorName).collect(Collectors.toList());
+                        tasKVo.setTaskExecutors(collect1);
+                    }
+                }
+            }
+        }
+
+        if(company.getIsSimple()==0) {
+            for (TasKVo tasKVo : taskVoList) {
+                List<String> item = new ArrayList<>();
+                for (int i = 0; i < modelList.size(); i++) {
+
+                    String model = modelList.get(i);
+                    String targetName = model.substring(0, 1).toUpperCase() + model.substring(1);
+                    Class<? extends TasKVo> aClass = tasKVo.getClass();
+                    String value = "";
+
+                    if (model.equals("taskName")) {
+                        value = String.valueOf(aClass.getMethod("getTaskName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getTaskName").invoke(tasKVo));
+                    } else if (model.equals("priority")) {
+//                    0-低 1-中 2-高
+                        Integer priority = tasKVo.getPriority();
+                        switch (priority) {
+                            case 0:
+                                value = "低";
+                                break;
+                            case 1:
+                                value = "中";
+                                break;
+                            case 2:
+                                value = "高";
+                                break;
+                            default:
+                                value = "";
+
+                        }
+                    } else if (model.equals("executorId")) {
+                        List<String> taskExecutors = tasKVo.getTaskExecutors();
+                        if (taskExecutors != null && !taskExecutors.isEmpty()) {
+                            String executorString = taskExecutors.stream()
+                                    .map(
+                                            t -> {
+                                                if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
+                                                    return "$userName=" + t + "$";
+                                                } else {
+                                                    return t;
+                                                }
+                                            }
+                                    ).collect(Collectors.joining(","));
+                            value = executorString.isEmpty() ? "" : executorString;
+                        } else {
+                            value = "";
+                        }
+                    } else if (model.equals("startDate")) {
+                        if (tasKVo.getStartDate() != null) {
+                            LocalDateTime startDate = tasKVo.getStartDate();
+                            // 定义日期时间格式
+                            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+                            // 格式化为字符串
+                            value = startDate.format(formatter);
+                        }
+                    } else if (model.equals("endDate")) {
+                        if (tasKVo.getEndDate() != null) {
+                            LocalDateTime endDate = tasKVo.getEndDate();
+                            // 定义日期时间格式
+                            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+                            // 格式化为字符串
+                            value = endDate.format(formatter);
+                        }
+                    } else if (model.equals("customId")) {
+                        value = String.valueOf(aClass.getMethod("getCustomName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getCustomName").invoke(tasKVo));
+                    } else if (model.equals("businessOpportunityId")) {
+                        value = String.valueOf(aClass.getMethod("getBusinessName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getBusinessName").invoke(tasKVo));
+                    } else if (model.equals("orderId")) {
+                        value = String.valueOf(aClass.getMethod("getOrderName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getOrderName").invoke(tasKVo));
+                    } else if (model.equals("clueId")) {
+                        value = String.valueOf(aClass.getMethod("getClueName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getClueName").invoke(tasKVo));
+                    } else if (model.equals("contactsId")) {
+                        value = String.valueOf(aClass.getMethod("getContactsName").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getContactsName").invoke(tasKVo));
+                    } else if (model.equals("phone")) {
+                        value = String.valueOf(aClass.getMethod("getContactsPhone").invoke(tasKVo)).equals("null") ? "" : String.valueOf(aClass.getMethod("getContactsPhone").invoke(tasKVo));
+                    } else
+                        value = String.valueOf(aClass.getMethod("get" + targetName).invoke(tasKVo) == null ? "" : aClass.getMethod("get" + targetName).invoke(tasKVo));
+                    item.add(value);
+                }
+                dataList.add(item);
+            }
+        }else {
+            dataList.clear();
+            List<String> heads = new ArrayList<>();
+            Collections.addAll(heads, "任务名称", "执行人", "开始时间", "截止时间", "客户名称","客户类型", "预约工作内容", "预约金额", "实际工作内容", "实际金额","付款状态","用户反馈");
+            dataList.add(heads);
+            for (TasKVo tasKVo : taskVoList){
+                List<String> item = new ArrayList<>();
+                item.add(tasKVo.getTaskName());
+                if (tasKVo.getTaskExecutors()!=null&&!tasKVo.getTaskExecutors().isEmpty()){
+                    List<String> taskExecutors = tasKVo.getTaskExecutors();
+                    StringJoiner stringJoiner = new StringJoiner(",");
+                    for (String taskExecutor : taskExecutors) {
+                        stringJoiner.add(taskExecutor);
+                    }
+                    item.add(stringJoiner.toString());
+                }else item.add("");
+
+                if (tasKVo.getStartDate() != null) {
+                    LocalDateTime startDate = tasKVo.getStartDate();
+                    // 定义日期时间格式
+                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+                    // 格式化为字符串
+                    item.add(startDate.format(formatter));
+                }else item.add("");
+
+                if (tasKVo.getEndDate() != null) {
+                    LocalDateTime endDate = tasKVo.getEndDate();
+                    // 定义日期时间格式
+                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+                    // 格式化为字符串
+                    item.add(endDate.format(formatter));
+                }else item.add("");
+
+                item.add(StringUtils.isEmpty(tasKVo.getCustomName()) ? "" : tasKVo.getCustomName());
+                if (tasKVo.getCustomType()!=null){
+                    Integer customType = tasKVo.getCustomType();
+                    switch (customType) {
+                        case 0:
+                            item.add(customTypeName0);
+                            break;
+                        case 1:
+                            item.add(customTypeName1);
+                            break;
+                        case 2:
+                            item.add(customTypeName2);
+                            break;
+                        default:
+                            item.add("");
+                            break;
+                    }
+                }else item.add("");
+                item.add(StringUtils.isEmpty(tasKVo.getAppointContent()) ? "" : tasKVo.getAppointContent());
+                item.add(tasKVo.getAppointMoney()==null ? BigDecimal.ZERO.toString() : tasKVo.getAppointMoney().toString());
+                item.add(StringUtils.isEmpty(tasKVo.getReallyContent()) ? "" : tasKVo.getReallyContent());
+                item.add(tasKVo.getReallyMoney()==null ? BigDecimal.ZERO.toString() : tasKVo.getReallyMoney().toString());
+                if (tasKVo.getPayType()!=null){
+                    Integer payType = tasKVo.getPayType();
+                    if (payType==0){
+                        item.add("未付款");
+                    }else if(payType==1) {
+                        item.add("已付款");
+                    }else {
+                        item.add("");
+                    }
+                }else item.add("");
+                item.add(StringUtils.isEmpty(tasKVo.getUserBack()) ? "" : tasKVo.getUserBack());
+
+                dataList.add(item);
+            }
+        }
+        String fileName="任务表AI_"+ System.currentTimeMillis();
+        return excelExportService.exportGeneralExcelByTitleAndListAI(fileName,dataList,path);
+    }
+
     public void updateTaskRepeatConfigure(Task task){
         task.setRepeatType(null).setRepeatEndNever(null).setRepeatEndCount(null)
                 .setRepeatEndDate(null).setRepeatDesignDay(null).setRepeatDesignSameday(null)

+ 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

+ 18 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/DepartmentMapper.xml

@@ -145,7 +145,7 @@
                  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}
+            1=1 and b.is_delete = 0 AND u.department_id IS NOT NULL and b.company_id=#{companyId}
 
             <if test="startDate !=null and startDate !='' and endDate !=null and endDate !=''">
                 AND  b.create_time BETWEEN #{startDate} AND #{endDate}
@@ -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 b.is_delete = 0  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>

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/UserMapper.xml

@@ -305,7 +305,7 @@
         from business_opportunity b
         left join user u on b.incharger_id=u.id
         <where>
-            1=1 and b.incharger_id is not null and b.company_id=#{companyId}
+            1=1 and b.is_delete = 0 and b.incharger_id is not null and b.company_id=#{companyId}
 
             <if test="startDate !=null and startDate !='' and endDate !=null and endDate !=''">
                 AND  b.create_time BETWEEN #{startDate} AND #{endDate}