فهرست منبع

压缩文件导出

xufei 2 سال پیش
والد
کامیت
c1b071e22b
35فایلهای تغییر یافته به همراه2448 افزوده شده و 3 حذف شده
  1. 26 0
      pom.xml
  2. 63 0
      src/main/java/com/winhc/data/push/bean/CancellationAnnouncementOut.java
  3. 19 0
      src/main/java/com/winhc/data/push/bean/Capital.java
  4. 20 0
      src/main/java/com/winhc/data/push/bean/CapitalActual.java
  5. 32 0
      src/main/java/com/winhc/data/push/bean/ChangeSummaryOut.java
  6. 41 0
      src/main/java/com/winhc/data/push/bean/CompanyAbnormalInfoOut.java
  7. 38 0
      src/main/java/com/winhc/data/push/bean/CompanyChangeOut.java
  8. 39 0
      src/main/java/com/winhc/data/push/bean/CompanyCheckInfoOut.java
  9. 43 0
      src/main/java/com/winhc/data/push/bean/CompanyDoubleRandomCheckInfoOut.java
  10. 29 0
      src/main/java/com/winhc/data/push/bean/CompanyDoubleRandomCheckResultInfoOut.java
  11. 67 0
      src/main/java/com/winhc/data/push/bean/CompanyEquityInfoOut.java
  12. 54 0
      src/main/java/com/winhc/data/push/bean/CompanyHolderOut.java
  13. 45 0
      src/main/java/com/winhc/data/push/bean/CompanyIllegalInfoOut.java
  14. 146 0
      src/main/java/com/winhc/data/push/bean/CompanyJudicialAssistanceOut.java
  15. 97 0
      src/main/java/com/winhc/data/push/bean/CompanyOut.java
  16. 67 0
      src/main/java/com/winhc/data/push/bean/CompanyPunishmentInfoOut.java
  17. 32 0
      src/main/java/com/winhc/data/push/bean/CompanyStaffOut.java
  18. 22 0
      src/main/java/com/winhc/data/push/bean/NewCompany.java
  19. 268 0
      src/main/java/com/winhc/data/push/common/CompanyChangeArgs.java
  20. 61 0
      src/main/java/com/winhc/data/push/common/Constant.java
  21. 18 0
      src/main/java/com/winhc/data/push/common/TaskEnum.java
  22. 19 0
      src/main/java/com/winhc/data/push/configuration/ScheduleConfig.java
  23. 3 0
      src/main/java/com/winhc/data/push/constant/BaseParam.java
  24. 35 0
      src/main/java/com/winhc/data/push/controller/PushDataController.java
  25. 11 0
      src/main/java/com/winhc/data/push/service/SynDataService.java
  26. 64 2
      src/main/java/com/winhc/data/push/service/impl/SynDataServiceImpl.java
  27. 24 1
      src/main/java/com/winhc/data/push/task/PushDataTask.java
  28. 373 0
      src/main/java/com/winhc/data/push/utils/CsvToXlsxUtil.java
  29. 22 0
      src/main/java/com/winhc/data/push/utils/DateUtils.java
  30. 140 0
      src/main/java/com/winhc/data/push/utils/EasyExcelUtil.java
  31. 79 0
      src/main/java/com/winhc/data/push/utils/OssUtils.java
  32. 139 0
      src/main/java/com/winhc/data/push/utils/TransToExcelNewCompany.java
  33. 147 0
      src/main/java/com/winhc/data/push/utils/ZipUtils.java
  34. 136 0
      src/main/java/org/apache/poi/ss/SpreadsheetVersion.java
  35. 29 0
      src/test/java/com/winhc/data/push/TestFile.java

+ 26 - 0
pom.xml

@@ -125,6 +125,32 @@
             <artifactId>cocowwy-dingtalk-robot</artifactId>
             <version>1.0.3-RELEASE</version>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>1.19</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jumpmind.symmetric</groupId>
+            <artifactId>symmetric-csv</artifactId>
+            <version>3.5.19</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.13.1</version>
+        </dependency>
+
 
     </dependencies>
 

+ 63 - 0
src/main/java/com/winhc/data/push/bean/CancellationAnnouncementOut.java

@@ -0,0 +1,63 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CancellationAnnouncementOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("公司名称")
+    private String company_name;
+    @ExcelProperty("企业ID")
+    private String company_id;
+    @ExcelProperty("公告状态")
+    private String status;
+    @ExcelProperty("统一信用代码/注册号")
+    private String credit_no;
+    @ExcelProperty("清算组备案信息-登记机关")
+    private String belong_org;
+    @ExcelProperty("清算组备案信息-清算组备案日期")
+    private String audit_start_date;
+    @ExcelProperty("清算组备案信息-清算组成立日期")
+    private String creditor_start_date;
+    @ExcelProperty("清算组备案信息-注销原因")
+    private String logout_reason;
+    @ExcelProperty("清算组备案信息-清算组办公地址")
+    private String creditor_address;
+    @ExcelProperty("清算组备案信息-清算组联系电话")
+    private String audit_phone;
+    @ExcelProperty("清算组备案信息-清算组负责人")
+    private String creditor_person;
+    @ExcelProperty("清算组备案信息-清算组成员")
+    private String audit_employees;
+    @ExcelProperty("债权人公告信息-统一信用代码/注册号")
+    private String zq_credit_no;
+    @ExcelProperty("债权人公告信息-登记机关")
+    private String zq_belong_org;
+    @ExcelProperty("债权人公告信息-公告期")
+    private String announcement_period;
+    @ExcelProperty("债权人公告信息-公告内容")
+    private String content;
+    @ExcelProperty("债权人公告信息-债权申报联系人")
+    private String zq_person;
+    @ExcelProperty("债权人公告信息-债权申报联系电话")
+    private String zq_audit_phone;
+    @ExcelProperty("债权人公告信息-债权申报地址")
+    private String aq_address;
+    @ExcelProperty("爬取时间")
+    private String create_time;
+    @ExcelProperty("数据更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+
+}

+ 19 - 0
src/main/java/com/winhc/data/push/bean/Capital.java

@@ -0,0 +1,19 @@
+package com.winhc.data.push.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author π
+ * @Description:
+ * @date 2022/11/15 10:59
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Capital {
+    private String amomon;
+    private String paymet;
+    private String time;
+}

+ 20 - 0
src/main/java/com/winhc/data/push/bean/CapitalActual.java

@@ -0,0 +1,20 @@
+package com.winhc.data.push.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author π
+ * @Description:
+ * @date 2022/11/15 10:59
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CapitalActual {
+    private String amomon;
+    private String paymet;
+    private String time;
+}
+

+ 32 - 0
src/main/java/com/winhc/data/push/bean/ChangeSummaryOut.java

@@ -0,0 +1,32 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ChangeSummaryOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("自有企业id")
+    private String company_id;
+    @ExcelProperty("公司名称")
+    private String name;
+    @ExcelProperty("注册号")
+    private String reg_number;
+    @ExcelProperty("统一信用代码")
+    private String credit_code;
+    @ExcelProperty("维度名称")
+    private String collection;
+    @ExcelProperty("发送时间")
+    private String time;
+    @ExcelProperty("变更时间")
+    private String change_time;
+}

+ 41 - 0
src/main/java/com/winhc/data/push/bean/CompanyAbnormalInfoOut.java

@@ -0,0 +1,41 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyAbnormalInfoOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("公司标识")
+    private String company_id;
+    @ExcelProperty("公司名字")
+    private String company_name;
+    @ExcelProperty("列入异常名录原因")
+    private String put_reason;
+    @ExcelProperty("列入异常名录日期")
+    private String put_date;
+    @ExcelProperty("决定列入异常名录部门")
+    private String put_department;
+    @ExcelProperty("移除异常名录原因")
+    private String remove_reason;
+    @ExcelProperty("移除异常名录日期")
+    private String remove_date;
+    @ExcelProperty("决定移除异常名录部门")
+    private String remove_department;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+
+}

+ 38 - 0
src/main/java/com/winhc/data/push/bean/CompanyChangeOut.java

@@ -0,0 +1,38 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyChangeOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("公司标识")
+    private String company_id;
+    @ExcelProperty("公司名称")
+    private String company_name;
+    @ExcelProperty("变更项目对应的大类")
+    private String category;
+    @ExcelProperty("变更事项")
+    private String change_item;
+    @ExcelProperty("变更前内容")
+    private String content_before;
+    @ExcelProperty("变更后内容")
+    private String content_after;
+    @ExcelProperty("变更日期")
+    private String change_time;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+}

+ 39 - 0
src/main/java/com/winhc/data/push/bean/CompanyCheckInfoOut.java

@@ -0,0 +1,39 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyCheckInfoOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("公司标识id")
+    private String company_id;
+    @ExcelProperty("检查对象")
+    private String company_name;
+    @ExcelProperty("检查实施机关")
+    private String check_org;
+    @ExcelProperty("类型")
+    private String check_type;
+    @ExcelProperty("日期")
+    private String check_date;
+    @ExcelProperty("结果")
+    private String check_result;
+    @ExcelProperty("备注")
+    private String remark;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+
+}

+ 43 - 0
src/main/java/com/winhc/data/push/bean/CompanyDoubleRandomCheckInfoOut.java

@@ -0,0 +1,43 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyDoubleRandomCheckInfoOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("公司标识")
+    private String company_id;
+    @ExcelProperty("企业名称")
+    private String company_name;
+    @ExcelProperty("抽查计划编号")
+    private String check_plan_num;
+    @ExcelProperty("抽查计划名称")
+    private String check_plan_name;
+    @ExcelProperty("抽查任务编号")
+    private String check_task_num;
+    @ExcelProperty("抽查任务名称")
+    private String check_task_name;
+    @ExcelProperty("类型")
+    private String check_type;
+    @ExcelProperty("抽查机关")
+    private String check_department;
+    @ExcelProperty("抽查完成日期")
+    private String check_date;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+
+}

+ 29 - 0
src/main/java/com/winhc/data/push/bean/CompanyDoubleRandomCheckResultInfoOut.java

@@ -0,0 +1,29 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyDoubleRandomCheckResultInfoOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("检查事项")
+    private String check_item;
+    @ExcelProperty("检查结果")
+    private String check_result;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+
+}

+ 67 - 0
src/main/java/com/winhc/data/push/bean/CompanyEquityInfoOut.java

@@ -0,0 +1,67 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyEquityInfoOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("股权出质标的企业")
+    private String related_company_name;
+    @ExcelProperty("股权出质标的企业id")
+    private String related_company_id;
+    @ExcelProperty("省份")
+    private String base;
+    @ExcelProperty("登记编号")
+    private String reg_number;
+
+    @ExcelIgnore
+    private String pledgor_info;
+    @ExcelProperty("出质人")
+    private String pledgor_name;
+
+    @ExcelProperty("出质人证照/证件号码")
+    private String certif_number_pledgor;
+    @ExcelProperty("出质股权数额")
+    private String equity_amount;
+
+    @ExcelIgnore
+    private String pledgee_info;
+    @ExcelProperty("质权人")
+    private String pledgee_name;
+
+    @ExcelProperty("质权人证照/证件号码")
+    private String certif_number_pledgee;
+    @ExcelProperty("股权出质设立登记日期")
+    private String reg_date;
+    @ExcelProperty("状态")
+    private String state;
+    @ExcelProperty("公示日期")
+    private String pub_date;
+    @ExcelProperty("变化情况")
+    private String change_situation;
+    @ExcelProperty("注销日期")
+    private String cancel_date;
+    @ExcelProperty("注销原因")
+    private String cancel_reason;
+    @ExcelProperty("出质人类型")
+    private String pledgor_type;
+    @ExcelProperty("质权人类型")
+    private String pledgee_type;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+}

