你是资深java开发工程师,现有需求:清洗echo同步的问卷数据,并提供接口查询当前工程师好评数据。 以下是同步的表结构: -- 1. 创建问卷问题表 survey_question CREATE TABLE `survey_question` ( `id` bigint NOT NULL COMMENT '问题ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='问卷问题表'; -- 2. 创建问卷答卷表 survey_response CREATE TABLE `survey_response` ( `id` bigint NOT NULL COMMENT '', `status` int DEFAULT NULL COMMENT '', `parameter` varchar(3000) DEFAULT NULL COMMENT '答卷参数', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='问卷答卷表'; -- 3. 创建答卷明细单元格表 survey_response_cell CREATE TABLE `survey_response_cell` ( `id` bigint NOT NULL COMMENT '', `r_id` bigint DEFAULT NULL COMMENT '关联答卷ID', `q_id` bigint DEFAULT NULL COMMENT '关联问题ID', `i_val` int DEFAULT NULL COMMENT '数值型答案', `s_val` text DEFAULT NULL COMMENT '字符串型答案', PRIMARY KEY (`id`), KEY `idx_r_id` (`r_id`), KEY `idx_q_id` (`q_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='答卷明细单元格表'; 以下是需求相关的代码模块: 1、代码写在shb-io包,已配置第二数据源连接echo数据库。 2、第二数据源扫描的entity和mapper路径在D:\officeSoftware\pubLinkProjects\others\shb\shb-io\src\main\java\cn\publink\shb\io\echo文件夹下。 注意:现在描述的是代码要求 代码要求分两方面,一是清洗的要求: 1、三张问卷表的作用及关系:survey_question暂时无作用,使用固定的问题id去处理数据 西门子: Q1:100190970066944 Q2:100190970132480 博世: Q1:100236198888448 Q2:100237384955904 嘉格纳: Q1:111529324004352 Q2:111529324004354 无需在意西门子、博士、嘉格纳这几个名称,记住Q1和Q2是组合存在的。Q1和Q2即对应survey_response_cell表的q_id,survey_response的id对应survey_response_cell表q_id,在survey_response_cell表中,一个r_id可以查询多条不同q_id的数据。 我们需要的是相同r_id下q_id=Q1的数据i_val和q_id=Q2的数据s_val的值。 survey_response表的parameter字段为json格式,空或等于{}的数据无需处理,json数据示例:{ "province": "江苏省", "serviceStartTime": "1758591699000",//服务开始时间 "executor": "乔东", "brand": "Siemens", "productType": "洗碗机", "machineType": "SC74M620TI/16", "executorNo": "6218703473",//技术员编号 "partsDiscount": "0.0", "originalTotalAmount": "0.01", } survey_response表的status=1代表完成作答的问卷,只需要处理status=1的数据。 2、需要创建一个简单的数据清洗表survey_response_deal,使用survey_response表的id作为主键,其他字段:serviceStartTime、executorNo、i_val、s_val。建表sql请在最后提供给我 3、为了减少全量清洗(清洗每天都会进行),每次清洗先查询survey_response表status=1且survey_response_deal表不存在且parameter字段存在executorNo。然后按数据量500条每次批量处理,批量处理时解析survey_response的parameter,获取serviceStartTime,executorNo的值(两个字段为空也要插入到清洗表survey_response_deal对应字段),同时根据id获取survey_response_cell表对应的Q1、Q2值,减少查询,优先使用批量查询(同样即使获取到的两个值为空,也要插入到清洗表survey_response_deal)。最后保存到清洗表survey_response_deal的数据对于一个survey_response来讲是唯一的。 二是提供接口查询当前工程师好评数据: 1、对外接口入口cn.publink.shb.io.controller.outside.BshDailySummaryController#getPraiseExpress。代码风格参考同类下的其他接口全链路 2、根据当前登录人的userId调用ShbLoginUserVO user = bshUserAndTagService.getUser(userId, BshConstants.TENANT_ID);String workNo = user.getWorkNo();方法获取对应工号。根据工号查询survey_response_deal表executorNo=workNo且i_val=10且serviceStartTime在一个月内的s_val数据。 3、查询出的数据需要判断 如果s_val存在超过20个字符的数据,则只返回超过20个字符的数据集合,过滤小于20个字符的数据。如果不存在20个字符的数据,只存在1-19个字符的数据,则只返回符合该条件的数据集合。注意,s_val为空或空字符的数据始终过滤。