Bladeren bron

调度和common的代码都本地化了

lifuquan 1 jaar geleden
bovenliggende
commit
1a878f5fb9
75 gewijzigde bestanden met toevoegingen van 4696 en 108 verwijderingen
  1. 37 0
      doc/old/开发文档/任务特点分析.md
  2. 58 0
      doc/old/开发文档/开发文档.md
  3. 42 0
      doc/old/开发文档/数据库文档/一些语句.sql
  4. 142 0
      doc/old/开发文档/数据库文档/建表.sql
  5. 42 0
      doc/old/开发文档/本地环境接口测试.md
  6. BIN
      doc/old/开发文档/样本数据/输入/1-12月投诉率明细(1).xlsx
  7. 948 0
      doc/old/开发文档/样本数据/输入/HE_D_HIGH_QUALITY_COUNT_DAY_20230412.csv
  8. 0 0
      doc/old/开发文档/样本数据/输入/HE_D_MOBILE_COMPLAINT_DETAILS_DAY_20230409-src.csv
  9. BIN
      doc/old/开发文档/样本数据/输入/HE_D_MOBILE_COMPLAINT_DETAILS_DAY_20230409.xlsx
  10. BIN
      doc/old/开发文档/样本数据/输入/数据表头说明.xlsx
  11. BIN
      doc/old/开发文档/样本数据/输入/高品质服务满...30414导出(3).XLSX
  12. BIN
      doc/old/开发文档/样本数据/输出/1_客服投诉清单各地市投诉率情况.png
  13. BIN
      doc/old/开发文档/样本数据/输出/2_重复投诉率.png
  14. BIN
      doc/old/开发文档/样本数据/输出/3_超时工单情况.png
  15. BIN
      doc/old/开发文档/样本数据/输出/4 _平均处理时长.png
  16. BIN
      doc/old/开发文档/样本数据/输出/5_投诉问题解决满意率.png
  17. BIN
      doc/old/开发文档/样本数据/输出/6_投诉问题解决率.png
  18. BIN
      doc/old/开发文档/样本数据/输出/7_投诉问题响应率.png
  19. BIN
      doc/old/开发文档/样本数据/输出/几个率值的筛选条件.png
  20. BIN
      doc/old/开发文档/样本数据/输出/投诉清单各地市投诉率0322(1).xlsx
  21. BIN
      doc/old/开发文档/样本数据/输出/投诉清单各地市投诉率0424(1).xlsx
  22. 79 0
      doc/old/开发文档/部署环境/手动入库数据.md
  23. 94 0
      doc/old/开发文档/部署环境接口测试.md
  24. 42 0
      doc/old/需求文档/钉钉自动报表需求.md
  25. BIN
      doc/old/高品质2.0日明细接口规范(1).docx
  26. 20 0
      doc/开发环境/RegisteredTaskController接口测试.http
  27. 116 0
      doc/开发环境/ScheduledTaskController接口测试.http
  28. 39 0
      doc/需求文档/20231219-新需求.md
  29. 13 13
      pom.xml
  30. 37 0
      src/main/java/com/nokia/common/basic/DateUtil.java
  31. 14 0
      src/main/java/com/nokia/common/basic/InstantUtil.java
  32. 79 0
      src/main/java/com/nokia/common/codec/MD5Util.java
  33. 171 0
      src/main/java/com/nokia/common/dao/SnowFlakeUtil.java
  34. 25 0
      src/main/java/com/nokia/common/http/logging/RequestLogDispatcherServlet.java
  35. 70 0
      src/main/java/com/nokia/common/http/logging/RequestLogHandlerInterceptor.java
  36. 66 0
      src/main/java/com/nokia/common/http/logging/entity/RepeatableHttpServletRequestWrapper.java
  37. 51 0
      src/main/java/com/nokia/common/http/logging/entity/RepeatableHttpServletResponseWrapper.java
  38. 61 0
      src/main/java/com/nokia/common/http/vo/R.java
  39. 109 0
      src/main/java/com/nokia/common/io/TextUtil.java
  40. 5 0
      src/main/java/com/nokia/common/io/excel/entity/AlignmentEnum.java
  41. 55 0
      src/main/java/com/nokia/common/io/excel/entity/CellInfo.java
  42. 101 0
      src/main/java/com/nokia/common/io/excel/entity/CellRect.java
  43. 30 0
      src/main/java/com/nokia/common/io/excel/entity/Gradient.java
  44. 45 0
      src/main/java/com/nokia/common/io/excel/entity/ThreeColorGradient.java
  45. 27 0
      src/main/java/com/nokia/common/io/excel/entity/TwoColorGradient.java
  46. 406 0
      src/main/java/com/nokia/common/io/excel/poi/PoiUtil.java
  47. 19 0
      src/main/java/com/nokia/common/spring/jpa/converter/JSONObjectConverter.java
  48. 0 2
      src/main/java/com/nokia/tsl_data/TslDataApplication.java
  49. 0 16
      src/main/java/com/nokia/tsl_data/config/DefaultJdbcTemplateConfig.java
  50. 0 12
      src/main/java/com/nokia/tsl_data/config/PropertiesConfig.java
  51. 16 4
      src/main/java/com/nokia/tsl_data/config/TslDataConfig.java
  52. 52 0
      src/main/java/com/nokia/tsl_data/scheduling/controller/RegisteredTaskController.java
  53. 79 0
      src/main/java/com/nokia/tsl_data/scheduling/controller/ScheduledTaskController.java
  54. 42 0
      src/main/java/com/nokia/tsl_data/scheduling/dao/DatabaseInitializeMapper.java
  55. 50 0
      src/main/java/com/nokia/tsl_data/scheduling/dao/RegisteredTaskMapper.java
  56. 101 0
      src/main/java/com/nokia/tsl_data/scheduling/dao/ScheduledTaskMapper.java
  57. 77 0
      src/main/java/com/nokia/tsl_data/scheduling/dao/handler/JsonTypeHandler.java
  58. 13 0
      src/main/java/com/nokia/tsl_data/scheduling/entity/OperateRecord.java
  59. 23 0
      src/main/java/com/nokia/tsl_data/scheduling/entity/RegisteredTask.java
  60. 41 0
      src/main/java/com/nokia/tsl_data/scheduling/entity/ScheduledTask.java
  61. 37 0
      src/main/java/com/nokia/tsl_data/scheduling/entity/_enum/ScheduledStatus.java
  62. 23 0
      src/main/java/com/nokia/tsl_data/scheduling/entity/_enum/ScheduledType.java
  63. 39 0
      src/main/java/com/nokia/tsl_data/scheduling/entity/pojo/CallableTask.java
  64. 67 0
      src/main/java/com/nokia/tsl_data/scheduling/entity/pojo/RunnableTask.java
  65. 52 0
      src/main/java/com/nokia/tsl_data/scheduling/entity/pojo/ScheduledParameter.java
  66. 31 0
      src/main/java/com/nokia/tsl_data/scheduling/service/DatabaseInitializeService.java
  67. 112 0
      src/main/java/com/nokia/tsl_data/scheduling/service/RegisteredTaskService.java
  68. 178 0
      src/main/java/com/nokia/tsl_data/scheduling/service/SchedulingService.java
  69. 59 0
      src/main/java/com/nokia/tsl_data/scheduling/service/TaskAutoManagementService.java
  70. 235 0
      src/main/java/com/nokia/tsl_data/scheduling/service/TaskScheduleService.java
  71. 0 2
      src/main/java/com/nokia/tsl_data/service/DataWarehouseService.java
  72. 13 8
      src/main/java/com/nokia/tsl_data/service/TaskService.java
  73. 295 35
      src/main/java/com/nokia/tsl_data/service/TslReportService.java
  74. 11 12
      src/main/resources/application.yml
  75. 7 4
      src/test/java/com/nokia/tsl_data/TslDataApplicationTest.java

+ 37 - 0
doc/old/开发文档/任务特点分析.md

@@ -0,0 +1,37 @@
+# 任务特点分析
+
+<https://oapi.dingtalk.com/robot/send?access_token=b2f1424d6119affaacab614b184f043fcd2c73db2651bb86eff29992d66820bf>
+
+## 自动报表 定时任务特点分析
+
+1. 每天运行1次
+2. 以月为边界,每天执行的任务要求前一天的数据必须完整,中间不能间隔
+3. 数据源不是特别稳定
+
+因为第2、3点特点,需要:
+
+1. 运行时先检查前一天的数据入库是否完整,如果完整
+2. 运行时需要检查当天数据是否完备,如果不完备进入循环等待,每个一个时间间隔进行一次检查,每次检查如果缺少数据都需要发送一次提醒。
+
+先搞定第2步,第1个问题暂时未遇到
+
+```java
+/**
+     * 模拟检查等待
+     * 
+     * @throws Exception
+     */
+    @Test
+    void test() throws Exception {
+        String filePath = "D:/src/投诉清单各地市投诉率20230503.xlsx";
+        File file = new File(filePath);
+        while (!file.exists()) {
+            // 发送提醒
+            System.out.println("检查发现:文件" + filePath + "不存在");
+            // 等待5秒后再次检查
+            Thread.sleep(1000 * 5);
+        }
+        // 完成任务
+        System.out.println("done!");
+    }
+```

+ 58 - 0
doc/old/开发文档/开发文档.md