+ 54 - 0
src/main/java/com/winhc/data/push/bean/CompanyHolderOut.java

@@ -0,0 +1,54 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyHolderOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("公司id")
+    private String company_id;
+    @ExcelProperty("公司名称")
+    private String company_name;
+    @ExcelProperty("股东名称")
+    private String holder_name;
+    @ExcelProperty("股东类型")
+    private String holder_type;
+    @ExcelProperty("认缴出资额")
+    private String amount;
+
+    @ExcelIgnore
+    private String capital;
+    @ExcelIgnore
+    private String capital_actual;
+
+    @ExcelProperty("认缴出资时间")
+    private String capital_time;
+    @ExcelProperty("认缴出资方式")
+    private String capital_pay;
+    @ExcelProperty("实缴出资额")
+    private String capital_actual_amount;
+    @ExcelProperty("实缴出资时间")
+    private String capital_actual_time;
+    @ExcelProperty("实缴出资方式")
+    private String capital_actual_pay;
+
+    @ExcelProperty("股东的出资比例")
+    private String percent;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+}

+ 45 - 0
src/main/java/com/winhc/data/push/bean/CompanyIllegalInfoOut.java

@@ -0,0 +1,45 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyIllegalInfoOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("公司标识")
+    private String company_id;
+    @ExcelProperty("公司名字")
+    private String company_name;
+    @ExcelProperty("列入原因")
+    private String put_reason;
+    @ExcelProperty("列入日期")
+    private String put_date;
+    @ExcelProperty("决定列入部门")
+    private String put_department;
+    @ExcelProperty("移除原因")
+    private String remove_reason;
+    @ExcelProperty("移除日期")
+    private String remove_date;
+    @ExcelProperty("决定移除部门")
+    private String remove_department;
+    @ExcelProperty("类别")
+    private String type;
+    @ExcelProperty("违法事实")
+    private String fact;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+
+}

+ 146 - 0
src/main/java/com/winhc/data/push/bean/CompanyJudicialAssistanceOut.java

@@ -0,0 +1,146 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyJudicialAssistanceOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("冻结股权标的企业")
+    private String company_name;
+    @ExcelProperty("冻结股权标的企业id")
+    private String company_id;
+    @ExcelProperty("公司标识,变更信息,受让人")
+    private String cg_assignee_id;
+    @ExcelProperty("公司标识,变更信息,被执行人")
+    private String cg_executed_person_id;
+    @ExcelProperty("公司标识,续行信息,被执行人")
+    private String gn_executed_person_id;
+    @ExcelProperty("公司标识,解除冻结信息,被执行人")
+    private String lf_executed_person_id;
+    @ExcelProperty("公司标识,冻结信息,被执行人")
+    private String fz_executed_person_id;
+    @ExcelProperty("被执行人id")
+    private String executed_person_id;
+    @ExcelProperty("被执行人")
+    private String executed_person;
+    @ExcelProperty("股权数额")
+    private String equity_amount;
+    @ExcelProperty("执行通知书文号")
+    private String execute_notice_num;
+    @ExcelProperty("执行法院")
+    private String executive_court;
+    @ExcelProperty("类型|状态")
+    private String type_state;
+    @ExcelProperty("冻结信息,执行法院")
+    private String fz_executive_court;
+    @ExcelProperty("冻结信息,执行事项")
+    private String fz_implementation_matters;
+    @ExcelProperty("冻结信息,执行裁定书文号")
+    private String fz_execute_order_num;
+    @ExcelProperty("冻结信息,执行通知书文号")
+    private String fz_execute_notice_num;
+    @ExcelProperty("冻结信息,被执行人")
+    private String fz_executed_person;
+    @ExcelProperty("冻结信息,被执行人持有股权、其它投资权益的数额")
+    private String fz_equity_amount_other;
+    @ExcelProperty("冻结信息,被执行人证照种类")
+    private String fz_license_type;
+    @ExcelProperty("冻结信息,被执行人证照号码")
+    private String fz_license_num;
+    @ExcelProperty("冻结信息,冻结期限自")
+    private String fz_from_date;
+    @ExcelProperty("冻结信息,冻结期限至")
+    private String fz_to_date;
+    @ExcelProperty("冻结信息,冻结期限")
+    private String fz_period;
+    @ExcelProperty("冻结信息,冻结公示日期")
+    private String fz_publicity_date;
+    @ExcelProperty("解除冻结信息,执行法院")
+    private String lf_executive_court;
+    @ExcelProperty("解除冻结信息,执行事项")
+    private String lf_implementation_matters;
+    @ExcelProperty("解除冻结信息,执行裁定书文号")
+    private String lf_execute_order_num;
+    @ExcelProperty("解除冻结信息,执行通知书文号")
+    private String lf_execute_notice_num;
+    @ExcelProperty("解除冻结信息,被执行人")
+    private String lf_executed_person;
+    @ExcelProperty("解除冻结信息,被执行人持有股权、其它投资权益的数额")
+    private String lf_equity_amount_other;
+    @ExcelProperty("解除冻结信息,被执行人证照种类")
+    private String lf_license_type;
+    @ExcelProperty("解除冻结信息,被执行人证照号码")
+    private String lf_license_num;
+    @ExcelProperty("解除冻结信息,解除冻结日期")
+    private String lf_frozen_remove_date;
+    @ExcelProperty("解除冻结信息,公示日期")
+    private String lf_publicity_date;
+    @ExcelProperty("冻结失效信息,失效原因")
+    private String lp_invalidation_reason;
+    @ExcelProperty("冻结失效信息,失效日期")
+    private String lp_invalidation_date;
+    @ExcelProperty("续行信息,执行法院")
+    private String gn_executive_court;
+    @ExcelProperty("续行信息,执行事项")
+    private String gn_implementation_matters;
+    @ExcelProperty("续行信息,执行裁定书文号")
+    private String gn_execute_order_num;
+    @ExcelProperty("续行信息,执行通知书文号")
+    private String gn_execute_notice_num;
+    @ExcelProperty("续行信息,被执行人")
+    private String gn_executed_person;
+    @ExcelProperty("续行信息,被执行人持有股权、其它投资权益的数额")
+    private String gn_equity_amount_other;
+    @ExcelProperty("续行信息,被执行人证照种类")
+    private String gn_license_type;
+    @ExcelProperty("续行信息,被执行人证照号码")
+    private String gn_license_num;
+    @ExcelProperty("续行信息,冻结期限自")
+    private String gn_from_date;
+    @ExcelProperty("续行信息,冻结期限至")
+    private String gn_to_date;
+    @ExcelProperty("续行信息,冻结期限")
+    private String gn_period;
+    @ExcelProperty("续行信息,冻结公示日期")
+    private String gn_publicity_date;
+    @ExcelProperty("变更信息,执行法院")
+    private String cg_executive_court;
+    @ExcelProperty("变更信息,执行事项")
+    private String cg_implementation_matters;
+    @ExcelProperty("变更信息执行裁定书文号")
+    private String cg_execute_order_num;
+    @ExcelProperty("变更信息,执行通知书文号")
+    private String cg_execute_notice_num;
+    @ExcelProperty("变更信息,被执行人")
+    private String cg_executed_person;
+    @ExcelProperty("变更信息,被执行人持有股权数额")
+    private String cg_equity_amount_other;
+    @ExcelProperty("变更信息,被执行人证照种类")
+    private String cg_license_type;
+    @ExcelProperty("变更信息,被执行人证照号码")
+    private String cg_license_num;
+    @ExcelProperty("变更信息,受让人")
+    private String cg_assignee;
+    @ExcelProperty("变更信息,协助执行日期")
+    private String cg_execution_date;
+    @ExcelProperty("变更信息,受让人证照种类")
+    private String cg_assignee_license_type;
+    @ExcelProperty("变更信息,受让人证照号码")
+    private String cg_assignee_license_num;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+}

+ 97 - 0
src/main/java/com/winhc/data/push/bean/CompanyOut.java

@@ -0,0 +1,97 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ExcelIgnoreUnannotated
+public class CompanyOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("自有企业id")
+    private String company_id;
+    @ExcelProperty("公司名称")
+    private String name;
+    @ExcelProperty("公司历史名称")
+    private String history_names;
+    @ExcelProperty("注册号")
+    private String reg_number;
+    @ExcelProperty("公司类型")
+    private String company_org_type;
+    @ExcelProperty("注册地址")
+    private String reg_location;
+    @ExcelProperty("注册时间")
+    private String estiblish_time;
+    @ExcelProperty("营业时间开始日期")
+    private String from_time;
+    @ExcelProperty("营业时间结束日期")
+    private String to_time;
+    @ExcelProperty("经营范围")
+    private String business_scope;
+    @ExcelProperty("登记机关")
+    private String reg_institute;
+    @ExcelProperty("核准日期")
+    private String approved_time;
+    @ExcelProperty("企业状态")
+    private String reg_status;
+    @ExcelProperty("注册资本")
+    private String reg_capital;
+    @ExcelProperty("组织机构代码")
+    private String org_number;
+    @ExcelProperty("组织机构代码批准单位")
+    private String org_approved_institute;
+    @ExcelProperty("机构类型")
+    private String company_type;
+    @ExcelProperty("统一信用代码")
+    private String credit_code;
+    @ExcelProperty("省份code")
+    private String province_code;
+    @ExcelProperty("市code")
+    private String city_code;
+    @ExcelProperty("县区code")
+    private String county_code;
+    @ExcelProperty("注册资本金额")
+    private String reg_capital_amount;
+    @ExcelProperty("注册资本币种")
+    private String reg_capital_currency;
+    @ExcelProperty("实收资本金额")
+    private String actual_capital_amount;
+    @ExcelProperty("实收资本币种")
+    private String actual_capital_currency;
+    @ExcelProperty("公司注册状态标准化")
+    private String reg_status_std;
+    @ExcelProperty("职工参保人数")
+    private String social_security_staff_num;
+    @ExcelProperty("注销时间")
+    private String cancel_date;
+    @ExcelProperty("注销原因")
+    private String cancel_reason;
+    @ExcelProperty("吊销时间")
+    private String revoke_date;
+    @ExcelProperty("吊销原因")
+    private String revoke_reason;
+    @ExcelProperty("邮箱")
+    private String emails;
+    @ExcelProperty("电话")
+    private String phones;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelIgnore
+    private String legal_entities;
+    @ExcelProperty("法人信息")
+    private String legal_entity_name;
+}

+ 67 - 0
src/main/java/com/winhc/data/push/bean/CompanyPunishmentInfoOut.java

@@ -0,0 +1,67 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyPunishmentInfoOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("公司id")
+    private String company_id;
+    @ExcelProperty("省份")
+    private String base;
+    @ExcelProperty("行政处罚决定书文号")
+    private String punish_number;
+    @ExcelProperty("公司名称")
+    private String company_name;
+    @ExcelProperty("注册号")
+    private String reg_number;
+    @ExcelProperty("法定代表人")
+    private String person_name;
+    @ExcelProperty("法人类型")
+    private String legal_name_type;
+    @ExcelProperty("违法行为类型")
+    private String type;
+    @ExcelProperty("行政处罚内容")
+    private String content;
+    @ExcelProperty("作出行政处罚决定机关名称")
+    private String department_name;
+    @ExcelProperty("作出行政处罚决定日期")
+    private String decision_date;
+    @ExcelProperty("公示日期")
+    private String publish_date;
+    @ExcelProperty("描述")
+    private String description;
+    @ExcelProperty("行政处罚决定书文件下载路径")
+    private String desc_file_path;
+    @ExcelProperty("行政处罚决定书oss文件路径")
+    private String desc_oss_path;
+    @ExcelProperty("详情最后修改时间")
+    private String punish_desc_mod_time;
+    @ExcelProperty("详情备注信息")
+    private String punish_desc_remark;
+    @ExcelProperty("原始链接")
+    private String source;
+    @ExcelProperty("类型")
+    private String tag;
+    @ExcelProperty("备注信息")
+    private String remark;
+    @ExcelProperty("处理后的备注信息")
+    private String remark_clean;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+
+}

