Browse Source

Merge remote-tracking branch 'origin/dev_v1.0.0' into dev_v1.0.0

shudonghui 1 năm trước cách đây
mục cha
commit
03611701e7
33 tập tin đã thay đổi với 1085 bổ sung207 xóa
  1. 78 56
      sop-api/install/mysql/init/init.sql
  2. 4 3
      sop-api/src/main/java/com/qmth/sop/server/api/ServiceAnalyseController.java
  3. 42 0
      sop-api/src/main/java/com/qmth/sop/server/api/SsoController.java
  4. 1 1
      sop-api/src/main/resources/application.properties
  5. BIN
      sop-api/src/main/resources/cloudMarkSopFlow.zip
  6. BIN
      sop-api/src/main/resources/officeSopFlow.zip
  7. 1 1
      sop-business/src/main/java/com/qmth/sop/business/activiti/service/impl/ActivitiServiceImpl.java
  8. 39 0
      sop-business/src/main/java/com/qmth/sop/business/bean/dto/TBSopPlanDateLogDto.java
  9. 56 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/RegionPersonnel.java
  10. 35 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/ServiceUnitPersonnel.java
  11. 43 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/SupplierPersonnel.java
  12. 1 0
      sop-business/src/main/java/com/qmth/sop/business/entity/TBDelayWarn.java
  13. 120 0
      sop-business/src/main/java/com/qmth/sop/business/entity/TBSopPlanDateLog.java
  14. 27 0
      sop-business/src/main/java/com/qmth/sop/business/mapper/TBSopPlanDateLogMapper.java
  15. 5 1
      sop-business/src/main/java/com/qmth/sop/business/service/ServiceAnalyseService.java
  16. 19 0
      sop-business/src/main/java/com/qmth/sop/business/service/SsoService.java
  17. 11 0
      sop-business/src/main/java/com/qmth/sop/business/service/TBSopInfoService.java
  18. 26 0
      sop-business/src/main/java/com/qmth/sop/business/service/TBSopPlanDateLogService.java
  19. 83 1
      sop-business/src/main/java/com/qmth/sop/business/service/impl/ServiceAnalyseServiceImpl.java
  20. 71 93
      sop-business/src/main/java/com/qmth/sop/business/service/impl/SopScheduleServiceImpl.java
  21. 36 0
      sop-business/src/main/java/com/qmth/sop/business/service/impl/SsoServiceImpl.java
  22. 64 20
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBServiceRegionServiceImpl.java
  23. 69 25
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBSopInfoServiceImpl.java
  24. 33 0
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBSopPlanDateLogServiceImpl.java
  25. 1 1
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TDFormWidgetServiceImpl.java
  26. 2 1
      sop-business/src/main/java/com/qmth/sop/business/sync/FxxkApiUtils.java
  27. 1 1
      sop-business/src/main/java/com/qmth/sop/business/sync/RtzfApiUtils.java
  28. 191 1
      sop-business/src/main/resources/db/log/wangliang_update_log.sql
  29. 19 0
      sop-business/src/main/resources/mapper/TBSopPlanDateLogMapper.xml
  30. 1 1
      sop-business/src/main/resources/mapper/TBUserArchivesAllocationMapper.xml
  31. 3 0
      sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java
  32. 2 0
      sop-common/src/main/java/com/qmth/sop/common/enums/ProcessLimitedEnum.java
  33. 1 1
      sop-task/src/main/resources/application.properties

+ 78 - 56
sop-api/install/mysql/init/init.sql