@@ -0,0 +1,58 @@
+# 开发文档
+
+nohup java -jar tsl_data-1.1-exec.jar >output.log 2>&1 &
+
+## 钉钉API相关汇总
+
+[钉钉api地址](https://open.dingtalk.com/document/orgapp/api-overview)
+
+### 获取AccesstokenAPI
+
+- [获取企业内部应用的accessToken](https://open.dingtalk.com/document/orgapp/obtain-the-access_token-of-an-internal-app)
+
+```http
+POST https://api.dingtalk.com/v1.0/oauth2/accessToken HTTP/1.1
+Content-Type:application/json
+
+{
+  "appKey" : "dingothmdq6opv6hjrm5",
+  "appSecret" : "SeoyAwUnzFIFY4j4CX089HJ0i-pj1BIzByB3AZcnbCQaq94lZvazFpfEGGQwPznc"
+}
+```
+
+- [获取企业内部应用的access_token--旧版api](https://open.dingtalk.com/document/orgapp/obtain-orgapp-token)
+
+```http
+GET https://oapi.dingtalk.com/gettoken?appkey=dingothmdq6opv6hjrm5&appsecret=SeoyAwUnzFIFY4j4CX089HJ0i-pj1BIzByB3AZcnbCQaq94lZvazFpfEGGQwPznc
+```
+
+- [机器人发送群聊消息](https://open.dingtalk.com/document/orgapp/the-robot-sends-a-group-message)
+
+```http
+POST https://api.dingtalk.com/v1.0/robot/groupMessages/send HTTP/1.1
+x-acs-dingtalk-access-token:String
+Content-Type:application/json
+
+{
+  "msgParam" : "String",
+  "msgKey" : "String",
+  "openConversationId" : "String",
+  "robotCode" : "String",
+}
+```
+
+### 上传媒体文件
+
+[上传媒体文件](https://open.dingtalk.com/document/orgapp/upload-media-files)
+
+### 参数概念及获取方式
+
+#### appKey appSecret
+
+应用key 和Secret
+
+#### conversationId
+
+唯一标识一个群
+
+<https://open-dev.dingtalk.com/apiExplorer?spm=ding_open_doc.document.0.0.afb839b7W85NCP#/jsapi?api=biz.chat.chooseConversationByCorpId>

+ 42 - 0
doc/old/开发文档/数据库文档/一些语句.sql

@@ -0,0 +1,42 @@
+-- 重复工单
+with t1 as (select compl_area_local,busi_no from report_auto.he_d_mobile_comp hdmc where month_id = substring('20230420' from 1 for 6) and day_id <= substring('20230420' from 7 for 2)),
+t2 as (select distinct * from t1),
+t3 as (select compl_area_local, count(1) as total_num from t1 group by compl_area_local),
+t4 as (select compl_area_local, count(1) as distinct_num from t2 group by compl_area_local),
+t5 as (select t3.compl_area_local, t3.total_num, t3.total_num - t4.distinct_num as repeat_num, (t3.total_num - t4.distinct_num)/t3.total_num::numeric  as repeat_ratio from T3, t4 where t3.compl_area_local = t4.compl_area_local)
+select '全省' as compl_area_local, sum(total_num) as total_num, sum(repeat_num) as repeat_num, sum(repeat_num) /sum(total_num)::numeric as repeat_ratio from t5
+union select * from t5
+
+-- 超时工单
+with t1 as (select compl_area_local, is_timeout from report_auto.he_d_mobile_comp hdmc where month_id = substring('20230420' from 1 for 6) and day_id <= substring('20230420' from 7 for 2)),
+t2 as (select '全省' as compl_area_local, count(1) as total_num from t1),
+t3 as (select compl_area_local, count(1) as total_num from t1 group by compl_area_local),
+t4 as (select * from t2 union select * from t3),
+t5 as (select compl_area_local from t1 where is_timeout = '是'),
+t7 as (select '全省' as compl_area_local, count(1) as timeout_num from t5),
+t8 as (select compl_area_local, count(1) as timeout_num from t5 group by compl_area_local),
+t9 as (select * from t7 union select * from t8)
+select t4.compl_area_local, t4.total_num, t9.timeout_num, t9.timeout_num/t4.total_num::numeric as timeout_ratio from t4,t9 where t4.compl_area_local = t9.compl_area_local order by t9.timeout_num/t4.total_num::numeric desc
+
+-- 超时时间
+with t1 as (select compl_area_local, case when proce_time != '' then (extract('epoch' from to_timestamp(proce_time, 'YYYY-MM-DD HH24:MI:SS')) - extract('epoch' from to_timestamp(accept_time, 'YYYY-MM-DD HH24:MI:SS')))/3600 when is_online_complete = '是' then 0
+else (extract('epoch' from to_timestamp(end_time, 'YYYY-MM-DD HH24:MI:SS')) - extract('epoch' from to_timestamp(accept_time, 'YYYY-MM-DD HH24:MI:SS')))/3600 end as duration
+from report_auto.he_d_mobile_comp hdmc where month_id = substring('20230420' from 1 for 6) and day_id <= substring('20230420' from 7 for 2))
+select compl_area_local, avg(duration) as avg_duration from t1 group by compl_area_local
+
+-- 客户端统计
+with t1 as (select businoareaname, complaint_satisfied_list::numeric, complaint_satisfied_count::numeric,
+complaint_resolution_list::numeric, complaint_resolution_count::numeric,
+complaint_response_list::numeric, complaint_response_count::numeric from report_auto.he_d_high_quality hdhq 
+where acct_date = '2023-04-20'
+and profes_dep = '网络质量'
+and big_type_name = '移网网络体验'
+and small_type_name = '--')
+select '全省' as businoareaname, 
+sum(complaint_satisfied_list) / sum(complaint_satisfied_count) as complaint_satisfied,
+sum(complaint_resolution_list) / sum(complaint_resolution_count) as complaint_resolution,
+sum(complaint_response_list) / sum(complaint_response_count) as complaint_response from t1 union
+select businoareaname, 
+complaint_satisfied_list / complaint_satisfied_count as complaint_satisfied, 
+complaint_resolution_list / complaint_resolution_count as complaint_resolution, 
+complaint_response_list / complaint_response_count as complaint_response from t1

+ 142 - 0
doc/old/开发文档/数据库文档/建表.sql

@@ -0,0 +1,142 @@
+-- 创建角色
+create role report_auto login;
+
+-- 修改密码
+alter role report_auto with password 'Richr00t!';
+
+-- 创建模式
+create schema report_auto;
+
+-- 赋予权限
+grant all on schema report_auto to report_auto;
+
+-- 建表--暂时不考虑分区
+
+-- 河北_CEM高品质2日统计
+drop table if exists report_auto.he_d_high_quality;
+CREATE TABLE report_auto.he_d_high_quality (
+	id bigserial NOT NULL,
+	month_id varchar(6) NOT NULL,
+  day_id varchar(2) NOT NULL,
+  acct_date varchar(30) NOT NULL,
+  businoareaname varchar(15) NOT NULL,
+  profes_dep varchar(15) NOT NULL,
+  big_type_name varchar(60) NOT NULL,
+  small_type_name varchar(120) NOT NULL,
+  total_complaints varchar(30) NULL,
+  hotline_complaints varchar(30) NULL,
+  other_complaint varchar(30) NULL,
+  litigation_volume varchar(30) NULL,
+  satisfaction_rate varchar(30) NULL,
+  satisfaction_count varchar(30) NULL,
+  total_evaluation varchar(30) NULL,
+  complaint_satisfied varchar(30) NULL,
+  complaint_satisfied_list varchar(30) NULL,
+  complaint_satisfied_count varchar(30) NULL,
+  complaint_resolution varchar(30) NULL,
+  complaint_resolution_list varchar(30) NULL,
+  complaint_resolution_count varchar(30) NULL,
+  complaint_response varchar(30) NULL,
+  complaint_response_list varchar(30) NULL,
+  complaint_response_count varchar(30) NULL,
+  complaint varchar(30) NULL,
+  fault_satisfaction_rate varchar(30) NULL,
+  fault_satisfaction_list varchar(30) NULL,
+  fault_satisfaction_count varchar(30) NULL,
+  fault_resolution_rate varchar(30) NULL,
+  fault_resolution_list varchar(30) NULL,
+  fault_resolution_count varchar(30) NULL,
+  fault_response_rate varchar(30) NULL,
+  fault_response_list varchar(30) NULL,
+  fault_response_count varchar(30) NULL,
+  cteate_time timestamp NULL DEFAULT now(),
+	CONSTRAINT he_d_high_quality_pkey PRIMARY KEY (id)
+);
+
+-- 河北_CEM移网质量投诉明细
+drop table if exists report_auto.he_d_mobile_comp;
+CREATE TABLE report_auto.he_d_mobile_comp (
+	id bigserial NOT NULL,
+  month_id varchar(6) NOT NULL,
+  day_id varchar(2) NOT NULL,
+  acct_date varchar(300) NOT NULL,
+  sheet_no varchar(150) NULL,
+  is_online_complete varchar(300) NULL,
+  contact_no varchar(300) NULL,
+  busi_no varchar(300) NULL,
+  serv_content varchar(4136) NULL,
+  last_deal_content varchar(4136) NULL,
+  deal_depart_name varchar(300) NULL,
+  deal_opinion varchar(4136) NULL,
+  serv_type varchar(600) NULL,
+  bus_type varchar(300) NULL,
+  duty_reason varchar(600) NULL,
+  accept_channel varchar(300) NULL,
+  submit_channel varchar(300) NULL,
+  compl_area_local varchar(300) NULL,
+  duty_major varchar(300) NULL,
+  product_name varchar(600) NULL,
+  sp_product_code varchar(600) NULL,
+  pre_repair_name varchar(300) NULL,
+  pre_repair_charges varchar(24) NULL,
+  fault_location varchar(300) NULL,
+  cust_level varchar(300) NULL,
+  satisfaction_in_reply varchar(300) NULL,
+  is_ok_in_reply varchar(300) NULL,
+  accept_time varchar(19) NULL,
+  end_time varchar(19) NULL,
+  proce_time varchar(19) NULL,
+  cust_area varchar(300) NULL,
+  is_cust_serv_complete varchar(300) NULL,
+  is_send_sheet_complete varchar(300) NULL,
+  is_repeat varchar(300) NULL,
+  is_upgrade varchar(300) NULL,
+  is_timeout varchar(300) NULL,
+  gis_city varchar(300) NULL,
+  process_nums varchar(24) NULL,
+  deal_depart_name_1 varchar(300) NULL,
+  deal_depart_name_2 varchar(300) NULL,
+  deal_depart_name_3 varchar(300) NULL,
+  first_call_back_time varchar(19) NULL,
+  proce_remark varchar(4136) NULL,
+  duty_major_day varchar(300) NULL,
+  duty_reason_id_day varchar(300) NULL,
+  duty_major_month varchar(300) NULL,
+  duty_reason_id_month varchar(300) NULL,
+  voice_text varchar(4136) NULL,
+  cteate_time timestamp NULL DEFAULT now(),
+  CONSTRAINT he_d_mobile_comp_pkey PRIMARY KEY (id)
+)
+
+-- 用户数
+drop table if exists report_auto.user_count;
+CREATE TABLE report_auto.user_count (
+	id bigserial NOT NULL,
+  month_id varchar(6) NOT NULL,
+  city_name varchar(10) NOT NULL,
+  user_count varchar(10) NOT NULL,
+  cteate_time timestamp NULL DEFAULT now(),
+  CONSTRAINT user_count_pkey PRIMARY KEY (id)
+)
+
+-- 目标万投比
+drop table if exists report_auto.target_ts_ratio;
+CREATE TABLE report_auto.target_ts_ratio (
+	id bigserial NOT NULL,
+  month_id varchar(6) NOT NULL,
+  city_name varchar(10) NOT NULL,
+  target_ts_ratio varchar(10) NOT NULL,
+  cteate_time timestamp NULL DEFAULT now(),
+  CONSTRAINT target_ts_ratio_pkey PRIMARY KEY (id)
+)
+
+-- 每月平均处理时长
+drop table if exists report_auto.avg_duration;
+CREATE TABLE report_auto.avg_duration (
+	id bigserial NOT NULL,
+	month_id varchar(6) NULL,
+	city_name varchar(10) null,
+	avg_duration float8 not null,
+  cteate_time timestamp NULL DEFAULT now(),
+	CONSTRAINT avg_duration_pkey PRIMARY KEY (id)
+);

+ 42 - 0
doc/old/开发文档/本地环境接口测试.md

@@ -0,0 +1,42 @@
+# 接口测试
+
+## 数据手动入库
+
+```http
+POST http://127.0.0.1:29100/tsl/task/warahouse HTTP/1.1
+Content-Type:application/json
+
+20230502
+```
+
+## 定时任务
+
+### 查询定时任务
+
+```http
+POST http://127.0.0.1:29100/tsl/task/cron/status HTTP/1.1
+Content-Type:application/json
+```
+
+### 停止定时任务
+
+```http
+POST http://127.0.0.1:29100/tsl/task/cron/stop HTTP/1.1
+Content-Type:application/json
+```
+
+### 启动定时任务
+
+```http
+POST http://127.0.0.1:29100/tsl/task/cron/start HTTP/1.1
+Content-Type:application/json
+```
+
+### 修改定时表达式
+
+```http
+POST http://127.0.0.1:29100/tsl/task/cron/expression HTTP/1.1
+Content-Type:application/json
+
+0/25 * * * 
+```

BIN
doc/old/开发文档/样本数据/输入/1-12月投诉率明细(1).xlsx


+ 948 - 0
doc/old/开发文档/样本数据/输入/HE_D_HIGH_QUALITY_COUNT_DAY_20230412.csv

@@ -0,0 +1,948 @@
+账期月,账期日,日期,工单归属地市,专业线,大类问题,小类问题,总投诉量(办结量),10010热线投诉量(办结量),营业厅、在线等其他投诉渠道(办结量),10015升诉量(办结量),总满意率,总满意参评量,总参评量,投诉满意率,投诉满意量,投诉满意参评量,投诉解决率,投诉解决量,投诉解决参评量,投诉响应率,投诉响应量,投诉响应参评量,投诉未邀请评价量,故障满意率,故障满意量,故障满意参评量,故障解决率,故障解决量,故障解决参评量,故障响应率,故障响应量,故障响应参评量,
+MONTH_ID,DAY_ID,ACCT_DATE,BUSINOAREANAME,PROFES_DEP,BIG_TYPE_NAME,SMALL_TYPE_NAME,TOTAL_COMPLAINTS,HOTLINE_COMPLAINTS,OTHER_COMPLAINT,LITIGATION_VOLUME,SATISFACTION_RATE,SATISFACTION_COUNT,TOTAL_EVALUATION,COMPLAINT_SATISFIED,COMPLAINT_SATISFIED_LIST,COMPLAINT_SATISFIED_COUNT,COMPLAINT_RESOLUTION,COMPLAINT_RESOLUTION_LIST,COMPLAINT_RESOLUTION_COUNT,COMPLAINT_RESPONSE,COMPLAINT_RESPONSE_LIST,COMPLAINT_RESPONSE_COUNT,COMPLAINT,FAULT_SATISFACTION_RATE,FAULT_SATISFACTION_LIST,FAULT_SATISFACTION_COUNT,FAULT_RESOLUTION_RATE,FAULT_RESOLUTION_LIST,FAULT_RESOLUTION_COUNT,FAULT_RESPONSE_RATE,FAULT_RESPONSE_LIST,FAULT_RESPONSE_COUNT,
+202304,12,2023/4/12,石家庄,业务产品,--,--,6500,5911,166,423,86.46%,2662,3062,86.46%,2662,3062,85.12%,2797,3269,94.21%,2700,2849,17,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,固网业务体验,--,200,194,0,6,88.54%,85,96,88.54%,85,96,89.62%,95,106,96.59%,85,88,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,固网业务体验,不知情办理业务等糊涂消费,46,46,0,0,91.67%,22,24,91.67%,22,24,92.31%,24,26,95.00%,19,20,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,固网业务体验,业务产品使用与规则争议,31,30,0,1,73.33%,11,15,73.33%,11,15,94.12%,16,17,100.00%,15,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,固网业务体验,产品套餐资费争议,70,67,0,3,94.12%,32,34,94.12%,32,34,89.74%,35,39,100.00%,31,31,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,固网业务体验,入网/携入受阻碍、不便捷,5,4,0,1,33.33%,1,3,33.33%,1,3,33.33%,1,3,66.67%,2,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,固网业务体验,增值业务与一次性费用不认可,14,13,0,1,100.00%,4,4,100.00%,4,4,100.00%,4,4,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,14,14,0,0,83.33%,5,6,83.33%,5,6,71.43%,5,7,83.33%,5,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,固网业务体验,离网受阻碍,9,9,0,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,11,11,0,0,100.00%,7,7,100.00%,7,7,100.00%,7,7,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,移网业务体验,--,3854,3348,141,365,85.94%,1565,1805,85.94%,1565,1805,84.39%,1627,1912,93.78%,1597,1687,16,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,移网业务体验,不知情办理业务等糊涂消费,540,389,16,135,81.04%,218,269,81.04%,218,269,79.29%,222,280,91.67%,231,252,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,移网业务体验,业务产品使用与规则争议,1125,1053,38,34,82.59%,408,488,82.59%,408,488,80.92%,424,518,91.37%,413,446,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,移网业务体验,产品套餐资费争议,1130,989,35,106,89.58%,490,537,89.58%,490,537,87.95%,511,571,94.37%,486,505,10,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,移网业务体验,入网/携入受阻碍、不便捷,88,79,9,0,75.00%,27,36,75.00%,27,36,71.79%,28,39,90.32%,28,31,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,移网业务体验,增值业务与一次性费用不认可,215,132,14,69,92.45%,98,106,92.45%,98,106,90.52%,105,116,97.09%,100,103,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,503,486,15,2,86.57%,232,268,86.57%,232,268,86.22%,244,283,97.30%,252,259,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,移网业务体验,携出不顺利,19,10,0,9,75.00%,3,4,75.00%,3,4,83.33%,5,6,75.00%,3,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,移网业务体验,离网受阻碍,125,111,8,6,90.91%,50,55,90.91%,50,55,83.93%,47,56,95.92%,47,49,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,109,99,6,4,92.86%,39,42,92.86%,39,42,95.35%,41,43,97.37%,37,38,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,融合业务体验,--,2446,2369,25,52,87.09%,1012,1161,87.09%,1012,1161,85.86%,1075,1251,94.70%,1018,1074,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,融合业务体验,不知情办理业务等糊涂消费,477,462,3,12,88.89%,200,225,88.89%,200,225,85.12%,206,242,95.73%,202,211,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,融合业务体验,业务产品使用与规则争议,805,786,12,7,85.56%,314,367,85.56%,314,367,82.53%,326,395,92.81%,310,334,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,融合业务体验,产品套餐资费争议,298,279,2,17,87.79%,115,130,87.79%,115,130,89.93%,125,138,90.32%,112,123,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,融合业务体验,入网/携入受阻碍、不便捷,43,43,0,0,78.26%,18,23,78.26%,18,23,84.00%,21,25,100.00%,20,20,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,融合业务体验,增值业务与一次性费用不认可,150,137,2,11,87.36%,76,87,87.36%,76,87,93.26%,83,89,97.53%,79,81,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,470,464,5,1,86.27%,220,255,86.27%,220,255,85.66%,233,272,95.76%,226,236,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,融合业务体验,携出不顺利,14,11,0,3,100.00%,6,6,100.00%,6,6,85.71%,6,7,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,融合业务体验,离网受阻碍,55,54,1,0,91.30%,21,23,91.30%,21,23,81.48%,22,27,100.00%,24,24,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,134,133,0,1,93.33%,42,45,93.33%,42,45,94.64%,53,56,100.00%,39,39,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,信息安全,--,--,488,464,9,15,80.86%,169,209,80.86%,169,209,77.68%,174,224,89.95%,170,189,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,信息安全,网络与信息安全,--,488,464,9,15,80.86%,169,209,80.86%,169,209,77.68%,174,224,89.95%,170,189,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,信息安全,网络与信息安全,安全规则引发用户不满,317,303,2,12,79.84%,103,129,79.84%,103,129,76.09%,105,138,87.83%,101,115,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,信息安全,网络与信息安全,安全风险导致用户不满,171,161,7,3,82.50%,66,80,82.50%,66,80,80.23%,69,86,93.24%,69,74,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,政企业务,--,--,8,7,1,0,66.67%,2,3,66.67%,2,3,66.67%,2,3,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,政企业务,基础业务(双线、IDC等),--,1,0,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,政企业务,基础业务(双线、IDC等),业务产品使用与规则争议,1,0,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,政企业务,物联网2C,--,7,7,0,0,66.67%,2,3,66.67%,2,3,66.67%,2,3,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,政企业务,物联网2C,业务产品使用与规则争议,6,6,0,0,66.67%,2,3,66.67%,2,3,66.67%,2,3,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,政企业务,物联网2C,产品套餐资费争议,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,数字化,--,--,2622,2364,80,178,87.77%,1084,1224,87.77%,1084,1224,86.56%,1134,1299,94.66%,1082,1132,11,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,数字化,数字化问题,--,2622,2364,80,178,87.77%,1084,1224,87.77%,1084,1224,86.56%,1134,1299,94.66%,1082,1132,11,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,数字化,数字化问题,携转相关信息化故障,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,数字化,数字化问题,数字化能力不足,2621,2363,80,178,87.77%,1084,1224,87.77%,1084,1224,86.56%,1134,1299,94.66%,1082,1132,11,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,数字化,数字化问题-双码,--,0,0,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,数字化,数字化问题-双码,健康码、行程码异常,0,0,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,--,--,551,455,28,68,85.77%,235,274,85.77%,235,274,83.45%,242,290,89.96%,224,249,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,2I配送,--,36,33,0,3,65.00%,13,20,65.00%,13,20,68.18%,15,22,93.75%,15,16,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,2I配送,渠道服务不一致,16,16,0,0,66.67%,6,9,66.67%,6,9,81.82%,9,11,100.00%,8,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,2I配送,问题处理不及时、咨询不准确等,20,17,0,3,63.64%,7,11,63.64%,7,11,54.55%,6,11,87.50%,7,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,公众客户经理,--,4,1,0,3,50.00%,1,2,50.00%,1,2,33.33%,1,3,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,公众客户经理,业务办理有差错,推诿办理,4,1,0,3,50.00%,1,2,50.00%,1,2,33.33%,1,3,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,其他,--,5,3,0,2,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,其他,其他,5,3,0,2,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,手网短微等电子渠道,--,132,76,21,35,85.48%,53,62,85.48%,53,62,83.33%,55,66,92.86%,52,56,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,手网短微等电子渠道,业务办理有差错,推诿办理,5,2,1,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,手网短微等电子渠道,服务态度差,4,4,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,57,21,3,33,75.00%,21,28,75.00%,21,28,72.41%,21,29,85.19%,23,27,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,手网短微等电子渠道,渠道服务不一致,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,65,48,17,0,93.75%,30,32,93.75%,30,32,91.43%,32,35,100.00%,27,27,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,智家工程师,--,83,79,1,3,86.00%,43,50,86.00%,43,50,83.33%,45,54,86.67%,39,45,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,智家工程师,业务办理有差错,推诿办理,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,智家工程师,服务态度差,3,3,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,智家工程师,服务能力不足办理不成功,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,智家工程师,问题处理不及时、咨询不准确等,78,74,1,3,85.42%,41,48,85.42%,41,48,82.69%,43,52,86.05%,37,43,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,热线,--,62,54,0,8,93.75%,30,32,93.75%,30,32,96.88%,31,32,90.00%,27,30,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,热线,业务办理有差错,推诿办理,31,28,0,3,93.33%,14,15,93.33%,14,15,100.00%,15,15,86.67%,13,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,热线,服务态度差,6,1,0,5,66.67%,2,3,66.67%,2,3,66.67%,2,3,66.67%,2,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,热线,渠道服务不一致,20,20,0,0,100.00%,11,11,100.00%,11,11,100.00%,11,11,100.00%,10,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,热线,问题处理不及时、咨询不准确等,5,5,0,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,营业厅,--,229,209,6,14,87.62%,92,105,87.62%,92,105,83.64%,92,110,89.69%,87,97,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,营业厅,业务办理有差错,推诿办理,164,146,4,14,88.46%,69,78,88.46%,69,78,82.93%,68,82,91.67%,66,72,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,营业厅,服务态度差,57,56,1,0,83.33%,20,24,83.33%,20,24,84.00%,21,25,81.82%,18,22,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,渠道服务,营业厅,渠道服务不一致,8,7,1,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,网络质量,--,--,6997,6487,388,122,93.09%,2116,2272,90.35%,730,807,84.49%,730,863,95.38%,743,778,1,94.61%,1386,1465,94.33%,1382,1465,97.90%,1350,1379,
+202304,12,2023/4/12,石家庄,网络质量,固网网络体验,--,5526,5143,339,44,94.08%,1461,1553,85.23%,75,88,81.25%,78,96,89.29%,75,84,0,94.61%,1386,1465,94.33%,1382,1465,97.90%,1350,1379,
+202304,12,2023/4/12,石家庄,网络质量,固网网络体验,TV中断、不可用,330,298,31,1,94.64%,106,112,100.00%,1,1,50.00%,1,2,100.00%,1,1,0,94.59%,105,111,93.69%,104,111,97.22%,105,108,
+202304,12,2023/4/12,石家庄,网络质量,固网网络体验,上网中断、不可用,4009,3861,122,26,95.29%,1113,1168,91.49%,43,47,92.00%,46,50,93.33%,42,45,0,95.45%,1070,1121,95.18%,1067,1121,97.91%,1030,1052,
+202304,12,2023/4/12,石家庄,网络质量,固网网络体验,上网建网影响客户,157,147,0,10,76.67%,23,30,72.73%,8,11,66.67%,8,12,72.73%,8,11,0,78.95%,15,19,63.16%,12,19,82.35%,14,17,
+202304,12,2023/4/12,石家庄,网络质量,固网网络体验,上网端网业不匹配,43,40,1,2,80.00%,20,25,80.00%,20,25,71.43%,20,28,86.96%,20,23,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,网络质量,固网网络体验,上网网络卡顿,433,247,183,3,88.71%,110,124,0.00%,0,1,0.00%,0,1,100.00%,1,1,0,89.43%,110,123,92.68%,114,123,99.15%,116,117,
+202304,12,2023/4/12,石家庄,网络质量,固网网络体验,语音通信问题,554,550,2,2,94.68%,89,94,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,94.51%,86,91,93.41%,85,91,100.00%,85,85,
+202304,12,2023/4/12,石家庄,网络质量,移网网络体验,--,1471,1344,49,78,90.97%,655,719,90.97%,655,719,84.90%,652,767,96.12%,668,694,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,网络质量,移网网络体验,上网中断、不可用,265,213,8,44,93.48%,129,138,93.48%,129,138,90.07%,136,151,99.26%,134,135,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,网络质量,移网网络体验,上网网络卡顿,370,356,12,2,94.44%,187,198,94.44%,187,198,88.83%,183,206,97.94%,190,194,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,网络质量,移网网络体验,漫游争议,7,4,3,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,网络质量,移网网络体验,短信使用问题,54,24,14,16,70.00%,7,10,70.00%,7,10,66.67%,8,12,75.00%,6,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,石家庄,网络质量,移网网络体验,语音通信问题,775,747,12,16,88.68%,329,370,88.68%,329,370,81.31%,322,395,94.37%,335,354,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,--,--,--,10202,9500,336,366,88.82%,3645,4086,86.92%,2679,3064,85.36%,2798,3260,94.28%,2685,2830,18,94.52%,966,1022,94.42%,965,1022,98.41%,931,946,
+202304,12,2023/4/12,唐山,业务产品,--,--,4930,4558,94,278,85.97%,2145,2478,85.97%,2145,2478,85.25%,2265,2640,93.93%,2168,2291,17,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,固网业务体验,--,110,106,0,4,93.55%,58,62,93.55%,58,62,98.41%,62,63,94.83%,55,58,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,固网业务体验,不知情办理业务等糊涂消费,24,23,0,1,85.71%,6,7,85.71%,6,7,100.00%,8,8,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,固网业务体验,业务产品使用与规则争议,22,22,0,0,94.12%,16,17,94.12%,16,17,100.00%,17,17,92.86%,13,14,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,固网业务体验,产品套餐资费争议,27,27,0,0,93.33%,14,15,93.33%,14,15,100.00%,15,15,93.33%,14,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,固网业务体验,入网/携入受阻碍、不便捷,7,6,0,1,100.00%,4,4,100.00%,4,4,100.00%,4,4,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,固网业务体验,增值业务与一次性费用不认可,12,11,0,1,100.00%,8,8,100.00%,8,8,100.00%,8,8,100.00%,8,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,13,13,0,0,100.00%,8,8,100.00%,8,8,87.50%,7,8,100.00%,8,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,固网业务体验,离网受阻碍,4,3,0,1,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,1,1,0,0,0.00%,0,1,0.00%,0,1,100.00%,1,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,移网业务体验,--,2755,2448,76,231,85.37%,1167,1352,85.37%,1167,1352,84.64%,1234,1443,93.40%,1189,1258,15,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,移网业务体验,不知情办理业务等糊涂消费,345,267,16,62,85.80%,151,175,85.80%,151,175,79.89%,151,188,94.67%,160,168,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,移网业务体验,业务产品使用与规则争议,734,691,22,21,84.64%,292,338,84.64%,292,338,83.96%,314,367,90.25%,287,311,7,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,移网业务体验,产品套餐资费争议,862,761,14,87,86.49%,365,416,86.49%,365,416,87.05%,383,434,94.07%,365,382,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,移网业务体验,入网/携入受阻碍、不便捷,44,42,2,0,81.82%,18,22,81.82%,18,22,81.82%,18,22,90.48%,19,21,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,移网业务体验,增值业务与一次性费用不认可,185,136,9,40,89.58%,86,95,89.58%,86,95,88.46%,92,103,95.74%,90,93,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,435,418,9,8,82.17%,189,230,82.17%,189,230,83.94%,209,249,96.24%,205,213,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,移网业务体验,携出不顺利,11,7,0,4,80.00%,4,5,80.00%,4,5,100.00%,6,6,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,移网业务体验,离网受阻碍,44,36,2,6,85.71%,18,21,85.71%,18,21,77.27%,17,22,89.47%,17,19,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,95,90,2,3,88.00%,44,50,88.00%,44,50,84.62%,44,52,89.36%,42,47,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,融合业务体验,--,2065,2004,18,43,86.30%,920,1064,86.30%,920,1064,85.30%,969,1134,94.58%,924,975,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,融合业务体验,不知情办理业务等糊涂消费,390,370,4,16,89.30%,192,214,89.30%,192,214,88.50%,200,225,94.47%,188,198,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,融合业务体验,业务产品使用与规则争议,640,629,6,5,85.80%,272,317,85.80%,272,317,82.09%,275,335,91.99%,264,287,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,融合业务体验,产品套餐资费争议,283,274,0,9,86.30%,126,146,86.30%,126,146,83.77%,129,154,95.49%,127,133,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,融合业务体验,入网/携入受阻碍、不便捷,40,40,0,0,94.12%,16,17,94.12%,16,17,100.00%,18,18,100.00%,15,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,融合业务体验,增值业务与一次性费用不认可,126,113,2,11,89.06%,57,64,89.06%,57,64,92.65%,63,68,96.36%,53,55,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,474,468,6,0,83.27%,204,244,83.27%,204,244,84.96%,226,265,95.71%,223,232,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,融合业务体验,携出不顺利,8,7,0,1,57.14%,4,7,57.14%,4,7,42.86%,3,7,83.33%,5,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,融合业务体验,离网受阻碍,16,15,0,1,75.00%,6,8,75.00%,6,8,88.89%,8,9,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,88,88,0,0,91.49%,43,47,91.49%,43,47,88.68%,47,53,100.00%,43,43,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,信息安全,--,--,211,201,2,8,87.18%,68,78,87.18%,68,78,78.31%,65,83,94.52%,69,73,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,信息安全,网络与信息安全,--,211,201,2,8,87.18%,68,78,87.18%,68,78,78.31%,65,83,94.52%,69,73,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,信息安全,网络与信息安全,安全规则引发用户不满,135,126,2,7,85.19%,46,54,85.19%,46,54,77.19%,44,57,95.92%,47,49,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,信息安全,网络与信息安全,安全风险导致用户不满,76,75,0,1,91.67%,22,24,91.67%,22,24,80.77%,21,26,91.67%,22,24,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,政企业务,--,--,9,8,1,0,100.00%,1,1,100.00%,1,1,100.00%,2,2,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,政企业务,基础业务(双线、IDC等),--,1,0,1,0,,0,0,,0,0,100.00%,1,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,政企业务,基础业务(双线、IDC等),不知情办理业务等糊涂消费,1,0,1,0,,0,0,,0,0,100.00%,1,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,政企业务,物联网2C,--,8,8,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,政企业务,物联网2C,业务产品使用与规则争议,7,7,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,政企业务,物联网2C,产品套餐资费争议,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,数字化,--,--,1872,1717,41,114,86.91%,810,926,86.91%,810,926,86.10%,836,965,94.74%,811,850,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,数字化,数字化问题,--,1872,1717,41,114,86.91%,810,926,86.91%,810,926,86.10%,836,965,94.74%,811,850,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,数字化,数字化问题,数字化能力不足,1872,1717,41,114,86.91%,810,926,86.91%,810,926,86.10%,836,965,94.74%,811,850,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,--,--,351,294,14,43,90.23%,157,174,90.23%,157,174,89.07%,163,183,95.03%,153,161,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,2I配送,--,18,16,0,2,81.82%,9,11,81.82%,9,11,72.73%,8,11,90.91%,10,11,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,2I配送,渠道服务不一致,12,12,0,0,71.43%,5,7,71.43%,5,7,57.14%,4,7,85.71%,6,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,2I配送,问题处理不及时、咨询不准确等,6,4,0,2,100.00%,4,4,100.00%,4,4,100.00%,4,4,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,其他,--,2,2,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,其他,其他,2,2,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,手网短微等电子渠道,--,71,43,10,18,97.37%,37,38,97.37%,37,38,89.74%,35,39,100.00%,37,37,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,手网短微等电子渠道,业务办理有差错,推诿办理,1,0,1,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,手网短微等电子渠道,服务态度差,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,30,10,3,17,100.00%,16,16,100.00%,16,16,93.75%,15,16,100.00%,16,16,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,39,32,6,1,95.24%,20,21,95.24%,20,21,86.36%,19,22,100.00%,20,20,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,智家工程师,--,66,63,1,2,93.55%,29,31,93.55%,29,31,96.88%,31,32,88.00%,22,25,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,智家工程师,服务态度差,3,3,0,0,100.00%,1,1,100.00%,1,1,100.00%,2,2,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,智家工程师,问题处理不及时、咨询不准确等,63,60,1,2,93.33%,28,30,93.33%,28,30,96.67%,29,30,87.50%,21,24,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,热线,--,45,35,0,10,92.31%,12,13,92.31%,12,13,100.00%,14,14,100.00%,13,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,热线,业务办理有差错,推诿办理,26,20,0,6,100.00%,6,6,100.00%,6,6,100.00%,7,7,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,热线,服务态度差,5,1,0,4,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,热线,渠道服务不一致,10,10,0,0,66.67%,2,3,66.67%,2,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,热线,问题处理不及时、咨询不准确等,4,4,0,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,营业厅,--,149,135,3,11,86.08%,68,79,86.08%,68,79,85.88%,73,85,94.52%,69,73,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,营业厅,业务办理有差错,推诿办理,108,95,2,11,86.67%,52,60,86.67%,52,60,85.94%,55,64,98.25%,56,57,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,营业厅,服务态度差,35,35,0,0,82.35%,14,17,82.35%,14,17,84.21%,16,19,78.57%,11,14,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,渠道服务,营业厅,渠道服务不一致,6,5,1,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,网络质量,--,--,4699,4437,225,37,93.94%,1272,1353,92.17%,306,331,85.75%,301,350,96.70%,293,302,1,94.52%,966,1022,94.42%,965,1022,98.41%,931,946,
+202304,12,2023/4/12,唐山,网络质量,固网网络体验,--,4139,3912,214,13,94.55%,1024,1083,95.08%,58,61,91.94%,57,62,94.74%,54,57,0,94.52%,966,1022,94.42%,965,1022,98.41%,931,946,
+202304,12,2023/4/12,唐山,网络质量,固网网络体验,TV中断、不可用,240,213,26,1,100.00%,70,70,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,100.00%,69,69,100.00%,69,69,100.00%,66,66,
+202304,12,2023/4/12,唐山,网络质量,固网网络体验,上网中断、不可用,3061,2979,74,8,95.16%,806,847,100.00%,32,32,100.00%,33,33,100.00%,32,32,0,94.97%,774,815,94.85%,773,815,98.40%,739,751,
+202304,12,2023/4/12,唐山,网络质量,固网网络体验,上网建网影响客户,250,248,0,2,81.82%,27,33,83.33%,10,12,66.67%,8,12,80.00%,8,10,0,80.95%,17,21,76.19%,16,21,94.74%,18,19,
+202304,12,2023/4/12,唐山,网络质量,固网网络体验,上网端网业不匹配,14,14,0,0,90.00%,9,10,90.00%,9,10,90.00%,9,10,88.89%,8,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,网络质量,固网网络体验,上网网络卡顿,263,149,113,1,87.14%,61,70,100.00%,3,3,100.00%,3,3,100.00%,2,2,0,86.57%,58,67,92.54%,62,67,98.36%,60,61,
+202304,12,2023/4/12,唐山,网络质量,固网网络体验,语音通信问题,311,309,1,1,96.23%,51,53,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,96.00%,48,50,90.00%,45,50,97.96%,48,49,
+202304,12,2023/4/12,唐山,网络质量,物联网,--,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,网络质量,物联网,上网中断、不可用,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,网络质量,移网网络体验,--,559,524,11,24,91.51%,248,270,91.51%,248,270,84.43%,244,288,97.15%,239,245,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,网络质量,移网网络体验,上网中断、不可用,153,132,2,19,90.54%,67,74,90.54%,67,74,83.54%,66,79,98.46%,64,65,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,网络质量,移网网络体验,上网网络卡顿,222,218,3,1,90.57%,96,106,90.57%,96,106,85.45%,94,110,97.98%,97,99,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,网络质量,移网网络体验,漫游争议,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,网络质量,移网网络体验,短信使用问题,10,7,2,1,100.00%,5,5,100.00%,5,5,60.00%,3,5,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,唐山,网络质量,移网网络体验,语音通信问题,172,165,4,3,92.94%,79,84,92.94%,79,84,85.11%,80,93,94.81%,73,76,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,--,--,--,4602,4340,120,142,89.18%,1484,1658,87.03%,993,1135,84.97%,1046,1225,93.81%,1001,1061,6,93.88%,491,523,92.35%,483,523,97.73%,473,484,
+202304,12,2023/4/12,秦皇岛,业务产品,--,--,2295,2153,35,107,86.93%,851,973,86.93%,851,973,85.21%,899,1049,93.68%,859,911,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,固网业务体验,--,47,47,0,0,84.62%,11,13,84.62%,11,13,92.31%,12,13,84.62%,11,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,固网业务体验,不知情办理业务等糊涂消费,5,5,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,固网业务体验,业务产品使用与规则争议,6,6,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,固网业务体验,产品套餐资费争议,12,12,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,固网业务体验,入网/携入受阻碍、不便捷,6,6,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,固网业务体验,增值业务与一次性费用不认可,5,5,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,6,6,0,0,66.67%,2,3,66.67%,2,3,66.67%,2,3,66.67%,2,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,固网业务体验,离网受阻碍,4,4,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,3,3,0,0,50.00%,1,2,50.00%,1,2,100.00%,2,2,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,移网业务体验,--,1269,1143,31,95,87.01%,462,525,87.01%,462,525,85.34%,489,567,92.71%,458,488,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,移网业务体验,不知情办理业务等糊涂消费,154,124,8,22,83.61%,51,61,83.61%,51,61,87.50%,56,64,94.64%,53,56,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,移网业务体验,业务产品使用与规则争议,365,354,3,8,82.17%,106,126,82.17%,106,126,79.71%,110,135,90.43%,104,112,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,移网业务体验,产品套餐资费争议,380,331,10,39,90.86%,159,172,90.86%,159,172,86.60%,168,191,94.01%,157,164,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,移网业务体验,入网/携入受阻碍、不便捷,27,24,3,0,100.00%,7,7,100.00%,7,7,100.00%,7,7,85.71%,6,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,移网业务体验,增值业务与一次性费用不认可,78,59,3,16,92.50%,37,40,92.50%,37,40,88.89%,40,45,94.74%,36,38,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,195,191,3,1,87.64%,78,89,87.64%,78,89,88.04%,81,92,94.05%,79,84,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,移网业务体验,携出不顺利,10,3,0,7,75.00%,3,4,75.00%,3,4,60.00%,3,5,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,移网业务体验,离网受阻碍,22,19,1,2,50.00%,3,6,50.00%,3,6,50.00%,3,6,60.00%,3,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,38,38,0,0,90.00%,18,20,90.00%,18,20,95.45%,21,22,89.47%,17,19,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,融合业务体验,--,979,963,4,12,86.90%,378,435,86.90%,378,435,84.86%,398,469,95.12%,390,410,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,融合业务体验,不知情办理业务等糊涂消费,156,151,3,2,83.33%,60,72,83.33%,60,72,82.67%,62,75,97.06%,66,68,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,融合业务体验,业务产品使用与规则争议,305,304,1,0,84.26%,91,108,84.26%,91,108,83.19%,99,119,91.35%,95,104,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,融合业务体验,产品套餐资费争议,164,159,0,5,91.46%,75,82,91.46%,75,82,91.86%,79,86,97.30%,72,74,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,融合业务体验,入网/携入受阻碍、不便捷,13,13,0,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,融合业务体验,增值业务与一次性费用不认可,73,68,0,5,86.11%,31,36,86.11%,31,36,82.05%,32,39,91.18%,31,34,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,195,195,0,0,87.96%,95,108,87.96%,95,108,84.03%,100,119,97.09%,100,103,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,融合业务体验,携出不顺利,7,7,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,融合业务体验,离网受阻碍,15,15,0,0,100.00%,2,2,100.00%,2,2,100.00%,3,3,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,51,51,0,0,86.96%,20,23,86.96%,20,23,79.17%,19,24,100.00%,21,21,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,信息安全,--,--,114,112,0,2,92.00%,23,25,92.00%,23,25,85.19%,23,27,92.00%,23,25,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,信息安全,网络与信息安全,--,114,112,0,2,92.00%,23,25,92.00%,23,25,85.19%,23,27,92.00%,23,25,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,信息安全,网络与信息安全,安全规则引发用户不满,80,78,0,2,93.75%,15,16,93.75%,15,16,88.24%,15,17,87.50%,14,16,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,信息安全,网络与信息安全,安全风险导致用户不满,34,34,0,0,88.89%,8,9,88.89%,8,9,80.00%,8,10,100.00%,9,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,数字化,--,--,896,831,17,48,88.51%,339,380,88.51%,339,380,85.92%,354,409,94.43%,339,356,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,数字化,数字化问题,--,896,831,17,48,88.51%,339,380,88.51%,339,380,85.92%,354,409,94.43%,339,356,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,数字化,数字化问题,携转相关信息化故障,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,数字化,数字化问题,数字化能力不足,895,830,17,48,88.51%,339,380,88.51%,339,380,85.92%,354,409,94.43%,339,356,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,--,--,145,123,3,19,76.60%,36,47,76.60%,36,47,75.93%,41,54,92.68%,38,41,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,2I配送,--,12,6,1,5,100.00%,4,4,100.00%,4,4,100.00%,4,4,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,2I配送,渠道服务不一致,5,5,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,2I配送,问题处理不及时、咨询不准确等,7,1,1,5,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,手网短微等电子渠道,--,30,22,2,6,70.00%,7,10,70.00%,7,10,66.67%,8,12,100.00%,10,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,手网短微等电子渠道,业务办理有差错,推诿办理,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,手网短微等电子渠道,服务态度差,2,2,0,0,50.00%,1,2,50.00%,1,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,9,2,1,6,100.00%,2,2,100.00%,2,2,66.67%,2,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,18,17,1,0,60.00%,3,5,60.00%,3,5,50.00%,3,6,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,智家工程师,--,17,17,0,0,50.00%,2,4,50.00%,2,4,60.00%,3,5,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,智家工程师,问题处理不及时、咨询不准确等,17,17,0,0,50.00%,2,4,50.00%,2,4,60.00%,3,5,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,热线,--,29,27,0,2,63.64%,7,11,63.64%,7,11,61.54%,8,13,66.67%,6,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,热线,业务办理有差错,推诿办理,15,14,0,1,75.00%,3,4,75.00%,3,4,50.00%,3,6,75.00%,3,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,热线,服务态度差,1,0,0,1,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,热线,渠道服务不一致,7,7,0,0,80.00%,4,5,80.00%,4,5,80.00%,4,5,75.00%,3,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,热线,问题处理不及时、咨询不准确等,6,6,0,0,0.00%,0,2,0.00%,0,2,50.00%,1,2,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,营业厅,--,57,51,0,6,88.89%,16,18,88.89%,16,18,90.00%,18,20,100.00%,15,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,营业厅,业务办理有差错,推诿办理,44,38,0,6,87.50%,14,16,87.50%,14,16,94.12%,16,17,100.00%,13,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,营业厅,服务态度差,12,12,0,0,100.00%,2,2,100.00%,2,2,66.67%,2,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,渠道服务,营业厅,渠道服务不一致,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,网络质量,--,--,2047,1951,82,14,93.64%,574,613,92.22%,83,90,87.37%,83,95,96.43%,81,84,0,93.88%,491,523,92.35%,483,523,97.73%,473,484,
+202304,12,2023/4/12,秦皇岛,网络质量,固网网络体验,--,1832,1748,80,4,93.45%,499,534,72.73%,8,11,75.00%,9,12,90.00%,9,10,0,93.88%,491,523,92.35%,483,523,97.73%,473,484,
+202304,12,2023/4/12,秦皇岛,网络质量,固网网络体验,TV中断、不可用,114,102,12,0,100.00%,33,33,,0,0,,0,0,,0,0,0,100.00%,33,33,93.94%,31,33,100.00%,32,32,
+202304,12,2023/4/12,秦皇岛,网络质量,固网网络体验,上网中断、不可用,1374,1348,23,3,94.27%,395,419,75.00%,3,4,75.00%,3,4,100.00%,4,4,0,94.46%,392,415,94.22%,391,415,98.17%,375,382,
+202304,12,2023/4/12,秦皇岛,网络质量,固网网络体验,上网建网影响客户,83,82,0,1,75.00%,12,16,50.00%,2,4,60.00%,3,5,66.67%,2,3,0,83.33%,10,12,58.33%,7,12,90.91%,10,11,
+202304,12,2023/4/12,秦皇岛,网络质量,固网网络体验,上网端网业不匹配,4,4,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,网络质量,固网网络体验,上网网络卡顿,101,56,45,0,83.33%,25,30,,0,0,,0,0,,0,0,0,83.33%,25,30,80.00%,24,30,89.29%,25,28,
+202304,12,2023/4/12,秦皇岛,网络质量,固网网络体验,语音通信问题,156,156,0,0,94.12%,32,34,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,93.94%,31,33,90.91%,30,33,100.00%,31,31,
+202304,12,2023/4/12,秦皇岛,网络质量,移网网络体验,--,215,203,2,10,94.94%,75,79,94.94%,75,79,89.16%,74,83,97.30%,72,74,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,网络质量,移网网络体验,上网中断、不可用,62,55,0,7,82.61%,19,23,82.61%,19,23,78.26%,18,23,90.91%,20,22,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,网络质量,移网网络体验,上网网络卡顿,67,66,1,0,100.00%,18,18,100.00%,18,18,90.00%,18,20,100.00%,16,16,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,网络质量,移网网络体验,漫游争议,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,网络质量,移网网络体验,短信使用问题,7,4,0,3,100.00%,2,2,100.00%,2,2,66.67%,2,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,秦皇岛,网络质量,移网网络体验,语音通信问题,78,77,1,0,100.00%,35,35,100.00%,35,35,97.22%,35,36,100.00%,33,33,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,--,--,--,10515,9593,469,453,84.85%,3115,3659,81.30%,2056,2517,77.67%,2115,2711,92.41%,2190,2358,12,92.73%,1059,1142,93.61%,1069,1142,97.21%,1046,1076,
+202304,12,2023/4/12,邯郸,业务产品,--,--,5712,5234,141,337,80.80%,1717,2113,80.80%,1717,2113,76.88%,1766,2285,92.09%,1829,1974,12,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,固网业务体验,--,122,116,3,3,96.77%,30,31,96.77%,30,31,87.88%,29,33,96.55%,28,29,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,固网业务体验,不知情办理业务等糊涂消费,24,22,1,1,100.00%,11,11,100.00%,11,11,90.91%,10,11,100.00%,11,11,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,固网业务体验,业务产品使用与规则争议,9,9,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,固网业务体验,产品套餐资费争议,36,33,1,2,100.00%,9,9,100.00%,9,9,90.91%,10,11,100.00%,8,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,固网业务体验,入网/携入受阻碍、不便捷,5,5,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,固网业务体验,增值业务与一次性费用不认可,21,21,0,0,75.00%,3,4,75.00%,3,4,75.00%,3,4,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,6,6,0,0,100.00%,2,2,100.00%,2,2,50.00%,1,2,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,固网业务体验,离网受阻碍,14,13,1,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,7,7,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,移网业务体验,--,3234,2825,115,294,79.94%,992,1229,79.94%,992,1229,76.76%,1037,1339,91.09%,1053,1144,12,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,移网业务体验,不知情办理业务等糊涂消费,467,354,17,96,70.66%,118,167,70.66%,118,167,67.22%,121,180,84.08%,132,157,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,移网业务体验,业务产品使用与规则争议,885,817,38,30,84.62%,242,282,84.62%,242,282,79.49%,248,308,92.54%,248,264,4,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,移网业务体验,产品套餐资费争议,934,821,22,91,82.68%,339,402,82.68%,339,402,80.72%,360,438,91.56%,347,371,8,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,移网业务体验,入网/携入受阻碍、不便捷,54,47,5,2,83.33%,10,12,83.33%,10,12,91.67%,11,12,81.82%,9,11,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,移网业务体验,增值业务与一次性费用不认可,213,141,14,58,80.85%,76,94,80.85%,76,94,75.49%,77,102,93.41%,85,91,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,517,500,14,3,73.50%,172,234,73.50%,172,234,71.43%,185,259,92.17%,200,217,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,移网业务体验,携出不顺利,12,6,0,6,100.00%,5,5,100.00%,5,5,80.00%,4,5,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,移网业务体验,离网受阻碍,74,65,3,6,100.00%,11,11,100.00%,11,11,100.00%,11,11,100.00%,10,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,78,74,2,2,86.36%,19,22,86.36%,19,22,83.33%,20,24,94.74%,18,19,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,融合业务体验,--,2356,2293,23,40,81.48%,695,853,81.48%,695,853,76.67%,700,913,93.38%,748,801,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,融合业务体验,不知情办理业务等糊涂消费,502,488,2,12,76.33%,129,169,76.33%,129,169,70.88%,129,182,93.17%,150,161,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,融合业务体验,业务产品使用与规则争议,759,749,8,2,82.55%,175,212,82.55%,175,212,76.82%,179,233,93.97%,187,199,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,融合业务体验,产品套餐资费争议,268,253,4,11,84.47%,87,103,84.47%,87,103,80.18%,89,111,93.48%,86,92,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,融合业务体验,入网/携入受阻碍、不便捷,28,28,0,0,100.00%,9,9,100.00%,9,9,100.00%,10,10,100.00%,9,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,融合业务体验,增值业务与一次性费用不认可,187,173,1,13,88.64%,78,88,88.64%,78,88,84.78%,78,92,95.12%,78,82,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,463,456,7,0,81.51%,194,238,81.51%,194,238,75.60%,189,250,92.51%,210,227,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,融合业务体验,携出不顺利,10,9,0,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,融合业务体验,离网受阻碍,45,43,1,1,60.00%,3,5,60.00%,3,5,80.00%,4,5,75.00%,3,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,94,94,0,0,67.86%,19,28,67.86%,19,28,72.41%,21,29,92.59%,25,27,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,信息安全,--,--,306,296,2,8,77.55%,38,49,77.55%,38,49,69.09%,38,55,97.92%,47,48,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,信息安全,网络与信息安全,--,306,296,2,8,77.55%,38,49,77.55%,38,49,69.09%,38,55,97.92%,47,48,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,信息安全,网络与信息安全,安全规则引发用户不满,208,200,0,8,88.24%,15,17,88.24%,15,17,68.42%,13,19,100.00%,17,17,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,信息安全,网络与信息安全,安全风险导致用户不满,98,96,2,0,71.88%,23,32,71.88%,23,32,69.44%,25,36,96.77%,30,31,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,政企业务,--,--,4,2,2,0,,0,0,,0,0,0.00%,0,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,政企业务,基础业务(双线、IDC等),--,2,0,2,0,,0,0,,0,0,0.00%,0,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,政企业务,基础业务(双线、IDC等),业务产品使用与规则争议,2,0,2,0,,0,0,,0,0,0.00%,0,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,政企业务,物联网2C,--,2,2,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,政企业务,物联网2C,业务产品使用与规则争议,2,2,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,数字化,--,--,2110,1912,47,151,82.97%,648,773,82.97%,648,773,78.77%,668,840,92.02%,669,719,8,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,数字化,数字化问题,--,2110,1912,47,151,82.97%,648,773,82.97%,648,773,78.77%,668,840,92.02%,669,719,8,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,数字化,数字化问题,携转相关信息化故障,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,数字化,数字化问题,数字化能力不足,2109,1911,47,151,82.97%,648,773,82.97%,648,773,78.77%,668,840,92.02%,669,719,8,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,--,--,415,341,14,60,75.00%,81,108,75.00%,81,108,72.17%,83,115,87.25%,89,102,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,2I配送,--,20,16,0,4,77.78%,7,9,77.78%,7,9,77.78%,7,9,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,2I配送,渠道服务不一致,8,8,0,0,66.67%,2,3,66.67%,2,3,66.67%,2,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,2I配送,问题处理不及时、咨询不准确等,12,8,0,4,83.33%,5,6,83.33%,5,6,83.33%,5,6,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,公众客户经理,--,2,2,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,公众客户经理,业务办理有差错,推诿办理,2,2,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,其他,--,3,1,1,1,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,其他,其他,3,1,1,1,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,手网短微等电子渠道,--,84,49,10,25,83.87%,26,31,83.87%,26,31,77.14%,27,35,86.21%,25,29,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,手网短微等电子渠道,服务态度差,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,34,9,0,25,80.00%,12,15,80.00%,12,15,70.59%,12,17,76.92%,10,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,手网短微等电子渠道,渠道服务不一致,2,2,0,0,100.00%,1,1,100.00%,1,1,0.00%,0,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,47,37,10,0,86.67%,13,15,86.67%,13,15,88.24%,15,17,93.33%,14,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,智家工程师,--,65,59,1,5,75.00%,18,24,75.00%,18,24,79.17%,19,24,87.50%,21,24,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,智家工程师,业务办理有差错,推诿办理,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,智家工程师,服务态度差,3,3,0,0,0.00%,0,1,0.00%,0,1,100.00%,1,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,智家工程师,问题处理不及时、咨询不准确等,60,54,1,5,77.27%,17,22,77.27%,17,22,77.27%,17,22,90.91%,20,22,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,热线,--,50,45,0,5,76.92%,10,13,76.92%,10,13,69.23%,9,13,84.62%,11,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,热线,业务办理有差错,推诿办理,17,14,0,3,80.00%,4,5,80.00%,4,5,60.00%,3,5,80.00%,4,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,热线,服务态度差,3,1,0,2,0.00%,0,2,0.00%,0,2,0.00%,0,2,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,热线,渠道服务不一致,25,25,0,0,100.00%,6,6,100.00%,6,6,100.00%,6,6,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,热线,问题处理不及时、咨询不准确等,5,5,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,营业厅,--,191,169,2,20,62.07%,18,29,62.07%,18,29,59.38%,19,32,85.19%,23,27,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,营业厅,业务办理有差错,推诿办理,140,121,0,19,60.00%,15,25,60.00%,15,25,61.54%,16,26,82.61%,19,23,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,营业厅,服务态度差,44,42,1,1,75.00%,3,4,75.00%,3,4,50.00%,3,6,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,渠道服务,营业厅,渠道服务不一致,7,6,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,网络质量,--,--,4076,3718,310,48,92.08%,1279,1389,89.07%,220,247,89.41%,228,255,96.14%,224,233,0,92.73%,1059,1142,93.61%,1069,1142,97.21%,1046,1076,
+202304,12,2023/4/12,邯郸,网络质量,固网网络体验,--,3666,3343,303,20,92.23%,1092,1184,78.57%,33,42,81.82%,36,44,90.00%,36,40,0,92.73%,1059,1142,93.61%,1069,1142,97.21%,1046,1076,
+202304,12,2023/4/12,邯郸,网络质量,固网网络体验,TV中断、不可用,168,146,20,2,92.98%,53,57,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,92.86%,52,56,89.29%,50,56,96.30%,52,54,
+202304,12,2023/4/12,邯郸,网络质量,固网网络体验,上网中断、不可用,2809,2681,115,13,93.95%,885,942,82.14%,23,28,89.29%,25,28,92.59%,25,27,0,94.31%,862,914,95.62%,874,914,98.03%,844,861,
+202304,12,2023/4/12,邯郸,网络质量,固网网络体验,上网建网影响客户,178,178,0,0,33.33%,9,27,50.00%,3,6,50.00%,3,6,66.67%,4,6,0,28.57%,6,21,33.33%,7,21,61.90%,13,21,
+202304,12,2023/4/12,邯郸,网络质量,固网网络体验,上网端网业不匹配,15,13,0,2,100.00%,2,2,100.00%,2,2,66.67%,2,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,网络质量,固网网络体验,上网网络卡顿,309,139,168,2,94.17%,113,120,100.00%,2,2,100.00%,3,3,100.00%,2,2,0,94.07%,111,118,92.37%,109,118,98.17%,107,109,
+202304,12,2023/4/12,邯郸,网络质量,固网网络体验,语音通信问题,187,186,0,1,83.33%,30,36,66.67%,2,3,66.67%,2,3,100.00%,2,2,0,84.85%,28,33,87.88%,29,33,96.77%,30,31,
+202304,12,2023/4/12,邯郸,网络质量,物联网,--,6,5,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,网络质量,物联网,上网中断、不可用,6,5,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,网络质量,移网网络体验,--,404,370,6,28,91.22%,187,205,91.22%,187,205,91.00%,192,211,97.41%,188,193,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,网络质量,移网网络体验,上网中断、不可用,119,94,1,24,93.44%,57,61,93.44%,57,61,91.94%,57,62,98.28%,57,58,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,网络质量,移网网络体验,上网网络卡顿,111,107,3,1,89.29%,50,56,89.29%,50,56,88.33%,53,60,94.23%,49,52,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,网络质量,移网网络体验,漫游争议,2,2,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,网络质量,移网网络体验,短信使用问题,7,6,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邯郸,网络质量,移网网络体验,语音通信问题,165,161,1,3,90.91%,80,88,90.91%,80,88,92.13%,82,89,98.80%,82,83,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,--,--,--,6489,5874,320,295,88.89%,2297,2579,88.01%,1607,1821,84.63%,1641,1934,94.39%,1599,1689,5,91.03%,690,758,90.63%,687,758,96.34%,685,711,
+202304,12,2023/4/12,邢台,业务产品,--,--,3120,2821,84,215,87.72%,1293,1469,87.72%,1293,1469,84.39%,1319,1558,94.53%,1296,1366,5,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,固网业务体验,--,79,74,3,2,97.50%,39,40,97.50%,39,40,92.68%,38,41,100.00%,38,38,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,固网业务体验,不知情办理业务等糊涂消费,12,12,0,0,100.00%,8,8,100.00%,8,8,100.00%,8,8,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,固网业务体验,业务产品使用与规则争议,13,11,2,0,100.00%,5,5,100.00%,5,5,100.00%,5,5,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,固网业务体验,产品套餐资费争议,24,24,0,0,100.00%,10,10,100.00%,10,10,90.91%,10,11,100.00%,10,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,固网业务体验,入网/携入受阻碍、不便捷,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,固网业务体验,增值业务与一次性费用不认可,12,11,0,1,87.50%,7,8,87.50%,7,8,87.50%,7,8,100.00%,8,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,8,7,1,0,100.00%,5,5,100.00%,5,5,80.00%,4,5,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,固网业务体验,离网受阻碍,4,3,0,1,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,4,4,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,移网业务体验,--,1649,1411,65,173,86.96%,640,731,86.96%,640,731,82.74%,647,777,93.39%,636,676,5,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,移网业务体验,不知情办理业务等糊涂消费,242,190,10,42,77.59%,90,116,77.59%,90,116,74.79%,89,119,88.99%,97,109,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,移网业务体验,业务产品使用与规则争议,452,422,15,15,86.17%,162,185,86.17%,162,185,82.91%,165,196,93.45%,157,165,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,移网业务体验,产品套餐资费争议,445,368,19,58,92.06%,197,212,92.06%,197,212,85.53%,195,226,93.40%,184,195,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,移网业务体验,入网/携入受阻碍、不便捷,29,26,2,1,91.67%,11,12,91.67%,11,12,78.57%,11,14,100.00%,10,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,移网业务体验,增值业务与一次性费用不认可,106,62,5,39,83.33%,35,42,83.33%,35,42,84.78%,39,46,95.00%,38,40,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,257,251,6,0,88.50%,100,113,88.50%,100,113,82.79%,101,122,97.20%,104,107,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,移网业务体验,携出不顺利,19,5,0,14,75.00%,6,8,75.00%,6,8,60.00%,6,10,75.00%,6,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,移网业务体验,离网受阻碍,36,27,6,3,94.12%,16,17,94.12%,16,17,100.00%,17,17,100.00%,16,16,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,63,60,2,1,88.46%,23,26,88.46%,23,26,88.89%,24,27,92.31%,24,26,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,融合业务体验,--,1392,1336,16,40,87.97%,614,698,87.97%,614,698,85.68%,634,740,95.40%,622,652,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,融合业务体验,不知情办理业务等糊涂消费,258,246,3,9,92.20%,130,141,92.20%,130,141,91.28%,136,149,97.78%,132,135,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,融合业务体验,业务产品使用与规则争议,439,432,4,3,85.51%,183,214,85.51%,183,214,83.48%,192,230,96.39%,187,194,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,融合业务体验,产品套餐资费争议,200,190,0,10,89.80%,88,98,89.80%,88,98,88.57%,93,105,94.68%,89,94,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,融合业务体验,入网/携入受阻碍、不便捷,21,20,1,0,90.00%,9,10,90.00%,9,10,80.00%,8,10,77.78%,7,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,融合业务体验,增值业务与一次性费用不认可,103,85,2,16,87.72%,50,57,87.72%,50,57,81.67%,49,60,96.30%,52,54,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,266,261,5,0,84.67%,116,137,84.67%,116,137,81.12%,116,143,92.91%,118,127,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,融合业务体验,携出不顺利,12,12,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,融合业务体验,离网受阻碍,17,17,0,0,100.00%,5,5,100.00%,5,5,100.00%,6,6,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,76,73,1,2,91.18%,31,34,91.18%,31,34,91.43%,32,35,93.75%,30,32,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,信息安全,--,--,145,140,1,4,86.27%,44,51,86.27%,44,51,84.21%,48,57,95.65%,44,46,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,信息安全,网络与信息安全,--,145,140,1,4,86.27%,44,51,86.27%,44,51,84.21%,48,57,95.65%,44,46,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,信息安全,网络与信息安全,安全规则引发用户不满,83,80,0,3,84.62%,22,26,84.62%,22,26,86.21%,25,29,95.45%,21,22,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,信息安全,网络与信息安全,安全风险导致用户不满,62,60,1,1,88.00%,22,25,88.00%,22,25,82.14%,23,28,95.83%,23,24,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,政企业务,--,--,11,7,4,0,28.57%,2,7,28.57%,2,7,42.86%,3,7,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,政企业务,基础业务(双线、IDC等),--,2,0,2,0,50.00%,1,2,50.00%,1,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,政企业务,基础业务(双线、IDC等),不知情办理业务等糊涂消费,1,0,1,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,政企业务,基础业务(双线、IDC等),业务产品使用与规则争议,1,0,1,0,0.00%,0,1,0.00%,0,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,政企业务,物联网2C,--,9,7,2,0,20.00%,1,5,20.00%,1,5,20.00%,1,5,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,政企业务,物联网2C,业务产品使用与规则争议,7,5,2,0,33.33%,1,3,33.33%,1,3,33.33%,1,3,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,政企业务,物联网2C,产品套餐资费争议,2,2,0,0,0.00%,0,2,0.00%,0,2,0.00%,0,2,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,数字化,--,--,1176,1028,40,108,88.41%,488,550,88.41%,488,550,83.87%,499,593,93.05%,482,516,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,数字化,数字化问题,--,1176,1028,40,108,88.41%,488,550,88.41%,488,550,83.87%,499,593,93.05%,482,516,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,数字化,数字化问题,携转相关信息化故障,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,数字化,数字化问题,数字化能力不足,1175,1027,40,108,88.41%,488,550,88.41%,488,550,83.87%,499,593,93.05%,482,516,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,--,--,288,251,5,32,88.81%,119,134,88.81%,119,134,84.17%,117,139,90.48%,114,126,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,2I配送,--,17,14,1,2,100.00%,4,4,100.00%,4,4,100.00%,4,4,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,2I配送,渠道服务不一致,5,5,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,2I配送,问题处理不及时、咨询不准确等,12,9,1,2,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,其他,--,1,0,0,1,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,其他,其他,1,0,0,1,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,手网短微等电子渠道,--,48,29,2,17,96.00%,24,25,96.00%,24,25,84.62%,22,26,90.91%,20,22,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,手网短微等电子渠道,服务态度差,1,1,0,0,0.00%,0,1,0.00%,0,1,0.00%,0,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,26,9,0,17,100.00%,11,11,100.00%,11,11,83.33%,10,12,80.00%,8,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,手网短微等电子渠道,渠道服务不一致,3,2,1,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,18,17,1,0,100.00%,11,11,100.00%,11,11,90.91%,10,11,100.00%,10,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,政企基础业务服务,--,1,0,1,0,0.00%,0,1,0.00%,0,1,100.00%,1,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,政企基础业务服务,问题处理不及时、咨询不准确等,1,0,1,0,0.00%,0,1,0.00%,0,1,100.00%,1,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,智家工程师,--,58,56,0,2,84.85%,28,33,84.85%,28,33,83.33%,30,36,90.91%,30,33,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,智家工程师,问题处理不及时、咨询不准确等,58,56,0,2,84.85%,28,33,84.85%,28,33,83.33%,30,36,90.91%,30,33,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,热线,--,28,27,0,1,92.31%,12,13,92.31%,12,13,85.71%,12,14,91.67%,11,12,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,热线,业务办理有差错,推诿办理,14,14,0,0,100.00%,5,5,100.00%,5,5,83.33%,5,6,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,热线,服务态度差,1,0,0,1,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,热线,渠道服务不一致,8,8,0,0,75.00%,3,4,75.00%,3,4,75.00%,3,4,75.00%,3,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,热线,问题处理不及时、咨询不准确等,5,5,0,0,100.00%,4,4,100.00%,4,4,100.00%,4,4,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,营业厅,--,135,125,1,9,87.93%,51,58,87.93%,51,58,82.76%,48,58,90.74%,49,54,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,营业厅,业务办理有差错,推诿办理,91,81,1,9,93.02%,40,43,93.02%,40,43,88.37%,38,43,95.00%,38,40,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,营业厅,服务态度差,38,38,0,0,66.67%,8,12,66.67%,8,12,58.33%,7,12,72.73%,8,11,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,渠道服务,营业厅,渠道服务不一致,6,6,0,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,网络质量,--,--,2924,2654,226,44,91.39%,839,918,93.13%,149,160,89.02%,154,173,95.97%,143,149,0,91.03%,690,758,90.63%,687,758,96.34%,685,711,
+202304,12,2023/4/12,邢台,网络质量,固网网络体验,--,2665,2429,220,16,90.76%,727,801,86.05%,37,43,90.70%,39,43,90.00%,36,40,0,91.03%,690,758,90.63%,687,758,96.34%,685,711,
+202304,12,2023/4/12,邢台,网络质量,固网网络体验,TV中断、不可用,144,128,16,0,97.56%,40,41,,0,0,,0,0,,0,0,0,97.56%,40,41,90.24%,37,41,100.00%,40,40,
+202304,12,2023/4/12,邢台,网络质量,固网网络体验,上网中断、不可用,1969,1860,100,9,93.11%,581,624,95.65%,22,23,100.00%,23,23,100.00%,20,20,0,93.01%,559,601,92.85%,558,601,96.96%,542,559,
+202304,12,2023/4/12,邢台,网络质量,固网网络体验,上网建网影响客户,135,132,0,3,50.00%,11,22,88.89%,8,9,88.89%,8,9,88.89%,8,9,0,23.08%,3,13,15.38%,2,13,33.33%,4,12,
+202304,12,2023/4/12,邢台,网络质量,固网网络体验,上网端网业不匹配,8,7,0,1,25.00%,1,4,25.00%,1,4,25.00%,1,4,50.00%,2,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,网络质量,固网网络体验,上网网络卡顿,235,130,103,2,83.13%,69,83,80.00%,4,5,100.00%,5,5,80.00%,4,5,0,83.33%,65,78,85.90%,67,78,100.00%,75,75,
+202304,12,2023/4/12,邢台,网络质量,固网网络体验,语音通信问题,174,172,1,1,92.59%,25,27,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,92.00%,23,25,92.00%,23,25,96.00%,24,25,
+202304,12,2023/4/12,邢台,网络质量,移网网络体验,--,259,225,6,28,95.73%,112,117,95.73%,112,117,88.46%,115,130,98.17%,107,109,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,网络质量,移网网络体验,上网中断、不可用,79,57,1,21,92.31%,36,39,92.31%,36,39,78.57%,33,42,97.14%,34,35,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,网络质量,移网网络体验,上网网络卡顿,76,71,3,2,100.00%,28,28,100.00%,28,28,100.00%,37,37,100.00%,25,25,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,网络质量,移网网络体验,短信使用问题,7,4,2,1,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,邢台,网络质量,移网网络体验,语音通信问题,97,93,0,4,96.00%,48,50,96.00%,48,50,88.24%,45,51,97.96%,48,49,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,--,--,--,9506,8687,398,421,89.34%,2867,3201,86.68%,1802,2071,83.94%,1876,2227,93.49%,1824,1943,8,94.25%,1065,1130,95.22%,1076,1130,98.77%,1044,1057,
+202304,12,2023/4/12,保定,业务产品,--,--,4393,3961,118,314,86.47%,1464,1686,86.47%,1464,1686,83.77%,1523,1811,93.63%,1485,1579,7,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,固网业务体验,--,101,101,0,0,91.43%,32,35,91.43%,32,35,94.87%,37,39,96.97%,32,33,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,固网业务体验,不知情办理业务等糊涂消费,21,21,0,0,100.00%,8,8,100.00%,8,8,100.00%,8,8,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,固网业务体验,业务产品使用与规则争议,18,18,0,0,66.67%,2,3,66.67%,2,3,100.00%,4,4,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,固网业务体验,产品套餐资费争议,25,25,0,0,77.78%,7,9,77.78%,7,9,91.67%,11,12,85.71%,6,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,固网业务体验,入网/携入受阻碍、不便捷,6,6,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,固网业务体验,增值业务与一次性费用不认可,14,14,0,0,100.00%,4,4,100.00%,4,4,100.00%,4,4,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,7,7,0,0,100.00%,5,5,100.00%,5,5,80.00%,4,5,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,固网业务体验,离网受阻碍,4,4,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,6,6,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,移网业务体验,--,2561,2189,104,268,87.11%,818,932,87.11%,818,932,83.97%,854,1010,92.82%,814,870,7,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,移网业务体验,不知情办理业务等糊涂消费,334,250,11,73,86.73%,98,113,86.73%,98,113,82.26%,102,124,89.42%,93,104,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,移网业务体验,业务产品使用与规则争议,760,695,36,29,83.59%,219,262,83.59%,219,262,80.22%,223,278,93.70%,223,238,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,移网业务体验,产品套餐资费争议,691,571,22,98,89.36%,252,275,89.36%,252,275,84.14%,260,302,93.75%,255,265,7,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,移网业务体验,入网/携入受阻碍、不便捷,49,44,3,2,92.31%,12,13,92.31%,12,13,92.31%,12,13,83.33%,10,12,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,移网业务体验,增值业务与一次性费用不认可,158,99,10,49,93.22%,55,59,93.22%,55,59,93.55%,58,62,100.00%,54,54,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,425,407,14,4,88.17%,149,169,88.17%,149,169,87.03%,161,185,93.67%,148,158,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,移网业务体验,携出不顺利,11,2,0,9,75.00%,3,4,75.00%,3,4,75.00%,3,4,75.00%,3,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,移网业务体验,离网受阻碍,58,52,4,2,80.00%,12,15,80.00%,12,15,82.35%,14,17,80.00%,12,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,75,69,4,2,81.82%,18,22,81.82%,18,22,84.00%,21,25,80.00%,16,20,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,融合业务体验,--,1731,1671,14,46,85.40%,614,719,85.40%,614,719,82.94%,632,762,94.53%,639,676,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,融合业务体验,不知情办理业务等糊涂消费,315,295,2,18,85.27%,110,129,85.27%,110,129,84.78%,117,138,93.33%,112,120,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,融合业务体验,业务产品使用与规则争议,637,626,7,4,84.79%,184,217,84.79%,184,217,79.82%,182,228,94.63%,194,205,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,融合业务体验,产品套餐资费争议,207,196,1,10,82.29%,79,96,82.29%,79,96,77.78%,77,99,91.76%,78,85,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,融合业务体验,入网/携入受阻碍、不便捷,25,25,0,0,71.43%,10,14,71.43%,10,14,71.43%,10,14,100.00%,12,12,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,融合业务体验,增值业务与一次性费用不认可,101,88,2,11,90.00%,45,50,90.00%,45,50,90.74%,49,54,100.00%,50,50,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,354,351,2,1,88.30%,166,188,88.30%,166,188,86.07%,173,201,94.44%,170,180,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,融合业务体验,携出不顺利,7,6,0,1,100.00%,1,1,100.00%,1,1,0.00%,0,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,融合业务体验,离网受阻碍,17,16,0,1,100.00%,2,2,100.00%,2,2,100.00%,3,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,68,68,0,0,77.27%,17,22,77.27%,17,22,87.50%,21,24,95.24%,20,21,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,信息安全,--,--,251,243,1,7,83.64%,46,55,83.64%,46,55,74.14%,43,58,92.16%,47,51,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,信息安全,网络与信息安全,--,251,243,1,7,83.64%,46,55,83.64%,46,55,74.14%,43,58,92.16%,47,51,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,信息安全,网络与信息安全,安全规则引发用户不满,186,178,1,7,86.67%,39,45,86.67%,39,45,78.72%,37,47,92.86%,39,42,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,信息安全,网络与信息安全,安全风险导致用户不满,65,65,0,0,70.00%,7,10,70.00%,7,10,54.55%,6,11,88.89%,8,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,数字化,--,--,1598,1411,52,135,87.39%,506,572,87.39%,506,572,85.01%,533,620,92.75%,499,531,7,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,数字化,数字化问题,--,1598,1411,52,135,87.39%,506,572,87.39%,506,572,85.01%,533,620,92.75%,499,531,7,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,数字化,数字化问题,数字化能力不足,1598,1411,52,135,87.39%,506,572,87.39%,506,572,85.01%,533,620,92.75%,499,531,7,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,--,--,340,263,26,51,80.53%,91,113,80.53%,91,113,79.66%,94,118,86.54%,90,104,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,2I配送,--,30,21,2,7,72.73%,8,11,72.73%,8,11,54.55%,6,11,60.00%,6,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,2I配送,渠道服务不一致,16,14,2,0,66.67%,4,6,66.67%,4,6,50.00%,3,6,50.00%,3,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,2I配送,问题处理不及时、咨询不准确等,14,7,0,7,80.00%,4,5,80.00%,4,5,60.00%,3,5,75.00%,3,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,公众客户经理,--,2,1,0,1,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,公众客户经理,业务办理有差错,推诿办理,2,1,0,1,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,其他,--,2,1,0,1,0.00%,0,1,0.00%,0,1,0.00%,0,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,其他,其他,2,1,0,1,0.00%,0,1,0.00%,0,1,0.00%,0,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,手网短微等电子渠道,--,96,53,16,27,82.61%,19,23,82.61%,19,23,73.08%,19,26,88.89%,16,18,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,手网短微等电子渠道,业务办理有差错,推诿办理,2,2,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,手网短微等电子渠道,服务态度差,5,4,0,1,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,37,7,4,26,90.00%,9,10,90.00%,9,10,75.00%,9,12,100.00%,9,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,手网短微等电子渠道,渠道服务不一致,8,8,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,44,32,12,0,75.00%,9,12,75.00%,9,12,69.23%,9,13,75.00%,6,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,智家工程师,--,52,50,1,1,88.89%,24,27,88.89%,24,27,92.59%,25,27,88.89%,24,27,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,智家工程师,服务态度差,4,4,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,智家工程师,问题处理不及时、咨询不准确等,48,46,1,1,88.46%,23,26,88.46%,23,26,92.31%,24,26,88.46%,23,26,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,热线,--,40,34,2,4,69.23%,9,13,69.23%,9,13,78.57%,11,14,90.00%,9,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,热线,业务办理有差错,推诿办理,20,16,1,3,66.67%,6,9,66.67%,6,9,88.89%,8,9,87.50%,7,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,热线,服务态度差,1,0,0,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,热线,渠道服务不一致,12,12,0,0,66.67%,2,3,66.67%,2,3,50.00%,2,4,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,热线,问题处理不及时、咨询不准确等,7,6,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,营业厅,--,118,103,5,10,81.58%,31,38,81.58%,31,38,84.62%,33,39,89.47%,34,38,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,营业厅,业务办理有差错,推诿办理,78,65,4,9,80.00%,24,30,80.00%,24,30,80.65%,25,31,86.67%,26,30,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,营业厅,服务态度差,34,33,0,1,83.33%,5,6,83.33%,5,6,100.00%,6,6,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,渠道服务,营业厅,渠道服务不一致,6,5,1,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,--,--,4521,4219,253,49,93.92%,1266,1347,92.20%,201,217,89.63%,216,240,96.19%,202,209,1,94.25%,1065,1130,95.22%,1076,1130,98.77%,1044,1057,
+202304,12,2023/4/12,保定,网络质量,双线网络,--,1,0,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,双线网络,双线及非双线修障质量问题,1,0,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,固网网络体验,--,4039,3785,235,19,94.15%,1110,1179,91.84%,45,49,94.34%,50,53,95.74%,45,47,0,94.25%,1065,1130,95.22%,1076,1130,98.77%,1044,1057,
+202304,12,2023/4/12,保定,网络质量,固网网络体验,TV中断、不可用,182,157,24,1,98.21%,55,56,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,98.18%,54,55,100.00%,55,55,100.00%,49,49,
+202304,12,2023/4/12,保定,网络质量,固网网络体验,上网中断、不可用,3019,2918,92,9,95.08%,909,956,93.75%,30,32,97.06%,33,34,96.67%,29,30,0,95.13%,879,924,95.89%,886,924,98.73%,856,867,
+202304,12,2023/4/12,保定,网络质量,固网网络体验,上网建网影响客户,235,229,1,5,65.38%,17,26,75.00%,6,8,87.50%,7,8,87.50%,7,8,0,61.11%,11,18,50.00%,9,18,100.00%,15,15,
+202304,12,2023/4/12,保定,网络质量,固网网络体验,上网端网业不匹配,18,17,0,1,100.00%,4,4,100.00%,4,4,83.33%,5,6,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,固网网络体验,上网网络卡顿,277,159,116,2,90.70%,78,86,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,90.48%,76,84,94.05%,79,84,97.47%,77,79,
+202304,12,2023/4/12,保定,网络质量,固网网络体验,语音通信问题,308,305,2,1,92.16%,47,51,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,91.84%,45,49,95.92%,47,49,100.00%,47,47,
+202304,12,2023/4/12,保定,网络质量,物联网,--,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,物联网,上网网络卡顿,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,移网网络体验,--,480,433,17,30,92.31%,156,168,92.31%,156,168,88.30%,166,187,96.32%,157,162,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,移网网络体验,上网中断、不可用,108,81,2,25,89.74%,35,39,89.74%,35,39,92.50%,37,40,91.89%,34,37,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,移网网络体验,上网网络卡顿,170,165,4,1,96.72%,59,61,96.72%,59,61,94.20%,65,69,100.00%,60,60,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,移网网络体验,漫游争议,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,移网网络体验,短信使用问题,13,7,5,1,100.00%,1,1,100.00%,1,1,100.00%,2,2,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,保定,网络质量,移网网络体验,语音通信问题,188,179,6,3,89.55%,60,66,89.55%,60,66,80.26%,61,75,95.31%,61,63,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,--,--,--,4043,3637,220,186,90.94%,1194,1313,88.90%,673,757,85.45%,693,811,94.43%,661,700,0,93.71%,521,556,93.71%,521,556,97.13%,507,522,
+202304,12,2023/4/12,张家口,业务产品,--,--,1524,1351,41,132,90.03%,569,632,90.03%,569,632,86.03%,579,673,94.99%,550,579,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,固网业务体验,--,43,43,0,0,95.45%,21,22,95.45%,21,22,86.36%,19,22,100.00%,20,20,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,固网业务体验,不知情办理业务等糊涂消费,11,11,0,0,100.00%,7,7,100.00%,7,7,85.71%,6,7,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,固网业务体验,业务产品使用与规则争议,8,8,0,0,100.00%,3,3,100.00%,3,3,66.67%,2,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,固网业务体验,产品套餐资费争议,8,8,0,0,100.00%,5,5,100.00%,5,5,80.00%,4,5,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,固网业务体验,入网/携入受阻碍、不便捷,3,3,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,固网业务体验,增值业务与一次性费用不认可,6,6,0,0,75.00%,3,4,75.00%,3,4,100.00%,4,4,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,5,5,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,固网业务体验,离网受阻碍,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,移网业务体验,--,949,802,36,111,90.89%,359,395,90.89%,359,395,87.17%,367,421,94.48%,342,362,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,移网业务体验,不知情办理业务等糊涂消费,120,90,3,27,87.76%,43,49,87.76%,43,49,85.96%,49,57,97.87%,46,47,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,移网业务体验,业务产品使用与规则争议,306,281,13,12,86.54%,90,104,86.54%,90,104,86.73%,98,113,90.82%,89,98,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,移网业务体验,产品套餐资费争议,256,210,14,32,92.24%,107,116,92.24%,107,116,85.71%,102,119,94.29%,99,105,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,移网业务体验,入网/携入受阻碍、不便捷,12,10,1,1,100.00%,2,2,100.00%,2,2,100.00%,3,3,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,移网业务体验,增值业务与一次性费用不认可,63,30,0,33,96.88%,31,32,96.88%,31,32,87.50%,28,32,100.00%,29,29,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,144,138,4,2,92.11%,70,76,92.11%,70,76,88.89%,72,81,95.65%,66,69,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,移网业务体验,携出不顺利,3,2,0,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,移网业务体验,离网受阻碍,28,25,0,3,100.00%,10,10,100.00%,10,10,90.00%,9,10,100.00%,8,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,17,16,1,0,100.00%,5,5,100.00%,5,5,100.00%,5,5,80.00%,4,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,融合业务体验,--,532,506,5,21,87.91%,189,215,87.91%,189,215,83.91%,193,230,95.43%,188,197,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,融合业务体验,不知情办理业务等糊涂消费,112,106,1,5,93.33%,42,45,93.33%,42,45,83.67%,41,49,97.67%,42,43,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,融合业务体验,业务产品使用与规则争议,173,172,0,1,84.85%,56,66,84.85%,56,66,84.72%,61,72,91.67%,55,60,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,融合业务体验,产品套餐资费争议,67,59,1,7,90.91%,20,22,90.91%,20,22,81.82%,18,22,90.00%,18,20,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,融合业务体验,入网/携入受阻碍、不便捷,7,7,0,0,50.00%,1,2,50.00%,1,2,50.00%,1,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,融合业务体验,增值业务与一次性费用不认可,35,28,0,7,93.33%,14,15,93.33%,14,15,93.33%,14,15,100.00%,14,14,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,102,99,3,0,84.62%,44,52,84.62%,44,52,80.36%,45,56,97.87%,46,47,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,融合业务体验,携出不顺利,5,4,0,1,100.00%,2,2,100.00%,2,2,50.00%,1,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,融合业务体验,离网受阻碍,7,7,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,24,24,0,0,90.00%,9,10,90.00%,9,10,100.00%,11,11,100.00%,9,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,信息安全,--,--,95,89,4,2,69.23%,9,13,69.23%,9,13,73.33%,11,15,84.62%,11,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,信息安全,网络与信息安全,--,95,89,4,2,69.23%,9,13,69.23%,9,13,73.33%,11,15,84.62%,11,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,信息安全,网络与信息安全,安全规则引发用户不满,74,71,1,2,33.33%,2,6,33.33%,2,6,50.00%,4,8,66.67%,4,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,信息安全,网络与信息安全,安全风险导致用户不满,21,18,3,0,100.00%,7,7,100.00%,7,7,100.00%,7,7,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,政企业务,--,--,2,0,2,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,政企业务,基础业务(双线、IDC等),--,2,0,2,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,政企业务,基础业务(双线、IDC等),业务产品使用与规则争议,1,0,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,政企业务,基础业务(双线、IDC等),离网受阻碍,1,0,1,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,数字化,--,--,579,495,19,65,90.12%,219,243,90.12%,219,243,87.01%,221,254,94.59%,210,222,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,数字化,数字化问题,--,579,495,19,65,90.12%,219,243,90.12%,219,243,87.01%,221,254,94.59%,210,222,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,数字化,数字化问题,数字化能力不足,579,495,19,65,90.12%,219,243,90.12%,219,243,87.01%,221,254,94.59%,210,222,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,--,--,131,95,6,30,82.50%,33,40,82.50%,33,40,86.36%,38,44,94.74%,36,38,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,2I配送,--,10,7,0,3,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,2I配送,渠道服务不一致,5,5,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,2I配送,问题处理不及时、咨询不准确等,5,2,0,3,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,其他,--,1,0,1,0,,0,0,,0,0,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,其他,其他,1,0,1,0,,0,0,,0,0,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,手网短微等电子渠道,--,30,10,3,17,71.43%,10,14,71.43%,10,14,80.00%,12,15,91.67%,11,12,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,手网短微等电子渠道,业务办理有差错,推诿办理,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,20,1,2,17,75.00%,9,12,75.00%,9,12,75.00%,9,12,90.91%,10,11,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,9,8,1,0,50.00%,1,2,50.00%,1,2,100.00%,3,3,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,智家工程师,--,32,31,0,1,87.50%,7,8,87.50%,7,8,88.89%,8,9,87.50%,7,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,智家工程师,服务态度差,2,2,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,智家工程师,问题处理不及时、咨询不准确等,30,29,0,1,87.50%,7,8,87.50%,7,8,88.89%,8,9,87.50%,7,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,热线,--,7,4,1,2,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,热线,业务办理有差错,推诿办理,3,1,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,热线,渠道服务不一致,3,3,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,热线,问题处理不及时、咨询不准确等,1,0,0,1,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,营业厅,--,51,43,1,7,84.62%,11,13,84.62%,11,13,85.71%,12,14,100.00%,13,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,营业厅,业务办理有差错,推诿办理,44,36,1,7,83.33%,10,12,83.33%,10,12,83.33%,10,12,100.00%,12,12,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,营业厅,服务态度差,5,5,0,0,,0,0,,0,0,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,渠道服务,营业厅,渠道服务不一致,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,网络质量,--,--,2290,2101,167,22,92.81%,581,626,85.71%,60,70,81.82%,63,77,91.18%,62,68,0,93.71%,521,556,93.71%,521,556,97.13%,507,522,
+202304,12,2023/4/12,张家口,网络质量,固网网络体验,--,2097,1927,161,9,93.31%,530,568,75.00%,9,12,66.67%,10,15,72.73%,8,11,0,93.71%,521,556,93.71%,521,556,97.13%,507,522,
+202304,12,2023/4/12,张家口,网络质量,固网网络体验,TV中断、不可用,103,91,11,1,93.10%,27,29,,0,0,,0,0,,0,0,0,93.10%,27,29,96.55%,28,29,96.55%,28,29,
+202304,12,2023/4/12,张家口,网络质量,固网网络体验,上网中断、不可用,1606,1534,65,7,93.40%,439,470,77.78%,7,9,80.00%,8,10,75.00%,6,8,0,93.71%,432,461,93.71%,432,461,96.75%,417,431,
+202304,12,2023/4/12,张家口,网络质量,固网网络体验,上网建网影响客户,59,58,0,1,50.00%,1,2,0.00%,0,1,0.00%,0,1,0.00%,0,1,0,100.00%,1,1,0.00%,0,1,,0,0,
+202304,12,2023/4/12,张家口,网络质量,固网网络体验,上网端网业不匹配,6,6,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,网络质量,固网网络体验,上网网络卡顿,140,55,85,0,90.91%,40,44,,0,0,,0,0,,0,0,0,90.91%,40,44,90.91%,40,44,100.00%,43,43,
+202304,12,2023/4/12,张家口,网络质量,固网网络体验,语音通信问题,183,183,0,0,100.00%,21,21,,0,0,0.00%,0,2,,0,0,0,100.00%,21,21,100.00%,21,21,100.00%,19,19,
+202304,12,2023/4/12,张家口,网络质量,移网网络体验,--,193,174,6,13,87.93%,51,58,87.93%,51,58,85.48%,53,62,94.74%,54,57,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,网络质量,移网网络体验,上网中断、不可用,59,47,0,12,100.00%,18,18,100.00%,18,18,100.00%,18,18,100.00%,18,18,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,网络质量,移网网络体验,上网网络卡顿,47,42,4,1,81.25%,13,16,81.25%,13,16,82.35%,14,17,93.75%,15,16,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,网络质量,移网网络体验,漫游争议,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,网络质量,移网网络体验,短信使用问题,4,4,0,0,100.00%,2,2,100.00%,2,2,50.00%,1,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,张家口,网络质量,移网网络体验,语音通信问题,82,80,2,0,80.95%,17,21,80.95%,17,21,79.17%,19,24,90.00%,18,20,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,--,--,--,3723,3498,116,109,89.41%,1241,1385,86.81%,829,952,85.96%,882,1023,93.41%,822,877,3,95.15%,412,433,94.92%,411,433,98.25%,393,400,
+202304,12,2023/4/12,承德,业务产品,--,--,1634,1526,33,75,85.98%,644,746,85.98%,644,746,85.71%,696,809,93.05%,643,688,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,固网业务体验,--,28,27,1,0,69.23%,9,13,69.23%,9,13,93.75%,15,16,84.62%,11,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,固网业务体验,不知情办理业务等糊涂消费,4,4,0,0,50.00%,1,2,50.00%,1,2,100.00%,3,3,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,固网业务体验,业务产品使用与规则争议,4,4,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,固网业务体验,产品套餐资费争议,11,10,1,0,100.00%,5,5,100.00%,5,5,83.33%,5,6,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,固网业务体验,增值业务与一次性费用不认可,2,2,0,0,,0,0,,0,0,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,3,3,0,0,66.67%,2,3,66.67%,2,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,固网业务体验,离网受阻碍,3,3,0,0,0.00%,0,1,0.00%,0,1,100.00%,1,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,1,1,0,0,0.00%,0,1,0.00%,0,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,移网业务体验,--,937,840,27,70,86.49%,365,419,86.49%,365,419,87.36%,394,448,92.76%,359,384,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,移网业务体验,不知情办理业务等糊涂消费,120,98,3,19,84.91%,45,53,84.91%,45,53,90.91%,50,55,93.33%,42,45,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,移网业务体验,业务产品使用与规则争议,284,269,8,7,81.30%,100,121,81.30%,100,121,83.46%,111,131,91.30%,105,113,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,移网业务体验,产品套餐资费争议,312,284,7,21,88.89%,128,143,88.89%,128,143,86.62%,136,156,93.28%,125,133,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,移网业务体验,入网/携入受阻碍、不便捷,15,11,3,1,100.00%,7,7,100.00%,7,7,100.00%,7,7,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,移网业务体验,增值业务与一次性费用不认可,45,31,0,14,92.31%,24,26,92.31%,24,26,88.89%,24,27,96.00%,24,25,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,103,98,3,2,88.24%,45,51,88.24%,45,51,90.38%,47,52,93.33%,42,45,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,移网业务体验,携出不顺利,10,4,0,6,0.00%,0,1,0.00%,0,1,100.00%,2,2,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,移网业务体验,离网受阻碍,16,14,2,0,100.00%,7,7,100.00%,7,7,100.00%,8,8,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,32,31,1,0,90.00%,9,10,90.00%,9,10,90.00%,9,10,88.89%,8,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,融合业务体验,--,669,659,5,5,85.99%,270,314,85.99%,270,314,83.19%,287,345,93.81%,273,291,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,融合业务体验,不知情办理业务等糊涂消费,114,110,2,2,90.91%,50,55,90.91%,50,55,88.14%,52,59,93.48%,43,46,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,融合业务体验,业务产品使用与规则争议,218,217,0,1,81.18%,69,85,81.18%,69,85,77.78%,77,99,92.41%,73,79,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,融合业务体验,产品套餐资费争议,112,110,1,1,83.02%,44,53,83.02%,44,53,86.44%,51,59,94.12%,48,51,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,融合业务体验,入网/携入受阻碍、不便捷,14,14,0,0,75.00%,6,8,75.00%,6,8,66.67%,6,9,87.50%,7,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,融合业务体验,增值业务与一次性费用不认可,52,50,1,1,89.29%,25,28,89.29%,25,28,86.21%,25,29,96.30%,26,27,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,103,103,0,0,87.27%,48,55,87.27%,48,55,81.03%,47,58,92.16%,47,51,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,融合业务体验,携出不顺利,3,3,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,融合业务体验,离网受阻碍,11,10,1,0,100.00%,6,6,100.00%,6,6,83.33%,5,6,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,42,42,0,0,91.67%,22,24,91.67%,22,24,92.31%,24,26,100.00%,23,23,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,信息安全,--,--,117,108,3,6,82.50%,33,40,82.50%,33,40,80.49%,33,41,89.74%,35,39,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,信息安全,网络与信息安全,--,117,108,3,6,82.50%,33,40,82.50%,33,40,80.49%,33,41,89.74%,35,39,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,信息安全,网络与信息安全,安全规则引发用户不满,68,62,1,5,95.83%,23,24,95.83%,23,24,92.00%,23,25,95.65%,22,23,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,信息安全,网络与信息安全,安全风险导致用户不满,49,46,2,1,62.50%,10,16,62.50%,10,16,62.50%,10,16,81.25%,13,16,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,政企业务,--,--,1,0,1,0,0.00%,0,1,0.00%,0,1,0.00%,0,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,政企业务,基础业务(双线、IDC等),--,1,0,1,0,0.00%,0,1,0.00%,0,1,0.00%,0,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,政企业务,基础业务(双线、IDC等),业务产品使用与规则争议,1,0,1,0,0.00%,0,1,0.00%,0,1,0.00%,0,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,数字化,--,--,713,667,17,29,87.46%,286,326,87.46%,286,326,87.08%,310,355,94.41%,287,303,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,数字化,数字化问题,--,713,667,17,29,87.46%,286,326,87.46%,286,326,87.08%,310,355,94.41%,287,303,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,数字化,数字化问题,数字化能力不足,713,667,17,29,87.46%,286,326,87.46%,286,326,87.08%,310,355,94.41%,287,303,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,--,--,118,104,2,12,88.89%,48,54,88.89%,48,54,89.09%,49,55,98.00%,49,50,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,2I配送,--,13,10,0,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,2I配送,渠道服务不一致,6,5,0,1,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,2I配送,问题处理不及时、咨询不准确等,7,5,0,2,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,手网短微等电子渠道,--,25,20,2,3,92.86%,13,14,92.86%,13,14,86.67%,13,15,100.00%,13,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,手网短微等电子渠道,服务态度差,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,9,6,0,3,83.33%,5,6,83.33%,5,6,83.33%,5,6,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,15,13,2,0,100.00%,8,8,100.00%,8,8,88.89%,8,9,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,智家工程师,--,15,15,0,0,83.33%,5,6,83.33%,5,6,83.33%,5,6,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,智家工程师,问题处理不及时、咨询不准确等,15,15,0,0,83.33%,5,6,83.33%,5,6,83.33%,5,6,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,热线,--,17,17,0,0,100.00%,4,4,100.00%,4,4,100.00%,3,3,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,热线,业务办理有差错,推诿办理,11,11,0,0,100.00%,4,4,100.00%,4,4,100.00%,3,3,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,热线,渠道服务不一致,6,6,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,营业厅,--,48,42,0,6,85.19%,23,27,85.19%,23,27,89.29%,25,28,96.00%,24,25,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,营业厅,业务办理有差错,推诿办理,39,33,0,6,83.33%,20,24,83.33%,20,24,88.00%,22,25,95.45%,21,22,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,营业厅,服务态度差,7,7,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,渠道服务,营业厅,渠道服务不一致,2,2,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,网络质量,--,--,1852,1759,77,16,94.85%,516,544,93.69%,104,111,88.89%,104,117,95.96%,95,99,0,95.15%,412,433,94.92%,411,433,98.25%,393,400,
+202304,12,2023/4/12,承德,网络质量,固网网络体验,--,1610,1528,75,7,95.09%,426,448,93.33%,14,15,87.50%,14,16,86.67%,13,15,0,95.15%,412,433,94.92%,411,433,98.25%,393,400,
+202304,12,2023/4/12,承德,网络质量,固网网络体验,TV中断、不可用,141,126,15,0,97.62%,41,42,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,97.56%,40,41,97.56%,40,41,100.00%,38,38,
+202304,12,2023/4/12,承德,网络质量,固网网络体验,上网中断、不可用,1167,1135,27,5,94.56%,330,349,87.50%,7,8,87.50%,7,8,75.00%,6,8,0,94.72%,323,341,94.43%,322,341,98.09%,308,314,
+202304,12,2023/4/12,承德,网络质量,固网网络体验,上网建网影响客户,61,59,0,2,85.71%,6,7,100.00%,2,2,66.67%,2,3,100.00%,2,2,0,80.00%,4,5,80.00%,4,5,80.00%,4,5,
+202304,12,2023/4/12,承德,网络质量,固网网络体验,上网端网业不匹配,6,6,0,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,网络质量,固网网络体验,上网网络卡顿,96,64,32,0,95.45%,21,22,,0,0,,0,0,,0,0,0,95.45%,21,22,100.00%,22,22,100.00%,21,21,
+202304,12,2023/4/12,承德,网络质量,固网网络体验,语音通信问题,139,138,1,0,100.00%,25,25,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,100.00%,24,24,95.83%,23,24,100.00%,22,22,
+202304,12,2023/4/12,承德,网络质量,物联网,--,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,网络质量,物联网,上网中断、不可用,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,网络质量,移网网络体验,--,241,230,2,9,93.75%,90,96,93.75%,90,96,89.11%,90,101,97.62%,82,84,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,网络质量,移网网络体验,上网中断、不可用,69,61,1,7,94.29%,33,35,94.29%,33,35,91.89%,34,37,96.77%,30,31,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,网络质量,移网网络体验,上网网络卡顿,67,66,0,1,100.00%,19,19,100.00%,19,19,90.00%,18,20,100.00%,16,16,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,网络质量,移网网络体验,短信使用问题,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,承德,网络质量,移网网络体验,语音通信问题,104,102,1,1,90.24%,37,41,90.24%,37,41,86.05%,37,43,97.22%,35,36,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,--,--,--,6536,6032,287,217,90.59%,1954,2150,88.28%,1266,1427,83.19%,1282,1534,94.42%,1251,1318,7,95.16%,688,723,94.33%,682,723,98.23%,667,679,
+202304,12,2023/4/12,廊坊,业务产品,--,--,2616,2409,59,148,86.91%,916,1047,86.91%,916,1047,82.72%,938,1127,93.76%,916,970,7,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,固网业务体验,--,102,99,2,1,87.50%,35,40,87.50%,35,40,93.33%,42,45,89.19%,33,37,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,固网业务体验,不知情办理业务等糊涂消费,14,13,1,0,100.00%,6,6,100.00%,6,6,100.00%,7,7,75.00%,3,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,固网业务体验,业务产品使用与规则争议,23,23,0,0,100.00%,7,7,100.00%,7,7,100.00%,8,8,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,固网业务体验,产品套餐资费争议,31,31,0,0,81.82%,9,11,81.82%,9,11,91.67%,11,12,90.00%,9,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,固网业务体验,入网/携入受阻碍、不便捷,5,5,0,0,0.00%,0,1,0.00%,0,1,0.00%,0,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,固网业务体验,增值业务与一次性费用不认可,11,10,0,1,66.67%,4,6,66.67%,4,6,85.71%,6,7,83.33%,5,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,6,6,0,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,固网业务体验,离网受阻碍,7,7,0,0,100.00%,3,3,100.00%,3,3,100.00%,4,4,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,5,4,1,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,移网业务体验,--,1434,1255,47,132,87.68%,498,561,87.68%,498,561,82.68%,506,605,92.25%,488,522,7,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,移网业务体验,不知情办理业务等糊涂消费,232,175,6,51,84.76%,89,105,84.76%,89,105,77.19%,88,114,93.88%,92,98,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,移网业务体验,业务产品使用与规则争议,479,453,17,9,87.35%,145,160,87.35%,145,160,85.33%,157,178,90.85%,139,147,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,移网业务体验,产品套餐资费争议,328,280,5,43,89.36%,126,140,89.36%,126,140,85.14%,126,147,91.04%,122,133,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,移网业务体验,入网/携入受阻碍、不便捷,32,30,1,1,92.86%,13,14,92.86%,13,14,85.71%,12,14,92.31%,12,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,移网业务体验,增值业务与一次性费用不认可,94,65,6,23,97.14%,34,35,97.14%,34,35,91.67%,33,36,91.43%,32,35,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,173,163,10,0,84.29%,59,70,84.29%,59,70,76.32%,58,76,95.24%,60,63,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,移网业务体验,携出不顺利,8,4,0,4,50.00%,1,2,50.00%,1,2,50.00%,1,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,移网业务体验,离网受阻碍,35,34,1,0,100.00%,15,15,100.00%,15,15,88.24%,15,17,85.71%,12,14,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,53,51,1,1,80.00%,16,20,80.00%,16,20,76.19%,16,21,100.00%,17,17,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,融合业务体验,--,1080,1055,10,15,85.87%,383,446,85.87%,383,446,81.76%,390,477,96.11%,395,411,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,融合业务体验,不知情办理业务等糊涂消费,193,183,4,6,83.95%,68,81,83.95%,68,81,79.07%,68,86,93.42%,71,76,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,融合业务体验,业务产品使用与规则争议,368,366,2,0,91.27%,115,126,91.27%,115,126,82.73%,115,139,95.58%,108,113,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,融合业务体验,产品套餐资费争议,126,123,1,2,80.77%,42,52,80.77%,42,52,80.00%,44,55,95.65%,44,46,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,融合业务体验,入网/携入受阻碍、不便捷,23,23,0,0,85.71%,6,7,85.71%,6,7,85.71%,6,7,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,融合业务体验,增值业务与一次性费用不认可,65,60,1,4,88.57%,31,35,88.57%,31,35,80.00%,28,35,100.00%,33,33,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,187,185,0,2,80.43%,74,92,80.43%,74,92,80.61%,79,98,97.73%,86,88,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,融合业务体验,携出不顺利,1,1,0,0,0.00%,0,1,0.00%,0,1,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,融合业务体验,离网受阻碍,38,35,2,1,78.57%,11,14,78.57%,11,14,60.00%,9,15,91.67%,11,12,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,79,79,0,0,94.74%,36,38,94.74%,36,38,97.56%,40,41,97.30%,36,37,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,信息安全,--,--,199,193,2,4,89.36%,42,47,89.36%,42,47,81.13%,43,53,93.18%,41,44,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,信息安全,网络与信息安全,--,199,193,2,4,89.36%,42,47,89.36%,42,47,81.13%,43,53,93.18%,41,44,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,信息安全,网络与信息安全,安全规则引发用户不满,133,127,2,4,93.94%,31,33,93.94%,31,33,86.11%,31,36,93.33%,28,30,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,信息安全,网络与信息安全,安全风险导致用户不满,66,66,0,0,78.57%,11,14,78.57%,11,14,70.59%,12,17,92.86%,13,14,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,政企业务,--,--,3,2,1,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,政企业务,基础业务(双线、IDC等),--,1,0,1,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,政企业务,基础业务(双线、IDC等),业务产品使用与规则争议,1,0,1,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,政企业务,物联网2C,--,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,政企业务,物联网2C,业务产品使用与规则争议,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,数字化,--,--,966,883,19,64,88.94%,362,406,88.94%,362,406,85.12%,366,429,94.13%,353,374,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,数字化,数字化问题,--,966,883,19,64,88.94%,362,406,88.94%,362,406,85.12%,366,429,94.13%,353,374,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,数字化,数字化问题,数字化能力不足,966,883,19,64,88.94%,362,406,88.94%,362,406,85.12%,366,429,94.13%,353,374,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,--,--,233,203,6,24,89.66%,78,87,89.66%,78,87,84.04%,79,94,92.31%,72,78,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,2I配送,--,13,11,0,2,100.00%,3,3,100.00%,3,3,100.00%,4,4,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,2I配送,渠道服务不一致,6,6,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,2I配送,问题处理不及时、咨询不准确等,7,5,0,2,100.00%,1,1,100.00%,1,1,100.00%,2,2,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,公众客户经理,--,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,公众客户经理,业务办理有差错,推诿办理,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,其他,--,3,1,0,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,其他,其他,3,1,0,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,手网短微等电子渠道,--,65,47,4,14,92.00%,23,25,92.00%,23,25,85.19%,23,27,95.45%,21,22,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,手网短微等电子渠道,业务办理有差错,推诿办理,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,手网短微等电子渠道,服务态度差,3,3,0,0,,0,0,,0,0,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,24,10,0,14,100.00%,13,13,100.00%,13,13,84.62%,11,13,100.00%,11,11,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,手网短微等电子渠道,渠道服务不一致,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,35,31,4,0,81.82%,9,11,81.82%,9,11,83.33%,10,12,90.91%,10,11,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,智家工程师,--,62,60,0,2,92.31%,24,26,92.31%,24,26,82.14%,23,28,87.50%,21,24,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,智家工程师,服务态度差,4,4,0,0,,0,0,,0,0,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,智家工程师,问题处理不及时、咨询不准确等,58,56,0,2,92.31%,24,26,92.31%,24,26,81.48%,22,27,87.50%,21,24,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,热线,--,19,16,1,2,72.73%,8,11,72.73%,8,11,81.82%,9,11,87.50%,7,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,热线,业务办理有差错,推诿办理,9,7,1,1,80.00%,4,5,80.00%,4,5,100.00%,5,5,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,热线,服务态度差,2,1,0,1,50.00%,1,2,50.00%,1,2,50.00%,1,2,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,热线,渠道服务不一致,5,5,0,0,75.00%,3,4,75.00%,3,4,75.00%,3,4,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,热线,问题处理不及时、咨询不准确等,3,3,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,营业厅,--,70,67,1,2,90.00%,18,20,90.00%,18,20,81.82%,18,22,94.74%,18,19,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,营业厅,业务办理有差错,推诿办理,45,43,1,1,86.67%,13,15,86.67%,13,15,75.00%,12,16,93.33%,14,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,营业厅,服务态度差,22,21,0,1,100.00%,4,4,100.00%,4,4,100.00%,5,5,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,渠道服务,营业厅,渠道服务不一致,3,3,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,网络质量,--,--,3485,3225,219,41,94.73%,916,967,93.44%,228,244,85.27%,220,258,98.22%,221,225,0,95.16%,688,723,94.33%,682,723,98.23%,667,679,
+202304,12,2023/4/12,廊坊,网络质量,固网网络体验,--,3085,2860,206,19,94.67%,746,788,89.23%,58,65,86.36%,57,66,96.43%,54,56,0,95.16%,688,723,94.33%,682,723,98.23%,667,679,
+202304,12,2023/4/12,廊坊,网络质量,固网网络体验,TV中断、不可用,145,130,15,0,97.44%,38,39,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,97.37%,37,38,97.37%,37,38,100.00%,37,37,
+202304,12,2023/4/12,廊坊,网络质量,固网网络体验,上网中断、不可用,2353,2269,77,7,95.40%,601,630,93.62%,44,47,95.74%,45,47,94.74%,36,38,0,95.54%,557,583,94.68%,552,583,98.55%,543,551,
+202304,12,2023/4/12,廊坊,网络质量,固网网络体验,上网建网影响客户,111,103,1,7,77.78%,7,9,75.00%,3,4,20.00%,1,5,100.00%,4,4,0,80.00%,4,5,80.00%,4,5,75.00%,3,4,
+202304,12,2023/4/12,廊坊,网络质量,固网网络体验,上网端网业不匹配,19,16,0,3,70.00%,7,10,70.00%,7,10,70.00%,7,10,100.00%,10,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,网络质量,固网网络体验,上网网络卡顿,263,152,110,1,91.67%,66,72,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,91.43%,64,70,91.43%,64,70,96.77%,60,62,
+202304,12,2023/4/12,廊坊,网络质量,固网网络体验,语音通信问题,194,190,3,1,96.43%,27,28,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,96.30%,26,27,92.59%,25,27,96.00%,24,25,
+202304,12,2023/4/12,廊坊,网络质量,移网网络体验,--,400,365,13,22,94.97%,170,179,94.97%,170,179,84.90%,163,192,98.82%,167,169,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,网络质量,移网网络体验,上网中断、不可用,105,87,2,16,100.00%,37,37,100.00%,37,37,81.82%,36,44,97.22%,35,36,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,网络质量,移网网络体验,上网网络卡顿,133,125,6,2,89.86%,62,69,89.86%,62,69,90.14%,64,71,100.00%,62,62,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,网络质量,移网网络体验,短信使用问题,7,1,3,3,100.00%,2,2,100.00%,2,2,100.00%,3,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,廊坊,网络质量,移网网络体验,语音通信问题,155,152,2,1,97.18%,69,71,97.18%,69,71,81.08%,60,74,98.55%,68,69,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,--,--,--,8145,7585,280,280,86.38%,2620,3022,84.32%,1850,2183,82.02%,1948,2364,92.53%,1896,2038,11,91.78%,770,839,91.18%,765,839,96.90%,751,775,
+202304,12,2023/4/12,沧州,业务产品,--,--,3711,3426,71,214,83.67%,1409,1673,83.67%,1409,1673,81.43%,1482,1809,92.46%,1448,1555,11,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,固网业务体验,--,95,93,0,2,82.22%,37,45,82.22%,37,45,81.63%,40,49,89.19%,33,37,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,固网业务体验,不知情办理业务等糊涂消费,25,25,0,0,90.91%,10,11,90.91%,10,11,83.33%,10,12,100.00%,9,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,固网业务体验,业务产品使用与规则争议,13,13,0,0,40.00%,2,5,40.00%,2,5,50.00%,3,6,80.00%,4,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,固网业务体验,产品套餐资费争议,23,22,0,1,85.71%,12,14,85.71%,12,14,92.86%,13,14,92.31%,12,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,固网业务体验,入网/携入受阻碍、不便捷,4,3,0,1,,0,0,,0,0,100.00%,1,1,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,固网业务体验,增值业务与一次性费用不认可,11,11,0,0,100.00%,4,4,100.00%,4,4,100.00%,5,5,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,10,10,0,0,100.00%,7,7,100.00%,7,7,85.71%,6,7,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,固网业务体验,离网受阻碍,6,6,0,0,50.00%,2,4,50.00%,2,4,50.00%,2,4,33.33%,1,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,3,3,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,移网业务体验,--,2079,1832,62,185,84.68%,796,929,84.68%,796,929,82.59%,835,1000,92.26%,810,867,11,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,移网业务体验,不知情办理业务等糊涂消费,312,243,5,64,79.87%,127,159,79.87%,127,159,85.47%,147,172,93.46%,143,153,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,移网业务体验,业务产品使用与规则争议,623,594,20,9,82.54%,208,247,82.54%,208,247,80.29%,220,269,88.74%,205,226,5,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,移网业务体验,产品套餐资费争议,471,392,16,63,86.60%,181,203,86.60%,181,203,82.43%,183,216,91.00%,182,194,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,移网业务体验,入网/携入受阻碍、不便捷,25,24,1,0,100.00%,4,4,100.00%,4,4,60.00%,3,5,66.67%,2,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,移网业务体验,增值业务与一次性费用不认可,143,99,6,38,86.67%,65,75,86.67%,65,75,86.08%,68,79,94.20%,65,69,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,395,386,8,1,85.71%,168,196,85.71%,168,196,81.90%,172,210,96.11%,173,180,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,移网业务体验,携出不顺利,9,3,0,6,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,移网业务体验,离网受阻碍,50,47,3,0,100.00%,20,20,100.00%,20,20,90.48%,19,21,100.00%,20,20,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,51,44,3,4,91.30%,21,23,91.30%,21,23,80.77%,21,26,90.00%,18,20,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,融合业务体验,--,1537,1501,9,27,82.40%,576,699,82.40%,576,699,79.87%,607,760,92.93%,605,651,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,融合业务体验,不知情办理业务等糊涂消费,283,275,0,8,82.31%,107,130,82.31%,107,130,81.82%,117,143,93.39%,113,121,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,融合业务体验,业务产品使用与规则争议,527,524,1,2,77.13%,172,223,77.13%,172,223,74.49%,181,243,92.68%,190,205,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,融合业务体验,产品套餐资费争议,177,172,2,3,80.82%,59,73,80.82%,59,73,82.56%,71,86,88.06%,59,67,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,融合业务体验,入网/携入受阻碍、不便捷,28,28,0,0,100.00%,11,11,100.00%,11,11,100.00%,11,11,100.00%,11,11,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,融合业务体验,增值业务与一次性费用不认可,109,95,3,11,88.68%,47,53,88.68%,47,53,81.03%,47,58,97.87%,46,47,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,320,316,3,1,88.62%,148,167,88.62%,148,167,82.95%,146,176,94.38%,151,160,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,融合业务体验,携出不顺利,9,8,0,1,50.00%,1,2,50.00%,1,2,50.00%,1,2,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,融合业务体验,离网受阻碍,19,18,0,1,85.71%,6,7,85.71%,6,7,71.43%,5,7,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,65,65,0,0,75.76%,25,33,75.76%,25,33,82.35%,28,34,87.10%,27,31,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,信息安全,--,--,186,184,0,2,86.75%,72,83,86.75%,72,83,84.27%,75,89,92.50%,74,80,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,信息安全,网络与信息安全,--,186,184,0,2,86.75%,72,83,86.75%,72,83,84.27%,75,89,92.50%,74,80,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,信息安全,网络与信息安全,安全规则引发用户不满,117,115,0,2,86.00%,43,50,86.00%,43,50,83.33%,45,54,91.49%,43,47,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,信息安全,网络与信息安全,安全风险导致用户不满,69,69,0,0,87.88%,29,33,87.88%,29,33,85.71%,30,35,93.94%,31,33,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,政企业务,--,--,1,0,1,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,政企业务,基础业务(双线、IDC等),--,1,0,1,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,政企业务,基础业务(双线、IDC等),业务产品使用与规则争议,1,0,1,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,数字化,--,--,1225,1102,33,90,86.09%,458,526,86.09%,458,526,84.46%,489,573,90.78%,453,493,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,数字化,数字化问题,--,1225,1102,33,90,86.09%,458,526,86.09%,458,526,84.46%,489,573,90.78%,453,493,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,数字化,数字化问题,携转相关信息化故障,2,2,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,数字化,数字化问题,数字化能力不足,1223,1100,33,90,86.09%,458,526,86.09%,458,526,84.46%,489,573,90.78%,453,493,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,--,--,278,238,8,32,81.31%,87,107,81.31%,87,107,83.05%,98,118,86.87%,86,99,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,2I配送,--,9,4,2,3,66.67%,2,3,66.67%,2,3,100.00%,4,4,66.67%,2,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,2I配送,渠道服务不一致,4,2,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,2I配送,问题处理不及时、咨询不准确等,5,2,1,2,50.00%,1,2,50.00%,1,2,100.00%,3,3,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,公众客户经理,--,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,公众客户经理,业务办理有差错,推诿办理,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,其他,--,3,1,0,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,其他,其他,3,1,0,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,手网短微等电子渠道,--,48,31,5,12,80.00%,16,20,80.00%,16,20,71.43%,15,21,87.50%,14,16,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,20,9,1,10,100.00%,9,9,100.00%,9,9,80.00%,8,10,87.50%,7,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,28,22,4,2,63.64%,7,11,63.64%,7,11,63.64%,7,11,87.50%,7,8,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,智家工程师,--,67,67,0,0,84.62%,22,26,84.62%,22,26,89.66%,26,29,84.62%,22,26,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,智家工程师,服务态度差,4,4,0,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,智家工程师,问题处理不及时、咨询不准确等,63,63,0,0,82.61%,19,23,82.61%,19,23,88.46%,23,26,82.61%,19,23,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,热线,--,24,20,0,4,81.82%,9,11,81.82%,9,11,75.00%,9,12,90.91%,10,11,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,热线,业务办理有差错,推诿办理,15,13,0,2,83.33%,5,6,83.33%,5,6,71.43%,5,7,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,热线,服务态度差,2,0,0,2,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,热线,渠道服务不一致,4,4,0,0,100.00%,4,4,100.00%,4,4,100.00%,4,4,75.00%,3,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,热线,问题处理不及时、咨询不准确等,3,3,0,0,0.00%,0,1,0.00%,0,1,0.00%,0,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,营业厅,--,126,114,1,11,80.00%,36,45,80.00%,36,45,84.00%,42,50,87.80%,36,41,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,营业厅,业务办理有差错,推诿办理,91,81,0,10,86.11%,31,36,86.11%,31,36,87.18%,34,39,90.91%,30,33,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,营业厅,服务态度差,32,31,1,0,42.86%,3,7,42.86%,3,7,66.67%,6,9,83.33%,5,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,渠道服务,营业厅,渠道服务不一致,3,2,0,1,100.00%,2,2,100.00%,2,2,100.00%,2,2,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,网络质量,--,--,3967,3735,200,32,90.76%,1051,1158,88.09%,281,319,84.15%,292,347,94.72%,287,303,0,91.78%,770,839,91.18%,765,839,96.90%,751,775,
+202304,12,2023/4/12,沧州,网络质量,双线网络,--,1,0,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,网络质量,双线网络,双线及非双线修障质量问题,1,0,1,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,网络质量,固网网络体验,--,3361,3159,188,14,90.88%,797,877,71.05%,27,38,76.74%,33,43,81.58%,31,38,0,91.78%,770,839,91.18%,765,839,96.90%,751,775,
+202304,12,2023/4/12,沧州,网络质量,固网网络体验,TV中断、不可用,159,140,17,2,94.12%,32,34,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,93.75%,30,32,87.50%,28,32,96.77%,30,31,
+202304,12,2023/4/12,沧州,网络质量,固网网络体验,上网中断、不可用,2522,2450,65,7,92.62%,665,718,89.47%,17,19,90.48%,19,21,89.47%,17,19,0,92.70%,648,699,91.85%,642,699,97.05%,625,644,
+202304,12,2023/4/12,沧州,网络质量,固网网络体验,上网建网影响客户,243,239,0,4,44.00%,11,25,30.00%,3,10,46.15%,6,13,60.00%,6,10,0,53.33%,8,15,53.33%,8,15,83.33%,10,12,
+202304,12,2023/4/12,沧州,网络质量,固网网络体验,上网端网业不匹配,5,5,0,0,33.33%,1,3,33.33%,1,3,66.67%,2,3,66.67%,2,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,网络质量,固网网络体验,上网网络卡顿,206,103,103,0,87.93%,51,58,,0,0,,0,0,,0,0,0,87.93%,51,58,91.38%,53,58,98.18%,54,55,
+202304,12,2023/4/12,沧州,网络质量,固网网络体验,语音通信问题,226,222,3,1,94.87%,37,39,100.00%,4,4,100.00%,4,4,100.00%,4,4,0,94.29%,33,35,97.14%,34,35,96.97%,32,33,
+202304,12,2023/4/12,沧州,网络质量,移网网络体验,--,605,576,11,18,90.39%,254,281,90.39%,254,281,85.20%,259,304,96.60%,256,265,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,网络质量,移网网络体验,上网中断、不可用,133,116,3,14,90.77%,59,65,90.77%,59,65,90.14%,64,71,100.00%,59,59,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,网络质量,移网网络体验,上网网络卡顿,148,147,1,0,93.33%,70,75,93.33%,70,75,93.90%,77,82,95.83%,69,72,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,网络质量,移网网络体验,短信使用问题,10,7,2,1,33.33%,1,3,33.33%,1,3,33.33%,1,3,33.33%,1,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,沧州,网络质量,移网网络体验,语音通信问题,314,306,5,3,89.86%,124,138,89.86%,124,138,79.05%,117,148,96.95%,127,131,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,--,--,--,4090,3770,151,169,91.32%,1472,1608,89.40%,919,1024,87.06%,955,1093,94.54%,901,949,4,94.69%,553,584,94.01%,549,584,98.36%,539,548,
+202304,12,2023/4/12,衡水,业务产品,--,--,1806,1665,23,118,88.95%,749,839,88.95%,749,839,86.64%,785,903,94.37%,737,778,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,固网业务体验,--,50,49,0,1,96.30%,26,27,96.30%,26,27,92.59%,25,27,88.46%,23,26,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,固网业务体验,不知情办理业务等糊涂消费,20,20,0,0,90.00%,9,10,90.00%,9,10,90.00%,9,10,70.00%,7,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,固网业务体验,业务产品使用与规则争议,10,10,0,0,100.00%,6,6,100.00%,6,6,100.00%,6,6,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,固网业务体验,产品套餐资费争议,9,9,0,0,100.00%,4,4,100.00%,4,4,100.00%,4,4,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,固网业务体验,入网/携入受阻碍、不便捷,2,2,0,0,100.00%,2,2,100.00%,2,2,50.00%,1,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,固网业务体验,增值业务与一次性费用不认可,2,1,0,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,固网业务体验,宣传不清晰、宣传过度、强推产品,3,3,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,固网业务体验,离网受阻碍,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,移网业务体验,--,945,834,15,96,88.81%,373,417,88.81%,373,417,85.81%,387,448,93.64%,368,390,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,移网业务体验,不知情办理业务等糊涂消费,153,121,1,31,84.93%,62,73,84.93%,62,73,79.22%,61,77,91.18%,62,68,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,移网业务体验,业务产品使用与规则争议,275,260,3,12,89.08%,106,119,89.08%,106,119,84.92%,107,126,97.30%,108,111,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,移网业务体验,产品套餐资费争议,224,191,3,30,88.46%,92,102,88.46%,92,102,89.19%,99,109,90.63%,87,94,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,移网业务体验,入网/携入受阻碍、不便捷,15,13,1,1,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,移网业务体验,增值业务与一次性费用不认可,62,46,0,16,90.00%,27,29,90.00%,27,29,87.88%,29,32,93.33%,28,29,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,158,152,4,2,91.03%,71,78,91.03%,71,78,89.29%,75,84,94.52%,69,73,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,移网业务体验,携出不顺利,5,3,0,2,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,移网业务体验,离网受阻碍,19,16,3,0,100.00%,3,3,100.00%,3,3,66.67%,2,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,34,32,0,2,90.00%,9,10,90.00%,9,10,78.57%,11,14,88.89%,8,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,融合业务体验,--,811,782,8,21,88.61%,350,395,88.61%,350,395,87.15%,373,428,95.58%,346,362,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,融合业务体验,不知情办理业务等糊涂消费,164,154,2,8,87.80%,72,82,87.80%,72,82,90.80%,79,87,98.59%,70,71,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,融合业务体验,业务产品使用与规则争议,246,244,2,0,87.16%,95,109,87.16%,95,109,82.11%,101,123,93.81%,91,97,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,融合业务体验,产品套餐资费争议,104,96,1,7,89.47%,51,57,89.47%,51,57,87.93%,51,58,94.64%,53,56,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,融合业务体验,入网/携入受阻碍、不便捷,9,9,0,0,50.00%,1,2,50.00%,1,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,融合业务体验,增值业务与一次性费用不认可,71,67,0,4,91.89%,34,37,91.89%,34,37,89.74%,35,39,100.00%,35,35,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,172,168,3,1,91.01%,81,89,91.01%,81,89,90.82%,89,98,94.12%,80,85,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,融合业务体验,携出不顺利,3,2,0,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,融合业务体验,离网受阻碍,6,6,0,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,36,36,0,0,80.00%,12,15,80.00%,12,15,70.59%,12,17,92.31%,12,13,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,信息安全,--,--,91,88,1,2,92.31%,24,26,92.31%,24,26,88.46%,23,26,95.45%,21,22,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,信息安全,网络与信息安全,--,91,88,1,2,92.31%,24,26,92.31%,24,26,88.46%,23,26,95.45%,21,22,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,信息安全,网络与信息安全,安全规则引发用户不满,54,51,1,2,93.75%,15,16,93.75%,15,16,93.75%,15,16,100.00%,12,12,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,信息安全,网络与信息安全,安全风险导致用户不满,37,37,0,0,90.00%,9,10,90.00%,9,10,80.00%,8,10,90.00%,9,10,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,数字化,--,--,605,546,7,52,88.36%,243,273,88.36%,243,273,87.29%,254,289,93.25%,235,250,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,数字化,数字化问题,--,605,546,7,52,88.36%,243,273,88.36%,243,273,87.29%,254,289,93.25%,235,250,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,数字化,数字化问题,数字化能力不足,605,546,7,52,88.36%,243,273,88.36%,243,273,87.29%,254,289,93.25%,235,250,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,--,--,173,142,7,24,87.67%,64,73,87.67%,64,73,86.49%,64,74,93.85%,61,65,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,2I配送,--,5,3,0,2,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,2I配送,问题处理不及时、咨询不准确等,5,3,0,2,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,公众客户经理,--,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,公众客户经理,业务办理有差错,推诿办理,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,其他,--,3,2,0,1,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,其他,其他,3,2,0,1,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,手网短微等电子渠道,--,40,23,6,11,87.50%,14,16,87.50%,14,16,81.25%,13,16,92.86%,13,14,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,手网短微等电子渠道,业务办理有差错,推诿办理,4,2,2,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,手网短微等电子渠道,服务态度差,1,1,0,0,0.00%,0,1,0.00%,0,1,0.00%,0,1,0.00%,0,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,16,4,1,11,100.00%,7,7,100.00%,7,7,85.71%,6,7,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,手网短微等电子渠道,渠道服务不一致,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,18,15,3,0,85.71%,6,7,85.71%,6,7,85.71%,6,7,100.00%,6,6,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,智家工程师,--,28,26,0,2,73.33%,11,15,73.33%,11,15,93.33%,14,15,100.00%,12,12,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,智家工程师,业务办理有差错,推诿办理,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,智家工程师,服务态度差,3,3,0,0,50.00%,1,2,50.00%,1,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,智家工程师,服务能力不足办理不成功,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,智家工程师,问题处理不及时、咨询不准确等,23,21,0,2,75.00%,9,12,75.00%,9,12,91.67%,11,12,100.00%,9,9,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,热线,--,21,15,1,5,85.71%,6,7,85.71%,6,7,75.00%,6,8,71.43%,5,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,热线,业务办理有差错,推诿办理,9,8,0,1,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,热线,服务态度差,4,0,0,4,50.00%,1,2,50.00%,1,2,50.00%,1,2,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,热线,渠道服务不一致,7,6,1,0,100.00%,3,3,100.00%,3,3,75.00%,3,4,66.67%,2,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,热线,问题处理不及时、咨询不准确等,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,营业厅,--,75,72,0,3,93.10%,27,29,93.10%,27,29,86.21%,25,29,96.30%,26,27,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,营业厅,业务办理有差错,推诿办理,58,55,0,3,95.83%,23,24,95.83%,23,24,91.67%,22,24,100.00%,24,24,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,渠道服务,营业厅,服务态度差,17,17,0,0,80.00%,4,5,80.00%,4,5,60.00%,3,5,66.67%,2,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,网络质量,--,--,2020,1875,120,25,94.63%,635,670,94.25%,82,86,91.21%,83,90,96.47%,82,84,1,94.69%,553,584,94.01%,549,584,98.36%,539,548,
+202304,12,2023/4/12,衡水,网络质量,固网网络体验,--,1789,1664,118,7,94.88%,574,605,100.00%,21,21,100.00%,22,22,95.24%,20,21,0,94.69%,553,584,94.01%,549,584,98.36%,539,548,
+202304,12,2023/4/12,衡水,网络质量,固网网络体验,TV中断、不可用,109,94,14,1,100.00%,38,38,,0,0,,0,0,,0,0,0,100.00%,38,38,100.00%,38,38,100.00%,33,33,
+202304,12,2023/4/12,衡水,网络质量,固网网络体验,上网中断、不可用,1365,1320,40,5,95.20%,456,479,100.00%,17,17,100.00%,18,18,94.12%,16,17,0,95.02%,439,462,95.67%,442,462,98.63%,432,438,
+202304,12,2023/4/12,衡水,网络质量,固网网络体验,上网建网影响客户,65,65,0,0,68.75%,11,16,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,64.29%,9,14,42.86%,6,14,75.00%,9,12,
+202304,12,2023/4/12,衡水,网络质量,固网网络体验,上网端网业不匹配,5,5,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,网络质量,固网网络体验,上网网络卡顿,138,74,64,0,95.45%,42,44,,0,0,,0,0,,0,0,0,95.45%,42,44,86.36%,38,44,100.00%,40,40,
+202304,12,2023/4/12,衡水,网络质量,固网网络体验,语音通信问题,107,106,0,1,96.30%,26,27,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,96.15%,25,26,96.15%,25,26,100.00%,25,25,
+202304,12,2023/4/12,衡水,网络质量,物联网,--,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,网络质量,物联网,语音通信问题,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,网络质量,移网网络体验,--,230,210,2,18,92.42%,61,65,92.42%,61,65,88.41%,61,68,96.88%,62,63,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,网络质量,移网网络体验,上网中断、不可用,69,52,0,17,100.00%,22,22,100.00%,22,22,95.83%,23,24,100.00%,21,21,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,网络质量,移网网络体验,上网网络卡顿,82,80,2,0,95.24%,20,21,95.24%,20,21,90.00%,18,20,100.00%,21,21,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,网络质量,移网网络体验,短信使用问题,4,3,0,1,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,衡水,网络质量,移网网络体验,语音通信问题,75,75,0,0,82.61%,19,22,82.61%,19,22,80.00%,20,24,90.91%,20,21,1,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,--,--,--,916,865,26,25,82.69%,301,348,77.22%,183,221,75.90%,189,233,85.20%,190,207,16,92.91%,118,127,96.85%,123,127,97.48%,116,119,
+202304,12,2023/4/12,雄安新区,业务产品,--,--,369,346,9,14,74.85%,128,157,74.85%,128,157,72.93%,132,167,82.50%,132,146,14,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,固网业务体验,--,7,7,0,0,100.00%,5,5,100.00%,5,5,100.00%,5,5,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,固网业务体验,不知情办理业务等糊涂消费,3,3,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,固网业务体验,产品套餐资费争议,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,固网业务体验,入网/携入受阻碍、不便捷,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,固网业务体验,账单看不懂,提醒不到位,发票获取受阻,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,移网业务体验,--,185,166,6,13,72.22%,65,76,72.22%,65,76,71.88%,69,82,75.86%,66,73,14,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,移网业务体验,不知情办理业务等糊涂消费,32,27,0,5,88.24%,15,17,88.24%,15,17,89.47%,17,19,93.75%,15,16,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,移网业务体验,业务产品使用与规则争议,53,47,4,2,67.86%,19,22,67.86%,19,22,67.74%,21,25,66.67%,18,21,6,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,移网业务体验,产品套餐资费争议,40,36,0,4,64.71%,11,12,64.71%,11,12,64.71%,11,12,64.71%,11,12,5,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,移网业务体验,入网/携入受阻碍、不便捷,4,4,0,0,100.00%,4,4,100.00%,4,4,100.00%,4,4,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,移网业务体验,增值业务与一次性费用不认可,10,9,0,1,33.33%,2,3,33.33%,2,3,33.33%,2,3,50.00%,3,3,3,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,移网业务体验,宣传不清晰、宣传过度、强推产品,37,34,2,1,76.92%,10,13,76.92%,10,13,71.43%,10,14,91.67%,11,12,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,移网业务体验,携出不顺利,2,2,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,移网业务体验,离网受阻碍,2,2,0,0,50.00%,1,2,50.00%,1,2,50.00%,1,2,50.00%,1,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,移网业务体验,账单看不懂,提醒不到位,发票获取受阻,5,5,0,0,100.00%,3,3,100.00%,3,3,100.00%,3,3,100.00%,3,3,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,融合业务体验,--,177,173,3,1,76.32%,58,76,76.32%,58,76,72.50%,58,80,89.86%,62,69,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,融合业务体验,不知情办理业务等糊涂消费,37,36,1,0,66.67%,10,15,66.67%,10,15,64.71%,11,17,90.91%,10,11,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,融合业务体验,业务产品使用与规则争议,56,55,1,0,80.00%,20,25,80.00%,20,25,73.08%,19,26,92.00%,23,25,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,融合业务体验,产品套餐资费争议,16,16,0,0,100.00%,4,4,100.00%,4,4,75.00%,3,4,75.00%,3,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,融合业务体验,入网/携入受阻碍、不便捷,5,5,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,融合业务体验,增值业务与一次性费用不认可,17,15,1,1,83.33%,5,6,83.33%,5,6,57.14%,4,7,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,融合业务体验,宣传不清晰、宣传过度、强推产品,32,32,0,0,73.33%,11,15,73.33%,11,15,80.00%,12,15,86.67%,13,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,融合业务体验,离网受阻碍,5,5,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,业务产品,融合业务体验,账单看不懂,提醒不到位,发票获取受阻,9,9,0,0,62.50%,5,8,62.50%,5,8,75.00%,6,8,85.71%,6,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,信息安全,--,--,25,24,1,0,71.43%,5,7,71.43%,5,7,100.00%,7,7,85.71%,6,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,信息安全,网络与信息安全,--,25,24,1,0,71.43%,5,7,71.43%,5,7,100.00%,7,7,85.71%,6,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,信息安全,网络与信息安全,安全规则引发用户不满,17,16,1,0,80.00%,4,5,80.00%,4,5,100.00%,5,5,80.00%,4,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,信息安全,网络与信息安全,安全风险导致用户不满,8,8,0,0,50.00%,1,2,50.00%,1,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,数字化,--,--,126,120,1,5,78.95%,45,52,78.95%,45,52,76.27%,45,54,82.69%,43,47,5,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,数字化,数字化问题,--,126,120,1,5,78.95%,45,52,78.95%,45,52,76.27%,45,54,82.69%,43,47,5,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,数字化,数字化问题,数字化能力不足,126,120,1,5,78.95%,45,52,78.95%,45,52,76.27%,45,54,82.69%,43,47,5,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,--,--,25,23,1,1,87.50%,14,16,87.50%,14,16,93.75%,15,16,100.00%,15,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,2I配送,--,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,2I配送,问题处理不及时、咨询不准确等,2,2,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,手网短微等电子渠道,--,3,2,1,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,手网短微等电子渠道,业务办理有差错,推诿办理,1,0,1,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,手网短微等电子渠道,服务能力不足办理不成功,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,手网短微等电子渠道,问题处理不及时、咨询不准确等,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,智家工程师,--,6,6,0,0,60.00%,3,5,60.00%,3,5,80.00%,4,5,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,智家工程师,问题处理不及时、咨询不准确等,6,6,0,0,60.00%,3,5,60.00%,3,5,80.00%,4,5,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,热线,--,2,1,0,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,热线,业务办理有差错,推诿办理,1,1,0,0,,0,0,,0,0,,0,0,,0,0,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,热线,渠道服务不一致,1,0,0,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,营业厅,--,12,12,0,0,100.00%,7,7,100.00%,7,7,100.00%,7,7,100.00%,7,7,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,营业厅,业务办理有差错,推诿办理,10,10,0,0,100.00%,5,5,100.00%,5,5,100.00%,5,5,100.00%,5,5,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,渠道服务,营业厅,服务态度差,2,2,0,0,100.00%,2,2,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,网络质量,--,--,497,472,15,10,90.59%,154,168,83.72%,36,41,77.78%,35,43,90.24%,37,39,2,92.91%,118,127,96.85%,123,127,97.48%,116,119,
+202304,12,2023/4/12,雄安新区,网络质量,固网网络体验,--,416,398,14,4,92.48%,123,133,83.33%,5,6,75.00%,6,8,100.00%,6,6,0,92.91%,118,127,96.85%,123,127,97.48%,116,119,
+202304,12,2023/4/12,雄安新区,网络质量,固网网络体验,TV中断、不可用,17,17,0,0,100.00%,3,3,,0,0,,0,0,,0,0,0,100.00%,3,3,100.00%,3,3,100.00%,2,2,
+202304,12,2023/4/12,雄安新区,网络质量,固网网络体验,上网中断、不可用,333,328,2,3,93.75%,105,112,100.00%,2,2,75.00%,3,4,100.00%,2,2,0,93.64%,103,110,98.18%,108,110,99.03%,102,103,
+202304,12,2023/4/12,雄安新区,网络质量,固网网络体验,上网建网影响客户,10,9,0,1,75.00%,3,4,100.00%,2,2,100.00%,2,2,100.00%,2,2,0,50.00%,1,2,50.00%,1,2,50.00%,1,2,
+202304,12,2023/4/12,雄安新区,网络质量,固网网络体验,上网端网业不匹配,1,1,0,0,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,网络质量,固网网络体验,上网网络卡顿,29,17,12,0,100.00%,4,4,,0,0,,0,0,,0,0,0,100.00%,4,4,100.00%,4,4,100.00%,4,4,
+202304,12,2023/4/12,雄安新区,网络质量,固网网络体验,语音通信问题,26,26,0,0,77.78%,7,9,0.00%,0,1,0.00%,0,1,100.00%,1,1,0,87.50%,7,8,87.50%,7,8,87.50%,7,8,
+202304,12,2023/4/12,雄安新区,网络质量,移网网络体验,--,81,74,1,6,83.78%,31,35,83.78%,31,35,78.38%,29,35,88.57%,31,33,2,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,网络质量,移网网络体验,上网中断、不可用,23,18,0,5,60.00%,3,5,60.00%,3,5,60.00%,3,5,100.00%,4,4,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,网络质量,移网网络体验,上网网络卡顿,32,32,0,0,86.67%,13,15,86.67%,13,15,80.00%,12,15,86.67%,13,15,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,网络质量,移网网络体验,短信使用问题,1,0,0,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,100.00%,1,1,0,,0,0,,0,0,,0,0,
+202304,12,2023/4/12,雄安新区,网络质量,移网网络体验,语音通信问题,25,24,1,0,87.50%,14,14,87.50%,14,14,81.25%,13,14,86.67%,13,13,2,,0,0,,0,0,,0,0,

File diff suppressed because it is too large
+ 0 - 0
doc/old/开发文档/样本数据/输入/HE_D_MOBILE_COMPLAINT_DETAILS_DAY_20230409-src.csv


BIN
doc/old/开发文档/样本数据/输入/HE_D_MOBILE_COMPLAINT_DETAILS_DAY_20230409.xlsx


BIN
doc/old/开发文档/样本数据/输入/数据表头说明.xlsx


BIN
doc/old/开发文档/样本数据/输入/高品质服务满...30414导出(3).XLSX


BIN
doc/old/开发文档/样本数据/输出/1_客服投诉清单各地市投诉率情况.png


BIN
doc/old/开发文档/样本数据/输出/2_重复投诉率.png


BIN
doc/old/开发文档/样本数据/输出/3_超时工单情况.png


BIN
doc/old/开发文档/样本数据/输出/4 _平均处理时长.png


BIN
doc/old/开发文档/样本数据/输出/5_投诉问题解决满意率.png


BIN
doc/old/开发文档/样本数据/输出/6_投诉问题解决率.png


BIN
doc/old/开发文档/样本数据/输出/7_投诉问题响应率.png


BIN
doc/old/开发文档/样本数据/输出/几个率值的筛选条件.png


BIN
doc/old/开发文档/样本数据/输出/投诉清单各地市投诉率0322(1).xlsx


BIN
doc/old/开发文档/样本数据/输出/投诉清单各地市投诉率0424(1).xlsx


+ 79 - 0
doc/old/开发文档/部署环境/手动入库数据.md

@@ -0,0 +1,79 @@
+# 手动入库数据
+
+## 手动发送
+
+```http
+POST http://192.168.31.10:11111/tsl/task/send HTTP/1.1
+Content-Type:application/json
+
+20231016
+```
+
+> 注意:文件缺失时不需要手动入库和生成报表,当前已经加入了等待,检查的机制。发送的逻辑后续需要修改一下。
+
+## 手动生成报表
+
+```http
+POST http://192.168.10.7:29100/tsl/task/report/generate HTTP/1.1
+Content-Type:application/json
+
+20231022
+```
+
+## 数据手动入库
+
+- 两个表一起
+
+```http
+POST http://192.168.10.7:29100/tsl/task/warahouse HTTP/1.1
+Content-Type:application/json
+
+20231022
+```
+
+- report_auto.he_d_mobile_comp
+
+```http
+POST http://192.168.10.7:29100/tsl/task/warahouse/mobilecomp HTTP/1.1
+Content-Type:application/json
+
+20230623
+```
+
+- report_auto.he_d_high_quality
+
+```http
+POST http://192.168.10.7:29100/tsl/task/warahouse/highquality HTTP/1.1
+Content-Type:application/json
+
+20231015
+```
+
+## 查询数据
+
+```http
+POST http://192.168.10.7:29100/tsl/task/check/srcfile HTTP/1.1
+Content-Type:application/json
+
+20230815
+```
+
+## 删除数据
+
+- report_auto.he_d_mobile_comp
+
+```http
+POST http://192.168.10.7:29100/tsl/task/delete/mobilecomp HTTP/1.1
+Content-Type:application/json
+
+20230815
+```
+
+- report_auto.he_d_high_quality
+
+```http
+POST http://192.168.10.7:29100/tsl/task/delete/highquality HTTP/1.1
+Content-Type:application/json
+
+20231015
+```

+ 94 - 0
doc/old/开发文档/部署环境接口测试.md

@@ -0,0 +1,94 @@
+# 接口测试
+
+nohup java -jar tsl_data-1.5-exec.jar >output.log 2>&1 &
+
+nohup java -jar dingtalk_auto-1.1-exec.jar >output.log 2>&1 &
+
+## 手动发送
+
+```http
+POST http://192.168.31.182:11111/tsl/task/send HTTP/1.1
+Content-Type:application/json
+
+20230716
+```
+
+## 数据手动入库
+
+```http
+POST http://192.168.10.7:29100/tsl/task/warahouse/mobilecomp HTTP/1.1
+Content-Type:application/json
+
+20231029
+```
+
+```http
+POST http://192.168.10.7:29100/tsl/task/warahouse/highquality HTTP/1.1
+Content-Type:application/json
+
+20231029
+```
+
+```http
+POST http://192.168.10.7:29100/tsl/task/delete/mobilecomp HTTP/1.1
+Content-Type:application/json
+
+20231029
+```
+
+```http
+POST http://192.168.10.7:29100/tsl/task/delete/highquality HTTP/1.1
+Content-Type:application/json
+
+20231029
+```
+
+## 手动生成报表
+
+```http
+POST http://192.168.10.7:29100/tsl/task/report/generate HTTP/1.1
+Content-Type:application/json
+
+20231029
+```
+
+## 查询数据
+
+```http
+POST http://192.168.10.7:29100/tsl/task/check/srcfile HTTP/1.1
+Content-Type:application/json
+
+20230531
+```
+
+## 定时任务
+
+### 查询定时任务
+
+```http
+POST http://127.0.0.1:29100/tsl/task/cron/status HTTP/1.1
+Content-Type:application/json
+```
+
+### 停止定时任务
+
+```http
+POST http://192.168.10.7:29100/tsl/task/cron/stop HTTP/1.1
+Content-Type:application/json
+```
+
+### 启动定时任务
+
+```http
+POST http://192.168.10.7:29100/tsl/task/cron/start HTTP/1.1
+Content-Type:application/json
+```
+
+### 修改定时表达式
+
+```http
+POST http://127.0.0.1:29100/tsl/task/cron/expression HTTP/1.1
+Content-Type:application/json
+
+0/25 * * * 
+```

+ 42 - 0
doc/old/需求文档/钉钉自动报表需求.md

@@ -0,0 +1,42 @@
+# 钉钉自动报表需求
+
+## 1. 需求概述
+
+- 订阅能力商店河北\_CEM 高品质 2 日统计\_HE_D_HIGH_QUALITY_COUNT_DAY 和河北\_CEM 移网质量投诉明细\_HE_D_MOBILE_COMPLAINT_DETAILS_DAY 两项数据
+- 每天定时根据要求处理数据,生成日报表
+- 每天定时按照制定的格式将日报表内容发送到指定的钉钉群
+
+## 2. 需求详情
+
+### 2.1 报表发送
+
+报表发送基本上可以定义为一个定时任务,按照指定的 cron 字符串定时执行,一个报表发送的定时任务应包含一个
+
+1. 一项发送任务
+2. 需要接口支持改变在运行的任务及状态
+3. 任务可以由代码写死,每次增加新的任务时直接更新版本。
+4. 本次要发送的任务可以由 cron 字符串(由配置文件提供)、钉钉群 token(由配置文件提供)、要发送的内容路径(内网地址、路径、用户名、密码这些信息直接写死在代码里)定义。
+
+### 2.2 报表生成(独立程序)
+
+#### 2.2.1 数据源
+
+#### 2.2.2 数据入库
+
+#### 2.2.3 最终产出
+
+2023年4月截至23日移动网投诉情况统计:管理端-移网质量类:投诉率:石家庄、承德、雄安、张家口、沧州、衡水、唐山未达到目标值,石家庄、雄安、承德排名靠后;重复投诉率:唐山、沧州、廊坊增长较快。客户端-移网网络体验:投诉问题解决满意率:雄安、张家口、唐山较低,与达标值差距较大;投诉问题解决率:雄安、张家口、唐山较低,与达标值差距较大;投诉问题响应率:雄安、张家口、石家庄较低,与达标值差距较大。投诉处理时长、超时工单概况:超时工单:雄安、石家庄、张家口分公司超时工单占比较高,石家庄、唐山、邯郸超时工单数量较多。平均处理时长:本月相对较长的地市为雄安、石家庄、张家口;与3月比雄安时长增幅较大。
+
+##### 2.2.3.1 客服投诉清单各地市投诉情况
+
+##### 2.2.3.2 重复投诉率
+
+##### 2.2.3.3 超时工单情况
+
+##### 2.2.3.4 平均处理时长
+
+##### 2.2.3.5 投诉问题解决翻译率
+
+##### 2.2.3.6 投诉问题解决率
+
+##### 2.2.3.7 投诉问题相应率

BIN
doc/old/高品质2.0日明细接口规范(1).docx


+ 20 - 0
doc/开发环境/RegisteredTaskController接口测试.http

@@ -0,0 +1,20 @@
+### 任务注册-查询列表
+POST http://127.0.0.1:9999/common/scheduling/task/registered/list/all
+Content-Type: application/json
+
+### 任务注册-新增
+POST http://127.0.0.1:9999/common/scheduling/task/registered/add
+Content-Type: application/json
+
+{
+"beanName": "demoService",
+"methodName": "test1",
+"withParameter": false,
+"description": "测试用..."
+}
+
+### 任务注册-删除
+POST http://127.0.0.1:22222/common/scheduling/task/registered/delete
+Content-Type: application/json
+
+211340469899235328

+ 116 - 0
doc/开发环境/ScheduledTaskController接口测试.http

@@ -0,0 +1,116 @@
+### 任务调度==查询全部
+POST http://127.0.0.1:22222/common/scheduling/task/scheduled/list/all
+Content-Type: application/json
+
+### 任务调度==查询正在调度的任务
+POST http://127.0.0.1:9999/common/scheduling/task/scheduled/list/scheduled
+Content-Type: application/json
+
+### 任务调度==删除
+POST http://127.0.0.1:22222/common/scheduling/task/scheduled/delete
+Content-Type: application/json
+
+211537692419297280
+
+### 任务调度==更新
+POST http://127.0.0.1:22222/common/scheduling/task/scheduled/update
+Content-Type: application/json
+
+{
+  "id": 211596024697982976,
+  "registeredTask": {
+    "id": 211593346244808704
+  },
+  "status": "ON",
+  "description": "abc"
+}
+
+### 任务调度==新增 1. 新增马上调度
+POST http://127.0.0.1:22222/common/scheduling/task/scheduled/add
+Content-Type: application/json
+
+{
+  "registeredTask": {
+    "id": 211528578876182528
+  },
+  "status": "ON",
+  "scheduledType": "IMMEDIATELY",
+  "description": "测试用..."
+}
+
+### 2. 新增单次调度
+POST http://127.0.0.1:9999/demo/scheduling/task/scheduled/add
+Content-Type: application/json
+
+{
+  "registeredTask": {
+    "id": 2
+  },
+  "status": "ON",
+  "scheduledType": "ONCE",
+  "methodParameter": "abc",
+  "scheduledParameter": {
+    "startTime": "2023-11-27 17:04:00"
+  }
+}
+
+### 2. 新增单次调度2
+POST http://127.0.0.1:9999/common/scheduling/task/scheduled/add
+Content-Type: application/json
+
+{
+  "registeredTask": {
+    "id": 213707591296094208
+  },
+  "status": "ON",
+  "scheduledType": "ONCE",
+  "methodParameter": "abc",
+  "scheduledParameter": {
+    "delayOfSeconds": 5
+  }
+}
+
+### 3. 新增定时调度
+POST http://127.0.0.1:22222/common/scheduling/task/scheduled/add
+Content-Type: application/json
+
+{
+  "registeredTask": {
+    "id": 211593346244808704
+  },
+  "status": "ON",
+  "scheduledType": "CRON",
+  "scheduledParameter": {
+    "cronExpression": "0 15 14 * * *"
+  }
+}
+
+### 4. 新增周期调度
+POST http://127.0.0.1:9999/demo/scheduling/task/scheduled/add
+Content-Type: application/json
+
+{
+  "registeredTask": {
+    "id": 1
+  },
+  "status": "ON",
+  "scheduledType": "INTERVAL",
+  "scheduledParameter": {
+    "periodOfSeconds": 15
+  }
+}
+
+### 5. 新增固定延时调度
+POST http://127.0.0.1:9999/common/scheduling/task/scheduled/add
+Content-Type: application/json
+
+{
+  "registeredTask": {
+    "id": 213707591296094208
+  },
+  "status": "ON",
+  "scheduledType": "FIXED_DELAY",
+  "scheduledParameter": {
+    "delayOfSeconds": 15
+  }
+}

+ 39 - 0
doc/需求文档/20231219-新需求.md

@@ -0,0 +1,39 @@
+# 新需求记录
+
+## 需求提出日期
+
+2023年12月19日
+
+## 需求概述
+
+2024年开始由于考核内容有变需要调整日报表以适应新需求
+
+## 需求详述
+
+### 管理端-移网感知类调整
+
+1. 管理端-移网感知类:数据源在原有基础上增加(需提供目标值),核实数据源问题
+日定责问题分类
+业务使用>>基础业务使用>>移网主被叫>>手机无法主被叫
+
+4. 重复投诉数据源更换成移网感知类
+   
+> 截止到2023年12月20日,数据源仍存在问题,无法启动开发
+
+### 取消sheet2
+
+2. sheet2客户端取消,
+
+### 新增 服务请求压降
+
+3. 增加服务请求压降:数据源是移网网络体验明细,计算方式同移网感知类(需提供目标值)
+
+> 需要订阅新数据--尚未提供新数据的服务
+
+### 投诉处理时长、超时工单概况调整
+
+5. 投诉处理时长、超时工单概况:数据源更换成进入TOP的工单(剔除退单),计算各地市的平均处理时长(归档时间-受理时间),如果归档时间缺失(……),()目标值36小时
+
+### 支撑地市日报功能
+
+7. 支撑地市发送日报功能,可实现地市更新区县后,

+ 13 - 13
pom.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
@@ -36,23 +36,23 @@
     </properties>
 
     <dependencies>
-        <!-- push-message-starter -->
+        <!-- poi -->
         <dependency>
-            <groupId>com.nokia</groupId>
-            <artifactId>push-message-starter</artifactId>
-            <version>1.1.0</version>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>5.2.3</version>
         </dependency>
-        <!-- scheduling-starter -->
+        <!-- poi 2007 -->
         <dependency>
-            <groupId>com.nokia</groupId>
-            <artifactId>scheduling-starter</artifactId>
-            <version>1.0.1-SNAPSHOT</version>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.3</version>
         </dependency>
-        <!-- common-utils -->
+        <!-- push-message-starter -->
         <dependency>
             <groupId>com.nokia</groupId>
-            <artifactId>common-utils</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
+            <artifactId>push-message-starter</artifactId>
+            <version>1.1.0</version>
         </dependency>
         <!-- commons-csv -->
         <dependency>

+ 37 - 0
src/main/java/com/nokia/common/basic/DateUtil.java

@@ -0,0 +1,37 @@
+package com.nokia.common.basic;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 处理Date
+ */
+public class DateUtil {
+
+    private static final DateFormat ZERO_CLOCK_DATE_FORMAT = new SimpleDateFormat("yyyyMMdd000000");
+    private static final DateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss");
+
+    public static long zeroClockTodayLong() {
+        return zeroClockTodayDate().getTime();
+    }
+
+    public static String zeroClockTodayString(String pattern) {
+        DateFormat format = new SimpleDateFormat(pattern);
+        return format.format(zeroClockTodayDate());
+    }
+
+    public static String zeroClockTodayString() {
+        return ZERO_CLOCK_DATE_FORMAT.format(new Date());
+    }
+
+    public static Date zeroClockTodayDate() {
+        try {
+            return SIMPLE_DATE_FORMAT.parse(zeroClockTodayString());
+        } catch (ParseException e) {
+            e.printStackTrace();
+            throw new RuntimeException("获取zeroClockTodayDate出错: " + e.getMessage());
+        }
+    }
+}

+ 14 - 0
src/main/java/com/nokia/common/basic/InstantUtil.java

@@ -0,0 +1,14 @@
+package com.nokia.common.basic;
+
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * Instant格式化
+ */
+public class InstantUtil {
+
+    public static DateTimeFormatter ofPattern(String pattern) {
+        return DateTimeFormatter.ofPattern(pattern).withZone(ZoneId.of("Asia/Shanghai"));
+    }
+}

+ 79 - 0
src/main/java/com/nokia/common/codec/MD5Util.java

@@ -0,0 +1,79 @@
+package com.nokia.common.codec;
+
+import org.springframework.util.DigestUtils;
+
+import java.io.*;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class MD5Util {
+
+    public static String encrypt(String str) {
+        return encrypt(str, "utf8");
+    }
+
+    public static String encrypt(String str, String charset) {
+        try {
+            return DigestUtils.md5DigestAsHex(str.getBytes(charset));
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+            throw new RuntimeException("使用指定的编码 " + charset + " 解码失败: " + e.getMessage());
+        }
+    }
+
+    public static String encode(String str, String charset) {
+        return encrypt(str, charset);
+    }
+
+    public static String encode(String str) {
+        return encode(str, "utf8");
+    }
+
+    /**
+     * 返回路径对应的文件的md5
+     */
+    public static String MD5OfFile(String filePath) {
+        try (InputStream inputStream = new FileInputStream(filePath)){
+            return MD5OfInputStream(inputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("获取MD5出错..." + e.getMessage());
+        }
+    }
+
+    /**
+     * 返回文件的md5
+     */
+    public static String MD5OfFile(File file) {
+        try (InputStream inputStream = new FileInputStream(file)){
+            return MD5OfInputStream(inputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("获取MD5出错..." + e.getMessage());
+        }
+    }
+
+    public static String MD5OfInputStream(InputStream inputStream) {
+        try {
+            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
+            byte[] buffer = new byte[1024];
+            int length;
+            while ((length = inputStream.read(buffer, 0, 1024)) != -1) {
+                messageDigest.update(buffer, 0, length);
+            }
+            byte[] md5Bytes = messageDigest.digest();
+            StringBuilder sb = new StringBuilder(40);
+            for (byte x : md5Bytes) {
+                if ((x & 0xff) >> 4 == 0) {
+                    sb.append("0").append(Integer.toHexString(x & 0xff));
+                } else {
+                    sb.append(Integer.toHexString(x & 0xff));
+                }
+            }
+            return sb.toString();
+        } catch (NoSuchAlgorithmException | IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("获取MD5出错..." + e.getMessage());
+        }
+    }
+}

+ 171 - 0
src/main/java/com/nokia/common/dao/SnowFlakeUtil.java

@@ -0,0 +1,171 @@
+package com.nokia.common.dao;
+
+import java.util.Date;
+
+/*
+ * 雪花算法
+ *
+ * 算法来源: https://blog.csdn.net/jiaomubai/article/details/124385324
+ *
+ * 雪花算法的原理就是生成一个的 64 位比特位的 long 类型的唯一 id。
+ * 最高 1 位固定值 0,因为生成的 id 是正整数,如果是 1 就是负数了。
+ * 接下来 41 位存储毫秒级时间戳,2^41/(1000*60*60*24*365)=69,大概可以使用 69 年。
+ * 再接下 10 位存储机器码,包括 5 位 datacenterId 和 5 位 workerId。最多可以部署 2^10=1024 台机器。
+ * 最后 12 位存储序列号。同一毫秒时间戳时,通过这个递增的序列号来区分。即对于同一台机器而言,同一毫秒时间戳下,可以生成 2^12=4096 个不重复 id。
+ *
+ * 高并发分布式环境下生成不重复 id,每秒可生成百万个不重复 id。
+ * 基于时间戳,以及同一时间戳下序列号自增,基本保证 id 有序递增。
+ * 不依赖第三方库或者中间件。
+ * 算法简单,在内存中进行,效率高。
+ */
+public class SnowFlakeUtil {
+    private static final SnowFlakeUtil snowFlakeUtil;
+
+    static {
+        snowFlakeUtil = new SnowFlakeUtil();
+    }
+
+    // 初始时间戳(纪年),可用雪花算法服务上线时间戳的值
+    // 1650789964886:2022-04-24 16:45:59
+    private static final long INIT_EPOCH = 1650789964886L;
+
+    // 时间位取&
+    private static final long TIME_BIT = 0b1111111111111111111111111111111111111111110000000000000000000000L;
+
+    // 记录最后使用的毫秒时间戳,主要用于判断是否同一毫秒,以及用于服务器时钟回拨判断
+    private long lastTimeMillis = -1L;
+
+    // dataCenterId占用的位数
+    private static final long DATA_CENTER_ID_BITS = 5L;
+
+    // dataCenterId占用5个比特位,最大值31
+    // 0000000000000000000000000000000000000000000000000000000000011111
+    private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);
+
+    // dataCenterId
+    private final long dataCenterId;
+
+    // workId占用的位数
+    private static final long WORKER_ID_BITS = 5L;
+
+    // workId占用5个比特位,最大值31
+    // 0000000000000000000000000000000000000000000000000000000000011111
+    private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
+
+    // workId
+    private final long workerId;
+
+    // 最后12位,代表每毫秒内可产生最大序列号,即 2^12 - 1 = 4095
+    private static final long SEQUENCE_BITS = 12L;
+
+    // 掩码(最低12位为1,高位都为0),主要用于与自增后的序列号进行位与,如果值为0,则代表自增后的序列号超过了4095
+    // 0000000000000000000000000000000000000000000000000000111111111111
+    private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS);
+
+    // 同一毫秒内的最新序号,最大值可为 2^12 - 1 = 4095
+    private long sequence;
+
+    // workId位需要左移的位数 12
+    private static final long WORK_ID_SHIFT = SEQUENCE_BITS;
+
+    // dataCenterId位需要左移的位数 12+5
+    private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
+
+    // 时间戳需要左移的位数 12+5+5
+    private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;
+
+    /**
+     * 无参构造
+     */
+    public SnowFlakeUtil() {
+        this(1, 1);
+    }
+
+    /**
+     * 有参构造
+     */
+    public SnowFlakeUtil(long dataCenterId, long workerId) {
+        // 检查dataCenterId的合法值
+        if (dataCenterId < 0 || dataCenterId > MAX_DATA_CENTER_ID) {
+            throw new IllegalArgumentException(
+                    String.format("dataCenterId 值必须大于 0 并且小于 %d", MAX_DATA_CENTER_ID));
+        }
+        // 检查workId的合法值
+        if (workerId < 0 || workerId > MAX_WORKER_ID) {
+            throw new IllegalArgumentException(String.format("workId 值必须大于 0 并且小于 %d", MAX_WORKER_ID));
+        }
+        this.workerId = workerId;
+        this.dataCenterId = dataCenterId;
+    }
+
+    /**
+     * 获取唯一ID
+     */
+    public static Long getSnowFlakeId() {
+        return snowFlakeUtil.nextId();
+    }
+
+    /**
+     * 通过雪花算法生成下一个id,注意这里使用synchronized同步
+     */
+    public synchronized long nextId() {
+        long currentTimeMillis = System.currentTimeMillis();
+        // 当前时间小于上一次生成id使用的时间,可能出现服务器时钟回拨问题
+        if (currentTimeMillis < lastTimeMillis) {
+            throw new RuntimeException(
+                    String.format("可能出现服务器时钟回拨问题,请检查服务器时间。当前服务器时间戳:%d,上一次使用时间戳:%d", currentTimeMillis,
+                            lastTimeMillis));
+        }
+        if (currentTimeMillis == lastTimeMillis) {
+            // 还是在同一毫秒内,则将序列号递增1,序列号最大值为4095
+            // 序列号的最大值是4095,使用掩码(最低12位为1,高位都为0)进行位与运行后如果值为0,则自增后的序列号超过了4095
+            // 那么就使用新的时间戳
+            sequence = (sequence + 1) & SEQUENCE_MASK;
+            if (sequence == 0) {
+                currentTimeMillis = getNextMillis(lastTimeMillis);
+            }
+        } else { // 不在同一毫秒内,则序列号重新从0开始,序列号最大值为4095
+            sequence = 0;
+        }
+        // 记录最后一次使用的毫秒时间戳
+        lastTimeMillis = currentTimeMillis;
+        // 核心算法,将不同部分的数值移动到指定的位置,然后进行或运行
+        // <<:左移运算符, 1 << 2 即将二进制的 1 扩大 2^2 倍
+        // |:位或运算符, 是把某两个数中, 只要其中一个的某一位为1, 则结果的该位就为1
+        // 优先级:<< > |
+        return
+                // 时间戳部分
+                ((currentTimeMillis - INIT_EPOCH) << TIMESTAMP_SHIFT)
+                        // 数据中心部分
+                        | (dataCenterId << DATA_CENTER_ID_SHIFT)
+                        // 机器表示部分
+                        | (workerId << WORK_ID_SHIFT)
+                        // 序列号部分
+                        | sequence;
+    }
+
+    /**
+     * 获取指定时间戳的接下来的时间戳,也可以说是下一毫秒
+     */
+    private long getNextMillis(long lastTimeMillis) {
+        long currentTimeMillis = System.currentTimeMillis();
+        while (currentTimeMillis <= lastTimeMillis) {
+            currentTimeMillis = System.currentTimeMillis();
+        }
+        return currentTimeMillis;
+    }
+
+    /**
+     * 获取随机字符串,length=13
+     */
+    public static String getRandomStr() {
+        return Long.toString(getSnowFlakeId(), Character.MAX_RADIX);
+    }
+
+    /**
+     * 从ID中获取时间
+     */
+    public static Date getTimeBySnowFlakeId(long id) {
+        return new Date(((TIME_BIT & id) >> 22) + INIT_EPOCH);
+    }
+}

+ 25 - 0
src/main/java/com/nokia/common/http/logging/RequestLogDispatcherServlet.java

@@ -0,0 +1,25 @@
+package com.nokia.common.http.logging;
+
+import com.nokia.common.http.logging.entity.RepeatableHttpServletRequestWrapper;
+import com.nokia.common.http.logging.entity.RepeatableHttpServletResponseWrapper;
+import org.springframework.lang.Nullable;
+import org.springframework.web.servlet.DispatcherServlet;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 自定义DispatcherServlet
+ */
+public class RequestLogDispatcherServlet extends DispatcherServlet {
+
+    /**
+     * 使用可重复读的reuqest和respone替换原来参数
+     */
+    @Override
+    protected void doDispatch(@Nullable HttpServletRequest request, @Nullable HttpServletResponse response) throws Exception {
+        super.doDispatch(new RepeatableHttpServletRequestWrapper(request),
+                new RepeatableHttpServletResponseWrapper(response));
+    }
+
+}

+ 70 - 0
src/main/java/com/nokia/common/http/logging/RequestLogHandlerInterceptor.java

@@ -0,0 +1,70 @@
+package com.nokia.common.http.logging;
+
+import com.nokia.common.http.logging.entity.RepeatableHttpServletResponseWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.lang.Nullable;
+import org.springframework.util.StopWatch;
+import org.springframework.util.StreamUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.nio.charset.Charset;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 拦截器--添加堆请求和返回结果的输出,并输出从请求开始到访问结束的时长
+ */
+@Slf4j
+public class RequestLogHandlerInterceptor implements HandlerInterceptor {
+
+    private final ThreadLocal<StopWatch> STOP_WATCH_THREAD_LOCAL = new ThreadLocal<>();
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Object handler)
+            throws Exception {
+        // 启动一个秒表进行计时
+        StopWatch stopWatch = new StopWatch();
+        STOP_WATCH_THREAD_LOCAL.set(stopWatch);
+        stopWatch.start();
+        // 日志添加跟踪id
+        MDC.put("traceId", UUID.randomUUID().toString().replace("-", ""));
+        // 请求头参数
+        Map<String, String> headers = new HashMap<>();
+        Enumeration<String> headerNames = request.getHeaderNames();
+        while (headerNames.hasMoreElements()) {
+            String k = headerNames.nextElement();
+            String v = request.getHeader(k);
+            headers.put(k, v);
+        }
+        // 这里要对请求体做一次完整的读取
+        String body = StreamUtils.copyToString(request.getInputStream(),
+                Charset.forName(request.getCharacterEncoding()));
+        log.info("请求地址: {} {},请求参数: {}",
+                request.getRequestURL().toString(),
+                request.getMethod(),
+                StringUtils.trimAllWhitespace(body));
+        log.info("请求头: {}", headers);
+        return true;
+    }
+
+    @Override
+    public void afterCompletion(@Nullable HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Object handler,
+                                @Nullable Exception ex) {
+        RepeatableHttpServletResponseWrapper wrapper = (RepeatableHttpServletResponseWrapper) response;
+        if (wrapper != null) {
+            String responseString = new String(wrapper.toByteArray());
+            responseString = responseString.length() > 1000 ? responseString.substring(0, 1000) : responseString;
+            StopWatch stopWatch = STOP_WATCH_THREAD_LOCAL.get();
+            stopWatch.stop();
+            // 返回结果打印前1000个字符
+            log.info("耗时 {} ms, 返回 {}: {}", stopWatch.getTotalTimeMillis(), wrapper.getStatus(), responseString);
+            STOP_WATCH_THREAD_LOCAL.remove();
+        }
+    }
+}

+ 66 - 0
src/main/java/com/nokia/common/http/logging/entity/RepeatableHttpServletRequestWrapper.java

@@ -0,0 +1,66 @@
+package com.nokia.common.http.logging.entity;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.springframework.util.StreamUtils;
+
+/**
+ * 可重复读取的HttpServletRequestWrapper
+ */
+public class RepeatableHttpServletRequestWrapper extends HttpServletRequestWrapper {
+    // 承载request中的数据,以便重复读取
+    private final byte[] bytes;
+
+    public RepeatableHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
+        super(request);
+        // 读取request中的数据到bytes
+        bytes = StreamUtils.copyToByteArray(request.getInputStream());
+    }
+
+    @Override
+    public ServletInputStream getInputStream() {
+        ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
+        // 匿名内部类实现ServletInputStream
+        return new ServletInputStream() {
+            @Override
+            public boolean isFinished() {
+                return stream.available() <= 0;
+            }
+
+            @Override
+            public boolean isReady() {
+                return stream.available() > 0;
+            }
+
+            @Override
+            public void setReadListener(ReadListener readListener) {
+                try {
+                    readListener.onDataAvailable();
+                    if (isFinished()) {
+                        readListener.onAllDataRead();
+                    }
+                } catch (IOException e) {
+                    readListener.onError(e);
+                }
+            }
+
+            @Override
+            public int read() {
+                return stream.read();
+            }
+        };
+    }
+
+    @Override
+    public BufferedReader getReader() throws IOException {
+        return new BufferedReader(new InputStreamReader(getInputStream(), getCharacterEncoding()));
+    }
+}

+ 51 - 0
src/main/java/com/nokia/common/http/logging/entity/RepeatableHttpServletResponseWrapper.java

@@ -0,0 +1,51 @@
+package com.nokia.common.http.logging.entity;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+public class RepeatableHttpServletResponseWrapper extends HttpServletResponseWrapper {
+
+    private final ByteArrayOutputStream byteArrayOutputStream;
+    private final ServletOutputStream servletOutputStream;
+
+    public RepeatableHttpServletResponseWrapper(HttpServletResponse response) throws IOException {
+        super(response);
+        // 从当前的response获取ServletOutputStream
+        ServletOutputStream outputStream = response.getOutputStream();
+        byteArrayOutputStream = new ByteArrayOutputStream();
+        // 匿名内部类实现ServletOutputStream
+        servletOutputStream = new ServletOutputStream() {
+
+            @Override
+            public boolean isReady() {
+                return outputStream.isReady();
+            }
+
+            @Override
+            public void setWriteListener(WriteListener writeListener) {
+                outputStream.setWriteListener(writeListener);
+            }
+
+            @Override
+            public void write(int b) throws IOException {
+                // 写入原有的基础上同时写入ByteArrayOutputStream
+                outputStream.write(b);
+                byteArrayOutputStream.write(b);
+            }
+        };
+    }
+
+    @Override
+    public ServletOutputStream getOutputStream() {
+        return servletOutputStream;
+    }
+
+    public byte[] toByteArray() {
+        return byteArrayOutputStream.toByteArray();
+    }
+}

+ 61 - 0
src/main/java/com/nokia/common/http/vo/R.java

@@ -0,0 +1,61 @@
+package com.nokia.common.http.vo;
+
+import lombok.Data;
+
+/**
+ * 返回值的统一包装
+ */
+@Data
+public class R {
+    private Boolean success;
+    private Integer code = 0;
+    private String message;
+    private Object data;
+
+    /**
+     * 私有化构造方法,不允许在外部实例化
+     */
+    private R() {
+    }
+
+    /**
+     * 成功的静态方法
+     *
+     * @return R实例
+     */
+    public static R ok() {
+        R r = new R();
+        r.setSuccess(true);
+        r.setCode(200);
+        r.setMessage("成功");
+        return r;
+    }
+
+    /**
+     * 失败的静态方法
+     *
+     * @return R实例
+     */
+    public static R error() {
+        R r = new R();
+        r.setSuccess(false);
+        r.setCode(500);
+        r.setMessage("失败");
+        return r;
+    }
+
+    public R code(int code) {
+        this.setCode(code);
+        return this;
+    }
+
+    public R message(String message) {
+        this.setMessage(message);
+        return this;
+    }
+
+    public R data(Object data) {
+        this.setData(data);
+        return this;
+    }
+}

+ 109 - 0
src/main/java/com/nokia/common/io/TextUtil.java

@@ -0,0 +1,109 @@
+package com.nokia.common.io;
+
+import org.springframework.util.StringUtils;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 文本工具
+ */
+public class TextUtil {
+
+    // 判断是否为空字符串
+    public static boolean isBlank(String s) {
+        return !StringUtils.hasText(s);
+    }
+
+    // 使用utf8解码并读取文件
+    public static List<String> readLines(String path) {
+        return readLines(path, "utf-8");
+    }
+
+    // 使用utf8解码并读取文件
+    public static List<String> readLinesWithUTF8(String path) {
+        return readLines(path, "utf-8");
+    }
+
+    // 使用gbk读取文件
+    public static List<String> readLinesWithGBK(String path) {
+        return readLines(path, "gbk");
+    }
+
+    // 按行读取文件
+    public static List<String> readLines(String path, String charsetName) {
+        try (BufferedReader reader = new BufferedReader(
+                new InputStreamReader(new FileInputStream(path), charsetName))) {
+            return readLines(reader);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+
+    // 按行读取文件
+    private static List<String> readLines(BufferedReader reader) {
+        List<String> result = new ArrayList<>();
+        String line;
+        try {
+            while ((line = reader.readLine()) != null) {
+                result.add(line);
+            }
+            return result;
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+
+    public static String readText(String path) {
+        return readText(path, "utf-8");
+    }
+
+    public static String readTextWithUTF8(String path) {
+        return readText(path, "utf-8");
+    }
+
+    public static String readTextWithGBK(String path) {
+        return readText(path, "gbk");
+    }
+
+    // 读取完整文件
+    public static String readText(String path, String charsetName) {
+        try {
+            return new String(Files.readAllBytes(Paths.get(path)), charsetName);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("读取文本文件出错: " + e.getMessage());
+        }
+    }
+
+    public static void writeToFile(String text, String path) {
+        writeToFile(text, path, "utf-8");
+    }
+
+    public static void writeToFileWithUTF8(String text, String path) {
+        writeToFile(text, path, "utf-8");
+    }
+
+    public static void writeToFileWithGBK(String text, String path) {
+        writeToFile(text, path, "gbk");
+    }
+
+    public static void writeToFile(String text, String path, String charsetName) {
+        writeToFile(text, new File(path), charsetName);
+    }
+
+    // 写入文件本舰
+    public static void writeToFile(String text, File file, String charsetName) {
+        try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), charsetName)) {
+            writer.write(text);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("写入文本文件出错:" + e.getMessage());
+        }
+    }
+}

+ 5 - 0
src/main/java/com/nokia/common/io/excel/entity/AlignmentEnum.java

@@ -0,0 +1,5 @@
+package com.nokia.common.io.excel.entity;
+
+public enum AlignmentEnum {
+    CENTER, LEFT, RIGHT
+}

+ 55 - 0
src/main/java/com/nokia/common/io/excel/entity/CellInfo.java

@@ -0,0 +1,55 @@
+package com.nokia.common.io.excel.entity;
+
+import lombok.Data;
+
+import java.awt.*;
+
+/**
+ * excel一个单元格要截图的关键信息
+ * 
+ * 一个单元格可能是一个合并单元格
+ * 
+ * 包含字体(字体类型,字体大小)、背景色、字体颜色、是否包含边框等信息、单元格的大小和位置信息
+ */
+@Data
+public class CellInfo {
+    // x,y是单元格的左上角坐标
+    private int x;
+    private int y;
+    // width,height表示单元格的大小
+    private int width;
+    private int height;
+    // 背景色 默认为空
+    private Color backgroundColor = null;
+    // 是否存在边框 默认存在宽度1像素的黑色边框
+    private boolean isBordered = true;
+    private int borderWidth = 1;
+    private Color borderColor = Color.BLACK;
+    // 单元格值的字符串表示--时间按统一格式,其他数字按照excel格式
+    private String text;
+    // 字体 默认字体 微软雅黑 普通 11号字
+    private Font font = Font.decode("微软雅黑-PLAIN-12");
+    // 是否加粗
+    private boolean isBold = false;
+    // 文字颜色
+    private Color textColor = Color.BLACK;
+    // 文字对齐方向
+    private AlignmentEnum alignment = AlignmentEnum.CENTER;
+
+    /**
+     * 通过字符串配置字体
+     * fontName 空格或-间隔的字符串 fontname-style-pointsize fontname pointsize
+     *                 fontname style
+     */
+    public void setFont(String fontName) {
+        String familyName = fontName.trim().split("-")[0].split(" ")[0];
+        // 所有允许的familyName
+        String[] availableFontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment()
+                .getAvailableFontFamilyNames();
+        for (String availableFontFamilyName : availableFontFamilyNames) {
+            if (availableFontFamilyName.equalsIgnoreCase(familyName)) {
+                font = Font.decode(fontName);
+            }
+        }
+    }
+}

+ 101 - 0
src/main/java/com/nokia/common/io/excel/entity/CellRect.java

@@ -0,0 +1,101 @@
+package com.nokia.common.io.excel.entity;
+
+import lombok.Data;
+
+import java.awt.*;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Excel上一个矩形区域的全部信息
+ */
+@Data
+public class CellRect {
+
+    // 总宽度
+    private int totalWidth;
+    // 总高度
+    private int totalHeight;
+    // 边框像素数
+    private int margin = 5;
+
+    // excel上的起止位置信息
+    private int startCol;
+    private int endCol;
+    private int startRow;
+    private int endRow;
+
+    // 背景色,默认白色
+    private Color backgroundColor = Color.WHITE;
+    // 统一字体
+    private String fontFamily = null;
+    // 最小字体12号字,保证截图的清晰度
+    private int fontSizeMin = 12;
+
+    // 范围内的全部单元格信息CellInfo
+    private List<CellInfo> cellInfos;
+
+    // 识别Rect区域的正则表达式
+    private static final Pattern PATTERN = Pattern.compile("^[A-Z]+\\d+:[A-Z]+\\d+$");
+
+    public static CellRect parse(String rect) {
+        boolean matches = PATTERN.matcher(rect).matches();
+        if (!matches) {
+            throw new RuntimeException(String.format("输入的%s格式错误,正确的示例A1:AA33,表示第0-32行,0-26列", rect));
+        }
+        String[] split = rect.split(":");
+        CellRect cellRect = new CellRect();
+        cellRect.setStartCol(getCol(split[0]));
+        cellRect.setStartRow(getRow(split[0]));
+        cellRect.setEndCol(getCol(split[1]));
+        cellRect.setEndRow(getRow(split[1]));
+        return cellRect;
+    }
+
+    /**
+     * 26进制字符串转10进制数
+     * 注意,AA = 1*26+1 所以是无0的
+     */
+    private static int getCol(String cell) {
+        int result = 0;
+        // 位数
+        for (int i = 0; i < cell.length(); i++) {
+            int a = cell.charAt(i);
+            // 不是A-Z的字符直接忽略
+            if (a > 90 || a < 65)
+                continue;
+            // 发现1个A-Z的字符 位数+1
+            result = result * 26 + a - 64;
+        }
+        return result - 1;
+    }
+
+    /**
+     * 字符串转10进制数
+     */
+    private static int getRow(String cell) {
+        int result = 0;
+        for (int i = 0; i < cell.length(); i++) {
+            int c = cell.charAt(i);
+            // 不是0-9
+            if (c < 48 || c > 57)
+                continue;
+            result = result * 10 + c - 48;
+        }
+        return result - 1;
+    }
+
+    /**
+     * 从列号转为列名 如26转为AA
+     */
+    public static String getColumnName(int colNum) {
+        StringBuffer stringBuffer = new StringBuffer();
+        int realCol = colNum + 1;
+        while (realCol > 26) {
+            stringBuffer.append((char) (realCol / 26 + 64));
+            realCol %= 26;
+        }
+        stringBuffer.append((char) (realCol + 64));
+        return stringBuffer.toString();
+    }
+}

+ 30 - 0
src/main/java/com/nokia/common/io/excel/entity/Gradient.java

@@ -0,0 +1,30 @@
+package com.nokia.common.io.excel.entity;
+
+import java.awt.Color;
+
+/**
+ * 渐进色
+ */
+public interface Gradient {
+    /**
+     * 针对执行的数值输入d,计算对应的颜色
+     */
+    Color getColor(double d);
+
+    static Color parse(String ARGBHex) {
+        int a = Integer.parseInt(ARGBHex.substring(0, 2), 16);
+        int r = Integer.parseInt(ARGBHex.substring(2, 4), 16);
+        int g = Integer.parseInt(ARGBHex.substring(4, 6), 16);
+        int b = Integer.parseInt(ARGBHex.substring(6, 8), 16);
+        return new Color(r, g, b, a);
+    }
+
+    static Color parse(byte[] argb) {
+        // 需要把byte(无符号整数0-255)转成int
+        return new Color(argb[1] & 0xff, argb[2] & 0xff, argb[3] & 0xff, argb[0] & 0xff);
+    }
+
+    static Color parse(short[] rgb) {
+        return new Color(rgb[0], rgb[1], rgb[2]);
+    }
+}

+ 45 - 0
src/main/java/com/nokia/common/io/excel/entity/ThreeColorGradient.java

@@ -0,0 +1,45 @@
+package com.nokia.common.io.excel.entity;
+
+import lombok.Data;
+
+import java.awt.*;
+
+/**
+ * 三色渐变色
+ */
+@Data
+public class ThreeColorGradient {
+
+    // 三种颜色 默认三色 FF63BE7B--FFFFEB84--FFF8696B 红/黄/绿
+    private Color startColor = new Color(99, 190, 123, 255);
+    private Color middleColor = new Color(255, 235, 132, 255);
+    private Color endColor = new Color(248, 105, 107, 255);
+
+    // 开始数、中位数、截止数
+    private double startValue;
+    private double middleValue;
+    private double endValue;
+
+    /**
+     * 根据输入值返回一个颜色
+     */
+    public Color getColor(double d) {
+        if ((d >= startValue && d < middleValue) || (d <= startValue && d > middleValue)) {
+            // 值在中位数和satartValue之间,计算起始颜色和中间颜色之间的渐进色
+            double t = middleValue == startValue ? 0 : (d - startValue) / (middleValue - startValue);
+            double red = (1 - t) * startColor.getRed() + t * middleColor.getRed();
+            double green = (1 - t) * startColor.getGreen() + t * middleColor.getGreen();
+            double blue = (1 - t) * startColor.getBlue() + t * middleColor.getBlue();
+            double opacity = (1 - t) * startColor.getAlpha() + t * middleColor.getAlpha();
+            return new Color((int) red, (int) green, (int) blue, (int) opacity);
+        } else {
+            // 值在中位数和endValue之间,计算中间亚瑟和结束颜色之间的渐进色
+            double t = middleValue == endValue ? 0 : (d - endValue) / (middleValue - endValue);
+            double red = (1 - t) * endColor.getRed() + t * middleColor.getRed();
+            double green = (1 - t) * endColor.getGreen() + t * middleColor.getGreen();
+            double blue = (1 - t) * endColor.getBlue() + t * middleColor.getBlue();
+            double opacity = (1 - t) * endColor.getAlpha() + t * middleColor.getAlpha();
+            return new Color((int) red, (int) green, (int) blue, (int) opacity);
+        }
+    }
+}

+ 27 - 0
src/main/java/com/nokia/common/io/excel/entity/TwoColorGradient.java

@@ -0,0 +1,27 @@
+package com.nokia.common.io.excel.entity;
+
+import java.awt.Color;
+
+/**
+ * 双色渐进色
+ */
+public class TwoColorGradient implements Gradient {
+
+    // 两种颜色 默认双色 FF63BE7B--FFF8696B 红/绿
+    private Color startColor = new Color(99, 190, 123, 255);
+    private Color endColor = new Color(248, 105, 107, 255);
+
+    // 开始数、截止数
+    private double startValue;
+    private double endValue;
+
+    @Override
+    public Color getColor(double d) {
+        double t = (d - startValue) / (endValue - startValue);
+        double red = (1 - t) * startColor.getRed() + t * endColor.getRed();
+        double green = (1 - t) * startColor.getGreen() + t * endColor.getGreen();
+        double blue = (1 - t) * startColor.getBlue() + t * endColor.getBlue();
+        double opacity = (1 - t) * startColor.getAlpha() + t * endColor.getAlpha();
+        return new Color((int) red, (int) green, (int) blue, (int) opacity);
+    }
+}

+ 406 - 0
src/main/java/com/nokia/common/io/excel/poi/PoiUtil.java

@@ -0,0 +1,406 @@
+package com.nokia.common.io.excel.poi;
+
+import com.nokia.common.io.excel.entity.CellInfo;
+import com.nokia.common.io.excel.entity.CellRect;
+import com.nokia.common.io.excel.entity.Gradient;
+import com.nokia.common.io.excel.entity.ThreeColorGradient;
+import org.apache.poi.hssf.usermodel.HSSFFont;
+import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.ss.usermodel.Color;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFColor;
+import org.apache.poi.xssf.usermodel.XSSFFont;
+import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * POI的封装
+ */
+public class PoiUtil {
+
+    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private static ThreeColorGradient threeColorGradient;
+
+    /**
+     * 截图rect指定的区域
+     */
+    public static BufferedImage screenShot(Sheet sheet, String rect) {
+        return screenShot(sheet, CellRect.parse(rect));
+    }
+
+    /**
+     * 使用指定的字体截图
+     */
+    public static BufferedImage screenShot(Sheet sheet, String rect, String fontFamily) {
+        CellRect cellRect = CellRect.parse(rect);
+        cellRect.setFontFamily(fontFamily);
+        return screenShot(sheet, cellRect);
+    }
+
+    /**
+     * 截取由startCol、endCol、startRow、endRow指定的Sheet中矩形区域所包含的单元格到BufferedImage
+     */
+    public static BufferedImage screenShot(Sheet sheet, int startCol, int endCol, int startRow, int endRow) {
+        CellRect cellRect = new CellRect();
+        cellRect.setStartCol(startCol);
+        cellRect.setEndCol(endCol);
+        cellRect.setStartRow(startRow);
+        cellRect.setEndRow(endRow);
+        return screenShot(sheet, cellRect);
+    }
+
+    /**
+     * 截取由CellRect实例指定的Sheet中矩形区域所包含的单元格到BufferedImage
+     */
+    public static BufferedImage screenShot(Sheet sheet, CellRect cellRect) {
+        // 从excel读取截图范围内的信息
+        readCellRect(sheet, cellRect);
+        int imageWidth = cellRect.getTotalWidth();
+        int imageHeight = cellRect.getTotalHeight();
+        // 创建image
+        BufferedImage image = new BufferedImage(imageWidth, imageHeight,
+                BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g2d = image.createGraphics();
+        // 平滑字体
+        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        // 图片背景色
+        g2d.setColor(cellRect.getBackgroundColor());
+        g2d.fillRect(0, 0, imageWidth, imageHeight);
+        // 遍历CellInfo,将单元格输出到图片
+        for (CellInfo cellInfo : cellRect.getCellInfos()) {
+            // 背景色
+            if (cellInfo.getBackgroundColor() != null) {
+                g2d.setColor(cellInfo.getBackgroundColor());
+                g2d.fillRect(cellInfo.getX(), cellInfo.getY(), cellInfo.getWidth(), cellInfo.getHeight());
+            }
+            // 边框
+            if (cellInfo.isBordered()) {
+                g2d.setColor(cellInfo.getBorderColor());
+                g2d.setStroke(new BasicStroke(cellInfo.getBorderWidth()));
+                g2d.drawRect(cellInfo.getX(), cellInfo.getY(), cellInfo.getWidth(), cellInfo.getHeight());
+            }
+            // 写入值
+            g2d.setColor(cellInfo.getTextColor());
+            // 获取cellInfo的字体
+            java.awt.Font font = cellInfo.getFont();
+            String text = cellInfo.getText();
+            int stringWidth = g2d.getFontMetrics(font).stringWidth(text);
+            g2d.setFont(font);
+            g2d.drawString(text, cellInfo.getX() + (cellInfo.getWidth() - stringWidth) / 2,
+                    cellInfo.getY() + (cellInfo.getHeight() - font.getSize()) / 2 + font.getSize());
+        }
+        g2d.dispose();
+        return image;
+    }
+
+    /**
+     * 读取sheet中由cellRect指定的矩形区域内容,更新cellRect对象
+     */
+    public static void readCellRect(Sheet sheet, CellRect cellRect) {
+        List<CellInfo> cellInfos = new ArrayList<>();
+        cellRect.setCellInfos(cellInfos);
+        // 种树原理,树比树空多1, 0-34有35个树空,需要种36棵树
+        int[] colPixPos = new int[cellRect.getEndCol() - cellRect.getStartCol() + 2];
+        int[] rowPixPos = new int[cellRect.getEndRow() - cellRect.getStartRow() + 2];
+        colPixPos[0] = cellRect.getMargin();
+        rowPixPos[0] = cellRect.getMargin();
+        for (int i = cellRect.getStartCol(); i <= cellRect.getEndCol(); i++) {
+            colPixPos[i + 1 - cellRect.getStartCol()] = (int) sheet.getColumnWidthInPixels(i) * 115 / 100
+                    + colPixPos[i - cellRect.getStartCol()];
+        }
+        Row row;
+        Cell cell;
+        CellStyle cellStyle;
+        // 获取sheet中的合并单元格
+        List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
+        // 获取sheet中的条件背景色
+        Map<String, ThreeColorGradient> conditionalBackgroundColor = getConditionalBackgroundColor(sheet);
+        for (int i = cellRect.getStartRow(); i <= cellRect.getEndRow(); i++) {
+            row = sheet.getRow(i);
+            if (row == null) {
+                throw new RuntimeException(String.format("readCellRectd调用出错, Row-%s 为空", i));
+            }
+            rowPixPos[i + 1 - cellRect.getStartRow()] = (int) row.getHeightInPoints() * 96 / 72
+                    + rowPixPos[i - cellRect.getStartRow()];
+            for (int j = cellRect.getStartCol(); j <= cellRect.getEndCol(); j++) {
+                // 行号i 列号j
+                // 判断是否为合并单元格
+                int[] inMerged = isInMerged(i, j, mergedRegions);
+                if (inMerged[0] == 0 && inMerged[1] == 0) {
+                    // 是合并单元格且不是第一个单元格,可以忽略,跳过单元格
+                    continue;
+                }
+                cell = row.getCell(j);
+                // 其他情况都不能忽略
+                CellInfo cellInfo = new CellInfo();
+                cellInfos.add(cellInfo);
+                // 截图的时候应该按照原格式显示,比如保留的小数位
+                cellInfo.setText(readCellValueAsString(cell));
+                // 判断单元格是否包含条件背景色
+                threeColorGradient = conditionalBackgroundColor.get(i + "-" + j);
+                if (threeColorGradient != null) {
+                    cellInfo.setBackgroundColor(threeColorGradient.getColor(row.getCell(j).getNumericCellValue()));
+                }
+                // 检查背景色
+                cellStyle = cell.getCellStyle();
+                // excel填充一般都是前景色
+                Color fillForegroundColorColor = cellStyle.getFillForegroundColorColor();
+                if (fillForegroundColorColor != null) {
+                    cellInfo.setBackgroundColor(colorCodec(fillForegroundColorColor));
+                }
+                // 是否有边框,只检查左边框,只要不是NONE,截图就设置为全边框
+                if (cellStyle.getBorderLeft().equals(BorderStyle.NONE)) {
+                    cellInfo.setBordered(false);
+                }
+                // 字体相关
+                Font fontAt = sheet.getWorkbook().getFontAt(cellStyle.getFontIndex());
+                // 字体颜色
+                cellInfo.setTextColor(fontColorCodec(fontAt, sheet.getWorkbook()));
+                StringBuffer stringBuffer = new StringBuffer();
+                // fontfamily
+                if (cellRect.getFontFamily() != null) {
+                    stringBuffer.append(cellRect.getFontFamily());
+                } else {
+                    stringBuffer.append(fontAt.getFontName());
+                }
+                // 加粗还是正常
+                if (fontAt.getBold()) {
+                    stringBuffer.append("-BOLD-");
+                } else {
+                    stringBuffer.append("-PLAIN-");
+                }
+                // 字体大小
+                int fontSize = fontAt.getFontHeightInPoints();
+                stringBuffer.append(Math.max(fontSize, cellRect.getFontSizeMin()));
+                cellInfo.setFont(stringBuffer.toString());
+                // 坐标
+                cellInfo.setX(colPixPos[j - cellRect.getStartCol()]);
+                cellInfo.setY(rowPixPos[i - cellRect.getStartRow()]);
+                // 计算单元格宽度和高度
+                cellInfo.setWidth(colPixPos[j + 1 - cellRect.getStartCol()] - colPixPos[j - cellRect.getStartCol()]);
+                cellInfo.setHeight(rowPixPos[i + 1 - cellRect.getStartRow()] - rowPixPos[i - cellRect.getStartRow()]);
+                // 合并单元格需要重新计算宽度和高度
+                if (inMerged[0] != -1 && inMerged[1] != -1) {
+                    cellInfo.setWidth(colPixPos[inMerged[1] + 1 - cellRect.getStartCol()]
+                            - colPixPos[j - cellRect.getStartCol()]);
+                    cellInfo.setHeight(rowPixPos[inMerged[0] + 1 - cellRect.getStartRow()]
+                            - rowPixPos[i - cellRect.getStartRow()]);
+                }
+            }
+        }
+        cellRect.setTotalWidth(colPixPos[colPixPos.length - 1] + cellRect.getMargin() + 1);
+        cellRect.setTotalHeight(rowPixPos[rowPixPos.length - 1] + cellRect.getMargin() + 1);
+    }
+
+    private static java.awt.Color fontColorCodec(Font fontAt, Workbook workbook) {
+        if (fontAt instanceof XSSFFont) {
+            XSSFColor xssfColor = ((XSSFFont) fontAt).getXSSFColor();
+            if (xssfColor != null) {
+                return Gradient.parse(xssfColor.getARGB());
+            }
+            return java.awt.Color.BLACK;
+        } else if (fontAt instanceof HSSFFont) {
+            // 未测试
+            return Gradient.parse(((HSSFFont) fontAt).getHSSFColor((HSSFWorkbook) workbook).getTriplet());
+        }
+        throw new RuntimeException("excel文件格式错误:既不是07格式也不是03格式");
+    }
+
+    /**
+     * 颜色转化
+     */
+    private static java.awt.Color colorCodec(Color fillForegroundColorColor) {
+        try {
+            return Gradient.parse(XSSFColor.toXSSFColor(fillForegroundColorColor).getARGB());
+        } catch (IllegalArgumentException e) {
+            return Gradient.parse(HSSFColor.toHSSFColor(fillForegroundColorColor).getTriplet());
+        }
+    }
+
+    /**
+     * 读取单元格到字符串格式,按excel可见格式格式化字符串
+     */
+    public static String readCellValueAsString(Cell cell) {
+        if (cell == null) {
+            return null;
+        } else {
+            switch (cell.getCellType()) {
+                case STRING:
+                    return cell.getStringCellValue();
+                case NUMERIC: // 数字
+                    if (DateUtil.isCellDateFormatted(cell)) {
+                        // 日期格式,采用固定方式返回
+                        return dateFormat.format(cell.getDateCellValue());
+                    }
+                    // 数字格式,使用excel的方式格式化 示例:百分比 0.00% 保留1位小数 0.0
+                    String dataFormatString = cell.getCellStyle().getDataFormatString();
+                    if (dataFormatString.equalsIgnoreCase("general")) {
+                        return new DecimalFormat().format(cell.getNumericCellValue());
+                    } else {
+                        return new DecimalFormat(dataFormatString).format(cell.getNumericCellValue());
+                    }
+                case FORMULA: // 公式
+                    Workbook workbook = cell.getSheet().getWorkbook();
+                    FormulaEvaluator evaluator;
+                    CellValue cellValue;
+                    if (workbook instanceof HSSFWorkbook) {
+                        evaluator = new HSSFFormulaEvaluator((HSSFWorkbook) workbook);
+                        cellValue = evaluator.evaluate(cell);
+                    } else if (workbook instanceof XSSFWorkbook) {
+                        evaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);
+                        cellValue = evaluator.evaluate(cell);
+                    } else {
+                        throw new RuntimeException(String.format("单元格%d行%d列FormulaEvaluator创建失败, 无法识别workbook的类型",
+                                cell.getRowIndex(), cell.getColumnIndex()));
+                    }
+                    switch (cellValue.getCellType()) {
+                        case STRING:
+                            return cellValue.getStringValue();
+                        case NUMERIC:
+                            if (DateUtil.isCellDateFormatted(cell)) {
+                                // 日期格式,采用固定方式返回
+                                return dateFormat.format(cell.getDateCellValue());
+                            }
+                            // 数字格式,使用excel的方式格式化 示例:百分比 0.00% 保留1位小数 0.0
+                            String dataFormatString2 = cell.getCellStyle().getDataFormatString();
+                            if (dataFormatString2.equalsIgnoreCase("general")) {
+                                return new DecimalFormat().format(cell.getNumericCellValue());
+                            } else {
+                                return new DecimalFormat(dataFormatString2).format(cell.getNumericCellValue());
+                            }
+                        default:
+                            return cellValue.formatAsString();
+                    }
+                case BLANK:
+                    return "";
+                case BOOLEAN:
+                    return String.valueOf(cell.getBooleanCellValue());
+                case ERROR:
+                    throw new RuntimeException(
+                            String.format("单元格%d行%d列上有错误", cell.getRowIndex(), cell.getColumnIndex()));
+                case _NONE:
+                    return null;
+                default:
+                    return null;
+            }
+        }
+    }
+
+    /**
+     * 判断单元格是否为合并单元格
+     */
+    public static int[] isInMerged(int row, int col, List<CellRangeAddress> mergedRegions) {
+        int[] isInMergedStatus = { -1, -1 };
+        for (CellRangeAddress cellRangeAddress : mergedRegions) {
+            if (row == cellRangeAddress.getFirstRow() && col == cellRangeAddress.getFirstColumn()) {
+                isInMergedStatus[0] = cellRangeAddress.getLastRow();
+                isInMergedStatus[1] = cellRangeAddress.getLastColumn();
+                return isInMergedStatus;
+            }
+            if (row >= cellRangeAddress.getFirstRow() && row <= cellRangeAddress.getLastRow()) {
+                if (col >= cellRangeAddress.getFirstColumn() && col <= cellRangeAddress.getLastColumn()) {
+                    isInMergedStatus[0] = 0;
+                    isInMergedStatus[1] = 0;
+                    return isInMergedStatus;
+                }
+            }
+        }
+        return isInMergedStatus;
+    }
+
+    /**
+     * 读取sheet中的条件背景颜色
+     * 当前仅支持三色渐进色条件背景
+     */
+    private static Map<String, ThreeColorGradient> getConditionalBackgroundColor(Sheet sheet) {
+        SheetConditionalFormatting sheetConditionalFormatting = sheet.getSheetConditionalFormatting();
+        int numConditionalFormattings = sheetConditionalFormatting.getNumConditionalFormattings();
+        Row row;
+        Map<String, ThreeColorGradient> map = new HashMap<>();
+        // 遍历所有条件格式
+        for (int i = 0; i < numConditionalFormattings; i++) {
+            ConditionalFormatting conditionalFormattingAt = sheetConditionalFormatting.getConditionalFormattingAt(i);
+            CellRangeAddress[] formattingRanges = conditionalFormattingAt.getFormattingRanges();
+            // 遍历1项条件格式的所有区域
+            for (CellRangeAddress cellRangeAddress : formattingRanges) {
+                int firstColumn = cellRangeAddress.getFirstColumn();
+                int firstRow = cellRangeAddress.getFirstRow();
+                int lastColumn = cellRangeAddress.getLastColumn();
+                int lastRow = cellRangeAddress.getLastRow();
+                List<Double> values = new ArrayList<>();
+                ThreeColorGradient threeColorGradient = new ThreeColorGradient();
+                // 遍历条件格式包含的所有单元格,获取取值
+                for (int j = firstRow; j <= lastRow; j++) {
+                    row = sheet.getRow(j);
+                    for (int k = firstColumn; k <= lastColumn; k++) {
+                        map.put(j + "-" + k, threeColorGradient);
+                        values.add(row.getCell(k).getNumericCellValue());
+                    }
+                }
+                // 排序
+                values.sort(Comparator.comparing(Double::doubleValue));
+                threeColorGradient.setStartValue(values.get(0));
+                threeColorGradient.setEndValue(values.get(values.size() - 1));
+                threeColorGradient.setMiddleValue(values.get(values.size() / 2));
+                // 渐进色颜色
+                for (int j = 0; j < conditionalFormattingAt.getNumberOfRules(); j++) {
+                    ColorScaleFormatting colorScaleFormatting = conditionalFormattingAt.getRule(j)
+                            .getColorScaleFormatting();
+                    if (colorScaleFormatting != null) {
+                        Color[] colors = colorScaleFormatting.getColors();
+                        threeColorGradient.setStartColor(colorCodec(colors[0]));
+                        threeColorGradient.setMiddleColor(colorCodec(colors[1]));
+                        threeColorGradient.setEndColor(colorCodec(colors[2]));
+                    }
+                }
+            }
+        }
+        return map;
+    }
+
+    // 复制单元格内容
+    public static void copyCellValue(Cell sourceCell, Cell targetCell) {
+        if (sourceCell == null) {
+            targetCell.setCellValue("");
+        } else {
+            switch (sourceCell.getCellType()) {
+                case BLANK:
+                    targetCell.setCellValue("");
+                    break;
+                case BOOLEAN:
+                    targetCell.setCellValue(sourceCell.getBooleanCellValue());
+                    break;
+                case ERROR:
+                    targetCell.setCellErrorValue(sourceCell.getErrorCellValue());
+                    break;
+                case FORMULA:
+                    targetCell.setCellFormula(sourceCell.getCellFormula());
+                    break;
+                case NUMERIC:
+                    targetCell.setCellValue(sourceCell.getNumericCellValue());
+                    break;
+                case STRING:
+                    targetCell.setCellValue(sourceCell.getStringCellValue());
+                    break;
+                default:
+                    targetCell.setCellValue("");
+                    break;
+            }
+        }
+    }
+}

+ 19 - 0
src/main/java/com/nokia/common/spring/jpa/converter/JSONObjectConverter.java

@@ -0,0 +1,19 @@
+package com.nokia.common.spring.jpa.converter;
+
+import com.alibaba.fastjson2.JSONObject;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+
+@Converter
+public class JSONObjectConverter implements AttributeConverter<JSONObject, String>{
+    @Override
+    public String convertToDatabaseColumn(JSONObject jsonObject) {
+        return jsonObject.toString();
+    }
+
+    @Override
+    public JSONObject convertToEntityAttribute(String s) {
+        return JSONObject.parseObject(s);
+    }
+}

+ 0 - 2
src/main/java/com/nokia/tsl_data/TslDataApplication.java

@@ -1,13 +1,11 @@
 package com.nokia.tsl_data;
 
-import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
 
 @SpringBootApplication
 @EnableJpaAuditing
-@MapperScan("com.nokia.tsl_data.dao")
 public class TslDataApplication {
 
     public static void main(String[] args) {

+ 0 - 16
src/main/java/com/nokia/tsl_data/config/DefaultJdbcTemplateConfig.java

@@ -1,16 +0,0 @@
-package com.nokia.tsl_data.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.jdbc.core.JdbcTemplate;
-
-import javax.sql.DataSource;
-
-@Configuration
-public class DefaultJdbcTemplateConfig {
-
-    @Bean
-    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
-        return new JdbcTemplate(dataSource);
-    }
-}

+ 0 - 12
src/main/java/com/nokia/tsl_data/config/PropertiesConfig.java

@@ -1,12 +0,0 @@
-package com.nokia.tsl_data.config;
-
-import com.nokia.tsl_data.properties.CustomerRateTargetProperties;
-import com.nokia.tsl_data.properties.DataWarehouseProperties;
-import com.nokia.tsl_data.properties.OutputProperties;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@EnableConfigurationProperties({DataWarehouseProperties.class, OutputProperties.class, CustomerRateTargetProperties.class})
-public class PropertiesConfig {
-}

+ 16 - 4
src/main/java/com/nokia/tsl_data/config/WorkFlowJdbcTemplateConfig.java → src/main/java/com/nokia/tsl_data/config/TslDataConfig.java

@@ -1,18 +1,30 @@
 package com.nokia.tsl_data.config;
 
+import com.nokia.tsl_data.properties.CustomerRateTargetProperties;
+import com.nokia.tsl_data.properties.DataWarehouseProperties;
+import com.nokia.tsl_data.properties.OutputProperties;
 import com.zaxxer.hikari.HikariConfig;
 import com.zaxxer.hikari.HikariDataSource;
+
+import javax.sql.DataSource;
+
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.jdbc.core.JdbcTemplate;
 
-/**
- * 注入工作流查询专用的workFlowJdbcTemplate
- */
 @Configuration
-public class WorkFlowJdbcTemplateConfig {
+@EnableConfigurationProperties({ DataWarehouseProperties.class, OutputProperties.class,
+        CustomerRateTargetProperties.class })
+public class TslDataConfig {
+
+    @Bean
+    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
+        return new JdbcTemplate(dataSource);
+    }
 
     /**
+     * 注入工作流查询专用的workFlowJdbcTemplate
      * 连接到工作流数据库的jdbcTemplate
      */
     @Bean("workFlowJdbcTemplate")

+ 52 - 0
src/main/java/com/nokia/tsl_data/scheduling/controller/RegisteredTaskController.java

@@ -0,0 +1,52 @@
+package com.nokia.tsl_data.scheduling.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.nokia.common.http.vo.R;
+import com.nokia.tsl_data.scheduling.entity.RegisteredTask;
+import com.nokia.tsl_data.scheduling.service.RegisteredTaskService;
+
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("common/scheduling/task/registered")
+public class RegisteredTaskController {
+
+    private final RegisteredTaskService registeredTaskService;
+    private final ObjectMapper objectMapper;
+
+    public RegisteredTaskController(RegisteredTaskService registeredTaskService, ObjectMapper objectMapper) {
+        this.registeredTaskService = registeredTaskService;
+        this.objectMapper = objectMapper;
+    }
+
+    @PostMapping("add")
+    public R add(@RequestBody String body) {
+        try {
+            RegisteredTask registeredTask = objectMapper.readValue(body, RegisteredTask.class);
+            registeredTaskService.add(registeredTask);
+            return R.ok().message("注册成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error().message(e.getMessage());
+        }
+    }
+
+    @PostMapping("delete")
+    public R delete(@RequestBody Long id) {
+        try {
+            registeredTaskService.deleteById(id);
+            return R.ok().message("删除成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error().message(e.getMessage());
+        }
+    }
+
+    @PostMapping("list/all")
+    public R listAll() {
+        return R.ok().data(registeredTaskService.listAll());
+    }
+}

+ 79 - 0
src/main/java/com/nokia/tsl_data/scheduling/controller/ScheduledTaskController.java

@@ -0,0 +1,79 @@
+package com.nokia.tsl_data.scheduling.controller;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.nokia.common.http.vo.R;
+import com.nokia.tsl_data.scheduling.entity.ScheduledTask;
+import com.nokia.tsl_data.scheduling.service.SchedulingService;
+
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("common/scheduling/task/scheduled")
+public class ScheduledTaskController {
+
+    private final SchedulingService schedulingService;
+    private final ObjectMapper objectMapper;
+
+    public ScheduledTaskController(SchedulingService schedulingService, ObjectMapper objectMapper) {
+        this.schedulingService = schedulingService;
+        this.objectMapper = objectMapper;
+    }
+
+    @PostMapping("add")
+    public R add(@RequestBody String body) {
+        try {
+            ScheduledTask task = objectMapper.readValue(body, ScheduledTask.class);
+            schedulingService.add(task);
+            return R.ok();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error().message(e.getMessage());
+        }
+    }
+
+    @PostMapping("delete")
+    public R delete(@RequestBody Long id) {
+        try {
+            schedulingService.deleteById(id);
+            return R.ok();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error().message(e.getMessage());
+        }
+    }
+
+    @PostMapping("update")
+    public R update(@RequestBody String body) {
+        try {
+            ScheduledTask task = objectMapper.readValue(body, ScheduledTask.class);
+            schedulingService.update(task);
+            return R.ok();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error().message(e.getMessage());
+        }
+    }
+
+    @PostMapping("list/all")
+    public R listAll() {
+        try {
+            return R.ok().data(schedulingService.listAll());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error().message(e.getMessage());
+        }
+    }
+
+    @PostMapping("list/scheduled")
+    public R listScheduled() {
+        try {
+            return R.ok().data(schedulingService.listScheduled());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error().message(e.getMessage());
+        }
+    }
+}

+ 42 - 0
src/main/java/com/nokia/tsl_data/scheduling/dao/DatabaseInitializeMapper.java

@@ -0,0 +1,42 @@
+package com.nokia.tsl_data.scheduling.dao;
+
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+@Mapper
+public interface DatabaseInitializeMapper {
+
+    @Select("select count(1) from information_schema.schemata where schema_name = 'scheduling'")
+    boolean ifSchemaExists();
+
+    @Insert("create schema if not exists scheduling ")
+    int createSchema();
+
+    @Update("CREATE TABLE if not exists scheduling.registered_task (\n" +
+            "    id bigint NOT NULL primary key,\n" +
+            "    bean_name text NOT NULL,\n" +
+            "    method_name text NOT NULL,\n" +
+            "    description text,\n" +
+            "    with_parameter boolean,\n" +
+            "    create_time timestamp without time zone\n" +
+            ")")
+    int createTableRegisteredTask();
+
+    @Update("CREATE TABLE if not exists scheduling.scheduled_task (\n" +
+            "    id bigint NOT NULL primary key,\n" +
+            "    name text NOT NULL,\n" +
+            "    registered_task_id bigint NOT NULL,\n" +
+            "    status text DEFAULT false,\n" +
+            "    method_parameter text,\n" +
+            "    scheduled_type text,\n" +
+            "    scheduled_parameter text,\n" +
+            "    fail_reason text,\n" +
+            "    description text,\n" +
+            "    is_delete boolean DEFAULT false NOT NULL,\n" +
+            "    create_time timestamp without time zone,\n" +
+            "    last_modify timestamp without time zone\n" +
+            ")")
+    int createTableScheduledTask();
+}

+ 50 - 0
src/main/java/com/nokia/tsl_data/scheduling/dao/RegisteredTaskMapper.java

@@ -0,0 +1,50 @@
+package com.nokia.tsl_data.scheduling.dao;
+
+import org.apache.ibatis.annotations.*;
+
+import com.nokia.tsl_data.scheduling.entity.RegisteredTask;
+
+import java.util.List;
+
+/**
+ * RegisteredTask 增删查,采用逻辑删除方式
+ */
+@Mapper
+public interface RegisteredTaskMapper {
+
+    @Insert("insert into scheduling.registered_task \n" +
+            "(id, bean_name, method_name, description, with_parameter, create_time) VALUES \n" +
+            "(#{id}, #{beanName}, #{methodName}, #{description}, #{withParameter}, now())")
+    int insertOne(RegisteredTask registeredTask);
+
+    @Results(id = "registeredTaskResults", value = {
+            @Result(property = "id", column = "id", id = true),
+            @Result(property = "beanName", column = "bean_name"),
+            @Result(property = "methodName", column = "method_name"),
+            @Result(property = "description", column = "description"),
+            @Result(property = "withParameter", column = "with_parameter"),
+            @Result(property = "createTime", column = "create_time")
+    })
+    @Select("select * from scheduling.registered_task \n" +
+            "where bean_name = #{beanName} and method_name = #{methodName}")
+    RegisteredTask selectByBeanNameAndMethodName(@Param("beanName") String beanName, @Param("methodName") String methodName);
+
+    default RegisteredTask selectByBeanNameAndMethodName(RegisteredTask registeredTask) {
+        return selectByBeanNameAndMethodName(registeredTask.getBeanName(), registeredTask.getMethodName());
+    }
+
+    @ResultMap("registeredTaskResults")
+    @Select("select * from scheduling.registered_task where id = #{id}")
+    RegisteredTask selectById(long id);
+
+    @ResultMap("registeredTaskResults")
+    @Select("select * from scheduling.registered_task order by id ")
+    List<RegisteredTask> selectAll();
+
+    @Delete("delete from scheduling.registered_task where id = #{id}")
+    int deleteById(long id);
+
+    @ResultMap("registeredTaskResults")
+    @Select("select * from scheduling.registered_task where name = #{name}")
+    RegisteredTask selectByName(String name);
+}

+ 101 - 0
src/main/java/com/nokia/tsl_data/scheduling/dao/ScheduledTaskMapper.java

@@ -0,0 +1,101 @@
+package com.nokia.tsl_data.scheduling.dao;
+
+import org.apache.ibatis.annotations.*;
+import org.apache.ibatis.mapping.FetchType;
+import org.apache.ibatis.type.JdbcType;
+
+import com.nokia.tsl_data.scheduling.dao.handler.JsonTypeHandler;
+import com.nokia.tsl_data.scheduling.entity.RegisteredTask;
+import com.nokia.tsl_data.scheduling.entity.ScheduledTask;
+
+import java.util.List;
+
+/**
+ * 使用逻辑删除方式 is_delete字段为逻辑删除标识
+ */
+@Mapper
+public interface ScheduledTaskMapper {
+
+    @Insert("insert into scheduling.scheduled_task (id, name, registered_task_id, status, method_parameter, scheduled_type, " +
+            "scheduled_parameter, fail_reason, description, create_time, last_modify) values " +
+            "(#{id}, #{name}, #{registeredTask.id}, #{status}, #{methodParameter}, #{scheduledType}, " +
+            "#{scheduledParameter, jdbcType=VARCHAR, typeHandler=com.nokia.tsl_data.scheduling.dao.handler.JsonTypeHandler}," +
+            "#{failReason}, #{description}, now(), now())")
+    int insertOne(ScheduledTask scheduledTask);
+
+    @Update("<script> update scheduling.scheduled_task set " +
+            "<if test = \"registeredTask != null and registeredTask.id != null \"> " +
+            "registered_task_id = #{registeredTask.id}, </if> " +
+            "<if test = \"status != null \"> status = #{status}, </if> " +
+            "<if test = \"methodParameter != null and methodParameter != '' \"> " +
+            "method_parameter = #{methodParameter}, </if> " +
+            "<if test = \"scheduledType != null\"> scheduled_type = #{scheduledType}, </if> " +
+            "<if test = \"scheduledParameter != null\"> scheduled_parameter = " +
+            "#{scheduledParameter, jdbcType=VARCHAR, typeHandler=com.nokia.tsl_data.scheduling.dao.handler.JsonTypeHandler}, </if> " +
+            "<if test = \"failReason != null\"> fail_reason = #{failReason}, </if> " +
+            "<if test = \"description != null\"> description = #{description}, </if> " +
+            "is_delete = false, last_modify = now() where id = #{id} </script>")
+    int insertOneExists(ScheduledTask scheduledTask);
+
+    @Update("update scheduling.scheduled_task set is_delete = true, last_modify = now() where id = #{id}")
+    int deleteById(long id);
+
+    @Update("<script> update scheduling.scheduled_task <set> " +
+            "<if test = \"name != null and name != '' \"> name = #{name}, </if> " +
+            "<if test = \"registeredTask != null and registeredTask.id != null \"> " +
+            "registered_task_id = #{registeredTask.id}, </if> " +
+            "<if test = \"status != null \"> status = #{status}, </if> " +
+            "<if test = \"methodParameter != null and methodParameter != '' \"> " +
+            "method_parameter = #{methodParameter}, </if> " +
+            "<if test = \"scheduledType != null\"> scheduled_type = #{scheduledType}, </if> " +
+            "<if test = \"scheduledParameter != null\"> scheduled_parameter = " +
+            "#{scheduledParameter, jdbcType=VARCHAR, typeHandler=com.nokia.tsl_data.scheduling.dao.handler.JsonTypeHandler}, </if> " +
+            "<if test = \"failReason != null\"> fail_reason = #{failReason}, </if> " +
+            "<if test = \"description != null\"> description = #{description}, </if> " +
+            "last_modify = now() </set> where id = #{id} </script>")
+    int updateById(ScheduledTask scheduledTask);
+
+    @Results(id = "scheduledTaskResults", value = {
+            @Result(property = "id", column = "id", id = true),
+            @Result(property = "name", column = "name"),
+            @Result(property = "registeredTask", column = "registered_task_id", javaType = RegisteredTask.class,
+                    one = @One(select = "com.nokia.tsl_data.scheduling.dao.RegisteredTaskMapper.selectById", fetchType = FetchType.EAGER)),
+            @Result(property = "status", column = "status"),
+            @Result(property = "methodParameter", column = "method_parameter"),
+            @Result(property = "scheduledType", column = "scheduled_type"),
+            @Result(property = "scheduledParameter", column = "scheduled_parameter", jdbcType = JdbcType.VARCHAR, typeHandler = JsonTypeHandler.class),
+            @Result(property = "failReason", column = "fail_reason"),
+            @Result(property = "description", column = "description"),
+            @Result(property = "createTime", column = "create_time"),
+            @Result(property = "lastModify", column = "last_modify")
+    })
+    @Select("select * from scheduling.scheduled_task where is_delete = false order by id ")
+    List<ScheduledTask> selectAll();
+
+    @ResultMap("scheduledTaskResults")
+    @Select("select * from scheduling.scheduled_task where id = #{id} and is_delete = false limit 1 ")
+    ScheduledTask selectById(long id);
+
+    @ResultMap("scheduledTaskResults")
+    @Select("select * from scheduling.scheduled_task where name = #{name} and is_delete = false limit 1 ")
+    ScheduledTask selectByName(String name);
+
+    @Select("select id from scheduling.scheduled_task where name = #{name} and is_delete = false limit 1 ")
+    Long selectIdByName(String name);
+
+    @Select("select id from scheduling.scheduled_task where name = #{name} and is_delete = true limit 1 ")
+    Long selectDeletedIdByName(String name);
+
+    @Select("select count(1) from scheduling.scheduled_task where id = #{id} ")
+    boolean isIdExists(long id);
+
+    @Select("select count(1) from scheduling.scheduled_task where id = #{id} and is_delete = true ")
+    boolean isIdDeleted(long id);
+
+    /**
+     * 选择需要初始化的任务
+     */
+    @ResultMap("scheduledTaskResults")
+    @Select("select * from scheduling.scheduled_task where is_delete = false and status = 'ON' order by id")
+    List<ScheduledTask> selectTaskToInit();
+}

+ 77 - 0
src/main/java/com/nokia/tsl_data/scheduling/dao/handler/JsonTypeHandler.java

@@ -0,0 +1,77 @@
+package com.nokia.tsl_data.scheduling.dao.handler;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * 用于在mybatis中将java类型转化成json字符串存入数据库和从数据库读取json数据转化为java类型
+ * 无法转化集合类型
+ */
+public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
+
+    private static final ObjectMapper MAPPER = new ObjectMapper();
+
+    static {
+        JavaTimeModule module = new JavaTimeModule();
+        MAPPER.registerModule(module);
+    }
+
+    private final Class<T> clz;
+
+    public JsonTypeHandler(Class<T> clz) {
+        this.clz = clz;
+    }
+
+    @Override
+    public T getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
+        if (columnName == null || columnName.isEmpty()) {
+            return null;
+        }
+        return toObject(resultSet.getString(columnName), clz);
+    }
+
+    @Override
+    public T getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
+        return toObject(resultSet.getString(columnIndex), clz);
+    }
+
+    @Override
+    public T getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
+        return toObject(callableStatement.getString(columnIndex), clz);
+    }
+
+    @Override
+    public void setNonNullParameter(PreparedStatement preparedStatement, int columnIndex, T parameter,
+                                    JdbcType jdbcType)
+            throws SQLException {
+        preparedStatement.setString(columnIndex, toJson(parameter));
+    }
+
+    private String toJson(T parameter) {
+        try {
+            return MAPPER.writeValueAsString(parameter);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private T toObject(String content, Class<T> clz) {
+        if (content == null || content.isEmpty()) {
+            return null;
+        }
+        try {
+            return MAPPER.readValue(content, clz);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+}

+ 13 - 0
src/main/java/com/nokia/tsl_data/scheduling/entity/OperateRecord.java

@@ -0,0 +1,13 @@
+package com.nokia.tsl_data.scheduling.entity;
+
+import lombok.Data;
+
+/**
+ * 操作记录
+ */
+@Data
+public class OperateRecord {
+
+    private Long id;
+    private String operate;
+}

+ 23 - 0
src/main/java/com/nokia/tsl_data/scheduling/entity/RegisteredTask.java

@@ -0,0 +1,23 @@
+package com.nokia.tsl_data.scheduling.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.Instant;
+
+/**
+ * 已注册的任务 对应数据库表 scheduling.registered_task
+ * 只增删,不更新,使用物理删除方式
+ */
+@Data
+@Accessors(chain = true)
+public class RegisteredTask {
+
+    private Long id;
+    private String beanName;
+    private String methodName;
+    // 是否携带参数 默认不带参
+    private Boolean withParameter = false;
+    private String description;
+    private Instant createTime;
+}

+ 41 - 0
src/main/java/com/nokia/tsl_data/scheduling/entity/ScheduledTask.java

@@ -0,0 +1,41 @@
+package com.nokia.tsl_data.scheduling.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.Instant;
+import java.util.Objects;
+
+import com.nokia.tsl_data.scheduling.entity._enum.ScheduledStatus;
+import com.nokia.tsl_data.scheduling.entity._enum.ScheduledType;
+import com.nokia.tsl_data.scheduling.entity.pojo.ScheduledParameter;
+
+@Data
+@Accessors(chain = true)
+public class ScheduledTask {
+
+    private Long id;
+    private String name;
+    private RegisteredTask registeredTask;
+    private ScheduledStatus status;
+    private String methodParameter;
+    private ScheduledType scheduledType;
+    private ScheduledParameter scheduledParameter;
+    private String failReason;
+    private String description;
+    private Instant createTime;
+    private Instant lastModify;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        ScheduledTask that = (ScheduledTask) o;
+        return id.equals(that.id) || name.equals(that.name);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id);
+    }
+}

+ 37 - 0
src/main/java/com/nokia/tsl_data/scheduling/entity/_enum/ScheduledStatus.java

@@ -0,0 +1,37 @@
+package com.nokia.tsl_data.scheduling.entity._enum;
+
+/**
+ * 任务调度状态
+ * ON 启动 只有ON是需要调度的
+ * OFF 关闭
+ * DONE 结束
+ * TIMEOUT 超时
+ * FAILED 任务失败
+ */
+public enum ScheduledStatus {
+    ON, OFF, DONE, TIMEOUT, FAILED;
+
+    public static ScheduledStatus ofValue(String value) {
+        for (ScheduledStatus status : values()) {
+            if (status.toString().equalsIgnoreCase(value)) {
+                return status;
+            }
+        }
+        throw new RuntimeException("不存在 " + value +
+                " 对应的ScheduledStatus,允许的状态包括: ON, OFF, COMPLETE, TIMEOUT");
+    }
+
+    /**
+     * 是否需要启动调度
+     */
+    public boolean needToStartSchedule() {
+        return this.equals(ON);
+    }
+
+    /**
+     * 是否需要停止调度
+     */
+    public boolean needToStopSchedule() {
+        return this.equals(OFF);
+    }
+}

+ 23 - 0
src/main/java/com/nokia/tsl_data/scheduling/entity/_enum/ScheduledType.java

@@ -0,0 +1,23 @@
+package com.nokia.tsl_data.scheduling.entity._enum;
+
+/**
+ * 任务调度类型
+ * IMMEDIATELY 立即调度 无需指定任何参数
+ * ONCE 按指定的时间或者延时调度一次 需要指定 startTime 或 delayOfSeconds
+ * CRON 定时调度 必须指定cronExpression
+ * INTERVAL 周期调度, 两次调度开始之间经过固定的周期,必须指定 delayOfSeconds,可选指定 startTime
+ * FIXED_DELAY 固定延时, 上一次调度的结束和下次任务调度开始之间经过固定时间,必须指定delayOfSeconds,可选指定startTime
+ */
+public enum ScheduledType {
+    IMMEDIATELY, ONCE, CRON, INTERVAL, FIXED_DELAY;
+
+    public static ScheduledType ofValue(String value) {
+        for (ScheduledType type : values()) {
+            if (type.toString().equalsIgnoreCase(value)) {
+                return type;
+            }
+        }
+        throw new RuntimeException("不存在 " + value +
+                " 对应的ScheduledType,允许的类型包括: IMMEDIATELY, ONCE, CRON, INTERVAL, FIXED_DELAY");
+    }
+}

+ 39 - 0
src/main/java/com/nokia/tsl_data/scheduling/entity/pojo/CallableTask.java

@@ -0,0 +1,39 @@
+package com.nokia.tsl_data.scheduling.entity.pojo;
+
+import lombok.Data;
+import org.springframework.context.ApplicationContext;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.util.StringUtils;
+
+import com.nokia.tsl_data.scheduling.entity.ScheduledTask;
+
+import java.lang.reflect.Method;
+import java.util.concurrent.Callable;
+
+@Data
+public class CallableTask implements Callable<Void> {
+
+    private final ApplicationContext applicationContext;
+    private final ScheduledTask scheduledTask;
+
+    public CallableTask(ApplicationContext applicationContext, ScheduledTask scheduledTask) {
+        this.applicationContext = applicationContext;
+        this.scheduledTask = scheduledTask;
+    }
+
+    @Override
+    public Void call() throws Exception {
+        Object bean = applicationContext.getBean(scheduledTask.getRegisteredTask().getBeanName());
+        Method method;
+        if (!StringUtils.hasLength(scheduledTask.getMethodParameter())) {
+            method = bean.getClass().getMethod(scheduledTask.getRegisteredTask().getMethodName());
+            ReflectionUtils.makeAccessible(method);
+            method.invoke(bean);
+        } else {
+            method = bean.getClass().getMethod(scheduledTask.getRegisteredTask().getMethodName(),
+                    String.class);
+            method.invoke(bean, scheduledTask.getMethodParameter());
+        }
+        return null;
+    }
+}

+ 67 - 0
src/main/java/com/nokia/tsl_data/scheduling/entity/pojo/RunnableTask.java

@@ -0,0 +1,67 @@
+package com.nokia.tsl_data.scheduling.entity.pojo;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.util.StringUtils;
+
+import com.nokia.tsl_data.scheduling.entity.ScheduledTask;
+import com.nokia.tsl_data.scheduling.entity._enum.ScheduledStatus;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * 执行任务的实体类
+ */
+@Slf4j
+@Data
+public class RunnableTask implements Runnable {
+
+    private final ApplicationContext applicationContext;
+    private final ScheduledTask scheduledTask;
+
+    public RunnableTask(ApplicationContext applicationContext, ScheduledTask scheduledTask) {
+        this.applicationContext = applicationContext;
+        this.scheduledTask = scheduledTask;
+    }
+
+    @Override
+    public void run() {
+        try {
+            Object bean = applicationContext.getBean(scheduledTask.getRegisteredTask().getBeanName());
+            Method method;
+            if (!StringUtils.hasLength(scheduledTask.getMethodParameter())) {
+                method = bean.getClass().getMethod(scheduledTask.getRegisteredTask().getMethodName());
+                ReflectionUtils.makeAccessible(method);
+                method.invoke(bean);
+            } else {
+                method = bean.getClass().getMethod(scheduledTask.getRegisteredTask().getMethodName(),
+                        String.class);
+                method.invoke(bean, scheduledTask.getMethodParameter());
+            }
+        } catch (NoSuchBeanDefinitionException e) {
+            handleException(e);
+            log.error("未找到任务--任务:{}", scheduledTask.getName());
+        } catch (NoSuchMethodException e) {
+            handleException(e);
+            log.error("未找到方法--任务:{}", scheduledTask.getName());
+        } catch (IllegalAccessException e) {
+            scheduledTask.setStatus(ScheduledStatus.FAILED);
+            scheduledTask.setFailReason(e.getMessage());
+            e.printStackTrace();
+            log.error("方法不允许访问--任务:{}", scheduledTask.getName());
+        } catch (InvocationTargetException e) {
+            handleException(e);
+            log.error("方法执行出错--任务:{}", scheduledTask.getName());
+        }
+    }
+
+    private void handleException(Exception e) {
+        scheduledTask.setStatus(ScheduledStatus.FAILED);
+        scheduledTask.setFailReason(e.getMessage());
+        e.printStackTrace();
+    }
+}

+ 52 - 0
src/main/java/com/nokia/tsl_data/scheduling/entity/pojo/ScheduledParameter.java

@@ -0,0 +1,52 @@
+package com.nokia.tsl_data.scheduling.entity.pojo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.time.Instant;
+
+/**
+ * 调度参数
+ */
+@Data
+@Accessors(chain = true)
+public class ScheduledParameter {
+
+    /**
+     * 定时任务表达式
+     */
+    private String cronExpression;
+
+    /**
+     * 启动时间
+     */
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
+    private Instant startTime;
+
+    /**
+     * 以秒计算的数字,表示周期
+     */
+    private Long periodOfSeconds;
+
+    /**
+     * 以秒计算的数字,表示延时
+     */
+    private Long delayOfSeconds;
+
+    public static ScheduledParameter ofInstant(Instant instant) {
+        return new ScheduledParameter().setStartTime(instant);
+    }
+
+    public static ScheduledParameter ofPeriod(long period) {
+        return new ScheduledParameter().setPeriodOfSeconds(period);
+    }
+
+    public static ScheduledParameter ofDelay(long delay) {
+        return new ScheduledParameter().setDelayOfSeconds(delay);
+    }
+
+    public static ScheduledParameter ofExpression(String expression) {
+        return new ScheduledParameter().setCronExpression(expression);
+    }
+}

+ 31 - 0
src/main/java/com/nokia/tsl_data/scheduling/service/DatabaseInitializeService.java

@@ -0,0 +1,31 @@
+package com.nokia.tsl_data.scheduling.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import com.nokia.tsl_data.scheduling.dao.DatabaseInitializeMapper;
+
+import javax.annotation.PostConstruct;
+
+@Slf4j
+@Service
+public class DatabaseInitializeService {
+
+    private final DatabaseInitializeMapper databaseInitializeMapper;
+
+    public DatabaseInitializeService(DatabaseInitializeMapper databaseInitializeMapper) {
+        this.databaseInitializeMapper = databaseInitializeMapper;
+    }
+
+    @PostConstruct
+    public void checkAndInitializeDatabase() {
+        if (databaseInitializeMapper.ifSchemaExists()) {
+            log.warn("模式 scheduling 已存在...");
+        } else {
+            databaseInitializeMapper.createSchema();
+        }
+        databaseInitializeMapper.createTableRegisteredTask();
+        databaseInitializeMapper.createTableScheduledTask();
+        log.info("已完成scheduling数据库初始化...");
+    }
+}

+ 112 - 0
src/main/java/com/nokia/tsl_data/scheduling/service/RegisteredTaskService.java

@@ -0,0 +1,112 @@
+package com.nokia.tsl_data.scheduling.service;
+
+import com.nokia.common.dao.SnowFlakeUtil;
+import com.nokia.tsl_data.scheduling.dao.RegisteredTaskMapper;
+import com.nokia.tsl_data.scheduling.entity.RegisteredTask;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+/**
+ * RegisteredTask 增删 查 不提供修改
+ */
+@Service
+public class RegisteredTaskService {
+
+    private final RegisteredTaskMapper registeredTaskMapper;
+    private final ApplicationContext applicationContext;
+
+    public RegisteredTaskService(RegisteredTaskMapper registeredTaskMapper, ApplicationContext applicationContext) {
+        this.registeredTaskMapper = registeredTaskMapper;
+        this.applicationContext = applicationContext;
+    }
+
+    /**
+     * 注册新任务
+     */
+    public void add(RegisteredTask registeredTask) {
+        // 检查是否已存在
+        RegisteredTask task = findByBeanNameAndMethodName(registeredTask.getBeanName(), registeredTask.getMethodName());
+        if (task != null) {
+            // 已存在相同beanName和methodName的实例
+            throw new RuntimeException(String.format("存在已注册的相同RegisteredTask==beanName: %s, methodName: %s ...",
+                    registeredTask.getBeanName(), registeredTask.getMethodName()));
+        }
+        // 检查是否在容器中存在beanName和methodName
+        Object bean;
+        try {
+            bean = applicationContext.getBean(registeredTask.getBeanName());
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("注册失败, 容器中未找到bean: " + registeredTask.getBeanName());
+        }
+        if (registeredTask.getWithParameter()) {
+            try {
+                bean.getClass().getMethod(registeredTask.getMethodName(), String.class);
+            } catch (NoSuchMethodException e) {
+                // 容器中不存在beanName和methodName对应的方法
+                throw new RuntimeException(String.format("注册失败,容器中未找到方法== %s.%s()",
+                        registeredTask.getBeanName(), registeredTask.getMethodName()));
+            }
+        } else {
+            try {
+                bean.getClass().getMethod(registeredTask.getMethodName());
+            } catch (NoSuchMethodException e) {
+                // 容器中不存在beanName和methodName对应的方法
+                throw new RuntimeException(String.format("注册失败,容器中未找到方法== %s.%s()",
+                        registeredTask.getBeanName(), registeredTask.getMethodName()));
+            }
+        }
+        // 使用雪花算法给出id
+        registeredTask.setId(SnowFlakeUtil.getSnowFlakeId());
+        registeredTaskMapper.insertOne(registeredTask);
+    }
+
+    /**
+     * 删除已注册任务
+     */
+    public void deleteById(long id) {
+        registeredTaskMapper.deleteById(id);
+    }
+
+    /**
+     * 查找全部
+     */
+    public List<RegisteredTask> listAll() {
+        return registeredTaskMapper.selectAll();
+    }
+
+    public RegisteredTask findById(long id) {
+        return registeredTaskMapper.selectById(id);
+    }
+
+    /**
+     * 根据beanName和methodName查找
+     */
+    public RegisteredTask findByBeanNameAndMethodName(String beanName, String methodName) {
+        return registeredTaskMapper.selectByBeanNameAndMethodName(beanName, methodName);
+    }
+
+    /**
+     * 检查并返回数据库存储的RegisteredTask,id为第一优先级,否则按照beanName和methodName查找
+     */
+    public RegisteredTask check(RegisteredTask registeredTask) {
+        RegisteredTask result = null;
+        if (registeredTask == null) {
+            throw new RuntimeException("注册任务不能为空...");
+        }
+        if (registeredTask.getId() != null) {
+            result = findById(registeredTask.getId());
+        } else if (StringUtils.hasLength(registeredTask.getBeanName())
+                && StringUtils.hasLength(registeredTask.getMethodName())) {
+            result = findByBeanNameAndMethodName(registeredTask.getBeanName(), registeredTask.getMethodName());
+        }
+        if (result == null) {
+            throw new RuntimeException("注册任务不存在...");
+        }
+        return result;
+    }
+}

+ 178 - 0
src/main/java/com/nokia/tsl_data/scheduling/service/SchedulingService.java

@@ -0,0 +1,178 @@
+package com.nokia.tsl_data.scheduling.service;
+
+import com.nokia.common.dao.SnowFlakeUtil;
+import com.nokia.tsl_data.scheduling.dao.ScheduledTaskMapper;
+import com.nokia.tsl_data.scheduling.entity.RegisteredTask;
+import com.nokia.tsl_data.scheduling.entity.ScheduledTask;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * ScheduledTask增删改查
+ */
+@Slf4j
+@Service
+public class SchedulingService {
+
+    private final ScheduledTaskMapper scheduledTaskMapper;
+    private final RegisteredTaskService registeredTaskService;
+    private final TaskScheduleService taskScheduleService;
+
+    public SchedulingService(ScheduledTaskMapper scheduledTaskMapper, RegisteredTaskService registeredTaskService, TaskScheduleService taskScheduleService) {
+        this.scheduledTaskMapper = scheduledTaskMapper;
+        this.registeredTaskService = registeredTaskService;
+        this.taskScheduleService = taskScheduleService;
+    }
+
+    public RegisteredTask findRegisteredTaskByBeanNameAndMethodName(String beanName, String methodName) {
+        return registeredTaskService.findByBeanNameAndMethodName(beanName, methodName);
+    }
+
+    /**
+     * 新增
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void add(ScheduledTask scheduledTask) {
+        // 检查 RegisteredTask 是否已注册
+        scheduledTask.setRegisteredTask(registeredTaskService.check(scheduledTask.getRegisteredTask()));
+        // 检查status
+        if (scheduledTask.getStatus() == null) {
+            throw new RuntimeException("任务状态 status 不能为空...");
+        }
+        if (scheduledTask.getScheduledType() == null) {
+            throw new RuntimeException("任务类型 scheduledType 不能为空...");
+        }
+        // 检查methodParameter
+        if (scheduledTask.getRegisteredTask().getWithParameter()) {
+            if (scheduledTask.getMethodParameter() == null) {
+                throw new RuntimeException("方法参数 methodParameter 不能为空...");
+            }
+        } else {
+            // 对于不需要参数的情况,直接忽略输出的参数
+            scheduledTask.setMethodParameter(null);
+        }
+        // 检查name是否为空
+        String name = scheduledTask.getName();
+        // name为空时按照默认方式命名
+        if (!StringUtils.hasLength(name)) {
+            name = getDefaultName(scheduledTask);
+            scheduledTask.setName(name);
+        }
+        // 检查是否已存在同名
+        Long id = scheduledTaskMapper.selectIdByName(name);
+        if (id != null) {
+            throw new RuntimeException("已存在同名任务: " + name);
+        }
+        // 检查是否存在同名已删除任务
+        id = scheduledTaskMapper.selectDeletedIdByName(name);
+        if (id != null) {
+            scheduledTaskMapper.insertOneExists(scheduledTask.setId(id));
+        } else {
+            // 保存任务 通过雪花算法计算id
+            scheduledTask.setId(SnowFlakeUtil.getSnowFlakeId());
+            scheduledTaskMapper.insertOne(scheduledTask);
+        }
+        // 调度的任务是保存后的任务
+        if (scheduledTask.getStatus().needToStartSchedule()) {
+            ScheduledTask task = scheduledTaskMapper.selectById(scheduledTask.getId());
+            taskScheduleService.schedule(task);
+        }
+    }
+
+    /**
+     * 删除
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteById(long id) {
+        ScheduledTask scheduledTask = scheduledTaskMapper.selectById(id);
+        if (scheduledTask == null) {
+            throw new RuntimeException("无法删除不存在的任务: id = " + id);
+        }
+        scheduledTaskMapper.deleteById(scheduledTask.getId());
+        if (scheduledTask.getStatus().needToStartSchedule()) {
+            if (taskScheduleService.isTaskScheduled(scheduledTask)) {
+                taskScheduleService.remove(scheduledTask);
+            }
+        }
+    }
+
+    /**
+     * 更新 默认需要更新的都是已存在的
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void update(ScheduledTask scheduledTask) {
+        Long id = scheduledTask.getId();
+        // 检查id是否为空
+        if (id == null) {
+            throw new RuntimeException("更新 ScheduledTask 时 id 不能为空...");
+        }
+        // 检查id是否存在
+        if (!scheduledTaskMapper.isIdExists(id)) {
+            throw new RuntimeException("更新 ScheduledTask 时指定的 id: " + id + " 不存在...");
+        }
+        // 检查id是否已删除
+        if (scheduledTaskMapper.isIdDeleted(id)) {
+            throw new RuntimeException("无法更新已删除的 ScheduledTask 任务...");
+        }
+        // 检查 RegisteredTask 如果不存在 则会设置为null
+        if (scheduledTask.getRegisteredTask() != null) {
+            scheduledTask.setRegisteredTask(registeredTaskService.check(scheduledTask.getRegisteredTask()));
+        }
+        // 更新数据库表
+        scheduledTaskMapper.updateById(scheduledTask);
+        if (scheduledTask.getStatus() != null) {
+            // 更新数据库表后
+            ScheduledTask task = scheduledTaskMapper.selectById(scheduledTask.getId());
+            if (task.getStatus().needToStartSchedule()) {
+                // 需要启动调度
+                taskScheduleService.schedule(task);
+            } else if(task.getStatus().needToStopSchedule()) {
+                // 需要停止调度
+                taskScheduleService.remove(task);
+            }
+        }
+    }
+
+    public List<ScheduledTask> listAll() {
+        return scheduledTaskMapper.selectAll();
+    }
+
+    public List<ScheduledTask> listScheduled() {
+        return taskScheduleService.ListTasksScheduled();
+    }
+
+    /**
+     * 默认的命名方式
+     */
+    private String getDefaultName(ScheduledTask scheduledTask) {
+        switch (scheduledTask.getScheduledType()) {
+            case CRON:
+            case INTERVAL:
+            case FIXED_DELAY:
+                log.warn("重复执行的任务建议不要使用默认命名...");
+                // beanName_methodName
+                return String.format("%s_%s",
+                        scheduledTask.getRegisteredTask().getBeanName(),
+                        scheduledTask.getRegisteredTask().getMethodName()
+                );
+            case ONCE:
+            case IMMEDIATELY:
+            default:
+                // beanName_methodName_时间字符串 common.schedulingService_test1_20231123104500
+                return String.format(
+                        "%s_%s_%s",
+                        scheduledTask.getRegisteredTask().getBeanName(),
+                        scheduledTask.getRegisteredTask().getMethodName(),
+                        DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Asia/Shanghai")).format(Instant.now())
+                );
+        }
+    }
+}

+ 59 - 0
src/main/java/com/nokia/tsl_data/scheduling/service/TaskAutoManagementService.java

@@ -0,0 +1,59 @@
+package com.nokia.tsl_data.scheduling.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.support.CronTrigger;
+import com.nokia.tsl_data.scheduling.dao.ScheduledTaskMapper;
+import com.nokia.tsl_data.scheduling.entity.ScheduledTask;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import java.util.List;
+
+/**
+ * 用于在启动时、运行中、停止时自动调度任务并更新调度任务的状态
+ */
+@Slf4j
+public class TaskAutoManagementService {
+
+    private final TaskScheduleService taskScheduleService;
+    private final ScheduledTaskMapper scheduledTaskMapper;
+    private final ThreadPoolTaskScheduler taskScheduler;
+
+    public TaskAutoManagementService(TaskScheduleService taskScheduleService, ScheduledTaskMapper scheduledTaskMapper, ThreadPoolTaskScheduler taskScheduler) {
+        this.taskScheduleService = taskScheduleService;
+        this.scheduledTaskMapper = scheduledTaskMapper;
+        this.taskScheduler = taskScheduler;
+    }
+
+    /**
+     * 周期更新, 每20分钟更新任务状态
+     */
+    public void updateTasksScheduledMap() {
+        taskScheduler.schedule(()->{
+            taskScheduleService.refreshStatus();
+            log.info("已刷新任务状态...");
+        }, new CronTrigger("0 0/20 * * * *"));
+        log.info("");
+    }
+
+    /**
+     * 在系统启动时初始化调度任务
+     */
+    @PostConstruct
+    public void PostConstruct() {
+        List<ScheduledTask> tasks = scheduledTaskMapper.selectTaskToInit();
+        tasks.forEach(taskScheduleService::schedule);
+        log.info("已完成任务的初始化...");
+    }
+
+    /**
+     * 退出时保存任务状态
+     * 使用kill-15 或者 context.close() 才能触发
+     */
+    @PreDestroy
+    public void preDestroy() {
+        taskScheduleService.cancelAll();
+        log.info("已完成任务回收...");
+    }
+}

+ 235 - 0
src/main/java/com/nokia/tsl_data/scheduling/service/TaskScheduleService.java

@@ -0,0 +1,235 @@
+package com.nokia.tsl_data.scheduling.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationContext;
+import org.springframework.scheduling.Trigger;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.support.CronTrigger;
+import org.springframework.stereotype.Service;
+
+import com.nokia.tsl_data.scheduling.dao.ScheduledTaskMapper;
+import com.nokia.tsl_data.scheduling.entity.ScheduledTask;
+import com.nokia.tsl_data.scheduling.entity._enum.ScheduledStatus;
+import com.nokia.tsl_data.scheduling.entity.pojo.RunnableTask;
+import com.nokia.tsl_data.scheduling.entity.pojo.ScheduledParameter;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledFuture;
+
+/**
+ * 任务调度的核心服务
+ */
+@Slf4j
+@Service
+public class TaskScheduleService {
+    /**
+     * 存储任务调度信息
+     */
+    private final ConcurrentHashMap<ScheduledTask, ScheduledFuture<?>> tasksScheduledMap = new ConcurrentHashMap<>();
+    private final ThreadPoolTaskScheduler taskScheduler;
+    private final ApplicationContext applicationContext;
+    private final ScheduledTaskMapper scheduledTaskMapper;
+
+    public TaskScheduleService(ThreadPoolTaskScheduler taskScheduler, ApplicationContext applicationContext,
+            ScheduledTaskMapper scheduledTaskMapper) {
+        this.taskScheduler = taskScheduler;
+        this.applicationContext = applicationContext;
+        this.scheduledTaskMapper = scheduledTaskMapper;
+    }
+
+    /**
+     * 调度任务
+     */
+    public void schedule(ScheduledTask scheduledTask) {
+        if (tasksScheduledMap.containsKey(scheduledTask)) {
+            // 如果是重复调度,直接返回
+            ScheduledFuture<?> future = tasksScheduledMap.get(scheduledTask);
+            if (!future.isDone()) {
+                // 任务尚未完成
+                log.warn("任务{}已调度但未完成,不要重复调度...", scheduledTask.getName());
+                return;
+            }
+        }
+        Runnable runnable = new RunnableTask(applicationContext, scheduledTask);
+        if (scheduledTask.getStatus().needToStartSchedule()) {
+            ScheduledFuture<?> future = null;
+            ScheduledParameter scheduledParameter = scheduledTask.getScheduledParameter();
+            switch (scheduledTask.getScheduledType()) {
+                case CRON:
+                    if (scheduledParameter == null) {
+                        throw new RuntimeException("定时任务(CRON)调度参数 scheduledParameter 必须指定 cronExpression ...");
+                    }
+                    try {
+                        // 调度定时任务 必须指定cronExpression
+                        Trigger trigger = new CronTrigger(scheduledParameter.getCronExpression());
+                        // 开始时间为空或者早于当前时间
+                        future = taskScheduler.schedule(runnable, trigger);
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        throw new RuntimeException("定时任务(CRON)调度出错: " + e.getMessage());
+                    }
+                    break;
+                case INTERVAL:
+                    // 周期任务
+                    if (scheduledParameter == null) {
+                        throw new RuntimeException(
+                                "周期任务(INTERVAL)调度参数 scheduledParameter 必须指定 periodOfSeconds 可选 startTime ...");
+                    }
+                    if (scheduledParameter.getPeriodOfSeconds() == null
+                            || scheduledParameter.getPeriodOfSeconds() <= 0) {
+                        throw new RuntimeException("周期任务(INTERVAL)调度参数 scheduledParameter.periodOfSeconds 必须为正整数: "
+                                + scheduledParameter.getPeriodOfSeconds());
+                    }
+                    Duration period = Duration.ofSeconds(scheduledParameter.getPeriodOfSeconds());
+                    if (instantNullOrBeforeNow(scheduledParameter.getStartTime())) {
+                        // 开始时间为空或者早于当前时间
+                        future = taskScheduler.scheduleAtFixedRate(runnable, period);
+                    } else {
+                        future = taskScheduler.scheduleAtFixedRate(runnable,
+                                scheduledParameter.getStartTime(), period);
+                    }
+                    break;
+                case FIXED_DELAY:
+                    // 延时调度
+                    if (scheduledParameter == null) {
+                        throw new RuntimeException(
+                                "固定延时任务(FIXED_DELAY)调度参数 scheduledParameter 必须指定 delayOfSeconds 可选 startTime ...");
+                    }
+                    if (scheduledParameter.getDelayOfSeconds() == null || scheduledParameter.getDelayOfSeconds() <= 0) {
+                        throw new RuntimeException("固定延时任务(FIXED_DELAY)调度参数 scheduledParameter.delayOfSeconds 必须为正整数: "
+                                + scheduledParameter.getDelayOfSeconds());
+                    }
+                    // 如果 scheduledTask.getScheduledParameter().getDelayOfSeconds() 为空会报空指针
+                    Duration delay = Duration.ofSeconds(scheduledParameter.getDelayOfSeconds());
+                    if (instantNullOrBeforeNow(scheduledParameter.getStartTime())) {
+                        // 开始时间为空或者早于当前时间
+                        future = taskScheduler.scheduleWithFixedDelay(runnable, delay);
+                    } else {
+                        future = taskScheduler.scheduleWithFixedDelay(runnable,
+                                scheduledParameter.getStartTime(), delay);
+                    }
+                    break;
+                case ONCE:
+                    // 单次任务
+                    if (scheduledParameter == null) {
+                        throw new RuntimeException(
+                                "单次任务(ONCE)必须指定调度参数 scheduledParameter 的 startTime 或 delayOfSeconds ... ");
+                    }
+                    Instant startTimeForOnceTask = scheduledParameter.getStartTime();
+                    Long delayOfSeconds = scheduledParameter.getDelayOfSeconds();
+                    if (startTimeForOnceTask == null && delayOfSeconds == null) {
+                        throw new RuntimeException(
+                                "单次任务(ONCE)必须指定调度参数 scheduledParameter 的 startTime 或 delayOfSeconds ... ");
+                    } else if (startTimeForOnceTask != null) {
+                        // startTime 优先级高于 delay
+                        if (startTimeForOnceTask.isAfter(Instant.now())) {
+                            // 单次任务只有在启动时间大于等于当前时间时才启动调度
+                            future = taskScheduler.schedule(runnable, startTimeForOnceTask);
+                        } else {
+                            // 当启动时间早于当前时间时,更新状态为超时
+                            log.info("单次任务(ONCE) startTime: {} 早于当前时间: {} 直接跳过", startTimeForOnceTask, Instant.now());
+                            scheduledTask.setStatus(ScheduledStatus.TIMEOUT);
+                            scheduledTaskMapper.updateById(scheduledTask);
+                        }
+                    } else if (delayOfSeconds > 0) {
+                        future = taskScheduler.schedule(runnable, Instant.now().plusSeconds(delayOfSeconds));
+                    } else {
+                        throw new RuntimeException("单次任务(ONCE)指定的调度参数 scheduledParameter 中 delayOfSeconds 必须大于 0 ...");
+                    }
+                    break;
+                case IMMEDIATELY:
+                    // 马上执行的任务
+                default:
+                    future = taskScheduler.schedule(runnable, Instant.now());
+                    break;
+            }
+            if (future != null) {
+                tasksScheduledMap.put(scheduledTask, future);
+            }
+        }
+    }
+
+    /**
+     * 删除任务
+     */
+    public void remove(ScheduledTask scheduledTask) {
+        if (tasksScheduledMap.containsKey(scheduledTask)) {
+            ScheduledFuture<?> future = tasksScheduledMap.remove(scheduledTask);
+            if (future.isDone()) {
+                scheduledTask.setStatus(ScheduledStatus.DONE);
+                scheduledTaskMapper.updateById(scheduledTask);
+            } else {
+                future.cancel(true);
+            }
+        }
+    }
+
+    /**
+     * 获取已调度的任务
+     */
+    public List<ScheduledTask> ListTasksScheduled() {
+        refreshStatus();
+        return new ArrayList<>(tasksScheduledMap.keySet());
+    }
+
+    /**
+     * 结束任务
+     */
+    public void cancelAll() {
+        // 遍历,刷新已完成的任务
+        tasksScheduledMap.forEach((task, future) -> {
+            if (future.isDone()) {
+                handleTaskIsDone(task);
+            } else {
+                future.cancel(true);
+            }
+        });
+    }
+
+    public boolean isTaskScheduled(ScheduledTask task) {
+        ScheduledFuture<?> future = tasksScheduledMap.get(task);
+        if (future == null)
+            return false;
+        if (future.isDone()) {
+            handleTaskIsDone(task);
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 刷新任务状态
+     */
+    public void refreshStatus() {
+        // 遍历,刷新已完成的任务
+        tasksScheduledMap.forEach((task, future) -> {
+            if (future.isDone()) {
+                handleTaskIsDone(task);
+            }
+        });
+    }
+
+    /**
+     * 处理已完成任务
+     */
+    private void handleTaskIsDone(ScheduledTask task) {
+        if (!ScheduledStatus.FAILED.equals(task.getStatus())) {
+            // 如果执行出现异常,会修改状态,所以如果状态未改变则认为执行未出现异常
+            task.setStatus(ScheduledStatus.DONE);
+        }
+        tasksScheduledMap.remove(task);
+        scheduledTaskMapper.updateById(task);
+        log.debug("任务 {}=={} 已完成...", task.getName(), task.getDescription());
+    }
+
+    /**
+     * 输入时间为空或者早于当前时间
+     */
+    private boolean instantNullOrBeforeNow(Instant instant) {
+        return instant == null || instant.isBefore(Instant.now());
+    }
+}

+ 0 - 2
src/main/java/com/nokia/tsl_data/service/DataWarehouseService.java

@@ -30,7 +30,6 @@ public class DataWarehouseService {
     private final HighQualityListDayMapper highQualityListDayMapper;
     private final SysDataDictionaryRepository sysDataDictionaryRepository;
     private final DataWarehouseProperties dataWarehouseProperties;
-    private final MessageService messageService;
 
     public DataWarehouseService(TslDataDao tslDataDao, MobileComplaintMapper mobileComplaintMapper, HighQualityCountMapper highQualityCountMapper, HighQualityListDayMapper highQualityListDayMapper, SysDataDictionaryRepository sysDataDictionaryRepository, DataWarehouseProperties dataWarehouseProperties, MessageService messageService) {
         this.tslDataDao = tslDataDao;
@@ -39,7 +38,6 @@ public class DataWarehouseService {
         this.highQualityListDayMapper = highQualityListDayMapper;
         this.sysDataDictionaryRepository = sysDataDictionaryRepository;
         this.dataWarehouseProperties = dataWarehouseProperties;
-        this.messageService = messageService;
     }
 
     public String checkSource(String day) {

+ 13 - 8
src/main/java/com/nokia/tsl_data/service/TaskService.java

@@ -4,14 +4,15 @@ import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.nokia.common.basic.DateUtil;
 import com.nokia.common.basic.InstantUtil;
-import com.nokia.common.scheduling.entity.ScheduledTask;
-import com.nokia.common.scheduling.entity._enum.ScheduledStatus;
-import com.nokia.common.scheduling.entity._enum.ScheduledType;
-import com.nokia.common.scheduling.entity.pojo.ScheduledParameter;
-import com.nokia.common.scheduling.service.SchedulingService;
 import com.nokia.tsl_data.dao.TaskRecordRepository;
 import com.nokia.tsl_data.dao.TslDataDao;
 import com.nokia.tsl_data.entity.TaskRecord;
+import com.nokia.tsl_data.scheduling.entity.ScheduledTask;
+import com.nokia.tsl_data.scheduling.entity._enum.ScheduledStatus;
+import com.nokia.tsl_data.scheduling.entity._enum.ScheduledType;
+import com.nokia.tsl_data.scheduling.entity.pojo.ScheduledParameter;
+import com.nokia.tsl_data.scheduling.service.SchedulingService;
+
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
@@ -36,7 +37,10 @@ public class TaskService {
     private final HighQualityDataService highQualityDataService;
     private final SchedulingService schedulingService;
 
-    public TaskService(WorkFlowService workFlowService, DataWarehouseService dataWarehouseService, MessageService messageService, TslDataDao tslDataDao, TaskRecordRepository taskRecordRepository, TslReportService tslReportService, HighQualityDataService highQualityDataService, SchedulingService schedulingService) {
+    public TaskService(WorkFlowService workFlowService, DataWarehouseService dataWarehouseService,
+            MessageService messageService, TslDataDao tslDataDao, TaskRecordRepository taskRecordRepository,
+            TslReportService tslReportService, HighQualityDataService highQualityDataService,
+            SchedulingService schedulingService) {
         this.workFlowService = workFlowService;
         this.dataWarehouseService = dataWarehouseService;
         this.messageService = messageService;
@@ -77,6 +81,7 @@ public class TaskService {
             ScheduledTask task = new ScheduledTask()
                     .setRegisteredTask(schedulingService.findRegisteredTaskByBeanNameAndMethodName(
                             "taskService", "wareHouseTask"))
+                    .setDescription("延时调度每日报表入库、生成、截图任务")
                     .setMethodParameter(day)
                     .setStatus(ScheduledStatus.ON)
                     .setScheduledType(ScheduledType.ONCE)
@@ -102,9 +107,9 @@ public class TaskService {
 
     public void generateReport(String day) {
         // 生成报表
-        tslReportService.generateReport(day);
+        tslReportService.generateReportV2(day);
         // 截图
-        tslReportService.screenShot(day);
+        tslReportService.screenShotV2(day);
     }
 
     /**

+ 295 - 35
src/main/java/com/nokia/tsl_data/service/TslReportService.java

@@ -50,7 +50,10 @@ public class TslReportService {
 
     private static final DateFormat DAY_FORMAT = new SimpleDateFormat("yyyyMMdd");
 
-    public TslReportService(TslDataService tslDataService, OutputProperties outputProperties, HighQualityCountMapper highQualityCountMapper, HighQualityCountService highQualityCountService, HighQualityDataService highQualityDataService, MobileComplaintMapper mobileComplaintMapper, SysDataDictionaryRepository sysDataDictionaryRepository) {
+    public TslReportService(TslDataService tslDataService, OutputProperties outputProperties,
+            HighQualityCountMapper highQualityCountMapper, HighQualityCountService highQualityCountService,
+            HighQualityDataService highQualityDataService, MobileComplaintMapper mobileComplaintMapper,
+            SysDataDictionaryRepository sysDataDictionaryRepository) {
         this.tslDataService = tslDataService;
         this.outputProperties = outputProperties;
         this.highQualityCountMapper = highQualityCountMapper;
@@ -63,7 +66,7 @@ public class TslReportService {
     /**
      * 截图任务
      */
-    public void screenShot(String day) {
+    public void screenShotV2(String day) {
         String fileName = outputProperties.getOutputFileNamePrefix() + day + ".xlsx";
         File file = Paths.get(outputProperties.getOutputPath(), day, fileName).toFile();
         if (!file.exists()) {
@@ -77,34 +80,43 @@ public class TslReportService {
             // 截图1
             String area = "A1:" + CellRect.getColumnName(dayOfMonth + 7) + "15";
             screenShot = PoiUtil.screenShot(workbook.getSheet("管理端-移网质量类"), area, "微软雅黑");
-            ImageIO.write(screenShot, "png", Paths.get(outputProperties.getOutputPath(), day, day + "-1-投诉率.png").toFile());
+            ImageIO.write(screenShot, "png",
+                    Paths.get(outputProperties.getOutputPath(), day, day + "-1-投诉率.png").toFile());
             // 截图2
             String area2 = "A1:" + CellRect.getColumnName(dayOfMonth + 7) + "15";
             screenShot = PoiUtil.screenShot(workbook.getSheet("客户端-战略考核"), area2, "微软雅黑");
-            ImageIO.write(screenShot, "png", Paths.get(outputProperties.getOutputPath(), day, day + "-2-客户端-战略考核.png").toFile());
+            ImageIO.write(screenShot, "png",
+                    Paths.get(outputProperties.getOutputPath(), day, day + "-2-客户端-战略考核.png").toFile());
             // 截图3 每月1号不发送重复投诉率
             if (!day.endsWith("01")) {
                 screenShot = PoiUtil.screenShot(workbook.getSheet("管理端-重复投诉率"), "A1:G16", "微软雅黑");
-                ImageIO.write(screenShot, "png", Paths.get(outputProperties.getOutputPath(), day, day + "-3-重复投诉率.png").toFile());
+                ImageIO.write(screenShot, "png",
+                        Paths.get(outputProperties.getOutputPath(), day, day + "-3-重复投诉率.png").toFile());
             }
             // 截图4 5
             Sheet sheet = workbook.getSheet("投诉处理时长、超时工单概况");
             screenShot = PoiUtil.screenShot(sheet, "A1:D15", "微软雅黑");
-            ImageIO.write(screenShot, "png", Paths.get(outputProperties.getOutputPath(), day, day + "-4-超时工单.png").toFile());
+            ImageIO.write(screenShot, "png",
+                    Paths.get(outputProperties.getOutputPath(), day, day + "-4-超时工单.png").toFile());
             screenShot = PoiUtil.screenShot(sheet, "G1:J14", "微软雅黑");
-            ImageIO.write(screenShot, "png", Paths.get(outputProperties.getOutputPath(), day, day + "-5-处理时长.png").toFile());
+            ImageIO.write(screenShot, "png",
+                    Paths.get(outputProperties.getOutputPath(), day, day + "-5-处理时长.png").toFile());
             // 截图6
             sheet = workbook.getSheet("客户端地市三率");
             screenShot = PoiUtil.screenShot(sheet, "A1:J15", "微软雅黑");
-            ImageIO.write(screenShot, "png", Paths.get(outputProperties.getOutputPath(), day, day + "-6-地市三率.png").toFile());
+            ImageIO.write(screenShot, "png",
+                    Paths.get(outputProperties.getOutputPath(), day, day + "-6-地市三率.png").toFile());
             // 截图7 8 9 区县三率
             sheet = workbook.getSheet("客户端区县三率");
             screenShot = PoiUtil.screenShot(sheet, "A1:F32", "微软雅黑");
-            ImageIO.write(screenShot, "png", Paths.get(outputProperties.getOutputPath(), day, day + "-7-区县响应率.png").toFile());
+            ImageIO.write(screenShot, "png",
+                    Paths.get(outputProperties.getOutputPath(), day, day + "-7-区县响应率.png").toFile());
             screenShot = PoiUtil.screenShot(sheet, "A1:F32", "微软雅黑");
-            ImageIO.write(screenShot, "png", Paths.get(outputProperties.getOutputPath(), day, day + "-8-区县满意度.png").toFile());
+            ImageIO.write(screenShot, "png",
+                    Paths.get(outputProperties.getOutputPath(), day, day + "-8-区县满意度.png").toFile());
             screenShot = PoiUtil.screenShot(sheet, "A1:F32", "微软雅黑");
-            ImageIO.write(screenShot, "png", Paths.get(outputProperties.getOutputPath(), day, day + "-9-区县解决率.png").toFile());
+            ImageIO.write(screenShot, "png",
+                    Paths.get(outputProperties.getOutputPath(), day, day + "-9-区县解决率.png").toFile());
         } catch (EncryptedDocumentException | IOException | ParseException e) {
             e.printStackTrace();
             throw new RuntimeException(e.getMessage());
@@ -112,9 +124,9 @@ public class TslReportService {
     }
 
     /**
-     * 生成报表
+     * 生成报表,版本2,包含区县三率
      */
-    public void generateReport(String day) {
+    public void generateReportV2(String day) {
         String fileName = outputProperties.getOutputFileNamePrefix() + day + ".xlsx";
         File file = Paths.get(outputProperties.getOutputPath(), day).toFile();
         if (!file.exists()) {
@@ -130,13 +142,6 @@ public class TslReportService {
         if (compCountForDay == 0) {
             throw new RuntimeException("he_d_mobile_comp表缺少数据");
         }
-        workbookToFile(day, Paths.get(file.getAbsolutePath(), fileName).toFile());
-    }
-
-    /**
-     * 写入workbook
-     */
-    private void workbookToFile(String day, File file) {
         // 每次需要重置workbook
         workbook = getWorkbook();
         // 按照顺序写入各个sheet
@@ -149,11 +154,47 @@ public class TslReportService {
         // 投诉处理时长、超时工单概况
         getSheet3(day);
         // 客户端-投诉问题解决满意度 客户端-投诉问题解决率 客户端-投诉问题响应率
-        // getSheet4_6(day);
         getCityThreeRateSheet(day);
         // 区县三率
         getSheet7(day);
-        try (OutputStream outputStream = new FileOutputStream(file)) {
+        try (OutputStream outputStream = new FileOutputStream(fileName)) {
+            workbook.write(outputStream);
+            workbook.close();
+            workbook = null;
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("写入失败。。。" + e.getMessage());
+        }
+    }
+
+    public void generateReportV1(String day) {
+        String fileName = outputProperties.getOutputFileNamePrefix() + day + ".xlsx";
+        File file = Paths.get(outputProperties.getOutputPath(), day).toFile();
+        if (!file.exists()) {
+            boolean mkdirs = file.mkdirs();
+            System.out.println(mkdirs);
+        }
+        String dayId = day.substring(0, 4) + "-" + day.substring(4, 6) + "-" + day.substring(6);
+        int qualityCountForDay = highQualityCountMapper.selectQualityCountForDay(dayId);
+        if (qualityCountForDay == 0) {
+            throw new RuntimeException("he_d_high_quality表缺少数据");
+        }
+        int compCountForDay = mobileComplaintMapper.selectCompCountForDay(day);
+        if (compCountForDay == 0) {
+            throw new RuntimeException("he_d_mobile_comp表缺少数据");
+        }
+        workbook = getWorkbook();
+        // 管理端-移网质量类
+        getSheet1(day);
+        // 客户端-战略考核
+        getSheet1_1(day);
+        // 管理端-重复投诉率
+        getSheet2(day);
+        // 投诉处理时长、超时工单概况
+        getSheet3(day);
+        // 客户端-投诉问题解决满意度 客户端-投诉问题解决率 客户端-投诉问题响应率
+        getSheet4_6(day);
+        try (OutputStream outputStream = new FileOutputStream(fileName)) {
             workbook.write(outputStream);
             workbook.close();
             workbook = null;
@@ -163,6 +204,225 @@ public class TslReportService {
         }
     }
 
+    /**
+     * 客户端-投诉问题解决满意度
+     * 客户端-投诉问题解决率
+     * 客户端-投诉问题响应率
+     * 
+     * @param day
+     */
+    private void getSheet4_6(String day) {
+        // 计算时间常数
+        Calendar calendar = Calendar.getInstance(Locale.CHINA);
+        try {
+            calendar.setTime(DAY_FORMAT.parse(day));
+        } catch (ParseException e) {
+            log.error("时间字符串解析失败--{}", day);
+        }
+        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
+        Sheet sheet4 = getWorkbook().createSheet("客户端-投诉问题解决满意度");
+        Sheet sheet5 = getWorkbook().createSheet("客户端-投诉问题解决率");
+        Sheet sheet6 = getWorkbook().createSheet("客户端-投诉问题响应率");
+        Row row;
+        Cell cell;
+        CellRangeAddress rangeAddress;
+        XSSFDataFormat dataFormat = getWorkbook().createDataFormat();
+        XSSFFont font = getWorkbook().createFont();
+        font.setFontName("微软雅黑");
+        font.setFontHeightInPoints((short) 10);
+        // 基本模式 微软雅黑 10号字 带全边框 水平居中
+        XSSFCellStyle baseStyle = getWorkbook().createCellStyle();
+        baseStyle.setFont(font);
+        baseStyle.setAlignment(HorizontalAlignment.CENTER);
+        baseStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        baseStyle.setBorderBottom(BorderStyle.THIN);
+        baseStyle.setBorderTop(BorderStyle.THIN);
+        baseStyle.setBorderLeft(BorderStyle.THIN);
+        baseStyle.setBorderRight(BorderStyle.THIN);
+        // 样式1 与base相同
+        XSSFCellStyle cellStyle1 = baseStyle.copy();
+        // 样式2 百分比 2位小数
+        XSSFCellStyle cellStyle2 = baseStyle.copy();
+        cellStyle2.setDataFormat(dataFormat.getFormat("0.00%"));
+        // 样式3 自动换行 背景色FFE7E6E6 FFAEAAAA
+        XSSFCellStyle cellStyle3 = baseStyle.copy();
+        // cellStyle3.setWrapText(true);
+        XSSFColor color = new XSSFColor();
+        color.setARGBHex("FFAEAAAA");
+        cellStyle3.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        cellStyle3.setFillForegroundColor(color);
+
+        List<List<List<Object>>> sheet4_6Data = tslDataService.getSheet4_6Data(day);
+
+        // 客户端-投诉问题解决满意度 第一行
+        row = sheet4.createRow(0);
+        cell = row.createCell(0);
+        cell.setCellValue(String.format("投诉问题解决满意率(1-%s)", dayOfMonth));
+        cell.setCellStyle(cellStyle3);
+        // 合并单元格 A1 - D1
+        rangeAddress = new CellRangeAddress(0, 0, 0, 3);
+        addMergedRegion(sheet4, rangeAddress);
+        // 客户端-投诉问题解决满意度 第二行
+        row = sheet4.createRow(1);
+        cell = row.createCell(0);
+        cell.setCellValue("地市");
+        cell.setCellStyle(cellStyle3);
+        cell = row.createCell(1);
+        cell.setCellValue("满意率");
+        cell.setCellStyle(cellStyle3);
+        cell = row.createCell(2);
+        cell.setCellValue("达标值");
+        cell.setCellStyle(cellStyle3);
+        cell = row.createCell(3);
+        cell.setCellValue("与达标值差距");
+        cell.setCellStyle(cellStyle3);
+        int rowNum = 2;
+        for (List<Object> list : sheet4_6Data.get(0)) {
+            row = sheet4.createRow(rowNum++);
+            // 地市
+            cell = row.createCell(0);
+            cell.setCellValue(list.get(0).toString());
+            cell.setCellStyle(cellStyle1);
+            // 投诉问题解决满意率
+            cell = row.createCell(1);
+            cell.setCellValue(((double) list.get(1)));
+            cell.setCellStyle(cellStyle2);
+            // 达标值
+            cell = row.createCell(2);
+            cell.setCellValue((double) list.get(2));
+            cell.setCellStyle(cellStyle2);
+            // 与达标值差距
+            cell = row.createCell(3);
+            cell.setCellValue(((double) list.get(3)));
+            cell.setCellStyle(cellStyle2);
+        }
+        // 设置条件格式D3-D14
+        rangeAddress = new CellRangeAddress(2, 13, 3, 3);
+        setConditionalFormatting2(sheet4, rangeAddress);
+
+        // 设置列宽 2048 1304 2048 2304
+        for (int i = 0; i < 4; i++) {
+            sheet4.setColumnWidth(i, 2848);
+        }
+
+        // 设置行高 15.0 15.0...
+        for (int i = 0; i < 15; i++) {
+            sheet4.getRow(i).setHeightInPoints(15.0F);
+        }
+
+        // 客户端-投诉问题解决率
+        row = sheet5.createRow(0);
+        cell = row.createCell(0);
+        cell.setCellValue(String.format("投诉问题解决率(1-%s)", dayOfMonth));
+        cell.setCellStyle(cellStyle3);
+        // 合并单元格 A1 - D1
+        rangeAddress = new CellRangeAddress(0, 0, 0, 3);
+        addMergedRegion(sheet5, rangeAddress);
+        // 客户端-投诉问题解决率 第二行
+        row = sheet5.createRow(1);
+        cell = row.createCell(0);
+        cell.setCellValue("地市");
+        cell.setCellStyle(cellStyle3);
+        cell = row.createCell(1);
+        cell.setCellValue("解决率");
+        cell.setCellStyle(cellStyle3);
+        cell = row.createCell(2);
+        cell.setCellValue("达标值");
+        cell.setCellStyle(cellStyle3);
+        cell = row.createCell(3);
+        cell.setCellValue("与达标值差距");
+        cell.setCellStyle(cellStyle3);
+        rowNum = 2;
+        for (List<Object> list : sheet4_6Data.get(1)) {
+            row = sheet5.createRow(rowNum++);
+            // 地市
+            cell = row.createCell(0);
+            cell.setCellValue(list.get(0).toString());
+            cell.setCellStyle(cellStyle1);
+            // 投诉问题解决率
+            cell = row.createCell(1);
+            cell.setCellValue(((double) list.get(1)));
+            cell.setCellStyle(cellStyle2);
+            // 达标值
+            cell = row.createCell(2);
+            cell.setCellValue((double) list.get(2));
+            cell.setCellStyle(cellStyle2);
+            // 与达标值差距
+            cell = row.createCell(3);
+            cell.setCellValue(((double) list.get(3)));
+            cell.setCellStyle(cellStyle2);
+        }
+        // 设置条件格式D3-D14
+        rangeAddress = new CellRangeAddress(2, 13, 3, 3);
+        setConditionalFormatting2(sheet5, rangeAddress);
+
+        // 设置列宽 2048 1304 2048 2304
+        for (int i = 0; i < 4; i++) {
+            sheet5.setColumnWidth(i, 2848);
+        }
+
+        // 设置行高 15.0 15.0...
+        for (int i = 0; i < 15; i++) {
+            sheet5.getRow(i).setHeightInPoints(15.0F);
+        }
+
+        // 客户端-投诉问题响应率
+        row = sheet6.createRow(0);
+        cell = row.createCell(0);
+        cell.setCellValue(String.format("投诉问题响应率(1-%s)", dayOfMonth));
+        cell.setCellStyle(cellStyle3);
+        // 合并单元格 A1 - D1
+        rangeAddress = new CellRangeAddress(0, 0, 0, 3);
+        addMergedRegion(sheet6, rangeAddress);
+        // 客户端-投诉问题响应率 第二行
+        row = sheet6.createRow(1);
+        cell = row.createCell(0);
+        cell.setCellValue("地市");
+        cell.setCellStyle(cellStyle3);
+        cell = row.createCell(1);
+        cell.setCellValue("响应率");
+        cell.setCellStyle(cellStyle3);
+        cell = row.createCell(2);
+        cell.setCellValue("达标值");
+        cell.setCellStyle(cellStyle3);
+        cell = row.createCell(3);
+        cell.setCellValue("与达标值差距");
+        cell.setCellStyle(cellStyle3);
+        rowNum = 2;
+        for (List<Object> list : sheet4_6Data.get(2)) {
+            row = sheet6.createRow(rowNum++);
+            // 地市
+            cell = row.createCell(0);
+            cell.setCellValue(list.get(0).toString());
+            cell.setCellStyle(cellStyle1);
+            // 投诉问题解决率
+            cell = row.createCell(1);
+            cell.setCellValue(((double) list.get(1)));
+            cell.setCellStyle(cellStyle2);
+            // 达标值
+            cell = row.createCell(2);
+            cell.setCellValue((double) list.get(2));
+            cell.setCellStyle(cellStyle2);
+            // 与达标值差距
+            cell = row.createCell(3);
+            cell.setCellValue(((double) list.get(3)));
+            cell.setCellStyle(cellStyle2);
+        }
+        // 设置条件格式D3-D14
+        rangeAddress = new CellRangeAddress(2, 13, 3, 3);
+        setConditionalFormatting2(sheet6, rangeAddress);
+
+        // 设置列宽 2048 1304 2048 2304
+        for (int i = 0; i < 4; i++) {
+            sheet6.setColumnWidth(i, 2848);
+        }
+
+        // 设置行高 15.0 15.0...
+        for (int i = 0; i < 15; i++) {
+            sheet6.getRow(i).setHeightInPoints(15.0F);
+        }
+    }
+
     /**
      * 客户端区县三率
      */
@@ -228,15 +488,15 @@ public class TslReportService {
             cell.setCellStyle(cellStyle2);
             // 达标值
             cell = row.createCell(3);
-            cell.setCellValue((double)list.get(3));
+            cell.setCellValue((double) list.get(3));
             cell.setCellStyle(cellStyle2);
             // 与达标值差距
             cell = row.createCell(4);
-            cell.setCellValue((double)list.get(4));
+            cell.setCellValue((double) list.get(4));
             cell.setCellStyle(cellStyle2);
             // 本月累计未响应工单数
             cell = row.createCell(5);
-            cell.setCellValue((int)list.get(5));
+            cell.setCellValue((int) list.get(5));
             cell.setCellStyle(cellStyle1);
         }
         // 与达标值差距设置条件格式
@@ -298,15 +558,15 @@ public class TslReportService {
             cell.setCellStyle(cellStyle2);
             // 达标值
             cell = row.createCell(10);
-            cell.setCellValue((double)list.get(3));
+            cell.setCellValue((double) list.get(3));
             cell.setCellStyle(cellStyle2);
             // 与达标值差距
             cell = row.createCell(11);
-            cell.setCellValue((double)list.get(4));
+            cell.setCellValue((double) list.get(4));
             cell.setCellStyle(cellStyle2);
             // 本月累计未响应工单数
             cell = row.createCell(12);
-            cell.setCellValue((int)list.get(5));
+            cell.setCellValue((int) list.get(5));
             cell.setCellStyle(cellStyle1);
         }
         // 与达标值差距设置条件格式
@@ -368,15 +628,15 @@ public class TslReportService {
             cell.setCellStyle(cellStyle2);
             // 达标值
             cell = row.createCell(17);
-            cell.setCellValue((double)list.get(3));
+            cell.setCellValue((double) list.get(3));
             cell.setCellStyle(cellStyle2);
             // 与达标值差距
             cell = row.createCell(18);
-            cell.setCellValue((double)list.get(4));
+            cell.setCellValue((double) list.get(4));
             cell.setCellStyle(cellStyle2);
             // 本月累计未响应工单数
             cell = row.createCell(19);
-            cell.setCellValue((int)list.get(5));
+            cell.setCellValue((int) list.get(5));
             cell.setCellStyle(cellStyle1);
         }
         // 与达标值差距设置条件格式
@@ -1270,14 +1530,14 @@ public class TslReportService {
     private void setConditionalFormatting(Sheet sheet, CellRangeAddress rangeAddress) {
         SheetConditionalFormatting conditionalFormatting = sheet.getSheetConditionalFormatting();
         ConditionalFormattingRule rule = conditionalFormatting.createConditionalFormattingColorScaleRule();
-        XSSFColor[] colors = new XSSFColor[]{
+        XSSFColor[] colors = new XSSFColor[] {
                 new XSSFColor(), new XSSFColor(), new XSSFColor()
         };
         colors[0].setARGBHex("FF63BE7B");
         colors[1].setARGBHex("FFFFEB84");
         colors[2].setARGBHex("FFF8696B");
         rule.getColorScaleFormatting().setColors(colors);
-        CellRangeAddress[] cellRangeAddresses = new CellRangeAddress[]{
+        CellRangeAddress[] cellRangeAddresses = new CellRangeAddress[] {
                 rangeAddress
         };
         conditionalFormatting.addConditionalFormatting(cellRangeAddresses, rule);
@@ -1290,14 +1550,14 @@ public class TslReportService {
     private void setConditionalFormatting2(Sheet sheet, CellRangeAddress rangeAddress) {
         SheetConditionalFormatting conditionalFormatting = sheet.getSheetConditionalFormatting();
         ConditionalFormattingRule rule = conditionalFormatting.createConditionalFormattingColorScaleRule();
-        XSSFColor[] colors = new XSSFColor[]{
+        XSSFColor[] colors = new XSSFColor[] {
                 new XSSFColor(), new XSSFColor(), new XSSFColor()
         };
         colors[0].setARGBHex("FFF8696B");
         colors[1].setARGBHex("FFFFEB84");
         colors[2].setARGBHex("FF63BE7B");
         rule.getColorScaleFormatting().setColors(colors);
-        CellRangeAddress[] cellRangeAddresses = new CellRangeAddress[]{
+        CellRangeAddress[] cellRangeAddresses = new CellRangeAddress[] {
                 rangeAddress
         };
         conditionalFormatting.addConditionalFormatting(cellRangeAddresses, rule);

+ 11 - 12
src/main/resources/application.yml

@@ -15,15 +15,15 @@ logging:
   level:
     org:
       hibernate:
-        SQL: INFO  # 开启SQL的log 这里需要设置为DEBUG
+        SQL: INFO # 开启SQL的log 这里需要设置为DEBUG
         type:
           descriptor:
             sql:
-              BasicBinder: INFO  # 开启SQL的参数记录 这里需要设置为TRACE
+              BasicBinder: INFO # 开启SQL的参数记录 这里需要设置为TRACE
     com:
       nokia: DEBUG
 
----
+--- # pro
 spring:
   profiles: pro
   datasource:
@@ -31,12 +31,11 @@ spring:
     url: jdbc:postgresql://192.168.10.9:5432/sqmmt
     username: postgres
     password: Richr00t#
-
----
-#spring:
-#  profiles: dev
-#  datasource:
-#    driver-class-name: org.postgresql.Driver
-#    url: jdbc:postgresql://localhost:5432/tsl_data
-#    username: postgres
-#    password: fantuan1985
+--- # dev
+spring:
+  profiles: dev
+  datasource:
+    driver-class-name: org.postgresql.Driver
+    url: jdbc:postgresql://localhost:5432/tsl_data
+    username: postgres
+    password: fantuan1985

+ 7 - 4
src/test/java/com/nokia/tsl_data/TslDataApplicationTest.java

@@ -1,6 +1,8 @@
 package com.nokia.tsl_data;
 
-import com.nokia.tsl_data.dao.MobileComplaintMapper;
+import com.nokia.tsl_data.scheduling.dao.ScheduledTaskMapper;
+import com.nokia.tsl_data.scheduling.entity.ScheduledTask;
+import com.nokia.tsl_data.service.TslReportService;
 import com.nokia.tsl_data.service.UserCountService;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -10,6 +12,7 @@ import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.List;
 
 @SpringBootTest
 class TslDataApplicationTest {
@@ -46,11 +49,11 @@ class TslDataApplicationTest {
     }
 
     @Autowired
-    private MobileComplaintMapper highQualityCountMapper;
+    private TslReportService tslReportService;
 
     @Test
     void test() {
-        int i = highQualityCountMapper.countForDay("20231201");
-        System.out.println(i);
+        tslReportService.generateReportV1("20231223");
+        // tasks.forEach(System.out::println);
     }
 }

Some files were not shown because too many files changed in this diff