+ 32 - 0
src/main/java/com/winhc/data/push/bean/CompanyStaffOut.java

@@ -0,0 +1,32 @@
+package com.winhc.data.push.bean;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * company
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CompanyStaffOut {
+    //@ExcelIgnore
+    @ExcelProperty("原始名称")
+    private String old_name;
+    @ExcelProperty("公司id")
+    private String company_id;
+    @ExcelProperty("公司名称")
+    private String company_name;
+    @ExcelProperty("成员名称")
+    private String staff_name;
+    @ExcelProperty("任职类型")
+    private String staff_type;
+    @ExcelProperty("创建时间")
+    private String create_time;
+    @ExcelProperty("更新时间")
+    private String update_time;
+    @ExcelProperty("是否删除")
+    private String deleted;
+}

+ 22 - 0
src/main/java/com/winhc/data/push/bean/NewCompany.java

@@ -0,0 +1,22 @@
+package com.winhc.data.push.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author π
+ * @Description:
+ * @date 2022/11/14 15:14
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewCompany {
+    private CompanyOut company;
+    private List<CompanyHolderOut> company_holder;
+    private List<CompanyStaffOut> company_staff;
+}
+

+ 268 - 0
src/main/java/com/winhc/data/push/common/CompanyChangeArgs.java

@@ -0,0 +1,268 @@
+package com.winhc.data.push.common;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
+import com.winhc.data.push.bean.*;
+import com.winhc.data.push.utils.BaseUtils;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.ExtensionMethod;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static com.winhc.data.push.common.Constant.*;
+
+
+/**
+ * @author π
+ * @since 2021-11-2 15:50
+ */
+@Data
+@NoArgsConstructor
+@ExtensionMethod({BaseUtils.class})
+public class CompanyChangeArgs<T> {
+
+    private List<String> exportFields;
+
+    private Function<JSONObject, JSONObject> handles;
+
+    private List<String> changeFields;
+
+    private Function<JSONObject, String> changeTimeHandles;
+
+    private Class<T> clazz;
+
+    private String head;
+
+    public static final Map<String, CompanyChangeArgs> EXPORT_ARGS = createArgs();
+
+    public CompanyChangeArgs(List<String> exportFields, Function<JSONObject, JSONObject> handles, List<String> changeFields, Class<T> clazz, String head) {
+        this.exportFields = exportFields;
+        this.handles = handles;
+        this.changeFields = changeFields;
+        this.clazz = clazz;
+        this.head = head;
+    }
+
+    private static Map<String, CompanyChangeArgs> createArgs() {
+        HashMap<String, CompanyChangeArgs> a = new HashMap<>();
+        a.put("company", new CompanyChangeArgs(
+                Arrays.asList("company_id", "name", "history_names", "reg_number", "company_org_type", "reg_location"
+                        , "estiblish_time", "from_time", "to_time", "business_scope", "reg_institute", "approved_time"
+                        , "reg_status", "reg_capital", "org_number", "org_approved_institute", "company_type"
+                        , "credit_code", "province_code", "city_code", "county_code", "reg_capital_amount"
+                        , "reg_capital_currency", "actual_capital_amount", "actual_capital_currency", "reg_status_std"
+                        , "social_security_staff_num", "cancel_date", "cancel_reason", "revoke_date", "revoke_reason"
+                        , "emails", "phones", "create_time", "deleted", "update_time", "legal_entity_name")
+                , (j) -> {
+            JSONObject tj = (JSONObject) j;
+            JSONArray legals = tj.getJSONArray("legal_entities");
+            String legal_entity_name = "";
+            if (legals != null) {
+                legal_entity_name = legals.toJavaList(JSONObject.class)
+                        .stream()
+                        .filter(j2 -> "0".equals(j2.getString("deleted")))
+                        .map(j2 -> j2.getString("name"))
+                        .filter(StringUtils::isNotBlank)
+                        .distinct()
+                        .collect(Collectors.joining("、"));
+            }
+            tj.put("legal_entity_name", legal_entity_name);
+            return tj;
+        }
+                , Arrays.asList("name", "reg_location", "business_scope", "approved_time", "reg_capital_amount"
+                , "reg_status_std", "deleted", "legal_entities")
+                , CompanyOut.class
+                , company_head
+        ));
+        a.put("company_holder", new CompanyChangeArgs(
+                Arrays.asList("company_id", "company_name", "holder_name", "holder_type", "amount", "capital"
+                        , "capital_actual", "percent", "create_time", "update_time", "deleted")
+                , (j) -> {
+            JSONObject tj = (JSONObject) j;
+            Double amount = tj.getDouble("amount");
+            JSONArray capital = tj.getJSONArray("capital");
+            Capital c1 = new Capital();
+            if (capital != null) {
+                c1 = capital.toJavaList(Capital.class)
+                        .stream()
+                        .peek(j2 -> {
+                            if (StringUtils.isBlank(j2.getTime())) {
+                                j2.setTime("");
+                            }
+                        }).max(Comparator.comparing(Capital::getTime)).orElse(new Capital());
+            }
+
+            JSONArray capitalActual = tj.getJSONArray("capital_actual");
+            CapitalActual c2 = new CapitalActual();
+            if (capitalActual != null) {
+                c2 = capitalActual.toJavaList(CapitalActual.class)
+                        .stream()
+                        .peek(j2 -> {
+                            if (StringUtils.isBlank(j2.getTime())) {
+                                j2.setTime("");
+                            }
+                        }).max(Comparator.comparing(CapitalActual::getTime)).orElse(new CapitalActual());
+            }
+            if (amount == null || amount <= 0D) {
+                tj.put("amount", "");
+                tj.put("percent", "");
+            } else {
+                tj.put("amount", amount + "万元");
+            }
+            tj.put("capital_time", c1.getTime());
+            tj.put("capital_pay", c1.getPaymet());
+
+            tj.put("capital_actual_amount", c2.getAmomon());
+            tj.put("capital_actual_time", c2.getTime());
+            tj.put("capital_actual_pay", c2.getPaymet());
+            return tj;
+        }
+                , Arrays.asList("holder_name", "amount", "percent", "deleted")
+                , CompanyHolderOut.class
+                , holder_head
+        ));
+        a.put("company_staff", new CompanyChangeArgs(
+                Arrays.asList("company_id", "company_name", "staff_name", "staff_type", "create_time", "update_time"
+                        , "deleted")
+                , null
+                , Arrays.asList("staff_name", "staff_type", "deleted")
+                , CompanyStaffOut.class
+                , staff_head
+        ));
+        a.put("company_change", new CompanyChangeArgs(
+                Arrays.asList("company_id", "company_name", "category", "change_item", "content_before", "content_after"
+                        , "change_time", "create_time", "update_time", "deleted")
+                , null
+                , Arrays.asList("change_item", "change_time")
+                , CompanyChangeOut.class
+                , change_head
+        ));
+        a.put("company_equity_info", new CompanyChangeArgs(
+                Arrays.asList("related_company_name", "related_company_id", "base", "reg_number", "pledgor_info"
+                        , "certif_number_pledgor", "equity_amount", "pledgee_info", "certif_number_pledgee", "reg_date"
+                        , "state", "pub_date", "change_situation", "cancel_date", "cancel_reason", "pledgor_type"
+                        , "pledgee_type", "create_time", "update_time", "deleted")
+                , (j) -> {
+            JSONObject tj = (JSONObject) j;
+            JSONArray pledgor_info = tj.getJSONArray("pledgor_info");
+            String pledgor_name = "";
+            if (pledgor_info != null) {
+                pledgor_name = pledgor_info.toJavaList(JSONObject.class)
+                        .stream()
+                        .map(j2 -> j2.getString("pledgor"))
+                        .filter(StringUtils::isNotBlank)
+                        .distinct()
+                        .collect(Collectors.joining("、"));
+            }
+
+            JSONArray pledgee_info = tj.getJSONArray("pledgee_info");
+            String pledgee_name = "";
+            if (pledgee_info != null) {
+                pledgee_name = pledgee_info.toJavaList(JSONObject.class)
+                        .stream()
+                        .map(j2 -> j2.getString("pledgee"))
+                        .filter(StringUtils::isNotBlank)
+                        .distinct()
+                        .collect(Collectors.joining("、"));
+            }
+
+            tj.put("pledgor_name", pledgor_name);
+            tj.put("pledgee_name", pledgee_name);
+            return tj;
+        }
+                , Arrays.asList("related_company_name", "related_company_id", "reg_number", "pledgor_info"
+                , "pledgee_info", "deleted")
+                , CompanyEquityInfoOut.class
+                , equity_info_head
+        ));
+        a.put("company_judicial_assistance", new CompanyChangeArgs(
+                Arrays.asList("company_name", "company_id", "cg_assignee_id", "cg_executed_person_id", "gn_executed_person_id"
+                        , "lf_executed_person_id", "fz_executed_person_id", "executed_person_id", "executed_person"
+                        , "equity_amount", "execute_notice_num", "executive_court", "type_state", "fz_executive_court"
+                        , "fz_implementation_matters", "fz_execute_order_num", "fz_execute_notice_num", "fz_executed_person"
+                        , "fz_equity_amount_other", "fz_license_type", "fz_license_num", "fz_from_date", "fz_to_date"
+                        , "fz_period", "fz_publicity_date", "lf_executive_court", "lf_implementation_matters"
+                        , "lf_execute_order_num", "lf_execute_notice_num", "lf_executed_person", "lf_equity_amount_other"
+                        , "lf_license_type", "lf_license_num", "lf_frozen_remove_date", "lf_publicity_date"
+                        , "lp_invalidation_reason", "lp_invalidation_date", "gn_executive_court", "gn_implementation_matters"
+                        , "gn_execute_order_num", "gn_execute_notice_num", "gn_executed_person", "gn_equity_amount_other"
+                        , "gn_license_type", "gn_license_num", "gn_from_date", "gn_to_date", "gn_period", "gn_publicity_date"
+                        , "cg_executive_court", "cg_implementation_matters", "cg_execute_order_num", "cg_execute_notice_num"
+                        , "cg_executed_person", "cg_equity_amount_other", "cg_license_type", "cg_license_num"
+                        , "cg_assignee", "cg_execution_date", "cg_assignee_license_type", "cg_assignee_license_num"
+                        , "create_time", "update_time", "deleted")
+                , null
+                , Arrays.asList("company_name", "company_id", "executed_person", "execute_notice_num", "type_state"
+                , "fz_publicity_date", "lf_publicity_date", "lp_invalidation_date"
+                , "gn_publicity_date", "cg_execution_date", "deleted")
+                , CompanyJudicialAssistanceOut.class
+                , judicial_assistance_head
+        ));
+        a.put("company_abnormal_info", new CompanyChangeArgs(
+                Arrays.asList("company_id", "company_name", "put_reason", "put_date", "put_department", "remove_reason"
+                        , "remove_date", "remove_department", "create_time", "update_time", "deleted")
+                , null
+                , Arrays.asList("company_name", "put_reason", "put_date", "remove_reason", "remove_date")
+                , CompanyAbnormalInfoOut.class
+                , abnormal_info_head
+        ));
+        a.put("company_punishment_info", new CompanyChangeArgs(
+                Arrays.asList("company_id", "base", "punish_number", "company_name", "reg_number", "person_name"
+                        , "legal_name_type", "type", "content", "department_name", "decision_date", "publish_date"
+                        , "description", "desc_file_path", "desc_oss_path", "punish_desc_mod_time", "punish_desc_remark"
+                        , "source", "tag", "remark", "remark_clean", "create_time", "update_time", "deleted")
+                , null
+                , Arrays.asList("punish_number", "company_name", "publish_date")
+                , CompanyPunishmentInfoOut.class
+                , punishment_info_head
+        ));
+        a.put("cancellation_announcement", new CompanyChangeArgs(
+                Arrays.asList("company_name", "company_id", "status", "credit_no", "belong_org", "audit_start_date"
+                        , "creditor_start_date", "logout_reason", "creditor_address", "audit_phone", "creditor_person"
+                        , "audit_employees", "zq_credit_no", "zq_belong_org", "announcement_period", "content", "zq_person"
+                        , "zq_audit_phone", "aq_address", "create_time", "update_time", "deleted")
+                , null
+                , Arrays.asList("company_name", "audit_start_date")
+                , CancellationAnnouncementOut.class
+                , cancellation_announcement_head
+        ));
+        a.put("company_illegal_info", new CompanyChangeArgs(
+                Arrays.asList("company_id", "company_name", "put_reason", "put_date", "put_department", "remove_reason"
+                        , "remove_date", "remove_department", "type", "fact", "create_time", "update_time", "deleted")
+                , null
+                , Arrays.asList("company_name", "put_reason", "put_date", "remove_reason", "remove_date")
+                , CompanyIllegalInfoOut.class
+                , illegal_info_head
+        ));
+        a.put("company_check_info", new CompanyChangeArgs(
+                Arrays.asList("company_id", "company_name", "check_org", "check_type", "check_date", "check_result", "remark"
+                        , "create_time", "update_time", "deleted")
+                , null
+                , Arrays.asList("company_name", "check_org", "check_type", "check_date", "check_result")
+                , CompanyCheckInfoOut.class
+                , check_info_head
+        ));
+        a.put("company_double_random_check_info", new CompanyChangeArgs(
+                Arrays.asList("company_id", "company_name", "check_plan_num", "check_plan_name", "check_task_num", "check_task_name"
+                        , "check_type", "check_department", "check_date", "create_time", "update_time", "deleted")
+                , null
+                , Arrays.asList("company_name", "check_plan_num", "check_task_num", "check_date")
+                , CompanyDoubleRandomCheckInfoOut.class
+                , double_random_check_info_head
+        ));
+        a.put("change_summary", new CompanyChangeArgs(
+                Arrays.asList("company_id", "name", "reg_number", "credit_code", "collection"
+                        , "time", "change_time")
+                , null
+                , Arrays.asList("company_id", "name", "reg_number", "credit_code", "collection"
+                , "time", "change_time")
+                , ChangeSummaryOut.class
+                , change_summary_head
+        ));
+        return a;
+    }
+}