@@ -705,6 +705,8 @@ CREATE TABLE `t_b_crm` (
                            `exam_end_time` bigint(20) DEFAULT NULL COMMENT '考试结束时间',
                            `product_id` bigint(20) NOT NULL COMMENT '产品id',
                            `lead_id` bigint(20) DEFAULT NULL COMMENT '大区经理id',
+                           `region_id` bigint(20) DEFAULT NULL COMMENT '服务区域规划id',
+                           `region_detail_id` bigint(20) DEFAULT NULL COMMENT '服务区域规划明细id',
                            `region_coordinator_id` bigint(20) DEFAULT NULL COMMENT '区域协调人id',
                            `sync` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否crm同步,false:否,true:是',
                            `enable` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否启用,0:停用,1:启用',
@@ -798,6 +800,7 @@ CREATE TABLE `t_b_ding` (
                             `role_type` varchar(20) NOT NULL COMMENT '项目角色',
                             `flow_id` bigint(20) DEFAULT NULL COMMENT '流程id',
                             `task_id` bigint(20) DEFAULT NULL COMMENT '流程任务id',
+                            `sign_year` varchar(20) NOT NULL COMMENT '签到年份',
                             `sign_date` varchar(20) NOT NULL COMMENT '签到日期',
                             `date_type` varchar(20) DEFAULT NULL COMMENT '日期类型:WEEKDAY("工作日"),WEEKEND("周末"),LEGAL_HOLIDAYS("法定节假日")',
                             `sign_in_time` bigint(20) DEFAULT NULL COMMENT '签到时间',
@@ -1489,6 +1492,20 @@ CREATE TABLE `t_wxapp_info` (
                                 PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信信息表';
 
+DROP TABLE IF EXISTS `t_b_sop_plan_date_log`;
+CREATE TABLE `t_b_sop_plan_date_log` (
+                                         `id` bigint NOT NULL COMMENT '主键',
+                                         `sop_id` bigint DEFAULT NULL COMMENT 'sopId',
+                                         `flow_id` bigint NOT NULL COMMENT '流程id',
+                                         `begin_time` bigint NOT NULL COMMENT '计划开始时间',
+                                         `end_time` bigint NOT NULL COMMENT '计划结束时间',
+                                         `create_id` bigint DEFAULT NULL COMMENT '创建人id',
+                                         `create_time` bigint DEFAULT NULL COMMENT '创建时间',
+                                         `update_id` bigint DEFAULT NULL COMMENT '更新人id',
+                                         `update_time` bigint DEFAULT NULL COMMENT '更新时间',
+                                         PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='sop进程计划时间日志表';
+
 -- ----------------------------
 -- Function structure for currval
 -- ----------------------------
@@ -1585,7 +1602,7 @@ INSERT INTO `sys_privilege` VALUES (47, '延期预警', 'delayWarn', 'MENU', 45,
 INSERT INTO `sys_privilege` VALUES (48, '违规登记', 'violation', 'MENU', 45, 3, NULL, NULL, 1, 0, 1);
 INSERT INTO `sys_privilege` VALUES (49, '服务单元管理', 'serviceManage', 'MENU', NULL, 2, NULL, NULL, 1, 0, 1);
 INSERT INTO `sys_privilege` VALUES (50, '派单管理', 'crmManage', 'MENU', 49, 1, NULL, NULL, 1, 0, 1);
-INSERT INTO `sys_privilege` VALUES (51, '派单管理', 'crm', 'MENU', 50, 1, 'AUTH', '1032, 1033,1035,1036,1037,1038', 1, 0, 1);
+INSERT INTO `sys_privilege` VALUES (51, '派单管理', 'crm', 'MENU', 50, 1, 'AUTH', '1032,1035,1036,1037,1038', 1, 0, 1);
 INSERT INTO `sys_privilege` VALUES (52, '统计查询', 'crmCount', 'MENU', 50, 2, 'AUTH', '1034', 1, 0, 1);
 INSERT INTO `sys_privilege` VALUES (53, '服务单元管理', 'serviceChildManage', 'MENU', 49, 2, NULL, NULL, 1, 0, 1);
 INSERT INTO `sys_privilege` VALUES (54, '服务单元管理', 'service', 'MENU', 53, 1, NULL, NULL, 1, 0, 1);
@@ -1856,7 +1873,6 @@ INSERT INTO `sys_privilege` VALUES (1029, '质量问题反馈', '/api/admin/tb/q
 INSERT INTO `sys_privilege` VALUES (1030, '质量问题反馈', '/api/admin/tb/quality/problem/apply/query', 'URL', 21, 1, 'AUTH', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (1031, '质量问题反馈', '/api/admin/tb/quality/problem/apply/save', 'URL', 21, 1, 'AUTH', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (1032, '派单管理', '/api/admin/tb/crm/batchDisable', 'URL', 50, 1, 'AUTH', NULL, 1, 1, 0);
-INSERT INTO `sys_privilege` VALUES (1033, '派单管理', '/api/admin/tb/crm/batchZone', 'URL', 50, 2, 'AUTH', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (1034, '派单管理', '/api/admin/tb/crm/countWaitZone', 'URL', 50, 3, 'AUTH', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (1035, '派单管理', '/api/admin/tb/crm/delete', 'URL', 50, 4, 'AUTH', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (1036, '派单管理', '/api/admin/tb/crm/get', 'URL', 50, 5, 'AUTH', NULL, 1, 1, 0);
@@ -1873,7 +1889,7 @@ INSERT INTO `sys_privilege` VALUES (1046, '设备启用', '/api/sys/device/enabl
 INSERT INTO `sys_privilege` VALUES (1047, '设备导入', '/api/sys/device/import', 'URL', 5, 8, 'AUTH', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (1048, '批量启用', 'BatchEnable', 'BUTTON', 5, 4, 'AUTH', '1045', 1, 0, 1);
 INSERT INTO `sys_privilege` VALUES (1049, '批量禁用', 'BatchUnEnable', 'BUTTON', 5, 5, 'AUTH', '272', 1, 0, 1);
-INSERT INTO `sys_privilege` VALUES (1050, '批量导入', 'BatchImport', 'BUTTON', 5, 6, 'AUTH', '1046', 1, 0, 1);
+INSERT INTO `sys_privilege` VALUES (1050, '批量导入', 'BatchImport', 'BUTTON', 5, 6, 'AUTH', '1047', 1, 0, 1);
 INSERT INTO `sys_privilege` VALUES (1051, '获取SOP用户', '/api/admin/sop/user/list', 'URL', 64, 32, 'SYS', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (1052, '修改', 'Update', 'LINK', 5, 1, 'AUTH', '276', 1, 0, 1);
 INSERT INTO `sys_privilege` VALUES (1053, '禁用启用', 'Enable', 'LINK', 5, 2, 'AUTH', '272,1046', 1, 0, 1);
@@ -1922,6 +1938,7 @@ INSERT INTO `sys_privilege` VALUES (1095, '二期接口', '/api/sop/schedule/pro
 INSERT INTO `sys_privilege` VALUES (1096, '违规登记跟进', '/api/admin/tb/violation/getByCode', 'URL', 48, 1, 'AUTH', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (1097, '二期接口', '/api/sop/schedule/projectProgress', 'URL', 64, 32, 'SYS', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (1098, '考勤提交-明细', '/api/admin/tb/ding/detail', 'URL', 28, 6, 'AUTH', NULL, 1, 1, 0);
+INSERT INTO `sys_privilege` VALUES (1099, '二期接口', '/api/admin/tb/crm/analyse/project/count', 'URL', 64, 32, 'SYS', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (2000, '服务单元管理-编辑', '/api/service/service/unit/edit', 'URL', 54, 1, 'AUTH', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (2001, '服务单元管理-分页查询', '/api/service/service/unit/page', 'URL', 54, 2, 'AUTH', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (2002, '服务单元管理-发布', '/api/service/service/unit/publish', 'URL', 54, 3, 'AUTH', NULL, 1, 1, 0);
@@ -2027,7 +2044,6 @@ INSERT INTO `sys_privilege` VALUES (3049, '审核', 'Approve', 'LINK', 21, 1, 'A
 INSERT INTO `sys_privilege` VALUES (3050, '获取所有用户(动态表单用)接口', '/api/admin/common/get_user_list/form_widget', 'URL', 64, 32, 'SYS', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (3051, '小程序签名预览', '/api/admin/common/file/preview/app', 'URL', 64, 6, 'SYS', NULL, 1, 1, 0);
 INSERT INTO `sys_privilege` VALUES (3052, '考勤异常详情接口', '/api/admin/ding/exception/apply/view', 'URL', 27, 6, 'SYS', NULL, 1, 1, 0);
-INSERT INTO `sys_privilege` VALUES (1099, '二期接口', '/api/admin/tb/crm/analyse/project/count', 'URL', 64, 32, 'SYS', NULL, 1, 1, 0);
 
 INSERT INTO `sys_role` VALUES (1, NULL, '系统管理员', 1, 'ADMIN', NULL, NULL, NULL, NULL, 1, '系统角色');
 INSERT INTO `sys_role` VALUES (2, NULL, '总负责人', 1, 'PMO', NULL, NULL, 443437441441857536, 1697425600601, 1, '系统角色');
@@ -3228,28 +3244,28 @@ INSERT INTO `t_d_form_widget` VALUES (15, 'RADIO', 'FORM', 'approve_radio', 'app
 INSERT INTO `t_d_form_widget` VALUES (16, 'SIGN', 'FORM', 'sign', 'sign', '添加签名', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, NULL, 'QUALITY_PROBLEM_FLOW', 4, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (17, 'TEXTAREA', 'FORM', 'approve_remark', 'approve_remark', '备注', 'STRING', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'QUALITY_PROBLEM_FLOW', 4, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (18, 'FORM_GROUP_TITLE', 'FORM', 'project_basic_info_title', 'project_basic_info_title', '项目基本信息', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (19, 'NUMBER', 'FORM', 'course_count', 'course_count', '科目数量', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (20, 'NUMBER', 'FORM', 'exam_student_course_count', 'exam_student_course_count', '考生科次', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (21, 'NUMBER', 'FORM', 'scan_count', 'scan_count', '扫描仪数量(台)', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (22, 'NUMBER', 'FORM', 'week_people_day', 'week_people_day', '现场标准服务周期(人天)', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (23, 'DATE', 'FORM', 'exam_student_Internal_date', 'exam_student_Internal_date', '考生数据内部交接时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (24, 'DATE', 'FORM', 'exam_plan_date', 'exam_plan_date', '考试时间安排表获取时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (25, 'DATE', 'FORM', 'project_key_info_date', 'project_key_info_date', '项目关键信息提交截止时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 1, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (26, 'DATE', 'FORM', 'service_finish_plan_date', 'service_finish_plan_date', '现场服务完成撤场计划时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 1, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (27, 'FORM_GROUP_TITLE', 'FORM', 'project_people_plan_title', 'project_people_plan_title', '项目人员安排及风险预估', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (28, 'SINGLE_SELECT', 'FORM', 'region_user_id', 'region_user_id', '区域协调人', 'STRING', 1, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (29, 'SINGLE_SELECT', 'FORM', 'engineer_user_id', 'engineer_user_id', '实施工程师', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (30, 'MULTIPLE_SELECT', 'FORM', 'assistant_engineer_user_id', 'assistant_engineer_user_id', '助理实施工程师', 'ARRAY', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (31, 'ONLY_TITLE', 'FORM', 'project_rish_title', 'project_rish_title', '项目风险预估(仅供参考)', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (32, 'RADIO', 'FORM', 'delay_rish_cb', 'delay_rish_cb', '延期风险', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"LOW\",\"label\":\"低\"},{\"value\":\"MIDDLE\",\"label\":\"中\"},{\"value\":\"HIGH\",\"label\":\"高\"}]', 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (33, 'RADIO', 'FORM', 'engineer_rish_cb', 'engineer_rish_cb', '实施难度', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"LOW\",\"label\":\"低\"},{\"value\":\"MIDDLE\",\"label\":\"中\"},{\"value\":\"HIGH\",\"label\":\"高\"}]', 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (34, 'TEXTAREA', 'FORM', 'other_remark', 'other_remark', '其它备注(建议关注的其它方面)', 'STRING', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (35, 'FORM_GROUP_TITLE', 'FORM', 'project_contacts_title', 'project_contacts_title', '项目联系人', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (36, 'TABLE', 'FORM', 'project_contacts_table', 'project_contacts_table', '项目联系人表格', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (37, 'TEXT', 'TABLE', 'school_college', 'school_college', '项目联系人表格_机构输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (38, 'TEXT', 'TABLE', 'school_name', 'school_name', '项目联系人表格_姓名输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (39, 'TEXT', 'TABLE', 'school_job', 'school_job', '项目联系人表格_职务输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (40, 'TEXT', 'TABLE', 'school_tel', 'school_tel', '项目联系人表格_电话输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
+INSERT INTO `t_d_form_widget` VALUES (19, 'NUMBER', 'FORM', 'course_count', 'course_count', '科目数量', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 2);
+INSERT INTO `t_d_form_widget` VALUES (20, 'NUMBER', 'FORM', 'exam_student_course_count', 'exam_student_course_count', '考生科次', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 3);
+INSERT INTO `t_d_form_widget` VALUES (21, 'NUMBER', 'FORM', 'scan_count', 'scan_count', '扫描仪数量(台)', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 4);
+INSERT INTO `t_d_form_widget` VALUES (22, 'NUMBER', 'FORM', 'week_people_day', 'week_people_day', '现场标准服务周期(人天)', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 5);
+INSERT INTO `t_d_form_widget` VALUES (23, 'DATE', 'FORM', 'exam_student_Internal_date', 'exam_student_Internal_date', '考生数据内部交接时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 6);
+INSERT INTO `t_d_form_widget` VALUES (24, 'DATE', 'FORM', 'exam_plan_date', 'exam_plan_date', '考试时间安排表获取时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 7);
+INSERT INTO `t_d_form_widget` VALUES (25, 'DATE', 'FORM', 'project_key_info_date', 'project_key_info_date', '项目关键信息提交截止时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 1, NULL, NULL, 1, 8);
+INSERT INTO `t_d_form_widget` VALUES (26, 'DATE', 'FORM', 'service_finish_plan_date', 'service_finish_plan_date', '现场服务完成撤场计划时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 1, NULL, NULL, 1, 10);
+INSERT INTO `t_d_form_widget` VALUES (27, 'FORM_GROUP_TITLE', 'FORM', 'project_people_plan_title', 'project_people_plan_title', '项目人员安排及风险预估', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 11);
+INSERT INTO `t_d_form_widget` VALUES (28, 'SINGLE_SELECT', 'FORM', 'region_user_id', 'region_user_id', '区域协调人', 'STRING', 1, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 12);
+INSERT INTO `t_d_form_widget` VALUES (29, 'SINGLE_SELECT', 'FORM', 'engineer_user_id', 'engineer_user_id', '实施工程师', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 13);
+INSERT INTO `t_d_form_widget` VALUES (30, 'MULTIPLE_SELECT', 'FORM', 'assistant_engineer_user_id', 'assistant_engineer_user_id', '助理实施工程师', 'ARRAY', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 14);
+INSERT INTO `t_d_form_widget` VALUES (31, 'ONLY_TITLE', 'FORM', 'project_rish_title', 'project_rish_title', '项目风险预估(仅供参考)', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 15);
+INSERT INTO `t_d_form_widget` VALUES (32, 'RADIO', 'FORM', 'delay_rish_cb', 'delay_rish_cb', '延期风险', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"LOW\",\"label\":\"低\"},{\"value\":\"MIDDLE\",\"label\":\"中\"},{\"value\":\"HIGH\",\"label\":\"高\"}]', 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 16);
+INSERT INTO `t_d_form_widget` VALUES (33, 'RADIO', 'FORM', 'engineer_rish_cb', 'engineer_rish_cb', '实施难度', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"LOW\",\"label\":\"低\"},{\"value\":\"MIDDLE\",\"label\":\"中\"},{\"value\":\"HIGH\",\"label\":\"高\"}]', 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 17);
+INSERT INTO `t_d_form_widget` VALUES (34, 'TEXTAREA', 'FORM', 'other_remark', 'other_remark', '其它备注(建议关注的其它方面)', 'STRING', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 18);
+INSERT INTO `t_d_form_widget` VALUES (35, 'FORM_GROUP_TITLE', 'FORM', 'project_contacts_title', 'project_contacts_title', '项目联系人', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 19);
+INSERT INTO `t_d_form_widget` VALUES (36, 'TABLE', 'FORM', 'project_contacts_table', 'project_contacts_table', '项目联系人表格', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 20);
+INSERT INTO `t_d_form_widget` VALUES (37, 'TEXT', 'TABLE', 'school_college', 'school_college', '项目联系人表格_机构输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 21);
+INSERT INTO `t_d_form_widget` VALUES (38, 'TEXT', 'TABLE', 'school_name', 'school_name', '项目联系人表格_姓名输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 22);
+INSERT INTO `t_d_form_widget` VALUES (39, 'TEXT', 'TABLE', 'school_job', 'school_job', '项目联系人表格_职务输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 23);
+INSERT INTO `t_d_form_widget` VALUES (40, 'TEXT', 'TABLE', 'school_tel', 'school_tel', '项目联系人表格_电话输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 0, NULL, NULL, 1, 24);
 INSERT INTO `t_d_form_widget` VALUES (41, 'FORM_GROUP_TITLE', 'FORM', 'cloud_mark_title', 'cloud_mark_title', '云阅卷(填写前请先认真查阅移交的项目初审及项目基本信息)', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 2, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (42, 'RADIO', 'FORM', 'deploy_way_radio', 'deploy_way_radio', '部署方式', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"ONLINE\",\"label\":\"线上部署\"},{\"value\":\"LOCAL\",\"label\":\"本地部署\"}]', 'OFFICE_SOP_FLOW', 2, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (43, 'RADIO', 'FORM', 'mark_way_radio', 'mark_way_radio', '阅卷方式', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"TOGETHER\",\"label\":\"集中阅卷\"},{\"value\":\"ANYTIME\",\"label\":\"分散阅卷\"}]', 'OFFICE_SOP_FLOW', 2, 0, NULL, NULL, 1, 1);
@@ -3302,30 +3318,30 @@ INSERT INTO `t_d_form_widget` VALUES (89, 'RADIO', 'FORM', 'approve_radio_engine
 INSERT INTO `t_d_form_widget` VALUES (90, 'SIGN', 'FORM', 'sign_engineer', 'sign_engineer', '添加签名', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, NULL, 'OFFICE_SOP_FLOW', 3, 0, 2, 'EFFECT_ENGINEER', 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (91, 'TEXTAREA', 'FORM', 'approve_remark_engineer', 'approve_remark_engineer', '审批意见', 'STRING', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'OFFICE_SOP_FLOW', 3, 0, 2, 'EFFECT_ENGINEER', 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (92, 'FORM_GROUP_TITLE', 'FORM', 'project_basic_info_title', 'project_basic_info_title', '项目基本信息', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (93, 'NUMBER', 'FORM', 'course_count', 'course_count', '科目数量', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (94, 'NUMBER', 'FORM', 'exam_student_course_count', 'exam_student_course_count', '考生科次', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (95, 'RADIO', 'FORM', 'bar_code_paper_count', 'bar_code_paper_count', '条码标准张数', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, '[{\"value\":\"3\",\"label\":\"3张\"},{\"value\":\"4\",\"label\":\"4张\"}]', 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (96, 'RADIO_WITH_INPUT', 'FORM', 'bar_code_paste_way', 'bar_code_paste_way', '条码粘贴方式', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, '[{\"value\":\"EXAM_STUDENT\",\"label\":\"考生自贴/数码印刷\"},{\"value\":\"PAPER\",\"label\":\"回卷后粘贴\"},{\"value\":\"OTHER\",\"label\":\"其它\"}]', 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (97, 'RADIO', 'FORM', 'has_objective_card', 'has_objective_card', '有无客观题卡', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, '[{\"value\":\"HAVA\",\"label\":\"有\"},{\"value\":\"NOT_HAVA\",\"label\":\"无\"}]', 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (98, 'NUMBER', 'FORM', 'scan_count', 'scan_count', '扫描仪数量(台)', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (99, 'DATE', 'FORM', 'exam_student_Internal_date', 'exam_student_Internal_date', '考生数据内部交接时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (100, 'NUMBER', 'FORM', 'week_people_day', 'week_people_day', '现场标准服务周期(人天)', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (101, 'DATE', 'FORM', 'project_key_info_date', 'project_key_info_date', '项目关键信息提交截止时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 1, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (102, 'DATE', 'FORM', 'service_finish_plan_date', 'service_finish_plan_date', '现场服务完成撤场计划时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 1, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (103, 'FORM_GROUP_TITLE', 'FORM', 'project_people_plan_title', 'project_people_plan_title', '项目人员安排及风险预估', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (104, 'SINGLE_SELECT', 'FORM', 'region_user_id', 'region_user_id', '区域协调人', 'STRING', 1, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (105, 'SINGLE_SELECT', 'FORM', 'engineer_user_id', 'engineer_user_id', '实施工程师', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (106, 'MULTIPLE_SELECT', 'FORM', 'assistant_engineer_user_id', 'assistant_engineer_user_id', '助理实施工程师', 'ARRAY', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (107, 'ONLY_TITLE', 'FORM', 'project_rish_title', 'project_rish_title', '项目风险预估(仅供参考)', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (108, 'RADIO', 'FORM', 'delay_rish_cb', 'delay_rish_cb', '延期风险', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"LOW\",\"label\":\"低\"},{\"value\":\"MIDDLE\",\"label\":\"中\"},{\"value\":\"HIGH\",\"label\":\"高\"}]', 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (109, 'RADIO', 'FORM', 'engineer_rish_cb', 'engineer_rish_cb', '实施难度', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"LOW\",\"label\":\"低\"},{\"value\":\"MIDDLE\",\"label\":\"中\"},{\"value\":\"HIGH\",\"label\":\"高\"}]', 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (110, 'TEXTAREA', 'FORM', 'other_remark', 'other_remark', '其它备注(建议关注的其它方面)', 'STRING', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (111, 'FORM_GROUP_TITLE', 'FORM', 'project_contacts_title', 'project_contacts_title', '项目联系人', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (112, 'TABLE', 'FORM', 'project_contacts_table', 'project_contacts_table', '项目联系人表格', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (113, 'TEXT', 'TABLE', 'school_college', 'school_college', '项目联系人表格_机构输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (114, 'TEXT', 'TABLE', 'school_name', 'school_name', '项目联系人表格_姓名输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (115, 'TEXT', 'TABLE', 'school_job', 'school_job', '项目联系人表格_职务输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (116, 'TEXT', 'TABLE', 'school_tel', 'school_tel', '项目联系人表格_电话输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 1);
+INSERT INTO `t_d_form_widget` VALUES (93, 'NUMBER', 'FORM', 'course_count', 'course_count', '科目数量', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 2);
+INSERT INTO `t_d_form_widget` VALUES (94, 'NUMBER', 'FORM', 'exam_student_course_count', 'exam_student_course_count', '考生科次', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 3);
+INSERT INTO `t_d_form_widget` VALUES (95, 'RADIO', 'FORM', 'bar_code_paper_count', 'bar_code_paper_count', '条码标准张数', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, '[{\"value\":\"3\",\"label\":\"3张\"},{\"value\":\"4\",\"label\":\"4张\"}]', 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 4);
+INSERT INTO `t_d_form_widget` VALUES (96, 'RADIO_WITH_INPUT', 'FORM', 'bar_code_paste_way', 'bar_code_paste_way', '条码粘贴方式', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, '[{\"value\":\"EXAM_STUDENT\",\"label\":\"考生自贴/数码印刷\"},{\"value\":\"PAPER\",\"label\":\"回卷后粘贴\"},{\"value\":\"OTHER\",\"label\":\"其它\"}]', 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 5);
+INSERT INTO `t_d_form_widget` VALUES (97, 'RADIO', 'FORM', 'has_objective_card', 'has_objective_card', '有无客观题卡', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, '[{\"value\":\"HAVA\",\"label\":\"有\"},{\"value\":\"NOT_HAVA\",\"label\":\"无\"}]', 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 6);
+INSERT INTO `t_d_form_widget` VALUES (98, 'NUMBER', 'FORM', 'scan_count', 'scan_count', '扫描仪数量(台)', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 7);
+INSERT INTO `t_d_form_widget` VALUES (99, 'DATE', 'FORM', 'exam_student_Internal_date', 'exam_student_Internal_date', '考生数据内部交接时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 8);
+INSERT INTO `t_d_form_widget` VALUES (100, 'NUMBER', 'FORM', 'week_people_day', 'week_people_day', '现场标准服务周期(人天)', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 9);
+INSERT INTO `t_d_form_widget` VALUES (101, 'DATE', 'FORM', 'project_key_info_date', 'project_key_info_date', '项目关键信息提交截止时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 1, NULL, NULL, 1, 10);
+INSERT INTO `t_d_form_widget` VALUES (102, 'DATE', 'FORM', 'service_finish_plan_date', 'service_finish_plan_date', '现场服务完成撤场计划时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 1, NULL, NULL, 1, 12);
+INSERT INTO `t_d_form_widget` VALUES (103, 'FORM_GROUP_TITLE', 'FORM', 'project_people_plan_title', 'project_people_plan_title', '项目人员安排及风险预估', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 13);
+INSERT INTO `t_d_form_widget` VALUES (104, 'SINGLE_SELECT', 'FORM', 'region_user_id', 'region_user_id', '区域协调人', 'STRING', 1, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 14);
+INSERT INTO `t_d_form_widget` VALUES (105, 'SINGLE_SELECT', 'FORM', 'engineer_user_id', 'engineer_user_id', '实施工程师', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 15);
+INSERT INTO `t_d_form_widget` VALUES (106, 'MULTIPLE_SELECT', 'FORM', 'assistant_engineer_user_id', 'assistant_engineer_user_id', '助理实施工程师', 'ARRAY', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 4, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 16);
+INSERT INTO `t_d_form_widget` VALUES (107, 'ONLY_TITLE', 'FORM', 'project_rish_title', 'project_rish_title', '项目风险预估(仅供参考)', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 17);
+INSERT INTO `t_d_form_widget` VALUES (108, 'RADIO', 'FORM', 'delay_rish_cb', 'delay_rish_cb', '延期风险', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"LOW\",\"label\":\"低\"},{\"value\":\"MIDDLE\",\"label\":\"中\"},{\"value\":\"HIGH\",\"label\":\"高\"}]', 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 18);
+INSERT INTO `t_d_form_widget` VALUES (109, 'RADIO', 'FORM', 'engineer_rish_cb', 'engineer_rish_cb', '实施难度', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"LOW\",\"label\":\"低\"},{\"value\":\"MIDDLE\",\"label\":\"中\"},{\"value\":\"HIGH\",\"label\":\"高\"}]', 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 19);
+INSERT INTO `t_d_form_widget` VALUES (110, 'TEXTAREA', 'FORM', 'other_remark', 'other_remark', '其它备注(建议关注的其它方面)', 'STRING', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 20);
+INSERT INTO `t_d_form_widget` VALUES (111, 'FORM_GROUP_TITLE', 'FORM', 'project_contacts_title', 'project_contacts_title', '项目联系人', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 21);
+INSERT INTO `t_d_form_widget` VALUES (112, 'TABLE', 'FORM', 'project_contacts_table', 'project_contacts_table', '项目联系人表格', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 22);
+INSERT INTO `t_d_form_widget` VALUES (113, 'TEXT', 'TABLE', 'school_college', 'school_college', '项目联系人表格_机构输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 23);
+INSERT INTO `t_d_form_widget` VALUES (114, 'TEXT', 'TABLE', 'school_name', 'school_name', '项目联系人表格_姓名输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 24);
+INSERT INTO `t_d_form_widget` VALUES (115, 'TEXT', 'TABLE', 'school_job', 'school_job', '项目联系人表格_职务输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 25);
+INSERT INTO `t_d_form_widget` VALUES (116, 'TEXT', 'TABLE', 'school_tel', 'school_tel', '项目联系人表格_电话输入框', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 26);
 INSERT INTO `t_d_form_widget` VALUES (117, 'FORM_GROUP_TITLE', 'FORM', 'cloud_mark_title', 'cloud_mark_title', '云阅卷(填写前请先认真查阅移交的项目初审及项目基本信息)', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 2, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (118, 'RADIO', 'FORM', 'run_env_accord', 'run_env_accord', '运行环境调研是否符合要求', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, '[{\"value\":\"ACCORD\",\"label\":\"符合\"},{\"value\":\"UN_ACCORD\",\"label\":\"不符合\"}]', 'CLOUD_MARK_SOP_FLOW', 2, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (119, 'DATE', 'FORM', 'env_deployment_time', 'env_deployment_time', '环境部署时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 2, 1, NULL, NULL, 1, 1);
@@ -3350,12 +3366,13 @@ INSERT INTO `t_d_form_widget` VALUES (137, 'FORM_GROUP_TITLE', 'FORM', 'inside_t
 INSERT INTO `t_d_form_widget` VALUES (138, 'RADIO', 'FORM', 'approve_radio_engineer', 'approve_radio_engineer', '我对以上项目关键信息已审核,确认内容无误:', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, '[{\"value\":\"1\",\"label\":\"同意\"},{\"value\":\"0\",\"label\":\"不同意\"}]', 'CLOUD_MARK_SOP_FLOW', 3, 0, 2, 'EFFECT_ENGINEER', 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (139, 'SIGN', 'FORM', 'sign_engineer', 'sign_engineer', '添加签名', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 3, 0, 2, 'EFFECT_ENGINEER', 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (140, 'TEXTAREA', 'FORM', 'approve_ramark_engineer', 'approve_ramark_engineer', '审批意见', 'STRING', 0, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 3, 0, 2, 'EFFECT_ENGINEER', 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (141, 'FORM_GROUP_TITLE', 'FORM', 'upload_list_title', 'upload_list_title', '上传清单和报告', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 5, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (142, 'FILE', 'FORM', 'upload_env_photos', 'upload_env_photos', '上传《软硬件准备检查清单》拍照', 'ARRAY', 1, 0, 1, 1, NULL, 5, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 5, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (143, 'FILE', 'FORM', 'upload_env_test_photos', 'upload_env_test_photos', '上传《现场环境测试报告》拍照', 'ARRAY', 1, 0, 1, 1, NULL, 5, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 5, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (144, 'ONLY_TITLE', 'FORM', 'device_in_out_label', 'device_in_out_label', '设备出库', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 4, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (145, 'DATE', 'FORM', 'device_out_time', 'device_out_time', '设备出库时间', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 4, 0, NULL, NULL, 1, 1);
-INSERT INTO `t_d_form_widget` VALUES (146, 'DEVICE_OUT_TABLE', 'FORM', 'device_out_table', 'device_out_table', '设备出库表格', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 4, 0, NULL, NULL, 1, 1);INSERT INTO `t_d_form_widget` VALUES (147, 'FORM_GROUP_TITLE', 'FORM', 'import_data_title', 'import_data_title', '导入数据', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 6, 0, NULL, NULL, 1, 1);
+INSERT INTO `t_d_form_widget` VALUES (141, 'FORM_GROUP_TITLE', 'FORM', 'upload_list_title', 'upload_list_title', '上传清单和报告', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 4, 0, NULL, NULL, 1, 1);
+INSERT INTO `t_d_form_widget` VALUES (142, 'FILE', 'FORM', 'upload_env_photos', 'upload_env_photos', '上传《软硬件准备检查清单》拍照', 'ARRAY', 1, 0, 1, 1, NULL, 5, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 4, 0, NULL, NULL, 1, 1);
+INSERT INTO `t_d_form_widget` VALUES (143, 'FILE', 'FORM', 'upload_env_test_photos', 'upload_env_test_photos', '上传《现场环境测试报告》拍照', 'ARRAY', 1, 0, 1, 1, NULL, 5, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 4, 0, NULL, NULL, 1, 1);
+INSERT INTO `t_d_form_widget` VALUES (144, 'ONLY_TITLE', 'FORM', 'device_in_out_label', 'device_in_out_label', '设备出库', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 5, 0, NULL, NULL, 1, 1);
+INSERT INTO `t_d_form_widget` VALUES (145, 'DATE', 'FORM', 'device_out_time', 'device_out_time', '设备出库时间', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 5, 0, NULL, NULL, 1, 1);
+INSERT INTO `t_d_form_widget` VALUES (146, 'DEVICE_OUT_TABLE', 'FORM', 'device_out_table', 'device_out_table', '设备出库表格', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 5, 0, NULL, NULL, 1, 1);
+INSERT INTO `t_d_form_widget` VALUES (147, 'FORM_GROUP_TITLE', 'FORM', 'import_data_title', 'import_data_title', '导入数据', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 6, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (148, 'CHECKBOX', 'FORM', 'data_same', 'data_same', '导入数据', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, '[{\"value\":\"true\",\"label\":\"导入数据与原始数据是否一致\"}]', 'CLOUD_MARK_SOP_FLOW', 6, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (149, 'TEXT', 'FORM', 'import_exam_student_count', 'import_exam_student_count', '导入考生数量', 'INT', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 6, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (150, 'FORM_GROUP_TITLE', 'FORM', 'scan_set_title', 'scan_set_title', '扫描仪设置', 'STRING', 0, 1, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 6, 0, NULL, NULL, 1, 1);
@@ -3396,6 +3413,8 @@ INSERT INTO `t_d_form_widget` VALUES (185, 'ONLY_TITLE', 'FORM', 'device_in_out_
 INSERT INTO `t_d_form_widget` VALUES (186, 'DATE', 'FORM', 'device_in_time', 'device_in_time', '设备入库时间', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 11, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (187, 'DEVICE_IN_TABLE', 'FORM', 'device_in_table', 'device_in_table', '设备入库表格', 'STRING', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 11, 0, NULL, NULL, 1, 1);
 INSERT INTO `t_d_form_widget` VALUES (188, 'FILE', 'FORM', 'upload_device_version_photos', 'upload_device_version_photos', '上传扫描仪固件版本号拍照', 'ARRAY', 1, 0, 1, 1, NULL, 5, NULL, NULL, NULL, NULL, 12, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 4, 0, NULL, NULL, 1, 1);
+INSERT INTO `t_d_form_widget` VALUES (189, 'DATE', 'FORM', 'service_finish_plan_begin_date', 'service_finish_plan_begin_date', '现场服务完成进场计划时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 1, NULL, NULL, 1, 9);
+INSERT INTO `t_d_form_widget` VALUES (190, 'DATE', 'FORM', 'service_finish_plan_begin_date', 'service_finish_plan_begin_date', '现场服务完成进场计划时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 1, NULL, NULL, 1, 11);
 
 INSERT INTO `t_d_table_prop` VALUES (1, 36, 1, 'college', 'college', '学院/分(子)机构', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 1, 37, NULL, 1, 1);
 INSERT INTO `t_d_table_prop` VALUES (2, 36, 2, 'name', 'name', '姓名', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 1, 38, NULL, 1, 1);
@@ -3409,11 +3428,14 @@ INSERT INTO `t_d_table_prop` VALUES (8, 112, 4, 'mobileNumber', 'mobileNumber',
 INSERT INTO `sys_device_brand` VALUES (1, '佳能', NULL, NULL, NULL, NULL);
 INSERT INTO `sys_device_brand` VALUES (2, '东芝', NULL, NULL, NULL, NULL);
 INSERT INTO `sys_device_brand` VALUES (3, '爱普生', NULL, NULL, NULL, NULL);
+INSERT INTO `sys_device_brand` VALUES (4, '华高', NULL, NULL, NULL, NULL);
 
 INSERT INTO `sys_device_model` VALUES (1, 1, '3300', NULL, NULL, NULL, NULL);
 INSERT INTO `sys_device_model` VALUES (2, 2, '3400', NULL, NULL, NULL, NULL);
 INSERT INTO `sys_device_model` VALUES (3, 3, 'DS-31100', NULL, NULL, NULL, NULL);
 INSERT INTO `sys_device_model` VALUES (4, 3, 'DS-31200', NULL, NULL, NULL, NULL);
+INSERT INTO `sys_device_model` VALUES (5, 4, '1080', NULL, NULL, NULL, NULL);
+INSERT INTO `sys_device_model` VALUES (6, 4, '5100', NULL, NULL, NULL, NULL);
 
 INSERT INTO `sys_ding_date` VALUES (1, 2023, 9, 29, 'LEGAL_HOLIDAYS');
 INSERT INTO `sys_ding_date` VALUES (2, 2023, 9, 30, 'LEGAL_HOLIDAYS');

+ 4 - 3
sop-api/src/main/java/com/qmth/sop/server/api/ServiceAnalyseController.java

@@ -199,13 +199,14 @@ public class ServiceAnalyseController {
 
     /**
      * 10.大区服务人数分布及对比:
-     * ①当前服务单元下各大区在服务人员的数量分布及对比。单个柱形图可按供应商占比分颜色展示占比。
+     * 1.当前服务单元下各大区在服务人员的数量分布及对比。单个柱形图可按供应商占比分颜色展示占比。
+     * 2.在服务人员:发布的派单所占用的资源
+     * 3.按照自小单元 大区-供应商 去重
      */
     @ApiOperation(value = "大区服务人数分布及对比")
     @RequestMapping(value = "/region/personnel", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "大区服务人数分布及对比", response = Map.class)})
     public Result personnel(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceUnitId) {
-        List<Map<String, Object>> list = serviceAnalyseService.personnel(serviceUnitId);
-        return ResultUtil.ok(list);
+        return ResultUtil.ok(serviceAnalyseService.personnel(serviceUnitId));
     }
 }

+ 42 - 0
sop-api/src/main/java/com/qmth/sop/server/api/SsoController.java

@@ -0,0 +1,42 @@
+package com.qmth.sop.server.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.sop.business.entity.SysUser;
+import com.qmth.sop.business.service.SsoService;
+import com.qmth.sop.common.annotation.OperationLog;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.LogTypeEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import com.qmth.sop.common.util.ServletUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 软通智能客服同步控制器
+ * @Author: CaoZixuan
+ * @Date: 2023-11-21
+ */
+@Api(tags = "软通智能客服同步 Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_SSO)
+public class SsoController {
+    @Resource
+    private SsoService ssoService;
+
+    @ApiOperation(value = "软通智能客服单点登录")
+    @ApiResponses({@ApiResponse(code = 200, message = "软通智能客服单点登录", response = Result.class)})
+    @RequestMapping(value = "/rtzf/login", method = RequestMethod.POST)
+    @OperationLog(logType = LogTypeEnum.UN_KNOW)
+    public Result analysisLogin() {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        return ResultUtil.ok(ssoService.rtzfSsoLogin(requestUser));
+    }
+}

+ 1 - 1
sop-api/src/main/resources/application.properties

@@ -96,6 +96,6 @@ face.verify.baiduLocalUrlPrefix=http://192.168.20.253
 fxxk.app.id=FSAID_131c93b
 fxxk.app.secrete=5d590b10cca24ce5a51fc716564aac9f
 fxxk.permanent.code=4EFBD3FCF655B4D934C163EA5ECE638D
-fxxk.curren.open.user.id=FSUID_AE9192D544DCF7924E88E9EA800641C7
+fxxk.curren.open.user.id=FSUID_71F2ABE69AAC50925BE7B3CA36E2EBEC
 fxxk.api.name.crm=object_zS8me__c
 fxxk.api.name.crm.detail=object_bs553__c

BIN
sop-api/src/main/resources/cloudMarkSopFlow.zip


BIN
sop-api/src/main/resources/officeSopFlow.zip


+ 1 - 1
sop-business/src/main/java/com/qmth/sop/business/activiti/service/impl/ActivitiServiceImpl.java

@@ -861,7 +861,7 @@ public class ActivitiServiceImpl implements ActivitiService {
         }
         for (Map.Entry<String, FlowTaskResult> entry : setupMap.entrySet()) {
             FlowTaskResult flowTaskResult = GsonUtil.fromJson(GsonUtil.toJson(entry.getValue()), FlowTaskResult.class);
-            if (flowTaskResult.getSetup() > 0) {
+            if (flowTaskResult.getSetup().intValue() > 0) {
                 //正在审批的表单
                 if (Objects.nonNull(tfFlowApprove.getSetup()) && flowTaskResult.getSetup().intValue() == tfFlowApprove.getSetup().intValue()) {
                     currFlowTaskResult = flowTaskResult;

+ 39 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/dto/TBSopPlanDateLogDto.java

@@ -0,0 +1,39 @@
+package com.qmth.sop.business.bean.dto;
+
+import com.qmth.sop.business.entity.TBSopPlanDateLog;
+import com.qmth.sop.common.enums.FlowStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: TBSopPlanDateLog dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/11/21
+ */
+public class TBSopPlanDateLogDto extends TBSopPlanDateLog implements Serializable {
+
+    @ApiModelProperty("流程状态")
+    FlowStatusEnum status;
+
+    @ApiModelProperty("流程更新时间")
+    Long flowUpdateTime;
+
+    public FlowStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(FlowStatusEnum status) {
+        this.status = status;
+    }
+
+    public Long getFlowUpdateTime() {
+        return flowUpdateTime;
+    }
+
+    public void setFlowUpdateTime(Long flowUpdateTime) {
+        this.flowUpdateTime = flowUpdateTime;
+    }
+}

+ 56 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/RegionPersonnel.java

@@ -0,0 +1,56 @@
+package com.qmth.sop.business.bean.result.analyze;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Description: 大区在服务人数
+ * @Author: CaoZixuan
+ * @Date: 2023-11-21
+ */
+public class RegionPersonnel {
+    @ApiModelProperty("大区id")
+    private Long regionId;
+
+    @ApiModelProperty("大区名称")
+    private String regionName;
+
+    @ApiModelProperty("供应商在服务人数")
+    private List<SupplierPersonnel> supplierPersonnelInfo;
+
+    @ApiModelProperty("大区在服务人数")
+    private Integer count;
+
+    public Long getRegionId() {
+        return regionId;
+    }
+
+    public void setRegionId(Long regionId) {
+        this.regionId = regionId;
+    }
+
+    public String getRegionName() {
+        return regionName;
+    }
+
+    public void setRegionName(String regionName) {
+        this.regionName = regionName;
+    }
+
+    public List<SupplierPersonnel> getSupplierPersonnelInfo() {
+        return supplierPersonnelInfo;
+    }
+
+    public void setSupplierPersonnelInfo(List<SupplierPersonnel> supplierPersonnelInfo) {
+        this.supplierPersonnelInfo = supplierPersonnelInfo;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}

+ 35 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/ServiceUnitPersonnel.java

@@ -0,0 +1,35 @@
+package com.qmth.sop.business.bean.result.analyze;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @Description: 大区在服务人数及对比
+ * @Author: CaoZixuan
+ * @Date: 2023-11-21
+ */
+public class ServiceUnitPersonnel {
+    @ApiModelProperty("大区在服务人数")
+    private List<RegionPersonnel> regionPersonnelInfo;
+
+    @ApiModelProperty("供应商id集合")
+    private Set<Long> supplierIdSet;
+
+    public List<RegionPersonnel> getRegionPersonnelInfo() {
+        return regionPersonnelInfo;
+    }
+
+    public void setRegionPersonnelInfo(List<RegionPersonnel> regionPersonnelInfo) {
+        this.regionPersonnelInfo = regionPersonnelInfo;
+    }
+
+    public Set<Long> getSupplierIdSet() {
+        return supplierIdSet;
+    }
+
+    public void setSupplierIdSet(Set<Long> supplierIdSet) {
+        this.supplierIdSet = supplierIdSet;
+    }
+}

+ 43 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/analyze/SupplierPersonnel.java

@@ -0,0 +1,43 @@
+package com.qmth.sop.business.bean.result.analyze;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 供应商在服务人员数
+ * @Author: CaoZixuan
+ * @Date: 2023-11-21
+ */
+public class SupplierPersonnel {
+    @ApiModelProperty("供应商id")
+    private Long supplierId;
+
+    @ApiModelProperty("供应商名称")
+    private String supplierName;
+
+    @ApiModelProperty("供应商下在服务人员人数")
+    private Integer count;
+
+    public Long getSupplierId() {
+        return supplierId;
+    }
+
+    public void setSupplierId(Long supplierId) {
+        this.supplierId = supplierId;
+    }
+
+    public String getSupplierName() {
+        return supplierName;
+    }
+
+    public void setSupplierName(String supplierName) {
+        this.supplierName = supplierName;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}

+ 1 - 0
sop-business/src/main/java/com/qmth/sop/business/entity/TBDelayWarn.java

@@ -75,6 +75,7 @@ public class TBDelayWarn extends BaseEntity implements Serializable {
         this.fieldObj = fieldObj;
         this.status = DelayWarnStatusEnum.NOT_START;
         setCreateId(userId);
+        this.userId = userId;
     }
 
     public String getCrmNo() {

+ 120 - 0
sop-business/src/main/java/com/qmth/sop/business/entity/TBSopPlanDateLog.java

@@ -0,0 +1,120 @@
+package com.qmth.sop.business.entity;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.sop.common.base.BaseEntity;
+import com.qmth.sop.common.contant.SystemConstant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * <p>
+ * sop进程计划时间日志表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2023-11-20
+ */
+@ApiModel(value = "TBSopPlanDateLog对象", description = "sop进程计划时间日志表")
+public class TBSopPlanDateLog extends BaseEntity implements Serializable , Comparable<TBSopPlanDateLog>{
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "sopId")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long sopId;
+
+    @ApiModelProperty(value = "流程Id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long flowId;
+
+    @ApiModelProperty(value = "计划开始时间")
+    private Long beginTime;
+
+    @ApiModelProperty(value = "计划结束时间")
+    private Long endTime;
+
+    public TBSopPlanDateLog() {
+
+    }
+
+    public TBSopPlanDateLog(Long sopId, Long flowId, Long beginTime, Long endTime, Long userId) {
+        setId(SystemConstant.getDbUuid());
+        this.sopId = sopId;
+        this.flowId = flowId;
+        this.beginTime = beginTime;
+        this.endTime = endTime;
+        setCreateId(userId);
+        setCreateTime(System.currentTimeMillis());
+    }
+
+    public void updateInfo(Long userId) {
+        setId(SystemConstant.getDbUuid());
+        setCreateId(userId);
+        setCreateTime(System.currentTimeMillis());
+    }
+
+    public Long getSopId() {
+        return sopId;
+    }
+
+    public void setSopId(Long sopId) {
+        this.sopId = sopId;
+    }
+
+    public Long getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Long beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public Long getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Long endTime) {
+        this.endTime = endTime;
+    }
+
+    public Long getFlowId() {
+        return flowId;
+    }
+
+    public void setFlowId(Long flowId) {
+        this.flowId = flowId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        TBSopPlanDateLog that = (TBSopPlanDateLog) o;
+        return Objects.equals(sopId, that.sopId) && Objects.equals(flowId, that.flowId) && Objects.equals(beginTime, that.beginTime) && Objects.equals(endTime, that.endTime);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(sopId, flowId, beginTime, endTime);
+    }
+
+    @Override
+    public int compareTo(@NotNull TBSopPlanDateLog o) {
+        if (o.getCreateTime() < this.getCreateTime()) {
+            return 1;
+        } else if (o.getCreateTime() > this.getCreateTime()) {
+            return -1;
+        } else {
+            return 0;
+        }
+    }
+}

+ 27 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/TBSopPlanDateLogMapper.java

@@ -0,0 +1,27 @@
+package com.qmth.sop.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.sop.business.bean.dto.TBSopPlanDateLogDto;
+import com.qmth.sop.business.entity.TBSopPlanDateLog;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * sop进程计划时间日志表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2023-11-20
+ */
+public interface TBSopPlanDateLogMapper extends BaseMapper<TBSopPlanDateLog> {
+
+    /**
+     * 查找sop计划时间
+     *
+     * @param serviceId
+     * @return
+     */
+    List<TBSopPlanDateLogDto> findSopPlanDateLog(@Param("serviceId") Long serviceId);
+}

+ 5 - 1
sop-business/src/main/java/com/qmth/sop/business/service/ServiceAnalyseService.java

@@ -7,6 +7,7 @@ import com.qmth.sop.business.bean.result.TBCrmResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationSubTotalResult;
 import com.qmth.sop.business.bean.result.analyze.ServiceUnitOverview;
+import com.qmth.sop.business.bean.result.analyze.ServiceUnitPersonnel;
 import com.qmth.sop.business.entity.TBService;
 
 import java.util.List;
@@ -30,7 +31,10 @@ public interface ServiceAnalyseService extends IService<TBService> {
 
     List<Map<String, Object>> device(Long serviceUnitId);
 
-    List<Map<String, Object>> personnel(Long serviceUnitId);
+    @Deprecated
+    List<Map<String, Object>> personnel1(Long serviceUnitId);
+
+    ServiceUnitPersonnel personnel(Long serviceUnitId);
 
     UserArchivesAllocationSubTotalResult findCrmAllocationSubTotal(Long serviceUnitId, Long regionId, Long supplierId);
 

+ 19 - 0
sop-business/src/main/java/com/qmth/sop/business/service/SsoService.java

@@ -0,0 +1,19 @@
+package com.qmth.sop.business.service;
+
+import com.qmth.sop.business.entity.SysUser;
+
+/**
+ * @Description: 单点登录接口
+ * @Author: CaoZixuan
+ * @Date: 2023-11-22
+ */
+public interface SsoService {
+
+    /**
+     * 软通智能客服单点登录
+     *
+     * @param requestUser 请求用户
+     * @return 拼接好的单点登录跳转地址
+     */
+    String rtzfSsoLogin(SysUser requestUser);
+}

+ 11 - 0
sop-business/src/main/java/com/qmth/sop/business/service/TBSopInfoService.java

@@ -131,6 +131,17 @@ public interface TBSopInfoService extends IService<TBSopInfo> {
      */
     public void saveJobRemind(Map<String, Object> map) throws InterruptedException;
 
+    /**
+     * 更新sop计划进场开始时间和结束时间
+     *
+     * @param flowTaskResult
+     * @param sopId
+     * @param flowId
+     * @param userId
+     * @throws InterruptedException
+     */
+    public void saveSopPlanDate(FlowTaskResult flowTaskResult, Long sopId, Long flowId, Long userId) throws InterruptedException;
+
     /**
      * sop保存设备信息
      *

+ 26 - 0
sop-business/src/main/java/com/qmth/sop/business/service/TBSopPlanDateLogService.java

@@ -0,0 +1,26 @@
+package com.qmth.sop.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.dto.TBSopPlanDateLogDto;
+import com.qmth.sop.business.entity.TBSopPlanDateLog;
+
+import java.util.List;
+
+/**
+ * <p>
+ * sop进程计划时间日志表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2023-11-20
+ */
+public interface TBSopPlanDateLogService extends IService<TBSopPlanDateLog> {
+
+    /**
+     * 查找sop计划时间
+     *
+     * @param serviceId
+     * @return
+     */
+    List<TBSopPlanDateLogDto> findSopPlanDateLog(Long serviceId);
+}

+ 83 - 1
sop-business/src/main/java/com/qmth/sop/business/service/impl/ServiceAnalyseServiceImpl.java

@@ -5,10 +5,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.sop.business.bean.dto.DataPermissionDto;
+import com.qmth.sop.business.bean.result.CrmArchivesAllocationResult;
 import com.qmth.sop.business.bean.result.TBCrmResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationSubTotalResult;
+import com.qmth.sop.business.bean.result.analyze.RegionPersonnel;
 import com.qmth.sop.business.bean.result.analyze.ServiceUnitOverview;
+import com.qmth.sop.business.bean.result.analyze.ServiceUnitPersonnel;
+import com.qmth.sop.business.bean.result.analyze.SupplierPersonnel;
 import com.qmth.sop.business.entity.*;
 import com.qmth.sop.business.mapper.ServiceAnalyseMapper;
 import com.qmth.sop.business.service.*;
@@ -51,6 +55,12 @@ public class ServiceAnalyseServiceImpl extends ServiceImpl<ServiceAnalyseMapper,
     @Resource
     private SysDeviceService sysDeviceService;
 
+    @Resource
+    private TBServiceRegionService tbServiceRegionService;
+
+    @Resource
+    private SysSupplierService sysSupplierService;
+
     @Override
     public List<TBService> list(Long startTime, Long endTime) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
@@ -261,11 +271,83 @@ public class ServiceAnalyseServiceImpl extends ServiceImpl<ServiceAnalyseMapper,
         return this.baseMapper.device(serviceUnitId);
     }
 
+    @Deprecated
     @Override
-    public List<Map<String, Object>> personnel(Long serviceUnitId) {
+    public List<Map<String, Object>> personnel1(Long serviceUnitId) {
         return this.baseMapper.personnel(serviceUnitId);
     }
 
+    @Override
+    public ServiceUnitPersonnel personnel(Long serviceUnitId) {
+        List<TBCrm> publishCrmList = tbCrmService.list(new QueryWrapper<TBCrm>()
+                .lambda()
+                .eq(TBCrm::getServiceId, serviceUnitId)
+                .eq(TBCrm::getEnable, true)
+                .eq(TBCrm::getStatus, CrmStatusEnum.PUBLISH));
+
+        Set<Long> regionIdSet = publishCrmList.stream().map(TBCrm::getRegionId).collect(Collectors.toSet());
+
+        List<RegionPersonnel> regionPersonnelList = new ArrayList<>();
+
+        // 全量供应商id集合
+        Set<Long> supplierIdSet = new HashSet<>();
+        for (Long regionId : regionIdSet) {
+            TBServiceRegion tbServiceRegion = tbServiceRegionService.getById(regionId);
+            if (Objects.isNull(tbServiceRegion)) {
+                throw ExceptionResultEnum.ERROR.exception("未找到大区信息");
+            }
+            String regionName = tbServiceRegion.getRegionName();
+
+            List<TBCrm> crmList = publishCrmList.stream()
+                    .filter(e -> regionId.equals(e.getRegionId()))
+                    .collect(Collectors.toList());
+
+            // 大区下供应商和人员关系Map
+            Map<Long, Set<Long>> supplierMap = new HashMap<>();
+            for (TBCrm tbCrm : crmList) {
+                List<CrmArchivesAllocationResult> detail = tbUserArchivesAllocationService.findAllocationByCrmNo(tbCrm.getCrmNo());
+                detail.forEach(e -> {
+                    Long supplierId = e.getSupplierId();
+                    Long userId = e.getUserId();
+                    if (supplierMap.containsKey(supplierId)) {
+                        supplierMap.get(supplierId).add(userId);
+                    } else {
+                        Set<Long> userIdSet = new HashSet<>();
+                        userIdSet.add(userId);
+                        supplierMap.put(supplierId, userIdSet);
+                        supplierIdSet.add(supplierId);
+                    }
+                });
+            }
+
+            List<SupplierPersonnel> supplierPersonnelList = new ArrayList<>();
+            int count = 0;
+            for (Long supplierId : supplierMap.keySet()) {
+                SysSupplier sysSupplier = sysSupplierService.getById(supplierId);
+                String supplierName = sysSupplier.getName();
+
+                SupplierPersonnel supplierPersonnel = new SupplierPersonnel();
+                supplierPersonnel.setSupplierId(supplierId);
+                supplierPersonnel.setSupplierName(supplierName);
+                int cellCount = supplierMap.get(supplierId).size();
+                supplierPersonnel.setCount(cellCount);
+                supplierPersonnelList.add(supplierPersonnel);
+                count = count + cellCount;
+            }
+            RegionPersonnel regionPersonnel = new RegionPersonnel();
+
+            regionPersonnel.setRegionId(regionId);
+            regionPersonnel.setRegionName(regionName);
+            regionPersonnel.setSupplierPersonnelInfo(supplierPersonnelList);
+            regionPersonnel.setCount(count);
+            regionPersonnelList.add(regionPersonnel);
+        }
+        ServiceUnitPersonnel serviceUnitPersonnel = new ServiceUnitPersonnel();
+        serviceUnitPersonnel.setSupplierIdSet(supplierIdSet);
+        serviceUnitPersonnel.setRegionPersonnelInfo(regionPersonnelList);
+        return serviceUnitPersonnel;
+    }
+
 
     @Override
     public UserArchivesAllocationSubTotalResult findCrmAllocationSubTotal(Long serviceUnitId, Long regionId, Long supplierId) {

+ 71 - 93
sop-business/src/main/java/com/qmth/sop/business/service/impl/SopScheduleServiceImpl.java

@@ -3,42 +3,29 @@ package com.qmth.sop.business.service.impl;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.sop.business.bean.params.FormWidgetMetadataParam;
-import com.qmth.sop.business.bean.params.SopInfoListParam;
-import com.qmth.sop.business.bean.result.FormWidgetMetadataResult;
+import com.qmth.sop.business.bean.dto.TBSopPlanDateLogDto;
 import com.qmth.sop.business.entity.TBSopInfo;
-import com.qmth.sop.business.entity.TFCustomFlow;
+import com.qmth.sop.business.entity.TBSopPlanDateLog;
 import com.qmth.sop.business.mapper.SopScheduleMapper;
-import com.qmth.sop.business.mapper.TBSopInfoMapper;
 import com.qmth.sop.business.service.SopScheduleService;
-import com.qmth.sop.business.service.TDFormWidgetMetadataService;
-import com.qmth.sop.business.service.TFCustomFlowService;
+import com.qmth.sop.business.service.TBSopPlanDateLogService;
 import com.qmth.sop.common.contant.SystemConstant;
-import com.qmth.sop.common.enums.ExceptionResultEnum;
+import com.qmth.sop.common.enums.FlowStatusEnum;
 import com.qmth.sop.common.enums.SopAnalyseGroupEnum;
-import com.qmth.sop.common.enums.TFCustomTypeEnum;
 import com.qmth.sop.common.util.DateDisposeUtils;
-import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
 import java.util.*;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import static com.qmth.sop.common.util.DateDisposeUtils.parseDate;
-
 @Service
 public class SopScheduleServiceImpl extends ServiceImpl<SopScheduleMapper, TBSopInfo> implements SopScheduleService {
-    @Resource
-    TBSopInfoMapper tbSopInfoMapper;
 
     @Resource
-    TDFormWidgetMetadataService tdFormWidgetMetadataService;
-
-    @Resource
-    TFCustomFlowService tfCustomFlowService;
+    TBSopPlanDateLogService tbSopPlanDateLogService;
 
     /**
      * * ①准备:扫描前的准备阶段;
@@ -72,7 +59,7 @@ public class SopScheduleServiceImpl extends ServiceImpl<SopScheduleMapper, TBSop
         map.put("scan", list.stream().filter(map1 -> map1.get("setup") != null && "5,6,7".indexOf(map1.get("setup").toString()) > 0).count());
         map.put("evaluation", list.stream().filter(map1 -> map1.get("setup") != null && "8,9".indexOf(map1.get("setup").toString()) > 0).count());
         map.put("summary", list.stream().filter(map1 -> map1.get("setup") != null && (Integer.parseInt(map1.get("setup").toString()) == 11 || Integer.parseInt(map1.get("setup").toString()) == 10)).count());
-        map.put("finish", list.stream().filter(map1 -> map1.get("setup") != null && Integer.parseInt(map1.get("setup").toString()) <= 0).count());
+        map.put("finish", list.stream().filter(map1 -> map1.get("setup") != null && Integer.parseInt(map1.get("setup").toString()) == 0).count());
         return map;
     }
 
@@ -84,82 +71,73 @@ public class SopScheduleServiceImpl extends ServiceImpl<SopScheduleMapper, TBSop
     @Override
     public Map<String, List<Map<String, Object>>> projectProgress(Long serviceId) {
         Map<String, List<Map<String, Object>>> result = new HashMap<>();
-        TFCustomTypeEnum[] types = {TFCustomTypeEnum.OFFICE_SOP_FLOW, TFCustomTypeEnum.CLOUD_MARK_SOP_FLOW};
-        List<Map<String, Object>> tempList = new ArrayList<>();
-        for (TFCustomTypeEnum type : types) {
-            List<FormWidgetMetadataResult> formWidgetMetadataResults = tdFormWidgetMetadataService.selectAll(type);
-            String fieldId = formWidgetMetadataResults.stream().filter(e -> e.getFieldTitle().equals("现场标准服务周期(人天)")).findFirst().get().getFieldId();
-            TFCustomFlow maxTfCustomFlow = tfCustomFlowService.findMaxVersion(null, null, type);
-            Optional.ofNullable(maxTfCustomFlow).orElseThrow(() -> ExceptionResultEnum.FLOW_CUSTOM_NO_DATA.exception());
-            SopInfoListParam sopInfoListParam = getSopInfoListParam(serviceId, type, fieldId);
-            sopInfoListParam.setVersion(maxTfCustomFlow.getVersion());
-            String tableName = sopInfoListParam.getType().getTableName() + "_" + sopInfoListParam.getVersion();
-            //显示字段
-            String fieldName = null;
-            StringJoiner stringJoinerView = new StringJoiner(",");
-            if (!CollectionUtils.isEmpty(sopInfoListParam.getFormWidgetMetadataViewList())) {
-                for (FormWidgetMetadataParam f : sopInfoListParam.getFormWidgetMetadataViewList()) {
-                    stringJoinerView.add(f.getFieldId());
+        List<TBSopPlanDateLogDto> tbSopPlanDateLogDtoList = tbSopPlanDateLogService.findSopPlanDateLog(serviceId);
+        if (!CollectionUtils.isEmpty(tbSopPlanDateLogDtoList)) {
+            Map<Long, Long> endTimeMap = new HashMap<>();//取终止的流程日期
+            List<Map<String, Object>> plan = new ArrayList<>(), actualed = new ArrayList<>();
+            LinkedMultiValueMap<Long, TBSopPlanDateLogDto> sopPlanDateLogDtoLinkedMultiValueMap = new LinkedMultiValueMap<>();
+            for (TBSopPlanDateLogDto t : tbSopPlanDateLogDtoList) {
+                sopPlanDateLogDtoLinkedMultiValueMap.add(t.getSopId(), t);
+                if (t.getStatus() == FlowStatusEnum.END) {
+                    endTimeMap.put(t.getSopId(), t.getFlowUpdateTime());
                 }
-                fieldName = stringJoinerView.toString();
             }
-            List<Map> list = tbSopInfoMapper.list(new Page<>(sopInfoListParam.getPageNumber(), sopInfoListParam.getPageSize()), Objects.nonNull(sopInfoListParam.getType()) ? sopInfoListParam.getType().name() : null, sopInfoListParam.getServiceId(), tableName, fieldName, null, null, null).getRecords();
-
-
-            list.forEach(l -> {
-                List<String> daysBetween = DateDisposeUtils.getDaysBetween((Long) l.get("examStartTime"), (Long) l.get("examEndTime"), SystemConstant.DEFAULT_DATE_YMD_PATTERN);
-                daysBetween.forEach(d -> {
-                    Map<String, Object> map = new HashMap<>();
-                    map.put("datetime", d);
-                    map.put("count", l.get(fieldId));
-                    tempList.add(map);
-                });
-            });
+            Map<String, Integer> daysBetweenPlanCalculat = new LinkedHashMap<>();
+            Map<String, Integer> daysBetweenActaledCalculat = new LinkedHashMap<>();
+            for (Map.Entry<Long, List<TBSopPlanDateLogDto>> entry : sopPlanDateLogDtoLinkedMultiValueMap.entrySet()) {
+                List<TBSopPlanDateLogDto> list = entry.getValue();
+                TBSopPlanDateLog planDateLog = list.get(0);//计划
+                TBSopPlanDateLog planActaledDateLog = null;
+                if (list.size() > 1) {//实际
+                    planActaledDateLog = list.get(list.size() - 1);
+                }
+                if (Objects.nonNull(planActaledDateLog) && endTimeMap.containsKey(planActaledDateLog.getSopId())) {
+                    planActaledDateLog.setEndTime(endTimeMap.get(planActaledDateLog.getSopId()));
+                }
+                if (Objects.nonNull(planDateLog)) {
+                    List<String> daysBetweenPlan = DateDisposeUtils.getDaysBetween(planDateLog.getBeginTime(), planDateLog.getEndTime(), SystemConstant.DEFAULT_DATE_YMD_PATTERN);
+                    Map<String, Integer> daysBetweenPlanMap = new LinkedHashMap<>();
+                    for (int i = 0; i < daysBetweenPlan.size(); i++) {
+                        daysBetweenPlanMap.put(daysBetweenPlan.get(i), i + 1);
+                    }
+                    for (Map.Entry<String, Integer> entryPlan : daysBetweenPlanMap.entrySet()) {
+                        if (daysBetweenPlanCalculat.containsKey(entryPlan.getKey())) {
+                            daysBetweenPlanCalculat.put(entryPlan.getKey(), daysBetweenPlanCalculat.get(entryPlan.getKey()) + entryPlan.getValue());
+                        } else {
+                            daysBetweenPlanCalculat.put(entryPlan.getKey(), entryPlan.getValue());
+                        }
+                    }
+                }
+                if (Objects.nonNull(planActaledDateLog)) {
+                    List<String> daysBetweenActualed = DateDisposeUtils.getDaysBetween(planActaledDateLog.getBeginTime(), planActaledDateLog.getEndTime(), SystemConstant.DEFAULT_DATE_YMD_PATTERN);
+                    Map<String, Integer> daysBetweenActualedMap = new LinkedHashMap<>();
+                    for (int i = 0; i < daysBetweenActualed.size(); i++) {
+                        daysBetweenActualedMap.put(daysBetweenActualed.get(i), i + 1);
+                    }
+                    for (Map.Entry<String, Integer> entryActualed : daysBetweenActualedMap.entrySet()) {
+                        if (daysBetweenActaledCalculat.containsKey(entryActualed.getKey())) {
+                            daysBetweenActaledCalculat.put(entryActualed.getKey(), daysBetweenActaledCalculat.get(entryActualed.getKey()) + entryActualed.getValue());
+                        } else {
+                            daysBetweenActaledCalculat.put(entryActualed.getKey(), entryActualed.getValue());
+                        }
+                    }
+                }
+            }
+            for (Map.Entry<String, Integer> entryPlan : daysBetweenPlanCalculat.entrySet()) {
+                Map<String, Object> map = new HashMap<>();
+                map.put("datetime", entryPlan.getKey());
+                map.put("count", entryPlan.getValue());
+                plan.add(map);
+            }
+            for (Map.Entry<String, Integer> entryActaled : daysBetweenActaledCalculat.entrySet()) {
+                Map<String, Object> map = new HashMap<>();
+                map.put("datetime", entryActaled.getKey());
+                map.put("count", entryActaled.getValue());
+                actualed.add(map);
+            }
+            result.put("plan", plan);
+            result.put("actual", actualed);
         }
-        //日期相同的合并 计算count之和
-        List<Map<String, Object>> plan = new ArrayList<>();
-        tempList.stream().collect(Collectors.groupingBy(map -> map.get("datetime"))).forEach((k, v) -> {
-            Map<String, Object> map = new HashMap<>();
-            map.put("datetime", k);
-            map.put("count", v.stream().filter(map1 -> map1.get("count") != null).mapToInt(m -> Integer.parseInt(m.get("count").toString())).sum());
-            plan.add(map);
-        });
-        List<Map<String, Object>> temp2List = new ArrayList<>();
-        List<Map<String, Object>> actualed = this.baseMapper.actualProgress(serviceId);
-        if (plan.isEmpty() && actualed.isEmpty())
-            return result;
-        temp2List.addAll(plan);
-        temp2List.addAll(actualed);
-        Object max = temp2List.stream().max(Comparator.comparing(o -> o.get("datetime").toString())).orElse(new HashMap<>()).get("datetime");
-        Object min = temp2List.stream().min(Comparator.comparing(o -> o.get("datetime").toString())).orElse(new HashMap<>()).get("datetime");
-        List<String> daysBetween = DateDisposeUtils.getDaysBetween(parseDate(min).getTime(), parseDate(max).getTime(), SystemConstant.DEFAULT_DATE_YMD_PATTERN);
-        daysBetween.forEach(e -> {
-            Map<String, Object> map = new HashMap<>();
-            map.put("datetime", e);
-            map.put("count", 0);
-            if (plan.stream().noneMatch(e1 -> e1.get("datetime").toString().equals(e))) plan.add(map);
-            if (actualed.stream().noneMatch(e1 -> e1.get("datetime").toString().equals(e))) actualed.add(map);
-        });
-
-        result.put("plan", plan.stream().sorted(Comparator.comparing(o -> o.get("datetime").toString())).collect(Collectors.toList()));
-        result.put("actual", actualed.stream().sorted(Comparator.comparing(o -> o.get("datetime").toString())).collect(Collectors.toList()));
         return result;
     }
-
-    @NotNull
-    private static SopInfoListParam getSopInfoListParam(Long serviceId, TFCustomTypeEnum type, String fieldId) {
-        SopInfoListParam sopInfoListParam = new SopInfoListParam();
-        sopInfoListParam.setPageNumber(1);
-        sopInfoListParam.setPageSize(Integer.MAX_VALUE);
-        sopInfoListParam.setServiceId(serviceId);
-        List<FormWidgetMetadataParam> formWidgetMetadataViewList = new ArrayList<>();
-        FormWidgetMetadataParam formWidgetMetadataParam = new FormWidgetMetadataParam();
-        formWidgetMetadataParam.setFieldId(fieldId);
-        formWidgetMetadataViewList.add(formWidgetMetadataParam);
-        sopInfoListParam.setFormWidgetMetadataViewList(formWidgetMetadataViewList);
-        sopInfoListParam.setFormWidgetMetadataConditionList(new ArrayList<>());
-        sopInfoListParam.setType(type);
-        return sopInfoListParam;
-    }
-
 }

+ 36 - 0
sop-business/src/main/java/com/qmth/sop/business/service/impl/SsoServiceImpl.java

@@ -0,0 +1,36 @@
+package com.qmth.sop.business.service.impl;
+
+import com.qmth.sop.business.entity.SysUser;
+import com.qmth.sop.business.service.SsoService;
+import com.qmth.sop.business.service.SysConfigService;
+import com.qmth.sop.business.sync.RtzfApiUtils;
+import com.qmth.sop.business.sync.been.rtzf.LoginTypeEnum;
+import com.qmth.sop.common.contant.SystemConstant;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.StringJoiner;
+
+/**
+ * @Description: sso单点登录服务实现类
+ * @Author: CaoZixuan
+ * @Date: 2023-11-22
+ */
+@Service
+public class SsoServiceImpl implements SsoService {
+    @Resource
+    private RtzfApiUtils rtzfApiUtils;
+    @Resource
+    private SysConfigService sysConfigService;
+
+    @Override
+    public String rtzfSsoLogin(SysUser requestUser) {
+        String ssoUrl = sysConfigService.findByConfigKey(SystemConstant.RTZF_OSS_LOGIN_URL).getConfigValue();
+        String token = rtzfApiUtils.getRtzfToken(requestUser, LoginTypeEnum.SSO_LOGIN);
+
+        StringJoiner redirectUrlJoiner = new StringJoiner("");
+        redirectUrlJoiner.add(ssoUrl);
+        redirectUrlJoiner.add(SystemConstant.GET_UNKNOWN).add(SystemConstant.SIGNATURE).add(SystemConstant.GET_EQUAL).add(token);
+        return redirectUrlJoiner.toString();
+    }
+}

+ 64 - 20
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBServiceRegionServiceImpl.java

@@ -16,10 +16,7 @@ import com.qmth.sop.business.mapper.TBServiceRegionMapper;
 import com.qmth.sop.business.service.*;
 import com.qmth.sop.common.base.BaseEntity;
 import com.qmth.sop.common.contant.SystemConstant;
-import com.qmth.sop.common.enums.ExceptionResultEnum;
-import com.qmth.sop.common.enums.RoleTypeEnum;
-import com.qmth.sop.common.enums.ServiceStatusEnum;
-import com.qmth.sop.common.enums.UserArchivesStatusEnum;
+import com.qmth.sop.common.enums.*;
 import com.qmth.sop.common.util.ServletUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
@@ -182,6 +179,19 @@ public class TBServiceRegionServiceImpl extends ServiceImpl<TBServiceRegionMappe
             this.save(tbServiceRegion);
             serviceRegionId = tbServiceRegion.getId();
         } else {
+            // 修改大区判断1 - 修改大区经理
+            TBServiceRegion dbServiceRegion = this.getById(serviceRegionId);
+            if (!Objects.equals(leadId, dbServiceRegion.getLeadId())) {
+                List<TBCrm> alreadyPublished = tbCrmService.list(new QueryWrapper<TBCrm>().lambda()
+                        .eq(TBCrm::getEnable, true)
+                        .ne(TBCrm::getStatus, CrmStatusEnum.UN_PUBLISH));
+                if (alreadyPublished.size() > 0) {
+                    String s = alreadyPublished.stream().map(e -> e.getCrmNo() + "(" + e.getName() + ")").collect(Collectors.joining(","));
+                    throw ExceptionResultEnum.ERROR.exception(String.format("该大区规划中存在已经发布或已完结的派单[%s],不能修改大区经理", s));
+                }
+            }
+
+
             // 编辑
             List<TBServiceRegionDetail> tbServiceRegionDetailList = tbServiceRegionDetailService
                     .list(new QueryWrapper<TBServiceRegionDetail>()
@@ -202,6 +212,10 @@ public class TBServiceRegionServiceImpl extends ServiceImpl<TBServiceRegionMappe
                 List<TBCrm> willDisposeCrmList = tbCrmService.list(new QueryWrapper<TBCrm>().lambda().in(TBCrm::getRegionDetailId, willDeleteRegionDetailIdList));
 
                 for (TBCrm tbCrm : willDisposeCrmList) {
+                    // 修改大区判断2 - 修改大区区域
+                    if (!CrmStatusEnum.UN_PUBLISH.equals(tbCrm.getStatus())) {
+                        throw ExceptionResultEnum.ERROR.exception("该大区规划中存在已经发布或已完结的派单[" + tbCrm.getCrmNo() + "(" + tbCrm.getName() + ")" + "]不能修改区域");
+                    }
                     // 之前派单有划定在服务单元 -> 解绑派单所有资源信息
                     List<TBUserArchivesAllocation> dbAllocationList = tbUserArchivesAllocationService.list(new QueryWrapper<TBUserArchivesAllocation>().lambda()
                             .eq(TBUserArchivesAllocation::getCrmNo, tbCrm.getCrmNo())
@@ -269,26 +283,56 @@ public class TBServiceRegionServiceImpl extends ServiceImpl<TBServiceRegionMappe
             if (Objects.isNull(tbServiceRegion)) {
                 throw ExceptionResultEnum.ERROR.exception("服务区域规划不存在");
             }
-            // 同时清除派单和大区经理的关系
-            Long serviceId = tbServiceRegion.getServiceId();
-            TBService tbService = tbServiceService.getById(serviceId);
-            if (ServiceStatusEnum.FINISH.equals(tbService.getStatus())) {
-                throw ExceptionResultEnum.ERROR.exception(ServiceStatusEnum.FINISH.getTitle() + "的服务单元不能作废");
-            }
-
-            Long leadId = tbServiceRegion.getLeadId();
-            UpdateWrapper<TBCrm> crmUpdateWrapper = new UpdateWrapper<>();
-            crmUpdateWrapper.lambda()
-                    .eq(TBCrm::getServiceId, serviceId)
-                    .eq(TBCrm::getLeadId, leadId)
-                    .set(TBCrm::getLeadId, null);
-            tbCrmService.update(crmUpdateWrapper);
 
             // 删除派单规划详情
-            tbServiceRegionDetailService.remove(new QueryWrapper<TBServiceRegionDetail>().lambda().eq(TBServiceRegionDetail::getServiceRegionId, tbServiceRegion.getId()));
+            List<Long> willDeleteRegionDetailIdList = tbServiceRegionDetailService.list(new QueryWrapper<TBServiceRegionDetail>()
+                            .lambda()
+                            .eq(TBServiceRegionDetail::getServiceRegionId, tbServiceRegion.getId()))
+                    .stream()
+                    .map(TBServiceRegionDetail::getId)
+                    .distinct()
+                    .collect(Collectors.toList());
+
+            // 清空之前派单绑定的资源信息
+            if (CollectionUtils.isNotEmpty(willDeleteRegionDetailIdList)) {
+                List<TBCrm> willDisposeCrmList = tbCrmService.list(new QueryWrapper<TBCrm>().lambda().in(TBCrm::getRegionDetailId, willDeleteRegionDetailIdList));
+
+                for (TBCrm tbCrm : willDisposeCrmList) {
+                    if (!CrmStatusEnum.UN_PUBLISH.equals(tbCrm.getStatus())) {
+                        throw ExceptionResultEnum.ERROR.exception("该大区规划中存在已经发布的派单[" + tbCrm.getCrmNo() + "(" + tbCrm.getName() + ")" + "]不能修改区域");
+                    }
+                    // 之前派单有划定在服务单元 -> 解绑派单所有资源信息
+                    List<TBUserArchivesAllocation> dbAllocationList = tbUserArchivesAllocationService.list(new QueryWrapper<TBUserArchivesAllocation>().lambda()
+                            .eq(TBUserArchivesAllocation::getCrmNo, tbCrm.getCrmNo())
+                            .eq(TBUserArchivesAllocation::getServiceId, tbCrm.getServiceId()));
+
+                    if (CollectionUtils.isNotEmpty(dbAllocationList)) {
+                        // 释放工程师资源
+                        List<Long> archivesIdList = dbAllocationList.stream().map(TBUserArchivesAllocation::getArchivesId).distinct().collect(Collectors.toList());
+                        if (CollectionUtils.isNotEmpty(archivesIdList)) {
+                            UpdateWrapper<TBUserArchives> archivesUpdateWrapper = new UpdateWrapper<>();
+                            archivesUpdateWrapper.lambda()
+                                    .in(TBUserArchives::getId, archivesIdList)
+                                    .set(TBUserArchives::getStatus, UserArchivesStatusEnum.FREE);
+                            tbUserArchivesService.update(archivesUpdateWrapper);
+                        }
+                        // 删除之前的派单分配详情
+                        tbUserArchivesAllocationService.removeByIds(dbAllocationList.stream().map(TBUserArchivesAllocation::getId).distinct().collect(Collectors.toList()));
+                    }
+                }
+
+                UpdateWrapper<TBCrm> crmUpdateWrapper = new UpdateWrapper<>();
+                crmUpdateWrapper.lambda()
+                        .in(TBCrm::getRegionDetailId, willDeleteRegionDetailIdList)
+                        .set(TBCrm::getRegionCoordinatorId, null)
+                        .set(TBCrm::getRegionId, null)
+                        .set(TBCrm::getRegionDetailId, null)
+                        .set(TBCrm::getLeadId, null);
+                tbCrmService.update(crmUpdateWrapper);
+            }
 
             // 删除派单规划
-            tbServiceRegion.setEnable(false);
+            tbServiceRegionDetailService.removeByIds(willDeleteRegionDetailIdList);
             this.removeById(tbServiceRegion);
         }
     }

+ 69 - 25
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBSopInfoServiceImpl.java

@@ -94,6 +94,9 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
     @Resource
     TBServiceService tbServiceService;
 
+    @Resource
+    TBSopPlanDateLogService tbSopPlanDateLogService;
+
     /**
      * 查询动态sop表名是否存在
      *
@@ -329,6 +332,7 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
         Map<String, Object> map = activitiService.taskApprove(flowApproveParam);
         if (flowApproveParam.getApprove() != FlowApprovePassEnum.DRAFT) {
             map.put(SystemConstant.CRM_INFO, crmProjectResult);
+            map.put(SystemConstant.SOP_ID, tbSopInfo.getId());
             tbSopInfoService.saveJobRemind(map);
         }
         TFFlowApprove tfFlowApprove = (TFFlowApprove) map.get(SystemConstant.FLOW_APPROVE);
@@ -743,6 +747,7 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
         Map<String, Object> map = activitiService.taskApprove(new FlowApproveParam(flowDeploymentId, approve, approveUserIds, crmNo, formProperties));
         if (approve != FlowApprovePassEnum.DRAFT) {
             map.put(SystemConstant.CRM_INFO, crmProjectResult);
+            map.put(SystemConstant.SOP_ID, null);
             tbSopInfoService.saveJobRemind(map);
         }
 
@@ -756,6 +761,11 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
             tbSopInfoDetail.setSopInfoId(tbSopInfo.getId());
         }
         tbSopInfoDetailService.save(tbSopInfoDetail);
+        TBSopPlanDateLog tbSopPlanDateLog = tbSopPlanDateLogService.getOne(new QueryWrapper<TBSopPlanDateLog>().lambda().eq(TBSopPlanDateLog::getFlowId, tfCustomFlowEntity.getFlowId()).orderByDesc(TBSopPlanDateLog::getCreateTime).last(" limit 1 "));
+        if (Objects.nonNull(tbSopPlanDateLog)) {
+            tbSopPlanDateLog.setSopId(tbSopInfo.getId());
+            tbSopPlanDateLogService.updateById(tbSopPlanDateLog);
+        }
 
         tfCustomFlowEntity.setObjId(tbSopInfo.getId());
         tfCustomFlowEntityService.updateById(tfCustomFlowEntity);
@@ -784,6 +794,7 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
         TFFlowLog tfFlowLog = (TFFlowLog) map.get(SystemConstant.FLOW_APPROVE_LOG);
         Optional.ofNullable(tfFlowLog).orElseThrow(() -> ExceptionResultEnum.FLOW_APPROVE_LOG_NO_DATA.exception());
 
+        Long sopId = (Long) map.get(SystemConstant.SOP_ID);
         List<Task> taskList = taskService.createTaskQuery().processInstanceId(String.valueOf(tfCustomFlowEntity.getFlowId())).list();
         if (!CollectionUtils.isEmpty(taskList) && (tfFlowApprove.getStatus() != FlowStatusEnum.DRAFT && tfFlowApprove.getStatus() != FlowStatusEnum.FINISH && tfFlowApprove.getStatus() != FlowStatusEnum.END)) {
             Long processLimitedTime = null;
@@ -793,6 +804,7 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
                     FlowTaskResult flowTaskResult = this.getFormProperties(tfCustomFlowEntity, 1);
                     processLimitedTime = this.getProcessLimitedTime(flowTaskResult, ProcessLimitedEnum.PROJECT_KEY_INFO_DATE.getKey());
                     execField = ProcessLimitedEnum.PROJECT_KEY_INFO_DATE.getKey();
+                    tbSopInfoService.saveSopPlanDate(flowTaskResult, sopId, tfCustomFlowEntity.getFlowId(), sysUser.getId());
                 } else if (tfFlowApprove.getSetup().intValue() == 3) {//内审
                     processLimitedTime = tfFlowApprove.getUpdateTime();
                     execField = ProcessLimitedEnum.APPROVE_RADIO.getKey();
@@ -823,6 +835,7 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
                     FlowTaskResult flowTaskResult = this.getFormProperties(tfCustomFlowEntity, 1);
                     processLimitedTime = this.getProcessLimitedTime(flowTaskResult, ProcessLimitedEnum.PROJECT_KEY_INFO_DATE.getKey());
                     execField = ProcessLimitedEnum.PROJECT_KEY_INFO_DATE.getKey();
+                    tbSopInfoService.saveSopPlanDate(flowTaskResult, sopId, tfCustomFlowEntity.getFlowId(), sysUser.getId());
                 } else if (tfFlowApprove.getSetup().intValue() == 3) {//内审
                     processLimitedTime = tfFlowApprove.getUpdateTime();
                     execField = ProcessLimitedEnum.APPROVE_RADIO.getKey();
@@ -948,7 +961,7 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
         LinkedHashMap<String, FlowTaskResult> setupMapNew = new LinkedHashMap<>(setupMap.size());
         for (Map.Entry<String, FlowTaskResult> entry : setupMap.entrySet()) {
             if (entry.getValue().getSetup().intValue() > 0) {
-                if (entry.getValue().getSetup().intValue() == 1 || entry.getValue().getSetup().intValue() == 3 || entry.getValue().getSetup().intValue() == 4) {
+                if (entry.getValue().getSetup().intValue() == 1 || entry.getValue().getSetup().intValue() == 3) {
                     for (FlowFormWidgetResult f : entry.getValue().getFormProperty()) {
                         f.setReadable(true);
                         f.setWritable(false);
@@ -956,7 +969,7 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
                 }
                 if (tfFlowApprove.getSetup().intValue() != 0 && tfFlowApprove.getSetup().intValue() < entry.getValue().getSetup().intValue()) {
                     break;
-                } else {
+                } else if (entry.getValue().getSetup().intValue() != tfFlowApprove.getSetup().intValue()) {
                     setupMapNew.put(entry.getKey(), entry.getValue());
                 }
             }
@@ -996,6 +1009,23 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
         Optional.ofNullable(tfCustomFlow).orElseThrow(() -> ExceptionResultEnum.FLOW_CUSTOM_NO_DATA.exception());
 
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        FlowResult flowResultParam = JSONObject.parseObject(sopSaveParam.getFormProperties(), FlowResult.class);
+        LinkedHashMap<String, FlowTaskResult> setupParamMap = flowResultParam.getSetupMap();
+        for (Map.Entry<String, FlowTaskResult> entry : setupParamMap.entrySet()) {
+            if (entry.getValue().getSetup() != 0) {//更新动态表单字段和处理时限
+                tbSopInfoService.saveDynamicSop(tfCustomFlow, tfCustomFlowEntity.getCode(), tfCustomFlowEntity.getFlowId(), entry.getValue());
+            }
+        }
+        FlowResult flowResult = JSONObject.parseObject(tfCustomFlowEntity.getFlowProcessVar(), FlowResult.class);
+        LinkedHashMap<String, FlowTaskResult> setupMap = flowResult.getSetupMap();
+        for (Map.Entry<String, FlowTaskResult> entry : setupMap.entrySet()) {
+            if (Objects.nonNull(setupParamMap.get(entry.getKey()))) {
+                setupMap.put(entry.getKey(), setupParamMap.get(entry.getKey()));
+            }
+        }
+        flowResult.setSetupMap(setupMap);
+        tfCustomFlowEntity.updateInfo(sysUser.getId());
+        tfCustomFlowEntity.setFlowProcessVar(JacksonUtil.parseJson(flowResult));
         if (tfFlowApprove.getStatus() != FlowStatusEnum.FINISH && tfFlowApprove.getStatus() != FlowStatusEnum.END) {
             Map<String, Object> map = new HashMap<>();
             CrmProjectResult crmProjectResult = tbCrmService.findCrmProjectBySopNoOrCrmNo(tfCustomFlowEntity.getCode(), tfCustomFlowEntity.getCrmNo());
@@ -1009,31 +1039,12 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
             map.put(SystemConstant.FLOW_APPROVE, tfFlowApprove);
             map.put(SystemConstant.FLOW_APPROVE_LOG, tfFlowLog);
             map.put(SystemConstant.CRM_INFO, crmProjectResult);
-
+            map.put(SystemConstant.SOP_ID, tbSopInfo.getId());
             tbSopInfoService.saveJobRemind(map);
-        }
 
-        FlowResult flowResultParam = JSONObject.parseObject(sopSaveParam.getFormProperties(), FlowResult.class);
-        LinkedHashMap<String, FlowTaskResult> setupParamMap = flowResultParam.getSetupMap();
-        for (Map.Entry<String, FlowTaskResult> entry : setupParamMap.entrySet()) {
-            if (entry.getValue().getSetup() != 0 && entry.getValue().getSetup() > 1) {//更新动态表单字段和处理时限
-                tbSopInfoService.saveDynamicSop(tfCustomFlow, tfCustomFlowEntity.getCode(), tfCustomFlowEntity.getFlowId(), entry.getValue());
-            }
+            FlowTaskResult flowTaskResult = this.getFormProperties(tfCustomFlowEntity, 1);
+            tbSopInfoService.saveSopPlanDate(flowTaskResult, tbSopInfo.getId(), tfCustomFlowEntity.getFlowId(), sysUser.getId());
         }
-        FlowResult flowResult = JSONObject.parseObject(tfCustomFlowEntity.getFlowProcessVar(), FlowResult.class);
-        LinkedHashMap<String, FlowTaskResult> setupMap = flowResult.getSetupMap();
-        for (Map.Entry<String, FlowTaskResult> entry : setupMap.entrySet()) {
-            if (entry.getValue().getSetup().intValue() > 1) {
-                if (Objects.nonNull(setupParamMap.get(entry.getKey()))) {
-                    setupMap.put(entry.getKey(), setupParamMap.get(entry.getKey()));
-                } else {
-                    break;
-                }
-            }
-        }
-        flowResult.setSetupMap(setupMap);
-        tfCustomFlowEntity.updateInfo(sysUser.getId());
-        tfCustomFlowEntity.setFlowProcessVar(JacksonUtil.parseJson(flowResult));
         return tfCustomFlowEntityService.updateById(tfCustomFlowEntity);
     }
 
@@ -1091,10 +1102,43 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
                 break;
             }
         }
-        Optional.ofNullable(processLimitedTime).orElseThrow(() -> ExceptionResultEnum.ERROR.exception(ProcessLimitedEnum.convertKeyToEnum(fieldId).getTitle() + "处理时限时间为空"));
+        if (!fieldId.contains(ProcessLimitedEnum.SERVICE_FINISH_PLAN_BEGIN_DATE.getKey())) {
+            Optional.ofNullable(processLimitedTime).orElseThrow(() -> ExceptionResultEnum.ERROR.exception(ProcessLimitedEnum.convertKeyToEnum(fieldId).getTitle() + "处理时限时间为空"));
+        }
         return processLimitedTime;
     }
 
+    /**
+     * 更新sop计划进场开始时间和结束时间
+     *
+     * @param flowTaskResult
+     * @param sopId
+     * @param flowId
+     * @param userId
+     */
+    @Override
+    @Transactional
+    public void saveSopPlanDate(FlowTaskResult flowTaskResult, Long sopId, Long flowId, Long userId) {
+        Long serviceFinishPlanBeginDate = this.getProcessLimitedTime(flowTaskResult, ProcessLimitedEnum.SERVICE_FINISH_PLAN_BEGIN_DATE.getKey());
+        Long serviceFinishPlanEndDate = this.getProcessLimitedTime(flowTaskResult, ProcessLimitedEnum.SERVICE_FINISH_PLAN_DATE.getKey());
+        if (Objects.nonNull(serviceFinishPlanBeginDate)) {
+            TBSopPlanDateLog tbSopPlanDateLog = tbSopPlanDateLogService.getOne(new QueryWrapper<TBSopPlanDateLog>().lambda().eq(TBSopPlanDateLog::getFlowId, flowId).orderByDesc(TBSopPlanDateLog::getCreateTime).last(" limit 1 "));
+            if (Objects.isNull(tbSopPlanDateLog)) {
+                tbSopPlanDateLog = new TBSopPlanDateLog(sopId, flowId, serviceFinishPlanBeginDate, serviceFinishPlanEndDate, userId);
+                tbSopPlanDateLogService.save(tbSopPlanDateLog);
+            } else {
+                TBSopPlanDateLog tbSopPlanDateLogNew = new TBSopPlanDateLog();
+                BeanUtils.copyProperties(tbSopPlanDateLog, tbSopPlanDateLogNew);
+                tbSopPlanDateLogNew.setBeginTime(serviceFinishPlanBeginDate);
+                tbSopPlanDateLogNew.setEndTime(serviceFinishPlanEndDate);
+                if (!tbSopPlanDateLogNew.equals(tbSopPlanDateLog)) {
+                    tbSopPlanDateLogNew.updateInfo(userId);
+                    tbSopPlanDateLogService.save(tbSopPlanDateLogNew);
+                }
+            }
+        }
+    }
+
     /**
      * 根据crmNo查询在途的sop信息
      *

+ 33 - 0
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBSopPlanDateLogServiceImpl.java

@@ -0,0 +1,33 @@
+package com.qmth.sop.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.sop.business.bean.dto.TBSopPlanDateLogDto;
+import com.qmth.sop.business.entity.TBSopPlanDateLog;
+import com.qmth.sop.business.mapper.TBSopPlanDateLogMapper;
+import com.qmth.sop.business.service.TBSopPlanDateLogService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * sop进程计划时间日志表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2023-11-20
+ */
+@Service
+public class TBSopPlanDateLogServiceImpl extends ServiceImpl<TBSopPlanDateLogMapper, TBSopPlanDateLog> implements TBSopPlanDateLogService {
+
+    /**
+     * 查找sop计划时间
+     *
+     * @param serviceId
+     * @return
+     */
+    @Override
+    public List<TBSopPlanDateLogDto> findSopPlanDateLog(Long serviceId) {
+        return this.baseMapper.findSopPlanDateLog(serviceId);
+    }
+}

+ 1 - 1
sop-business/src/main/java/com/qmth/sop/business/service/impl/TDFormWidgetServiceImpl.java

@@ -49,7 +49,7 @@ public class TDFormWidgetServiceImpl extends ServiceImpl<TDFormWidgetMapper, TDF
     @Override
     public List<FlowFormWidgetResult> flowWidgetQuery(TFCustomTypeEnum flowType, Integer formSetup) {
         QueryWrapper<TDFormWidget> tdFormWidgetQueryWrapper = new QueryWrapper<>();
-        tdFormWidgetQueryWrapper.lambda().eq(TDFormWidget::getFlowType, flowType).eq(TDFormWidget::getType, WidgetTypeEnum.FORM);
+        tdFormWidgetQueryWrapper.lambda().eq(TDFormWidget::getFlowType, flowType).eq(TDFormWidget::getType, WidgetTypeEnum.FORM).orderByAsc(TDFormWidget::getCreateTime);
         if (Objects.nonNull(formSetup)) {
             tdFormWidgetQueryWrapper.lambda().eq(TDFormWidget::getFormSetup, formSetup);
         }

+ 2 - 1
sop-business/src/main/java/com/qmth/sop/business/sync/FxxkApiUtils.java

@@ -87,7 +87,8 @@ public class FxxkApiUtils {
      * @return currentOpenUserId
      */
     public String findCurrentOpenUserId() {
-        final String mobile = "18903719928";
+        // 获取openUserId的手机号
+        final String mobile = "###";
         String postUrl = sysConfigService.findByConfigKey(SystemConstant.FXXK_USER_BY_MOBILE_URL).getConfigValue();
 
         try {

+ 1 - 1
sop-business/src/main/java/com/qmth/sop/business/sync/RtzfApiUtils.java

@@ -64,7 +64,7 @@ public class RtzfApiUtils {
                     password = defaultPassword;
                     break;
                 case SSO_LOGIN:
-                    account = requestUser.getRealName();
+                    account = String.valueOf(requestUser.getId());
                     password = requestUser.getPassword();
                     break;
             }

+ 191 - 1
sop-business/src/main/resources/db/log/wangliang_update_log.sql

@@ -1989,4 +1989,194 @@ SET code='DATE', `type`='FORM', form_id='device_out_time', form_name='device_out
 WHERE id=145;
 UPDATE t_d_form_widget
 SET code='DEVICE_OUT_TABLE', `type`='FORM', form_id='device_out_table', form_name='device_out_table', title='设备出库表格', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=4, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
-WHERE id=146;
+WHERE id=146;
+
+--2023.11.20update
+INSERT INTO t_d_form_widget
+(id, code, `type`, form_id, form_name, title, input_type, required, readable, writable, visable, `scale`, `length`, binding, data_grid, tips, format, span, sub_title, `options`, flow_type, form_setup, handle, form_group, role_type, create_id, create_time)
+VALUES(189, 'DATE', 'FORM', 'service_finish_plan_begin_date', 'service_finish_plan_begin_date', '现场服务完成进场计划时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'OFFICE_SOP_FLOW', 1, 1, NULL, NULL, 1, 9);
+INSERT INTO t_d_form_widget
+(id, code, `type`, form_id, form_name, title, input_type, required, readable, writable, visable, `scale`, `length`, binding, data_grid, tips, format, span, sub_title, `options`, flow_type, form_setup, handle, form_group, role_type, create_id, create_time)
+VALUES(190, 'DATE', 'FORM', 'service_finish_plan_begin_date', 'service_finish_plan_begin_date', '现场服务完成进场计划时间', 'LONG', 1, 0, 1, 1, NULL, NULL, NULL, NULL, NULL, 'yyyy-MM-dd', 6, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 1, NULL, NULL, 1, 11);
+
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='project_basic_info_title', form_name='project_basic_info_title', title='项目基本信息', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=18;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='course_count', form_name='course_count', title='科目数量', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=2
+WHERE id=19;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='exam_student_course_count', form_name='exam_student_course_count', title='考生科次', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=3
+WHERE id=20;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='scan_count', form_name='scan_count', title='扫描仪数量(台)', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=4
+WHERE id=21;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='week_people_day', form_name='week_people_day', title='现场标准服务周期(人天)', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=5
+WHERE id=22;
+UPDATE t_d_form_widget
+SET code='DATE', `type`='FORM', form_id='exam_student_Internal_date', form_name='exam_student_Internal_date', title='考生数据内部交接时间', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format='yyyy-MM-dd', span=6, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=6
+WHERE id=23;
+UPDATE t_d_form_widget
+SET code='DATE', `type`='FORM', form_id='exam_plan_date', form_name='exam_plan_date', title='考试时间安排表获取时间', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format='yyyy-MM-dd', span=6, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=7
+WHERE id=24;
+UPDATE t_d_form_widget
+SET code='DATE', `type`='FORM', form_id='project_key_info_date', form_name='project_key_info_date', title='项目关键信息提交截止时间', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format='yyyy-MM-dd', span=6, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=1, form_group=NULL, role_type=NULL, create_id=1, create_time=8
+WHERE id=25;
+UPDATE t_d_form_widget
+SET code='DATE', `type`='FORM', form_id='service_finish_plan_begin_date', form_name='service_finish_plan_begin_date', title='现场服务完成进场计划时间', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format='yyyy-MM-dd', span=6, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=1, form_group=NULL, role_type=NULL, create_id=1, create_time=9
+WHERE id=189;
+UPDATE t_d_form_widget
+SET code='DATE', `type`='FORM', form_id='service_finish_plan_date', form_name='service_finish_plan_date', title='现场服务完成撤场计划时间', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format='yyyy-MM-dd', span=6, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=1, form_group=NULL, role_type=NULL, create_id=1, create_time=10
+WHERE id=26;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='project_people_plan_title', form_name='project_people_plan_title', title='项目人员安排及风险预估', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=11
+WHERE id=27;
+UPDATE t_d_form_widget
+SET code='SINGLE_SELECT', `type`='FORM', form_id='region_user_id', form_name='region_user_id', title='区域协调人', input_type='STRING', required=1, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=4, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=12
+WHERE id=28;
+UPDATE t_d_form_widget
+SET code='SINGLE_SELECT', `type`='FORM', form_id='engineer_user_id', form_name='engineer_user_id', title='实施工程师', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=4, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=13
+WHERE id=29;
+UPDATE t_d_form_widget
+SET code='MULTIPLE_SELECT', `type`='FORM', form_id='assistant_engineer_user_id', form_name='assistant_engineer_user_id', title='助理实施工程师', input_type='ARRAY', required=0, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=4, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=14
+WHERE id=30;
+UPDATE t_d_form_widget
+SET code='ONLY_TITLE', `type`='FORM', form_id='project_rish_title', form_name='project_rish_title', title='项目风险预估(仅供参考)', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=15
+WHERE id=31;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='delay_rish_cb', form_name='delay_rish_cb', title='延期风险', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"LOW","label":"低"},{"value":"MIDDLE","label":"中"},{"value":"HIGH","label":"高"}]', flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=16
+WHERE id=32;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='engineer_rish_cb', form_name='engineer_rish_cb', title='实施难度', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"LOW","label":"低"},{"value":"MIDDLE","label":"中"},{"value":"HIGH","label":"高"}]', flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=17
+WHERE id=33;
+UPDATE t_d_form_widget
+SET code='TEXTAREA', `type`='FORM', form_id='other_remark', form_name='other_remark', title='其它备注(建议关注的其它方面)', input_type='STRING', required=0, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=18
+WHERE id=34;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='project_contacts_title', form_name='project_contacts_title', title='项目联系人', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=19
+WHERE id=35;
+UPDATE t_d_form_widget
+SET code='TABLE', `type`='FORM', form_id='project_contacts_table', form_name='project_contacts_table', title='项目联系人表格', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=20
+WHERE id=36;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_college', form_name='school_college', title='项目联系人表格_机构输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=21
+WHERE id=37;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_name', form_name='school_name', title='项目联系人表格_姓名输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=22
+WHERE id=38;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_job', form_name='school_job', title='项目联系人表格_职务输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=23
+WHERE id=39;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_tel', form_name='school_tel', title='项目联系人表格_电话输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='OFFICE_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=24
+WHERE id=40;
+
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='project_basic_info_title', form_name='project_basic_info_title', title='项目基本信息', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=92;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='course_count', form_name='course_count', title='科目数量', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=2
+WHERE id=93;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='exam_student_course_count', form_name='exam_student_course_count', title='考生科次', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=3
+WHERE id=94;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='bar_code_paper_count', form_name='bar_code_paper_count', title='条码标准张数', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=6, sub_title=NULL, `options`='[{"value":"3","label":"3张"},{"value":"4","label":"4张"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=4
+WHERE id=95;
+UPDATE t_d_form_widget
+SET code='RADIO_WITH_INPUT', `type`='FORM', form_id='bar_code_paste_way', form_name='bar_code_paste_way', title='条码粘贴方式', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=6, sub_title=NULL, `options`='[{"value":"EXAM_STUDENT","label":"考生自贴/数码印刷"},{"value":"PAPER","label":"回卷后粘贴"},{"value":"OTHER","label":"其它"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=5
+WHERE id=96;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='has_objective_card', form_name='has_objective_card', title='有无客观题卡', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=6, sub_title=NULL, `options`='[{"value":"HAVA","label":"有"},{"value":"NOT_HAVA","label":"无"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=6
+WHERE id=97;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='scan_count', form_name='scan_count', title='扫描仪数量(台)', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=7
+WHERE id=98;
+UPDATE t_d_form_widget
+SET code='DATE', `type`='FORM', form_id='exam_student_Internal_date', form_name='exam_student_Internal_date', title='考生数据内部交接时间', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format='yyyy-MM-dd', span=6, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=8
+WHERE id=99;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='week_people_day', form_name='week_people_day', title='现场标准服务周期(人天)', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=9
+WHERE id=100;
+UPDATE t_d_form_widget
+SET code='DATE', `type`='FORM', form_id='project_key_info_date', form_name='project_key_info_date', title='项目关键信息提交截止时间', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format='yyyy-MM-dd', span=6, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=1, form_group=NULL, role_type=NULL, create_id=1, create_time=10
+WHERE id=101;
+UPDATE t_d_form_widget
+SET code='DATE', `type`='FORM', form_id='service_finish_plan_begin_date', form_name='service_finish_plan_begin_date', title='现场服务完成进场计划时间', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format='yyyy-MM-dd', span=6, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=1, form_group=NULL, role_type=NULL, create_id=1, create_time=11
+WHERE id=190;
+UPDATE t_d_form_widget
+SET code='DATE', `type`='FORM', form_id='service_finish_plan_date', form_name='service_finish_plan_date', title='现场服务完成撤场计划时间', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format='yyyy-MM-dd', span=6, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=1, form_group=NULL, role_type=NULL, create_id=1, create_time=12
+WHERE id=102;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='project_people_plan_title', form_name='project_people_plan_title', title='项目人员安排及风险预估', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=13
+WHERE id=103;
+UPDATE t_d_form_widget
+SET code='SINGLE_SELECT', `type`='FORM', form_id='region_user_id', form_name='region_user_id', title='区域协调人', input_type='STRING', required=1, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=4, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=14
+WHERE id=104;
+UPDATE t_d_form_widget
+SET code='SINGLE_SELECT', `type`='FORM', form_id='engineer_user_id', form_name='engineer_user_id', title='实施工程师', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=4, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=15
+WHERE id=105;
+UPDATE t_d_form_widget
+SET code='MULTIPLE_SELECT', `type`='FORM', form_id='assistant_engineer_user_id', form_name='assistant_engineer_user_id', title='助理实施工程师', input_type='ARRAY', required=0, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=4, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=16
+WHERE id=106;
+UPDATE t_d_form_widget
+SET code='ONLY_TITLE', `type`='FORM', form_id='project_rish_title', form_name='project_rish_title', title='项目风险预估(仅供参考)', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=17
+WHERE id=107;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='delay_rish_cb', form_name='delay_rish_cb', title='延期风险', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"LOW","label":"低"},{"value":"MIDDLE","label":"中"},{"value":"HIGH","label":"高"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=18
+WHERE id=108;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='engineer_rish_cb', form_name='engineer_rish_cb', title='实施难度', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"LOW","label":"低"},{"value":"MIDDLE","label":"中"},{"value":"HIGH","label":"高"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=19
+WHERE id=109;
+UPDATE t_d_form_widget
+SET code='TEXTAREA', `type`='FORM', form_id='other_remark', form_name='other_remark', title='其它备注(建议关注的其它方面)', input_type='STRING', required=0, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=20
+WHERE id=110;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='project_contacts_title', form_name='project_contacts_title', title='项目联系人', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=21
+WHERE id=111;
+UPDATE t_d_form_widget
+SET code='TABLE', `type`='FORM', form_id='project_contacts_table', form_name='project_contacts_table', title='项目联系人表格', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=22
+WHERE id=112;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_college', form_name='school_college', title='项目联系人表格_机构输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=23
+WHERE id=113;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_name', form_name='school_name', title='项目联系人表格_姓名输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=24
+WHERE id=114;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_job', form_name='school_job', title='项目联系人表格_职务输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=25
+WHERE id=115;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_tel', form_name='school_tel', title='项目联系人表格_电话输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=26
+WHERE id=116;
+
+DROP TABLE IF EXISTS `t_b_sop_plan_date_log`;
+CREATE TABLE `t_b_sop_plan_date_log` (
+                                         `id` bigint NOT NULL COMMENT '主键',
+                                         `sop_id` bigint DEFAULT NULL COMMENT 'sopId',
+                                         `flow_id` bigint NOT NULL COMMENT '流程id',
+                                         `begin_time` bigint NOT NULL COMMENT '计划开始时间',
+                                         `end_time` bigint NOT NULL COMMENT '计划结束时间',
+                                         `create_id` bigint DEFAULT NULL COMMENT '创建人id',
+                                         `create_time` bigint DEFAULT NULL COMMENT '创建时间',
+                                         `update_id` bigint DEFAULT NULL COMMENT '更新人id',
+                                         `update_time` bigint DEFAULT NULL COMMENT '更新时间',
+                                         PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='sop进程计划时间日志表';
+
+--2023.11.22update
+UPDATE sys_privilege
+SET name='批量导入', url='BatchImport', `type`='BUTTON', parent_id=5, `sequence`=6, property='AUTH', related='1047', enable=1, default_auth=0, front_display=1
+WHERE id=1050;
+
+INSERT INTO sys_device_brand
+(id, brand, create_id, create_time, update_id, update_time)
+VALUES(4, '华高', NULL, NULL, NULL, NULL);
+
+INSERT INTO sys_device_model
+(id, brand_id, model, create_id, create_time, update_id, update_time)
+VALUES(5, 4, '1080', NULL, NULL, NULL, NULL);
+INSERT INTO sys_device_model
+(id, brand_id, model, create_id, create_time, update_id, update_time)
+VALUES(6, 4, '5100', NULL, NULL, NULL, NULL);

+ 19 - 0
sop-business/src/main/resources/mapper/TBSopPlanDateLogMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.sop.business.mapper.TBSopPlanDateLogMapper">
+
+    <select id="findSopPlanDateLog" resultType="com.qmth.sop.business.bean.dto.TBSopPlanDateLogDto">
+        select *,tffa.status as status,tffa.update_time as flowUpdateTime from t_b_sop_plan_date_log tbspdl
+               left join t_b_sop_info tbsi on tbsi.id = tbspdl.sop_id
+               left join t_f_custom_flow_entity tfcfe on tfcfe.code = tbsi.sop_no
+               left join t_b_service tbs on tbs.id = tbsi.service_id
+               left join t_f_flow_approve tffa on tffa.flow_id = tfcfe.flow_id
+        <where> 1 = 1
+                and tbsi.status = 'START'
+            <if test="serviceId != null and serviceId != ''">
+                and tbs.id = #{serviceId}
+            </if>
+        </where>
+            order by tbspdl.sop_id,tbspdl.create_time
+    </select>
+</mapper>

+ 1 - 1
sop-business/src/main/resources/mapper/TBUserArchivesAllocationMapper.xml

@@ -243,7 +243,7 @@
             sr.type AS type,
             tbua.id AS archivesId,
             tbua.name AS archiverName,
-            tbuas.id AS supplierId,
+            tbuas.supplier_id AS supplierId,
             ss.name AS supplierName,
             tbua.province AS archivesProvince,
             tbua.city AS archivesCity,

+ 3 - 0
sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java

@@ -209,6 +209,7 @@ public class SystemConstant {
     public static final String FXXK_APP_AUTH_URL = "fxxk.app.auth.url";
     public static final String FXXK_USER_BY_MOBILE_URL = "fxxk.user.by.mobile.url";
     public static final String FXXK_CUSTOM_QUERY_URL = "fxxk.custom.query.url";
+    public static final String RTZF_OSS_LOGIN_URL = "rtzf.oss.login.url";
 
     /**
      * api前缀
@@ -250,6 +251,7 @@ public class SystemConstant {
     public static final String PREFIX_URL_DEVICE_IN_OUT = "/admin/device/in/out";
     public static final String PREFIX_URL_SOP = "/admin/sop";
     public static final String PREFIX_URL_FXXK = "/open/fxxk";
+    public static final String PREFIX_URL_SSO = "/sso";
 
     /**
      * 缓存配置
@@ -326,6 +328,7 @@ public class SystemConstant {
     public static final String FLOW_ENTITY = "tfCustomFlowEntity";
     public static final String FLOW_SYS_USER = "sysUser";
     public static final String CRM_INFO = "crmInfo";
+    public static final String SOP_ID = "sopId";
 
     /**
      * 锁

+ 2 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/ProcessLimitedEnum.java

@@ -23,6 +23,8 @@ public enum ProcessLimitedEnum {
 
     SERVICE_FINISH_PLAN_DATE("service_finish_plan_date", "现场服务完成撤场计划时间"),
 
+    SERVICE_FINISH_PLAN_BEGIN_DATE("service_finish_plan_begin_date", "现场服务完成进场计划时间"),
+
     ENV_DEPLOYMENT_TIME("env_deployment_time", "环境部署时间");
 
     private String key;

+ 1 - 1
sop-task/src/main/resources/application.properties

@@ -81,7 +81,7 @@ face.verify.baiduLocalUrlPrefix=http://192.168.20.253
 fxxk.app.id=FSAID_131c93b
 fxxk.app.secrete=5d590b10cca24ce5a51fc716564aac9f
 fxxk.permanent.code=4EFBD3FCF655B4D934C163EA5ECE638D
-fxxk.curren.open.user.id=FSUID_AE9192D544DCF7924E88E9EA800641C7
+fxxk.curren.open.user.id=FSUID_71F2ABE69AAC50925BE7B3CA36E2EBEC
 fxxk.api.name.crm=object_zS8me__c
 fxxk.api.name.crm.detail=object_bs553__c