+ 61 - 0
src/main/java/com/winhc/data/push/common/Constant.java

@@ -0,0 +1,61 @@
+package com.winhc.data.push.common;
+
+
+/**
+ * @author π
+ * @Description:
+ * @date 2021/11/24 9:32
+ */
+public class Constant {
+
+    //输出表头
+    public static final String company_head = "自有企业id@公司名称@公司历史名称@注册号@公司类型@注册地址@注册时间@营业时间开始日期@营业时间结束日期" +
+            "@经营范围@登记机关@核准日期@企业状态@注册资本@组织机构代码@组织机构代码批准单位@机构类型@统一信用代码@省份code@市code@县区code@注册资本金额" +
+            "@注册资本币种@实收资本金额@实收资本币种@公司注册状态标准化@职工参保人数@注销时间@注销原因@吊销时间@吊销原因@邮箱@电话@创建时间@是否删除@更新时间@法人信息";
+
+    public static final String holder_head = "公司id@公司名称@股东名称@股东类型" +
+            "@认缴出资额@认缴出资时间@认缴出资方式@实缴出资额@实缴出资时间@实缴出资方式" +
+            "@股东的出资比例@创建时间@更新时间@是否删除";
+
+    public static final String staff_head = "公司id@公司名称@成员名称@任职类型@创建时间@更新时间@是否删除";
+
+    public static final String change_head = "公司标识@公司名称@变更项目对应的大类@变更事项@变更前内容@变更后内容@变更日期@创建时间@更新时间@是否删除";
+
+    public static final String equity_info_head = "股权出质标的企业@股权出质标的企业id@省份@登记编号@出质人@出质人证照/证件号码@出质股权数额@质权人" +
+            "@质权人证照/证件号码@股权出质设立登记日期@状态@公示日期@变化情况@注销日期@注销原因@出质人类型@质权人类型@创建时间@更新时间@是否删除";
+
+    public static final String judicial_assistance_head = "冻结股权标的企业@冻结股权标的企业id@公司标识,变更信息,受让人@公司标识,变更信息,被执行人" +
+            "@公司标识,续行信息,被执行人@公司标识,解除冻结信息,被执行人@公司标识,冻结信息,被执行人@被执行人id@被执行人@股权数额@执行通知书文号" +
+            "@执行法院@类型|状态@冻结信息,执行法院@冻结信息,执行事项@冻结信息,执行裁定书文号@冻结信息,执行通知书文号" +
+            "@冻结信息,被执行人@冻结信息,被执行人持有股权、其它投资权益的数额@冻结信息,被执行人证照种类@冻结信息,被执行人证照号码@冻结信息,冻结期限自" +
+            "@冻结信息,冻结期限至@冻结信息,冻结期限@冻结信息,冻结公示日期@解除冻结信息,执行法院@解除冻结信息,执行事项@解除冻结信息,执行裁定书文号" +
+            "@解除冻结信息,执行通知书文号@解除冻结信息,被执行人@解除冻结信息,被执行人持有股权、其它投资权益的数额@解除冻结信息,被执行人证照种类" +
+            "@解除冻结信息,被执行人证照号码@解除冻结信息,解除冻结日期@解除冻结信息,公示日期@冻结失效信息,失效原因@冻结失效信息,失效日期" +
+            "@续行信息,执行法院@续行信息,执行事项@续行信息,执行裁定书文号@续行信息,执行通知书文号@续行信息,被执行人@续行信息,被执行人持有股权、其它投资权益的数额" +
+            "@续行信息,被执行人证照种类@续行信息,被执行人证照号码@续行信息,冻结期限自@续行信息,冻结期限至@续行信息,冻结期限@续行信息,冻结公示日期@变更信息,执行法院" +
+            "@变更信息,执行事项@变更信息执行裁定书文号@变更信息,执行通知书文号@变更信息,被执行人@变更信息,被执行人持有股权数额@变更信息,被执行人证照种类" +
+            "@变更信息,被执行人证照号码@变更信息,受让人@变更信息,协助执行日期@变更信息,受让人证照种类@变更信息,受让人证照号码@创建时间@更新时间@是否删除";
+
+    public static final String abnormal_info_head = "公司标识@公司名字@列入异常名录原因@列入异常名录日期@决定列入异常名录部门@移除异常名录原因" +
+            "@移除异常名录日期@决定移除异常名录部门@创建时间@更新时间@是否删除";
+
+    public static final String punishment_info_head = "公司id@省份@行政处罚决定书文号@公司名称@注册号@法定代表人@法人类型@违法行为类型@行政处罚内容" +
+            "@作出行政处罚决定机关名称@作出行政处罚决定日期@公示日期@描述@行政处罚决定书文件下载路径@行政处罚决定书oss文件路径@详情最后修改时间" +
+            "@详情备注信息@原始链接@类型@备注信息@处理后的备注信息@创建时间@更新时间@是否删除";
+
+    public static final String cancellation_announcement_head = "企业名称@企业ID@公告状态@统一信用代码/注册号@清算组备案信息-登记机关@清算组备案信息-清算组备案日期" +
+            "@清算组备案信息-清算组成立日期@清算组备案信息-注销原因@清算组备案信息-清算组办公地址@清算组备案信息-清算组联系电话@清算组备案信息-清算组负责人" +
+            "@清算组备案信息-清算组成员@债权人公告信息-统一信用代码/注册号@债权人公告信息-登记机关@债权人公告信息-公告期@债权人公告信息-公告内容" +
+            "@债权人公告信息-债权申报联系人@债权人公告信息-债权申报联系电话@债权人公告信息-债权申报地址@爬取时间@数据更新时间@是否删除";
+
+    public static final String illegal_info_head = "公司标识@公司名字@列入原因@列入日期@决定列入部门@移除原因@移除日期@决定移除部门@类别@违法事实@创建时间@更新时间@是否删除";
+
+    public static final String check_info_head = "公司标识id@检查对象@检查实施机关@类型@日期@结果@备注@创建时间@更新时间@是否删除";
+
+    public static final String double_random_check_info_head = "公司标识@企业名称@抽查计划编号@抽查计划名称@抽查任务编号@抽查任务名称@类型@抽查机关@抽查完成日期@创建时间@更新时间@是否删除";
+
+    public static final String double_random_check_result_info_head = "检查事项@检查结果@创建时间@更新时间@是否删除";
+
+    public static final String change_summary_head = "自有企业id@公司名称@注册号@统一信用代码@维度名称@发送时间@变更时间";
+
+}

+ 18 - 0
src/main/java/com/winhc/data/push/common/TaskEnum.java

@@ -0,0 +1,18 @@
+package com.winhc.data.push.common;
+
+public class TaskEnum {
+
+    public enum STATUS  {
+        CREATE("create"), ERROR("error"),SUCCESS("success"), RUNNING("running");
+
+        public final String code;
+
+        STATUS(String code) {
+            this.code = code;
+        }
+    }
+
+
+
+}
+

+ 19 - 0
src/main/java/com/winhc/data/push/configuration/ScheduleConfig.java

@@ -0,0 +1,19 @@
+package com.winhc.data.push.configuration;
+
+import com.aliyun.openservices.shade.org.apache.commons.lang3.concurrent.BasicThreadFactory;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+
+@Configuration
+public class ScheduleConfig implements SchedulingConfigurer {
+
+    @Override
+    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
+        ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(10, new BasicThreadFactory.Builder().namingPattern("customized-schedule-pool-%d").daemon(true).build());
+        taskRegistrar.setScheduler(executorService);
+    }
+}

+ 3 - 0
src/main/java/com/winhc/data/push/constant/BaseParam.java

@@ -12,4 +12,7 @@ public class BaseParam {
     //每日url集合
     public static final String AUCTION_TRACKING_ANSHUO_URL = "auction_tracking_anshuo_url";
 
+    //安硕任务状态表
+    public static final String SYN_ANSHUO_UPLOAD_TASKS = "syn_anshuo_upload_tasks";
+
 }

+ 35 - 0
src/main/java/com/winhc/data/push/controller/PushDataController.java

@@ -2,6 +2,7 @@ package com.winhc.data.push.controller;
 
 import cn.hutool.core.lang.Assert;
 import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
+import com.winhc.data.push.common.TaskEnum;
 import com.winhc.data.push.constant.BaseParam;
 import com.winhc.data.push.service.SynDataService;
 import com.winhc.data.push.utils.BaseUtils;
@@ -12,6 +13,8 @@ import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
+import static com.winhc.data.push.constant.BaseParam.SYN_ANSHUO_UPLOAD_TASKS;
+
 
 /**
  * @author π
@@ -61,4 +64,36 @@ public class PushDataController {
         }
     }
 
+
+    @ApiOperation(value = "上传数据")
+    @GetMapping("upload/{ds}")
+    public ResponseVo upload(@PathVariable String ds, @RequestParam String sign) {
+        //日期是昨天之前数据
+        Assert.isTrue(BaseUtils.verifyDate(ds), "ds 不合法");
+        Assert.isTrue(BaseParam.sign.equals(sign), "验签不通过!");
+        long start = System.currentTimeMillis();
+        try {
+            String re = synDataService.uploadTask(ds);
+            return ResponseVo.success(start, re);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return ResponseVo.failure(start, e.getMessage());
+        }
+    }
+
+    @ApiOperation(value = "强制上传数据")
+    @GetMapping("reupload/{ds}")
+    public ResponseVo reupload(@PathVariable String ds, @RequestParam String sign) {
+        Assert.isTrue(BaseUtils.verifyDate(ds), "ds 不合法");
+        Assert.isTrue(BaseParam.sign.equals(sign), "验签不通过!");
+        long start = System.currentTimeMillis();
+        try {
+            Boolean re = synDataService.updateTaskStatus(SYN_ANSHUO_UPLOAD_TASKS, ds, TaskEnum.STATUS.CREATE.code);
+            return ResponseVo.success(start, re ? "restart" : "error");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            return ResponseVo.failure(start, e.getMessage());
+        }
+    }
+
 }

+ 11 - 0
src/main/java/com/winhc/data/push/service/SynDataService.java

@@ -2,6 +2,7 @@ package com.winhc.data.push.service;
 
 import org.bson.Document;
 
+import java.io.FileNotFoundException;
 import java.util.List;
 
 /**
@@ -18,8 +19,18 @@ public interface SynDataService {
 
     Boolean findTaskExists(Document doc);
 
+    Boolean findTaskExists(String collectionName, Document doc);
+
     List<Document> findAllTask(Document id);
 
+    List<Document> findAllTask(String collectionName, Document doc);
+
     Boolean updateTask(String tn, String ds, String status);
 
+    Boolean updateTaskStatus(String collectionName, String ds, String status);
+
+    String uploadTask(String ds);
+
+    void uploadToOss(String ds) throws FileNotFoundException;
+
 }

+ 64 - 2
src/main/java/com/winhc/data/push/service/impl/SynDataServiceImpl.java

@@ -10,17 +10,23 @@ import com.mongodb.client.model.Filters;
 import com.mongodb.client.model.FindOneAndUpdateOptions;
 import com.mongodb.client.model.UpdateOneModel;
 import com.mongodb.client.model.UpdateOptions;
+import com.winhc.data.push.common.TaskEnum;
 import com.winhc.data.push.configuration.OSSAccessProperties;
 import com.winhc.data.push.framework.MongoDbFastScan;
 import com.winhc.data.push.service.SynDataService;
 import com.winhc.data.push.service.TouchService;
+import com.winhc.data.push.utils.TransToExcelNewCompany;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
 import org.bson.Document;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.stereotype.Service;
 
 import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -29,8 +35,9 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
-import static com.winhc.data.push.constant.BaseParam.AUCTION_TRACKING_ANSHUO_URL;
-import static com.winhc.data.push.constant.BaseParam.SYN_ANSHUO_TASKS;
+import static com.winhc.data.push.constant.BaseParam.*;
+import static com.winhc.data.push.utils.TransToExcelNewCompany.dataPathPrefix;
+import static com.winhc.data.push.utils.TransToExcelNewCompany.run;
 
 /**
  * @author π
@@ -116,11 +123,22 @@ public class SynDataServiceImpl implements SynDataService {
     }
 
     @Override
+    public Boolean findTaskExists(String collectionName, Document doc) {
+        return mongoTemplate.getCollection(collectionName).find(doc).iterator().hasNext();
+    }
+
+    @Override
     public List<Document> findAllTask(Document doc) {
         FindIterable<Document> it = mongoTemplate.getCollection(SYN_ANSHUO_TASKS).find(doc);
         return StreamSupport.stream(it.spliterator(), false).collect(Collectors.toList());
     }
 
+    @Override
+    public List<Document> findAllTask(String collectionName, Document doc) {
+        FindIterable<Document> it = mongoTemplate.getCollection(collectionName).find(doc);
+        return StreamSupport.stream(it.spliterator(), false).collect(Collectors.toList());
+    }
+
 
     @Override
     public Boolean updateTask(String tn, String ds, String status) {
@@ -135,6 +153,50 @@ public class SynDataServiceImpl implements SynDataService {
         return true;
     }
 
+    @Override
+    public Boolean updateTaskStatus(String collectionName, String ds, String status) {
+        Document d = new Document();
+        d.put("update_time", new Date());
+        d.put("status", status);
+        d.put("ds", ds);
+        mongoTemplate.getCollection(collectionName)
+                .findOneAndUpdate(Filters.eq("_id", ds), new Document("$set", d), new FindOneAndUpdateOptions().upsert(true));
+        return true;
+    }
+
+    @Override
+    public String uploadTask(String ds) {
+        if (findTaskExists(SYN_ANSHUO_UPLOAD_TASKS, new Document("_id", ds))) {
+            return "task repeat";
+        } else {
+            Document d = new Document();
+            d.put("_id", ds);
+            d.put("create_time", new Date());
+            d.put("update_time", new Date());
+            d.put("status", TaskEnum.STATUS.CREATE.code);
+            d.put("ds", ds);
+            mongoTemplate.getCollection(SYN_ANSHUO_UPLOAD_TASKS).insertOne(d);
+            return "task create success";
+        }
+    }
+
+    @Override
+    public void uploadToOss(String ds) {
+        try {
+            sendMessage("开始安硕每日任务 uploadToOss , 数据分区 : " + ds + " !!! ");
+            String objectName = run(ds);
+            updateTaskStatus(SYN_ANSHUO_UPLOAD_TASKS, ds, TaskEnum.STATUS.SUCCESS.code);
+            String downLoadPath = "https://data-exchange-as.oss-cn-shanghai.aliyuncs.com/" + objectName;
+            String zipSize = FileUtils.byteCountToDisplaySize(FileUtils.sizeOf(new File(dataPathPrefix + ds + ".zip")));
+            sendMessage("安硕每日任务上传oss成功,数据分区 : " + ds + " !!! " + "大小 : " + zipSize + " . 下载地址 : \n" + downLoadPath);
+        } catch (Exception e) {
+            updateTaskStatus(SYN_ANSHUO_UPLOAD_TASKS, ds, TaskEnum.STATUS.ERROR.code);
+            log.error("uploadToOss error : {}", e.getMessage());
+            sendMessage("安硕每日任务 uploadToOss 失败 , error : " + e.getMessage());
+        }
+
+    }
+
     private void copyOSS(String ds) {
         MongoDatabase db = mongoTemplate.getDb();
         Consumer<List<Document>> func = list -> {

+ 24 - 1
src/main/java/com/winhc/data/push/task/PushDataTask.java

@@ -2,6 +2,7 @@ package com.winhc.data.push.task;
 
 
 import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
+import com.winhc.data.push.common.TaskEnum;
 import com.winhc.data.push.service.DataWorksService;
 import com.winhc.data.push.service.SynDataService;
 import com.winhc.data.push.utils.BaseUtils;
@@ -12,8 +13,11 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.io.FileNotFoundException;
 import java.util.List;
 
+import static com.winhc.data.push.constant.BaseParam.SYN_ANSHUO_UPLOAD_TASKS;
+
 /**
  * @author π
  * @Description:触发任务
@@ -34,7 +38,6 @@ public class PushDataTask {
     //@Scheduled(cron = "0 /2 * * * ? ")
     public synchronized void start() {
         log.info("start PushDataTask !!! ");
-        //if (BaseUtils.isWindows()) return;
         //获取运行任务
         List<Document> allTask = synDataService.findAllTask(new Document("status", "create"));
         allTask.forEach(task -> {
@@ -47,4 +50,24 @@ public class PushDataTask {
         log.info("stop PushDataTask !!! ");
 
     }
+
+    @Scheduled(cron = "*/10 * * * * ?")
+    //@Scheduled(cron = "0 /2 * * * ? ")
+    public synchronized void upload() {
+        log.info("start upload task !!! ");
+        //获取运行任务
+        List<Document> allTask = synDataService.findAllTask(SYN_ANSHUO_UPLOAD_TASKS, new Document("status", TaskEnum.STATUS.CREATE.code));
+        allTask.forEach(task -> {
+            String ds = task.getString("ds");
+            if (StringUtils.isNotBlank(ds)) {
+                try {
+                    synDataService.uploadToOss(ds);
+                } catch (FileNotFoundException e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+        log.info("stop upload task !!! ");
+
+    }
 }

+ 373 - 0
src/main/java/com/winhc/data/push/utils/CsvToXlsxUtil.java

@@ -0,0 +1,373 @@
+package com.winhc.data.push.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializeConfig;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.model.GetObjectRequest;
+import com.aliyun.oss.model.OSSObject;
+import com.winhc.data.push.bean.*;
+import com.winhc.data.push.common.CompanyChangeArgs;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jumpmind.symmetric.csv.CsvReader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static com.winhc.data.push.utils.DateUtils.getMinusDay;
+
+
+/**
+ * -----------------------maven 依赖----------------------------
+ * CSV解析依赖包
+ * <dependency>
+ * <groupId>org.jumpmind.symmetric</groupId>
+ * <artifactId>symmetric-csv</artifactId>
+ * <version>3.5.19</version>
+ * </dependency>
+ * <p>
+ * APACHE POI包
+ * <dependency>
+ * <groupId>org.apache.poi</groupId>
+ * <artifactId>poi-ooxml</artifactId>
+ * <version>3.17</version>
+ * </dependency>
+ * <p>
+ * -----------------------------------------------------------
+ *
+ * @description
+ */
+public class CsvToXlsxUtil {
+
+    private static final Logger log = LoggerFactory.getLogger(CsvToXlsxUtil.class);
+
+    //CSV常用分隔符,如需动态扩展设置成配置项
+    private static final char[] DELIMITERS = {
+            ',',
+            ';',
+            '\001',
+            ' ',
+            '\t',
+            '|',
+            '#',
+            '&'
+    };
+
+
+    public static void main(String[] args) {
+        String csvFile = "D:\\data\\山西省太原市小店区.csv";
+        System.out.println(csvToXLSX(csvFile));
+    }
+
+    /**
+     * 读取CSV文件并写入到XLSX文件中,默认编码
+     *
+     * @param csvFileAddress
+     * @return
+     */
+    public static String csvToXLSX(String csvFileAddress) {
+        return csvToXLSX(csvFileAddress, "GBK");
+    }
+
+    /**
+     * 读取CSV文件并写入到XLSX文件中,指定CSV文件编码
+     *
+     * @param csvFileAddress
+     * @param charset
+     * @return
+     */
+    public static String csvToXLSX(String csvFileAddress, String charset) {
+        String xlsxFileAddress = "";
+        FileOutputStream fileOutputStream = null;
+        try {
+            //char delimiter = getDelimiter(csvFileAddress);
+            //xlsxFileAddress = csvFileAddress.replace("csv","xlsx"); //xlsx file address
+            xlsxFileAddress = csvFileAddress.split("\\.")[0] + ".xls";
+
+            XSSFWorkbook workBook = new XSSFWorkbook();
+            XSSFSheet sheet = workBook.createSheet(getSheetName(csvFileAddress));
+            int RowNum = -1;
+            CsvReader csvReader = new CsvReader(csvFileAddress, ',', Charset.forName(charset));
+            while (csvReader.readRecord()) {
+                RowNum++;
+                System.out.println(RowNum);
+                XSSFRow currentRow = sheet.createRow(RowNum);
+                for (int i = 0; i < csvReader.getColumnCount(); i++) {
+                    currentRow.createCell(i).setCellValue(csvReader.get(i));
+                }
+            }
+            fileOutputStream = new FileOutputStream(xlsxFileAddress);
+            workBook.write(fileOutputStream);
+            return getFileName(xlsxFileAddress);
+        } catch (Exception e) {
+            log.error("CsvToXlsxUtil exception :", e);
+        } finally {
+            try {
+                fileOutputStream.close();
+            } catch (IOException e) {
+                log.error("CsvToXlsxUtil close FileOutputStream exception :", e);
+            }
+        }
+        return getFileName(xlsxFileAddress);
+    }
+
+
+    public static void csvToXLSxPlus(String csvFilePath, String xlsxFilePath, String sheetName) {
+        EasyExcelUtil easyExcelUtil = new EasyExcelUtil();
+        //easyExcelUtil.init(xlsxFilePath, sheet, head);
+        easyExcelUtil.init(xlsxFilePath, sheetName);
+        try {
+            int RowNum = -1;
+            CsvReader csvReader = new CsvReader(csvFilePath, ',', StandardCharsets.UTF_8);
+            csvReader.setSafetySwitch(false);
+            csvReader.setUseTextQualifier(false);
+            while (csvReader.readRecord()) {
+                RowNum++;
+                System.out.println(RowNum);
+                List<List<String>> sumDataList = new ArrayList<>(1);
+                List<String> dataList = new ArrayList<>(1);
+                for (int i = 0; i < csvReader.getColumnCount(); i++) {
+//                    String col = csvReader.get(i);
+//                    if (StringUtils.isNotBlank(col) && col.length() > 100000L) {
+//                        //break;
+//                        dataList.add(csvReader.get(i).substring(0, 100000));
+//                    }
+                    dataList.add(csvReader.get(i));
+                }
+                sumDataList.add(dataList);
+                easyExcelUtil.doExportExcel(sumDataList);
+            }
+        } catch (Exception e) {
+            log.error("CsvToXlsxUtil exception :", e);
+        } finally {
+            try {
+                easyExcelUtil.finish();
+            } catch (Exception e) {
+                log.error("CsvToXlsxUtil close FileOutputStream exception :", e);
+            }
+        }
+    }
+
+
+
+    public static void jsonToXLSxNewCompany(String outPathPre, String objectName, List<List<String>> companyHeads,
+                                            List<List<String>> holderHeads, List<List<String>> staffHeads, Set<String> excludeColumnFiledNames) {
+        Map<String, CompanyChangeArgs> exportArgs = CompanyChangeArgs.EXPORT_ARGS;
+        Function<JSONObject, JSONObject> company_handles = exportArgs.get("company").getHandles();
+        Function<JSONObject, JSONObject> company_holder_handles = exportArgs.get("company_holder").getHandles();
+
+        EasyExcelUtil company = new EasyExcelUtil().init(outPathPre + "new_company.xlsx", "company", companyHeads, excludeColumnFiledNames);
+        EasyExcelUtil company_holder = new EasyExcelUtil().init(outPathPre + "new_company_holder.xlsx", "company_holder", holderHeads, excludeColumnFiledNames);
+        EasyExcelUtil company_staff = new EasyExcelUtil().init(outPathPre + "new_company_staff.xlsx", "company_staff", staffHeads, excludeColumnFiledNames);
+        OSS ossClient = OssUtils.getOssClient();
+
+        int RowNum = -1;
+        try {
+            GetObjectRequest getObjectRequest = new GetObjectRequest("data-exchange-as", objectName);
+            OSSObject ossObject = ossClient.getObject(getObjectRequest);
+            BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
+            String content;
+            do {
+                RowNum++;
+                System.out.println("new_company" + " --> " + RowNum);
+                content = reader.readLine();
+                if (StringUtils.isBlank(content)) {
+                    break;
+                }
+                NewCompany data = JSON.parseObject(content, NewCompany.class);
+                if (data.getCompany() != null) {
+                    String estiblish_time = data.getCompany().getEstiblish_time();
+                    String beforeDay = getMinusDay(30);
+                    if (StringUtils.isBlank(estiblish_time) || estiblish_time.split(" ")[0].compareTo(beforeDay) < 0) {
+                        continue;
+                    }
+
+                    JSONObject j1 = (JSONObject) JSONObject.toJSON(data.getCompany(), SerializeConfig.getGlobalInstance());
+                    CompanyOut companyOut = j1.parseObject(JSONObject.toJSONString(company_handles.apply(j1), SerializerFeature.WriteMapNullValue), CompanyOut.class);
+
+                    company.doExportExcel(Collections.singletonList(companyOut));
+                }
+                if (data.getCompany_holder() != null && data.getCompany_holder().size() > 0) {
+
+                    List<CompanyHolderOut> holderOutList = data
+                            .getCompany_holder()
+                            .stream()
+                            .map(x -> {
+                                JSONObject j1 = (JSONObject) JSONObject.toJSON(x, SerializeConfig.getGlobalInstance());
+                                return j1.parseObject(JSONObject.toJSONString(company_holder_handles.apply(j1), SerializerFeature.WriteMapNullValue), CompanyHolderOut.class);
+                            }).collect(Collectors.toList());
+
+                    company_holder.doExportExcel(holderOutList);
+                }
+                if (data.getCompany_staff() != null && data.getCompany_staff().size() > 0) {
+                    company_staff.doExportExcel(data.getCompany_staff());
+                }
+            } while (true);
+
+        } catch (Exception e) {
+            log.error("CsvToXlsxUtil exception :", e);
+        } finally {
+            try {
+                company.finish();
+                company_holder.finish();
+                company_staff.finish();
+                // 关闭OSSClient。
+                if (ossClient != null) {
+                    ossClient.shutdown();
+                }
+            } catch (Exception e) {
+                log.error("CsvToXlsxUtil close FileOutputStream exception :", e);
+            }
+        }
+    }
+
+    public static <T> void jsonToXLSxChange(String tn, String outPath, String objectName, List<List<String>> heads
+            , Class<T> clazz, Function<JSONObject, JSONObject> handles, Set<String> excludeColumnFiledNames) {
+        EasyExcelUtil company = new EasyExcelUtil().init(outPath, tn, heads, excludeColumnFiledNames);
+        OSS ossClient = OssUtils.getOssClient();
+
+        int RowNum = -1;
+        try {
+            GetObjectRequest getObjectRequest = new GetObjectRequest(OssUtils.bucketName, objectName);
+            OSSObject ossObject = ossClient.getObject(getObjectRequest);
+            BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
+            String content;
+            List<T> dataList = new ArrayList<>();
+            do {
+                RowNum++;
+                System.out.println(tn + " --> " + RowNum);
+                content = reader.readLine();
+                if (StringUtils.isBlank(content)) {
+                    break;
+                }
+                if (handles != null) {
+                    content = JSONObject.toJSONString(handles.apply(JSON.parseObject(content)), SerializerFeature.WriteMapNullValue);
+                }
+
+                T data = JSON.parseObject(content, clazz);
+                if (data != null) {
+                    dataList.add(data);
+                }
+                if (dataList.size() == 1000) {
+                    company.doExportExcel(dataList);
+                    dataList.clear();
+                }
+            } while (true);
+
+            if (dataList.size() > 0) {
+                company.doExportExcel(dataList);
+            }
+
+        } catch (Exception e) {
+            log.error("CsvToXlsxUtil exception :", e);
+        } finally {
+            try {
+                company.finish();
+                // 关闭OSSClient。
+                if (ossClient != null) {
+                    ossClient.shutdown();
+                }
+            } catch (Exception e) {
+                log.error("CsvToXlsxUtil close FileOutputStream exception :", e);
+            }
+        }
+    }
+
+    /**
+     * 设置excel文件的sheet名称
+     * 获取CSV文件名作为Excel文件的sheet名称
+     *
+     * @param path
+     * @return
+     */
+    private static String getSheetName(String path) {
+        try {
+            String[] file = getFileName(path).split("\\.");
+            return file[0];
+        } catch (Exception e) {
+            log.error("CsvToXlsxUtil get sheet name exception : ", e);
+            return "Sheet";
+        }
+    }
+
+
+    /**
+     * 根据资源路径切割获取文件名
+     *
+     * @param path
+     * @return
+     */
+    private static String getFileName(String path) {
+        String[] paths = path.contains("\\") ? path.split("\\\\") : path.split("/");
+        return paths[paths.length - 1];
+    }
+
+    /**
+     * 常用CSV分隔符数组遍历资源第一行,分隔的字段数多的为资源分隔符
+     * 异常情况下默认用’,‘作为分隔符
+     *
+     * @param path 资源路径
+     * @return
+     */
+    private static char getDelimiter(String path) {
+        BufferedReader br = null;
+        char delimiter = ',';
+        try {
+            br = new BufferedReader(new FileReader(path));
+            String line = br.readLine();
+            CsvReader csvReader;
+            int columCount = 0;
+            for (char delimiterTest : DELIMITERS) {
+                csvReader = new CsvReader(getStringStream(line), delimiterTest, Charset.forName("UTF-8"));
+                if (csvReader.readRecord()) {
+                    int newColumnCount = csvReader.getColumnCount();
+                    if (newColumnCount > columCount) {
+                        columCount = newColumnCount;
+                        delimiter = delimiterTest;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("CsvToXlsxUtil get delimiter exception :", e);
+        } finally {
+            try {
+                br.close();
+            } catch (IOException e) {
+                log.error("CsvToXlsxUtil get delimiter close BufferedReader exception :", e);
+            }
+        }
+        return delimiter;
+    }
+
+
+    /**
+     * 字符串转输入流
+     * 把CSV文件第一行数据转成输入流
+     *
+     * @param sInputString
+     * @return
+     */
+    private static InputStream getStringStream(String sInputString) {
+        if (sInputString != null && !sInputString.equals("")) {
+            try {
+                ByteArrayInputStream tInputStringStream = new ByteArrayInputStream(sInputString.getBytes());
+                return tInputStringStream;
+            } catch (Exception e) {
+                log.error("CsvToXlsxUtil get StringStream exception :", e);
+            }
+        }
+        return null;
+    }
+
+
+}

+ 22 - 0
src/main/java/com/winhc/data/push/utils/DateUtils.java

@@ -1,12 +1,16 @@
 package com.winhc.data.push.utils;
 
 import java.text.SimpleDateFormat;
+import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.GregorianCalendar;
+import java.util.Locale;
 
 
 public class DateUtils {
@@ -16,6 +20,14 @@ public class DateUtils {
     public static final String FORMAT_YYYYMMDD = "yyyyMMdd";
     public static final String FORMAT_YYYY_MM_DD = "yyyy-MM-dd";
 
+    public static final DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd")
+            .withLocale(Locale.CHINA)
+            .withZone(ZoneId.systemDefault());
+
+    public static final DateTimeFormatter ymd_df = DateTimeFormatter.ofPattern("yyyyMMdd")
+            .withLocale(Locale.CHINA)
+            .withZone(ZoneId.systemDefault());
+
     public static final String formatDate(Date date, String pattern) {
         String v = null;
         try {
@@ -87,6 +99,16 @@ public class DateUtils {
         return v;
     }
 
+    public static String getYesterday_ymd() {
+        Instant instant = Instant.now().minus(1, ChronoUnit.DAYS);
+        return ymd_df.format(instant);
+    }
+
+    public static String getMinusDay(Integer i) {
+        Instant instant = Instant.now().minus(i, ChronoUnit.DAYS);
+        return df.format(instant);
+    }
+
     public static int getCurrentHours() {
         return new GregorianCalendar().get(Calendar.HOUR_OF_DAY);
     }

+ 140 - 0
src/main/java/com/winhc/data/push/utils/EasyExcelUtil.java

@@ -0,0 +1,140 @@
+package com.winhc.data.push.utils;
+
+import com.alibaba.excel.EasyExcelFactory;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.builder.ExcelWriterBuilder;
+import com.alibaba.excel.write.metadata.WriteSheet;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * EasyExcel 操作工具类(写,追加)
+ *
+ * @author lzt
+ * editUser:lizetao
+ * editdate:2021/12/28
+ */
+public class EasyExcelUtil {
+    private ExcelWriter excelWriter = null;
+    private WriteSheet writeSheet = null;
+
+    /**
+     * ===========================================================
+     * <p>
+     * Purpose      :   EasyExcel工具类 初始化(最先调用)
+     *
+     * @return Author       :   lzt
+     * Created Date :   2021-12-28
+     * Update History
+     * Version       Date               Name            Description
+     * --------  ---------------   --------------  --------------------
+     * V1.0       2021-12-28           lzt            Creation
+     * ===========================================================
+     * @params: absFilePath  绝对路径
+     * @params: sheetName 标签页名字
+     * @params: titleList 标题头(第一行)
+     */
+    public EasyExcelUtil init(String absFilePath, String sheetName, List<List<String>> heads, Set<String> excludeColumnFiledNames) {
+        if (excelWriter == null && writeSheet == null) {
+            ExcelWriterBuilder excelWriterBuilder = EasyExcelFactory.write(absFilePath).head(heads).excludeColumnFieldNames(excludeColumnFiledNames);
+            if (excludeColumnFiledNames != null && excludeColumnFiledNames.size() > 0) {
+                //excelWriterBuilder.excludeColumnIndexes(new HashSet<>(0));
+                excelWriterBuilder.excludeColumnFieldNames(excludeColumnFiledNames);
+            }
+            // 这里 需要指定写用哪个标题头去写 可以用class 也可以不用
+            excelWriter = excelWriterBuilder.build();
+            // 这里注意 如果同一个sheet只要创建一次
+            writeSheet = EasyExcelFactory.writerSheet(sheetName).build();
+        }
+        return this;
+    }
+
+    public EasyExcelUtil init(String absFilePath, String sheetName, List<List<String>> heads) {
+        return this.init(absFilePath, sheetName, heads, null);
+    }
+
+    public void init(String absFilePath, String sheetName) {
+        if (excelWriter == null && writeSheet == null) {
+            // 这里 需要指定写用哪个标题头去写 可以用class 也可以不用
+            excelWriter = EasyExcelFactory.write(absFilePath).build();
+            // 这里注意 如果同一个sheet只要创建一次
+            writeSheet = EasyExcelFactory.writerSheet(sheetName).build();
+        }
+    }
+
+    /**
+     * ===========================================================
+     * <p>
+     * Purpose      :   EasyExcel工具类 写入excel写内容
+     *
+     * @return Author       :   lzt
+     * Created Date :   2021-12-28
+     * Update History
+     * Version       Date               Name            Description
+     * --------  ---------------   --------------  --------------------
+     * V1.0       2021-12-28           lzt            Creation
+     * ===========================================================
+     * @params: dataList  要插入的数据(多行插入)
+     */
+    public <T> void doExportExcel(List<T> dataList) {
+        try {
+            excelWriter.write(dataList, writeSheet);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * ===========================================================
+     * <p>
+     * Purpose      :   EasyExcel工具类 关闭(最后调用 关闭流)
+     *
+     * @return Author       :   lzt
+     * Created Date :   2021-12-28
+     * Update History
+     * Version       Date               Name            Description
+     * --------  ---------------   --------------  --------------------
+     * V1.0       2021-12-28           lzt            Creation
+     * ===========================================================
+     */
+    public void finish() {
+        if (excelWriter != null) {
+            excelWriter.finish();
+        }
+    }
+
+    public static void main(String[] args) {
+        EasyExcelUtil easyExcelUtil = new EasyExcelUtil();
+        //使用原文件名在java的临时文件夹中创建临时文件
+        String tmpdir = System.getProperty("java.io.tmpdir");
+        File file = new File(tmpdir, "测试.xlsx");
+        //若临时文件夹中已经存在该文件,则先删除
+        if (file.exists()) {
+            file.delete();
+        }
+        String absFilePath = file.getAbsolutePath();
+        String sheet = "sheet1";
+        List<List<String>> head = Stream.of("学生", "年龄", "性别")
+                .map(Collections::singletonList)
+                .collect(Collectors.toList());
+        //初始化
+        easyExcelUtil.init(absFilePath, sheet, head);
+        //写入数据
+        List<List<String>> sumDataList = new ArrayList<>(1);
+        List<String> dataList = new ArrayList<>(1);
+        dataList.add("张三");
+        dataList.add("16");
+        dataList.add("女");
+        sumDataList.add(dataList);
+        //我的追加数据 其实是伪追加 因为只要你没有把流关闭 还是持有这个流的 那么你就可以一直调用这个方法 往里面写数据
+        easyExcelUtil.doExportExcel(sumDataList);
+        //关闭流
+        easyExcelUtil.finish();
+    }
+}

+ 79 - 0
src/main/java/com/winhc/data/push/utils/OssUtils.java

@@ -0,0 +1,79 @@
+package com.winhc.data.push.utils;
+
+
+import com.aliyun.oss.ClientException;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.OSSException;
+import com.aliyun.oss.internal.OSSHeaders;
+import com.aliyun.oss.model.*;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
+
+/**
+ * @author π
+ * @Description:
+ * @date 2022/11/14 18:02
+ */
+
+public class OssUtils {
+
+    //安硕key
+//    public static String accessKeyId = "LTAI5tDrbWcjKkzTnJXCrwkC";
+//    public static String accessKeySecret = "AWDvBsQc16AYMszNVRga5ANbzuLowy";
+
+    //内部key
+    public static String accessKeyId = "LTAI6HKo33DbtiBI";
+    public static String accessKeySecret = "8FmSBhHyaz4jtyJhiimK0NGF5rBPMl";
+
+
+    public static String endpoint ;
+    public static String bucketName = "data-exchange-as";
+
+
+    static {
+        if (BaseUtils.isWindows()) {
+            endpoint = "oss-cn-shanghai.aliyuncs.com";
+        } else {
+            endpoint = "oss-cn-shanghai-internal.aliyuncs.com";
+        }
+    }
+
+    public static OSS getOssClient() {
+        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+    }
+
+    public static void main(String[] args) {
+
+        String objectName = "anshuo/tmp/20221122.zip";
+        String filePath = "D:\\tmp\\data\\20221122.zip";
+
+        uploadFile(objectName, filePath);
+    }
+
+    public static void uploadFile(String objectName, String filePath) {
+        OSS ossClient = null;
+        try {
+            ossClient = getOssClient();
+            // 创建PutObjectRequest对象。
+            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
+            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
+            ObjectMetadata metadata = new ObjectMetadata();
+            metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
+            metadata.setObjectAcl(CannedAccessControlList.PublicRead);
+            putObjectRequest.setMetadata(metadata);
+
+            // 上传文件。
+            ossClient.putObject(putObjectRequest);
+        } catch (Exception ce) {
+            System.out.println("Error Message:" + ce.getMessage());
+        } finally {
+            if (ossClient != null) {
+                ossClient.shutdown();
+            }
+        }
+    }
+
+}

+ 139 - 0
src/main/java/com/winhc/data/push/utils/TransToExcelNewCompany.java

@@ -0,0 +1,139 @@
+package com.winhc.data.push.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.openservices.shade.org.apache.commons.lang3.StringUtils;
+import com.winhc.data.push.common.CompanyChangeArgs;
+import com.winhc.data.push.utils.BaseUtils;
+import com.winhc.data.push.utils.OssUtils;
+import com.winhc.data.push.utils.ZipUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.winhc.data.push.common.Constant.*;
+import static com.winhc.data.push.utils.CsvToXlsxUtil.jsonToXLSxChange;
+import static com.winhc.data.push.utils.CsvToXlsxUtil.jsonToXLSxNewCompany;
+import static com.winhc.data.push.utils.DateUtils.getYesterday_ymd;
+
+
+/**
+ * @author π
+ * @Description:
+ * @date 2022/11/7 16:10
+ */
+public class TransToExcelNewCompany {
+
+    public static String dataPathPrefix;
+
+    static {
+        if (BaseUtils.isWindows()) {
+            dataPathPrefix = "D:\\tmp\\data\\";
+        } else {
+            dataPathPrefix = "/data/opt/winhc_data_push/data/";
+        }
+    }
+
+    public static void main(String[] args) throws IOException {
+        //全部任务
+        run(null);
+        //映射跑
+        //mapping_run();
+    }
+
+    private static void mapping_run() {
+        Stream.of("company", "company_double_random_check_info", "company_staff",
+                "company_abnormal_info",
+                "cancellation_announcement", "company_change", "company_punishment_info",
+                "company_holder", "company_check_info", "company_illegal_info", "company_judicial_assistance", "company_equity_info")
+                .forEach(tn -> {
+                    String outXlsxPath = "D:\\tmp\\mapping\\" + tn + ".xlsx";
+                    String objectNamePath = "anshuo/mapping/" + tn + ".json";
+                    toTrans2(outXlsxPath, objectNamePath, tn);
+                });
+    }
+
+    public static String run(String ds) throws FileNotFoundException {
+        if (StringUtils.isBlank(ds)) {
+            ds = getYesterday_ymd();
+        }
+        String outPathPre = dataPathPrefix + ds + File.separator;
+        File file = new File(outPathPre);
+        //如果文件夹不存在则会创建
+        if (!file.exists()) file.mkdirs();
+        //新公司
+        newCompanyToExcel(outPathPre, ds);
+        //变更
+        changeToExcel(outPathPre, ds);
+        //压缩文件
+        FileOutputStream outZipPath = new FileOutputStream(new File(dataPathPrefix + ds + ".zip"));
+        ZipUtils.toZip(dataPathPrefix + ds, outZipPath, true);
+        //oss 上传路径
+        String objectName = "anshuo/tmp/" + ds + ".zip";
+        //本地文件
+        String filePath = dataPathPrefix + ds + ".zip";
+        OssUtils.uploadFile(objectName, filePath);
+        return objectName;
+    }
+
+    public static void changeToExcel(String outPathPre, String ds) {
+        Map<String, CompanyChangeArgs> exportArgs = CompanyChangeArgs.EXPORT_ARGS;
+        exportArgs.keySet().forEach(tn -> {
+            toTrans(outPathPre, ds, tn);
+        });
+
+    }
+
+    public static void toTrans(String outPathPre, String ds, String tn) {
+        Map<String, CompanyChangeArgs> exportArgs = CompanyChangeArgs.EXPORT_ARGS;
+        CompanyChangeArgs args = exportArgs.get(tn);
+        Function<JSONObject, JSONObject> handles = args.getHandles();
+        List<List<String>> company_head_list = Arrays.stream(args.getHead().split("@"))
+                .map(Collections::singletonList)
+                .collect(Collectors.toList());
+        String objectName = "anshuo/dim_change/" + ds + "/" + tn + ".json";
+        String outPath = outPathPre + "change_" + tn + ".xlsx";
+        Set<String> excludeColumnFiledNames = new HashSet<>();
+        excludeColumnFiledNames.add("old_name");
+        jsonToXLSxChange(tn, outPath, objectName, company_head_list, args.getClazz(), handles, excludeColumnFiledNames);
+    }
+
+    public static void toTrans2(String outPath, String objectNamePath, String tn) {
+        Map<String, CompanyChangeArgs> exportArgs = CompanyChangeArgs.EXPORT_ARGS;
+        CompanyChangeArgs args = exportArgs.get(tn);
+        Function<JSONObject, JSONObject> handles = args.getHandles();
+        String head = "原始名称@" + args.getHead();
+        List<List<String>> company_head_list = Arrays.stream(head.split("@"))
+                .map(Collections::singletonList)
+                .collect(Collectors.toList());
+        jsonToXLSxChange(tn, outPath, objectNamePath, company_head_list, args.getClazz(), handles, null);
+    }
+
+    public static void newCompanyToExcel(String outPathPre, String ds) {
+
+        List<List<String>> company_head_list = Arrays.stream(company_head.split("@"))
+                .map(Collections::singletonList)
+                .collect(Collectors.toList());
+
+        List<List<String>> holder_head_list = Arrays.stream(holder_head.split("@"))
+                .map(Collections::singletonList)
+                .collect(Collectors.toList());
+
+        List<List<String>> staff_head_list = Arrays.stream(staff_head.split("@"))
+                .map(Collections::singletonList)
+                .collect(Collectors.toList());
+
+        String objectName = "anshuo/new_company/" + ds + "/new_company.json";
+
+        Set<String> excludeColumnFiledNames = new HashSet<>();
+        excludeColumnFiledNames.add("old_name");
+        jsonToXLSxNewCompany(outPathPre, objectName, company_head_list, holder_head_list, staff_head_list, excludeColumnFiledNames);
+    }
+}
+
+

+ 147 - 0
src/main/java/com/winhc/data/push/utils/ZipUtils.java

@@ -0,0 +1,147 @@
+package com.winhc.data.push.utils;
+
+import java.io.*;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+
+public class ZipUtils {
+	
+	private static final int  BUFFER_SIZE = 2 * 1024;
+	
+	/**
+	 * 压缩成ZIP 方法1
+	 * @param srcDir 压缩文件夹路径 
+	 * @param out    压缩文件输出流
+	 * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构; 
+	 * 							false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
+	 * @throws RuntimeException 压缩失败会抛出运行时异常
+	 */
+	public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)
+			throws RuntimeException{
+		
+		long start = System.currentTimeMillis();
+		ZipOutputStream zos = null ;
+		try {
+			zos = new ZipOutputStream(out);
+			File sourceFile = new File(srcDir);
+			compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);
+			long end = System.currentTimeMillis();
+			System.out.println("压缩完成,耗时:" + (end - start) +" ms");
+		} catch (Exception e) {
+			throw new RuntimeException("zip error from ZipUtils",e);
+		}finally{
+			if(zos != null){
+				try {
+					zos.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		
+	}
+	
+	/**
+	 * 压缩成ZIP 方法2
+	 * @param srcFiles 需要压缩的文件列表
+	 * @param out 	        压缩文件输出流
+	 * @throws RuntimeException 压缩失败会抛出运行时异常
+	 */
+	public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {
+		long start = System.currentTimeMillis();
+		ZipOutputStream zos = null ;
+		try {
+			zos = new ZipOutputStream(out);
+			for (File srcFile : srcFiles) {
+				byte[] buf = new byte[BUFFER_SIZE];
+				zos.putNextEntry(new ZipEntry(srcFile.getName()));
+				int len;
+				FileInputStream in = new FileInputStream(srcFile);
+				while ((len = in.read(buf)) != -1){
+					zos.write(buf, 0, len);
+				}
+				zos.closeEntry();
+				in.close();
+			}
+			long end = System.currentTimeMillis();
+			System.out.println("压缩完成,耗时:" + (end - start) +" ms");
+		} catch (Exception e) {
+			throw new RuntimeException("zip error from ZipUtils",e);
+		}finally{
+			if(zos != null){
+				try {
+					zos.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+	
+	
+	/**
+	 * 递归压缩方法
+	 * @param sourceFile 源文件
+	 * @param zos		 zip输出流
+	 * @param name		 压缩后的名称
+	 * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构; 
+	 * 							false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
+	 * @throws Exception
+	 */
+	private static void compress(File sourceFile, ZipOutputStream zos, String name,
+			boolean KeepDirStructure) throws Exception{
+		byte[] buf = new byte[BUFFER_SIZE];
+		if(sourceFile.isFile()){
+			// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
+			zos.putNextEntry(new ZipEntry(name));
+			// copy文件到zip输出流中
+			int len;
+			FileInputStream in = new FileInputStream(sourceFile);
+			while ((len = in.read(buf)) != -1){
+				zos.write(buf, 0, len);
+			}
+			// Complete the entry
+			zos.closeEntry();
+			in.close();
+		} else {
+			File[] listFiles = sourceFile.listFiles();
+			if(listFiles == null || listFiles.length == 0){
+				// 需要保留原来的文件结构时,需要对空文件夹进行处理
+				if(KeepDirStructure){
+					// 空文件夹的处理
+					zos.putNextEntry(new ZipEntry(name + "/"));
+					// 没有文件,不需要文件的copy
+					zos.closeEntry();
+				}
+				
+			}else {
+				for (File file : listFiles) {
+					// 判断是否需要保留原来的文件结构
+					if (KeepDirStructure) {
+						// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
+						// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
+						compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
+					} else {
+						compress(file, zos, file.getName(),KeepDirStructure);
+					}
+					
+				}
+			}
+		}
+	}
+	
+	public static void main(String[] args) throws Exception {
+		/** 测试压缩方法1  */
+		FileOutputStream fos1 = new FileOutputStream(new File("D:\\tmp\\data\\test.zip"));
+		ZipUtils.toZip("D:\\tmp\\data\\20221115\\", fos1,true);
+		
+//		/** 测试压缩方法2  */
+//		List<File> fileList = new ArrayList<>();
+//		fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/jar.exe"));
+//		fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/java.exe"));
+//		FileOutputStream fos2 = new FileOutputStream(new File("c:/mytest02.zip"));
+//		ZipUtils.toZip(fileList, fos2);
+	}
+}

+ 136 - 0
src/main/java/org/apache/poi/ss/SpreadsheetVersion.java

@@ -0,0 +1,136 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss;
+
+import org.apache.poi.ss.util.CellReference;
+
+/**
+ * This enum allows spreadsheets from multiple Excel versions to be handled by the common code.
+ * <p>Properties of this enum correspond to attributes of the <i>spreadsheet</i> that are easily
+ * discernable to the user.  It is not intended to deal with low-level issues like file formats.
+ */
+public enum SpreadsheetVersion {
+    /**
+     * Excel97 format aka BIFF8
+     * <ul>
+     * <li>The total number of available rows is 64k (2^16)</li>
+     * <li>The total number of available columns is 256 (2^8)</li>
+     * <li>The maximum number of arguments to a function is 30</li>
+     * <li>Number of conditional format conditions on a cell is 3</li>
+     * <li>Number of cell styles is 4000</li>
+     * <li>Length of text cell contents is 32767</li>
+     * </ul>
+     */
+    EXCEL97(0x10000, 0x0100, 30, 3, 4000, Integer.MAX_VALUE),
+
+    /**
+     * Excel2007
+     *
+     * <ul>
+     * <li>The total number of available rows is 1M (2^20)</li>
+     * <li>The total number of available columns is 16K (2^14)</li>
+     * <li>The maximum number of arguments to a function is 255</li>
+     * <li>Number of conditional format conditions on a cell is unlimited
+     * (actually limited by available memory in Excel)</li>
+     * <li>Number of cell styles is 64000</li>
+     * <li>Length of text cell contents is 32767</li>
+     * <ul>
+     */
+    EXCEL2007(0x100000, 0x4000, 255, Integer.MAX_VALUE, 64000, Integer.MAX_VALUE);
+
+    private final int _maxRows;
+    private final int _maxColumns;
+    private final int _maxFunctionArgs;
+    private final int _maxCondFormats;
+    private final int _maxCellStyles;
+    private final int _maxTextLength;
+
+    private SpreadsheetVersion(int maxRows, int maxColumns, int maxFunctionArgs, int maxCondFormats, int maxCellStyles, int maxText) {
+        _maxRows = maxRows;
+        _maxColumns = maxColumns;
+        _maxFunctionArgs = maxFunctionArgs;
+        _maxCondFormats = maxCondFormats;
+        _maxCellStyles = maxCellStyles;
+        _maxTextLength = maxText;
+    }
+
+    /**
+     * @return the maximum number of usable rows in each spreadsheet
+     */
+    public int getMaxRows() {
+        return _maxRows;
+    }
+
+    /**
+     * @return the last (maximum) valid row index, equals to <code> getMaxRows() - 1 </code>
+     */
+    public int getLastRowIndex() {
+        return _maxRows - 1;
+    }
+
+    /**
+     * @return the maximum number of usable columns in each spreadsheet
+     */
+    public int getMaxColumns() {
+        return _maxColumns;
+    }
+
+    /**
+     * @return the last (maximum) valid column index, equals to <code> getMaxColumns() - 1 </code>
+     */
+    public int getLastColumnIndex() {
+        return _maxColumns - 1;
+    }
+
+    /**
+     * @return the maximum number arguments that can be passed to a multi-arg function (e.g. COUNTIF)
+     */
+    public int getMaxFunctionArgs() {
+        return _maxFunctionArgs;
+    }
+
+    /**
+     * @return the maximum number of conditional format conditions on a cell
+     */
+    public int getMaxConditionalFormats() {
+        return _maxCondFormats;
+    }
+
+    /**
+     * @return the maximum number of cell styles per spreadsheet
+     */
+    public int getMaxCellStyles() {
+        return _maxCellStyles;
+    }
+
+    /**
+     *
+     * @return the last valid column index in a ALPHA-26 representation
+     *  (<code>IV</code> or <code>XFD</code>).
+     */
+    public String getLastColumnName() {
+        return CellReference.convertNumToColString(getLastColumnIndex());
+    }
+
+    /**
+     * @return the maximum length of a text cell
+     */
+    public int getMaxTextLength() {
+        return _maxTextLength;
+    }
+}

+ 29 - 0
src/test/java/com/winhc/data/push/TestFile.java

@@ -0,0 +1,29 @@
+package com.winhc.data.push;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+/**
+ * @author π
+ * @Description:
+ * @date 2022/11/24 14:32
+ */
+public class TestFile {
+
+    @Test
+    public void whenGetReadableFileSize_thenCorrect() {
+        long size = FileUtils.sizeOf(new File("D:\\tmp\\data\\20221123.zip"));
+        System.out.println(FileUtils.byteCountToDisplaySize(FileUtils.sizeOf(new File("D:\\tmp\\data\\20221123.zip"))));
+        assertEquals("62 MB", FileUtils.byteCountToDisplaySize(size));
+    }
+
+    private long getFileSize(File file) {
+        long length = file.length();
+        return length;
+    }
+
+}