haogh 11 months ago
commit
14a64d353f
100 changed files with 10051 additions and 0 deletions
  1. 53 0
      .gitignore
  2. 8 0
      README.md
  3. 272 0
      sql/sql.sql
  4. 4 0
      src/main/java/app.properties
  5. 16 0
      src/main/java/cn/hmsoft/mr/constants/ArtParamType.java
  6. 10 0
      src/main/java/cn/hmsoft/mr/constants/ArtStatus.java
  7. 107 0
      src/main/java/cn/hmsoft/mr/constants/FrameResIdConst.java
  8. 18 0
      src/main/java/cn/hmsoft/mr/constants/GobalBusinessType.java
  9. 174 0
      src/main/java/cn/hmsoft/mr/constants/MRConst.java
  10. 125 0
      src/main/java/cn/hmsoft/mr/constants/MROptrLogType.java
  11. 20 0
      src/main/java/cn/hmsoft/mr/constants/StdCertType.java
  12. 65 0
      src/main/java/cn/hmsoft/mr/constants/StdConst.java
  13. 35 0
      src/main/java/cn/hmsoft/mr/constants/StdResType.java
  14. 186 0
      src/main/java/cn/hmsoft/mr/control/cf/CfAspectControl.java
  15. 103 0
      src/main/java/cn/hmsoft/mr/control/cf/CfAspectOptrControl.java
  16. 106 0
      src/main/java/cn/hmsoft/mr/control/cf/CfAuthTagControl.java
  17. 151 0
      src/main/java/cn/hmsoft/mr/control/cf/CfBatchControl.java
  18. 124 0
      src/main/java/cn/hmsoft/mr/control/cf/CfInitialOptrControl.java
  19. 78 0
      src/main/java/cn/hmsoft/mr/control/cf/CfMaterialCategoryControl.java
  20. 191 0
      src/main/java/cn/hmsoft/mr/control/cf/CfMaterialDefControl.java
  21. 139 0
      src/main/java/cn/hmsoft/mr/control/cf/CfMaterialRuleControl.java
  22. 55 0
      src/main/java/cn/hmsoft/mr/control/cf/CfMaterialTextAttrControl.java
  23. 119 0
      src/main/java/cn/hmsoft/mr/control/cf/CfPatternControl.java
  24. 61 0
      src/main/java/cn/hmsoft/mr/control/cf/CfPromiseInfoControl.java
  25. 139 0
      src/main/java/cn/hmsoft/mr/control/cf/CfSchoolControl.java
  26. 134 0
      src/main/java/cn/hmsoft/mr/control/cf/CfSubjectControl.java
  27. 73 0
      src/main/java/cn/hmsoft/mr/control/frame/FameWeixinSpecialControl.java
  28. 58 0
      src/main/java/cn/hmsoft/mr/control/frame/FrameOptrLocalControl.java
  29. 70 0
      src/main/java/cn/hmsoft/mr/control/full/FinalFullScreenControl.java
  30. 153 0
      src/main/java/cn/hmsoft/mr/control/full/InitialFullScreenControl.java
  31. 781 0
      src/main/java/cn/hmsoft/mr/control/imp/FinalScoreControl.java
  32. 94 0
      src/main/java/cn/hmsoft/mr/control/imp/ImpDataAdmitControl.java
  33. 121 0
      src/main/java/cn/hmsoft/mr/control/imp/ImpDataControl.java
  34. 167 0
      src/main/java/cn/hmsoft/mr/control/imp/ImpDataScoreControl.java
  35. 99 0
      src/main/java/cn/hmsoft/mr/control/ly/LyGroupControl.java
  36. 136 0
      src/main/java/cn/hmsoft/mr/control/ly/LyRoomControl.java
  37. 462 0
      src/main/java/cn/hmsoft/mr/control/review/InitialReviewControl.java
  38. 609 0
      src/main/java/cn/hmsoft/mr/control/review/ProfesReviewControl.java
  39. 99 0
      src/main/java/cn/hmsoft/mr/control/review/ReCheckControl.java
  40. 66 0
      src/main/java/cn/hmsoft/mr/control/review/ReviewLogControl.java
  41. 60 0
      src/main/java/cn/hmsoft/mr/control/review/ReviewPromiseControl.java
  42. 135 0
      src/main/java/cn/hmsoft/mr/control/std/StdApplyDetailControl.java
  43. 15 0
      src/main/java/cn/hmsoft/mr/control/std/StdEnrolControl.java
  44. 103 0
      src/main/java/cn/hmsoft/mr/control/std/StdLayoutControl.java
  45. 76 0
      src/main/java/cn/hmsoft/mr/control/std/StdRegControl.java
  46. 712 0
      src/main/java/cn/hmsoft/mr/control/std/StdTicketControl.java
  47. 35 0
      src/main/java/cn/hmsoft/mr/control/wx/WxTemplateLogControl.java
  48. 11 0
      src/main/java/cn/hmsoft/mr/data/dao/ArtDao.java
  49. 85 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfAspectDao.java
  50. 49 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfAspectOptrDao.java
  51. 30 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfAuthTagDao.java
  52. 41 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfBatchDao.java
  53. 31 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfEnrolParamDao.java
  54. 73 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfInitialOptrDao.java
  55. 30 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfMaterialCategoryDao.java
  56. 55 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfMaterialDefDao.java
  57. 40 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfMaterialRuleDao.java
  58. 41 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfMaterialTextAttrDao.java
  59. 26 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfPatternDao.java
  60. 23 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfPromiseInfoDao.java
  61. 29 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfSchoolDao.java
  62. 77 0
      src/main/java/cn/hmsoft/mr/data/dao/cf/CfSubjectDao.java
  63. 16 0
      src/main/java/cn/hmsoft/mr/data/dao/imp/FinalScoreDao.java
  64. 49 0
      src/main/java/cn/hmsoft/mr/data/dao/imp/ImpDataAdmitDao.java
  65. 33 0
      src/main/java/cn/hmsoft/mr/data/dao/imp/ImpDataDao.java
  66. 44 0
      src/main/java/cn/hmsoft/mr/data/dao/imp/ImpDataScoreDao.java
  67. 46 0
      src/main/java/cn/hmsoft/mr/data/dao/ly/LyGroupDao.java
  68. 58 0
      src/main/java/cn/hmsoft/mr/data/dao/ly/LyRoomDao.java
  69. 72 0
      src/main/java/cn/hmsoft/mr/data/dao/review/ReviewLogDao.java
  70. 11 0
      src/main/java/cn/hmsoft/mr/data/dao/review/ReviewPromiseDao.java
  71. 421 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdApplyDetailDao.java
  72. 47 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdApplyDetailTextDao.java
  73. 259 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdApplyMainDao.java
  74. 16 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdEnrolDao.java
  75. 55 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdLayoutDao.java
  76. 56 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdLogDao.java
  77. 67 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdRegDao.java
  78. 11 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdScoreDao.java
  79. 45 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdTicketDao.java
  80. 38 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdUploadDao.java
  81. 34 0
      src/main/java/cn/hmsoft/mr/data/dao/std/StdWeixinDao.java
  82. 39 0
      src/main/java/cn/hmsoft/mr/data/dao/wx/WxTemplateLog2Dao.java
  83. 15 0
      src/main/java/cn/hmsoft/mr/data/model/Art.java
  84. 130 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfAspect.java
  85. 95 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfAspectOptr.java
  86. 47 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfAuthTag.java
  87. 286 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfBatch.java
  88. 83 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfEnrolParam.java
  89. 63 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfInitialOptr.java
  90. 26 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfInitialOptrDetail.java
  91. 26 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfInitialReOptrDetail.java
  92. 48 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfMajor.java
  93. 48 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialCategory.java
  94. 146 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialDef.java
  95. 42 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialFeedBack.java
  96. 63 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialRule.java
  97. 46 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialRuleDetail.java
  98. 89 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialTextAttr.java
  99. 69 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfPattern.java
  100. 54 0
      src/main/java/cn/hmsoft/mr/data/model/cf/CfPromiseInfo.java

+ 53 - 0
.gitignore

@@ -0,0 +1,53 @@
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+*.class
+*.log
+
+
+### Eclipse & STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+/logs/
+/log/
+/data/
+
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+
+### VS Code ###
+.vscode
+node_modules
+package-lock.json
+yarn.lock
+
+
+### Package Files ###
+*.zip
+*.war
+*.ear
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+target/
+
+.flattened-pom.xml
+.DS_Store
+

+ 8 - 0
README.md

@@ -0,0 +1,8 @@
+中国艺术研究院材料评审后端+考生微信公众号前端
+
+数据库: mysql8.0
+
+考生前端:angular1.x
+
+附件: oss存储
+

+ 272 - 0
sql/sql.sql

@@ -0,0 +1,272 @@
+INSERT INTO `frame_dict` (`DICT_NAME`, `DICT_VALUE`, `DICT_TEXT`, `DICT_ORDER`) VALUES ('TextFormart', 'text', '文本', 1);
+INSERT INTO `frame_dict` (`DICT_NAME`, `DICT_VALUE`, `DICT_TEXT`, `DICT_ORDER`) VALUES ('TextFormart', 'date', '日期', 2);
+INSERT INTO `frame_dict` (`DICT_NAME`, `DICT_VALUE`, `DICT_TEXT`, `DICT_ORDER`) VALUES ('TextFormart', 'number', '数字', 3);
+CREATE TABLE `cf_material_text_attr` (
+                                         `attr_id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
+                                         `material_def_id` int DEFAULT NULL COMMENT '定义ID',
+                                         `attr_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文字标题',
+                                         `attr_requrid` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否必填',
+                                         `attr_formart` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文字格式',
+                                         PRIMARY KEY (`attr_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+
+CREATE TABLE `std_apply_detail_text` (
+                                         `detail_id` int NOT NULL COMMENT '申请ID',
+                                         `text_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID',
+                                         `attr_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文字标题',
+                                         `attr_text` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '文字内容',
+                                         `attr_id` int DEFAULT NULL,
+                                         PRIMARY KEY (`text_id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=19108 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='考生材料申请表';
+
+INSERT INTO `frame_dict` (`DICT_NAME`, `DICT_VALUE`, `DICT_TEXT`, `DICT_ORDER`) VALUES ('DeptType', 'SecondLevel', '二级学院', 5);
+
+ALTER TABLE `cf_aspect`
+    ADD COLUMN `dept_id` int NULL COMMENT '二级学院ID' AFTER `school_id`;
+
+
+--2023.7.11
+CREATE TABLE `cf_subject` (
+                              `SUBJECT_ID` int NOT NULL AUTO_INCREMENT COMMENT '科目编号(内部编号)',
+                              `school_id` int DEFAULT NULL COMMENT '关联编号',
+                              `batch_id` int DEFAULT NULL COMMENT '批次ID',
+                              `SUBJECT_NAME` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '科目名称',
+                              `SUBJECT_CODE` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '科目编号',
+                              `exam_start_time` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '考试开始时间',
+                              `exam_end_time` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '考试结束时间',
+                              `aspect_id` int DEFAULT NULL COMMENT '科目的管理单位',
+                              PRIMARY KEY (`SUBJECT_ID`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='配置表-科目信息配置表';
+
+CREATE TABLE `ly_room` (
+                           `room_id` int NOT NULL AUTO_INCREMENT COMMENT '考场ID',
+                           `school_id` int DEFAULT NULL COMMENT '学校ID',
+                           `batch_id` int DEFAULT NULL COMMENT '批次ID',
+                           `room_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '考场编号',
+                           `room_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '教室编号',
+                           `room_addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '考试地点',
+                           `room_capacity` int DEFAULT NULL COMMENT '考场容量',
+                           `layout_num` int DEFAULT NULL COMMENT '已编排',
+                           `mix_max` int DEFAULT NULL COMMENT '最大混编数',
+                           PRIMARY KEY (`room_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+
+INSERT INTO `frame_res` (`RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC`)
+VALUES (20801, '考试科目', NULL, '/ly/room/page', 20000, 1, 'Page', '', 'Active', 20801, NULL);
+INSERT INTO `frame_res` ( `RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC` )
+VALUES
+    ( 20901, '考场配置', NULL, '/ly/room/page', 20000, 1, 'Page', '', 'Active', 20901, NULL );
+INSERT INTO `frame_res` ( `RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC` )
+VALUES
+    ( 30601, '考试编排', NULL, '/ly/layout/page', 30000, 1, 'Page', '', 'Active', 30601, NULL );
+
+
+
+ALTER TABLE `cf_batch`
+    ADD COLUMN `dept_id` int NULL COMMENT '二级学院ID' AFTER `school_id`;
+
+---2023.8.16 dhshu
+ALTER TABLE `cf_aspect`
+    ADD COLUMN `is_practice` int NULL COMMENT '理论或实践。0,1' AFTER `initial_pass_cnt`;
+ALTER TABLE `cf_batch`
+    ADD COLUMN `intial_show_start` datetime NULL DEFAULT NULL COMMENT '初审结果开始时间' AFTER `intial_review_end`,
+ADD COLUMN `intial_show_end` datetime NULL DEFAULT NULL COMMENT '初审结果结束时间' AFTER `intial_show_start`,
+DROP PRIMARY KEY,
+ADD PRIMARY KEY (`batch_id`) USING BTREE;
+-----2023.8.17 dhshu
+ALTER TABLE `std_upload`
+    MODIFY COLUMN `file_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'jpg,mp4,pdf,png' AFTER `detail_id`;
+ALTER TABLE `cf_subject`
+    ADD COLUMN `subject_type` varchar(255) NULL COMMENT '科目类型' AFTER `batch_id`;
+ALTER TABLE `ly_room`
+DROP COLUMN `mix_max`,
+ADD COLUMN `is_provence` varchar(255) NULL COMMENT '省内考场' AFTER `layout_num`;
+
+CREATE TABLE `ly_group` (
+                            `group_id` int NOT NULL AUTO_INCREMENT COMMENT '分组ID',
+                            `group_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
+                            `school_id` int DEFAULT NULL COMMENT '学校ID',
+                            `batch_id` int DEFAULT NULL COMMENT '批次ID',
+                            `is_practice` int DEFAULT NULL COMMENT '理论或实践。0,1',
+                            `total` int DEFAULT NULL COMMENT '准考人数',
+                            `provence` int DEFAULT NULL COMMENT '省内',
+                            `status` int DEFAULT NULL COMMENT '编排状态',
+                            PRIMARY KEY (`group_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='编排分组设置';
+
+ALTER TABLE `std_reg`
+    ADD COLUMN `is_provence` int NULL COMMENT '是否省内' AFTER `cert_id`;
+INSERT INTO `frame_res` ( `RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC` )
+VALUES
+    ( 20503, '初审账号类型增加', NULL, '', 20500, 1, 'Fun', '', 'Active', 20502, NULL );
+INSERT INTO `frame_res` ( `RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC` )
+VALUES
+    ( 20504, '初审账号类型修改', NULL, '', 20500, 1, 'Fun', '', 'Active', 20502, NULL );
+INSERT INTO `frame_res` ( `RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC` )
+VALUES
+    ( 20505, '初审账号类型删除', NULL, '', 20500, 1, 'Fun', '', 'Active', 20502, NULL );
+
+ALTER TABLE `ly_room`
+    ADD COLUMN `group_id` int NULL COMMENT 'group_id' AFTER `batch_id`;
+ALTER TABLE `cf_subject`
+    ADD COLUMN `group_id` int NULL COMMENT 'group_id' AFTER `batch_id`;
+
+-- 2023.9.4
+UPDATE `frame_res` SET `RES_NAME` = '考试编排查询', `RES_ALIAS` = NULL, `RES_URL` = '/ly/layout/page', `RES_PID` = 30000, `RES_LEVEL` = 1, `RES_TYPE` = 'Page', `RES_CSS` = '', `RES_STATUS` = 'Active', `RES_ORDER` = 30601, `RES_DESC` = NULL WHERE `RES_ID` = 30601;
+INSERT INTO `frame_res` ( `RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC` )
+VALUES
+    ( 30701, '考试分组编排', NULL, '/ly/group/page', 30000, 1, 'Page', '', 'Active', 30701, NULL );
+ALTER TABLE `cf_aspect`
+    ADD COLUMN `order` int NULL COMMENT '编排排序' AFTER `batch_id`;
+ALTER TABLE  `ly_group`
+    ADD COLUMN `aspect_order` varchar(255) NULL COMMENT '是否按专业排序' AFTER `batch_id`;
+ALTER TABLE `ly_group`
+    ADD COLUMN `ly_order` int NULL COMMENT '编排顺序' AFTER `batch_id`;
+ALTER TABLE `ly_group`
+    ADD COLUMN `provence_flag` varchar(255) NULL COMMENT '是否省内外考场' AFTER `batch_id`;
+ALTER TABLE `cf_subject`
+DROP COLUMN `aspect_id`;
+CREATE TABLE `ly_subject` (
+                              `SUBJECT_ID` int NOT NULL COMMENT '科目ID',
+                              `enrol_id` int NOT NULL COMMENT '报考ID',
+                              UNIQUE KEY `uni` (`SUBJECT_ID`,`enrol_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='报考科目表';
+
+
+--20239.21
+INSERT INTO `frame_res` ( `RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC` )
+VALUES
+    ( 20405, '专业导入', NULL, '', 20400, 1, 'Fun', '', 'Active', 20405, NULL );
+ALTER TABLE `cf_aspect`
+    CHANGE COLUMN `order` `ly_order` int NULL DEFAULT NULL COMMENT '编排排序' AFTER `batch_id`;
+CREATE TABLE `cf_subject_aspect` (
+                                     `SUBJECT_ID` int NOT NULL COMMENT '科目ID',
+                                     `aspect_id` int DEFAULT NULL COMMENT '方向ID',
+                                     PRIMARY KEY (`SUBJECT_ID`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='配置表-科目方向配置表';
+INSERT INTO `frame_res` ( `RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC` )
+VALUES
+    ( 50900, '资格审核复查', '资格审核复查', '/review/recheck/page', 50000, 2, 'Page', '', 'Active', 50900, NULL );
+CREATE TABLE `cf_initial_re_optr_detail` (
+                                             `main_id` int DEFAULT NULL COMMENT '关联主记录ID',
+                                             `optr_id` int DEFAULT NULL COMMENT '账号ID'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='资格复审老师账号明细';
+ALTER TABLE `std_apply_main`
+    ADD COLUMN `initial_review_re_optr` int NULL DEFAULT NULL COMMENT '资格复审老师ID' AFTER `initial_review_optr`;
+ALTER TABLE `cf_initial_optr`
+    ADD COLUMN `re_optr_cnt` tinyint NULL DEFAULT NULL COMMENT '账号数量' AFTER `optr_cnt`;
+
+--20231213
+ALTER TABLE `std_apply_main`
+    ADD COLUMN `real_initial_review_optr` int NULL DEFAULT NULL COMMENT '实际初审评审老师ID' AFTER `re_check_time`;
+ALTER TABLE `std_apply_detail`
+    ADD COLUMN `real_initial_review_optr` int NULL DEFAULT NULL COMMENT '实际初审评审老师ID' AFTER `back_status`;
+
+ALTER TABLE `frame_optr`
+    ADD COLUMN `modify_time` datetime NULL COMMENT '修改时间' AFTER `CREATE_TIME`;
+INSERT INTO `frame_res` (`RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC`) VALUES (998, '登陆修改用户名', '登陆修改用户名', NULL, 1030, 3, 'Fun', NULL, 'Active', 1, NULL);
+
+ALTER TABLE `cf_batch`
+    ADD COLUMN `show_upload_start` datetime NULL COMMENT '上传显示时间' AFTER `score_check_public_end`,
+ADD COLUMN `show_upload_end` datetime NULL COMMENT '上传显示时间' AFTER `show_upload_start`;
+
+INSERT INTO `frame_res` ( `RES_ID`, `RES_NAME`, `RES_ALIAS`, `RES_URL`, `RES_PID`, `RES_LEVEL`, `RES_TYPE`, `RES_CSS`, `RES_STATUS`, `RES_ORDER`, `RES_DESC` )
+VALUES
+    ( 2019, '发送失败消息', NULL, '/weixin/log/page', 2010, 3, 'Page', 'icon-docs text-dodgerblue', 'Active', 2019, NULL );
+
+
+
+INSERT INTO `mr2022`.`frame_report` (`REPORT_ID`, `REPORT_NAME`, `REPORT_ALIAS`, `RES_ID`, `REPORT_SQL`, `REPORT_PARAM`, `REPORT_PARAM_FLAG`, `REPORT_SUFFIX`, `INDEX_FLAG`, `REPORT_TYPE`, `WITH_THREAD`) VALUES (3, 'MsgFailExport', '消息失败考生名单', NULL, 'select l.*,r.std_name,r.cert_id,r.std_mobile from wx_template_log l left join std_reg r on r.weixin_id=l.OPEN_ID where l.result_status!=0', null, NULL, NULL, 'Active', NULL, NULL);
+
+
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('MsgFailExport', 1, 'std_name', 15, '考生姓名', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('MsgFailExport', 2, 'cert_id', 15, '身份证', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('MsgFailExport', 3, 'std_mobile', 15, '联系电话', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('MsgFailExport', 4, 'log_time', 15, '记录时间', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('MsgFailExport', 5, 'result_status', 15, '发送状态', 'java.lang.String', 'Active', NULL);INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('MsgFailExport', 6, 'result_msg', 15, '错误信息', 'java.lang.String', 'Active', NULL);INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('MsgFailExport', 7, 'template_msg', 15, '信息', 'java.lang.String', 'Active', NULL);
+
+
+INSERT INTO `mr2022`.`frame_report` (`REPORT_ID`, `REPORT_NAME`, `REPORT_ALIAS`, `RES_ID`, `REPORT_SQL`, `REPORT_PARAM`, `REPORT_PARAM_FLAG`, `REPORT_SUFFIX`, `INDEX_FLAG`, `REPORT_TYPE`, `WITH_THREAD`) VALUES (4, 'exportNoPassed', '不予准考考生名单', NULL, 'SELECT
+	m.std_id,
+	s.std_name,
+	m.review_level,
+	e.exam_id,
+	s.std_edu,
+	s.std_mobile,
+	e.enr_doct_name,
+	x.major_name,
+	f.aspect_name,
+	ro.optr_name real_optr_name
+FROM
+	std_apply_main m
+	LEFT JOIN frame_optr ro ON ro.optr_id = m.real_initial_review_optr
+	INNER JOIN cf_aspect f ON f.aspect_id = m.aspect_id
+	AND f.school_id = m.school_id
+	AND f.batch_id = m.batch_id
+	INNER JOIN cf_aspect_optr o ON o.aspect_id = f.aspect_id
+	AND o.school_id = f.school_id
+	AND o.batch_id = f.batch_id
+	INNER JOIN cf_major x ON x.major_id = f.major_id
+	AND f.school_id = f.school_id
+	AND x.batch_id = f.batch_id
+	LEFT JOIN std_reg s ON s.school_id = m.school_id
+	AND s.std_id = m.std_id
+	LEFT JOIN std_enrol e ON e.school_id = m.school_id
+	AND e.std_id = m.std_id
+	AND e.STATUS = \'Active\'
+WHERE
+	m.review_level > f.pass_cnt
+	AND m.school_id =?
+	AND m.batch_id =?
+ORDER BY
+	m.review_level', 'school_id\r\nbatch_id', NULL, NULL, 'Active', NULL, NULL);
+INSERT INTO `mr2022`.`frame_report` (`REPORT_ID`, `REPORT_NAME`, `REPORT_ALIAS`, `RES_ID`, `REPORT_SQL`, `REPORT_PARAM`, `REPORT_PARAM_FLAG`, `REPORT_SUFFIX`, `INDEX_FLAG`, `REPORT_TYPE`, `WITH_THREAD`) VALUES (5, 'exportPassed', '准考考生名单', NULL, 'SELECT
+	m.std_id,
+	s.std_name,
+	m.review_level,
+	e.exam_id,
+	s.std_edu,
+	s.std_mobile,
+	e.enr_doct_name,
+	x.major_name,
+	f.aspect_name,
+	ro.optr_name real_optr_name
+FROM
+	std_apply_main m
+	LEFT JOIN frame_optr ro ON ro.optr_id = m.real_initial_review_optr
+	INNER JOIN cf_aspect f ON f.aspect_id = m.aspect_id
+	AND f.school_id = m.school_id
+	AND f.batch_id = m.batch_id
+	INNER JOIN cf_aspect_optr o ON o.aspect_id = f.aspect_id
+	AND o.school_id = f.school_id
+	AND o.batch_id = f.batch_id
+	INNER JOIN cf_major x ON x.major_id = f.major_id
+	AND f.school_id = f.school_id
+	AND x.batch_id = f.batch_id
+	LEFT JOIN std_reg s ON s.school_id = m.school_id
+	AND s.std_id = m.std_id
+	LEFT JOIN std_enrol e ON e.school_id = m.school_id
+	AND e.std_id = m.std_id
+	AND e.STATUS = \'Active\'
+WHERE
+	 m.review_level<=f.pass_cnt
+	AND m.school_id =?
+	AND m.batch_id =?
+ORDER BY
+	m.review_level', 'school_id\r\nbatch_id', NULL, NULL, 'Active', NULL, NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportPassed', 7, 'aspect_name', 20, '专业方向名称', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportPassed', 3, 'dict_text', 50, '考生类型', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportPassed', 5, 'enr_doct_name', 20, '导师名称', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportPassed', 2, 'exam_id', 10, '报名号', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportPassed', 6, 'major_name', 20, '专业名称', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportPassed', 8, 'optr_name', 20, '初审老师', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportPassed', 4, 'std_mobile', 15, '联系电话', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportPassed', 1, 'std_name', 15, '考生姓名', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportNoPassed', 7, 'aspect_name', 20, '专业方向名称', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportNoPassed', 3, 'dict_text', 50, '考生类型', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportNoPassed', 5, 'enr_doct_name', 20, '导师名称', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportNoPassed', 2, 'exam_id', 10, '报名号', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportNoPassed', 6, 'major_name', 20, '专业名称', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportNoPassed', 8, 'optr_name', 20, '初审老师', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportNoPassed', 4, 'std_mobile', 15, '联系电话', 'java.lang.String', 'Active', NULL);
+INSERT INTO `mr2022`.`frame_report_detail` (`REPORT_NAME`, `FIELD_ORDER`, `FIELD_NAME`, `FIELD_LENGTH`, `FIELD_TEXT`, `FIELD_DATE_TYPE`, `FIELD_STATUS`, `DICT_NAME`) VALUES ('exportNoPassed', 1, 'std_name', 15, '考生姓名', 'java.lang.String', 'Active', NULL);

+ 4 - 0
src/main/java/app.properties

@@ -0,0 +1,4 @@
+AppDebug=false
+AppParamUtil=cn.hmsoft.mr.helper.ArtParamHelper
+AppListener=
+AppName=ArtEnrol

+ 16 - 0
src/main/java/cn/hmsoft/mr/constants/ArtParamType.java

@@ -0,0 +1,16 @@
+package cn.hmsoft.mr.constants;
+
+/****************
+ * 全局参数类型
+ * @author zxq
+ * @create 2019-08-21 23:07:46
+ * @version 2.0.0
+ * @email: revisit@126.com
+ * @Company: www.hmsoft.cn
+ */
+public class ArtParamType {
+
+	public final static String Gobal = "Gobal";
+	public final static String Enrol = "Enrol";
+	public final static String Exam = "Exam";
+}

+ 10 - 0
src/main/java/cn/hmsoft/mr/constants/ArtStatus.java

@@ -0,0 +1,10 @@
+package cn.hmsoft.mr.constants;
+
+/***********************
+ * 艺考状态
+ *
+ */
+public class ArtStatus {
+	public final static String Config = "Config";
+	public final static String Stop = "Stop";
+}

+ 107 - 0
src/main/java/cn/hmsoft/mr/constants/FrameResIdConst.java

@@ -0,0 +1,107 @@
+package cn.hmsoft.mr.constants;
+
+public class FrameResIdConst {
+
+	/**
+	 * 学校权限
+	 */
+	public static final int RES_SCHOOL_PAGE = 20101;
+	public static final int RES_SCHOOL_ADD = 20102;
+	public static final int RES_SCHOOL_EDIT = 20103;
+	public static final int RES_SCHOOL_DELETE = 20104;
+	
+	/**
+	 * 批次权限
+	 */
+	public static final int RES_BATCH_PAGE = 20201;
+	public static final int RES_BATCH_ADD = 20202;
+	public static final int RES_BATCH_EDIT = 20203;
+	public static final int RES_BATCH_DELETE = 20204;
+	
+	/**
+	 * 材料大类权限
+	 */
+	public static final int RES_CATEGROY_PAGE = 20301;
+	public static final int RES_CATEGROY_ADD = 20302;
+	public static final int RES_CATEGROY_EDIT = 20303;
+	public static final int RES_CATEGROY_DELETE = 20304;
+	
+	/**
+	 * 专业方向权限
+	 */
+	public static final int RES_ASPECT_PAGE = 20401;
+	public static final int RES_ASPECT_EDIT = 20402;
+	/**
+	 * 专业评审账号权限
+	 */
+	public static final int RES_ASPECT_OPTR_SET = 20403;
+	public static final int RES_ASPECT_OPTR_UPLOAD = 20404;
+	public static final int RES_ASPECT_UPLOAD = 20405;
+	
+	/**
+	 * 初审账号权限
+	 */
+	public static final int RES_INITAIL_OPTR_PAGE = 20501;
+	public static final int RES_INITAIL_OPTR_SET = 20502;
+	
+	/**
+	 * 模式管理
+	 */
+	public static final int RES_PATTERN_PAGE = 20601;
+	public static final int RES_PATTERN_ADD = 20602;
+	public static final int RES_PATTERN_EDIT = 20603;
+	public static final int RES_PATTERN_DELETE = 20604;
+	
+	/**
+	 * 审核标签管理
+	 */
+	public static final int RES_AUTHTAG_PAGE = 20701;
+	public static final int RES_AUTHTAG_ADD = 20702;
+	public static final int RES_AUTHTAG_EDIT = 20703;
+	public static final int RES_AUTHTAG_DELETE = 20704;
+	
+	/**
+	 * 材料定义权限
+	 */
+	public static final int RES_MATERIAL_DEF_PAGE = 40101;
+	public static final int RES_MATERIAL_DEF_ADD = 40102;
+	public static final int RES_MATERIAL_DEF_EDIT = 40103;
+	public static final int RES_MATERIAL_DEF_DELETE = 40104;
+	public static final int RES_MATERIAL_DEF_IMG = 40105;
+	
+	/**
+	 * 材料规则权限
+	 */
+	public static final int RES_MATERIAL_RULE_PAGE = 40201;
+	public static final int RES_MATERIAL_RULE_ADD = 40202;
+	public static final int RES_MATERIAL_RULE_SET = 40203;
+	public static final int RES_MATERIAL_RULE_DELETE = 40204;
+	
+	/**
+	 * 初审
+	 */
+	public static final int RES_INITIAL_REVIEW_PAGE = 50100;
+	public static final int RES_INITIAL_REVIEW_DETAIL_APPROV = 50101;//明细审核通过
+	public static final int RES_INITIAL_REVIEW_DETAIL_REJECT = 50102;//明细审核驳回
+	public static final int RES_INITIAL_REVIEW_APPROV = 50103;//主记录审核通过
+	public static final int RES_INITIAL_REVIEW_REJECT = 50104;//主记录审核驳回
+	
+	public static final int RES_INITIAL_REVIEW_PROGRESS = 50500;//材料初审进度
+	
+	/**
+	 * 资格复审
+	 */
+	public static final int RES_RE_CHECK_PAGE = 50150;
+	public static final int RES_RE_CHECK_DETAIL_APPROV = 50151;//明细审核通过
+	public static final int RES_RE_CHECK_DETAIL_REJECT = 50152;//明细审核驳回
+	public static final int RES_RE_CHECK_MAIN_APPROV = 50153;//主记录审核通过
+	public static final int RES_RE_CHECK_MAIN_REJECT = 50154;//主记录审核驳回
+	
+	/**
+	 * 专业评审
+	 */
+	public static final int RES_FINAL_REVIEW_PAGE = 50200;
+	public static final int RES_FINAL_REVIEW_SAVE = 50201;
+	
+
+}

+ 18 - 0
src/main/java/cn/hmsoft/mr/constants/GobalBusinessType.java

@@ -0,0 +1,18 @@
+package cn.hmsoft.mr.constants;
+
+/***********************
+ * 全局业务类型
+ *
+ */
+public class GobalBusinessType {
+	
+	/********************
+	 * 初审消息
+	 */
+	public final static String InitialApproNotice = "InitialApproNotice";
+	
+	/********************
+	 * 评审结果通知
+	 */
+	public final static String ReviewRetNotice = "ReviewRetNotice";
+}

+ 174 - 0
src/main/java/cn/hmsoft/mr/constants/MRConst.java

@@ -0,0 +1,174 @@
+package cn.hmsoft.mr.constants;
+
+public class MRConst {
+	
+	public enum OrgType {
+		/**
+		 * @管理员
+		 */
+		Admin("Admin"),
+		/**
+		 * 学校
+		 */
+		School("School"),
+
+		/**
+		 * 二级学院
+		 */
+		SecondLevel("SecondLevel"),
+		;
+		
+		private String value;
+
+		private OrgType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	//资格复核
+	public enum ReviewLogOp {
+		/**
+		 * 初审通过
+		 */
+		InitialAppr("InitialAppr"),
+		/**
+		 * 驳回
+		 */
+		Reject("Reject"),
+		/**
+		 * 待复核
+		 */
+		ToReCheck("ToReCheck"),
+		/**
+		 * 资格复核-通过
+		 */
+		ReCheckApprov("ReCheckApprov"),
+		/**
+		 * 资格复核-不通过
+		 */
+		ReCheckReject("ReCheckReject"),
+		/**
+		 * 终审评分
+		 */
+		FinalScore("FinalScore");
+		
+		private String value;
+
+		private ReviewLogOp(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	//申请状态
+	public enum ApplyStatus {
+		/**
+		 * 新建
+		 */
+		New("New"),
+		/**
+		 * 提交待审核
+		 */
+		Apply("Apply"),
+		/**
+		 * 驳回再提交审核
+		 */
+		SecondApply("SecondApply"),
+		/**
+		 * 待复核
+		 */
+		ToReCheck("ToReCheck"),
+		/**
+		 * 初审通过
+		 */
+		InitialAppr("InitialAppr"),
+		/**
+		 * 驳回
+		 */
+		Reject("Reject"),
+		/**
+		 * 终审评分
+		 */
+		FinalScore("FinalScore"),
+		/**
+		 * 学术评审通过
+		 */
+		FinalPass("FinalPass")
+		;
+		
+		private String value;
+
+		private ApplyStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	//日志审核类型
+	public enum ReviewLogType {
+		/**
+		 * 考生提交
+		 */
+		Submit("Submit"),
+		/**
+		 * 初审通过
+		 */
+		InitialAppr("InitialAppr"),
+		/**
+		 * 驳回
+		 */
+		Reject("Reject"),
+		/**
+		 * 终审评分
+		 */
+		FinalScore("FinalScore"),
+		/**
+		 * 签名确认
+		 */
+		SignConfirm("SignConfirm"),
+		;
+		
+		private String value;
+
+		private ReviewLogType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	public enum MaterialRuleType {
+		/**
+		 * @专业
+		 */
+		aspect("aspect"),
+		/**
+		 * @学历类型
+		 */
+		std_edu("std_edu"),
+		;
+		
+		private String value;
+
+		private MaterialRuleType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+}

+ 125 - 0
src/main/java/cn/hmsoft/mr/constants/MROptrLogType.java

@@ -0,0 +1,125 @@
+package cn.hmsoft.mr.constants;
+
+public enum MROptrLogType {
+
+	/**
+	 * @材料大类
+	 */
+	Material_Category_Add("新增材料大类"), 
+	Material_Category_Edit("修改材料大类"), 
+	Material_Category_Delete("删除材料大类"), 
+	
+	/**
+	 * @材料
+	 */
+	Material_Add("新增材料"), 
+	Material_Edit("修改材料"), 
+	Material_Delete("删除材料"), 
+	
+	/**
+	 * @材料规则
+	 */
+	Material_Rule_Add("新增材料规则"), 
+	Material_Rule_Edit("修改材料规则"), 
+	Material_Rule_Delete("删除材料规则"), 
+	Material_Rule_Aspect("设置材料规则-专业"),
+	Material_Rule_StdEdu("设置材料规则-考生类型"), 
+	
+	/**
+	 * @
+	 */
+	Std_Imp("导入考生"), 
+	Std_Incre_Imp("增量导入考生"),
+	Std_Imp_Dele("删除考生"),
+	Std_Unbind("解绑考生"),
+	
+	/**
+	 * @学校
+	 */
+	School_Add("新增学校"), 
+	School_Edit("修改学校"),
+	School_Delete("删除学校"),
+	
+	/**
+	 * @专业评审老师
+	 */
+	Aspect_Optr_Add("新增专业评审老师"), 
+	Aspect_Optr_Edit("修改专业评审老师"),
+	Aspect_Optr_Delete("删除专业评审老师"),
+	Aspect_Optr_Set("专业方向设置专业评审老师"),
+	Aspect_Optr_Upload("专业方向评审老师导入"),
+	
+	/**
+	 * @专业方向
+	 */
+	Aspect_Add("新增专业方向"), 
+	Aspect_Edit("修改专业方向"),
+	
+	
+	/**
+	 * @设置初审账号
+	 */
+	Initial_Optr_Set("设置初审账号"), 
+	
+	/**
+	 * @批次
+	 */
+	Batch_Add("新增批次"), 
+	Batch_Edit("修改批次"),
+	Batch_Delete("删除批次"),
+	
+	/**
+	 * @模式
+	 */
+	Pattern_Add("新增模式"), 
+	Pattern_Edit("修改模式"),
+	Pattern_Delete("删除模式"),
+	
+	/**
+	 * @审核标签
+	 */
+	AuthTag_Add("新增批次"), 
+	AuthTag_Edit("修改批次"),
+	AuthTag_Delete("删除批次"),
+	
+	/**
+	 * @承诺书
+	 */
+	Promise_Add("新增承诺书"), 
+	Promise_Edit("修改承诺书"),
+	Promise_Delete("删除承诺书"),
+	
+	/**
+	 * @初审
+	 */
+	Initial_Approv_Detail("初审明细通过"), 
+	Initial_Reject_Detail("初审明细驳回"),
+	Initial_Approv_Main("初审主记录通过"), 
+	Initial_Reject_Main("初审主记录驳回"),
+	
+	/**
+	 * @资格复审
+	 */
+	Re_Check_Approv_Detail("资格复审明细通过"), 
+	Re_Check_Reject_Detail("资格复审明细驳回"),
+	Re_Check_Approv_Main("资格复审主记录通过"), 
+	Re_Check_Reject_Main("资格复审主记录驳回"),
+	
+	/**
+	 * @终审评分
+	 */
+	Final_Review_Score("专业评审保存评分"), 
+	Final_Review_Sign("专业评审签名提交"),
+	;
+	
+	
+	private String value;
+
+	private MROptrLogType(String value) {
+		this.value = value;
+	}
+
+	public String toString() {
+		return this.value;
+	}
+}

+ 20 - 0
src/main/java/cn/hmsoft/mr/constants/StdCertType.java

@@ -0,0 +1,20 @@
+package cn.hmsoft.mr.constants;
+
+/*******************
+ * 考生证件类型
+ *
+ */
+public class StdCertType {
+
+	public final static String IdCard = "IdCard";
+	public final static String IdCard_Caption = "居民身份证";
+	
+	public final static String Passport = "Passport";
+	public final static String Passport_Caption = "外国护照";
+	
+	public final static String TaiWanPass = "TaiWanPass";
+	public final static String TaiWanPass_Caption = "台湾居民往来大陆通行证";
+	
+	public final static String HongKongMacaoPass = "HongKongMacaoPass";
+	public final static String HongKongMacaoPass_Caption = "港澳居民来往内地通行证";
+}

+ 65 - 0
src/main/java/cn/hmsoft/mr/constants/StdConst.java

@@ -0,0 +1,65 @@
+package cn.hmsoft.mr.constants;
+
+public class StdConst {
+
+//	//考生学历类型
+//	public enum StdEduType {
+//
+//		/*******************
+//		 * 硕士毕业生
+//		 */
+//		MasterGrad("MasterGrad"),
+//		/*******************
+//		 * 应届毕业生
+//		 */
+//		CurrGrad("CurrGrad"),
+//		/*******************
+//		 * 同等学历考生
+//		 */
+//		EquEdu("EquEdu"),
+//		/*******************
+//		 * 同等学力申请硕士学位的考生
+//		 */
+//		EquEduMaster("EquEduMaster");
+//
+//		private String value;
+//
+//		private StdEduType(String value) {
+//			this.value = value;
+//		}
+//
+//		public String toString() {
+//			return this.value;
+//		}
+//	}
+	
+//	public enum StdEduTypeCaption {
+//
+//		/*******************
+//		 * 硕士毕业生
+//		 */
+//		MasterGrad("硕士毕业生"),
+//		/*******************
+//		 * 应届毕业生
+//		 */
+//		CurrGrad("应届毕业生"),
+//		/*******************
+//		 * 同等学力考生
+//		 */
+//		EquEdu("同等学力考生"),
+//		/*******************
+//		 * 同等学力申请硕士学位的考生
+//		 */
+//		EquEduMaster("同等学力申请硕士学位的考生");
+//
+//		private String value;
+//
+//		private StdEduTypeCaption(String value) {
+//			this.value = value;
+//		}
+//
+//		public String toString() {
+//			return this.value;
+//		}
+//	}
+}

+ 35 - 0
src/main/java/cn/hmsoft/mr/constants/StdResType.java

@@ -0,0 +1,35 @@
+package cn.hmsoft.mr.constants;
+
+/*********************
+ * 考生的资源类型
+ *
+ */
+public enum StdResType {
+
+	/*******************
+	 * 身份证识别
+	 */
+	OcrIdCard("OcrIdCard"),
+	/*******************
+	 * 身份证识别
+	 */
+	NoCrownPhoto("NoCrownPhoto"),
+	/*******************
+	 * 在线身份识别
+	 */
+	OnlineExamPhoto("OnlineExamPhoto"),
+	/*******************
+	 * 小程序视频截图
+	 */
+	VideoAppSnap("VideoAppSnap");
+	
+	private String value;
+
+	private StdResType(String value) {
+		this.value = value;
+	}
+
+	public String toString() {
+		return this.value;
+	}
+}

+ 186 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfAspectControl.java

@@ -0,0 +1,186 @@
+package cn.hmsoft.mr.control.cf;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.cf.CfAspectDao;
+import cn.hmsoft.mr.data.model.cf.CfAspect;
+import cn.hmsoft.mr.data.model.cf.CfAspectOptr;
+import cn.hmsoft.mr.data.model.cf.CfMajor;
+import cn.hmsoft.mr.service.cf.CfAspectService;
+import cn.hmsoft.sms.util.CollectionHelper;
+
+@RestController
+public class CfAspectControl extends FrameControl {
+
+	@Autowired
+	private CfAspectDao dao;
+	@Autowired
+	private CfAspectService service;
+	
+	/**
+	 * 专业方向分页
+	 * @param query : 查询条件
+	 * @param school_id: 学校ID
+	 * @param batch_id: 批次ID
+	 * @param major_id: 专业ID
+	 */
+	@SuppressWarnings("unchecked")
+	@RequestMapping("cf/aspect/page.htm")
+	public Ajax pageAspect(String query, Integer start, Integer limit, String order, String type, 
+			Integer school_id, Integer batch_id, Integer major_id) {
+		if (school_id == null) {
+			return new Ajax(new Pager());
+		}
+		Integer deptId=null;
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			deptId=org.getDept_id();
+		}
+		Pager pager = this.dao.pageAspect(start, limit, query, getQueryOrder(order, type), 
+				school_id,deptId, batch_id, major_id);
+		Map<Integer, List<CfAspectOptr>> tempMap = this.getAspectOptrMap(school_id);
+		for (Map<String, Object> aspectM : (List<Map<String, Object>>)pager.getRecords()) {
+			Integer aspect_id = Integer.valueOf(aspectM.get("aspect_id").toString());
+			List<CfAspectOptr> aoList = tempMap.get(aspect_id);
+			if (aoList != null && aoList.size() > 0) {
+				aspectM.put("optr_name", CollectionHelper.join(aoList, "optr_name", ","));
+				aspectM.put("optr_id", CollectionHelper.join(aoList, "optr_id", ","));
+			}
+		}
+		return new Ajax(pager);
+	}
+	
+	//专业多选过滤
+	@RequestMapping("cf/aspect/page2.htm")
+	public Ajax pageAspect(String query, Integer start, Integer limit, String order, String type, 
+			Integer school_id, Integer batch_id, String major_ids) {
+		if (school_id == null) {
+			return new Ajax(new Pager());
+		}
+		//LogHelper.info("major_ids--->" + major_ids);
+		Pager pager = this.dao.pageAspect2(start, limit, query, getQueryOrder(order, type), 
+				school_id, batch_id, major_ids);
+		return new Ajax(pager);
+	}
+
+	private Map<Integer, List<CfAspectOptr>> getAspectOptrMap(Integer school_id) {
+		List<CfAspectOptr> list = this.dao.listBySql(CfAspectOptr.class, 
+				"select o.optr_id,o.optr_name,f.aspect_id from cf_aspect_optr f,frame_optr o where f.optr_id=o.optr_id and (f.school_id=? or 1=?)", 
+				school_id, school_id == null ? 1 : 2);
+		Map<Integer, List<CfAspectOptr>> tempMap = new HashMap<Integer, List<CfAspectOptr>>();
+		for (CfAspectOptr ao : list) {
+			List<CfAspectOptr> tempList = tempMap.get(ao.getAspect_id());
+			if (tempList == null) {
+				tempList = new ArrayList<CfAspectOptr>();
+				tempMap.put(ao.getAspect_id(), tempList);
+			}
+			tempList.add(ao);
+		}
+		return tempMap;
+	}
+	
+	/**
+	 *  业方向-更新
+	 */
+	@RequestMapping("cf/aspect/edit.htm")
+	public Ajax editAspect(CfAspect aspect) {
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (org==null||!org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			throw new BusinessException("只有学校老师才能操作!");
+		}
+		this.service.editAspect(aspect, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * 专业分页
+	 * @param query : 查询条件
+	 * @param school_id: 学校ID
+	 * @param batch_id: 批次ID
+	 */
+	@RequestMapping("cf/major/page.htm")
+	public Ajax pageMajor(String query, Integer start, Integer limit, String order, String type, 
+			Integer school_id, Integer batch_id) {
+		return new Ajax(this.dao.pageMajor(start, limit, query, getQueryOrder(order, type), 
+				school_id, batch_id));
+	}
+	
+	@RequestMapping("cf/aspect/list.htm")
+	public Ajax listAspect(Integer school_id, Integer batch_id) {
+		return new Ajax(this.dao.listBySql("select * from cf_aspect where school_id=? and batch_id=? order by aspect_code", school_id, batch_id));
+	}
+	
+	@RequestMapping("cf/major/list.htm")
+	public Ajax listMajor(Integer school_id, Integer batch_id) {
+		return new Ajax(this.dao.listBySql(CfMajor.class, "select * from cf_major where school_id=? and batch_id=?", school_id, batch_id));
+	}
+	
+	/**
+	 * 导入专业通过率、通过人数
+	 * @param file
+	 * @param batch_id
+	 * @throws IOException 
+	 */
+	@RequestMapping("cf/aspect/pass/upload.htm")
+	public Ajax uploadAspectOptr(MultipartFile file, Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+		this.authOptrRole(FrameResIdConst.RES_ASPECT_OPTR_UPLOAD);
+		final FrameOptr optr = this.getFrameOptr();
+		List<List<String>> array = ExcelReaderHelper.readSheet(file.getOriginalFilename(), file.getInputStream());
+		FrameThread thread = FrameThreadHelper.createThread("考生导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+				"数据处理完成", this.getFrameOptr());
+		try {
+			new Thread(() -> {
+				this.service.uploadPass(thread, school_id, batch_id, error_flag, array, file, optr);
+			}).start();
+		} catch (Exception e) {
+			FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+		}
+		return new Ajax(thread);
+	}
+
+	/**
+	 * 专业数据
+	 * @param file
+	 * @param batch_id
+	 * @throws IOException
+	 */
+	@RequestMapping("cf/aspect/upload.htm")
+	public Ajax uploadAspect(MultipartFile file, Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+		this.authOptrRole(FrameResIdConst.RES_ASPECT_UPLOAD);
+		final FrameOptr optr = this.getFrameOptr();
+		List<List<String>> array = ExcelReaderHelper.readSheet(file.getOriginalFilename(), file.getInputStream());
+		FrameThread thread = FrameThreadHelper.createThread("专业导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+				"数据处理完成", this.getFrameOptr());
+		try {
+			new Thread(() -> {
+				this.service.uploadAspect(thread, school_id, batch_id, error_flag, array, file, optr);
+			}).start();
+		} catch (Exception e) {
+			FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+		}
+		return new Ajax(thread);
+	}
+}

+ 103 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfAspectOptrControl.java

@@ -0,0 +1,103 @@
+package cn.hmsoft.mr.control.cf;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.cf.CfAspectOptrDao;
+import cn.hmsoft.mr.service.cf.CfAspectOptrService;
+
+/**
+ * 评审专业老师
+ * @author zq
+ *
+ */
+@RestController
+public class CfAspectOptrControl extends FrameControl {
+
+	@Autowired
+	private CfAspectOptrService service;
+	@Autowired
+	private CfAspectOptrDao dao;
+	
+
+	/**
+	 * 专业评审老师
+	 * @param query : 查询条件
+	 * @param school_id: 学校ID
+	 */
+	@RequestMapping("cf/aspect/optr/page.htm")
+	public Ajax pageAspectOptr(String query, Integer start, Integer limit, String order, String type, 
+			Integer school_id, Integer batch_id, Integer aspect_id) {
+		return new Ajax(this.dao.pageAspectOptr(start, limit, query, getQueryOrder(order, type), 
+				school_id, batch_id, aspect_id));
+	}
+	
+	/**
+	 * 专业评审老师账号信息
+	 * @param query : 查询条件
+	 * @param school_id: 学校ID
+	 */
+	@RequestMapping("cf/school/optr/page")
+	public Ajax pageSchoolOptr(String query, Integer start, Integer limit, String order, String type, 
+			Integer school_id) {
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer dept_id = null;
+		if (!org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			dept_id = org.getDept_id();
+		} else {
+			return new Ajax();
+		}
+		return new Ajax(this.dao.pageSchoolOptr(start, limit, query, getQueryOrder(order, type), 
+				dept_id));
+	}
+	
+	/**
+	 * @param ids
+	 * @param aspect_id
+	 */
+	@RequestMapping("cf/aspect/optr/set.htm")
+	public Ajax setAspectOptr(Integer[] ids, Integer school_id, Integer batch_id, Integer aspect_id) {
+		this.authOptrRole(FrameResIdConst.RES_ASPECT_OPTR_SET);
+		this.service.setAspectOptr(ids, school_id, batch_id, aspect_id, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param file
+	 * @param batch_id
+	 * @throws IOException 
+	 */
+	@RequestMapping("cf/aspect/optr/upload.htm")
+	public Ajax uploadAspectOptr(MultipartFile file, Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+		//this.authOptrRole(FrameResIdConst.RES_ASPECT_OPTR_UPLOAD);
+		final FrameOptr optr = this.getFrameOptr();
+		List<List<String>> array = ExcelReaderHelper.readSheet(file.getOriginalFilename(), file.getInputStream());
+		FrameThread thread = FrameThreadHelper.createThread("考生导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+				"数据处理完成", this.getFrameOptr());
+		try {
+			new Thread(() -> {
+				this.service.uploadProcess(thread, school_id, batch_id, error_flag, array, file, optr);
+			}).start();
+		} catch (Exception e) {
+			FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+		}
+		return new Ajax(thread);
+	}
+	
+}

+ 106 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfAuthTagControl.java

@@ -0,0 +1,106 @@
+package cn.hmsoft.mr.control.cf;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.cf.CfAuthTagDao;
+import cn.hmsoft.mr.data.model.cf.CfAuthTag;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.helper.MaterialCacheHelper;
+import cn.hmsoft.mr.service.cf.CfAuthTagService;
+
+/**
+ * 审核标签.
+ * @author zq
+ *
+ */
+@RestController
+public class CfAuthTagControl extends FrameControl {
+
+	@Autowired
+	private CfAuthTagDao dao;
+	@Autowired
+	private CfAuthTagService service;
+	
+	/**
+	 * @param query : 查询条件
+	 * @param school_id: 学校ID
+	 */
+	@RequestMapping("cf/authtag/page")
+	public Ajax pageBatch(String query, Integer start, Integer limit, String order, String type, Integer school_id) {
+
+		if(school_id==null) {
+			FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+			if (org == null || !org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+				throw new BusinessException("只有学校老师才能操作!");
+			}
+			CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+					org.getDept_code(), org.getDept_id());
+			school_id=school.getSchool_id();
+		}
+		return new Ajax(this.dao.pageAuthTag(start, limit, query, getQueryOrder(order, type), school_id));
+	}
+	
+	/**
+	 * 审核标签
+	 * @param pattern
+	 */
+	@RequestMapping("cf/authtag/add")
+	public Ajax addBatch(CfAuthTag authTag) {
+		this.authOptrRole(FrameResIdConst.RES_AUTHTAG_ADD);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (!org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			throw new BusinessException("只有学校管理员才能操作!");
+		}
+		CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?", 
+				org.getDept_code(), org.getDept_id());
+		authTag.setSchool_id(school.getSchool_id());
+		this.service.addAuthTag(authTag, this.getFrameOptr());
+		MaterialCacheHelper.instance(true);
+		return new Ajax();
+	}
+	
+	/**
+	 *  审核标签-更新
+	 * @param batch
+	 */
+	@RequestMapping("cf/authtag/edit")
+	public Ajax editBatch(CfAuthTag authTag) {
+		this.authOptrRole(FrameResIdConst.RES_AUTHTAG_EDIT);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (!org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			throw new BusinessException("只有学校管理员才能操作!");
+		}
+		this.service.editAuthTag(authTag, this.getFrameOptr());
+		MaterialCacheHelper.instance(true);
+		return new Ajax();
+	}
+	
+	/**
+	 *  审核标签-删除
+	 * @param pattern_id:模式ID
+	 */
+	@RequestMapping("cf/authtag/delete")
+	public Ajax deleteBatch(Integer tag_id) {
+		this.authOptrRole(FrameResIdConst.RES_AUTHTAG_DELETE);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (!org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			throw new BusinessException("只有学校管理员才能操作!");
+		}
+		this.service.deleteAuthTag(tag_id, this.getFrameOptr());
+		MaterialCacheHelper.instance(true);
+		return new Ajax();
+	}
+	
+	@RequestMapping("cf/authtag/list")
+	public Ajax list(Integer school_id) {
+		return new Ajax(this.dao.list("school_id", school_id));
+	}
+}

+ 151 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfBatchControl.java

@@ -0,0 +1,151 @@
+package cn.hmsoft.mr.control.cf;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.cf.CfBatchDao;
+import cn.hmsoft.mr.data.model.cf.CfBatch;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.helper.MaterialCacheHelper;
+import cn.hmsoft.mr.service.cf.CfBatchService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class CfBatchControl extends FrameControl {
+
+    @Autowired
+    private CfBatchService service;
+    @Autowired
+    private CfBatchDao dao;
+
+    /**
+     * @param query      : 查询条件
+     * @param school_id: 学校ID
+     */
+    @RequestMapping("cf/batch/page")
+    public Ajax pageBatch(String query, Integer start, Integer limit, String order, String type, Integer school_id) {
+        Integer deptId = null;
+        if (school_id == null) {
+            FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+            if (org == null) {
+            	throw new BusinessException("请选择学校或已学校管理员登录.");
+            }
+            if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+                CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                        org.getDept_code(), org.getDept_id());
+                school_id = school.getSchool_id();
+            } else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+                deptId = org.getDept_id();
+            }
+        }
+        return new Ajax(this.dao.pageBatch(start, limit, query, getQueryOrder(order, type), school_id, deptId));
+    }
+
+    /**
+     * @param batch
+     */
+    @RequestMapping("cf/batch/add")
+    public Ajax addBatch(CfBatch batch) {
+        this.authOptrRole(FrameResIdConst.RES_BATCH_ADD);
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+            CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                    org.getDept_code(), org.getDept_id());
+            batch.setSchool_id(school.getSchool_id());
+        } else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+            batch.setDept_id(org.getDept_id());
+            batch.setSchool_id(null);
+        }
+
+        this.service.addBatch(batch, this.getFrameOptr());
+        MaterialCacheHelper.instance(true);
+        return new Ajax();
+    }
+
+    /**
+     * 批次-更新
+     *
+     * @param batch
+     */
+    @RequestMapping("cf/batch/edit")
+    public Ajax editBatch(CfBatch batch) {
+        this.authOptrRole(FrameResIdConst.RES_BATCH_ADD);
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+            CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                    org.getDept_code(), org.getDept_id());
+            batch.setSchool_id(school.getSchool_id());
+        } else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+            batch.setDept_id(org.getDept_id());
+            batch.setSchool_id(null);
+        }
+        this.service.editBatch(batch, this.getFrameOptr());
+        MaterialCacheHelper.instance(true);
+        return new Ajax();
+    }
+
+    /**
+     * 批次-删除
+     *
+     * @param batch_id:批次ID
+     */
+    @RequestMapping("cf/batch/delete")
+    public Ajax deleteBatch(Integer batch_id) {
+        this.authOptrRole(FrameResIdConst.RES_BATCH_DELETE);
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) && !org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+            throw new BusinessException("只有学校老师才能操作!");
+        }
+        this.service.deleteBatch(batch_id, this.getFrameOptr());
+        MaterialCacheHelper.instance(true);
+        return new Ajax();
+    }
+
+    /**
+     * @param school_id:学校ID
+     * @Description: 查找学校下的所有批次
+     */
+    @RequestMapping("cf/batch/list")
+    public Ajax listSchoolBatch(Integer school_id) {
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+            List<CfBatch> cfBatches = this.dao.listBySql("select * from cf_batch where  dept_id=?  and status=1 order by create_time desc", org.getDept_id());
+            if (!cfBatches.isEmpty())
+                return new Ajax(cfBatches);
+//            return new Ajax(this.dao.listBySql("select * from cf_batch where  dept_id=?  and status=1 order by create_time desc", org.getDept_id()));
+        }
+        return new Ajax(this.dao.listBySql("select * from cf_batch where school_id=?  and status=1 order by create_time desc", school_id));
+    }
+
+    //当前批次获取
+    @RequestMapping("cf/batch/current/get.htm")
+    public Ajax getCurrentBatch() {
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) && !org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+            return null;
+        }
+        if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+            List<CfBatch> cfBatches = this.dao.listBySql("select * from cf_batch where  dept_id=?  and status=1 order by create_time desc", org.getDept_id());
+            if (!cfBatches.isEmpty())
+                return new Ajax(cfBatches.get(0));
+            else {
+                org = this.dao.find(FrameDept.class, org.getDept_pid());
+            }
+        }
+
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                org.getDept_code(), org.getDept_id());
+        CfBatch batch = this.dao.getCurrentBatch(school.getSchool_id());
+        return new Ajax(batch);
+
+
+    }
+
+}

+ 124 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfInitialOptrControl.java

@@ -0,0 +1,124 @@
+package cn.hmsoft.mr.control.cf;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.cf.CfInitialOptrDao;
+import cn.hmsoft.mr.data.model.cf.CfBatch;
+import cn.hmsoft.mr.data.model.cf.CfInitialOptr;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.std.StdReg;
+import cn.hmsoft.mr.service.cf.CfInitialOptrService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+public class CfInitialOptrControl extends FrameControl {
+
+    @Autowired
+    private CfInitialOptrService service;
+    @Autowired
+    private CfInitialOptrDao dao;
+
+    /**
+     * 专业评审老师
+     *
+     * @param query      : 查询条件
+     * @param school_id: 学校ID
+     */
+    @RequestMapping("cf/initial/optr/page.htm")
+    public Ajax pageInitialOptr(String query, Integer start, Integer limit, String order, String type,
+                                Integer school_id, Integer batch_id, Integer aspect_id) {
+
+
+        if(school_id==null) {
+            FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+            if (org == null) {
+                throw new BusinessException("只有学校老师才能操作!");
+            }
+            if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+              org = this.dao.find(FrameDept.class, org.getDept_pid());
+            }
+            CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                    org.getDept_code(), org.getDept_id());
+            school_id=school.getSchool_id();
+        }
+        return new Ajax(this.dao.pageInitialOptr(start, limit, query, getQueryOrder(order, type), school_id));
+    }
+
+    /**
+     * @param ids
+     * @param main_id
+     */
+    @RequestMapping("cf/initial/optr/set.htm")
+    public Ajax setInitial(Integer[] ids, Integer main_id,String type) {
+        this.authOptrRole(FrameResIdConst.RES_INITAIL_OPTR_SET);
+        if("first".equals(type))this.service.saveInitialOptrDetail(ids, main_id, this.getFrameOptr());
+        if("re".equals(type))this.service.saveInitialReOptrDetail(ids, main_id, this.getFrameOptr());
+        return new Ajax();
+    }
+
+    /**
+     * 已保存明细列表
+     *
+     * @param main_id
+     * @return
+     */
+    @RequestMapping("cf/initial/optr/detail/list.htm")
+    public Ajax listOptrDetail(Integer main_id) {
+        return new Ajax(this.dao.listMapBySql("select d.*,o.optr_name,o.optr_sex,o.optr_mobile,o.login_name,o.optr_desc from cf_initial_optr_detail d,frame_optr o where d.main_id=? and d.optr_id=o.optr_id",
+                main_id));
+    }
+
+    @RequestMapping("cf/initial/re/optr/detail/list.htm")
+    public Ajax listReOptrDetail(Integer main_id) {
+        return new Ajax(this.dao.listMapBySql("select d.*,o.optr_name,o.optr_sex,o.optr_mobile,o.login_name,o.optr_desc from cf_initial_re_optr_detail d,frame_optr o where d.main_id=? and d.optr_id=o.optr_id",
+                main_id));
+    }
+
+    @RequestMapping("cf/initial/optr/add.htm")
+    public Ajax add(CfInitialOptr cfInitialOptr) {
+        service.add(cfInitialOptr);
+        return new Ajax();
+    }
+
+    @RequestMapping("cf/initial/optr/edit.htm")
+    public Ajax edit(CfInitialOptr cfInitialOptr) {
+        service.edit(cfInitialOptr);
+        return new Ajax();
+    }
+    @RequestMapping("cf/initial/optr/delete.htm")
+    public Ajax delete(CfInitialOptr cfInitialOptr) {
+        service.delete(cfInitialOptr);
+        return new Ajax();
+    }
+
+
+    @RequestMapping({"cf/initial/optr/frame/dict/reload"})
+    public Ajax reload() {
+        FrameDictUtil.allDict(true);
+        return new Ajax();
+    }
+
+    @RequestMapping({"cf/stdEduArray"})
+    public Ajax stdEduArray() {
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        if (org == null || !org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+            throw new BusinessException("只有学校老师才能操作!");
+        }
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                org.getDept_code(), org.getDept_id());
+        List<FrameDict> dicts=dao.findBySchoolId(school.getSchool_id());
+        return new Ajax(dicts.stream().sorted(Comparator.comparing(FrameDict::getDict_order)).collect(Collectors.toList()));
+    }
+}

+ 78 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfMaterialCategoryControl.java

@@ -0,0 +1,78 @@
+package cn.hmsoft.mr.control.cf;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.data.dao.cf.CfMaterialCategoryDao;
+import cn.hmsoft.mr.data.model.cf.CfMaterialCategory;
+import cn.hmsoft.mr.service.cf.CfMaterialCategoryService;
+
+/**
+ * 材料大类.
+ * @author zq
+ *
+ */
+@RestController
+public class CfMaterialCategoryControl extends FrameControl {
+
+	@Autowired
+	private CfMaterialCategoryService service;
+	@Autowired
+	private CfMaterialCategoryDao dao;
+
+	/**
+	 * @param query : 查询条件
+	 * @param school_id:学校ID
+	 * @param batch_id: 批次ID
+	 */
+	@RequestMapping("cf/material/category/page")
+	public Ajax pageBatch(String query, Integer start, Integer limit, String order, String type, Integer school_id, Integer batch_id) {
+		return new Ajax(this.dao.pageCategory(start, limit, query, getQueryOrder(order, type), school_id, batch_id));
+	}
+	
+	/**
+	 * @param category
+	 */
+	@RequestMapping("cf/material/category/add")
+	public Ajax addBatch(CfMaterialCategory category) {
+		this.authOptrRole(FrameResIdConst.RES_CATEGROY_ADD);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		this.service.addCategory(category, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param category
+	 */
+	@RequestMapping("cf/material/category/edit")
+	public Ajax editBatch(CfMaterialCategory category) {
+		this.authOptrRole(FrameResIdConst.RES_CATEGROY_EDIT);
+		this.service.editCategory(category, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param category_id
+	 */
+	@RequestMapping("cf/material/category/delete")
+	public Ajax deleteBatch(Integer category_id) {
+		this.authOptrRole(FrameResIdConst.RES_CATEGROY_DELETE);
+		this.service.deleteCategory(category_id, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param school_id:学校ID
+	 * @param batch_id:批次ID 
+	 */  
+	@RequestMapping("cf/material/category/list")
+	public Ajax listSchoolBatch(Integer school_id) {
+		return new Ajax(this.dao.listBySql("select * from cf_material_category where school_id=?", 
+				school_id));
+	}
+	
+}

+ 191 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfMaterialDefControl.java

@@ -0,0 +1,191 @@
+package cn.hmsoft.mr.control.cf;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.helper.FileHelper;
+import cn.hmsoft.helper.LocalDateHelper;
+import cn.hmsoft.log.LogHelper;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.data.dao.cf.CfMaterialDefDao;
+import cn.hmsoft.mr.data.model.cf.CfMaterialDef;
+import cn.hmsoft.mr.data.model.cf.CfMaterialFeedBack;
+import cn.hmsoft.mr.enrol.helper.EnrolMaterialHelper;
+import cn.hmsoft.mr.helper.ArtParamHelper;
+import cn.hmsoft.mr.service.cf.CfMaterialDefService;
+
+/**
+ * 材料定义.
+ * @author zq
+ *
+ */
+@RestController
+public class CfMaterialDefControl extends FrameControl {
+
+	@Autowired
+	private CfMaterialDefService service;
+	@Autowired
+	private CfMaterialDefDao dao;
+	
+	/**
+	 * 材料定义分页
+	 * @param query : 查询条件
+	 * @param school_id: 学校ID
+	 */
+	@RequestMapping("cf/material/def/page.htm")
+	public Ajax pageMaterialDef(String query, Integer start, Integer limit, String order, String type, 
+			Integer school_id, Integer batch_id, Integer category_id, String material_type) {
+		if(school_id==null) {
+			FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+			if (org == null || !org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+				throw new BusinessException("只有学校老师才能操作!");
+			}
+			CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+					org.getDept_code(), org.getDept_id());
+			school_id=school.getSchool_id();
+		}
+		return new Ajax(this.dao.pageMaterialDef(start, limit, query, getQueryOrder(order, type),
+				school_id, batch_id, category_id, material_type));
+	}
+	
+	/**
+	 * @param def
+	 */
+	@RequestMapping("cf/material/def/add.htm")
+	public Ajax addMaterialDef(CfMaterialDef def) {
+		this.authOptrRole(FrameResIdConst.RES_MATERIAL_DEF_ADD);
+		//FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		this.service.addMaterialDef(def, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param def
+	 */
+	@RequestMapping("cf/material/def/edit.htm")
+	public Ajax editMaterialDef(CfMaterialDef def) {
+		this.authOptrRole(FrameResIdConst.RES_MATERIAL_DEF_EDIT);
+		this.service.editMaterialDef(def, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param material_def_id
+	 */
+	@RequestMapping("cf/material/def/delete.htm")
+	public Ajax deleteMaterialDef(Integer material_def_id) {
+		this.authOptrRole(FrameResIdConst.RES_MATERIAL_DEF_DELETE);
+		this.service.deleteMaterialDef(material_def_id, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	@CrossOrigin
+	@RequestMapping("cf/material/def/image/upload.htm")
+	public Ajax imageUpload(MultipartFile file) {
+		this.authOptrRole(FrameResIdConst.RES_MATERIAL_DEF_IMG);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		File localTempFile = EnrolMaterialHelper.generateMaterialTempFileBySuffix("." + extension);
+		//先存到临时文件localTempFile
+		FileHelper.fromUpload(localTempFile, file);
+		String imageName = "def" + File.separator + org.getDept_code() + "_" + LocalDateHelper.formatNoSplit(LocalDateTime.now()) + "." + FileHelper.getFileSuffix(file);
+		File desFile = new File(EnrolMaterialHelper.getEnrolMaterialLocalPath() + imageName);
+		LogHelper.info("----材料描述上传图片------->" + localTempFile.getAbsolutePath() + " , " + desFile.getAbsolutePath() + "," + imageName);
+		//再把临时文件复制到/image/
+		FileHelper.copyFile(localTempFile, desFile);
+		return new Ajax(ArtParamHelper.getParamValue("EnrolMaterialWebPath","https://m.hmsoft.cn/image/") + imageName);
+	}
+	
+	/**
+	 * 常用审核语句
+	 * @param material_def_id
+	 */
+	@RequestMapping("cf/material/def/msg/list.htm")
+	public Ajax editMaterialDef(Integer material_def_id) {
+		//return new Ajax(this.dao.listMapBySql("select review_msg from cf_material_msg where material_def_id=?", material_def_id));
+		return new Ajax(this.dao.listMapBySql("select feedback_msg from cf_material_feedback where material_def_id=?", material_def_id));
+	}
+	
+	/**
+	 * 材料定义对应反馈分页
+	 * @param query : 查询条件
+	 * @param material_def_id: 材料ID
+	 */
+	@RequestMapping("cf/material/feedback/page.htm")
+	public Ajax pageFeedBack(String query, Integer start, Integer limit, String order, String type, Integer material_def_id) {
+		return new Ajax(this.dao.pageFeedBack(start, limit, query, getQueryOrder(order, type), 
+				material_def_id));
+	}
+	
+	/**
+	 * @param feedback
+	 */
+	@RequestMapping("cf/material/feedback/add.htm")
+	public Ajax addFeedBack(CfMaterialFeedBack feedback) {
+		this.service.addFeedBack(feedback, this.getFrameOptr());
+		return new Ajax(true);
+	}
+
+	/**
+	 * @param feedback
+	 */
+	@RequestMapping("cf/material/feedback/edit.htm")
+	public Ajax editFeedBack(CfMaterialFeedBack feedback) {
+		this.service.editFeedBack(feedback, this.getFrameOptr());
+		return new Ajax(true);
+	}
+	
+	/**
+	 * @param feed_id
+	 */
+	@RequestMapping("cf/material/feedback/delete.htm")
+	public Ajax addFeedBack(Integer feed_id) {
+		this.service.deleteFeedBack(feed_id, this.getFrameOptr());
+		return new Ajax();
+	}
+
+
+	@CrossOrigin
+	@RequestMapping("cf/material/feedback/upload.htm")
+	public Ajax checkUpload(MultipartFile file, Integer material_def_id,String error_flag, String thread_flag) throws IOException {
+		final FrameOptr optr = this.getFrameOptr();
+		FrameDept org = this.dao.find(FrameDept.class, optr.getOptr_dept());
+//        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+//                !org.getDept_code().equals(school.getSchool_code())) {
+//            throw new BusinessException("只有当前学校招办老师才能上传!");
+//        }
+		List<List<String>> array = ExcelReaderHelper.readSheet(file.getOriginalFilename(), file.getInputStream());
+
+		FrameThread thread = FrameThreadHelper.createThread("feedback导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+				"数据处理完成", optr);
+		try {
+			new Thread(() -> {
+				this.service.uploadProcess(thread, material_def_id, error_flag, array, file, optr);
+			}).start();
+		} catch (Exception e) {
+			FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+		}
+		return new Ajax(thread);
+	}
+}

+ 139 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfMaterialRuleControl.java

@@ -0,0 +1,139 @@
+package cn.hmsoft.mr.control.cf;
+
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.cf.CfAspectDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.data.dao.cf.CfMaterialRuleDao;
+import cn.hmsoft.mr.data.model.cf.CfMaterialRuleDetail;
+import cn.hmsoft.mr.service.cf.CfMaterialRuleService;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 材料规则定义.
+ * @author zq
+ *
+ */
+@RestController
+public class CfMaterialRuleControl extends FrameControl {
+
+	@Autowired
+	private CfMaterialRuleService service;
+	@Autowired
+	private CfMaterialRuleDao dao;
+	@Autowired
+	private CfAspectDao cfAspectDao;
+	
+	/**
+	 * 材料规则分页
+	 * @param query : 查询条件
+	 * @param school_id: 学校ID
+	 */
+	@RequestMapping("cf/material/rule/page.htm")
+	public Ajax pageMaterialDef(String query, Integer start, Integer limit, String order, String type, 
+			Integer school_id, Integer batch_id) {
+		if(school_id==null) {
+			FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+			if (org == null || !org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+				throw new BusinessException("只有学校老师才能操作!");
+			}
+			CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+					org.getDept_code(), org.getDept_id());
+			school_id=school.getSchool_id();
+		}
+		return new Ajax(this.dao.pageMaterialRule(start, limit, query, getQueryOrder(order, type),
+				school_id, batch_id));
+	}
+	
+	/**
+	 * @param school_id
+	 * @param batch_id
+	 * @param ids
+	 */
+	@RequestMapping("cf/material/rule/add.htm")
+	public Ajax addMaterialRule(Integer school_id, Integer batch_id, Integer[] ids) {
+		this.authOptrRole(FrameResIdConst.RES_MATERIAL_RULE_ADD);
+		this.service.addMaterialRule(school_id, batch_id, ids, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param ids
+	 * @param material_rule_id
+	 */
+	@RequestMapping("cf/material/rule/stdedu/set.htm")
+	public Ajax setStdEdutype(String[] ids, Integer material_rule_id, Integer material_def_id) {
+		this.authOptrRole(FrameResIdConst.RES_MATERIAL_RULE_SET);
+		this.service.saveStdEdutype(ids, material_rule_id, material_def_id, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param ids
+	 * @param material_rule_id
+	 */
+	@RequestMapping("cf/material/rule/aspect/set.htm")
+	public Ajax setRuleAspect(Integer[] ids, Integer material_rule_id, Integer material_def_id) {
+		this.authOptrRole(FrameResIdConst.RES_MATERIAL_RULE_SET);
+		this.service.saveRuleAspect(ids, material_rule_id, material_def_id, this.getFrameOptr());
+		return new Ajax();
+	}
+
+	/**
+	 * @param material_rule_id
+	 */
+	@RequestMapping("cf/material/rule/aspect/setAll.htm")
+	public Ajax setRuleAspect(Integer school_id, Integer batch_id, String major_ids,Integer material_rule_id, Integer material_def_id) {
+		this.authOptrRole(FrameResIdConst.RES_MATERIAL_RULE_SET);
+		Pager pager = this.cfAspectDao.pageAspect2(0, Integer.MAX_VALUE, null, null, school_id, batch_id, major_ids);
+		Integer[] ids = pager.getRecords().stream().map(e -> ((Map) e).get("aspect_id")).toArray(Integer[]::new);
+		this.service.saveRuleAspect(ids, material_rule_id, material_def_id, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param material_rule_id
+	 */
+	@RequestMapping("cf/material/rule/delete.htm")
+	public Ajax deleteMaterialRule(Integer material_rule_id) {
+		this.authOptrRole(FrameResIdConst.RES_MATERIAL_RULE_DELETE);
+		this.service.deleteMaterialRule(material_rule_id, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param material_rule_id
+	 * @param material_def_id
+	 * @param rule_type  std_edu,aspect
+	 */
+	@RequestMapping("cf/material/rule/detail/list.htm")
+	public Ajax ruleDetailList(Integer material_rule_id, Integer material_def_id, String rule_type) {
+		StringBuilder sql = new StringBuilder();
+		if (rule_type.equals("std_edu")) {
+			sql.append("select * from cf_material_rule_detail d ");
+			sql.append("where d.material_rule_id=? and d.material_def_id=? and rule_type=? ");
+			return new Ajax(this.dao.listBySql(CfMaterialRuleDetail.class, sql.toString(), 
+					material_rule_id, material_def_id, rule_type));
+		} else if (rule_type.equals("aspect")) {
+			sql.append("select d.*,f.aspect_code,f.aspect_name,m.major_code,m.major_name ");
+			sql.append("from cf_material_rule_detail d					  ");
+			sql.append("left join cf_aspect f on f.aspect_id=d.rule_value ");
+			sql.append("left join cf_major m on m.major_id=f.major_id     ");
+			sql.append("where d.material_rule_id=? and d.material_def_id=? and rule_type=? ");
+			sql.append("order by m.major_code,f.aspect_code      		  ");
+			return new Ajax(this.dao.listMapBySql(sql.toString(), material_rule_id, material_def_id, rule_type));
+		}
+		return new Ajax();
+	}
+}

+ 55 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfMaterialTextAttrControl.java

@@ -0,0 +1,55 @@
+package cn.hmsoft.mr.control.cf;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.mr.data.model.cf.CfMaterialTextAttr;
+import cn.hmsoft.mr.service.cf.CfMaterialTextAttrService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *  控制器.
+ * 
+ * @author: shudonghui
+ * @date: 2023-05-23 09:24:51
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class CfMaterialTextAttrControl extends FrameControl {
+
+    @Autowired
+    private CfMaterialTextAttrService cfMaterialTextAttrService;
+	
+    @RequestMapping("cf/material/textattr/page")
+    public Ajax page(Integer material_def_id,String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.cfMaterialTextAttrService.page(material_def_id,query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    @RequestMapping("cf/material/textattr/add")
+    public Ajax add(CfMaterialTextAttr cfMaterialTextAttr) {
+        return this.cfMaterialTextAttrService.add(cfMaterialTextAttr);
+    }
+    
+    @RequestMapping("cf/material/textattr/edit")
+    public Ajax edit(CfMaterialTextAttr cfMaterialTextAttr) {
+        return this.cfMaterialTextAttrService.edit(cfMaterialTextAttr);
+    }
+    
+    @RequestMapping("cf/material/textattr/delete")
+    public Ajax delete(Integer attr_id) {
+        return  this.cfMaterialTextAttrService.delete(attr_id);
+    }
+    
+    @RequestMapping("cf/material/textattr/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.cfMaterialTextAttrService.get(id));
+    }    
+}

+ 119 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfPatternControl.java

@@ -0,0 +1,119 @@
+package cn.hmsoft.mr.control.cf;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.cf.CfPatternDao;
+import cn.hmsoft.mr.data.model.cf.CfPattern;
+import cn.hmsoft.mr.helper.MaterialCacheHelper;
+import cn.hmsoft.mr.service.cf.CfPatternService;
+
+/**
+ * 模式管理控制器.
+ * @author zq
+ *
+ */
+@RestController
+public class CfPatternControl extends FrameControl {
+
+	@Autowired
+	private CfPatternService service;
+	
+	@Autowired
+	private CfPatternDao dao;
+	
+	/**
+	 * @param query : 查询条件
+	 */
+	@RequestMapping("cf/pattern/page")
+	public Ajax pageBatch(String query, Integer start, Integer limit, String order, String type) {
+		return new Ajax(this.dao.pagePattern(start, limit, query, getQueryOrder(order, type)));
+	}
+	
+	/**
+	 * @param pattern
+	 */
+	@RequestMapping("cf/pattern/add")
+	public Ajax addBatch(CfPattern pattern) {
+		this.authOptrRole(FrameResIdConst.RES_PATTERN_ADD);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (!org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			throw new BusinessException("只有管理员才能操作!");
+		}
+		this.service.addPattern(pattern, this.getFrameOptr());
+		MaterialCacheHelper.instance(true);
+		return new Ajax();
+	}
+	
+	/**
+	 *  模式-更新
+	 * @param batch
+	 */
+	@RequestMapping("cf/pattern/edit")
+	public Ajax editBatch(CfPattern pattern) {
+		this.authOptrRole(FrameResIdConst.RES_PATTERN_EDIT);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (!org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			throw new BusinessException("只有管理员才能操作!");
+		}
+		this.service.editPattern(pattern, this.getFrameOptr());
+		MaterialCacheHelper.instance(true);
+		return new Ajax();
+	}
+	
+	/**
+	 *  模式-删除
+	 * @param pattern_id:模式ID
+	 */
+	@RequestMapping("cf/pattern/delete")
+	public Ajax deleteBatch(Integer pattern_id) {
+		this.authOptrRole(FrameResIdConst.RES_PATTERN_DELETE);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (!org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			throw new BusinessException("只有管理员才能操作!");
+		}
+		this.service.deletePattern(pattern_id, this.getFrameOptr());
+		MaterialCacheHelper.instance(true);
+		return new Ajax();
+	}
+	
+	/**
+	 * 模式缓存前端查询
+	 * @return
+	 */
+	@RequestMapping("cf/pattern/chache/init")
+	public Ajax init() {
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("PatterMap", MaterialCacheHelper.instance().getPatternMap());
+		map.put("BatchMap", MaterialCacheHelper.instance().getBatchMap());
+		return new Ajax(map);
+	}
+	
+	/**
+	 * 获取当前的
+	 * @return
+	 */
+	@RequestMapping("cf/pattern/now/get")
+	public Ajax getNowTime() {
+		return new Ajax(LocalDateTime.now());
+	}
+	
+	/**
+	 * 获取当前的
+	 * @return
+	 */
+	@RequestMapping("cf/pattern/list")
+	public Ajax list() {
+		return new Ajax(this.dao.all());
+	}
+}

+ 61 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfPromiseInfoControl.java

@@ -0,0 +1,61 @@
+package cn.hmsoft.mr.control.cf;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.mr.data.dao.cf.CfPromiseInfoDao;
+import cn.hmsoft.mr.data.model.cf.CfPromiseInfo;
+import cn.hmsoft.mr.service.cf.CfPromiseInfoService;
+
+/**
+ * 承诺书配置
+ * @author zq
+ *
+ */
+@RestController
+public class CfPromiseInfoControl extends FrameControl {
+
+	@Autowired
+	private CfPromiseInfoService service;
+	@Autowired
+	private CfPromiseInfoDao dao;
+	
+	@RequestMapping("cf/promise/info/page.htm")
+	public Ajax findPromise(Integer school_id, String query, Integer start, Integer limit, String order, String type) {
+		if (school_id == null) {
+			return new Ajax(new Pager());
+		}
+		return new Ajax(this.dao.pagePromise(school_id, start, limit, query, getQueryOrder(order, type)));
+	}
+	
+	/**
+	 * @param def
+	 */
+	@RequestMapping("cf/promise/info/add.htm")
+	public Ajax addMaterialDef(CfPromiseInfo promise) {
+		this.service.addPromise(promise, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param def
+	 */
+	@RequestMapping("cf/promise/info/edit.htm")
+	public Ajax editMaterialDef(CfPromiseInfo promise) {
+		this.service.editPromise(promise, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * @param def_id
+	 */
+	@RequestMapping("cf/promise/info/delete.htm")
+	public Ajax deleteMaterialDef(Integer id) {
+		this.service.deletePromise(id, this.getFrameOptr());
+		return new Ajax();
+	}
+}

+ 139 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfSchoolControl.java

@@ -0,0 +1,139 @@
+package cn.hmsoft.mr.control.cf;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.helper.CollectionHelper;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.cf.CfSchoolDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.helper.ArtRegexHelper;
+import cn.hmsoft.mr.service.cf.CfSchoolService;
+
+/**   
+* @Description: 学校管理-控制类
+* @version: v1.0.0
+* @author: zq
+* @date: 2022年10月10
+*/
+@RestController
+public class CfSchoolControl extends FrameControl {
+
+	@Autowired
+	private CfSchoolService service;
+	@Autowired
+	private CfSchoolDao dao;
+	
+	/**
+	 *  所有可用的学校
+	 */
+	@RequestMapping("cf/school/list")
+	public Ajax listSchool() {
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+
+		if (org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			return new Ajax(this.dao.listMapBySql("select s.*,concat(s.school_code,'-',s.school_name) code_name from cf_school s"));
+		} else if (org.getDept_type().equals(MRConst.OrgType.School.toString())){
+			CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+					org.getDept_code(), org.getDept_id());
+			return new Ajax(this.dao.listMapBySql("select s.*,concat(s.school_code,'-',s.school_name) code_name from cf_school s where school_id=?", 
+					school.getSchool_id()));
+		}else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			return new Ajax(this.dao.listMapBySql("select s.*,concat(s.school_code,'-',s.school_name) code_name from cf_school s where DEPT_ID=(SELECT d.DEPT_PID FROM frame_dept d WHERE d.DEPT_ID=?)",
+					org.getDept_id()));
+		}
+		return null;
+	}
+
+	@RequestMapping("cf/school/second/list")
+	public Ajax second(Integer school_id) {
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			return new Ajax(this.dao.listMapBySql("SELECT d.* FROM frame_dept d WHERE d.DEPT_ID=?",
+					org.getDept_id()));
+		}
+		return new Ajax(this.dao.listMapBySql("SELECT d.*FROM frame_dept d WHERE d.DEPT_PID=(SELECT DEPT_ID FROM cf_school WHERE school_id=?)", school_id));
+	}
+	
+	@RequestMapping("frame/dept/list")
+	public Ajax list(String dept_type) {
+		if (dept_type.indexOf(",") > 0) {
+			String[] arr = dept_type.split(",");
+			return new Ajax(this.dao.listMapBySql("select d.*,concat(d.dept_code,'|',(case dept_type when 'Admin' then '管理|' when 'School' then '学校|' else '' end),d.dept_name) code_name from frame_dept d where d.dept_type in ('" + CollectionHelper.join(arr, "','") + "') order by dept_code"));
+		} else {
+			return new Ajax(this.dao.listMapBySql("select d.*,concat(d.dept_code,'|',(case dept_type when 'Admin' then '管理|' when 'School' then '学校|' else '' end),d.dept_name) code_name from frame_dept d where d.dept_type=? order by dept_code", dept_type));
+		}
+	}
+	
+	/**
+	 *  学校管理-分页查询
+	 * @param query : 查询条件
+	 */
+	@RequestMapping("cf/school/page")
+	public Ajax page(String query, Integer start, Integer limit, String order, String type) {
+		Integer school_id = null;
+		FrameOptr optr = this.getFrameOptr();
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (org==null||org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			school_id = null;
+		} else if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?", 
+					org.getDept_code(), org.getDept_id());
+			school_id = school.getSchool_id();
+		}
+		return new Ajax(this.dao.pageSchool(school_id, start, limit, query, getQueryOrder(order, type)));
+	}
+	
+	/**
+	 *  增加学校
+	 * @param school
+	 */
+	@RequestMapping("cf/school/add")
+	public Ajax addSchool(CfSchool school) {
+		this.authOptrRole(FrameResIdConst.RES_SCHOOL_ADD);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (!org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			throw new BusinessException("只有管理员才能操作!");
+		}
+		if (!ArtRegexHelper.isPositiveDigit(school.getSchool_code())) {
+			throw new BusinessException("学校代码只能是数字!");
+		}
+		school.setSchool_id(Integer.valueOf(school.getSchool_code()));
+		this.service.addSchool(school, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * 更新学校
+	 * @param school
+	 */
+	@RequestMapping("cf/school/edit")
+	public Ajax editSchool(CfSchool school) {
+		this.authOptrRole(FrameResIdConst.RES_SCHOOL_EDIT);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (!org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			throw new BusinessException("只有管理员才能操作!");
+		}
+		this.service.updateSchool(school, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	@RequestMapping("cf/school/delete")
+	public Ajax deleteSchool(Integer school_id) {
+		this.authOptrRole(FrameResIdConst.RES_SCHOOL_DELETE);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (!org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			throw new BusinessException("只有管理员才能操作!");
+		}
+		this.service.deleteSchool(school_id, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+}

+ 134 - 0
src/main/java/cn/hmsoft/mr/control/cf/CfSubjectControl.java

@@ -0,0 +1,134 @@
+package cn.hmsoft.mr.control.cf;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.helper.LocalDateHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.cf.CfSubjectDao;
+import cn.hmsoft.mr.data.dao.std.StdEnrolDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.cf.CfSubject;
+import cn.hmsoft.mr.service.cf.CfSubjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 配置表-科目信息配置表 控制器.
+ * 
+ * @author: shudonghui
+ * @date: 2023-07-19 13:53:41
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class CfSubjectControl extends FrameControl {
+
+    @Autowired
+    private CfSubjectService cfSubjectService;
+    @Autowired
+    private CfSubjectDao dao;
+    @Autowired
+    private StdEnrolDao enrolDao;
+	
+    @RequestMapping("cf/cfSubject/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type,Integer school_id,Integer batch_id) {
+        if(school_id==null) {
+            FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+            if (org == null || !org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+//                throw new BusinessException("只有学校老师才能操作!");
+            }else{
+                CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                        org.getDept_code(), org.getDept_id());
+                school_id=school.getSchool_id();
+            }
+
+        }
+        return new Ajax(this.cfSubjectService.page(query, start, limit, this.getQueryOrder(order, type),school_id,batch_id));
+    }
+    
+    @RequestMapping("cf/cfSubject/add")
+    public Ajax add(CfSubject cfSubject) {
+        return this.cfSubjectService.add(cfSubject);
+    }
+    
+    @RequestMapping("cf/cfSubject/edit")
+    public Ajax edit(CfSubject cfSubject) {
+        return this.cfSubjectService.edit(cfSubject);
+    }
+    
+    @RequestMapping("cf/cfSubject/delete")
+    public Ajax delete(Integer[] ids) {
+        return  this.cfSubjectService.delete(ids);
+    }
+    
+    @RequestMapping("cf/cfSubject/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.cfSubjectService.get(id));
+    }
+
+    @RequestMapping("cf/cfSubject/list")
+    public Ajax list(Integer school_id,Integer batch_id,String subject_type,Integer is_practice) {
+        return new Ajax(dao.listBySchoolBacth(school_id,batch_id,subject_type,is_practice));
+    }
+
+    @RequestMapping("cf/cfSubject/upload")
+    public Ajax uploadSubject(Integer school_id,Integer batch_id, MultipartFile file) {
+        List<CfSubject> subjects = new ArrayList<>();
+        List<List<String>> values = null;
+        int seq = 1;
+        try {
+            values = ExcelReaderHelper.readSheet(Objects.requireNonNull(file.getOriginalFilename()), file.getInputStream(), 1, 5);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new BusinessException("无法解析Excel文件,请根据模版上传笔试考场!");
+        }
+        FrameAssertUtil.hasValue(values, "没有解析到有效的考场信息,请根据模版上传!");
+        for (List<String> list : values) {
+            seq++;
+            if (StringHelper.isEmpty(list.get(0)) || StringHelper.isEmpty(list.get(1))
+                    || StringHelper.isEmpty(list.get(2)))
+                continue;
+            final CfSubject subject = new CfSubject();
+
+            subject.setSubject_code(list.get(1));
+            subject.setSubject_name(list.get(2));
+            subject.setEnrol_id(enrolDao.find("exam_id",list.get(0)).getEnrol_id());
+
+            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+            if (StringHelper.isNotEmpty(list.get(3))) {
+                String time = list.get(3).trim().replace(":", ":");
+                LocalDateTime start = LocalDateHelper.parseDateTime(time,dateFormatter);
+                FrameAssertUtil.isNotNull(start, "第【" + seq + "】行考试开始时间格式错误,请使用yyyy-MM-dd HH:mm格式!");
+                subject.setExam_end_time(time);
+            }
+            if (StringHelper.isNotEmpty(list.get(4))) {
+                String time = list.get(4).trim().replace(":", ":");
+                LocalDateTime start = LocalDateHelper.parseDateTime(time,dateFormatter);
+                FrameAssertUtil.isNotNull(start, "第【" + seq + "】行考试开始时间格式错误,请使用yyyy-MM-dd HH:mm格式!");
+                subject.setExam_end_time(time);
+            }
+            subject.setSchool_id(school_id);
+            subject.setBatch_id(batch_id);
+            subject.setSubject_type("科目4");
+            subjects.add(subject);
+        }
+        cfSubjectService.uploadSubject(subjects);
+        return new Ajax();
+
+    }
+}

+ 73 - 0
src/main/java/cn/hmsoft/mr/control/frame/FameWeixinSpecialControl.java

@@ -0,0 +1,73 @@
+package cn.hmsoft.mr.control.frame;
+
+import java.net.URLDecoder;
+import java.util.List;
+import java.util.Map;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.weixin.data.dao.WxTemplateDao;
+import cn.hmsoft.weixin.data.model.WxTemplate;
+import cn.hmsoft.weixin.util.WeiXinTemplateUtil;
+import cn.hmsoft.weixin.util.WeiXinUtil;
+
+@RestController
+public class FameWeixinSpecialControl extends FrameControl {
+
+	@Autowired
+	private WxTemplateDao daoTemplate;
+	
+	/*@RequestMapping("weixin/special/page")
+	public Ajax page(int start, int limit, String query, String order, String type) {
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (null == org || !org.getDept_type().equals(CfConst.OrgType.Master.toString())) {
+			throw new BusinessException("当前登录用户不是主考学校用户!");
+		}
+		WxDefine define = this.dao.findBySql(WxDefine.class, 
+				"select * from wx_define where app_id in (select appid from cf_school_weixin where dept_code=?)", org.getDept_code());
+		if (define == null) {
+			throw new BusinessException("找不到当前用户学校微信!");
+		}
+		return new Ajax(this.dao.pageWxTemplate(define.getWx_id(), start, limit, query, getQueryOrder(order, type)));
+	}*/
+	
+	//手工发送消息
+	@RequestMapping("weixin/special/send")
+	public Ajax send(int wx_id, String sql, WxTemplate template) {
+		try {
+			sql = URLDecoder.decode(sql, "UTF-8");
+		} catch (Exception e) {
+			throw new BusinessException("解码失败,输入的SQL有误,请检查!");
+		}
+		String v = sql.toLowerCase();
+		if (v.indexOf("update ") > -1 || v.indexOf("drop ") > -1 || v.indexOf("create ") > -1
+				|| v.indexOf("insert ") > -1 || v.indexOf("truncate ") > -1 || v.indexOf("delete ") > -1)
+			throw new BusinessException("检查到SQL注入,禁止此操作!");
+		List<Map<String, Object>> userArray = this.daoTemplate.listMapBySql(sql);
+		new Thread(new Runnable() {
+			public void run() {
+				String appId = WeiXinUtil.getWxDefine(wx_id).getApp_id();
+				for (Map<String, Object> map : userArray) {
+					if (!map.containsKey("open_id"))
+						continue;
+					String open_id = map.get("open_id").toString();
+					if (StringHelper.isEmpty(open_id))
+						continue;
+					
+					WeiXinTemplateUtil.sendWeiXinTemplateSpecial(appId, template, open_id, false);
+					try {
+						Thread.sleep(50);
+						
+					}catch(Exception e) {
+						
+					}
+				}
+			}
+		}).start();
+		return new Ajax();
+	}
+}

+ 58 - 0
src/main/java/cn/hmsoft/mr/control/frame/FrameOptrLocalControl.java

@@ -0,0 +1,58 @@
+package cn.hmsoft.mr.control.frame;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.dao.FrameOptrDao;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.service.FrameOptrService;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.cf.CfAspectDao;
+import cn.hmsoft.mr.data.model.cf.CfAspect;
+import cn.hmsoft.mr.data.model.cf.CfAspectOptr;
+import cn.hmsoft.mr.data.model.cf.CfMajor;
+import cn.hmsoft.mr.service.cf.CfAspectService;
+import cn.hmsoft.mr.service.frame.FrameOptrLocalService;
+import cn.hmsoft.sms.util.CollectionHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+public class FrameOptrLocalControl extends FrameControl {
+
+	@Autowired
+	private FrameOptrDao dao;
+	@Autowired
+	private FrameOptrLocalService service;
+
+	@RequestMapping("frame/optr/hasModifyTime.htm")
+	public Ajax hasModifyTime() {
+		FrameOptr frameOptr = this.getFrameOptr();
+		String object = dao.findObject(String.class, "select modify_time from frame_optr where optr_id=?", frameOptr.getOptr_id());
+		return new Ajax(object!= null);
+	}
+
+	@RequestMapping("frame/optr/updateModifyTime.htm")
+	public Ajax updateModifyTime() {
+		FrameOptr frameOptr = this.getFrameOptr();
+		service.updateModifyTime(frameOptr);
+		return new Ajax();
+	}
+}

+ 70 - 0
src/main/java/cn/hmsoft/mr/control/full/FinalFullScreenControl.java

@@ -0,0 +1,70 @@
+package cn.hmsoft.mr.control.full;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.mr.data.dao.std.StdApplyMainDao;
+
+/**
+ * 学术审核大屏展示控制器.
+ * @author zq
+ *
+ */
+@RestController
+public class FinalFullScreenControl extends FrameControl {
+
+	@Autowired
+	private StdApplyMainDao dao;
+	
+	/**
+	 * 仪表盘数据查询
+	 * @return
+	 */
+	@RequestMapping("full/final/gauge/data/stat.htm")
+	public Ajax gaugeChartStat(Integer school_id, Integer batch_id) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		//**********准考率********************
+		Integer total = this.dao.findObject(Integer.class, "select count(1) from std_apply_main where school_id=? and batch_id=?", school_id, batch_id);
+		Integer passCnt = this.getBatchPassCnt(school_id, batch_id);
+		map.put("passCnt", passCnt);//准考人数
+		map.put("total", total);//总考生人数
+		map.put("passPer", this.calPercent(passCnt, total));//准考百分百
+		//**********评分完成率***********************
+		//评分完成率=已评分总考生数/待学术审核总考生数
+		Integer scoreCnt = this.dao.findObject(Integer.class, "select count(1) from std_apply_main where school_id=? and batch_id=? and review_score is not null", school_id, batch_id);
+		map.put("scoreCnt", scoreCnt);//已评分总数
+		map.put("finalScorePer", this.calPercent(scoreCnt, passCnt));//审核完成百分比
+		//**********学术审核完成率********************
+		//导师学术审核完成率=审核完成导师人数/总导师人数
+		Integer finalPassCnt = this.dao.findObject(Integer.class, "select count(1) from review_sign where school_id=? and batch_id=?", school_id, batch_id);
+		Integer finalOptrCnt = this.dao.findObject(Integer.class, "select count(1) from cf_aspect where school_id=? and batch_id=?", school_id, batch_id);
+		map.put("finalPassCnt", finalPassCnt);//学术审核通过
+		map.put("finalPassPer", this.calPercent(finalPassCnt, finalOptrCnt));//导师学术审核完成率
+		return new Ajax();
+	}
+
+	/**
+	 * 获取批次准考人数.
+	 * @param school_id
+	 * @param batch_id
+	 * @return
+	 */
+	private Integer getBatchPassCnt(Integer school_id, Integer batch_id) {
+		return this.dao.findObject(Integer.class, "select sum(pass_cnt) from cf_aspect where school_id=? and batch_id=?", school_id, batch_id);
+	}
+	
+	private float calPercent(Integer a, Integer b) {
+		if (b == 0) {
+			return 0;
+		}
+		return new BigDecimal(a).multiply(new BigDecimal(100)).divide(new BigDecimal(b), 2, RoundingMode.HALF_UP).floatValue();
+	}
+}

+ 153 - 0
src/main/java/cn/hmsoft/mr/control/full/InitialFullScreenControl.java

@@ -0,0 +1,153 @@
+package cn.hmsoft.mr.control.full;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.mr.data.dao.std.StdApplyMainDao;
+
+/**
+ * 资格审核大屏展示控制器.
+ * @author zq
+ *
+ */
+@RestController
+public class InitialFullScreenControl extends FrameControl {
+
+	@Autowired
+	private StdApplyMainDao dao;
+	
+	/**
+	 * 仪表盘数据查询
+	 * @return
+	 */
+	@RequestMapping("full/initial/gauge/data/stat.htm")
+	public Ajax gaugeChartStat(Integer school_id, Integer batch_id) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		//**********考生提交********************
+		Integer total = this.dao.findObject(Integer.class, "select count(1) from std_apply_main where school_id=? and batch_id=?", school_id, batch_id);
+		Integer submitCnt = this.getSubmitCnt(school_id, batch_id);
+		map.put("submitCnt", submitCnt);//总提交人数
+		map.put("total", total);//总考生人数
+		map.put("submitPer", this.calPercent(submitCnt, total));//考生提交百分比
+		//**********审核完成***********************
+		//审核完成率=审核完成/提交数
+		Integer reviewCnt = this.getReviewDoneCnt(school_id, batch_id);
+		map.put("reviewCnt", reviewCnt);//审核数
+		map.put("reviewPer", this.calPercent(reviewCnt, submitCnt));//审核完成百分比
+		//**********审核通过********************
+		//审核通过率=审核通过/审核数
+		Integer approveCnt = this.dao.findObject(Integer.class, "select count(1) from std_apply_main where auth_time is not null and status in ('InitialAppr','FinalScore') and school_id=? and batch_id=?", school_id, batch_id);
+		map.put("approveCnt", approveCnt);//审核通过
+		map.put("approvePer", this.calPercent(approveCnt, reviewCnt));//审核通过百分比
+		return new Ajax(map);
+	}
+	
+	private Integer getSubmitCnt(Integer school_id, Integer batch_id) {
+		return this.dao.findObject(Integer.class, "select count(1) from std_apply_main where apply_time is not null and school_id=? and batch_id=?", school_id, batch_id);
+	}
+	
+	//审核完成数
+	private Integer getReviewDoneCnt(Integer school_id, Integer batch_id) {
+		return this.dao.findObject(Integer.class, "select count(1) from std_apply_main where auth_time is not null and status in ('InitialAppr','Reject','FinalScore') and school_id=? and batch_id=?", school_id, batch_id);
+	}
+	
+	private float calPercent(Integer a, Integer b) {
+		if (b == 0) {
+			return 0;
+		}
+		return new BigDecimal(a).multiply(new BigDecimal(100)).divide(new BigDecimal(b), 2, RoundingMode.HALF_UP).floatValue();
+	}
+	
+	/**
+	 * 考生提交数据--柱状图用.
+	 * @param school_id
+	 * @param batch_id
+	 * @return
+	 */
+	@RequestMapping("full/initial/std/submit/stat.htm")
+	public Ajax submitStat(Integer school_id, Integer batch_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select count(1) cnt,date_format(apply_time,'%Y-%m-%d') apply_date from std_apply_main 			");
+		sql.append(" where school_id=? and batch_id=? and apply_time is not null group by date_format(apply_time,'%Y-%m-%d')");
+		sql.append(" order by date_format(apply_time,'%Y-%m-%d') ");
+		List<Map<String, Object>> submitList = this.dao.listMapBySql(sql.toString(), school_id, batch_id);
+		//总考生人数
+		Integer total = this.dao.findObject(Integer.class, "select count(1) from std_apply_main where school_id=? and batch_id=?", school_id, batch_id);
+		Integer submitCnt = this.getSubmitCnt(school_id, batch_id);
+		Map<String, Object> map = new HashMap<String, Object>();
+		
+		List<Object> dateList = new ArrayList<Object>();
+		List<Object> dataList = new ArrayList<Object>();
+		for (Map<String, Object> m : submitList) {
+			dateList.add(m.get("apply_date"));
+			dataList.add(m.get("cnt"));
+		}
+		map.put("dateList", dateList);
+		map.put("dataList", dataList);
+		map.put("total", total);//总考生人数
+		map.put("submitCnt", submitCnt);//总提交人数
+		return new Ajax(map);
+	}
+	
+	/**
+	 * 审核完成数据--柱状图用.
+	 * @param school_id
+	 * @param batch_id
+	 * @return
+	 */
+	@RequestMapping("full/initial/std/auth/stat.htm")
+	public Ajax authStat(Integer school_id, Integer batch_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select count(1) cnt,date_format(auth_time,'%Y-%m-%d') auth_date from std_apply_main  ");
+		sql.append("where school_id=? and batch_id=? and status!='Apply' and auth_time is not null       ");
+		sql.append("group by date_format(auth_time,'%Y-%m-%d') order by date_format(auth_time,'%Y-%m-%d')");
+		List<Map<String, Object>> authList = this.dao.listMapBySql(sql.toString(), school_id, batch_id);
+		Integer total = this.getSubmitCnt(school_id, batch_id);
+		Map<String, Object> map = new HashMap<String, Object>();
+		List<Object> dateList = new ArrayList<Object>();
+		List<Object> dataList = new ArrayList<Object>();
+		for (Map<String, Object> m : authList) {
+			dateList.add(m.get("auth_date"));
+			dataList.add(m.get("cnt"));
+		}
+		map.put("dateList", dateList);
+		map.put("dataList", dataList);
+		map.put("total", total);
+		return new Ajax(map);
+	}
+	
+	/**
+	 * 审核通过数据--柱状图用.
+	 * @param school_id
+	 * @param batch_id
+	 * @return
+	 */
+	@RequestMapping("full/initial/std/auth/approve/stat.htm")
+	public Ajax authApproveStat(Integer school_id, Integer batch_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select count(1) cnt,date_format(auth_time,'%Y-%m-%d') approve_date from std_apply_main       ");
+		sql.append("where school_id=? and batch_id=? and status in ('InitialAppr','FinalScore') and auth_time is not null   ");
+		sql.append("group by date_format(auth_time,'%Y-%m-%d') order by date_format(auth_time,'%Y-%m-%d') ");
+		List<Map<String, Object>> authApproveList = this.dao.listMapBySql(sql.toString(), school_id, batch_id);
+		Integer total = this.getReviewDoneCnt(school_id, batch_id);
+		Map<String, Object> map = new HashMap<String, Object>();
+		List<Object> dateList = new ArrayList<Object>();
+		List<Object> dataList = new ArrayList<Object>();
+		for (Map<String, Object> m : authApproveList) {
+			dateList.add(m.get("approve_date"));
+			dataList.add(m.get("cnt"));
+		}
+		map.put("dateList", dateList);
+		map.put("dataList", dataList);
+		map.put("total", total);
+		return new Ajax(map);
+	}
+}

+ 781 - 0
src/main/java/cn/hmsoft/mr/control/imp/FinalScoreControl.java

@@ -0,0 +1,781 @@
+package cn.hmsoft.mr.control.imp;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletOutputStream;
+
+import org.apache.poi.hssf.util.HSSFColor.HSSFColorPredefined;
+import org.apache.poi.ss.usermodel.BorderStyle;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.RegionUtil;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
+import org.apache.poi.xssf.usermodel.XSSFFont;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.helper.JsonHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.log.LogHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.imp.FinalScoreDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.imp.FinalScore;
+import cn.hmsoft.mr.data.model.imp.FinalScoreVo;
+import cn.hmsoft.mr.service.imp.FinalScoreService;
+
+/**
+ * 登分、最终成绩
+ * @author zq
+ *
+ */
+@RestController
+public class FinalScoreControl extends FrameControl {
+
+	@Autowired
+	private FinalScoreService service;
+	@Autowired
+	private FinalScoreDao dao;
+	
+	@RequestMapping("std/final/score/classroomlist.htm")
+	public Ajax listClassroom(Integer school_id, Integer batch_id, boolean is_admin) {
+		if (is_admin) {
+			return new Ajax(this.dao.listMapBySql("select distinct class_room from final_score where school_id=? and batch_id=?", 
+					school_id, batch_id));
+		} else {
+			return new Ajax(this.dao.listMapBySql("select distinct class_room from final_score where school_id=? and batch_id=? and login_name=?", 
+					school_id, batch_id, this.getFrameOptr().getLogin_name()));
+		}
+	}
+	
+	//分组登分界面-按考场分组  默认排序
+	@RequestMapping("std/final/score/classroom/default/list.htm")
+    public Ajax list(Integer school_id, Integer batch_id, String class_room, boolean is_admin) {
+		return new Ajax(this.service.listByClassroom(false, school_id, batch_id, class_room, this.getFrameOptr(), is_admin));
+	}
+
+	//分组登分界面-按考场分组、分组、排名
+	@RequestMapping("std/final/score/classroom/level/list.htm")
+    public Ajax listByLevel(Integer school_id, Integer batch_id, String class_room, boolean is_admin) {
+		return new Ajax(this.service.listByClassroom(true, school_id, batch_id, class_room, this.getFrameOptr(), is_admin));
+	}
+	
+	@CrossOrigin
+    @RequestMapping("std/final/score/upload.htm")
+    public Ajax upload(MultipartFile file, Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+        final FrameOptr optr = this.getFrameOptr();
+        FrameDept org = this.dao.find(FrameDept.class, optr.getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能上传!");
+        }
+        LogHelper.info("optr_dept-->" + this.getFrameOptr().getOptr_dept() + ",school_code--->" + org.getDept_code());
+        LocalDateTime now = LocalDateTime.now();
+        Map<String, List<List<String>>> dataMap = ExcelReaderHelper.readExcel(file.getOriginalFilename(), file.getInputStream(), 1, 20);
+        List<List<String>> scoreRegiList = dataMap.get("Sheet1");
+
+        FrameThread thread = FrameThreadHelper.createThread("登分导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+                "数据处理完成", optr);
+        try {
+            new Thread(() -> {
+                this.service.uploadProcess(thread, school_id, batch_id, error_flag, scoreRegiList, file, optr, school);
+                FrameThreadHelper.completeThread(thread, "导入完成!");
+            }).start();
+        } catch (Exception e) {
+            FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+        }
+        return new Ajax(thread);
+    }
+	
+	//保存分数
+    @RequestMapping("std/final/score/save.htm")
+    public Ajax save(Integer school_id, Integer batch_id, String data_json) {
+        LogHelper.info("save final score ---->" + school_id + "," + batch_id);
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能保存!");
+        }
+        FinalScoreVo vo = JsonHelper.toObject(data_json, FinalScoreVo.class);
+        this.service.save(school_id, batch_id, vo, this.getFrameOptr());
+        //查询返回
+        //List<FinalScoreVo> retList = this.service.listByClassroom(school_id, batch_id, "");
+        return new Ajax();
+    }
+    
+    //保存录取意见
+    @RequestMapping("std/final/score/remark/save.htm")
+    public Ajax saveRemark(Integer school_id, Integer batch_id, String data_json) {
+        LogHelper.info("save remark ---->" + school_id + "," + batch_id);
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能保存!");
+        }
+        FinalScoreVo vo = JsonHelper.toObject(data_json, FinalScoreVo.class);
+        this.service.saveRemark(school_id, batch_id, vo, this.getFrameOptr());
+        //查询返回
+        //List<FinalScoreVo> retList = this.service.listByClassroom(school_id, batch_id, "");
+        return new Ajax();
+    }
+    
+	//删除上传
+    @RequestMapping("std/final/score/upload/delete.htm")
+    public Ajax deleteImp(Integer school_id, Integer batch_id) {
+        LogHelper.info("delete imp ---->" + school_id + "," + batch_id);
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能删除!");
+        }
+        this.service.delete(school_id, batch_id, this.getFrameOptr());
+        return new Ajax();
+    }
+	
+	//导出复试成绩单
+	@RequestMapping("std/final/score/export.htm")
+    public void export(Integer school_id, Integer batch_id, String class_room) {
+		XSSFWorkbook wb = new XSSFWorkbook();
+		XSSFSheet sheet = wb.createSheet("2024年博士研究生复试成绩单");
+		// 1.生成字体对象-总标题
+		XSSFFont fontTitle1 = wb.createFont();
+		fontTitle1.setFontHeightInPoints((short) 20);
+		fontTitle1.setFontName("新宋体");
+		fontTitle1.setColor(HSSFColorPredefined.BLACK.getIndex());
+		fontTitle1.setBold(true);
+		XSSFCellStyle styleTitle1 = wb.createCellStyle();
+		styleTitle1.setAlignment(HorizontalAlignment.CENTER);
+		styleTitle1.setVerticalAlignment(VerticalAlignment.CENTER);
+		styleTitle1.setFont(fontTitle1); // 调用字体样式对象
+		styleTitle1.setWrapText(false);
+		// 2.生成字体对象-表头
+		XSSFFont fontTitle2 = wb.createFont();
+		fontTitle2.setFontHeightInPoints((short) 11);
+		fontTitle2.setFontName("新宋体");
+		fontTitle2.setColor(HSSFColorPredefined.BLACK.getIndex());
+		fontTitle2.setBold(true);
+		XSSFCellStyle styleTitle2 = wb.createCellStyle();
+		styleTitle2.setAlignment(HorizontalAlignment.CENTER);
+		styleTitle2.setVerticalAlignment(VerticalAlignment.CENTER);
+		styleTitle2.setFont(fontTitle2); // 调用字体样式对象
+		styleTitle2.setWrapText(false);
+		// 3.内容样式
+		XSSFFont fontTitle3 = wb.createFont();
+		fontTitle3.setFontHeightInPoints((short) 10);
+		fontTitle3.setFontName("新宋体");
+		fontTitle3.setColor(HSSFColorPredefined.BLACK.getIndex());
+		XSSFCellStyle styleTitle3 = wb.createCellStyle();
+		styleTitle3.setAlignment(HorizontalAlignment.CENTER);
+		styleTitle3.setVerticalAlignment(VerticalAlignment.CENTER);
+		styleTitle3.setFont(fontTitle3); // 调用字体样式对象
+		styleTitle3.setWrapText(false);
+		// 4.签名
+		XSSFFont fontTitle4 = wb.createFont();
+		fontTitle4.setFontHeightInPoints((short) 12);
+		fontTitle4.setFontName("新宋体");
+		fontTitle4.setColor(HSSFColorPredefined.BLACK.getIndex());
+		XSSFCellStyle styleTitle4 = wb.createCellStyle();
+		styleTitle4.setAlignment(HorizontalAlignment.LEFT);
+		styleTitle4.setVerticalAlignment(VerticalAlignment.CENTER);
+		styleTitle4.setFont(fontTitle4); // 调用字体样式对象
+		styleTitle4.setWrapText(false);
+		
+		// 增加表格边框的样式 例子
+		styleTitle1.setBorderTop(BorderStyle.THIN);
+		styleTitle1.setBorderLeft(BorderStyle.THIN);
+		styleTitle1.setBorderTop(BorderStyle.THIN);
+		styleTitle1.setBorderBottom(BorderStyle.THIN);
+		styleTitle1.setBorderRight(BorderStyle.THIN);
+
+		styleTitle2.setBorderTop(BorderStyle.THIN);
+		styleTitle2.setBorderLeft(BorderStyle.THIN);
+		styleTitle2.setBorderTop(BorderStyle.THIN);
+		styleTitle2.setBorderBottom(BorderStyle.THIN);
+		styleTitle2.setBorderRight(BorderStyle.THIN);
+
+		styleTitle3.setBorderTop(BorderStyle.THIN);
+		styleTitle3.setBorderLeft(BorderStyle.THIN);
+		styleTitle3.setBorderTop(BorderStyle.THIN);
+		styleTitle3.setBorderBottom(BorderStyle.THIN);
+		styleTitle3.setBorderRight(BorderStyle.THIN);
+
+		int index = 0;
+		XSSFRow row1 = sheet.createRow(index);
+		row1.setHeight((short) 600);
+		XSSFCell cellTitle = row1.createCell(0);
+		cellTitle.setCellStyle(styleTitle1);
+		cellTitle.setCellValue("2024年博士研究生复试成绩单");
+		CellRangeAddress range1 = new CellRangeAddress(index, index, 0, 13);
+		sheet.addMergedRegion(range1);
+		RegionUtil.setBorderBottom(BorderStyle.THIN, range1, sheet);
+		RegionUtil.setBorderRight(BorderStyle.THIN, range1, sheet);
+		RegionUtil.setBorderLeft(BorderStyle.THIN, range1, sheet);
+		RegionUtil.setBorderTop(BorderStyle.THIN, range1, sheet);
+		index++;
+		
+		sheet.setColumnWidth(0, 3 * 256);//序
+		sheet.setColumnWidth(1, 8 * 256);//姓名
+		sheet.setColumnWidth(2, 14 * 256);//准考证编号
+		sheet.setColumnWidth(3, 14 * 256);//专业
+		sheet.setColumnWidth(4, 10 * 256);//专业综合面试
+		sheet.setColumnWidth(5, 10 * 256);//专业综合面试90%
+		sheet.setColumnWidth(6, 10 * 256);//外语面试10%
+		sheet.setColumnWidth(7, 10 * 256);//复试面试成绩
+		sheet.setColumnWidth(8, 10 * 256);//初试总成绩
+		sheet.setColumnWidth(9, 12 * 256);//初试成绩权重比
+		sheet.setColumnWidth(10, 8 * 256);//总成绩
+		sheet.setColumnWidth(11, 6 * 256);//成绩排名
+		sheet.setColumnWidth(12, 8 * 256);//导师
+		sheet.setColumnWidth(13, 10 * 256);//拟录取意见
+		
+		XSSFRow rowTitle = sheet.createRow(index);
+		XSSFCell cell0 = rowTitle.createCell(0);
+		cell0.setCellStyle(styleTitle2);
+		cell0.setCellValue("序");
+		XSSFCell cell1 = rowTitle.createCell(1);
+		cell1.setCellStyle(styleTitle2);
+		cell1.setCellValue("姓名");
+		XSSFCell cell2 = rowTitle.createCell(2);
+		cell2.setCellStyle(styleTitle2);
+		cell2.setCellValue("准考证编号");
+		XSSFCell cell3 = rowTitle.createCell(3);
+		cell3.setCellStyle(styleTitle2);
+		cell3.setCellValue("专业");
+		XSSFCell cell4 = rowTitle.createCell(4);
+		cell4.setCellStyle(styleTitle2);
+		cell4.setCellValue("专业\r\n综合面试");
+		cell4.getCellStyle().setWrapText(true);
+		XSSFCell cell5 = rowTitle.createCell(5);
+		cell5.setCellStyle(styleTitle2);
+		cell5.setCellValue("专业\r\n综合面试\n90%");
+		cell5.getCellStyle().setWrapText(true);
+		XSSFCell cell6 = rowTitle.createCell(6);
+		cell6.setCellStyle(styleTitle2);
+		cell6.setCellValue("外语\r\n面试10%");
+		cell6.getCellStyle().setWrapText(true);
+		XSSFCell cell7 = rowTitle.createCell(7);
+		cell7.setCellStyle(styleTitle2);
+		cell7.setCellValue("复试\r\n总成绩");
+		cell7.getCellStyle().setWrapText(true);
+		XSSFCell cell8 = rowTitle.createCell(8);
+		cell8.setCellStyle(styleTitle2);
+		cell8.setCellValue("初试\r\n总分");
+		cell8.getCellStyle().setWrapText(true);
+		XSSFCell cell9 = rowTitle.createCell(9);
+		cell9.setCellStyle(styleTitle2);
+		cell9.setCellValue("初试总成绩\r\n(权重)");
+		cell9.getCellStyle().setWrapText(true);
+		XSSFCell cell10 = rowTitle.createCell(10);
+		cell10.setCellStyle(styleTitle2);
+		cell10.setCellValue("总成绩");
+		XSSFCell cell11 = rowTitle.createCell(11);
+		cell11.setCellStyle(styleTitle2);
+		cell11.setCellValue("成绩\r\n排名");
+		cell11.getCellStyle().setWrapText(true);
+		XSSFCell cell12 = rowTitle.createCell(12);
+		cell12.setCellStyle(styleTitle2);
+		cell12.setCellValue("导师");
+		XSSFCell cell13 = rowTitle.createCell(13);
+		cell13.setCellStyle(styleTitle2);
+		cell13.setCellValue("拟录取\r\n意见");
+		cell13.getCellStyle().setWrapText(true);
+		index++;
+		
+		String groupNameStr = "";
+		List<FinalScoreVo> classRoomList = this.service.listByClassroom(true, school_id, batch_id, class_room, this.getFrameOptr(), true);
+		for (FinalScoreVo room : classRoomList) {
+			for (List<FinalScore> gList : room.getGroup_list()) {
+				//显示每个考场的分组名
+				XSSFRow groupNameRow = sheet.createRow(index);
+				XSSFCell gCell = groupNameRow.createCell(0);//序
+				gCell.setCellStyle(styleTitle3);
+				gCell.setCellValue(gList.get(0).getGroup_name());
+				groupNameStr = groupNameStr + gList.get(0).getGroup_name() + "、";
+				//显示分组最终成绩明显
+				for (int i=0; i<gList.size(); i++) {
+					if (i == 0) {
+						XSSFRow rows = sheet.createRow(index);
+						rows.setHeight((short) 500);
+						XSSFCell tCell0 = rows.createCell(0);//分组名
+						tCell0.setCellStyle(styleTitle2);
+						tCell0.setCellValue(gList.get(i).getGroup_name());
+						CellRangeAddress rangeGn = new CellRangeAddress(index, index, 0, 13);
+						sheet.addMergedRegion(rangeGn);
+						RegionUtil.setBorderBottom(BorderStyle.THIN, rangeGn, sheet);
+						RegionUtil.setBorderRight(BorderStyle.THIN, rangeGn, sheet);
+						RegionUtil.setBorderLeft(BorderStyle.THIN, rangeGn, sheet);
+						RegionUtil.setBorderTop(BorderStyle.THIN, rangeGn, sheet);
+						index ++;
+					} 
+					FinalScore score = gList.get(i);
+					XSSFRow rows = sheet.createRow(index);
+					rows.setHeight((short) 350);
+					XSSFCell tCell0 = rows.createCell(0);//序
+					tCell0.setCellStyle(styleTitle3);
+					tCell0.setCellValue(score.getScore_seq() != null ? score.getScore_seq().toString() : "");
+
+					XSSFCell tCell1 = rows.createCell(1);//姓名
+					tCell1.setCellStyle(styleTitle3);
+					tCell1.setCellValue(score.getStd_name());
+					
+					XSSFCell tCell2 = rows.createCell(2);//准考证编号
+					tCell2.setCellStyle(styleTitle3);
+					tCell2.setCellValue(score.getTicket_no());
+
+					XSSFCell tCell3 = rows.createCell(3);//专业
+					tCell3.setCellStyle(styleTitle3);
+					tCell3.setCellValue(score.getGroup_name());
+
+					XSSFCell tCell4 = rows.createCell(4);//专业\n综合面试
+					tCell4.setCellStyle(styleTitle3);
+					tCell4.setCellValue(score.getFinal_score());
+
+					String final_score_weight = StringHelper.isNotEmpty(score.getFinal_score_weight()) ? score.getFinal_score_weight() : "0";
+					XSSFCell tCell5 = rows.createCell(5);//专业\n综合面试\n90%
+					tCell5.setCellStyle(styleTitle3);
+					tCell5.setCellValue(final_score_weight);
+
+					String foreign_score = StringHelper.isNotEmpty(score.getForeign_score()) ? score.getForeign_score() : "0";
+					XSSFCell tCell6 = rows.createCell(6);//外语\n面试10%
+					tCell6.setCellStyle(styleTitle3);
+					tCell6.setCellValue(foreign_score);
+
+					BigDecimal faceTotalScore = new BigDecimal(final_score_weight).add(new BigDecimal(foreign_score));
+					XSSFCell tCell7 = rows.createCell(7);//复试\n面试成绩
+					tCell7.setCellStyle(styleTitle3);
+					tCell7.setCellValue(faceTotalScore.toPlainString());
+					
+					XSSFCell tCell8 = rows.createCell(8);//初试总成绩
+					tCell8.setCellStyle(styleTitle3);
+					tCell8.setCellValue(StringHelper.isNotEmpty(score.getFirst_score()) ? score.getFirst_score() : "");
+					
+					XSSFCell tCell9 = rows.createCell(9);//初试成绩\n权重比
+					tCell9.setCellStyle(styleTitle3);
+					tCell9.setCellValue(StringHelper.isNotEmpty(score.getFirst_score_weight()) ? score.getFirst_score_weight() : "");
+					
+					XSSFCell tCell10 = rows.createCell(10);//总成绩
+					tCell10.setCellStyle(styleTitle3);
+					tCell10.setCellValue(StringHelper.isNotEmpty(score.getTotal_score()) ? score.getTotal_score() : "");
+					
+					XSSFCell tCell11 = rows.createCell(11);//成绩\n排名
+					tCell11.setCellStyle(styleTitle3);
+					tCell11.setCellValue(score.getScore_level() != null ? score.getScore_level().toString() : "");
+					
+					XSSFCell tCell12 = rows.createCell(12);//导师
+					tCell12.setCellStyle(styleTitle3);
+					tCell12.setCellValue(score.getDoct_name());
+					
+					XSSFCell tCell13 = rows.createCell(13);//拟录取意见
+					tCell13.setCellStyle(styleTitle3);
+					tCell13.setCellValue(score.getAdmiss_remark());
+					index++;
+				}
+			}
+		}
+		//签字栏
+		index += 2;
+		XSSFRow signRow = sheet.createRow(index);
+		XSSFCell sginCell = signRow.createCell(0);
+		sginCell.setCellStyle(styleTitle4);
+		sginCell.setCellValue("复试导师组签字:                 ");
+		CellRangeAddress rangeSign = new CellRangeAddress(index, index, 0, 3);
+		sheet.addMergedRegion(rangeSign);
+		//输出
+		ServletOutputStream outStream = null;
+		if (groupNameStr.length() > 0) {
+			groupNameStr = groupNameStr.substring(0, groupNameStr.length() - 1);
+		}
+		try {
+			String fileName = groupNameStr + ".xlsx";
+			fileName = URLEncoder.encode(fileName, "UTF-8");
+			fileName = new String(fileName.getBytes(), "ISO-8859-1");
+			ByteArrayOutputStream os = new ByteArrayOutputStream();
+			wb.write(os);
+			this.getResponse().reset();
+			this.getResponse().setContentType("application/x-msdownload");
+			this.getResponse().setHeader("Content-Disposition", "attachment; filename=" + fileName);
+			outStream = this.getResponse().getOutputStream();
+			outStream.write(os.toByteArray());
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (outStream != null) {
+				try {
+					outStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (wb != null) {
+				try {
+					wb.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+	
+	public static void main(String[] args) {
+		XSSFWorkbook wb = new XSSFWorkbook();
+		XSSFSheet sheet = wb.createSheet("2024年博士研究生复试成绩单");
+		// 1.生成字体对象-总标题
+		XSSFFont fontTitle1 = wb.createFont();
+		fontTitle1.setFontHeightInPoints((short) 20);
+		fontTitle1.setFontName("新宋体");
+		fontTitle1.setColor(HSSFColorPredefined.BLACK.getIndex());
+		fontTitle1.setBold(true);
+		XSSFCellStyle styleTitle1 = wb.createCellStyle();
+		styleTitle1.setAlignment(HorizontalAlignment.CENTER);
+		styleTitle1.setVerticalAlignment(VerticalAlignment.CENTER);
+		styleTitle1.setFont(fontTitle1); // 调用字体样式对象
+		styleTitle1.setWrapText(false);
+		// 2.生成字体对象-表头
+		XSSFFont fontTitle2 = wb.createFont();
+		fontTitle2.setFontHeightInPoints((short) 11);
+		fontTitle2.setFontName("新宋体");
+		fontTitle2.setColor(HSSFColorPredefined.BLACK.getIndex());
+		fontTitle2.setBold(true);
+		XSSFCellStyle styleTitle2 = wb.createCellStyle();
+		styleTitle2.setAlignment(HorizontalAlignment.CENTER);
+		styleTitle2.setVerticalAlignment(VerticalAlignment.CENTER);
+		styleTitle2.setFont(fontTitle2); // 调用字体样式对象
+		styleTitle2.setWrapText(false);
+		// 3.内容样式
+		XSSFFont fontTitle3 = wb.createFont();
+		fontTitle3.setFontHeightInPoints((short) 10);
+		fontTitle3.setFontName("新宋体");
+		fontTitle3.setColor(HSSFColorPredefined.BLACK.getIndex());
+		XSSFCellStyle styleTitle3 = wb.createCellStyle();
+		styleTitle3.setAlignment(HorizontalAlignment.CENTER);
+		styleTitle3.setVerticalAlignment(VerticalAlignment.CENTER);
+		styleTitle3.setFont(fontTitle3); // 调用字体样式对象
+		styleTitle3.setWrapText(false);
+		// 4.签名
+		XSSFFont fontTitle4 = wb.createFont();
+		fontTitle4.setFontHeightInPoints((short) 12);
+		fontTitle4.setFontName("新宋体");
+		fontTitle4.setColor(HSSFColorPredefined.BLACK.getIndex());
+		XSSFCellStyle styleTitle4 = wb.createCellStyle();
+		styleTitle4.setAlignment(HorizontalAlignment.LEFT);
+		styleTitle4.setVerticalAlignment(VerticalAlignment.CENTER);
+		styleTitle4.setFont(fontTitle4); // 调用字体样式对象
+		styleTitle4.setWrapText(false);
+		
+		// 增加表格边框的样式 例子
+		styleTitle1.setBorderTop(BorderStyle.THIN);
+		styleTitle1.setBorderLeft(BorderStyle.THIN);
+		styleTitle1.setBorderTop(BorderStyle.THIN);
+		styleTitle1.setBorderBottom(BorderStyle.THIN);
+		styleTitle1.setBorderRight(BorderStyle.THIN);
+
+		styleTitle2.setBorderTop(BorderStyle.THIN);
+		styleTitle2.setBorderLeft(BorderStyle.THIN);
+		styleTitle2.setBorderTop(BorderStyle.THIN);
+		styleTitle2.setBorderBottom(BorderStyle.THIN);
+		styleTitle2.setBorderRight(BorderStyle.THIN);
+
+		styleTitle3.setBorderTop(BorderStyle.THIN);
+		styleTitle3.setBorderLeft(BorderStyle.THIN);
+		styleTitle3.setBorderTop(BorderStyle.THIN);
+		styleTitle3.setBorderBottom(BorderStyle.THIN);
+		styleTitle3.setBorderRight(BorderStyle.THIN);
+
+		int index = 0;
+		XSSFRow row1 = sheet.createRow(index);
+		row1.setHeight((short) 600);
+		XSSFCell cellTitle = row1.createCell(0);
+		cellTitle.setCellStyle(styleTitle1);
+		cellTitle.setCellValue("2024年博士研究生复试成绩单");
+		CellRangeAddress range1 = new CellRangeAddress(index, index, 0, 13);
+		sheet.addMergedRegion(range1);
+		RegionUtil.setBorderBottom(BorderStyle.THIN, range1, sheet);
+		RegionUtil.setBorderRight(BorderStyle.THIN, range1, sheet);
+		RegionUtil.setBorderLeft(BorderStyle.THIN, range1, sheet);
+		RegionUtil.setBorderTop(BorderStyle.THIN, range1, sheet);
+		index++;
+		
+		sheet.setColumnWidth(0, 3 * 256);//序
+		sheet.setColumnWidth(1, 8 * 256);//姓名
+		sheet.setColumnWidth(2, 14 * 256);//准考证编号
+		sheet.setColumnWidth(3, 14 * 256);//专业
+		sheet.setColumnWidth(4, 10 * 256);//专业综合面试
+		sheet.setColumnWidth(5, 10 * 256);//专业综合面试90%
+		sheet.setColumnWidth(6, 10 * 256);//外语面试10%
+		sheet.setColumnWidth(7, 10 * 256);//复试面试成绩
+		sheet.setColumnWidth(8, 10 * 256);//初试总成绩
+		sheet.setColumnWidth(9, 12 * 256);//初试成绩权重比
+		sheet.setColumnWidth(10, 8 * 256);//总成绩
+		sheet.setColumnWidth(11, 6 * 256);//成绩排名
+		sheet.setColumnWidth(12, 8 * 256);//导师
+		sheet.setColumnWidth(13, 10 * 256);//拟录取意见
+		
+		XSSFRow rowTitle = sheet.createRow(index);
+		XSSFCell cell0 = rowTitle.createCell(0);
+		cell0.setCellStyle(styleTitle2);
+		cell0.setCellValue("序");
+		XSSFCell cell1 = rowTitle.createCell(1);
+		cell1.setCellStyle(styleTitle2);
+		cell1.setCellValue("姓名");
+		XSSFCell cell2 = rowTitle.createCell(2);
+		cell2.setCellStyle(styleTitle2);
+		cell2.setCellValue("准考证编号");
+		XSSFCell cell3 = rowTitle.createCell(3);
+		cell3.setCellStyle(styleTitle2);
+		cell3.setCellValue("专业");
+		XSSFCell cell4 = rowTitle.createCell(4);
+		cell4.setCellStyle(styleTitle2);
+		cell4.setCellValue("专业\r\n综合面试");
+		cell4.getCellStyle().setWrapText(true);
+		XSSFCell cell5 = rowTitle.createCell(5);
+		cell5.setCellStyle(styleTitle2);
+		cell5.setCellValue("专业\r\n综合面试\n90%");
+		cell5.getCellStyle().setWrapText(true);
+		XSSFCell cell6 = rowTitle.createCell(6);
+		cell6.setCellStyle(styleTitle2);
+		cell6.setCellValue("外语\r\n面试10%");
+		cell6.getCellStyle().setWrapText(true);
+		XSSFCell cell7 = rowTitle.createCell(7);
+		cell7.setCellStyle(styleTitle2);
+		cell7.setCellValue("复试\r\n总成绩");
+		cell7.getCellStyle().setWrapText(true);
+		XSSFCell cell8 = rowTitle.createCell(8);
+		cell8.setCellStyle(styleTitle2);
+		cell8.setCellValue("初试\r\n总分");
+		cell8.getCellStyle().setWrapText(true);
+		XSSFCell cell9 = rowTitle.createCell(9);
+		cell9.setCellStyle(styleTitle2);
+		cell9.setCellValue("初试总成绩\r\n(权重)");
+		cell9.getCellStyle().setWrapText(true);
+		XSSFCell cell10 = rowTitle.createCell(10);
+		cell10.setCellStyle(styleTitle2);
+		cell10.setCellValue("总成绩");
+		XSSFCell cell11 = rowTitle.createCell(11);
+		cell11.setCellStyle(styleTitle2);
+		cell11.setCellValue("成绩\r\n排名");
+		cell11.getCellStyle().setWrapText(true);
+		XSSFCell cell12 = rowTitle.createCell(12);
+		cell12.setCellStyle(styleTitle2);
+		cell12.setCellValue("导师");
+		XSSFCell cell13 = rowTitle.createCell(13);
+		cell13.setCellStyle(styleTitle2);
+		cell13.setCellValue("拟录取\r\n意见");
+		cell13.getCellStyle().setWrapText(true);
+		index++;
+		
+		String groupNameStr = "";
+		List<FinalScoreVo> classRoomList = new ArrayList<FinalScoreVo>();
+		FinalScoreVo vo1 = new FinalScoreVo();
+		List<List<FinalScore>> group_list1 = new ArrayList<List<FinalScore>>();
+		vo1.setClass_room("考场1111");
+		vo1.setGroup_list(group_list1);
+		List<FinalScore> dyList = new ArrayList<FinalScore>();//电影
+		FinalScore dyScore1 = new FinalScore();
+		dyScore1.setClass_room("考场1111");dyScore1.setScore_seq(1);dyScore1.setStd_name("张超杰");dyScore1.setFirst_score("240");dyScore1.setFinal_score_weight("80.00");
+		dyScore1.setTicket_no("842013130300251");dyScore1.setGroup_name("电影学");dyScore1.setScore_level(1);dyScore1.setDoct_name("丁亚平");
+		FinalScore dyScore2 = new FinalScore();
+		dyScore2.setClass_room("考场1111");dyScore2.setScore_seq(2);dyScore2.setStd_name("贾艺华");dyScore2.setFirst_score("234");dyScore2.setFinal_score_weight("78.00");
+		dyScore2.setTicket_no("842013130300254");dyScore2.setGroup_name("电影学");dyScore2.setScore_level(1);dyScore2.setDoct_name("丁亚平");
+		FinalScore dyScore3 = new FinalScore();
+		dyScore3.setClass_room("考场1111");dyScore3.setScore_seq(3);dyScore3.setStd_name("崔明明");dyScore3.setFirst_score("232");dyScore3.setFinal_score_weight("77.00");
+		dyScore3.setTicket_no("842013130300259");dyScore3.setGroup_name("电影学");dyScore3.setScore_level(1);dyScore3.setDoct_name("高小健");
+		dyList.add(dyScore1);dyList.add(dyScore2);dyList.add(dyScore3);
+		
+		List<FinalScore> syList = new ArrayList<FinalScore>();//摄影
+		FinalScore syScore1 = new FinalScore();
+		syScore1.setClass_room("考场1111");syScore1.setScore_seq(1);syScore1.setStd_name("沈孝怡");syScore1.setFirst_score("229");syScore1.setFinal_score_weight("76.00");
+		syScore1.setTicket_no("842013130300251");syScore1.setGroup_name("摄影学");syScore1.setScore_level(1);syScore1.setDoct_name("李树峰");
+		FinalScore syScore2 = new FinalScore();
+		syScore2.setClass_room("考场1111");syScore2.setScore_seq(2);syScore2.setStd_name("李静怡");syScore2.setFirst_score("226");syScore2.setFinal_score_weight("75.00");
+		syScore2.setTicket_no("842013130300254");syScore2.setGroup_name("摄影学");syScore2.setScore_level(1);syScore2.setDoct_name("李树峰");
+		FinalScore syScore3 = new FinalScore();
+		syScore3.setClass_room("考场1111");syScore3.setScore_seq(3);syScore3.setStd_name("田相洁");syScore3.setFirst_score("234");syScore3.setFinal_score_weight("78.00");
+		syScore3.setTicket_no("842013130300259");syScore3.setGroup_name("摄影学");syScore3.setScore_level(1);syScore3.setDoct_name("李树峰");
+		syList.add(syScore1);syList.add(syScore2);syList.add(syScore3);
+		
+		group_list1.add(dyList);
+		group_list1.add(syList);
+		
+		FinalScoreVo vo2 = new FinalScoreVo();
+		List<List<FinalScore>> group_list2 = new ArrayList<List<FinalScore>>();
+		vo2.setClass_room("考场2222");
+		vo2.setGroup_list(group_list2);
+		
+		List<FinalScore> gbdsList = new ArrayList<FinalScore>();//广播电视艺术学
+		FinalScore gbdsScore1 = new FinalScore();
+		gbdsScore1.setClass_room("考场1111");gbdsScore1.setScore_seq(1);gbdsScore1.setStd_name("张超杰");gbdsScore1.setFirst_score("240");gbdsScore1.setFinal_score_weight("80.00");
+		gbdsScore1.setTicket_no("842013130300251");gbdsScore1.setGroup_name("广播电视艺术学");gbdsScore1.setScore_level(1);gbdsScore1.setDoct_name("丁亚平");
+		FinalScore gbdsScore2 = new FinalScore();
+		gbdsScore2.setClass_room("考场1111");gbdsScore2.setScore_seq(2);gbdsScore2.setStd_name("贾艺华");gbdsScore2.setFirst_score("234");gbdsScore2.setFinal_score_weight("78.00");
+		gbdsScore2.setTicket_no("842013130300254");gbdsScore2.setGroup_name("广播电视艺术学");gbdsScore2.setScore_level(1);gbdsScore2.setDoct_name("丁亚平");
+		FinalScore gbdsScore3 = new FinalScore();
+		gbdsScore3.setClass_room("考场1111");gbdsScore3.setScore_seq(3);gbdsScore3.setStd_name("崔明明");gbdsScore3.setFirst_score("232");gbdsScore3.setFinal_score_weight("77.00");
+		gbdsScore3.setTicket_no("842013130300259");gbdsScore3.setGroup_name("广播电视艺术学");gbdsScore3.setScore_level(1);gbdsScore3.setDoct_name("高小健");
+		gbdsList.add(gbdsScore1);gbdsList.add(gbdsScore2);gbdsList.add(gbdsScore3);
+		
+		group_list2.add(gbdsList);
+		
+		classRoomList.add(vo1);
+		classRoomList.add(vo2);
+		
+		
+		for (FinalScoreVo room : classRoomList) {
+			for (List<FinalScore> gList : room.getGroup_list()) {
+				//显示每个考场的分组名
+				XSSFRow groupNameRow = sheet.createRow(index);
+				XSSFCell gCell = groupNameRow.createCell(0);//序
+				gCell.setCellStyle(styleTitle3);
+				gCell.setCellValue(gList.get(0).getGroup_name());
+				groupNameStr = groupNameStr + gList.get(0).getGroup_name() + "、";
+				//显示分组最终成绩明显
+				for (int i=0; i<gList.size(); i++) {
+					if (i == 0) {
+						XSSFRow rows = sheet.createRow(index);
+						rows.setHeight((short) 500);
+						XSSFCell tCell0 = rows.createCell(0);//分组名
+						tCell0.setCellStyle(styleTitle2);
+						tCell0.setCellValue(gList.get(i).getGroup_name());
+						CellRangeAddress rangeGn = new CellRangeAddress(index, index, 0, 13);
+						sheet.addMergedRegion(rangeGn);
+						RegionUtil.setBorderBottom(BorderStyle.THIN, rangeGn, sheet);
+						RegionUtil.setBorderRight(BorderStyle.THIN, rangeGn, sheet);
+						RegionUtil.setBorderLeft(BorderStyle.THIN, rangeGn, sheet);
+						RegionUtil.setBorderTop(BorderStyle.THIN, rangeGn, sheet);
+						index ++;
+					} 
+					FinalScore score = gList.get(i);
+					XSSFRow rows = sheet.createRow(index);
+					rows.setHeight((short) 350);
+					XSSFCell tCell0 = rows.createCell(0);//序
+					tCell0.setCellStyle(styleTitle3);
+					tCell0.setCellValue(score.getScore_seq() != null ? score.getScore_seq().toString() : "");
+
+					XSSFCell tCell1 = rows.createCell(1);//姓名
+					tCell1.setCellStyle(styleTitle3);
+					tCell1.setCellValue(score.getStd_name());
+					
+					XSSFCell tCell2 = rows.createCell(2);//准考证编号
+					tCell2.setCellStyle(styleTitle3);
+					tCell2.setCellValue(score.getTicket_no());
+
+					XSSFCell tCell3 = rows.createCell(3);//专业
+					tCell3.setCellStyle(styleTitle3);
+					tCell3.setCellValue(score.getGroup_name());
+
+					XSSFCell tCell4 = rows.createCell(4);//专业\n综合面试
+					tCell4.setCellStyle(styleTitle3);
+					tCell4.setCellValue(score.getFinal_score());
+
+					String final_score_weight = StringHelper.isNotEmpty(score.getFinal_score_weight()) ? score.getFinal_score_weight() : "0";
+					XSSFCell tCell5 = rows.createCell(5);//专业\n综合面试\n90%
+					tCell5.setCellStyle(styleTitle3);
+					tCell5.setCellValue(final_score_weight);
+
+					String foreign_score = StringHelper.isNotEmpty(score.getForeign_score()) ? score.getForeign_score() : "0";
+					XSSFCell tCell6 = rows.createCell(6);//外语\n面试10%
+					tCell6.setCellStyle(styleTitle3);
+					tCell6.setCellValue(foreign_score);
+
+					BigDecimal faceTotalScore = new BigDecimal(final_score_weight).add(new BigDecimal(foreign_score));
+					XSSFCell tCell7 = rows.createCell(7);//复试\n面试成绩
+					tCell7.setCellStyle(styleTitle3);
+					tCell7.setCellValue(faceTotalScore.toPlainString());
+					
+					XSSFCell tCell8 = rows.createCell(8);//初试总成绩
+					tCell8.setCellStyle(styleTitle3);
+					tCell8.setCellValue(score.getFinal_score());
+					
+					XSSFCell tCell9 = rows.createCell(9);//初试成绩\n权重比
+					tCell9.setCellStyle(styleTitle3);
+					tCell9.setCellValue(score.getFinal_score_weight());
+					
+					XSSFCell tCell10 = rows.createCell(10);//总成绩
+					tCell10.setCellStyle(styleTitle3);
+					tCell10.setCellValue(score.getTotal_score());
+					
+					XSSFCell tCell11 = rows.createCell(11);//成绩\n排名
+					tCell11.setCellStyle(styleTitle3);
+					tCell11.setCellValue(score.getScore_level());
+					
+					XSSFCell tCell12 = rows.createCell(12);//导师
+					tCell12.setCellStyle(styleTitle3);
+					tCell12.setCellValue(score.getDoct_name());
+					
+					XSSFCell tCell13 = rows.createCell(13);//拟录取意见
+					tCell13.setCellStyle(styleTitle3);
+					tCell13.setCellValue(score.getAdmiss_remark());
+					index++;
+				}
+			}
+		}
+		//签字栏
+		index += 2;
+		XSSFRow signRow = sheet.createRow(index);
+		XSSFCell sginCell = signRow.createCell(0);
+		sginCell.setCellStyle(styleTitle4);
+		sginCell.setCellValue("复试导师组签字:                 ");
+		CellRangeAddress rangeSign = new CellRangeAddress(index, index, 0, 3);
+		sheet.addMergedRegion(rangeSign);
+		//输出
+		if (groupNameStr.length() > 0) {
+			groupNameStr = groupNameStr.substring(0, groupNameStr.length() - 1);
+		}
+		OutputStream outStream = null;
+		try {
+			String fileName = groupNameStr + ".xlsx";
+			fileName = URLEncoder.encode(fileName, "UTF-8");
+			fileName = new String(fileName.getBytes(), "ISO-8859-1");
+			ByteArrayOutputStream os = new ByteArrayOutputStream();
+			wb.write(os);
+			outStream = new FileOutputStream("C:\\Users\\admin\\Desktop\\t.xlsx");
+			outStream.write(os.toByteArray());
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if (outStream != null) {
+				try {
+					outStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (wb != null) {
+				try {
+					wb.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+}

+ 94 - 0
src/main/java/cn/hmsoft/mr/control/imp/ImpDataAdmitControl.java

@@ -0,0 +1,94 @@
+package cn.hmsoft.mr.control.imp;
+
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.log.LogHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.imp.ImpDataAdmitDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.imp.ImpDataAdmit;
+import cn.hmsoft.mr.service.imp.ImpDataAdmitService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 初始导入表 根据学校区分 控制器.
+ * 
+ * @author: shudonghui
+ * @date: 2022-11-30 10:15:31
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ImpDataAdmitControl extends FrameControl {
+
+    @Autowired
+    private ImpDataAdmitService service;
+
+    @Autowired
+    private ImpDataAdmitDao dao;
+
+
+    //基础专业数据分页
+    @RequestMapping("imp/impDataAdmit/page.htm")
+    public Ajax pageBase(Integer school_id, Integer batch_id, String query, Integer limit, Integer start, String order, String type) {
+        //招办或者专业老师只查当前学校
+        return new Ajax(this.dao.pageData(school_id, batch_id, start, limit, query, getQueryOrder(order, type)));
+    }
+
+    @RequestMapping("imp/impDataAdmit/upload.htm")
+    public Ajax upload(MultipartFile file, Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+        final FrameOptr optr = this.getFrameOptr();
+        FrameDept org = this.dao.find(FrameDept.class, optr.getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能上传!");
+        }
+        LogHelper.info("optr_dept-->" + this.getFrameOptr().getOptr_dept() + ",school_code--->" + org.getDept_code());
+        List<List<String>> array = ExcelReaderHelper.readSheet(file.getOriginalFilename(), file.getInputStream());
+
+        FrameThread thread = FrameThreadHelper.createThread("考生导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+                "数据处理完成", optr);
+        try {
+            new Thread(() -> {
+                this.service.uploadProcess(thread, batch_id, error_flag, array, file, optr, school);
+            }).start();
+        } catch (Exception e) {
+            FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+        }
+        return new Ajax(thread);
+    }
+
+    @RequestMapping("imp/impDataAdmit/delete.htm")
+    public Ajax deleteImp(Integer school_id, Integer batch_id) {
+        LogHelper.info("delete imp ---->" + school_id + "," + batch_id);
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能上传!");
+        }
+        this.service.deleteImp(school, batch_id, this.getFrameOptr());
+        return new Ajax();
+    }
+}

+ 121 - 0
src/main/java/cn/hmsoft/mr/control/imp/ImpDataControl.java

@@ -0,0 +1,121 @@
+package cn.hmsoft.mr.control.imp;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.log.LogHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.imp.ImpDataDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.service.imp.ImpDataService;
+
+/**
+ * 数据导入处理.
+ * @author zq
+ *
+ */
+@RestController
+public class ImpDataControl extends FrameControl {
+
+	@Autowired
+	private ImpDataService service;
+	@Autowired
+	private ImpDataDao dao;
+	
+	//基础专业数据分页
+	@RequestMapping("imp/data/page.htm")
+	public Ajax pageBase(Integer school_id, Integer batch_id, String query, Integer limit, Integer start, String order, String type) {
+		//招办或者专业老师只查当前学校
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+		if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) || !org.getDept_code().equals(school.getSchool_code())) {
+			throw new BusinessException("只有当前学校招办老师才能上传!");
+		}
+		return new Ajax(this.dao.pageData(school_id, batch_id, org.getDept_code(), start, limit, query, getQueryOrder(order, type)));
+	}
+	
+	@CrossOrigin
+	@RequestMapping("imp/data/upload.htm")
+	public Ajax upload(MultipartFile file, Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+		final FrameOptr optr = this.getFrameOptr();
+		FrameDept org = this.dao.find(FrameDept.class, optr.getOptr_dept());
+		CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+		if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) || 
+				!org.getDept_code().equals(school.getSchool_code())) {
+			throw new BusinessException("只有当前学校招办老师才能上传!");
+		}
+		//毕业论文、实践课 主考学校和助学单位都可以上传
+		LogHelper.info("optr_dept-->" + this.getFrameOptr().getOptr_dept() + ",school_code--->" + org.getDept_code());
+		LocalDateTime now = LocalDateTime.now();
+		List<List<String>> array = ExcelReaderHelper.readSheet(file.getOriginalFilename(), file.getInputStream());
+		
+		FrameThread thread = FrameThreadHelper.createThread("考生导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+				"数据处理完成", optr);
+		try {
+			new Thread(() -> {
+				this.service.uploadProcess(thread, batch_id, error_flag, array, file, optr, school);
+			}).start();
+		} catch (Exception e) {
+			FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+		}
+		return new Ajax(thread);
+	}
+	
+	@RequestMapping("imp/data/delete.htm")
+	public Ajax deleteImp(Integer school_id, Integer batch_id) {
+		LogHelper.info("delete imp ---->" + school_id + "," + batch_id);
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+		if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) || 
+				!org.getDept_code().equals(school.getSchool_code())) {
+			throw new BusinessException("只有当前学校招办老师才能上传!");
+		}
+		FrameAssertUtil.isEqual(this.dao.findObject(Integer.class, "select count(1) from std_apply_main where school_id=? and batch_id=?", 
+				school_id, batch_id), 0, "存在考生上传材料,不能删除考生!");
+		this.service.deleteImp(school, batch_id, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	@CrossOrigin
+	@RequestMapping("imp/data/upload/incre")
+	public Ajax uploadIncre(MultipartFile file, Integer school_id, Integer batch_id, String error_flag, String thread_flag) 
+			throws BusinessException, IOException {
+		final FrameOptr optr = this.getFrameOptr();
+		FrameDept org = this.dao.find(FrameDept.class, optr.getOptr_dept());
+		CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+		if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) || 
+				!org.getDept_code().equals(school.getSchool_code())) {
+			throw new BusinessException("只有当前学校招办老师才能上传!");
+		}
+		List<List<String>> array = ExcelReaderHelper.readSheet(file.getOriginalFilename(), file.getInputStream());
+		// 线程模式
+		FrameThread thread = FrameThreadHelper.createThread("增量导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+				"数据处理完成", optr);
+		try {
+			new Thread(() -> {
+				this.service.uploadIncreProcess(thread, batch_id, error_flag, array, file, optr, school);
+			}).start();
+		} catch (Exception e) {
+			FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+		}
+		return new Ajax(thread);
+	}
+}

+ 167 - 0
src/main/java/cn/hmsoft/mr/control/imp/ImpDataScoreControl.java

@@ -0,0 +1,167 @@
+package cn.hmsoft.mr.control.imp;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.helper.LocalDateHelper;
+import cn.hmsoft.helper.excel.Excel2007Writer;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.log.LogHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.imp.ImpDataScoreDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.imp.ImpDataScore;
+import cn.hmsoft.mr.service.imp.ImpDataScoreService;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 初始导入表 根据学校区分 控制器.
+ *
+ * @author: shudonghui
+ * @date: 2022-11-30 10:15:31
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ImpDataScoreControl extends FrameControl {
+
+    @Autowired
+    private ImpDataScoreService service;
+    @Autowired
+    private ImpDataScoreDao dao;
+
+
+    //基础专业数据分页
+    @RequestMapping("imp/impDataScore/page.htm")
+    public Ajax pageBase(Integer school_id, Integer batch_id, String query, Integer limit, Integer start, String order, String type) {
+        //招办或者专业老师只查当前学校
+        return new Ajax(this.dao.pageData(school_id, batch_id, start, limit, query, getQueryOrder(order, type)));
+    }
+
+    @CrossOrigin
+    @RequestMapping("imp/impDataScore/upload.htm")
+    public Ajax upload(MultipartFile file, Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+        final FrameOptr optr = this.getFrameOptr();
+        FrameDept org = this.dao.find(FrameDept.class, optr.getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能上传!");
+        }
+        LogHelper.info("optr_dept-->" + this.getFrameOptr().getOptr_dept() + ",school_code--->" + school.getSchool_code());
+        List<List<String>> array = ExcelReaderHelper.readSheet(file.getOriginalFilename(), file.getInputStream());
+
+        FrameThread thread = FrameThreadHelper.createThread("考生导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+                "数据处理完成", optr);
+        try {
+            new Thread(() -> {
+                this.service.uploadProcess(thread, batch_id, error_flag, array, file, optr, school);
+            }).start();
+        } catch (Exception e) {
+            FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+        }
+        return new Ajax(thread);
+    }
+
+    @CrossOrigin
+    @RequestMapping("imp/impDataScore/check/upload.htm")
+    public Ajax checkUpload(MultipartFile file, Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+        final FrameOptr optr = this.getFrameOptr();
+        FrameDept org = this.dao.find(FrameDept.class, optr.getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能上传!");
+        }
+        LogHelper.info("optr_dept-->" + this.getFrameOptr().getOptr_dept() + ",school_code--->" + school.getSchool_code());
+        List<List<String>> array = ExcelReaderHelper.readSheet(file.getOriginalFilename(), file.getInputStream());
+
+        FrameThread thread = FrameThreadHelper.createThread("考生导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+                "数据处理完成", optr);
+        try {
+            new Thread(() -> {
+                this.service.uploadCheckProcess(thread, batch_id, error_flag, array, file, optr, school);
+            }).start();
+        } catch (Exception e) {
+            FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+        }
+        return new Ajax(thread);
+    }
+
+    @RequestMapping("imp/impDataScore/delete.htm")
+    public Ajax deleteImp(Integer school_id, Integer batch_id) {
+        LogHelper.info("delete imp ---->" + school_id + "," + batch_id);
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能上传!");
+        }
+        this.service.deleteImp(school, batch_id, this.getFrameOptr());
+        return new Ajax();
+    }
+
+    @RequestMapping("imp/impDataScore/export.htm")
+    public void export(Integer school_id, Integer batch_id) {
+        List<List<Object>> values = new ArrayList<List<Object>>();
+        List<Object> headerList = new ArrayList<Object>();
+        ServletOutputStream outStream = null;
+        headerList.add("姓名");
+        headerList.add("准考证号");
+        values.add(headerList);
+        String sql = " select * from imp_data_score t where t.school_id=? and t.batch_id=? and checked='Active'";
+        List<ImpDataScore> list = this.dao.listBySql(ImpDataScore.class, sql, school_id, batch_id);
+
+        for (ImpDataScore score : list) {
+            List<Object> rowList = new ArrayList<Object>();
+            rowList.add(score.getStd_name());
+            rowList.add(score.getTicket_no());
+            values.add(rowList);
+        }
+        try {
+            String fileName = "成绩复核申请" + LocalDateHelper.formatNoSplit(LocalDate.now()) + ".xlsx";
+            fileName = URLEncoder.encode(fileName, "UTF-8");
+            fileName = new String(fileName.getBytes(), "ISO-8859-1");
+            XSSFWorkbook wb = Excel2007Writer.createExcel(values);
+            ByteArrayOutputStream os = new ByteArrayOutputStream();
+            wb.write(os);
+            this.getResponse().reset();
+            this.getResponse().setContentType("application/x-msdownload");
+            this.getResponse().setHeader("Content-Disposition", "attachment; filename=" + fileName);
+            outStream = this.getResponse().getOutputStream();
+            outStream.write(os.toByteArray());
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outStream != null) {
+                try {
+                    outStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+
+    }
+}

+ 99 - 0
src/main/java/cn/hmsoft/mr/control/ly/LyGroupControl.java

@@ -0,0 +1,99 @@
+package cn.hmsoft.mr.control.ly;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.helper.JsonHelper;
+import cn.hmsoft.log.LogHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.ly.LyGroupDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.cf.CfSubject;
+import cn.hmsoft.mr.data.model.ly.LyGroup;
+import cn.hmsoft.mr.service.ly.LyGroupService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 编排分组设置 控制器.
+ * 
+ * @author: shudonghui
+ * @date: 2023-08-17 16:42:56
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class LyGroupControl extends FrameControl {
+
+    @Autowired
+    private LyGroupService lyGroupService;
+    @Autowired
+    private LyGroupDao dao;
+
+    @RequestMapping("ly/lyGroup/list")
+    public Ajax list( Integer school_id, Integer batch_id) {
+        return new Ajax(this.lyGroupService.list(school_id,batch_id));
+    }
+
+    @RequestMapping("ly/lyGroup/delete")
+    public Ajax delete( Integer group_id) {
+        return new Ajax(this.lyGroupService.delete(group_id));
+    }
+
+    @RequestMapping("ly/lyGroup/add")
+    public Ajax add(LyGroup lyGroup,String subject_json) {
+        List<CfSubject> subjectArray = JsonHelper.fromJson(subject_json, CfSubject.class);
+        lyGroup.setCfSubjectList(subjectArray);
+        return new Ajax(this.lyGroupService.unionGroup(lyGroup));
+    }
+
+    @RequestMapping("ly/layout/build")
+    public Ajax build(Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+        final FrameOptr optr = this.getFrameOptr();
+        FrameDept org = this.dao.find(FrameDept.class, optr.getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能编排!");
+        }
+
+        LogHelper.info("optr_dept-->" + this.getFrameOptr().getOptr_dept() + ",school_code--->" + org.getDept_code());
+
+
+        FrameThread thread = FrameThreadHelper.createThread("考试编排线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+                "数据处理完成", optr);
+        try {
+            new Thread(() -> {
+                this.lyGroupService.build(thread, school_id, batch_id, error_flag, optr,school);
+
+            }).start();
+        } catch (Exception e) {
+            FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+        }
+        return new Ajax(thread);
+    }
+
+    @RequestMapping("ly/layout/delete")
+    public Ajax deleteLayout(Integer school_id, Integer batch_id) {
+        return this.lyGroupService.deleteLayout(school_id, batch_id, this.getFrameOptr());
+    }
+
+    @RequestMapping("ly/layout/count")
+    public Ajax count(Integer school_id, Integer batch_id) {
+        return this.lyGroupService.count(school_id, batch_id);
+    }
+
+}

+ 136 - 0
src/main/java/cn/hmsoft/mr/control/ly/LyRoomControl.java

@@ -0,0 +1,136 @@
+package cn.hmsoft.mr.control.ly;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.ly.LyGroupDao;
+import cn.hmsoft.mr.data.dao.ly.LyRoomDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.ly.LyGroup;
+import cn.hmsoft.mr.data.model.ly.LyRoom;
+import cn.hmsoft.mr.service.ly.LyRoomService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 控制器.
+ *
+ * @author: shudonghui
+ * @date: 2023-07-18 09:37:12
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class LyRoomControl extends FrameControl {
+
+    @Autowired
+    private LyRoomService lyRoomService;
+    @Autowired
+    private LyRoomDao dao;
+    @Autowired
+    private LyGroupDao lyGroupDao;
+
+    @RequestMapping("ly/lyRoom/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type, Integer school_id, Integer batch_id) {
+        if (school_id == null) {
+            FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+            if (org == null || !org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+//                throw new BusinessException("只有学校老师才能操作!");
+            } else {
+                CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                        org.getDept_code(), org.getDept_id());
+                school_id = school.getSchool_id();
+            }
+
+        }
+        return new Ajax(this.lyRoomService.page(query, start, limit, this.getQueryOrder(order, type), school_id, batch_id));
+    }
+
+    @RequestMapping("ly/lyRoom/add")
+    public Ajax add(LyRoom lyRoom) {
+        return this.lyRoomService.add(lyRoom);
+    }
+
+    @RequestMapping("ly/lyRoom/edit")
+    public Ajax edit(LyRoom lyRoom) {
+        return this.lyRoomService.edit(lyRoom);
+    }
+
+    @RequestMapping("ly/lyRoom/delete")
+    public Ajax delete(Integer room_id) {
+        return this.lyRoomService.delete(room_id);
+    }
+
+    @RequestMapping("ly/lyRoom/deleteByGroup")
+    public Ajax deleteByGroup(Integer group_id) {
+        return this.lyRoomService.deleteByGroup(group_id);
+    }
+
+    @RequestMapping("ly/lyRoom/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.lyRoomService.get(id));
+    }
+
+    @RequestMapping("ly/lyRoom/upload")
+    public Ajax uploadRoom(int ly_group_id, MultipartFile file) {
+        List<LyRoom> roomArray = new ArrayList<>();
+        List<List<String>> values = null;
+        int seq = 1;
+        try {
+            values = ExcelReaderHelper.readSheet(Objects.requireNonNull(file.getOriginalFilename()), file.getInputStream(), 1, 5);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new BusinessException("无法解析Excel文件,请根据模版上传笔试考场!");
+        }
+        FrameAssertUtil.hasValue(values, "没有解析到有效的考场信息,请根据模版上传!");
+        LyGroup lyGroup = lyGroupDao.find(ly_group_id);
+        for (List<String> list : values) {
+            seq++;
+            if (StringHelper.isEmpty(list.get(0)) || StringHelper.isEmpty(list.get(1))
+                    || StringHelper.isEmpty(list.get(2)))
+                continue;
+            LyRoom room = new LyRoom();
+            room.setRoom_code(list.get(0).trim());
+            room.setRoom_name(list.get(1).trim());
+            room.setRoom_addr(list.get(2).trim());
+            try {
+                room.setRoom_capacity(Integer.parseInt(list.get(3).trim()));
+            } catch (Exception e) {
+                throw new BusinessException("第【" + seq + "】行考场容量格式错误,请填入数字!");
+            }
+
+            if (StringHelper.isNotEmpty(list.get(4))) {
+                // 省内外考场
+                if ("是".equals(list.get(4).trim()))
+                    room.setIs_provence(FrameStatus.Active.toString());
+                else if ("否".equals(list.get(4).trim()))
+                    room.setIs_provence(FrameStatus.InActive.toString());
+                else
+                    throw new BusinessException("第【" + seq + "】行省内考场格式错误,只能填为空或者填,是、否!");
+            }else
+                room.setIs_provence(FrameStatus.InActive.toString());
+            room.setGroup_id(ly_group_id);
+            room.setBatch_id(lyGroup.getBatch_id());
+            room.setSchool_id(lyGroup.getSchool_id());
+            room.setLayout_num(0);
+            roomArray.add(room);
+        }
+        lyRoomService.uploadRoom(roomArray);
+        return new Ajax();
+
+    }
+}

+ 462 - 0
src/main/java/cn/hmsoft/mr/control/review/InitialReviewControl.java

@@ -0,0 +1,462 @@
+package cn.hmsoft.mr.control.review;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.ServletOutputStream;
+
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.application.SpringHelper;
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.helper.LocalDateHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.helper.excel.Excel2007Writer;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.log.LogHelper;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.std.StdApplyMainDao;
+import cn.hmsoft.mr.data.model.cf.CfBatch;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.std.StdApplyMain;
+import cn.hmsoft.mr.helper.ThreadPoolHelper;
+import cn.hmsoft.mr.service.cf.CfAspectService;
+import cn.hmsoft.mr.service.review.InitialReviewService;
+
+/**
+ * 资格审核控制器.
+ * @author zq
+ *
+ */
+@RestController
+public class InitialReviewControl extends FrameControl {
+
+	@Autowired
+	private InitialReviewService iService;
+	@Autowired
+	private StdApplyMainDao mDao;
+	
+	static {
+		//轮询初审结束线程
+		ThreadPoolHelper.Scheduler.scheduleAtFixedRate(new Runnable() {
+
+			@Override
+			public void run() {
+				LogHelper.info("-----------定时轮询线程执行----------");
+				CfAspectService service = SpringHelper.getBean(CfAspectService.class);
+				service.updatePassCnt();
+			}
+			
+		}, 1, 15, TimeUnit.MINUTES);
+	}
+	
+	/**
+	 * 初审分页-optr_id为空查当前登录人员的,否则根据指定optr_id查询
+	 * @param query : 查询条件
+	 * @param batch_id: 批次ID
+	 * @param status: 状态
+	 */
+	@RequestMapping("review/initial/page.htm")
+	public Ajax pageInitial(String query, Integer start, Integer limit, String order, String type, Integer school_id, 
+			Integer batch_id, Integer optr_id, String status) {
+		FrameDept org = this.mDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			CfSchool school = this.mDao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?", 
+					org.getDept_code(), org.getDept_id());
+			school_id = school.getSchool_id();
+		}else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			CfSchool school = this.mDao.findBySql(CfSchool.class, "SELECT *  FROM cf_school WHERE DEPT_ID=(SELECT d.DEPT_PID FROM frame_dept d WHERE d.DEPT_ID=?)", org.getDept_id());
+			school_id = school.getSchool_id();
+			deptId=org.getDept_id();
+		}
+		//总账号查询所有
+		if (StringHelper.isNotEmpty(status) && !status.equals("AdmQueryAll")) {
+//			if (optr_id == null) {
+//				optr_id = this.getFrameOptr().getOptr_id();
+//			}
+		}
+		return new Ajax(this.mDao.pageInitialPage(start, limit, query, getQueryOrder(order, type), 
+				school_id,deptId, batch_id, optr_id, status));
+	}
+
+	@RequestMapping("review/initial/page/export.htm")
+	public void pageInitialExport(String query, Integer start, Integer limit, String order, String type, Integer school_id,
+							Integer batch_id, Integer optr_id, String status) {
+		FrameDept org = this.mDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			CfSchool school = this.mDao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+					org.getDept_code(), org.getDept_id());
+			school_id = school.getSchool_id();
+		}else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			CfSchool school = this.mDao.findBySql(CfSchool.class, "SELECT *  FROM cf_school WHERE DEPT_ID=(SELECT d.DEPT_PID FROM frame_dept d WHERE d.DEPT_ID=?)", org.getDept_id());
+			school_id = school.getSchool_id();
+			deptId=org.getDept_id();
+		}
+		//总账号查询所有
+		if (StringHelper.isNotEmpty(status) && !status.equals("AdmQueryAll")) {
+//			if (optr_id == null) {
+//				optr_id = this.getFrameOptr().getOptr_id();
+//			}
+		}
+		Pager pager = this.mDao.pageInitialPage(0, Integer.MAX_VALUE, query, getQueryOrder(order, type),
+				school_id, deptId, batch_id, optr_id, status);
+
+		List<List<Object>> values = new ArrayList<List<Object>>();
+		List<Object> headerList = new ArrayList<Object>();
+		ServletOutputStream outStream = null;
+		headerList.add("#");
+		headerList.add("姓名");
+		headerList.add("报名号");
+		headerList.add("联系电话");
+		headerList.add("考生类型");
+		headerList.add("专业方向");
+		headerList.add("导师名称");
+		headerList.add("状态");
+		values.add(headerList);
+
+
+		List<Map<String, Object>> list = (List<Map<String, Object>>)pager.getRecords();
+		int i = 1;
+		for(Map<String,Object> map: list) {
+			List<Object> rowList = new ArrayList<Object>();
+			rowList.add(i);
+			rowList.add(map.get("std_name"));
+			rowList.add(map.get("exam_id"));
+			rowList.add(map.get("std_mobile"));
+			rowList.add(FrameDictUtil.getFrameDictText("StdEduType", map.get("std_edu").toString()));
+			rowList.add(map.get("aspect_name"));
+			rowList.add(map.get("enr_doct_name"));
+			rowList.add(FrameDictUtil.getFrameDictText("ApplyStatus", map.get("status").toString()));
+			values.add(rowList);
+			i++;
+		}
+		try {
+			String fileName =  "考生审核列表" + LocalDateHelper.formatNoSplit(LocalDate.now()) + ".xlsx";
+			fileName = URLEncoder.encode(fileName, "UTF-8");
+			fileName = new String(fileName.getBytes(), "ISO-8859-1");
+			XSSFWorkbook wb = Excel2007Writer.createExcel(values);
+			ByteArrayOutputStream os = new ByteArrayOutputStream();
+			wb.write(os);
+			this.getResponse().reset();
+			this.getResponse().setContentType("application/x-msdownload");
+			this.getResponse().setHeader("Content-Disposition", "attachment; filename=" + fileName);
+			outStream = this.getResponse().getOutputStream();
+			outStream.write(os.toByteArray());
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if(outStream != null) {
+				try {
+					outStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+	
+	//初审通过-明细
+	@RequestMapping("review/initial/detail/approve.htm")
+	public Ajax approveDetail(Integer[] detail_ids, String remark) {
+		this.authOptrRole(FrameResIdConst.RES_INITIAL_REVIEW_DETAIL_APPROV);
+		this.iService.approveDetail(detail_ids, remark, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	//初审驳回-明细
+	@RequestMapping("review/initial/detail/reject.htm")
+	public Ajax rejectDetail(Integer[] detail_ids, String remark) {
+		this.authOptrRole(FrameResIdConst.RES_INITIAL_REVIEW_DETAIL_REJECT);
+		this.iService.rejectDetail(detail_ids, remark, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * 主记录评审
+	 * @param apply_id
+	 * @param initial_remark
+	 * @return
+	 */
+	//初审通过-主记录
+	@RequestMapping("review/initial/main/approve.htm")
+	public Ajax approveMain(Integer apply_id, String initial_remark) {
+		this.authOptrRole(FrameResIdConst.RES_INITIAL_REVIEW_APPROV);
+		StdApplyMain main = this.mDao.findBySql("select s.std_name,m.* from std_apply_main m,std_reg s where apply_id=? and s.school_id=m.school_id and s.std_id=m.std_id", 
+				apply_id);
+		this.validateInitialTime(main); // TODO  暂时放开
+		this.iService.approveMain(apply_id, initial_remark, main.getStd_name(), this.getFrameOptr());
+		return new Ajax();
+	}
+
+	private void validateInitialTime(StdApplyMain main) {
+		CfBatch batch = this.mDao.find(CfBatch.class, main.getBatch_id());
+		LocalDateTime now = LocalDateTime.now();
+		if (now.isBefore(batch.getIntial_review_start()) || now.isAfter(batch.getIntial_review_end())) {
+			throw new BusinessException("当前时间不在初审时间范围内[" + LocalDateHelper.format(batch.getIntial_review_start()) + " 至 " + LocalDateHelper.format(batch.getIntial_review_end()) + "]");
+		}
+	}
+	
+	//初审驳回-主记录
+	@RequestMapping("review/initial/main/reject.htm")
+	public Ajax rejectMain(Integer apply_id, String initial_remark) {
+		this.authOptrRole(FrameResIdConst.RES_INITIAL_REVIEW_REJECT);
+		StdApplyMain main = this.mDao.findBySql("select s.std_name,m.* from std_apply_main m,std_reg s where apply_id=? and s.school_id=m.school_id and s.std_id=m.std_id", 
+				apply_id);
+		this.validateInitialTime(main); // TODO 暂时不限制
+		this.iService.rejectMain(apply_id, initial_remark, main.getStd_name(), this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	//批量初审通过并发消息-主记录
+	@RequestMapping("review/initial/main/approve/batch.htm")
+	public Ajax approveAndNoticeBatch(Integer school_id, Integer batch_id, String major_ids, String optr_ids, String detail_type,
+			String initial_remark) {
+		//this.authOptrRole(FrameResIdConst.RES_INITIAL_REVIEW_APPROV);
+		FrameDept org = this.mDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			deptId=org.getDept_id();
+		}
+		Pager pager = this.mDao.initialNoticePage(0, Integer.MAX_VALUE, null, null, 
+				school_id, deptId, batch_id, major_ids, optr_ids, detail_type);
+		List<Map<String, Object>> list = (List<Map<String, Object>>)pager.getRecords();
+		for (Map<String, Object> map : list) {
+			try {
+				this.iService.approveMain(Integer.valueOf(map.get("apply_id").toString()), initial_remark, 
+						map.get("std_name").toString(), this.getFrameOptr());
+			} catch (Exception e) {
+				LogHelper.error(e);
+			}
+		}
+		return new Ajax();
+	}
+	
+	//批量初审驳回并发消息-主记录
+	@RequestMapping("review/initial/main/reject/batch.htm")
+	public Ajax rejectAndNoticeBatch(Integer school_id, Integer batch_id, String major_ids, String optr_ids, String detail_type, 
+			String initial_remark) {
+		//this.authOptrRole(FrameResIdConst.RES_INITIAL_REVIEW_REJECT);
+		FrameDept org = this.mDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			deptId=org.getDept_id();
+		}
+		Pager pager = this.mDao.initialNoticePage(0, Integer.MAX_VALUE, null, null, 
+				school_id, deptId, batch_id, major_ids, optr_ids, detail_type);
+		List<Map<String, Object>> list = (List<Map<String, Object>>)pager.getRecords();
+		for (Map<String, Object> map : list) {
+			try {
+				this.iService.rejectMain(Integer.valueOf(map.get("apply_id").toString()), 
+						initial_remark, map.get("std_name").toString(), this.getFrameOptr());
+			} catch (Exception e) {
+				LogHelper.error(e);
+			}
+		}
+		return new Ajax();
+	}
+	
+	/**
+	 * 初审进度分页.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	@RequestMapping("review/progress/page.htm")
+	public Ajax pageReviewProgress(String query, Integer start, Integer limit, String order, String type, 
+			Integer school_id, Integer batch_id) {
+		if (batch_id == null) {
+			return new Ajax(new Pager());
+		}
+		QueryOrder queryOrder = getQueryOrder(order, type);
+		if (queryOrder == null) {
+			queryOrder = new QueryOrder("b.optr_id");
+		}
+		FrameDept org = this.mDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			deptId=org.getDept_id();
+		}
+		return new Ajax(this.mDao.pageInitialReviewProgress(start, limit, query, queryOrder, 
+				school_id,deptId, batch_id));
+	}
+	
+	//截止时间已过不符合考生发送  初审未通过通知
+	@RequestMapping("review/initial/notice/fail.htm")
+	public Ajax noticeFail(Integer batch_id) {
+		//this.authOptrRole(FrameResIdConst.RES_INITIAL_REVIEW_REJECT);
+		this.iService.noticeFail(batch_id, this.getFrameOptr());
+		return new Ajax();
+	}
+	@RequestMapping("review/initial/notice2.htm")
+	public Ajax notice2(Integer batch_id) {
+		//this.authOptrRole(FrameResIdConst.RES_INITIAL_REVIEW_REJECT);
+		this.iService.notice2(batch_id, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * 初审通知分页
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @param school_id
+	 * @param batch_id
+	 * @param major_ids
+	 * @param optr_ids
+	 * @param detail_type-approv,reject
+	 * @return
+	 */
+	@RequestMapping("review/initial/notice/page.htm")
+	public Ajax initialNoticePage(String query, Integer start, Integer limit, String order, String type, 
+			Integer school_id, Integer batch_id, String major_ids, String optr_ids, String detail_type) {
+		if (batch_id == null) {
+			return new Ajax(new Pager());
+		}
+		FrameDept org = this.mDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			deptId=org.getDept_id();
+		}
+		return new Ajax(this.mDao.initialNoticePage(start, limit, query, getQueryOrder(order, type), 
+				school_id,deptId, batch_id, major_ids, optr_ids, detail_type));
+	}
+	
+	/**
+	 * 初审老师
+	 * @param school_id
+	 * @param batch_id
+	 * @return
+	 */
+	@RequestMapping("review/initial/optr/list.htm")
+	public Ajax initialOptrList(Integer school_id, Integer batch_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select o.optr_id,o.optr_name  from frame_optr o,cf_initial_optr a,cf_initial_optr_detail b ");
+		sql.append("where a.school_id=? and a.id=b.main_id and b.optr_id=o.optr_id   ");
+		return new Ajax(this.mDao.listBySql(FrameOptr.class, sql.toString(), school_id));
+	}
+	
+	/**
+	 * 考生审核标签分页
+	 * @param query : 查询条件
+	 * @param batch_id: 批次ID
+	 * @param tag_ids: 状态
+	 */
+	@RequestMapping("review/std/auth/tag/page.htm")
+	public Ajax pageStdAuthTagPage(String query, Integer start, Integer limit, String order, String type, Integer school_id, 
+			Integer batch_id, Integer optr_id, String tag_ids) {
+		FrameDept org = this.mDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			CfSchool school = this.mDao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+					org.getDept_code(), org.getDept_id());
+			school_id = school.getSchool_id();
+		}else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			CfSchool school = this.mDao.findBySql(CfSchool.class, "SELECT *  FROM cf_school WHERE DEPT_ID=(SELECT d.DEPT_PID FROM frame_dept d WHERE d.DEPT_ID=?)", org.getDept_id());
+			school_id = school.getSchool_id();
+			deptId=org.getDept_id();
+		}
+		return new Ajax(this.mDao.pageStdAuthTagPage(start, limit, query, getQueryOrder(order, type), 
+				school_id,deptId, batch_id, optr_id, tag_ids));
+	}
+	
+	/**
+	 * 考生审核标签导出
+	 */
+	@RequestMapping("review/std/auth/tag/export.htm")
+	public void exportStdAuthTag(Integer school_id, Integer batch_id, String tag_ids) {
+		List<List<Object>> values = new ArrayList<List<Object>>();
+    	List<Object> headerList = new ArrayList<Object>();
+    	ServletOutputStream outStream = null;
+    	headerList.add("姓名");
+    	headerList.add("报名号");
+    	headerList.add("联系电话");
+    	headerList.add("考生类型");
+    	headerList.add("专业方向");
+    	headerList.add("导师名称");
+    	headerList.add("状态");
+    	headerList.add("初审备注");
+    	headerList.add("初审老师");
+    	headerList.add("标签");
+    	values.add(headerList);
+    	
+    	Pager pager = this.mDao.pageStdAuthTagPage(0, Integer.MAX_VALUE, null, null,
+				school_id, school_id, batch_id, null, tag_ids);
+    	List<Map<String, Object>> list = (List<Map<String, Object>>)pager.getRecords();
+  		int i = 1;
+    	for(Map<String,Object> map: list) {
+    		List<Object> rowList = new ArrayList<Object>();
+    		rowList.add(map.get("std_name"));
+    		rowList.add(map.get("exam_id"));
+    		rowList.add(map.get("std_mobile"));
+    		rowList.add(FrameDictUtil.getFrameDictText("StdEduType", map.get("std_edu").toString()));
+    		rowList.add(map.get("aspect_name"));
+    		rowList.add(map.get("enr_doct_name"));
+    		rowList.add(FrameDictUtil.getFrameDictText("ApplyStatus", map.get("status").toString()));
+    		rowList.add(map.get("initial_remark"));
+    		rowList.add(map.get("optr_name"));
+    		rowList.add(map.get("tag_name"));
+    		values.add(rowList);
+    		i++;
+    	}
+    	try {
+			String fileName =  "考生审核标签" + LocalDateHelper.formatNoSplit(LocalDate.now()) + ".xlsx";
+			fileName = URLEncoder.encode(fileName, "UTF-8");
+			fileName = new String(fileName.getBytes(), "ISO-8859-1");
+	    	XSSFWorkbook wb = Excel2007Writer.createExcel(values);
+	    	ByteArrayOutputStream os = new ByteArrayOutputStream();
+			wb.write(os);
+			this.getResponse().reset();
+			this.getResponse().setContentType("application/x-msdownload");
+			this.getResponse().setHeader("Content-Disposition", "attachment; filename=" + fileName);
+			outStream = this.getResponse().getOutputStream();
+			outStream.write(os.toByteArray());
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if(outStream != null) {
+				try {
+					outStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+	
+	//设置标签
+	@RequestMapping("review/std/auth/tag/set.htm")
+	public Ajax setTag(Integer apply_id, Integer tag_id) {
+		return new Ajax(this.iService.setTag(apply_id, tag_id, this.getFrameOptr()));
+	}
+	
+	//清除标签
+	@RequestMapping("review/std/auth/tag/clear.htm")
+	public Ajax clearTag(Integer apply_id) {
+		this.iService.clearTag(apply_id, this.getFrameOptr());
+		return new Ajax();
+	}
+}

+ 609 - 0
src/main/java/cn/hmsoft/mr/control/review/ProfesReviewControl.java

@@ -0,0 +1,609 @@
+package cn.hmsoft.mr.control.review;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.*;
+
+import javax.servlet.ServletOutputStream;
+
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.helper.LocalDateHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.helper.excel.Excel2007Writer;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.log.LogHelper;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.constants.GobalBusinessType;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.constants.MRConst.ApplyStatus;
+import cn.hmsoft.mr.data.dao.cf.CfBatchDao;
+import cn.hmsoft.mr.data.dao.std.StdApplyDetailDao;
+import cn.hmsoft.mr.data.model.cf.CfAspect;
+import cn.hmsoft.mr.data.model.cf.CfAspectOptr;
+import cn.hmsoft.mr.data.model.cf.CfBatch;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.review.ReviewSign;
+import cn.hmsoft.mr.data.model.std.StdApplyMain;
+import cn.hmsoft.mr.enrol.helper.ArtWeixinHelper;
+import cn.hmsoft.mr.service.review.ProfesReviewService;
+
+/**
+ * 学术审核控制器.
+ * @author zq
+ *
+ */
+@RestController
+public class ProfesReviewControl extends FrameControl {
+
+	@Autowired
+	private ProfesReviewService pService;
+	@Autowired
+	private StdApplyDetailDao dDao;
+	@Autowired
+	private CfBatchDao bDao;
+	
+	@RequestMapping("final/review/rank/list.htm")
+	public Ajax rankList(Integer batch_id, Integer aspect_id) {
+		CfBatch batch = this.bDao.find(batch_id);
+		CfAspectOptr aspOptr = this.bDao.findBySql(CfAspectOptr.class, "select * from cf_aspect_optr where school_id=? and batch_id=? and optr_id=?", 
+				batch.getSchool_id(), batch_id, this.getFrameOptr().getOptr_id());
+		if (aspOptr == null) {
+			throw new BusinessException("找不到当前登录老师的评审账号。");
+		} 
+		if (aspect_id == null) {
+			aspect_id = aspOptr.getAspect_id();
+		}
+		return new Ajax(this.getRankListt(batch_id, aspect_id));
+	}
+	
+	private List<Map<String, Object>> getRankListt(Integer batch_id, Integer aspect_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select m.review_level,m.review_score,s.std_name,m.apply_id,s.std_id,s.std_edu,s.std_image,m.aspect_id,m.batch_id 	");
+		sql.append("from std_apply_main m,std_reg s  ");
+		sql.append("where m.batch_id=? and m.aspect_id=? and m.std_id=s.std_id and m.school_id=s.school_id and m.review_level is not null ");
+		sql.append("order by m.review_level ");
+		return this.dDao.listMapBySql(sql.toString(), batch_id, aspect_id);
+	}
+	
+	/**
+	 * 下一个考生
+	 * @return
+	 */
+	@RequestMapping("final/review/std/next/total.htm")
+	public Ajax nextStd(String click_from, Integer main_id, Integer batch_id, String status, String query) {
+		if (StringHelper.isEmpty(status)) {
+			status = ApplyStatus.InitialAppr.toString();
+		}
+		StdApplyMain main = this.getNextStdMain(main_id, batch_id, status, query);
+		if (main == null) {
+			if (StringHelper.isNotEmpty(click_from) && click_from.equals("next")) {
+				main = this.getNextStdMain(null, batch_id, status, query);//从头开始取没评审的
+			} else {
+				//评审完成
+				new Ajax();
+			}
+		}
+		return new Ajax(main);
+	}
+	
+	/**
+	 * 左边排名点击查询当前考生
+	 * @return
+	 */
+	@RequestMapping("final/review/std/curr/total.htm")
+	public Ajax currStd(Integer main_id, Integer batch_id) {
+		FrameDept org = this.dDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			LogHelper.warn("当前登录[" + this.getFrameOptr().getLogin_name() +  "]不是学校账号。");
+		}
+		StdApplyMain stdMain = null;
+		StringBuilder sql = new StringBuilder();
+		sql.append("select m.*,s.std_name,f.aspect_name,s.std_edu,s.std_image,e.exam_id from std_apply_main m ");
+		sql.append("left join std_reg s on m.std_id=s.std_id and m.school_id=s.school_id   ");
+		sql.append("left join std_enrol e on m.std_id=e.std_id and m.aspect_id=e.aspect_id ");
+		sql.append("left join cf_aspect f on f.aspect_id=m.aspect_id and f.school_id=m.school_id and f.batch_id=m.batch_id ");
+		sql.append("where m.apply_id=? 		  ");
+		sql.append("order by m.apply_id ");
+		stdMain = this.dDao.findBySql(StdApplyMain.class, sql.toString(), main_id);
+		return new Ajax(stdMain);
+	}
+
+	/**
+	 * 初审通过的考生
+	 * 下一个待审核考生上传分页
+	 * @param query : 查询条件
+	 * @param batch_id: 批次ID
+	 * @param status: 状态
+	 */
+	@RequestMapping("final/review/std/next/page.htm")
+	public Ajax pageFinalStd(String query, Integer start, Integer limit, String order, String type, 
+			String click_from, Integer main_id, Integer batch_id, String status) {
+		FrameDept org = this.dDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			LogHelper.warn("当前登录[" + this.getFrameOptr().getLogin_name() +  "]不是学校账号。");
+			return new Ajax(new Pager());
+		}
+		Integer school_id =null;
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			CfSchool school = this.dDao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+					org.getDept_code(), org.getDept_id());
+			school_id = school.getSchool_id();
+		}else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			CfSchool school = this.dDao.findBySql(CfSchool.class, "SELECT *  FROM cf_school WHERE DEPT_ID=(SELECT d.DEPT_PID FROM frame_dept d WHERE d.DEPT_ID=?)", org.getDept_id());
+			school_id = school.getSchool_id();
+			deptId=org.getDept_id();
+		}
+		//默认查询未评审的考生
+		if (StringHelper.isEmpty(click_from) && main_id == null) {
+			//前端没指定就取下一个待专业评审的考生 
+			StdApplyMain main = this.getNextStdMain(main_id, batch_id, ApplyStatus.InitialAppr.toString(), query);
+			if (main == null) {//所有考生评审完后 返回 null
+				return new Ajax(new Pager());
+			} else {
+				main_id = main.getApply_id();
+			}
+		} else {
+			if (click_from == null) {
+				click_from = "left";
+			}
+			if (click_from.equals("left")) {//排名点击查询
+				StringBuilder sql = new StringBuilder();
+				sql.append("select m.*,s.std_name,f.aspect_name,s.std_edu,e.exam_id from std_apply_main m ");
+				sql.append("left join std_reg s on m.std_id=s.std_id and m.school_id=s.school_id   ");
+				sql.append("left join std_enrol e on m.std_id=e.std_id and m.aspect_id=e.aspect_id ");
+				sql.append("left join cf_aspect f on f.aspect_id=m.aspect_id and f.school_id=m.school_id and f.batch_id=m.batch_id ");
+				sql.append("where m.apply_id=? 		  ");
+				sql.append("order by m.apply_id ");
+				StdApplyMain main = this.dDao.findBySql(StdApplyMain.class, sql.toString(), main_id);
+				main_id = main.getApply_id();
+			}/* else if (click_from.equals("next")) {//右边点击下一个
+				StdApplyMain main = this.getNextStdMain(main_id, batch_id, ApplyStatus.InitialAppr.toString(), query);
+				if (main == null) {//最后一个后 不存在,从第一个开始
+					main_id = null;
+					main = this.getNextStdMain(main_id, batch_id, ApplyStatus.InitialAppr.toString(), query);
+				} else {
+					main_id = main.getApply_id();
+				}
+			}*/
+		}
+		LogHelper.info("apply_id---------" + main_id);
+		Pager p = this.dDao.pageFinalStdPage(start, limit, query, getQueryOrder(order, type), 
+				main_id, school_id, batch_id, status);
+		return new Ajax(p);
+	}
+	
+	//获取下一个考生的主记录
+	private StdApplyMain getNextStdMain(Integer main_id, Integer batch_id, String status, String query) {
+		FrameDept org = this.dDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (org.getDept_type().equals(MRConst.OrgType.Admin.toString())) {
+			LogHelper.warn("当前登录[" + this.getFrameOptr().getLogin_name() +  "]不是学校账号!");
+		}
+		StdApplyMain stdMain = null;
+//		CfSchool school = this.dDao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+//				org.getDept_code(), org.getDept_id());
+		Integer school_id =null;
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			CfSchool school = this.dDao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+					org.getDept_code(), org.getDept_id());
+			school_id = school.getSchool_id();
+		}else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			CfSchool school = this.dDao.findBySql(CfSchool.class, "SELECT *  FROM cf_school WHERE DEPT_ID=(SELECT d.DEPT_PID FROM frame_dept d WHERE d.DEPT_ID=?)", org.getDept_id());
+			school_id = school.getSchool_id();
+			deptId=org.getDept_id();
+		}
+		//前端没指定就取下一个没评审的考生 
+		//TODO 如果评审老师可以评多专业 界面就要让老师选
+		CfAspectOptr aspOptr = this.bDao.findBySql(CfAspectOptr.class, "select * from cf_aspect_optr where school_id=? and batch_id=? and optr_id=?", 
+				school_id, batch_id, this.getFrameOptr().getOptr_id());
+		if (aspOptr == null) {
+			throw new BusinessException("找不到当前登录老师的评审账号。");
+		}
+		StringBuilder sql = new StringBuilder();
+		sql.append("select m.*,s.std_name,f.aspect_name,s.std_edu,s.std_image,e.exam_id from std_apply_main m ");
+		sql.append("left join std_reg s on m.std_id=s.std_id and m.school_id=s.school_id   ");
+		sql.append("left join std_enrol e on m.std_id=e.std_id and m.aspect_id=e.aspect_id ");
+		sql.append("left join cf_aspect f on f.aspect_id=m.aspect_id and f.school_id=m.school_id and f.batch_id=m.batch_id ");
+		sql.append("where m.school_id=? and m.batch_id=? and m.aspect_id=? and m.status=? and m.review_level is null 	   ");
+		if (deptId != null) {
+			sql.append(" and f.dept_id=").append(deptId);
+		}
+		if (main_id != null) {//强制当前考生的下一个
+			StdApplyMain cur = this.dDao.find(StdApplyMain.class, main_id);
+			if (cur.getReview_level() == null) {
+				sql.append(" and m.apply_id > ? ");
+				if (StringHelper.isNotEmpty(query)) {
+					String value = "'%" + query.trim() + "%'";
+					sql.append(" and (s.std_name like " + value + " or e.exam_id like " + value + " or s.cert_id like " + value + ") ");
+				}
+				sql.append("order by m.apply_id ");
+				stdMain =  this.dDao.findBySql(StdApplyMain.class, 
+						sql.toString(), school_id, batch_id, aspOptr.getAspect_id(), status, cur.getApply_id());
+				return stdMain;
+			}
+		}
+		//未评审的 默认取第一个
+		if (StringHelper.isNotEmpty(query)) {
+			String value = "'%" + query.trim() + "%'";
+			sql.append(" and (s.std_name like " + value + " or e.exam_id like " + value + " or s.cert_id like " + value + ") ");
+		}
+		sql.append("order by m.apply_id ");
+		stdMain =  this.dDao.findBySql(StdApplyMain.class, 
+				sql.toString(), school_id, batch_id, aspOptr.getAspect_id(), status);
+		//LogHelper.info("取下一个考生---->" + stdMain.getApply_id());
+		return stdMain;
+	}
+	
+	@RequestMapping("final/review/progress/info.htm")
+	public Ajax progressInfo(Integer batch_id, Integer aspect_id) {
+		CfBatch batch = this.dDao.find(CfBatch.class, batch_id);
+		CfAspectOptr aspOptr = this.bDao.findBySql(CfAspectOptr.class, "select * from cf_aspect_optr where school_id=? and batch_id=? and optr_id=?", 
+				batch.getSchool_id(), batch_id, this.getFrameOptr().getOptr_id());
+		if (aspOptr == null) {
+			throw new BusinessException("找不到当前登录老师的评审账号!");
+		} 
+		if (aspect_id == null) {
+			aspect_id = aspOptr.getAspect_id();
+		}
+		StringBuilder sql = new StringBuilder();
+		sql.append("select (select count(1) done_cnt from std_apply_main where school_id=? and batch_id=? and aspect_id=? and review_level is not null) done_cnt, 			");
+		sql.append("	(select count(1) from std_apply_main where school_id=? and batch_id=? and aspect_id=? and review_level is null and status = 'InitialAppr') to_be_cnt ");
+		sql.append("	from dual                                                                                                                          					");
+		Map<String, Object> retMap = this.bDao.findMapBySql(sql.toString(), batch.getSchool_id(), batch_id, aspect_id, 
+				batch.getSchool_id(), batch_id, aspect_id);
+		if (aspect_id != null) {
+			CfAspect aspect = this.dDao.find(CfAspect.class, aspect_id);
+			retMap.put("pass_percent", aspect.getPass_percent());//准考比率
+			retMap.put("initial_pass_cnt", aspect.getInitial_pass_cnt());//初审通过人数
+			retMap.put("pass_cnt", aspect.getPass_cnt());//准考人数 = pass_percent * initial_pass_cnt
+		}
+		//是否签名了
+		ReviewSign sign = this.bDao.findBySql(ReviewSign.class, "select * from review_sign where batch_id=? and review_optr=? and aspect_id=?", 
+				batch_id, aspOptr.getOptr_id(), aspect_id);
+		retMap.put("sign_flag", sign != null ? 1 : 0);
+		retMap.put("enr_doct_name", this.getFrameOptr().getOptr_name());
+		return new Ajax(retMap);
+	}
+	
+	/**
+	 * 终审评分
+	 * @param apply_id
+	 * @param review_score
+	 * @param review_remark
+	 * @return
+	 */
+	@RequestMapping("final/review/save.htm")
+	public Ajax finalSave(Integer apply_id, Integer review_score, String review_remark) {
+		this.authOptrRole(FrameResIdConst.RES_FINAL_REVIEW_SAVE);
+		this.pService.finalSave(apply_id, review_score, review_remark, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * 专业通过排名--专业评审老师签名查询用
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @param batch_id
+	 * @param pass_type  passed-通过主考的,no_passed-不准考证的
+	 * @return
+	 */
+	@RequestMapping("final/review/aspect/std/pass/page.htm")
+	public Ajax pageAspectPass(String query, Integer start, Integer limit, String order, String type, 
+			Integer batch_id, String pass_type) {
+		Integer aspect_id = null;
+		if (batch_id == null) {
+			return new Ajax(new Pager());
+		}
+		CfBatch batch = this.dDao.find(CfBatch.class, batch_id);
+		CfAspectOptr aspOptr = this.bDao.findBySql(CfAspectOptr.class, "select * from cf_aspect_optr where school_id=? and batch_id=? and optr_id=?", 
+				batch.getSchool_id(), batch_id, this.getFrameOptr().getOptr_id());
+		if (aspOptr == null) {
+			throw new BusinessException("找不到当前登录老师的评审账号!");
+		} 
+		if (aspect_id == null) {
+			aspect_id = aspOptr.getAspect_id();
+		}
+		return new Ajax(this.dDao.pageStdPassPage(start, limit, query, getQueryOrder(order, type), 
+				batch.getSchool_id(), batch_id, aspect_id, pass_type));
+	}
+	
+	/**
+	 * 通过未通过分页-考务人员查询分页
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @param batch_id
+	 * @param pass_type  passed-通过主考的,no_passed-不准考证的
+	 * @return
+	 */
+	@RequestMapping("final/review/std/pass/notice/page.htm")
+	public Ajax pagePassNotice(String query, Integer start, Integer limit, String order, String type, 
+			Integer batch_id, String major_ids, String optr_ids, String pass_type) {
+		if (batch_id == null) {
+			return new Ajax(new Pager());
+		}
+		FrameDept org = this.dDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			deptId=org.getDept_id();
+		}
+		CfBatch batch = this.dDao.find(CfBatch.class, batch_id);
+		return new Ajax(this.dDao.pageStdNoticePage(start, limit, query, getQueryOrder(order, type), 
+				batch.getSchool_id(),deptId, batch_id, major_ids, optr_ids, pass_type));
+	}
+	
+	/**
+	 * 签名确认
+	 * @param batch_id
+	 * @param sgin_base64
+	 * @return
+	 */
+	@RequestMapping("final/review/comfirm/sign.htm")
+	public Ajax sign(Integer batch_id, String sgin_base64) {
+		Integer aspect_id = null;
+		CfBatch batch = this.dDao.find(CfBatch.class, batch_id);
+		CfAspectOptr aspOptr = this.bDao.findBySql(CfAspectOptr.class, "select * from cf_aspect_optr where school_id=? and batch_id=? and optr_id=?", 
+				batch.getSchool_id(), batch_id, this.getFrameOptr().getOptr_id());
+		if (aspOptr == null) {
+			throw new BusinessException("找不到当前登录老师的评审账号。");
+		} 
+		if (aspect_id == null) {
+			aspect_id = aspOptr.getAspect_id();
+		}
+		this.pService.sign(batch, aspOptr.getOptr_id(), aspect_id, sgin_base64, this.getFrameOptr());
+		return new Ajax(true);
+	}
+	
+	@RequestMapping("final/review/sign/get.htm")
+	public Ajax getSign(Integer batch_id) {
+		ReviewSign reviewSign = this.bDao.findBySql(ReviewSign.class, "select * from review_sign where batch_id=? and review_optr=?", batch_id, 
+				this.getFrameOptr().getOptr_id());
+		return new Ajax(reviewSign);
+	}
+	
+	/**
+	 * 评审进度分页.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @param batch_id
+	 * @return
+	 */
+	@RequestMapping("final/review/progress/page.htm")
+	public Ajax pageReviewProgress(String query, Integer start, Integer limit, String order, String type, 
+			Integer batch_id, String has_confirm) {
+		if (batch_id == null) {
+			return new Ajax(new Pager());
+		}
+		FrameDept org = this.dDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		 if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			deptId=org.getDept_id();
+		}
+		CfBatch batch = this.dDao.find(CfBatch.class, batch_id);
+		if (Objects.isNull(batch)) {
+			return new Ajax(new Pager());
+		}
+		return new Ajax(this.dDao.pageFinalReviewProgress(start, limit, query, getQueryOrder(order, type), 
+				batch.getSchool_id(),deptId, batch_id, has_confirm));
+	}
+	
+	/**
+	 * 导出学术评审进度
+	 * @param school_id
+	 */
+	@RequestMapping("final/review/progress/export.htm")
+	public void progressExport(Integer school_id, Integer batch_id, String has_confirm) {
+		List<List<Object>> values = new ArrayList<List<Object>>();
+    	List<Object> headerList = new ArrayList<Object>();
+    	ServletOutputStream outStream = null;
+    	headerList.add("专业");
+    	headerList.add("专业方向");
+    	headerList.add("导师");
+    	headerList.add("总人数");
+    	headerList.add("已评");
+    	headerList.add("未评");
+    	headerList.add("是否确认提交");
+    	values.add(headerList);
+		Integer deptId=null;
+		FrameDept org = this.dDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			deptId=org.getDept_id();
+		}
+    	Pager pager = this.dDao.pageFinalReviewProgress(0, Integer.MAX_VALUE, null, null, 
+    			school_id, deptId, batch_id, has_confirm);
+    	List<Map<String, Object>> list = (List<Map<String, Object>>)pager.getRecords();
+    	LogHelper.info("...school_id--" + school_id + "," + batch_id + ",size---" + list.size());
+  		int i = 1;
+    	for(Map<String,Object> map: list) {
+    		List<Object> rowList = new ArrayList<Object>();
+    		rowList.add(map.get("major_name"));
+    		rowList.add(map.get("aspect_name"));
+    		rowList.add(map.get("optr_name"));
+    		rowList.add(map.get("total_cnt"));
+    		rowList.add(map.get("done_cnt"));
+    		rowList.add(map.get("to_be_cnt"));
+    		rowList.add(map.get("has_confirm"));
+    		values.add(rowList);
+    		i++;
+    	}
+    	try {
+			String fileName =  "学术评审进度" + LocalDateHelper.formatNoSplit(LocalDate.now()) + ".xlsx";
+			fileName = URLEncoder.encode(fileName, "UTF-8");
+			fileName = new String(fileName.getBytes(), "ISO-8859-1");
+	    	XSSFWorkbook wb = Excel2007Writer.createExcel(values);
+	    	ByteArrayOutputStream os = new ByteArrayOutputStream();
+			wb.write(os);
+			this.getResponse().reset();
+			this.getResponse().setContentType("application/x-msdownload");
+			this.getResponse().setHeader("Content-Disposition", "attachment; filename=" + fileName);
+			outStream = this.getResponse().getOutputStream();
+			outStream.write(os.toByteArray());
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			if(outStream != null) {
+				try {
+					outStream.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+	
+	/**
+	 * 评审进度求和.
+	 * @param school_id
+	 * @param batch_id
+	 * @param aspect_id
+	 * @param query
+	 * @return
+	 */
+	@RequestMapping("final/review/progress/total.htm")
+	public Ajax pageReviewProgress(Integer school_id, Integer batch_id, Integer aspect_id, String query) {
+		if (batch_id == null) {
+			return new Ajax(new Pager());
+		}
+		return new Ajax(this.dDao.pageFinalReviewTotal(school_id, batch_id, aspect_id, query));
+	}
+	
+	/**
+	 * 进度分页 done-专业评审完成、to_be-专业评审未完成
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @param batch_id
+	 * @param aspect_id
+	 * @param query_type
+	 * @return
+	 */
+	@RequestMapping("final/review/progress/detail/page.htm")
+	public Ajax pageProgressDetailPage(String query, Integer start, Integer limit, String order, String type, 
+			Integer batch_id, Integer aspect_id, String query_type) {
+		CfBatch batch = this.dDao.find(CfBatch.class, batch_id);
+		return new Ajax(this.dDao.pageFinalProgressDetailPage(start, limit, query, getQueryOrder(order, type), 
+				batch.getSchool_id(), batch_id, aspect_id, query_type));
+	}
+	
+	/**
+	 * 学术评审发消息-通过、不通过
+	 * @param batch_id
+	 * @param pass_type
+	 * @return
+	 */
+	@RequestMapping("final/review/notice/send.htm")
+	public Ajax sendNotice(Integer batch_id, String pass_type, String major_ids, String optr_ids) {
+		CfBatch batch = this.dDao.find(CfBatch.class, batch_id);
+		FrameDept org = this.dDao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			deptId=org.getDept_id();
+		}
+		Pager pager = this.dDao.pageStdNoticePage(0, Integer.MAX_VALUE, null, null,
+				batch.getSchool_id(), deptId, batch_id, major_ids, optr_ids, pass_type);
+		List<Map<String, Object>> list = (List<Map<String, Object>>)pager.getRecords();
+		for (Map<String, Object> data : list) {
+			Map<String, Object> map = new HashMap<String, Object>();
+//			map.put("std_name", data.get("std_name").toString());
+//			map.put("aspect_name", data.get("aspect_name").toString());
+//			map.put("title_msg", "【" + data.get("std_name") + "】你好,以下是你的学术审核结果");
+			map.put("review_type", "学术审核");
+//			map.put("review_time", LocalDateHelper.format(LocalDateTime.now()));
+			if ("passed".equals(pass_type)) {
+				map.put("review_result", "材料已通过学术审核,予以准考。");
+				map.put("review_status", "予以准考,准考证及考试安排关注后续通知。");
+			} else if ("no_passed".equals(pass_type)) {
+				map.put("review_result", "材料未通过学术审核,不予准考。");
+				map.put("review_status", "不予准考,请继续加强学术积累。");
+			}
+			ArtWeixinHelper.SendWeiXinTemplate(GobalBusinessType.ReviewRetNotice, batch.getSchool_id(),
+					data.get("std_id").toString(), map);
+			LogHelper.info("已发送评审结果通知,考生ID:" + data.get("std_id").toString());
+		}
+		return new Ajax();
+	}
+	
+	/**
+	 * 专业评审提交提前检查.
+	 * @param batch_id
+	 * @return
+	 */
+	@RequestMapping("final/review/submit/check.htm")
+	public Ajax submitCheck(Integer batch_id) {
+		Integer aspect_id = null;
+		CfBatch batch = this.dDao.find(CfBatch.class, batch_id);
+		CfAspectOptr aspOptr = this.bDao.findBySql(CfAspectOptr.class, "select * from cf_aspect_optr where school_id=? and batch_id=? and optr_id=?", 
+				batch.getSchool_id(), batch_id, this.getFrameOptr().getOptr_id());
+		if (aspOptr == null) {
+			throw new BusinessException("找不到当前登录老师的评审账号。");
+		} 
+		if (aspect_id == null) {
+			aspect_id = aspOptr.getAspect_id();
+		}
+		//没评审的提示
+		List<StdApplyMain> list = this.dDao.listBySql(StdApplyMain.class, 
+				"select s.std_name,s.cert_id,m.* from std_apply_main m,std_reg s where s.std_id=m.std_id and s.school_id=m.school_id and m.school_id=? and m.batch_id=? and m.aspect_id=? and m.status='InitialAppr' and m.review_remark is null and m.review_score is null", 
+				batch.getSchool_id(), batch.getBatch_id(), aspect_id);
+		if (list != null && list.size() > 0) {
+			throw new BusinessException("考生没有评审,姓名[" + list.get(0).getStd_name() + "]");
+		}
+		//不予准考的  必须有备注
+		List<StdApplyMain> noRemarkList = this.dDao.listBySql(StdApplyMain.class, 
+				"select s.std_name,s.cert_id,m.* from std_apply_main m,std_reg s,cf_aspect f where s.std_id=m.std_id and s.school_id=m.school_id and m.school_id=? and m.batch_id=? and m.aspect_id=? and length(trim(m.review_remark))=0 and f.aspect_id=m.aspect_id and m.review_level>f.pass_cnt and f.school_id=m.school_id and f.batch_id=m.batch_id ", 
+				batch.getSchool_id(), batch.getBatch_id(), aspect_id);
+		if (noRemarkList != null && noRemarkList.size() > 0) {
+			StringBuilder sb = new StringBuilder();
+			sb.append("考生");
+			for (StdApplyMain m : noRemarkList) {
+				sb.append("[").append(m.getStd_name()).append("]");
+			}
+			sb.append("不予准考,必须有审核意见。");
+			throw new BusinessException(sb.toString());
+		}
+		//检查准考最后一名是否 同成绩
+		List<Map<String, Object>> rankList = this.getRankListt(batch_id, aspect_id);
+		CfAspect aspect = this.bDao.find(CfAspect.class, aspect_id);
+		if (aspect.getPass_cnt() != null && rankList.size() > aspect.getPass_cnt()) {
+			Map<String, Object> zk = rankList.get(aspect.getPass_cnt() - 1);
+			for (int i=aspect.getPass_cnt(); i<rankList.size(); i++) {
+				Map<String, Object> zkNext = rankList.get(aspect.getPass_cnt());
+				if (zk.get("review_score").equals(zkNext.get("review_score"))) {
+					throw new BusinessException("考生[" + zk.get("std_name") + "]与[" + zkNext.get("std_name") + "]成绩相同,请确认后修改。");
+				}
+			}
+		}
+		return new Ajax(true);
+	}
+	
+	//查询所有的专业评审老师
+	@RequestMapping("final/review/optr/list.htm")
+	public Ajax listMajor(Integer school_id, Integer batch_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select o.optr_id,o.optr_name  from frame_optr o,cf_aspect_optr ao ");
+		sql.append("where ao.school_id=? and ao.batch_id=? and o.optr_id=ao.optr_id   ");
+		return new Ajax(this.bDao.listBySql(FrameOptr.class, sql.toString(), school_id, batch_id));
+	}
+}

+ 99 - 0
src/main/java/cn/hmsoft/mr/control/review/ReCheckControl.java

@@ -0,0 +1,99 @@
+package cn.hmsoft.mr.control.review;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.mr.constants.FrameResIdConst;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.std.StdApplyMainDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.std.StdApplyMain;
+import cn.hmsoft.mr.service.review.ReCheckService;
+
+/**
+ * 资格审核-复核
+ * @author zq
+ *
+ */
+@RestController
+public class ReCheckControl extends FrameControl {
+
+	@Autowired
+	private ReCheckService service;
+	@Autowired
+	private StdApplyMainDao dao;
+	
+	/**
+	 * 资格复审分页查询
+	 * @param query : 查询条件
+	 * @param batch_id: 批次ID
+	 * @param query_type: 状态
+	 */
+	@RequestMapping("review/recheck/page.htm")
+	public Ajax pageInitial(String query, Integer start, Integer limit, String order, String type, Integer school_id, 
+			Integer batch_id, Integer optr_id, String query_type) {
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+					org.getDept_code(), org.getDept_id());
+			school_id = school.getSchool_id();
+		}else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			CfSchool school = this.dao.findBySql(CfSchool.class, "SELECT *  FROM cf_school WHERE DEPT_ID=(SELECT d.DEPT_PID FROM frame_dept d WHERE d.DEPT_ID=?)", org.getDept_id());
+			school_id = school.getSchool_id();
+			deptId=org.getDept_id();
+		}
+		return new Ajax(this.dao.pageReCheckPage(start, limit, query, getQueryOrder(order, type), 
+				school_id, deptId,batch_id, query_type,this.getFrameOptr().getOptr_id()));
+	}
+	
+	//资格复审通过-明细
+	@RequestMapping("review/recheck/detail/approve.htm")
+	public Ajax approveDetail(Integer[] detail_ids, String remark) {
+		this.authOptrRole(FrameResIdConst.RES_RE_CHECK_DETAIL_APPROV);
+		this.service.approveDetail(detail_ids, remark, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	//资格复审驳回-明细
+	@RequestMapping("review/recheck/detail/reject.htm")
+	public Ajax rejectDetail(Integer[] detail_ids, String remark) {
+		this.authOptrRole(FrameResIdConst.RES_RE_CHECK_DETAIL_REJECT);
+		this.service.rejectDetail(detail_ids, remark, this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * 资格复审-主记录评审通过
+	 * @param apply_id
+	 * @param initial_remark
+	 * @return
+	 */
+	@RequestMapping("review/recheck/main/approve.htm")
+	public Ajax approveMain(Integer apply_id, String initial_remark) {
+		this.authOptrRole(FrameResIdConst.RES_RE_CHECK_MAIN_APPROV);
+		StdApplyMain main = this.dao.findBySql("select s.std_name,m.* from std_apply_main m,std_reg s where apply_id=? and s.school_id=m.school_id and s.std_id=m.std_id", 
+				apply_id);
+		this.service.approveMain(apply_id, initial_remark, main.getStd_name(), this.getFrameOptr());
+		return new Ajax();
+	}
+	
+	/**
+	 * 资格复审-主记录驳回
+	 * @param apply_id
+	 * @param initial_remark
+	 * @return
+	 */
+	@RequestMapping("review/recheck/main/reject.htm")
+	public Ajax rejectMain(Integer apply_id, String initial_remark) {
+		this.authOptrRole(FrameResIdConst.RES_RE_CHECK_MAIN_REJECT);
+		StdApplyMain main = this.dao.findBySql("select s.std_name,m.* from std_apply_main m,std_reg s where apply_id=? and s.school_id=m.school_id and s.std_id=m.std_id", 
+				apply_id);
+		this.service.rejectMain(apply_id, initial_remark, main.getStd_name(), this.getFrameOptr());
+		return new Ajax();
+	}
+}

+ 66 - 0
src/main/java/cn/hmsoft/mr/control/review/ReviewLogControl.java

@@ -0,0 +1,66 @@
+package cn.hmsoft.mr.control.review;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.review.ReviewLogDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+
+
+/**
+ * 审核日志查询
+ * @author zq
+ *
+ */
+@RestController
+public class ReviewLogControl extends FrameControl {
+
+	@Autowired
+	private ReviewLogDao dao;
+	
+	/**
+	 * 审核日志分页
+	 * @param query : 查询条件
+	 * @param batch_id: 批次ID
+	 */
+	@RequestMapping("review/log/page.htm")
+	public Ajax pageReviewLog(String query, Integer start, Integer limit, String order, String type, Integer school_id, 
+			Integer batch_id) {
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		Integer deptId=null;
+		if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+					org.getDept_code(), org.getDept_id());
+			school_id = school.getSchool_id();
+		}else if (org.getDept_type().equals(MRConst.OrgType.SecondLevel.toString())) {
+			CfSchool school = this.dao.findBySql(CfSchool.class, "SELECT *  FROM cf_school WHERE DEPT_ID=(SELECT d.DEPT_PID FROM frame_dept d WHERE d.DEPT_ID=?)", org.getDept_id());
+			school_id = school.getSchool_id();
+			deptId=org.getDept_id();
+		}
+		return new Ajax(this.dao.pageReviewLogMain(start, limit, query, getQueryOrder(order, type), 
+				school_id,deptId, batch_id));
+	}
+	
+	/**
+	 * 考生日志分页
+	 * @param query : 查询条件
+	 * @param batch_id: 批次ID
+	 */
+	@RequestMapping("review/log/detail/page.htm")
+	public Ajax pageReviewLogDetail(String query, Integer start, Integer limit, String order, String type, Integer school_id, 
+			Integer batch_id, Integer std_id) {
+		FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+		if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+			CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?", 
+					org.getDept_code(), org.getDept_id());
+			school_id = school.getSchool_id();
+		}
+		return new Ajax(this.dao.pageReviewLogDetail(start, limit, query, getQueryOrder(order, type), 
+				school_id, batch_id, std_id));
+	}
+}

+ 60 - 0
src/main/java/cn/hmsoft/mr/control/review/ReviewPromiseControl.java

@@ -0,0 +1,60 @@
+package cn.hmsoft.mr.control.review;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.mr.data.dao.review.ReviewPromiseDao;
+import cn.hmsoft.mr.data.model.cf.CfBatch;
+import cn.hmsoft.mr.data.model.cf.CfPromiseInfo;
+import cn.hmsoft.mr.data.model.review.ReviewPromise;
+import cn.hmsoft.mr.service.review.ReviewPromiseService;
+
+/**
+ * 承若书
+ * @author zq
+ *
+ */
+@RestController
+public class ReviewPromiseControl extends FrameControl {
+
+	@Autowired
+	private ReviewPromiseDao dao;
+	@Autowired
+	private ReviewPromiseService service;
+	
+	/**
+	 * 承若书签名
+	 * @param batch_id
+	 * @param sgin_base64
+	 * @return
+	 */
+	@RequestMapping("review/promise/sign.htm")
+	public Ajax sign(Integer batch_id, String sgin_base64) {
+		CfBatch batch = this.dao.find(CfBatch.class, batch_id);
+		this.service.sign(batch.getSchool_id(), batch_id, sgin_base64, this.getFrameOptr());
+		return new Ajax(true);
+	}
+	
+	/**
+	 * 承若书签名
+	 * @param batch_id
+	 * @param sgin_base64
+	 * @return
+	 */
+	@RequestMapping("review/promise/find.htm")
+	public Ajax find(Integer batch_id, String biz_type) {
+		CfBatch batch = this.dao.find(CfBatch.class, batch_id);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("sgin", this.dao.findBySql("select * from review_promise where school_id=? and batch_id=? and optr_id=?",
+				batch.getSchool_id(), batch_id, this.getFrameOptr().getOptr_id()));
+		map.put("promise", this.dao.findBySql(CfPromiseInfo.class, "select * from cf_promise_info where school_id=? and biz_type=?", 
+				batch.getSchool_id(), biz_type));
+		return new Ajax(map);
+	}
+}

+ 135 - 0
src/main/java/cn/hmsoft/mr/control/std/StdApplyDetailControl.java

@@ -0,0 +1,135 @@
+package cn.hmsoft.mr.control.std;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.mr.data.dao.std.StdApplyDetailTextDao;
+import cn.hmsoft.mr.data.model.std.StdApplyDetailText;
+import cn.hmsoft.mr.enrol.service.StdApplyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.helper.LocalDateHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.std.StdApplyDetailDao;
+import cn.hmsoft.mr.data.dao.std.StdUploadDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.std.StdApplyMain;
+import cn.hmsoft.mr.data.model.std.StdUpload;
+
+@RestController
+public class StdApplyDetailControl extends FrameControl {
+
+    @Autowired
+    private StdApplyDetailDao dao;
+    @Autowired
+    private StdApplyService service;
+    @Autowired
+    private StdUploadDao uDao;
+
+    @Autowired
+    private StdApplyDetailTextDao textDao;
+
+    /**
+     * 初审分页
+     *
+     * @param query     : 查询条件
+     * @param batch_id: 批次ID
+     * @param status:   状态
+     */
+    @RequestMapping("std/apply/detail/page.htm")
+    public Ajax pageDetail(String query, Integer start, Integer limit, String order, String type, Integer school_id,
+                           Integer batch_id, Integer main_id, String status) {
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+            CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                    org.getDept_code(), org.getDept_id());
+            school_id = school.getSchool_id();
+        }
+        Pager pager = this.dao.pageDetailPage(start, limit, query, getQueryOrder(order, type),
+                school_id, batch_id, main_id, status);
+        int index = 1;
+        for (int i = 0; i < pager.getRecords().size(); i++) {
+            String categoryName = ((Map) pager.getRecords().get(i)).get("category_name").toString();
+
+            if (i > 0) {
+                String categoryNameLast = ((Map) pager.getRecords().get(i - 1)).get("category_name").toString();
+                if (!categoryNameLast.split("-")[0].equals(categoryName)) {
+                    index = 1;
+                }
+            }
+
+            ((Map) pager.getRecords().get(i)).put("category_name", categoryName + "-" + index);
+            index++;
+        }
+        return new Ajax(pager);
+    }
+
+    /**
+     * 考生上传材料列表
+     *
+     * @param detail_id: 申请明细ID
+     */
+    @RequestMapping("std/apply/upload/list.htm")
+    public Ajax listUpload(Integer detail_id) {
+        List<StdUpload> uploadList = this.uDao.listBySql("select * from std_upload where detail_id=? order by upload_time", detail_id);
+
+        List<StdApplyDetailText> textAttrs = this.textDao.listBySql("select * from std_apply_detail_text where detail_id=?", detail_id);
+
+        Map<String, Object> map = new HashMap<>();
+        map.put("uploadList", uploadList);
+        map.put("textAttrs", textAttrs);
+        return new Ajax(map);
+    }
+
+    /**
+     * 考生上传材料列表
+     *
+     * @param main_id: 下一个主记录
+     */
+    @RequestMapping("std/apply/main/next.htm")
+    public Ajax nextStdApplyMain(Integer main_id, String detail_review_time, Integer batch_id, String detail_type) {
+        StdApplyMain curMain = this.dao.find(StdApplyMain.class, main_id);
+        curMain.setRe_check_time(LocalDateTime.now());
+        service.upDate(curMain);
+
+        StringBuilder sql = new StringBuilder();
+        sql.append("select distinct m.*,s.study_verify_ret,s.std_name,e.exam_id,s.std_edu,s.std_mobile,e.enr_doct_name,x.major_name,f.aspect_name,s.std_image,n.optr_name,ro.optr_name real_optr_name ");
+        sql.append("from std_apply_main m 	");
+        sql.append("inner join cf_aspect f on f.aspect_id=m.aspect_id and f.school_id=m.school_id and f.batch_id=m.batch_id       ");
+        sql.append("inner join cf_initial_optr o on o.school_id=m.school_id														  ");
+        sql.append("inner join cf_initial_optr_detail d on d.main_id=o.id and d.optr_id=m.initial_review_optr					  ");
+        sql.append("inner join cf_major x on x.major_id=f.major_id and f.school_id=f.school_id and x.batch_id=f.batch_id          ");
+        sql.append("left join std_reg s on s.school_id=m.school_id and s.std_id=m.std_id   ");
+        sql.append("left join std_enrol e on e.school_id=m.school_id and e.std_id=m.std_id and e.status='Active' 				  ");
+        sql.append("left join frame_optr n on n.optr_id=m.initial_review_optr                                      ");
+        sql.append("left join frame_optr ro on ro.optr_id=m.real_initial_review_optr                                        ");
+        sql.append("where m.batch_id=? and m.apply_id != ? and m.detail_review_time >=? ");
+        if ("approv".equals(detail_type)) {//明细都是审核通过的
+            sql.append(" and m.status in ('Apply','SecondApply') ");
+            sql.append(" and not exists (select 1 from std_apply_detail where main_id=m.apply_id and back_status in ('New','Apply','SecondApply','Reject')) ");
+        } else if ("reject".equals(detail_type)) {//明细都审核了且有审核退回的
+            sql.append(" and m.status in ('Apply','SecondApply') ");
+            sql.append(" and m.re_check_time is null ");
+            sql.append(" and exists (select 1 from std_apply_detail where main_id=m.apply_id and back_status = 'Reject')");
+            sql.append(" and not exists (select 1 from std_apply_detail where main_id=m.apply_id and back_status in ('New','Apply','SecondApply'))");
+        }
+        sql.append(" order by m.detail_review_time asc ");
+        Map<String, Object> mapBySql = this.dao.findMapBySql(sql.toString(), batch_id, main_id, LocalDateHelper.parseDateTime(detail_review_time));
+        return new Ajax(mapBySql);
+    }
+
+    @RequestMapping("std/apply/main/reject/find.htm")
+    public Ajax rejectFind(Integer main_id) {
+        return new Ajax(this.dao.find(StdApplyMain.class, main_id));
+    }
+}

+ 15 - 0
src/main/java/cn/hmsoft/mr/control/std/StdEnrolControl.java

@@ -0,0 +1,15 @@
+package cn.hmsoft.mr.control.std;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RestController;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.mr.data.dao.std.StdEnrolDao;
+
+@RestController
+public class StdEnrolControl extends FrameControl {
+
+	@Autowired
+	private StdEnrolDao dao;
+	
+	
+}

+ 103 - 0
src/main/java/cn/hmsoft/mr/control/std/StdLayoutControl.java

@@ -0,0 +1,103 @@
+package cn.hmsoft.mr.control.std;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.log.LogHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.std.StdLayoutDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.std.StdLayout;
+import cn.hmsoft.mr.service.std.StdLayoutService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+
+/**
+ * 控制器.
+ *
+ * @author: shudonghui
+ * @date: 2023-07-19 13:44:53
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdLayoutControl extends FrameControl {
+
+    @Autowired
+    private StdLayoutService stdLayoutService;
+    @Autowired
+    private StdLayoutDao dao;
+
+    @RequestMapping("std/stdLayout/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type, Integer school_id, Integer batch_id) {
+        if (school_id == null) {
+            FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+            if (org == null || !org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+//                throw new BusinessException("只有学校老师才能操作!");
+            } else {
+                CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                        org.getDept_code(), org.getDept_id());
+                school_id = school.getSchool_id();
+            }
+
+        }
+        return new Ajax(this.stdLayoutService.page(query, start, limit, this.getQueryOrder(order, type), school_id, batch_id));
+    }
+
+    @RequestMapping("std/stdLayout/build.htm")
+    public Ajax build(Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+        final FrameOptr optr = this.getFrameOptr();
+        FrameDept org = this.dao.find(FrameDept.class, optr.getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能编排!");
+        }
+
+        LogHelper.info("optr_dept-->" + this.getFrameOptr().getOptr_dept() + ",school_code--->" + org.getDept_code());
+
+
+        FrameThread thread = FrameThreadHelper.createThread("考试编排线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+                "数据处理完成", optr);
+        try {
+            new Thread(() -> {
+                this.stdLayoutService.build(thread, school_id, batch_id, error_flag, optr,school);
+
+            }).start();
+        } catch (Exception e) {
+            FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+        }
+        return new Ajax(thread);
+    }
+
+    @RequestMapping("std/stdLayout/delete")
+    public Ajax delete(Integer school_id, Integer batch_id) {
+        return this.stdLayoutService.delete(school_id, batch_id, this.getFrameOptr());
+    }
+
+    @RequestMapping("std/stdLayout/add")
+    public Ajax add(StdLayout stdLayout) {
+        return this.stdLayoutService.add(stdLayout);
+    }
+
+    @RequestMapping("std/stdLayout/edit")
+    public Ajax edit(StdLayout stdLayout) {
+        return this.stdLayoutService.edit(stdLayout);
+    }
+
+
+    @RequestMapping("std/stdLayout/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.stdLayoutService.get(id));
+    }
+}

+ 76 - 0
src/main/java/cn/hmsoft/mr/control/std/StdRegControl.java

@@ -0,0 +1,76 @@
+package cn.hmsoft.mr.control.std;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.std.StdRegDao;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.service.std.StdRegService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+@RestController
+public class StdRegControl extends FrameControl {
+
+    @Autowired
+    private StdRegService service;
+
+    @Autowired
+    private StdRegDao dao;
+
+    //基础专业数据分页
+    @RequestMapping("std/page.htm")
+    public Ajax pageBase(Integer school_id, Integer batch_id, String query, Integer limit, Integer start, String order, String type) {
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+            CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                    org.getDept_code(), org.getDept_id());
+            school_id = school.getSchool_id();
+        }
+        return new Ajax(this.dao.pageStd(school_id, batch_id, start, limit, query, getQueryOrder(order, type)));
+    }
+
+    @RequestMapping("std/unbind.htm")
+    public Ajax unbind(Integer std_id, String weixin_id) {
+        this.service.unbind(std_id, weixin_id, this.getFrameOptr());
+        return new Ajax();
+    }
+
+    //查询限制考生
+    @RequestMapping("std/specila/list.htm")
+    public Ajax getStdSpecialList(Integer school_id) {
+        return new Ajax(this.dao.listMapBySql("select * from std_special_warn where school_id=?", school_id));
+    }
+
+    @CrossOrigin
+    @RequestMapping("std/reg/image/upload.htm")
+    public Ajax ImageUpload(MultipartFile file, String error_flag, String thread_flag) throws IOException {
+        final FrameOptr optr = this.getFrameOptr();
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        String school_code;
+        if (org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+            school_code = org.getDept_code();
+        } else {
+            school_code = null;
+        }
+        FrameThread thread = FrameThreadHelper.createThread("考生照片导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+                "数据处理完成", optr);
+        try {
+            new Thread(() -> this.service.uploadImageProcess(thread, error_flag, file, optr,school_code)).start();
+        } catch (Exception e) {
+            FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+        }
+        return new Ajax(thread);
+    }
+}

+ 712 - 0
src/main/java/cn/hmsoft/mr/control/std/StdTicketControl.java

@@ -0,0 +1,712 @@
+package cn.hmsoft.mr.control.std;
+
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.constants.FrameThreadCallbackType;
+import cn.hmsoft.frame.constants.FrameThreadStatus;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.frame.data.model.FrameDept;
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.frame.thread.FrameThreadHelper;
+import cn.hmsoft.helper.LocalDateHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.helper.excel.Excel2007Writer;
+import cn.hmsoft.helper.excel.ExcelReaderHelper;
+import cn.hmsoft.helper.pdf.ItextDocumentModel;
+import cn.hmsoft.helper.pdf.ItextPdfHelper;
+import cn.hmsoft.log.LogHelper;
+import cn.hmsoft.mr.constants.MRConst;
+import cn.hmsoft.mr.data.dao.std.StdTicketDao;
+import cn.hmsoft.mr.data.model.cf.CfAspect;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+import cn.hmsoft.mr.data.model.std.StdEnrol;
+import cn.hmsoft.mr.data.model.std.StdLayout;
+import cn.hmsoft.mr.data.model.std.StdReg;
+import cn.hmsoft.mr.data.model.std.StdTicket;
+import cn.hmsoft.mr.enrol.helper.EnrolMaterialHelper;
+import cn.hmsoft.mr.helper.ArtFileHelper;
+import cn.hmsoft.mr.service.std.StdTicketService;
+
+import com.itextpdf.io.font.PdfEncodings;
+import com.itextpdf.kernel.font.PdfFont;
+import com.itextpdf.kernel.font.PdfFontFactory;
+import com.itextpdf.kernel.geom.PageSize;
+import com.itextpdf.layout.Document;
+import com.itextpdf.layout.element.*;
+import com.itextpdf.layout.property.HorizontalAlignment;
+import com.itextpdf.layout.property.TextAlignment;
+import com.itextpdf.layout.property.UnitValue;
+import com.itextpdf.layout.property.VerticalAlignment;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+public class StdTicketControl extends FrameControl {
+
+    @Autowired
+    private StdTicketService service;
+    @Autowired
+    private StdTicketDao dao;
+
+    @RequestMapping("std/ticket/page.htm")
+    public Ajax pageBase(Integer school_id, Integer batch_id, String query, Integer limit, Integer start, String order, String type) {
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        if (org != null && org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+            CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                    org.getDept_code(), org.getDept_id());
+            school_id = school.getSchool_id();
+        }
+        return new Ajax(this.dao.pageTicket(school_id, batch_id, start, limit, query, getQueryOrder(order, type)));
+    }
+
+
+    @RequestMapping("std/ticket/count.htm")
+    public Ajax count(Integer school_id, String query, Integer limit, Integer start, String order, String type) {
+        FrameDept org = this.dao.find(FrameDept.class, this.getFrameOptr().getOptr_dept());
+        if (org != null && org.getDept_type().equals(MRConst.OrgType.School.toString())) {
+            CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_code=? and dept_id=?",
+                    org.getDept_code(), org.getDept_id());
+            school_id = school.getSchool_id();
+        }
+        return new Ajax(this.dao.count(school_id, start, limit, query, getQueryOrder(order, type)));
+    }
+
+    @RequestMapping("std/ticket/undownload/export.htm")
+    public void export(Integer school_id, Integer batch_id) {
+        List<List<Object>> values = new ArrayList<List<Object>>();
+        List<Object> headerList = new ArrayList<Object>();
+        ServletOutputStream outStream = null;
+        headerList.add("姓名");
+        headerList.add("证件号码");
+        headerList.add("联系电话");
+        values.add(headerList);
+
+        String sql = "SELECT DISTINCT r.std_name,r.cert_id,r.std_mobile FROM std_ticket t LEFT JOIN std_log l ON t.std_id=l.STD_ID AND l.LOG_TYPE='ticket' LEFT JOIN std_reg r ON r.std_id=t.std_id WHERE l.LOG_ID IS NULL" +
+                " and t.school_id=? AND t.batch_id=? ";
+        List<Map<String, Object>> list = this.dao.listMapBySql(sql, school_id, batch_id);
+        int i = 1;
+        for (Map<String, Object> map : list) {
+            List<Object> rowList = new ArrayList<Object>();
+            rowList.add(map.get("std_name"));
+            rowList.add(map.get("cert_id"));
+            rowList.add(map.get("std_mobile"));
+            values.add(rowList);
+            i++;
+        }
+        try {
+            String fileName = "未下载准考证考生" + LocalDateHelper.formatNoSplit(LocalDate.now()) + ".xlsx";
+            fileName = URLEncoder.encode(fileName, "UTF-8");
+            fileName = new String(fileName.getBytes(), "ISO-8859-1");
+            XSSFWorkbook wb = Excel2007Writer.createExcel(values);
+            ByteArrayOutputStream os = new ByteArrayOutputStream();
+            wb.write(os);
+            this.getResponse().reset();
+            this.getResponse().setContentType("application/x-msdownload");
+            this.getResponse().setHeader("Content-Disposition", "attachment; filename=" + fileName);
+            outStream = this.getResponse().getOutputStream();
+            outStream.write(os.toByteArray());
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outStream != null) {
+                try {
+                    outStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    //导入编排明细数据并且生成std_ticket准考证记录
+    @CrossOrigin
+    @RequestMapping("std/ticket/upload.htm")
+    public Ajax upload(MultipartFile file, Integer school_id, Integer batch_id, String error_flag, String thread_flag) throws IOException {
+        final FrameOptr optr = this.getFrameOptr();
+        FrameDept org = this.dao.find(FrameDept.class, optr.getOptr_dept());
+        CfSchool school = this.dao.findBySql(CfSchool.class, "select * from cf_school where school_id=?", school_id);
+        if (!org.getDept_type().equals(MRConst.OrgType.School.toString()) ||
+                !org.getDept_code().equals(school.getSchool_code())) {
+            throw new BusinessException("只有当前学校招办老师才能上传!");
+        }
+        LogHelper.info("optr_dept-->" + this.getFrameOptr().getOptr_dept() + ",school_code--->" + org.getDept_code());
+        LocalDateTime now = LocalDateTime.now();
+        Map<String, List<List<String>>> dataMap = ExcelReaderHelper.readExcel(file.getOriginalFilename(), file.getInputStream(), 1, 20);
+        List<List<String>> ticketList = dataMap.get("准考证编排数据");
+        List<List<String>> layoutList = dataMap.get("编排明细数据");
+
+        FrameThread thread = FrameThreadHelper.createThread("准考证导入线程", "数据需要进行处理", FrameThreadCallbackType.Swal,
+                "数据处理完成", optr);
+        try {
+            new Thread(() -> {
+                this.service.uploadProcess(thread, school_id, batch_id, error_flag, ticketList, layoutList, file, optr, school);
+                FrameThreadHelper.completeThread(thread, "准考上传完成!");
+            }).start();
+        } catch (Exception e) {
+            FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+        }
+        return new Ajax(thread);
+    }
+
+    //根据准考证记录std_ticket重新生成准考证文件
+    @RequestMapping("std/ticket/all/remake.htm")
+    public Ajax remakeAll(Integer school_id, Integer batch_id) {
+        FrameThread thread = FrameThreadHelper.createThread("准考证线程", "数据需要进行处理", FrameThreadCallbackType.Swal, "准考证线程", this.getFrameOptr());
+        new Thread(() -> {
+            try {
+                List<StdTicket> ticketList = this.dao.listBySql("select * from std_ticket where school_id=? and batch_id=?", school_id, batch_id);
+                for (int i = 0; i < ticketList.size(); i++) {
+                    StdTicket ticket = ticketList.get(i);
+                    StdReg std = this.dao.find(StdReg.class, ticket.getStd_id());
+                    if (StringHelper.isEmpty(std.getStd_sex())) {
+                        std.setStd_sex(this.getStdsexVal(std.getCert_id().substring(16, 17)));
+                    }
+                    StdEnrol enrol = this.dao.findBySql(StdEnrol.class, "select * from std_enrol where std_id=? and aspect_id=? and school_id=?",
+                            ticket.getStd_id(), ticket.getAspect_id(), ticket.getSchool_id());
+                    enrol.setStd_no(ticket.getStd_no());
+                    enrol.setDwdm(ticket.getDwdm());
+                    enrol.setDwmc(ticket.getDwmc());
+                    enrol.setBkyxsm(ticket.getBkyxsm());
+                    enrol.setBkyxsmc(ticket.getBkyxsmc());
+                    enrol.setGzdw(ticket.getGzdw());
+                    String file_name = EnrolMaterialHelper.generateMaterialName("ExamTicket", std.getCert_id()) + ".pdf";
+                    File ticketFile = new File(EnrolMaterialHelper.getEnrolMaterialLocalPath() + file_name);
+                    Image imgStdUpload = ArtFileHelper.generateStdImage(std.getStd_image());
+                    ItextPdfHelper.scaleImage(imgStdUpload, 56, 65);//72, 84
+                    List<StdLayout> layoutList = this.dao.listBySql(StdLayout.class, 
+                    		"select * from std_layout where std_id=? and school_id=? order by str_to_date(exam_start_time,'%Y/%m/%d %H:%i:%s')", 
+        					std.getStd_id(), std.getSchool_id());
+                    CfAspect aspect = this.dao.findBySql(CfAspect.class,
+                            "select * from cf_aspect f,cf_major m where f.major_id=m.major_id and f.school_id=m.school_id and f.batch_id=m.batch_id and f.aspect_id=? and f.school_id=? and f.batch_id=?",
+                            enrol.getAspect_id(), enrol.getSchool_id(), enrol.getBatch_id());
+                    this.service.buildTicketPdf(std, enrol, aspect, layoutList, ticketFile, imgStdUpload, false);
+                    //保存注考证记录
+                    ticket.setFile_path(file_name);
+                    this.dao.update(ticket);
+                    if (i % 50 == 0) {
+                        int percent = (i / ticketList.size() * 100);
+                        FrameThreadHelper.updateThread(thread, percent, "重制线程...", FrameThreadStatus.Running);
+                    }
+                }
+                FrameThreadHelper.completeThread(thread, "准考证重制完成!");
+            } catch (Exception e) {
+                LogHelper.error(e);
+                FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+            }
+        }).start();
+        return new Ajax(thread);
+
+
+    }
+
+    private String getStdsexVal(String std_sex) {
+        if (StringHelper.isNotEmpty(std_sex)) {
+            if (std_sex.equals("1")) {
+                return "男";
+            } else if (std_sex.equals("2")) {
+                return "女";
+            }
+        }
+        return "";
+    }
+
+    //生成准考证文件、更新准考证文件路径到std_ticket
+    @RequestMapping("std/ticket/make.htm")
+    public Ajax make(Integer ticket_id) {
+        StdTicket ticket = this.dao.find(ticket_id);
+        StdReg std = this.dao.find(StdReg.class, ticket.getStd_id());
+        if (StringHelper.isEmpty(std.getStd_sex())) {
+            std.setStd_sex(this.getStdsexVal(std.getCert_id().substring(16, 17)));
+        }
+        StdEnrol enrol = this.dao.findBySql(StdEnrol.class, "select * from std_enrol where std_id=? and aspect_id=? and school_id=?",
+                ticket.getStd_id(), ticket.getAspect_id(), ticket.getSchool_id());
+        String file_name = EnrolMaterialHelper.generateMaterialName("ExamTicket", std.getCert_id()) + ".pdf";
+        File ticketFile = new File(EnrolMaterialHelper.getEnrolMaterialLocalPath() + file_name);
+        try {
+            Image imgStdUpload = ArtFileHelper.generateStdImage(std.getStd_image());
+            ItextPdfHelper.scaleImage(imgStdUpload, 56, 65);//72, 84
+            List<StdLayout> layoutList = this.dao.listBySql(StdLayout.class, 
+            		"select * from std_layout where std_id=? and school_id=? order by str_to_date(exam_start_time,'%Y/%m/%d %H:%i:%s')", 
+					std.getStd_id(), std.getSchool_id());
+            CfAspect aspect = this.dao.findBySql(CfAspect.class,
+                    "select * from cf_aspect f,cf_major m where f.major_id=m.major_id and f.school_id=m.school_id and f.batch_id=m.batch_id and f.aspect_id=? and f.school_id=? and f.batch_id=?",
+                    enrol.getAspect_id(), enrol.getSchool_id(), enrol.getBatch_id());
+            this.service.buildTicketPdf(std, enrol, aspect, layoutList, ticketFile, imgStdUpload, false);
+            //保存注考证记录
+            ticket.setFile_path(file_name);
+            this.dao.update(ticket);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        this.downloadFile(ticketFile, ticketFile.getName());
+        return new Ajax();
+    }
+
+    @RequestMapping("std/time/list.htm")
+    public Ajax time(Integer school_id, Integer batch_id) {
+
+        List<Map<String, Object>> times = this.dao.listMapBySql("select DISTINCT exam_start_time from std_layout where  school_id=? and batch_id=? " +
+                        "order by exam_start_time",
+                school_id, batch_id);
+        return new Ajax(times);
+    }
+
+    @RequestMapping("std/desk/download.htm")
+    public Ajax desk(Integer school_id, Integer batch_id, String exam_start_time) {
+        File tempFile = FrameThreadHelper.generateTempFile();
+        FrameThread thread = FrameThreadHelper.createThread("座位条下载线程", "数据需要进行处理", FrameThreadCallbackType.Download,
+                FrameThreadHelper.generateDownloadParam(tempFile, "座位条.pdf"), this.getFrameOptr());
+
+        new Thread(() -> {
+
+            Document doc = null;
+            try {
+                ItextDocumentModel model = new ItextDocumentModel();
+
+                doc = model.prepareDocument(tempFile);
+    			doc.setMargins(20, 80, 20, 80);
+    			doc.setWidth(UnitValue.createPercentValue(80));
+                PdfFont pdfFont = ItextPdfHelper.getPdfFontSTSong();
+                doc.setFont(pdfFont);
+
+                String sql = "SELECT DISTINCT r.std_name,r.std_image,l.std_no,l.exam_start_time,l.room_seq,l.class_room_no,l.seat_no FROM std_layout l LEFT JOIN " +
+                        "std_reg r ON r" +
+                        ".std_id=l.std_id WHERE l.school_id=? AND l.batch_id=? ";
+                if (StringHelper.isNotEmpty(exam_start_time))
+                    sql += " and l.exam_start_time= '" + exam_start_time + "'";
+                sql += "order by exam_start_time,REPLACE ( REPLACE ( room_seq, '第', '' ), '考场','' )+ 0,seat_no+0";
+                List<Map<String, Object>> stdArray = this.dao.listMapBySql(sql, school_id, batch_id);
+                Map<String, List<Map<String, Object>>> roomArray = new LinkedHashMap<String, List<Map<String, Object>>>();
+                String room_addr = "";
+                for (Map<String, Object> map : stdArray) {
+                    String addr = map.get("room_seq").toString() + "--" + map.get("exam_start_time").toString();
+                    if (!addr.equals(room_addr)) {
+                        roomArray.put(addr, new ArrayList<>());
+                    }
+                    room_addr = addr;
+                    roomArray.get(addr).add(map);
+                }
+                int index = 0;
+                Integer page = 1;
+
+                for (String addr : roomArray.keySet()) {
+                    createDeskPage(doc, roomArray.get(addr));
+                    for (int i = 0; i < roomArray.get(addr).size(); i++) {
+
+                        addStd(doc, roomArray.get(addr).get(i));
+                        index++;
+                        if (i % 5 == 4 && i + 1 != roomArray.get(addr).size()) {
+                            createDeskPageFoot(doc, page);
+                            page++;
+                            doc.add(new AreaBreak());
+                            createDeskPage(doc, roomArray.get(addr));
+                            FrameThreadHelper.updateThread(thread, index * 100 / stdArray.size(), "数据导出中......",
+                                    FrameThreadStatus.Running);
+                        }
+
+                    }
+//					if (roomArray.get(addr).size() % 5 != 0)
+                    createDeskPageFoot(doc, page);
+                    page++;
+                    doc.add(new AreaBreak());
+
+                }
+
+
+                ItextPdfHelper.closePdf(doc);
+                FrameThreadHelper.completeThread(thread, "考生数据已导出");
+//				this.downloadFile(tempFile, "座位条.pdf", true);
+                // return tempFile;
+            } catch (Exception e) {
+                LogHelper.error(e);
+                FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+            }
+        }).start();
+
+        return new Ajax(thread);
+
+
+    }
+
+    protected void addStd(Document doc, Map<String, Object> std) {
+        Image image = ArtFileHelper.generateStdImage(std.get("std_image").toString());
+        ItextPdfHelper.scaleImage(image, 98, 98);
+
+        // 考生信息框
+        Table stdTable = new Table(new float[]{1, 2, 1}).setWidthPercent(100);
+        stdTable.addCell(new Cell(1, 1).add("姓名").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+
+        stdTable.addCell(new Cell(1, 1).add(std.get("std_name").toString()).setFontSize(16).setBold()
+                .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.LEFT)
+                .setTextAlignment(TextAlignment.LEFT).setMarginLeft(8));
+
+        // 考生照片
+        stdTable.addCell(new Cell(5, 1).add(image).setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.CENTER)
+                .setMarginTop(0).setMarginBottom(0).setMarginLeft(3.3f));
+
+
+        stdTable.addCell(new Cell(1, 1).add("考生编号").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+        // 姓名
+        stdTable.addCell(new Cell(1, 1).add(std.get("std_no").toString()).setFontSize(16).setBold()
+                .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.LEFT)
+                .setTextAlignment(TextAlignment.LEFT).setMarginLeft(8));
+
+        stdTable.addCell(new Cell(1, 1).add("考场号").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+        // 性别
+        stdTable.addCell(new Cell(1, 1).add(std.get("room_seq").toString()).setFontSize(16).setBold()
+                .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.LEFT)
+                .setTextAlignment(TextAlignment.LEFT).setMarginLeft(8));
+
+        stdTable.addCell(new Cell(1, 1).add("教室号").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+        // 准考证号
+        stdTable.addCell(new Cell(1, 1).add(std.get("class_room_no").toString()).setFontSize(16).setBold()
+                .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.LEFT)
+                .setTextAlignment(TextAlignment.LEFT).setMarginLeft(8));
+
+        stdTable.addCell(new Cell(1, 1).add("座位号").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+
+        stdTable.addCell(new Cell(1, 1).add(std.get("seat_no").toString()).setFontSize(16).setBold()
+                .setVerticalAlignment(VerticalAlignment.MIDDLE).setHorizontalAlignment(HorizontalAlignment.LEFT)
+                .setTextAlignment(TextAlignment.LEFT).setMarginLeft(8));
+        doc.add(stdTable.setMarginTop(5));
+
+
+    }
+
+    private void createDeskPage(Document doc, List<Map<String, Object>> stdArray) {
+
+
+        Paragraph p1 =
+                new Paragraph("考场地址:" + stdArray.get(0).get("room_seq").toString()+"-"+stdArray.get(0).get("class_room_no").toString() + "     考试时间:" + stdArray.get(0).get("exam_start_time").toString() + "   考生总数:" + stdArray.size())
+                        .setFontSize(12).setBold().setTextAlignment(TextAlignment.CENTER).setMarginTop(-15);
+        doc.add(p1);
+
+    }
+
+    private void createDeskPageFoot(Document doc, Integer page) {
+
+
+        Paragraph p1 = new Paragraph(page.toString()).setFontSize(12).setBold().setTextAlignment(TextAlignment.CENTER).setMarginTop(0);
+        doc.add(p1);
+
+    }
+
+    @RequestMapping("std/paper/download.htm")
+    public Ajax paper(Integer school_id, Integer batch_id, String exam_start_time) {
+        File tempFile = FrameThreadHelper.generateTempFile();
+        FrameThread thread = FrameThreadHelper.createThread("试卷记录表下载线程", "数据需要进行处理", FrameThreadCallbackType.Download,
+                FrameThreadHelper.generateDownloadParam(tempFile, "试卷记录表.pdf"), this.getFrameOptr());
+
+        new Thread(() -> {
+
+            Document doc = null;
+            try {
+                ItextDocumentModel model = new ItextDocumentModel();
+
+                doc = model.prepareDocument(tempFile);
+                PdfFont pdfFont = ItextPdfHelper.getPdfFontSTSong();
+                doc.setFont(pdfFont);
+                String sql = "SELECT  room_seq,class_room_no,exam_start_time,subject_name,count(std_id) count FROM std_layout WHERE school_id=? AND batch_id=? ";
+                if (StringHelper.isNotEmpty(exam_start_time))
+                    sql += " and exam_start_time= '" + exam_start_time + "'";
+                sql +=
+                        "GROUP BY room_seq,class_room_no,exam_start_time,subject_name ORDER BY REPLACE ( REPLACE ( room_seq, '第', '' ), '考场','' )+ 0,exam_start_time,subject_name";
+                List<Map<String, Object>> stdArray = this.dao.listMapBySql(sql, school_id, batch_id);
+                Map<String, List<Map<String, Object>>> subArray = new LinkedHashMap<String, List<Map<String, Object>>>();
+                String subject_name = "";
+                for (Map<String, Object> map : stdArray) {
+                    String addr = map.get("room_seq").toString() + "--" + map.get("exam_start_time").toString();
+                    if (!addr.equals(subject_name)) {
+                        subArray.put(addr, new ArrayList<>());
+                    }
+                    subject_name = addr;
+                    subArray.get(addr).add(map);
+                }
+                int index = 0;
+                for (String addr : subArray.keySet()) {
+                    createpaperPage(doc, addr);
+                    Table stdTable = new Table(new float[]{1, 1, 1, 2, 2}).setWidthPercent(100);
+
+                    stdTable.addCell(new Cell(1, 1).add("教室编号").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                            .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+                    stdTable.addCell(new Cell(1, 1).add("考试科目").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                            .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+                    stdTable.addCell(new Cell(1, 1).add("考场人数").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                            .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+                    stdTable.addCell(new Cell(1, 1).add("领取签字").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                            .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+                    stdTable.addCell(new Cell(1, 1).add("交还签字").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                            .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+
+                    for (int i = 0; i < subArray.get(addr).size(); i++) {
+
+
+                        stdTable.addCell(new Cell(1, 1).add(subArray.get(addr).get(i).get("class_room_no").toString()).setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                                .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+                        stdTable.addCell(new Cell(1, 1).add(subArray.get(addr).get(i).get("subject_name").toString()).setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                                .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+                        stdTable.addCell(new Cell(1, 1).add(subArray.get(addr).get(i).get("count").toString()).setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                                .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+                        stdTable.addCell(new Cell(1, 1).add("").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                                .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+                        stdTable.addCell(new Cell(1, 1).add("").setFontSize(12).setVerticalAlignment(VerticalAlignment.MIDDLE)
+                                .setHorizontalAlignment(HorizontalAlignment.CENTER).setTextAlignment(TextAlignment.CENTER));
+
+
+                        index++;
+
+                    }
+                    doc.add(stdTable.setMarginTop(15));
+                    FrameThreadHelper.updateThread(thread, index * 100 / stdArray.size(), "数据导出中......",
+                            FrameThreadStatus.Running);
+                    doc.add(new AreaBreak());
+
+                }
+
+                doc.getPdfDocument().removePage(doc.getPdfDocument().getLastPage());
+                ItextPdfHelper.closePdf(doc);
+                FrameThreadHelper.completeThread(thread, "数据已导出");
+//				this.downloadFile(tempFile, "座位条.pdf", true);
+            } catch (Exception e) {
+                LogHelper.error(e);
+                FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+            }
+        }).start();
+
+        return new Ajax(thread);
+
+
+    }
+
+    private void createpaperPage(Document doc, String subanme) {
+
+
+        Paragraph p1 = new Paragraph("2023年中国艺术研究院博士生考试").setFontSize(12).setBold().setTextAlignment(TextAlignment.CENTER).setMarginTop(5);
+        doc.add(p1);
+        p1 = new Paragraph(subanme + "领取/交还记录表").setFontSize(12).setBold().setTextAlignment(TextAlignment.CENTER).setMarginTop(10);
+        doc.add(p1);
+    }
+
+    @RequestMapping("/std/door/download.htm")
+    public Ajax door(Integer school_id, Integer batch_id, String exam_start_time) {
+        File tempFile = FrameThreadHelper.generateTempFile();
+        FrameThread thread = FrameThreadHelper.createThread("门帖下载线程", "数据需要进行处理", FrameThreadCallbackType.Download,
+                FrameThreadHelper.generateDownloadParam(tempFile, "门帖.pdf"), this.getFrameOptr());
+        new Thread(() -> {
+            Document doc = null;
+            try {
+                ItextDocumentModel model = new ItextDocumentModel();
+                model.rotate();
+                doc = model.prepareDocument(tempFile);
+                PdfFont pdfFont = ItextPdfHelper.getPdfFontSTSong();
+                doc.setFont(pdfFont);
+                // 每页考生数量
+                int pageStdCount = 30;
+                // 计算每个考生的margin
+                int top = 0, right = 10, bottom = 5, left = 5;
+                int std_row_margin = 0;
+                // 卡片之间的检录
+                int marginTop = 10, marginRight = 10, marginBottom = 10, marginLeft = 10;
+                String sql = "SELECT DISTINCT r.std_name,r.std_image,l.std_no,l.exam_start_time,l.room_seq,l.class_room_no,l.seat_no FROM std_layout l LEFT JOIN " +
+                        "std_reg r ON r" +
+                        ".std_id=l.std_id WHERE l.school_id=? AND l.batch_id=? ";
+                if (StringHelper.isNotEmpty(exam_start_time))
+                    sql += " and l.exam_start_time= '" + exam_start_time + "'";
+                sql += "order by exam_start_time,REPLACE ( REPLACE ( room_seq, '第', '' ), '考场','' )+ 0,seat_no+0";
+                List<Map<String, Object>> stdArray = this.dao.listMapBySql(sql, school_id, batch_id);
+                Map<String, List<Map<String, Object>>> roomArray = new LinkedHashMap<String, List<Map<String, Object>>>();
+                String room_addr = "";
+                for (Map<String, Object> map : stdArray) {
+                    String addr = map.get("room_seq").toString() + "--" + map.get("exam_start_time").toString();
+                    if (!addr.equals(room_addr)) {
+                        roomArray.put(addr, new ArrayList<Map<String, Object>>());
+                    }
+                    room_addr = addr;
+                    roomArray.get(addr).add(map);
+                }
+                int roomIndex = 1;
+                // 每行考生数
+                float[] mainCols = new float[5];
+                for (int i = 0; i < mainCols.length; i++)
+                    mainCols[i] = 100 / mainCols.length;
+                for (String addr : roomArray.keySet()) {
+                    Table mainTable = new Table(mainCols);
+                    this.createDeskPage(doc, roomArray.get(addr));
+                    // 宽度 及无边框设置
+                    mainTable.setWidthPercent(100).setBorder(null);
+//				boolean hasStd = false;
+                    for (int stdIndex = 0; stdIndex < roomArray.get(addr).size(); stdIndex++) {
+                        Map<String, Object> std = roomArray.get(addr).get(stdIndex);
+                        Table stdTable = new Table(new float[]{1});
+                        stdTable.setWidthPercent(100);
+                        stdTable.addCell(new Cell().add(this.createStdNormalSeat( std_row_margin, std))
+                                .setPaddings(top, right, bottom, left));
+                        mainTable.addCell(new Cell().add(stdTable).setMarginTop(marginTop).setMarginRight(marginRight)
+                                .setMarginBottom(marginBottom).setMarginLeft(marginLeft).setBorder(null));
+                        if (stdIndex > 0) {
+                            // 判断分页
+                            if ((stdIndex + 1) % pageStdCount == 0 || (stdIndex + 1) == roomArray.get(addr).size()) {
+                                doc.add(mainTable);
+                                // 判断本考场是否还有考生
+                                if (stdIndex < roomArray.get(addr).size() - 1) {
+                                    doc.add(new AreaBreak());
+                                    this.createDeskPage(doc, roomArray.get(addr));
+//								hasStd = true;
+                                } else {
+                                    // 没考生了
+//								hasStd = false;
+                                }
+                                mainTable = new Table(mainCols);
+                                // 宽度 及无边框设置
+                                mainTable.setWidthPercent(100).setBorder(null);
+                            }
+                        }
+                    }
+//				if (hasStd) {
+//					doc.add(mainTable);
+//				}
+                    if (roomIndex < roomArray.keySet().size() - 1)
+                        doc.add(new AreaBreak());
+                    roomIndex++;
+                    FrameThreadHelper.updateThread(thread, roomIndex * 100 / stdArray.size(), "数据导出中......",
+                            FrameThreadStatus.Running);
+                }
+                ItextPdfHelper.closePdf(doc);
+                FrameThreadHelper.completeThread(thread, "考生数据已导出");
+//				this.downloadFile(tempFile, "座位条.pdf", true);
+                // return tempFile;
+            } catch (Exception e) {
+                LogHelper.error(e);
+                FrameThreadHelper.completeThread(thread, "出现错误:" + e.getMessage(), FrameThreadStatus.Error);
+            }
+        }).start();
+
+        return new Ajax(thread);
+    }
+
+    /**********************
+     * 创建普通的单个考生桌贴
+     */
+    private Table createStdNormalSeat(int std_row_margin, Map<String, Object> std) {
+        float[] cs = {1, 1};
+        Table table = new Table(cs);
+        // 每个考生的宽度
+        table.setWidthPercent(100).setBorder(null);
+
+        if (std.containsKey("seat_no") && std.get("seat_no") != null && std.get("seat_no").toString().length() > 0)
+            table.addCell(new Cell(1, 2).add(std.get("seat_no").toString()).setBorder(null).setFontSize(12)
+                            .setMarginTop(std_row_margin)).setTextAlignment(TextAlignment.CENTER)
+                    .setVerticalAlignment(VerticalAlignment.MIDDLE);
+        table.addCell(new Cell(1, 1).add(std.get("std_no").toString()).setBold().setBorder(null).setFontSize(10)
+                .setMarginTop(std_row_margin).setTextAlignment(TextAlignment.CENTER).setBold()
+                .setVerticalAlignment(VerticalAlignment.MIDDLE));
+        // 考生姓名
+        String std_name = std.get("std_name").toString();
+        int font = 10;
+        if (std_name.length() == 4)
+            font = 9;
+        else if (std_name.length() == 5)
+            font = 7;
+        else if (std_name.length() > 5)
+            font = 5;
+        table.addCell(
+                new Cell(1, 1).add(std_name).setBorder(null).setBold().setFontSize(font).setMarginTop(std_row_margin)
+                        .setTextAlignment(TextAlignment.CENTER).setVerticalAlignment(VerticalAlignment.MIDDLE));
+        // 证件号码
+//        table.addCell(new Cell(1, 2).add(std.get("cert_id").toString()).setBorder(null).setBold().setFontSize(12)
+//                        .setMarginTop(std_row_margin)).setTextAlignment(TextAlignment.CENTER)
+//                .setVerticalAlignment(VerticalAlignment.MIDDLE);
+
+        return table;
+    }
+    
+    public static void main(String[] args) {
+    	Document doc = null;
+        try {
+            ItextDocumentModel model = new ItextDocumentModel();
+            File file = new File("C:\\Users\\admin\\Desktop\\desk.pdf");
+            doc = ItextPdfHelper.createPdf(file);
+            PdfFont pdfFont = null;
+			pdfFont = getSchoolFont("STSONG");
+            doc.setFont(pdfFont);
+			doc.setMargins(20, 80, 20, 80);
+			doc.setWidth(UnitValue.createPercentValue(80));
+			
+			StdTicketControl contr = new StdTicketControl();
+            List<Map<String, Object>> stdArray = new ArrayList<Map<String, Object>>();
+            Map<String, Object> stdM1 = new HashMap<String, Object>();
+            stdM1.put("room_seq", "1");stdM1.put("exam_start_time", "2024/4/25 9:30:00");stdM1.put("std_name", "安琪");
+            stdM1.put("std_no", "842014130100186");stdM1.put("class_room_no", "6206");stdM1.put("seat_no", "1");
+            stdM1.put("std_image", "C:\\Users\\admin\\Desktop\\8420199207.jpg");
+            stdArray.add(stdM1);
+            
+            
+            Map<String, List<Map<String, Object>>> roomArray = new LinkedHashMap<String, List<Map<String, Object>>>();
+            String room_addr = "";
+            for (Map<String, Object> map : stdArray) {
+                String addr = map.get("room_seq").toString() + "--" + map.get("exam_start_time").toString();
+                if (!addr.equals(room_addr)) {
+                    roomArray.put(addr, new ArrayList<>());
+                }
+                room_addr = addr;
+                roomArray.get(addr).add(map);
+            }
+            Integer page = 1;
+
+            for (String addr : roomArray.keySet()) {
+            	contr.createDeskPage(doc, roomArray.get(addr));
+                for (int i = 0; i < roomArray.get(addr).size(); i++) {
+
+                	contr.addStd(doc, roomArray.get(addr).get(i));
+                    if (i % 5 == 4 && i + 1 != roomArray.get(addr).size()) {
+                    	contr.createDeskPageFoot(doc, page);
+                        page++;
+                        doc.add(new AreaBreak());
+                        contr.createDeskPage(doc, roomArray.get(addr));
+                    }
+
+                }
+                contr.createDeskPageFoot(doc, page);
+                page++;
+                doc.add(new AreaBreak());
+            }
+            ItextPdfHelper.closePdf(doc);
+        } catch (Exception e) {
+            LogHelper.error(e);
+        }
+    }
+    
+	private static PdfFont getSchoolFont(String font_name) {
+		try {
+			return PdfFontFactory.createFont(
+					"D:\\work\\wks\\mr\\mr2022\\src\\main\\webapp\\fonts\\STSONG.TTF",
+					PdfEncodings.IDENTITY_H, false);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return ItextPdfHelper.getPdfFontSTSong();
+		}
+	}
+}

+ 35 - 0
src/main/java/cn/hmsoft/mr/control/wx/WxTemplateLogControl.java

@@ -0,0 +1,35 @@
+package cn.hmsoft.mr.control.wx;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.application.web.Ajax;
+import cn.hmsoft.frame.control.FrameControl;
+import cn.hmsoft.mr.service.wx.WxTemplateLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 微信模版消息发送记录 控制器.
+ * 
+ * @author: shudonghui
+ * @date: 2024-01-30 09:49:17
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class WxTemplateLogControl extends FrameControl {
+
+    @Autowired
+    private WxTemplateLogService wxTemplateLogService;
+	
+    @RequestMapping("wx/wxTemplateLog/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	order = "1";
+        }
+        return new Ajax(this.wxTemplateLogService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+
+}

+ 11 - 0
src/main/java/cn/hmsoft/mr/data/dao/ArtDao.java

@@ -0,0 +1,11 @@
+package cn.hmsoft.mr.data.dao;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.Art;
+
+@Repository
+public class ArtDao extends PlatformDaoSupport<Art> {
+
+}

+ 85 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfAspectDao.java

@@ -0,0 +1,85 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfAspect;
+
+@Repository
+public class CfAspectDao extends PlatformDaoSupport<CfAspect> {
+
+	public Pager pageAspect(Integer start, Integer limit, String query, QueryOrder queryOrder,
+                            Integer school_id, Integer dept_id, Integer batch_id, Integer major_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select a.*,m.major_code,m.major_name,b.batch_name from cf_aspect a  ");
+		sql.append("left join cf_batch b on b.batch_id=a.batch_id and b.school_id=a.school_id ");
+		sql.append("left join cf_major m on m.school_id=a.school_id and m.batch_id=a.batch_id and m.major_id=a.major_id ");
+		sql.append("where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and a.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and a.batch_id=").append(batch_id);
+		}
+		if (major_id != null) {
+			sql.append(" and a.major_id=").append(major_id);
+		}
+		if (dept_id != null) {
+			sql.append(" and a.dept_id=").append(dept_id);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (a.aspect_code like ? or a.aspect_name like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+	
+	public Pager pageAspect2(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id, Integer batch_id, String major_ids) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select a.*,m.major_code,m.major_name,b.batch_name from cf_aspect a  ");
+		sql.append("left join cf_batch b on b.batch_id=a.batch_id and b.school_id=a.school_id ");
+		sql.append("left join cf_major m on m.school_id=a.school_id and m.batch_id=a.batch_id and m.major_id=a.major_id ");
+		sql.append("where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and a.school_id=").append(school_id);
+		}
+		if (school_id != null) {
+			sql.append(" and a.batch_id=").append(batch_id);
+		}
+		if (StringHelper.isNotEmpty(major_ids)) {
+			sql.append(" and a.major_id in (").append(major_ids).append(")");
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (a.aspect_code like ? or a.aspect_name like ?) order by m.major_code,a.aspect_code*1 ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value);
+		} else {
+			sql.append(" order by m.major_code,a.aspect_code*1 ");
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+	public Pager pageMajor(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id, Integer batch_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select a.* from cf_major a where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and a.school_id=").append(school_id);
+		}
+		if (school_id != null) {
+			sql.append(" and a.batch_id=").append(batch_id);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (a.major_code like ? or a.major_name like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+}

+ 49 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfAspectOptrDao.java

@@ -0,0 +1,49 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfAspectOptr;
+
+@Repository
+public class CfAspectOptrDao extends PlatformDaoSupport<CfAspectOptr> {
+
+	public Pager pageAspectOptr(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id, Integer batch_id, Integer aspect_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select a.*,o.optr_name,o.login_name,o.optr_sex,o.optr_mobile,d.dept_name,o.optr_addr ");
+		sql.append("from cf_aspect_optr a,frame_optr o,frame_dept d where a.optr_id=o.optr_id and d.dept_id=o.optr_dept ");
+		if (school_id != null) {
+			sql.append(" and a.school_id=").append(school_id);
+		}
+		if (school_id != null) {
+			sql.append(" and a.batch_id=").append(batch_id);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (o.optr_name like ? or o.login_name like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+	public Pager pageSchoolOptr(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer dept_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select o.*,true isChecked from frame_optr o ");
+		sql.append("where o.optr_dept=? ");
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (o.optr_name like ? or o.login_name like ? or o.optr_mobile like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), dept_id, value, value, value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString(), dept_id);
+		}
+	}
+
+}

+ 30 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfAuthTagDao.java

@@ -0,0 +1,30 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfAuthTag;
+
+@Repository
+public class CfAuthTagDao extends PlatformDaoSupport<CfAuthTag> {
+
+	public Pager pageAuthTag(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select b.*,s.school_code,s.school_name from cf_auth_tag b,cf_school s where b.school_id=s.school_id ");
+		if (school_id != null) {
+			sql.append(" and b.school_id=").append(school_id);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (b.tag_name like ? or b.tag_desc like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+}

+ 41 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfBatchDao.java

@@ -0,0 +1,41 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfBatch;
+
+@Repository
+public class CfBatchDao extends PlatformDaoSupport<CfBatch> {
+
+	public Pager pageBatch(Integer start, Integer limit, String query, QueryOrder queryOrder, Integer school_id, Integer deptId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select b.*,s.school_code,s.school_name,p.pattern_name ");
+		sql.append("from cf_batch b  ");
+		sql.append("left join cf_school s on b.school_id=s.school_id    ");
+		sql.append("left join cf_pattern p on p.pattern_id=b.pattern_id ");
+		sql.append("where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and b.school_id=").append(school_id);
+		}
+		if (deptId != null) {
+			sql.append(" and b.dept_id=").append(deptId);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (b.batch_name like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+	//获取当前批次
+	public CfBatch getCurrentBatch(Integer school_id) {
+		return this.findBySql("select * from cf_batch where school_id=? and status=1 order by create_time desc", 
+				school_id);
+	}
+}

+ 31 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfEnrolParamDao.java

@@ -0,0 +1,31 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import java.util.List;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfEnrolParam;
+
+@Repository
+public class CfEnrolParamDao extends PlatformDaoSupport<CfEnrolParam> {
+
+	public Pager pageParam(Integer start, Integer limit, String query, QueryOrder order) {
+		StringBuilder sql = new StringBuilder("select * from cf_enrol_param p");
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(order, start, limit, sql.toString());
+		}
+		sql.append(" where param_type  like ? or param_name like ? or param_note like ? ");
+		String value = this.generateLikeParamter(query);
+		return this.pageMapBySql(order, start, limit, sql.toString(), value, value, value);
+	}
+
+	private final static String LIST_PARAM = "select * from cf_enrol_param where param_type=? or 1=?";
+
+	public List<CfEnrolParam> listParam(String param_type) {
+		return this.listBySql(LIST_PARAM, param_type, StringHelper.isEmpty(param_type) ? 1 : 2);
+
+	}
+
+}

+ 73 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfInitialOptrDao.java

@@ -0,0 +1,73 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import cn.hmsoft.frame.data.model.FrameDict;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfInitialOptr;
+
+import java.util.List;
+
+@Repository
+public class CfInitialOptrDao extends PlatformDaoSupport<CfInitialOptr> {
+
+	public Pager pageInitialOptr(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select a.*,f.school_name from cf_initial_optr a,cf_school f where a.school_id=f.school_id ");
+		if (school_id != null) {
+			sql.append(" and a.school_id=").append(school_id);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (f.school_name like ? or f.school_code like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+	public Integer findOptrId(String std_edu, Integer school_id) {
+		String sql="SELECT\n" +
+				"	d.optr_id \n" +
+				"FROM\n" +
+				"	cf_initial_optr_detail d\n" +
+				"	LEFT JOIN std_apply_main a ON a.initial_review_optr = d.optr_id\n" +
+				"	LEFT JOIN cf_initial_optr o ON o.id = d.main_id \n" +
+				"WHERE\n" +
+				"	o.std_edu =? \n" +
+				"	AND o.school_id =? \n" +
+				"GROUP BY\n" +
+				"	d.optr_id \n" +
+				"ORDER BY\n" +
+				"	count( a.apply_id ) asc \n" +
+				"	LIMIT 1";
+		return this.findObject(Integer.class,sql,std_edu,school_id);
+
+	}
+
+	public List<FrameDict> findBySchoolId(Integer schoolId) {
+		String sql="select d.* from frame_dict d left join  cf_initial_optr a on d.DICT_VALUE=a.std_edu where a.school_id=?";
+		return this.listBySql(FrameDict.class,sql,schoolId);
+	}
+
+	public Integer findReOptrId(String stdEdu, Integer schoolId) {
+		String sql="SELECT\n" +
+				"	d.optr_id \n" +
+				"FROM\n" +
+				"	cf_initial_re_optr_detail d\n" +
+				"	LEFT JOIN std_apply_main a ON a.initial_review_re_optr = d.optr_id\n" +
+				"	LEFT JOIN cf_initial_optr o ON o.id = d.main_id \n" +
+				"WHERE\n" +
+				"	o.std_edu =? \n" +
+				"	AND o.school_id =? \n" +
+				"GROUP BY\n" +
+				"	d.optr_id \n" +
+				"ORDER BY\n" +
+				"	count( a.apply_id ) asc \n" +
+				"	LIMIT 1";
+		return this.findObject(Integer.class,sql,stdEdu,schoolId);
+	}
+}

+ 30 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfMaterialCategoryDao.java

@@ -0,0 +1,30 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfMaterialCategory;
+
+@Repository
+public class CfMaterialCategoryDao extends PlatformDaoSupport<CfMaterialCategory> {
+
+	public Pager pageCategory(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id, Integer batch_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select b.*,s.school_code,s.school_name from cf_material_category b,cf_school s where b.school_id=s.school_id ");
+		if (school_id != null) {
+			sql.append(" and b.school_id=").append(school_id);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (b.catebory_name like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+}

+ 55 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfMaterialDefDao.java

@@ -0,0 +1,55 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.frame.data.model.FrameThread;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfMaterialDef;
+
+@Repository
+public class CfMaterialDefDao extends PlatformDaoSupport<CfMaterialDef> {
+
+	public Pager pageMaterialDef(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id, Integer batch_id, Integer category_id, String material_type) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select b.*,s.school_code,s.school_name,c.category_name from cf_material_def b ");
+		sql.append("left join cf_school s on b.school_id=s.school_id ");
+		sql.append("left join cf_material_category c on b.school_id=c.school_id and c.category_id=b.category_id ");
+		sql.append("where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and b.school_id=").append(school_id);
+		}
+		if (category_id != null) {
+			sql.append(" and b.category_id=").append(category_id);
+		}
+		if (StringHelper.isNotEmpty(material_type)) {
+			sql.append(" and b.material_type='").append(material_type).append("'");
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (b.material_name like ?) order by b.ord asc ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value);
+		} else {
+			sql.append(" order by b.ord asc ");
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+	public Pager pageFeedBack(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer material_def_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select b.* from cf_material_feedback b ");
+		sql.append("where b.material_def_id=? ");
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (b.feedback_msg like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), material_def_id, value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString(), material_def_id);
+		}
+	}
+
+}

+ 40 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfMaterialRuleDao.java

@@ -0,0 +1,40 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfMaterialRule;
+
+@Repository
+public class CfMaterialRuleDao extends PlatformDaoSupport<CfMaterialRule> {
+
+	public Pager pageMaterialRule(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id, Integer batch_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select r.*,s.school_code,s.school_name,d.material_name,b.batch_name,c.category_name,d.material_type ");
+		sql.append("from cf_material_rule r  ");
+		sql.append("inner join cf_material_def d on d.material_def_id=r.material_def_id and d.school_id=r.school_id ");
+		sql.append("left join cf_material_category c on c.category_id=d.category_id and c.school_id=d.school_id     ");
+		sql.append("left join cf_school s on s.school_id=r.school_id 							");
+		sql.append("left join cf_batch b on b.school_id=r.school_id  and b.batch_id=r.batch_id  ");
+		sql.append("where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and r.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and r.batch_id=").append(batch_id);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (d.material_name like ?) order by d.ord asc ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value);
+		} else {
+			sql.append(" order by d.ord asc ");
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+}

+ 41 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfMaterialTextAttrDao.java

@@ -0,0 +1,41 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.cf.CfMaterialTextAttr;
+
+/**
+ *  数据库处理.
+ * 
+ * @author: shudonghui
+ * @date: 2023-05-23 09:24:51
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class CfMaterialTextAttrDao extends PlatformDaoSupport<CfMaterialTextAttr> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 *
+	 * @param material_def_id
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param queryOrder
+	 * @return
+	 */
+	public Pager page(Integer material_def_id, String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from cf_material_text_attr where material_def_id=?";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql,material_def_id);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "and  attr_name like ?",material_def_id, generateLikeParamter(query));
+		}
+	}
+}

+ 26 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfPatternDao.java

@@ -0,0 +1,26 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfPattern;
+
+@Repository
+public class CfPatternDao extends PlatformDaoSupport<CfPattern> {
+
+	public Pager pagePattern(Integer start, Integer limit, String query, QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select p.*,(select count(1) from cf_batch where pattern_id=p.pattern_id) cnt from cf_pattern p where 1=1 ");
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (p.pattern_name like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+}

+ 23 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfPromiseInfoDao.java

@@ -0,0 +1,23 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfPromiseInfo;
+
+@Repository
+public class CfPromiseInfoDao extends PlatformDaoSupport<CfPromiseInfo> {
+
+	public Pager pagePromise(Integer school_id, Integer start, Integer limit, String query,
+			QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from cf_promise_info a where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and a.school_id=").append(school_id);
+		}
+		return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+	}
+
+}

+ 29 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfSchoolDao.java

@@ -0,0 +1,29 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfSchool;
+
+@Repository
+public class CfSchoolDao extends PlatformDaoSupport<CfSchool> {
+
+	public Pager pageSchool(Integer school_id, Integer start, Integer limit, String query, QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from cf_school b where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and school_id=").append(school_id);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (b.batch_name like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+}

+ 77 - 0
src/main/java/cn/hmsoft/mr/data/dao/cf/CfSubjectDao.java

@@ -0,0 +1,77 @@
+package cn.hmsoft.mr.data.dao.cf;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.cf.CfSubject;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 配置表-科目信息配置表 数据库处理.
+ *
+ * @author: shudonghui
+ * @date: 2023-07-19 13:53:41
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class CfSubjectDao extends PlatformDaoSupport<CfSubject> {
+
+    /**
+     * 构建QueryOrder(order,type)过滤.
+     *
+     * @param query
+     * @param start
+     * @param limit
+     * @param queryOrder
+     * @param school_id
+     * @param batch_id
+     * @return
+     */
+    public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder, Integer school_id, Integer batch_id) {
+        String sql = "select s.* from cf_subject s where 1=1 ";
+//		if (StringHelper.isEmpty(query)) {
+//			return this.pageMapBySql(queryOrder, start, limit, sql);
+//		} else {
+//			return this.pageMapBySql(queryOrder, start, limit,
+//					sql + "where 1 like ?", generateLikeParamter(query));
+//		}
+        if (school_id != null) {
+            sql += " and s.school_id=" + school_id;
+        }
+        if (batch_id != null) {
+            sql += " and s.batch_id=" + batch_id;
+        }
+        if (!StringHelper.isEmpty(query)) {
+            sql += " and (s.subject_code like ? or s.subject_name like ? ) ";
+            String value = this.generateLikeParamter(query.trim());
+            return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value,value,value);
+        } else {
+            return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+        }
+    }
+
+    public List<CfSubject> listBySchoolBacth(Integer school_id, Integer batch_id,String subject_type,Integer is_practice) {
+        String sql = "SELECT DISTINCT s.*FROM cf_subject s WHERE s.group_id IS NULL ";
+
+        if (school_id != null) {
+            sql += " and s.school_id=" + school_id;
+        }
+        if (batch_id != null) {
+            sql += " and s.batch_id=" + batch_id;
+        }
+        if (StringHelper.isNotEmpty(subject_type)) {
+            sql += " and s.subject_type='" + subject_type+"'";
+        }
+        if (is_practice != null) {
+            sql += " and s.is_practice=" + is_practice;
+        }
+
+        sql += "  order by subject_code";
+        return this.listBySql(sql);
+    }
+}

+ 16 - 0
src/main/java/cn/hmsoft/mr/data/dao/imp/FinalScoreDao.java

@@ -0,0 +1,16 @@
+package cn.hmsoft.mr.data.dao.imp;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.imp.FinalScore;
+
+@Repository
+public class FinalScoreDao extends PlatformDaoSupport<FinalScore> {
+
+
+	public FinalScore find(String std_name, String ticket_no, Integer school_id, Integer batch_id) {
+		String sql = "select * from final_score where std_name=? and ticket_no=? and school_id=? and batch_id=? and query_flag='Active'";
+		return this.findBySql(sql, std_name, ticket_no, school_id, batch_id);
+	}
+
+}

+ 49 - 0
src/main/java/cn/hmsoft/mr/data/dao/imp/ImpDataAdmitDao.java

@@ -0,0 +1,49 @@
+package cn.hmsoft.mr.data.dao.imp;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.imp.ImpDataAdmit;
+
+import java.util.List;
+
+/**
+ * 初始导入表 根据学校区分 数据库处理.
+ * 
+ * @author: shudonghui
+ * @date: 2022-11-30 10:15:31
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ImpDataAdmitDao extends PlatformDaoSupport<ImpDataAdmit> {
+
+
+
+	public ImpDataAdmit find(String std_name, String exam_id, Integer school_id, Integer batch_id) {
+		String sql = "select * from imp_data_admit where std_name=? and exam_id=? and school_id=? and batch_id=?";
+		return this.findBySql(sql,std_name,  exam_id,  school_id,  batch_id);
+	}
+
+
+	public Pager pageData(Integer school_id, Integer batch_id, Integer start, Integer limit, String query,
+	                      QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from imp_data_admit t where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and t.school_id=" + school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and t.batch_id=" + batch_id);
+		}
+		if (StringHelper.isNotEmpty(query)) {
+			sql.append(" and ( t.std_name like ?) ");
+			String value = this.generateLikeParamter(query);
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value, value);
+		}
+		return this.pageMapBySql(queryOrder, start, limit, sql.toString());
+	}
+}

+ 33 - 0
src/main/java/cn/hmsoft/mr/data/dao/imp/ImpDataDao.java

@@ -0,0 +1,33 @@
+package cn.hmsoft.mr.data.dao.imp;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.imp.ImpDataDefault;
+
+@Repository
+public class ImpDataDao extends PlatformDaoSupport<ImpDataDefault> {
+
+	public Pager pageData(Integer school_id, Integer batch_id, String school_code, Integer start, Integer limit, String query,
+			QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		//sql.append("select * from imp_data_" + school_code + " t where 1=1 ");
+		sql.append("select * from imp_data t where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and t.school_id=" + school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and t.batch_id=" + batch_id);
+		}
+		if (StringHelper.isNotEmpty(query)) {
+			sql.append(" and (t.cert_id like ? or t.std_name like ? or t.std_mobile like ?) ");
+			String value = this.generateLikeParamter(query);
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value, value);
+		}
+		return this.pageMapBySql(queryOrder, start, limit, sql.toString());
+	}
+
+}

+ 44 - 0
src/main/java/cn/hmsoft/mr/data/dao/imp/ImpDataScoreDao.java

@@ -0,0 +1,44 @@
+package cn.hmsoft.mr.data.dao.imp;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.imp.ImpDataScore;
+import org.springframework.stereotype.Repository;
+
+/**
+ * 初始导入表 根据学校区分 数据库处理.
+ *
+ * @author: shudonghui
+ * @date: 2022-11-30 10:15:31
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ImpDataScoreDao extends PlatformDaoSupport<ImpDataScore> {
+
+	public Pager pageData(Integer school_id, Integer batch_id, Integer start, Integer limit, String query,
+	                      QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from imp_data_score t where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and t.school_id=" + school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and t.batch_id=" + batch_id);
+		}
+		if (StringHelper.isNotEmpty(query)) {
+			sql.append(" and ( t.std_name like ?) ");
+			String value = this.generateLikeParamter(query);
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value, value);
+		}
+		return this.pageMapBySql(queryOrder, start, limit, sql.toString());
+	}
+
+	public ImpDataScore find(String std_name, String ticket_no, Integer school_id, Integer batch_id) {
+		String sql = "select * from imp_data_score where std_name=? and ticket_no=? and school_id=? and batch_id=?";
+		return this.findBySql(sql, std_name, ticket_no, school_id, batch_id);
+	}
+}

+ 46 - 0
src/main/java/cn/hmsoft/mr/data/dao/ly/LyGroupDao.java

@@ -0,0 +1,46 @@
+package cn.hmsoft.mr.data.dao.ly;
+
+import cn.hmsoft.frame.data.model.FrameThread;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.ly.LyGroup;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 编排分组设置 数据库处理.
+ * 
+ * @author: shudonghui
+ * @date: 2023-08-17 16:42:56
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class LyGroupDao extends PlatformDaoSupport<LyGroup> {
+
+
+	public List<LyGroup> list(Integer schoolId, Integer batchId) {
+		String sql = "select * from ly_group where school_id=? and batch_id=? order by ly_order ";
+		return this.listBySql(sql,schoolId,batchId);
+	}
+
+    public Map count(Integer schoolId, Integer batchId) {
+		String sql = "SELECT\n" +
+				"	COUNT(DISTINCT ( CASE WHEN a.is_practice = 1 THEN m.std_id ELSE NULL END ) ) practice,\n" +
+				"	COUNT(DISTINCT ( CASE WHEN a.is_practice = 0 THEN m.std_id ELSE NULL END )) nopractice,\n" +
+				"	sum( CASE WHEN r.std_edu = '03' THEN 1 ELSE 0 END ) equedu \n" +
+				"FROM\n" +
+				"	std_apply_main m\n" +
+				"	LEFT JOIN std_reg r ON r.std_id = m.std_id\n" +
+				"	LEFT JOIN std_enrol e ON m.std_id = e.std_id and e.`status`='Active'\n" +
+				"	LEFT JOIN cf_aspect a ON a.aspect_id = e.aspect_id \n" +
+				"WHERE\n" +
+				"	m.STATUS = 'FinalPass' \n" +
+				"	AND m.review_level <= a.pass_cnt \n" +
+				"	AND e.school_id = ? \n" +
+				"	AND e.batch_id =?";
+		return this.findMapBySql(sql,schoolId,batchId);
+    }
+}

+ 58 - 0
src/main/java/cn/hmsoft/mr/data/dao/ly/LyRoomDao.java

@@ -0,0 +1,58 @@
+package cn.hmsoft.mr.data.dao.ly;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.ly.LyRoom;
+
+import java.util.List;
+
+/**
+ *  数据库处理.
+ * 
+ * @author: shudonghui
+ * @date: 2023-07-18 09:37:12
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class LyRoomDao extends PlatformDaoSupport<LyRoom> {
+
+	/**
+     * 构建QueryOrder(order,type)过滤.
+     *
+     * @param query
+     * @param start
+     * @param limit
+     * @param queryOrder
+     * @param school_id
+     * @param batch_id
+     * @return
+     */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder, Integer school_id, Integer batch_id) {
+		String sql = "select * from ly_room where 1=1";
+//		if (StringHelper.isEmpty(query)) {
+//			return this.pageMapBySql(queryOrder, start, limit, sql);
+//		} else {
+//			return this.pageMapBySql(queryOrder, start, limit,
+//					sql + "where 1 like ?", generateLikeParamter(query));
+//		}
+		if (school_id != null) {
+			sql += " and school_id=" + school_id;
+		}
+		if (batch_id != null) {
+			sql += " and batch_id=" + batch_id;
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql += " and (room_code like ? or room_name like ?) ";
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+}

+ 72 - 0
src/main/java/cn/hmsoft/mr/data/dao/review/ReviewLogDao.java

@@ -0,0 +1,72 @@
+package cn.hmsoft.mr.data.dao.review;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.review.ReviewLog;
+
+@Repository
+public class ReviewLogDao extends PlatformDaoSupport<ReviewLog> {
+
+	public Pager pageReviewLogMain(Integer start, Integer limit, String query, QueryOrder queryOrder,
+                                   Integer school_id, Integer deptId, Integer batch_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select e.exam_id,s.std_name,s.std_mobile,s.std_edu,e.aspect_name,e.enr_doct_name,o.optr_name,  ");
+		sql.append("s.std_image,s.face_cmp_ret,s.study_verify_ret,f.major_name,m.*  					           ");
+		sql.append(" from std_apply_main m                                                                         ");
+		sql.append("left join std_reg s on s.std_id=m.std_id and s.school_id=m.school_id                           ");
+		sql.append("left join std_enrol e on s.std_id=e.std_id and e.school_id=s.school_id and e.status='Active'   ");
+		sql.append("left join frame_optr o on o.optr_id=m.initial_review_optr                                      ");
+		sql.append("left join cf_major f on f.major_id=e.major_id and f.school_id=e.school_id                      ");
+		sql.append("left join cf_aspect a on a.aspect_id=e.aspect_id and a.school_id=e.school_id                        ");
+		sql.append("where 1=1                                                                                      ");
+		
+		if (school_id != null) {
+			sql.append(" and m.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and m.batch_id=").append(batch_id);
+		}
+		if (deptId != null) {
+			sql.append(" and a.dept_id=").append(deptId);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (s.std_name like ? or s.cert_id like ? or e.exam_id like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value, value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+	
+	public Pager pageReviewLogDetail(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id, Integer batch_id, Integer std_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select g.*,o.login_name,s.std_name,s.cert_id,f.aspect_name,c.material_name ");
+		sql.append("from review_log g 	");
+		sql.append("inner join std_apply_main m on m.batch_id=g.batch_id and m.school_id=g.school_id and m.apply_id=g.main_id ");
+		sql.append("left join std_apply_detail d on d.main_id=g.main_id and d.detail_id=g.detail_id 	");
+		sql.append("left join cf_material_def c on c.school_id=g.school_id and c.material_def_id=d.material_def_id ");
+		sql.append("left join std_reg s on s.school_id=m.school_id and s.std_id=m.std_id 	");
+		sql.append("left join cf_aspect f on f.batch_id=m.batch_id and f.school_id=m.school_id and f.aspect_id=m.aspect_id ");
+		sql.append("left join frame_optr o on o.optr_id=g.review_optr 	");
+		sql.append("where g.main_id > 0 and m.std_id=? 	");
+		if (school_id != null) {
+			sql.append(" and g.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and g.batch_id=").append(batch_id);
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (s.std_name like ? or s.cert_id like ? or c.material_name like ?) ");
+			sql.append(" order by review_time ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), std_id, value, value, value);
+		} else {
+			sql.append(" order by review_time ");
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString(), std_id);
+		}
+	}
+}

+ 11 - 0
src/main/java/cn/hmsoft/mr/data/dao/review/ReviewPromiseDao.java

@@ -0,0 +1,11 @@
+package cn.hmsoft.mr.data.dao.review;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.review.ReviewPromise;
+
+@Repository
+public class ReviewPromiseDao extends PlatformDaoSupport<ReviewPromise> {
+
+}

+ 421 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdApplyDetailDao.java

@@ -0,0 +1,421 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.std.StdApplyDetail;
+import cn.hmsoft.mr.data.model.std.StdEnrol;
+import org.springframework.stereotype.Repository;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+@Repository
+public class StdApplyDetailDao extends PlatformDaoSupport<StdApplyDetail> {
+
+	public Pager pageDetailPage(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id, Integer batch_id, Integer main_id, String status) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select d.*,c.category_name,m.material_name,m.material_type,ro.optr_name real_optr_name ");
+		sql.append("from std_apply_detail d                                                                          ");
+		sql.append("left join frame_optr ro on ro.optr_id=d.real_initial_review_optr                                        ");
+		sql.append("left join cf_material_def m on m.material_def_id=d.material_def_id and m.school_id=d.school_id   ");
+		sql.append("left join cf_material_category c on c.category_id=m.category_id and c.school_id=m.school_id      ");
+		sql.append("where (select count(1) from std_upload u where u.detail_id=d.detail_id) > 0                      ");//只显示上传了的
+		if (school_id != null) {
+			sql.append(" and d.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and d.batch_id=").append(batch_id);
+		}
+		if (main_id != null) {
+			sql.append(" and d.main_id=").append(main_id);
+		}
+		if (status != null) {
+			sql.append(" and d.back_status='").append(status).append("'");
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (m.material_name like ? or c.category_name like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			sql.append(" order by m.ord ");
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value);
+		} else {
+			sql.append(" order by m.ord ");
+			return super.pageMapBySql(null, start, limit, sql.toString());
+		}
+	}
+	
+	//主记录对应的当前考生分页
+	public Pager pageFinalStdPage(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer main_id, Integer school_id, Integer batch_id, String status) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select d.*,c.category_name,m.material_name,ro.optr_name real_optr_name ");
+		sql.append("from std_apply_detail d                                                                          ");
+		sql.append("left join frame_optr ro on ro.optr_id=d.real_initial_review_optr                                        ");
+		sql.append("inner join cf_material_def m on m.material_def_id=d.material_def_id and m.school_id=d.school_id  ");
+		sql.append("left join cf_material_category c on c.category_id=m.category_id and c.school_id=m.school_id      ");
+		sql.append("where m.need_review=1                                                                            ");
+		if (main_id != null) {
+			sql.append(" and d.main_id=").append(main_id);
+		}
+		if (school_id != null) {
+			sql.append(" and d.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and d.batch_id=").append(batch_id);
+		}
+		sql.append(" order by m.ord ");
+		return super.pageMapBySql(null, start, limit, sql.toString());
+	}
+	
+	public Pager pageStdPassPage(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id, Integer batch_id, Integer aspect_id, String pass_type) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select m.std_id,s.std_name,m.review_level,e.exam_id,s.std_edu,s.std_mobile,e.enr_doct_name,x.major_name,f.aspect_name,ro.optr_name real_optr_name ");
+		sql.append("from std_apply_main m 	");
+		sql.append("left join frame_optr ro on ro.optr_id=m.real_initial_review_optr                                        ");
+		sql.append("inner join cf_aspect f on f.aspect_id=m.aspect_id and f.school_id=m.school_id and f.batch_id=m.batch_id ");
+		sql.append("left join cf_major x on x.major_id=f.major_id and f.school_id=f.school_id and x.batch_id=f.batch_id     ");
+		sql.append("left join std_reg s on s.school_id=m.school_id and s.std_id=m.std_id   ");
+		sql.append("left join std_enrol e on e.school_id=m.school_id and e.std_id=m.std_id and e.status='Active' ");
+		sql.append("where 1=1                                       ");
+		if ("passed".equals(pass_type)) {
+			sql.append(" and m.review_level<=f.pass_cnt ");
+		} else if ("no_passed".equals(pass_type)) {
+			sql.append(" and (m.review_level>f.pass_cnt ) ");
+		}
+		if (school_id != null) {
+			sql.append(" and m.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and m.batch_id=").append(batch_id);
+		}
+		if (aspect_id != null) {
+			sql.append(" and m.aspect_id=").append(aspect_id);
+		}
+		sql.append(" order by m.review_level ");
+		return super.pageMapBySql(null, start, limit, sql.toString());
+	}
+	
+	public Pager pageStdNoticePage(Integer start, Integer limit, String query, QueryOrder queryOrder,
+								   Integer school_id, Integer deptId, Integer batch_id, String major_ids, String optr_ids, String pass_type) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select m.std_id,s.std_name,m.review_level,e.exam_id,s.std_edu,s.std_mobile,e.enr_doct_name,x.major_name,f.aspect_name,ro.optr_name real_optr_name ");
+		sql.append("from std_apply_main m 	");
+		sql.append("left join frame_optr ro on ro.optr_id=m.real_initial_review_optr                                        ");
+		sql.append("inner join cf_aspect f on f.aspect_id=m.aspect_id and f.school_id=m.school_id and f.batch_id=m.batch_id      ");
+		sql.append("inner join cf_aspect_optr o on o.aspect_id=f.aspect_id and o.school_id=f.school_id and o.batch_id=f.batch_id ");
+		sql.append("inner join cf_major x on x.major_id=f.major_id and f.school_id=f.school_id and x.batch_id=f.batch_id          ");
+		sql.append("left join std_reg s on s.school_id=m.school_id and s.std_id=m.std_id   ");
+		sql.append("left join std_enrol e on e.school_id=m.school_id and e.std_id=m.std_id and e.status='Active' 				 ");
+		sql.append("where 1=1                                       ");
+		if ("passed".equals(pass_type)) {
+			sql.append(" and m.review_level<=f.pass_cnt ");
+		} else if ("no_passed".equals(pass_type)) {
+			sql.append(" and (m.review_level>f.pass_cnt ) ");
+		}
+		if (deptId != null) {
+			sql.append(" and f.dept_id=").append(deptId);
+		}
+		if (school_id != null) {
+			sql.append(" and m.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and m.batch_id=").append(batch_id);
+		}
+		if (StringHelper.isNotEmpty(major_ids)) {
+			sql.append(" and x.major_id in (").append(major_ids).append(") ");
+		}
+		if (StringHelper.isNotEmpty(optr_ids)) {
+			sql.append(" and o.optr_id in (").append(optr_ids).append(") ");
+		}
+
+		if (!StringHelper.isEmpty(query)) {
+			String value = this.generateLikeParamter(query.trim());
+			sql.append(" and (s.std_name like '").append(value).append("' or e.exam_id like '").append(value).append("') ");
+
+		}
+		sql.append(" order by m.review_level ");
+		//LogHelper.info("aspect_ids--->" + aspect_ids);
+		return super.pageMapBySql(null, start, limit, sql.toString());
+	}
+	
+	//准考不准考通知分页
+//	public List<Map<String, Object>> pageStdNoticelist(Integer school_id, Integer batch_id, 
+//			String aspect_ids, String optr_ids, String pass_type) {
+//		StringBuilder sql = new StringBuilder();
+//		sql.append("select m.std_id,s.std_name,m.review_level,e.exam_id,s.std_edu,s.std_mobile,e.enr_doct_name,x.major_name,f.aspect_name ");
+//		sql.append("from std_apply_main m 	");
+//		sql.append("inner join cf_aspect f on f.aspect_id=m.aspect_id and f.school_id=m.school_id and f.batch_id=m.batch_id      ");
+//		sql.append("inner join cf_aspect_optr o on o.aspect_id=f.aspect_id and o.school_id=f.school_id and o.batch_id=f.batch_id ");
+//		sql.append("left join cf_major x on x.major_id=f.major_id and f.school_id=f.school_id and x.batch_id=f.batch_id          ");
+//		sql.append("left join std_reg s on s.school_id=m.school_id and s.std_id=m.std_id   ");
+//		sql.append("left join std_enrol e on e.school_id=m.school_id and e.std_id=m.std_id ");
+//		sql.append("where 1=1  ");
+//		if ("passed".equals(pass_type)) {
+//			sql.append(" and m.review_level<=f.pass_cnt ");
+//		} else if ("no_passed".equals(pass_type)) {
+//			sql.append(" and (m.review_level>f.pass_cnt ) ");
+//		}
+//		if (school_id != null) {
+//			sql.append(" and m.school_id=").append(school_id);
+//		}
+//		if (batch_id != null) {
+//			sql.append(" and m.batch_id=").append(batch_id);
+//		}
+//		if (StringHelper.isNotEmpty(aspect_ids)) {
+//			sql.append(" and m.aspect_id in (").append(aspect_ids).append(") ");
+//		}
+//		if (StringHelper.isNotEmpty(optr_ids)) {
+//			sql.append(" and o.optr_id in (").append(optr_ids).append(") ");
+//		}
+//		sql.append(" order by m.review_level ");
+//		return this.listMapBySql(sql.toString());
+//	}
+
+	/**
+	 * 进度统计页
+	 *
+	 * @param start
+	 * @param limit
+	 * @param query
+	 * @param queryOrder
+	 * @param school_id
+	 * @param deptId
+	 * @param batch_id
+	 * @param has_confirm 是否已确认
+	 * @return
+	 */
+	public Pager pageFinalReviewProgress(Integer start, Integer limit, String query, QueryOrder queryOrder,
+										 Integer school_id, Integer deptId, Integer batch_id, String has_confirm) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select distinct x.major_name,f.aspect_name,r.optr_name,ifnull(a.total_cnt,0) total_cnt,ifnull(b.done_cnt,0) done_cnt,		");
+		sql.append("ifnull(c.to_be_cnt,0) to_be_cnt,f.batch_id,f.aspect_id,case when s.sign_time is not null then '是' else '否' end 'has_confirm' ");
+		sql.append("from cf_aspect f                                                                                                            ");
+		sql.append("inner join cf_major x on x.major_id=f.major_id and x.school_id=? and x.batch_id=?                                     	    ");
+		sql.append("left join cf_aspect_optr o on o.aspect_id=f.aspect_id and o.school_id=?                                                    ");
+		sql.append("left join frame_optr r on r.optr_id=o.optr_id                                                                              ");
+		sql.append("left join (                                                                                                                ");
+		sql.append("	select aspect_id,count(1) total_cnt from std_apply_main m 															   ");
+		sql.append("		where m.status !='Reject' and m.auth_time is not null and m.school_id=? and m.batch_id=? group by aspect_id	       ");
+		sql.append(") a on a.aspect_id = f.aspect_id                                                                                           ");
+		sql.append("left join (                                                                                                                ");
+		sql.append("	select aspect_id,count(1) done_cnt from std_apply_main m 															   ");
+		sql.append(" 		where  m.review_level is not null and m.school_id=? and m.batch_id=? group by aspect_id  						   ");
+		sql.append(") b on b.aspect_id = f.aspect_id                                                                                           ");
+		sql.append("left join (                                                                                                                ");
+		sql.append("	select aspect_id,count(1) to_be_cnt from std_apply_main m   														   ");
+		sql.append(" 		where m.status='InitialAppr' and m.review_level is null and m.school_id=? and m.batch_id=? group by aspect_id      ");
+		sql.append(") c on c.aspect_id = f.aspect_id                                                                                           ");
+		sql.append("left join review_sign s on s.aspect_id=o.aspect_id and s.review_optr=o.optr_id and s.school_id=f.school_id 				   ");
+		sql.append("where f.school_id=? and f.batch_id=?                                                                                       ");
+		if (deptId != null) {
+			sql.append(" and f.dept_id=").append(deptId);
+		}
+		if (StringHelper.isNotEmpty(has_confirm)) {
+			if (has_confirm.equals("是")) {
+				sql.append(" and s.sign_time is not null ");
+			} else {
+				sql.append(" and s.sign_time is null ");
+			}
+		}
+		if (StringHelper.isNotEmpty(query)) {
+			sql.append(" and (f.aspect_name like ? or x.major_name like ? or r.optr_name like ?) ");
+			String value = this.generateLikeParamter(query);
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), 
+					school_id, batch_id, 
+					school_id, 
+					school_id, batch_id,
+					school_id, batch_id,
+					school_id, batch_id,
+					school_id, batch_id,
+					value, value, value);
+		}
+		return super.pageMapBySql(queryOrder, start, limit, sql.toString(), 
+				school_id, batch_id, 
+				school_id, 
+				school_id, batch_id,
+				school_id, batch_id,
+				school_id, batch_id,
+				school_id, batch_id);
+	}
+	
+	public Map<String, Object> pageFinalReviewTotal(Integer school_id, Integer batch_id, Integer aspect_id, String query) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select (select count(1) total_cnt from std_apply_main m                                                                           ");
+		sql.append("						where m.status !='Reject' and m.auth_time is not null and m.school_id=? and m.batch_id=? ) total_cnt,     ");
+		sql.append("		(select count(1) done_cnt from std_apply_main m                                                                           ");
+		sql.append("						where m.review_level is not null and m.school_id=? and m.batch_id=?) done_cnt, 						      ");
+		sql.append("		(select count(1) to_be_cnt from std_apply_main m                                                                          ");
+		sql.append("						where m.status='InitialAppr' and m.review_level is null and m.school_id=? and m.batch_id=?) to_be_cnt     ");
+		sql.append("from dual                                                                                                                         ");
+		return this.findMapBySql(sql.toString(), 
+				school_id, batch_id, 
+				school_id, batch_id,
+				school_id, batch_id);
+	}
+	
+	/**
+	 * 进度明显分页-已评审、未评审
+	 * @param start
+	 * @param limit
+	 * @param query
+	 * @param queryOrder
+	 * @param school_id
+	 * @param batch_id
+	 * @param aspect_id
+	 * @param query_type
+	 * @return
+	 */
+	public Pager pageFinalProgressDetailPage(Integer start, Integer limit, String query, QueryOrder queryOrder,
+			Integer school_id, Integer batch_id, Integer aspect_id, String query_type) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select s.std_name,m.review_level,m.review_remark,m.review_time,e.exam_id,s.std_edu,s.std_mobile,e.enr_doct_name,f.pass_cnt,ro.optr_name real_optr_name ");
+		sql.append("from std_apply_main m 	");
+		sql.append("left join frame_optr ro on ro.optr_id=m.real_initial_review_optr                                        ");
+		sql.append("inner join cf_aspect f on f.aspect_id=m.aspect_id and f.school_id=m.school_id and f.batch_id=m.batch_id ");
+		sql.append("left join std_reg s on s.school_id=m.school_id and s.std_id=m.std_id   									");
+		sql.append("left join std_enrol e on e.school_id=m.school_id and e.std_id=m.std_id and e.status='Active'            ");
+		sql.append("where 1=1  ");
+		if ("done".equals(query_type)) {
+			sql.append("and review_level is not null ");
+		} else if ("un_done".equals(query_type)) {
+			sql.append(" and (m.review_level is null and m.status='InitialAppr')   ");
+		}
+		if (school_id != null) {
+			sql.append(" and m.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and m.batch_id=").append(batch_id);
+		}
+		if (aspect_id != null) {
+			sql.append(" and m.aspect_id=").append(aspect_id);
+		}
+		sql.append(" order by m.review_level asc ");
+		return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+	}
+
+
+	public List<Map<String, Object>> findCategoryList(Integer school_id,Integer batch_id,Integer aspect_id,String std_edu) {
+		String sql="SELECT \n" +
+				"	DISTINCT c.*\n" +
+				"FROM\n" +
+				"	cf_material_category c\n" +
+				"	LEFT JOIN cf_material_def m ON m.category_id = c.category_id \n" +
+				"	AND c.school_id = m.school_id \n" +
+				"	AND m.school_id = ?\n" +
+				"	LEFT JOIN cf_material_rule r ON r.material_def_id = m.material_def_id \n" +
+				"	AND r.school_id = m.school_id \n" +
+				"	AND r.batch_id = ?\n" +
+				"	LEFT JOIN cf_material_rule_detail d ON d.material_def_id = m.material_def_id \n" +
+				"	AND d.material_rule_id = r.material_rule_id \n" +
+				"	AND d.rule_type = 'std_edu' \n" +
+				"	AND d.rule_value = ?\n" +
+				"	LEFT JOIN cf_material_rule_detail d2 ON d2.material_def_id = m.material_def_id \n" +
+				"	AND d2.material_rule_id = r.material_rule_id \n" +
+				"	AND d2.rule_type = 'aspect' \n" +
+				"	AND d2.rule_value = ? \n" +
+				"WHERE\n" +
+				"	d.detail_id IS NOT NULL \n" +
+				"	AND d2.detail_id IS NOT NULL \n" +
+				" ORDER BY c.ord";
+//		String sql="SELECT \n" +
+//				"	DISTINCT c.*\n" +
+//				"FROM\n" +
+//				"	cf_material_category c\n" +
+//				"	left JOIN cf_material_def m ON m.category_id = c.category_id \n" +
+//				"	AND c.school_id = m.school_id \n" +
+//				"	AND m.school_id = ?\n" +
+//				"	left JOIN cf_material_rule r ON r.material_def_id = m.material_def_id \n" +
+//				"	AND r.school_id = m.school_id \n" +
+//				"	AND r.batch_id = ?\n" +
+//				"	left JOIN cf_material_rule_detail d ON d.material_def_id = m.material_def_id \n" +
+//				"	AND d.material_rule_id = r.material_rule_id \n" +
+//				"WHERE\n" +
+//				"	 ((\n" +
+//				"			d.rule_type = 'aspect' \n" +
+//				"			AND d.rule_value + 0 = ?\n" +
+//				"			) \n" +
+//				"	OR ( d.rule_type = 'std_edu' AND d.rule_value = ? ) or d.detail_id is null) AND\n" +
+//				"  c.school_id = ? \n" +
+//				"ORDER BY c.ord";
+		return super.listMapBySql(sql,school_id,batch_id,std_edu,aspect_id);
+	}
+	public List<Integer> findDefIds(Object category_id, Integer school_id, Integer batch_id, Integer aspect_id, String std_edu) {
+//		String sql="SELECT \n" +
+//				"	DISTINCT m.material_def_id \n" +
+//				"FROM\n" +
+//				"	cf_material_category c\n" +
+//				"	left JOIN cf_material_def m ON m.category_id = c.category_id \n" +
+//				"	AND c.school_id = m.school_id \n" +
+//				"	AND m.school_id = ?\n" +
+//				"	left JOIN cf_material_rule r ON r.material_def_id = m.material_def_id \n" +
+//				"	AND r.school_id = m.school_id \n" +
+//				"	AND r.batch_id = ?\n" +
+//				"	left JOIN cf_material_rule_detail d ON d.material_def_id = m.material_def_id \n" +
+//				"	AND d.material_rule_id = r.material_rule_id \n" +
+//				"WHERE\n" +
+//				"	 ((\n" +
+//				"			d.rule_type = 'aspect' \n" +
+//				"			AND d.rule_value + 0 = ?\n" +
+//				"			) \n" +
+//				"	OR ( d.rule_type = 'std_edu' AND d.rule_value = ? ) or d.detail_id is null) AND\n" +
+//				" c.category_id =? \n" ;
+		String sql="SELECT \n" +
+				"	DISTINCT m.material_def_id \n" +
+				"FROM\n" +
+				"	cf_material_category c\n" +
+				"	LEFT JOIN cf_material_def m ON m.category_id = c.category_id \n" +
+				"	AND c.school_id = m.school_id \n" +
+				"	AND m.school_id = ?\n" +
+				"	LEFT JOIN cf_material_rule r ON r.material_def_id = m.material_def_id \n" +
+				"	AND r.school_id = m.school_id \n" +
+				"	AND r.batch_id = ?\n" +
+				"	LEFT JOIN cf_material_rule_detail d ON d.material_def_id = m.material_def_id \n" +
+				"	AND d.material_rule_id = r.material_rule_id \n" +
+				"	AND d.rule_type = 'std_edu' \n" +
+				"	AND d.rule_value = ?\n" +
+				"	LEFT JOIN cf_material_rule_detail d2 ON d2.material_def_id = m.material_def_id \n" +
+				"	AND d2.material_rule_id = r.material_rule_id \n" +
+				"	AND d2.rule_type = 'aspect' \n" +
+				"	AND d2.rule_value = ? \n" +
+				"WHERE\n" +
+				"	d.detail_id IS NOT NULL \n" +
+				"	AND d2.detail_id IS NOT NULL \n" +
+				"	AND c.category_id = ? ";
+		return super.listObject(Integer.class,sql,school_id,batch_id,std_edu,aspect_id,category_id);
+	}
+
+
+
+
+
+	public List<Map<String, Object>> findDefList(List<Integer> ids, Integer std_id, Integer batch_id) {
+		String sql="SELECT" +
+				"	m.*," +
+				"	d.*, " +
+				"	d.remark apply_remark " +
+				"FROM" +
+				"	cf_material_def m" +
+				"	LEFT JOIN std_apply_detail d ON d.material_def_id = m.material_def_id " +
+				"	AND d.school_id = m.school_id " +
+				"	AND d.std_id = ? AND d.batch_id = ? " +
+				"WHERE" +
+				"	m.material_def_id in ("+ids.stream().map(String::valueOf).collect(Collectors.joining(","))+") " +
+				"	AND m.status = 1 " +
+				"ORDER BY" +
+				"	m.ord";
+		return super.listMapBySql(sql,std_id,batch_id);
+	}
+
+	public StdApplyDetail findByEnrol(int def_id, StdEnrol enrol) {
+		String sql="SELECT * from std_apply_detail where material_def_id=? and std_id=? and  school_id=? and batch_id=? ";
+		return super.findBySql(sql,def_id,enrol.getStd_id(),enrol.getSchool_id(),enrol.getBatch_id());
+	}
+
+
+
+
+}

+ 47 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdApplyDetailTextDao.java

@@ -0,0 +1,47 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.std.StdApplyDetailText;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 考生材料申请表 数据库处理.
+ * 
+ * @author: shudonghui
+ * @date: 2023-05-23 09:24:51
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class StdApplyDetailTextDao extends PlatformDaoSupport<StdApplyDetailText> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param queryOrder
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from std_apply_detail_text ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+
+	public List<Map<String, Object>> findByDefIdAndDetailId(Integer defId, Integer detailId) {
+		String sql = "SELECT DISTINCT a.*,t.text_id,t.detail_id,t.attr_text from cf_material_text_attr a left join std_apply_detail_text t on a.attr_id=t.attr_id and t.detail_id=?  where a.material_def_id=? ";
+		return this.listMapBySql(sql,detailId,defId);
+	}
+}

+ 259 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdApplyMainDao.java

@@ -0,0 +1,259 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.std.StdApplyMain;
+
+@Repository
+public class StdApplyMainDao extends PlatformDaoSupport<StdApplyMain> {
+
+	public Pager pageInitialPage(Integer start, Integer limit, String query, QueryOrder queryOrder,
+								 Integer school_id, Integer deptId, Integer batch_id, Integer optr_id, String status) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select e.exam_id,s.std_name,s.std_mobile,s.std_edu,e.aspect_name,e.enr_doct_name,o.optr_name,ro.optr_name real_optr_name,    ");
+		sql.append("s.std_image,s.face_cmp_ret,s.study_verify_ret,f.major_name,t.tag_name,t.tag_desc,t.tag_color,m.* ");
+		sql.append(" from std_apply_main m                                                                           ");
+		sql.append("left join std_reg s on s.std_id=m.std_id and s.school_id=m.school_id                             ");
+		sql.append("left join std_enrol e on s.std_id=e.std_id and e.school_id=s.school_id and e.status='Active'     ");
+		sql.append("left join frame_optr o on o.optr_id=m.initial_review_optr                                        ");
+		sql.append("left join frame_optr ro on ro.optr_id=m.real_initial_review_optr                                        ");
+		sql.append("left join cf_major f on f.major_id=e.major_id and f.school_id=e.school_id                        ");
+		sql.append("left join cf_aspect a on a.aspect_id=e.aspect_id and a.school_id=e.school_id                        ");
+		sql.append("left join cf_auth_tag t on t.school_id=m.school_id and t.tag_id=m.tag_id					     ");
+		sql.append("where 1=1                                                                                        ");
+		
+		if (school_id != null) {
+			sql.append(" and m.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and m.batch_id=").append(batch_id);
+		}
+		if (optr_id != null) {
+			sql.append(" and m.initial_review_optr=").append(optr_id);
+		}
+		if (deptId != null) {
+			sql.append(" and a.dept_id=").append(deptId);
+		}
+		if (StringHelper.isNotEmpty(status)) {
+			if (status.equals("DetailReview")) {//明细不存在没审核的
+				sql.append(" and m.status='Apply' and m.detail_review_time is not null  ");
+			} else if (status.equals("AdmQueryAll")) {//招办总账号查询所有初审老师的,不分状态
+				sql.append(" and m.initial_review_optr > 0  ");//考生没分配初审老师的 记录不查
+			} else {
+				sql.append(" and m.status='").append(status).append("'");
+			}
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (s.std_name like ? or s.std_mobile like ? or e.exam_id like ?) ");
+			sql.append(" order by m.detail_review_time asc ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value, value);
+		} else {
+			sql.append(" order by m.detail_review_time asc ");
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+
+	public StdApplyMain findByEnrolId(Integer enrol_id) {
+		String sql = "SELECT m.* FROM std_apply_main m LEFT JOIN std_enrol e ON m.std_id=e.std_id AND e.school_id=m.school_id AND e.batch_id=m" +
+				".batch_id WHERE e.enrol_id=?";
+		return super.findBySql(sql,enrol_id);
+
+	}
+
+	//初审账号统计查询
+	public Pager pageInitialReviewProgress(Integer start, Integer limit, String query, QueryOrder queryOrder,
+                                           Integer school_id, Integer deptId, Integer batch_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select b.school_id,b.optr_id,ifnull(m1.total_cnt,0) total_cnt,ifnull(m2.apply_cnt,0) apply_cnt,ifnull(m3.second_apply_cnt,0) second_apply_cnt, ");
+		sql.append("ifnull(m4.pass_cnt,0) pass_cnt,ifnull(m5.reject_cnt,0) reject_cnt,ifnull(m6.detail_review_cnt,0) detail_review_cnt,o.optr_name,o.login_name    ");
+		sql.append("from (select distinct school_id,optr_id from cf_initial_optr m,cf_initial_optr_detail d where m.id=d.main_id) b                                ");
+
+		if(deptId==null) {
+			sql.append("left join (select initial_review_optr,count(1) total_cnt from std_apply_main                                                                   ");
+			sql.append("			where school_id=? and batch_id=? and initial_review_optr > 0 group by initial_review_optr) m1 on m1.initial_review_optr=b.optr_id  ");
+			sql.append("left join (select initial_review_optr,count(1) apply_cnt from std_apply_main                                                                   ");
+			sql.append("			where school_id=? and batch_id=? and status='Apply' group by initial_review_optr) m2 on m2.initial_review_optr=b.optr_id           ");
+			sql.append("left join (select initial_review_optr,count(1) second_apply_cnt from std_apply_main                                                            ");
+			sql.append("			where school_id=? and batch_id=? and status='SecondApply' group by initial_review_optr) m3 on m3.initial_review_optr=b.optr_id     ");
+			sql.append("left join (select initial_review_optr,count(1) pass_cnt from std_apply_main                                                                    ");
+			sql.append("			where school_id=? and batch_id=? and status in ('InitialAppr','FinalScore') group by initial_review_optr) m4 on m4.initial_review_optr=b.optr_id ");
+			sql.append("left join (select initial_review_optr,count(1) reject_cnt from std_apply_main                                                                  ");
+			sql.append("			where school_id=? and batch_id=? and status='Reject' group by initial_review_optr) m5 on m5.initial_review_optr=b.optr_id	       ");
+			sql.append("left join (select initial_review_optr,count(1) detail_review_cnt from std_apply_main m                                                         ");
+			sql.append("			where school_id=? and batch_id=? and status='Apply' and m.detail_review_time is not null  										   ");
+			sql.append("			group by initial_review_optr) m6 on m6.initial_review_optr=b.optr_id           													   ");
+		}else{
+			sql.append("left join (select initial_review_optr,count(1) total_cnt from std_apply_main                                                                   ");
+			sql.append("			where school_id=? and batch_id=? and initial_review_optr > 0 and aspect_id in (SELECT aspect_id from cf_aspect where DEPT_ID="+deptId+")  group by initial_review_optr) m1 on m1.initial_review_optr=b.optr_id  ");
+			sql.append("left join (select initial_review_optr,count(1) apply_cnt from std_apply_main                                                                   ");
+			sql.append("			where school_id=? and batch_id=? and status='Apply' and aspect_id in (SELECT aspect_id from cf_aspect where DEPT_ID="+deptId+")   group by initial_review_optr) m2 on m2.initial_review_optr=b.optr_id           ");
+			sql.append("left join (select initial_review_optr,count(1) second_apply_cnt from std_apply_main                                                            ");
+			sql.append("			where school_id=? and batch_id=? and status='SecondApply' and aspect_id in (SELECT aspect_id from cf_aspect where DEPT_ID="+deptId+")   group by initial_review_optr) m3 on m3.initial_review_optr=b.optr_id     ");
+			sql.append("left join (select initial_review_optr,count(1) pass_cnt from std_apply_main                                                                    ");
+			sql.append("			where school_id=? and batch_id=? and status in ('InitialAppr','FinalScore') and aspect_id in (SELECT aspect_id from cf_aspect where DEPT_ID="+deptId+")   group by initial_review_optr) m4 on m4.initial_review_optr=b.optr_id ");
+			sql.append("left join (select initial_review_optr,count(1) reject_cnt from std_apply_main                                                                  ");
+			sql.append("			where school_id=? and batch_id=? and status='Reject' and aspect_id in (SELECT aspect_id from cf_aspect where DEPT_ID="+deptId+")   group by initial_review_optr) m5 on m5.initial_review_optr=b.optr_id	       ");
+			sql.append("left join (select initial_review_optr,count(1) detail_review_cnt from std_apply_main m                                                         ");
+			sql.append("			where school_id=? and batch_id=? and status='Apply' and m.detail_review_time is not null   and aspect_id in (SELECT aspect_id from cf_aspect where DEPT_ID="+deptId+")  										   ");
+			sql.append("			group by initial_review_optr) m6 on m6.initial_review_optr=b.optr_id           													   ");
+		}
+
+
+		sql.append("left join frame_optr o on o.optr_id=b.optr_id 	    ");
+		sql.append("where b.school_id=?     							");
+
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (o.optr_name like ? or o.login_name like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+//			sql.append(" order by b.optr_id ");
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(),
+					school_id, batch_id,school_id, batch_id,school_id, batch_id,school_id, batch_id,school_id, batch_id,school_id, batch_id,school_id
+					, value, value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString(),
+					school_id, batch_id,school_id, batch_id,school_id, batch_id,school_id, batch_id,school_id, batch_id,school_id, batch_id,school_id);
+		}
+	}
+
+	public Pager initialNoticePage(Integer start, Integer limit, String query, QueryOrder queryOrder,
+								   Integer school_id, Integer deptId, Integer batch_id, String major_ids, String optr_ids, String detail_type) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select distinct m.*,s.study_verify_ret,s.std_name,e.exam_id,s.std_edu,s.std_mobile,e.enr_doct_name,x.major_name,f.aspect_name,s.std_image,n.optr_name,ro.optr_name real_optr_name ");
+		sql.append("from std_apply_main m 	");
+		sql.append("inner join cf_aspect f on f.aspect_id=m.aspect_id and f.school_id=m.school_id and f.batch_id=m.batch_id       ");
+		sql.append("inner join cf_initial_optr o on o.school_id=m.school_id														  ");
+		sql.append("inner join cf_initial_optr_detail d on d.main_id=o.id and d.optr_id=m.initial_review_optr					  ");
+		sql.append("inner join cf_major x on x.major_id=f.major_id and f.school_id=f.school_id and x.batch_id=f.batch_id          ");
+		sql.append("left join std_reg s on s.school_id=m.school_id and s.std_id=m.std_id   ");
+		sql.append("left join std_enrol e on e.school_id=m.school_id and e.std_id=m.std_id and e.status='Active' 				  ");
+		sql.append("left join frame_optr n on n.optr_id=m.initial_review_optr                                      ");
+		sql.append("left join frame_optr ro on ro.optr_id=m.real_initial_review_optr                                        ");
+		sql.append("where 1=1                                       ");
+		if (school_id != null) {
+			sql.append(" and m.school_id=").append(school_id);
+		}
+		if (deptId != null) {
+			sql.append(" and f.dept_id=").append(deptId);
+		}
+		if (batch_id != null) {
+			sql.append(" and m.batch_id=").append(batch_id);
+		}
+		if (StringHelper.isNotEmpty(major_ids)) {
+			sql.append(" and x.major_id in (").append(major_ids).append(") ");
+		}
+		if (StringHelper.isNotEmpty(optr_ids)) {
+			sql.append(" and o.optr_id in (").append(optr_ids).append(") ");
+		}
+		if ("approv".equals(detail_type)) {//明细都是审核通过的
+			sql.append(" and m.status in ('Apply','SecondApply') ");
+			sql.append(" and not exists (select 1 from std_apply_detail where main_id=m.apply_id and back_status in ('New','Apply','SecondApply','Reject')) ");
+		} else if ("reject".equals(detail_type)) {//明细都审核了且有审核退回的
+			sql.append(" and m.status in ('Apply','SecondApply') ");
+			sql.append(" and exists (select 1 from std_apply_detail where main_id=m.apply_id and back_status = 'Reject')");
+			sql.append(" and not exists (select 1 from std_apply_detail where main_id=m.apply_id and back_status in ('New','Apply','SecondApply'))");
+		}
+		
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (s.std_name like ? or s.std_mobile like ? or e.exam_id like ? or n.optr_name like ? or e.enr_doct_name like ?) ");
+			String value = this.generateLikeParamter(query.trim());
+			sql.append(" order by m.re_check_time,m.detail_review_time asc ");
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value, value, value, value);
+		} else {
+			sql.append(" order by m.re_check_time,m.detail_review_time asc ");
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+	
+	//资格复审-分页
+	public Pager pageReCheckPage(Integer start, Integer limit, String query, QueryOrder queryOrder,
+								 Integer school_id, Integer deptId, Integer batch_id, String query_type, Integer optrId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select e.exam_id,s.std_name,s.std_mobile,s.std_edu,e.aspect_name,e.enr_doct_name,o.optr_name,ro.optr_name real_optr_name,  ");
+		sql.append("s.std_image,s.face_cmp_ret,s.study_verify_ret,f.major_name,m.*  					           ");
+		sql.append(" from std_apply_main m                                                                         ");
+		sql.append("left join std_reg s on s.std_id=m.std_id and s.school_id=m.school_id                           ");
+		sql.append("left join std_enrol e on s.std_id=e.std_id and e.school_id=s.school_id and e.status='Active'   ");
+		sql.append("left join frame_optr o on o.optr_id=m.initial_review_optr                                      ");
+		sql.append("left join frame_optr ro on ro.optr_id=m.real_initial_review_optr                                        ");
+		sql.append("left join cf_major f on f.major_id=e.major_id and f.school_id=e.school_id                      ");
+		sql.append("left join cf_aspect a on a.aspect_id=e.aspect_id and a.school_id=e.school_id                      ");
+		sql.append("where 1=1                                                                                      ");
+		
+		if (school_id != null) {
+			sql.append(" and m.school_id=").append(school_id);
+		}
+		if (optrId != null) {
+			sql.append(" and m.initial_review_re_optr=").append(optrId);
+		}
+		if (batch_id != null) {
+			sql.append(" and m.batch_id=").append(batch_id);
+		}
+		if (deptId != null) {
+			sql.append(" and a.dept_id=").append(deptId);
+		}
+		if (StringHelper.isNotEmpty(query_type)) {
+			if (query_type.equals("ToReCheck")) {//待资格复审
+				sql.append(" and m.status='ToReCheck'");
+			} else if (query_type.equals("ReCheckAppr")) {//资格复审通过
+				sql.append(" and m.status='InitialAppr' and re_check_time is not null ");
+			} else if (query_type.equals("ReCheckReject")) {//资格复审不通过
+				sql.append(" and m.status='Reject' and re_check_time is not null ");
+			}
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (s.std_name like ? or s.std_mobile like ? or e.exam_id like ?) ");
+			sql.append(" order by m.detail_review_time asc ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value, value);
+		} else {
+			sql.append(" order by m.detail_review_time asc ");
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+	
+	//考生审核标签
+	public Pager pageStdAuthTagPage(Integer start, Integer limit, String query, QueryOrder queryOrder,
+									Integer school_id, Integer deptId, Integer batch_id, Integer optr_id, String tag_ids) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select e.exam_id,s.std_name,s.std_mobile,s.std_edu,e.aspect_name,e.enr_doct_name,o.optr_name,ro.optr_name real_optr_name,    ");
+		sql.append("s.std_image,s.face_cmp_ret,s.study_verify_ret,f.major_name,t.tag_name,t.tag_desc,t.tag_color,m.* ");
+		sql.append(" from std_apply_main m                                                                           ");
+		sql.append("left join std_reg s on s.std_id=m.std_id and s.school_id=m.school_id                             ");
+		sql.append("left join std_enrol e on s.std_id=e.std_id and e.school_id=s.school_id and e.status='Active'     ");
+		sql.append("left join frame_optr o on o.optr_id=m.initial_review_optr                                        ");
+		sql.append("left join frame_optr ro on ro.optr_id=m.real_initial_review_optr                                        ");
+		sql.append("left join cf_major f on f.major_id=e.major_id and f.school_id=e.school_id                        ");
+		sql.append("left join cf_aspect a on a.aspect_id=e.aspect_id and a.school_id=e.school_id                        ");
+		sql.append("left join cf_auth_tag t on t.school_id=m.school_id and t.tag_id=m.tag_id					     ");
+		sql.append("where 1=1                                                                                        ");
+		
+		if (school_id != null) {
+			sql.append(" and m.school_id=").append(school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and m.batch_id=").append(batch_id);
+		}
+		if (optr_id != null) {
+			sql.append(" and m.initial_review_optr=").append(optr_id);
+		}
+		if (deptId != null) {
+			sql.append(" and a.dept_id=").append(deptId);
+		}
+		if (StringHelper.isNotEmpty(tag_ids)) {
+			sql.append(" and t.tag_id in (").append(tag_ids).append(") ");
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql.append(" and (s.std_name like ? or s.std_mobile like ? or e.exam_id like ?) ");
+			sql.append(" order by m.detail_review_time asc ");
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value, value);
+		} else {
+			sql.append(" order by m.detail_review_time asc ");
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+}

+ 16 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdEnrolDao.java

@@ -0,0 +1,16 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.std.StdEnrol;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class StdEnrolDao extends PlatformDaoSupport<StdEnrol> {
+
+	private final static String FIND_BY_ID = "select e.*,c.major_name from std_enrol e left join cf_major c on e.major_id=c.major_id  where " +
+			"enrol_id = ?";
+
+	public StdEnrol findById(Integer enrol_id) {
+		return this.findBySql(FIND_BY_ID, enrol_id);
+	}
+}

+ 55 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdLayoutDao.java

@@ -0,0 +1,55 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.std.StdLayout;
+
+/**
+ *  数据库处理.
+ * 
+ * @author: shudonghui
+ * @date: 2023-07-19 13:44:53
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class StdLayoutDao extends PlatformDaoSupport<StdLayout> {
+
+	/**
+     * 构建QueryOrder(order,type)过滤.
+     *
+     * @param query
+     * @param start
+     * @param limit
+     * @param queryOrder
+     * @param school_id
+     * @param batch_id
+     * @return
+     */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder, Integer school_id, Integer batch_id) {
+		String sql = "select * from std_layout where 1=1 ";
+//		if (StringHelper.isEmpty(query)) {
+//			return this.pageMapBySql(queryOrder, start, limit, sql);
+//		} else {
+//			return this.pageMapBySql(queryOrder, start, limit,
+//					sql + "where 1 like ?", generateLikeParamter(query));
+//		}
+		if (school_id != null) {
+			sql += " and school_id=" + school_id;
+		}
+		if (batch_id != null) {
+			sql += " and batch_id=" + batch_id;
+		}
+		if (!StringHelper.isEmpty(query)) {
+			sql += " and (std_no like ? ) ";
+			String value = this.generateLikeParamter(query.trim());
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value);
+		} else {
+			return super.pageMapBySql(queryOrder, start, limit, sql.toString());
+		}
+	}
+}

+ 56 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdLogDao.java

@@ -0,0 +1,56 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import java.time.LocalDateTime;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.mr.data.model.std.StdLog;
+
+@Repository
+public class StdLogDao extends PlatformDaoSupport<StdLog> {
+	/***********************
+	 * 分页查询
+	 */
+	public Pager pageLog(int std_id, Integer start, Integer limit) {
+		String sql = "select * from std_log where std_id=? order by log_time desc";
+		return this.pageMapBySql(start, limit, sql, std_id);
+	}
+
+	public StdLog log(int std_id, String log_type, FrameOptr optr) {
+		return log(std_id, log_type, LocalDateTime.now(), optr);
+	}
+
+	public StdLog log(int std_id, String log_type, FrameOptr optr, Object... args) {
+		return log(std_id, log_type, optr, LocalDateTime.now(), optr, args);
+	}
+
+	public StdLog log(int std_id, String log_type, LocalDateTime log_time, FrameOptr optr, Object... args) {
+		StdLog log = new StdLog();
+		if (log_time == null) {
+			log.setLog_time(LocalDateTime.now());
+		} else {
+			log.setLog_time(log_time);
+		}
+		log.setLog_type(log_type);
+		log.setStd_id(std_id);
+		if (optr != null) {
+			log.setOptr_id(optr.getOptr_id());
+			log.setOptr_name(optr.getOptr_name());
+		}
+
+		String log_value = "";
+		for (int i = 0; i < args.length; i++) {
+			if (args[i] != null) {
+				log_value = log_value + (i > 0 ? "~" : "") + args[i].toString();
+			}
+		}
+		log.setLog_value(log_value);
+
+		this.insert(log);
+		return log;
+	}
+
+}

+ 67 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdRegDao.java

@@ -0,0 +1,67 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import java.util.List;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.std.StdReg;
+
+@Repository
+public class StdRegDao extends PlatformDaoSupport<StdReg> {
+	private final static String FIND_BY_STDID = "select * from std_reg where std_id = ?";
+	
+	/***********************
+	 * 通过id查找考生
+	 */
+	public StdReg findByStdId(int std_id) {
+		return this.findBySql(FIND_BY_STDID, std_id);
+	}
+	
+	private final static String FIND_BY_OPENID = "select r.* from std_reg r where r.weixin_id =?";
+
+	/***********************
+	 * 通过微信号查找考生
+	 */
+	public StdReg findByOpenId(String open_id) {
+		List<StdReg> array = this.listBySql(StdReg.class, FIND_BY_OPENID, open_id);
+		if (array.size() > 1) {
+			throw new BusinessException("微信号【" + open_id + "】对应到多个考生,请联系管理员!");
+		}
+		if (array.size() == 0)
+			return null;
+		return array.get(0);
+	}
+	
+	private final static String FIND_BY_CERTID = "select * from std_reg where cert_id = ? and school_code=?";
+
+	/***********************
+	 * 通过身份证号查找考生
+	 */
+	public StdReg findByCertId(String cert_no, String school_code) {
+		List<StdReg> array = this.listBySql(FIND_BY_CERTID, cert_no.toUpperCase(),school_code);
+		if (array.size() > 1) {
+			throw new BusinessException("证件号【" + cert_no + "】对应到多个考生,请联系管理员!");
+		}
+		if (array.size() == 0)
+			return null;
+		return array.get(0);
+	}
+
+	public Pager pageStd(Integer school_id, Integer batch_id, Integer start, Integer limit, String query,
+			QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select t.*,e.exam_id from std_reg t left join std_enrol e on e.enrol_id=t.enrol_id where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and t.school_id=" + school_id);
+		}
+		if (StringHelper.isNotEmpty(query)) {
+			sql.append(" and (t.cert_id like ? or t.std_name like ? or t.std_mobile like ? or baccal_no like ?) ");
+			String value = this.generateLikeParamter(query);
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value, value, value);
+		}
+		return this.pageMapBySql(queryOrder, start, limit, sql.toString());
+	}
+}

+ 11 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdScoreDao.java

@@ -0,0 +1,11 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.std.StdScore;
+
+@Repository
+public class StdScoreDao extends PlatformDaoSupport<StdScore> {
+
+}

+ 45 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdTicketDao.java

@@ -0,0 +1,45 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.std.StdTicket;
+
+import java.util.List;
+
+@Repository
+public class StdTicketDao extends PlatformDaoSupport<StdTicket> {
+
+	public Pager pageTicket(Integer school_id, Integer batch_id, Integer start, Integer limit, String query,
+			QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select t.*,e.aspect_name,s.std_name,s.cert_id,s.std_mobile from std_ticket t ");
+		sql.append(" inner join std_reg s on s.school_id=t.school_id and s.std_id=t.std_id ");
+		sql.append(" left join std_enrol e on e.std_id=t.std_id and e.aspect_id=t.aspect_id and e.school_id=t.school_id and e.batch_id=t.batch_id ");
+		sql.append("where 1=1 ");
+		if (school_id != null) {
+			sql.append(" and t.school_id=" + school_id);
+		}
+		if (batch_id != null) {
+			sql.append(" and t.batch_id=" + batch_id);
+		}
+		if (StringHelper.isNotEmpty(query)) {
+			sql.append(" and (s.cert_id like ? or s.std_name like ? or s.std_mobile like ? or s.baccal_no like ? or t.ticket_no like ?) ");
+			String value = this.generateLikeParamter(query);
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString(), value, value, value, value, value);
+		}
+		return this.pageMapBySql(queryOrder, start, limit, sql.toString());
+	}
+
+    public Pager count(Integer school_id, Integer start, Integer limit, String query, QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("SELECT b.batch_id,b.batch_name,count(DISTINCT t.std_id) total,count(DISTINCT l.STD_ID) download FROM std_ticket t LEFT JOIN std_log l ON t.std_id=l.STD_ID AND l.LOG_TYPE='ticket' LEFT JOIN cf_batch b ON t.batch_id=b.batch_id ");
+		if (school_id != null) {
+			sql.append(" where t.school_id=" + school_id);
+		}
+		sql.append(" group by b.batch_id,b.batch_name");
+		return this.pageMapBySql(queryOrder, start, limit, sql.toString());
+    }
+}

+ 38 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdUploadDao.java

@@ -0,0 +1,38 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import cn.hmsoft.mr.data.model.std.StdEnrol;
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.std.StdUpload;
+
+import java.util.List;
+
+@Repository
+public class StdUploadDao extends PlatformDaoSupport<StdUpload> {
+
+	public List<StdUpload> findByDetailId(Object detail_id) {
+		return this.listBySql("select * from std_upload where detail_id=?", detail_id);
+	}
+
+	public List<StdUpload> getEduUploads(StdEnrol enrol) {
+		String sql="SELECT DISTINCT\n" +
+				"	u.* \n" +
+				"FROM\n" +
+				"	std_upload u\n" +
+				"	INNER JOIN std_apply_detail sd ON sd.detail_id = u.detail_id\n" +
+				"	INNER JOIN cf_material_def m ON m.material_def_id = sd.material_def_id \n" +
+				"	AND sd.school_id = m.school_id \n" +
+				"	AND m.school_id = ?\n" +
+				"	INNER JOIN cf_material_rule r ON r.material_def_id = m.material_def_id \n" +
+				"	AND r.school_id = m.school_id \n" +
+				"	AND r.batch_id = ?\n" +
+				"	INNER JOIN cf_material_rule_detail d ON d.material_def_id = m.material_def_id \n" +
+				"	AND d.material_rule_id = r.material_rule_id \n" +
+				"	AND d.rule_type = 'std_edu' \n" +
+				"WHERE\n" +
+				"	sd.std_id = ?";
+		return this.listBySql(sql, enrol.getSchool_id(),enrol.getBatch_id(),enrol.getStd_id());
+
+	}
+}

+ 34 - 0
src/main/java/cn/hmsoft/mr/data/dao/std/StdWeixinDao.java

@@ -0,0 +1,34 @@
+package cn.hmsoft.mr.data.dao.std;
+
+import cn.hmsoft.frame.exception.BusinessException;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.mr.data.model.std.StdReg;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.mr.data.model.std.StdWeixin;
+
+import java.util.List;
+
+/**
+ * 考生微信绑定表 数据库处理.
+ * 
+ * @author: shudonghui
+ * @date: 2022-10-26 13:52:58
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class StdWeixinDao extends PlatformDaoSupport<StdWeixin> {
+
+
+
+
+	private final static String FIND = "select * from std_weixin where std_id=? and school_code=? and enrol_id=? ";
+
+	public StdWeixin findWeixin(String school_code, Integer std_id, Integer enrol_id) {
+		return this.findBySql(FIND,std_id,school_code,enrol_id);
+	}
+}

+ 39 - 0
src/main/java/cn/hmsoft/mr/data/dao/wx/WxTemplateLog2Dao.java

@@ -0,0 +1,39 @@
+package cn.hmsoft.mr.data.dao.wx;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.weixin.data.model.WxTemplateLog;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+
+/**
+ * 微信模版消息发送记录 数据库处理.
+ * 
+ * @author: shudonghui
+ * @date: 2024-01-30 09:49:17
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class WxTemplateLog2Dao extends PlatformDaoSupport<WxTemplateLog> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param queryOrder
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select l.*,r.std_name,r.cert_id,r.std_mobile from wx_template_log l left join std_reg r on r.weixin_id=l.OPEN_ID where l.result_status!=0 ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "and (r.std_name like ? or r.cert_id like ?)", generateLikeParamter(query),generateLikeParamter(query));
+		}
+	}
+}

+ 15 - 0
src/main/java/cn/hmsoft/mr/data/model/Art.java

@@ -0,0 +1,15 @@
+package cn.hmsoft.mr.data.model;
+
+import java.io.Serializable;
+
+public class Art implements Serializable {
+
+	private static final long serialVersionUID = -5696712877494287119L;
+	
+	public static void main(String[] args) {
+		String str = "戏剧剧本创作与编剧理论研究";
+		System.out.println(str);
+		System.out.println(str.substring(0, 6));
+		System.out.println(str.substring(6, str.length() - 1));
+	}
+}

+ 130 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfAspect.java

@@ -0,0 +1,130 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import cn.hmsoft.jdbc.entity.Table;
+
+@Table(tableName = "cf_aspect", keyColumn = "ASPECT_ID", sequenceName = "ASPECT_ID")
+public class CfAspect implements Serializable {
+
+	private static final long serialVersionUID = -324054704273655868L;
+	private Integer aspect_id;
+	private Integer major_id;
+	private String aspect_code;
+	private String aspect_name;
+	private Integer school_id;
+	private Integer dept_id;
+	private Integer batch_id;
+	private Integer enrol_cnt;//报考人数
+	private Integer pass_percent;//通过率
+	private Integer initial_pass_cnt;//初审通过人数
+	private Integer pass_cnt;//准考人数=初审通过人数 * 通过率
+	private Integer is_practice;//理论或实践。0,1
+	private Integer ly_order;//编排排序
+	
+	protected String review_teacher;//专业评审老师
+	protected String major_code;//专业代码
+	protected String major_name;//专业名称
+	
+	public Integer getAspect_id() {
+		return aspect_id;
+	}
+	public void setAspect_id(Integer aspect_id) {
+		this.aspect_id = aspect_id;
+	}
+	public String getAspect_name() {
+		return aspect_name;
+	}
+	public void setAspect_name(String aspect_name) {
+		this.aspect_name = aspect_name;
+	}
+	public Integer getSchool_id() {
+		return school_id;
+	}
+	public void setSchool_id(Integer school_id) {
+		this.school_id = school_id;
+	}
+	public Integer getBatch_id() {
+		return batch_id;
+	}
+	public void setBatch_id(Integer batch_id) {
+		this.batch_id = batch_id;
+	}
+	public String getAspect_code() {
+		return aspect_code;
+	}
+	public void setAspect_code(String aspect_code) {
+		this.aspect_code = aspect_code;
+	}
+	public Integer getMajor_id() {
+		return major_id;
+	}
+	public void setMajor_id(Integer major_id) {
+		this.major_id = major_id;
+	}
+	public Integer getPass_percent() {
+		return pass_percent;
+	}
+	public Integer getPass_cnt() {
+		return pass_cnt;
+	}
+	public void setPass_percent(Integer pass_percent) {
+		this.pass_percent = pass_percent;
+	}
+	public void setPass_cnt(Integer pass_cnt) {
+		this.pass_cnt = pass_cnt;
+	}
+	public Integer getEnrol_cnt() {
+		return enrol_cnt;
+	}
+	public void setEnrol_cnt(Integer enrol_cnt) {
+		this.enrol_cnt = enrol_cnt;
+	}
+	public String getReview_teacher() {
+		return review_teacher;
+	}
+	public void setReview_teacher(String review_teacher) {
+		this.review_teacher = review_teacher;
+	}
+	public Integer getInitial_pass_cnt() {
+		return initial_pass_cnt;
+	}
+	public void setInitial_pass_cnt(Integer initial_pass_cnt) {
+		this.initial_pass_cnt = initial_pass_cnt;
+	}
+	public String getMajor_code() {
+		return major_code;
+	}
+	public String getMajor_name() {
+		return major_name;
+	}
+	public void setMajor_code(String major_code) {
+		this.major_code = major_code;
+	}
+	public void setMajor_name(String major_name) {
+		this.major_name = major_name;
+	}
+
+	public Integer getDept_id() {
+		return dept_id;
+	}
+
+	public void setDept_id(Integer dept_id) {
+		this.dept_id = dept_id;
+	}
+
+	public Integer getIs_practice() {
+		return is_practice;
+	}
+
+	public void setIs_practice(Integer is_practice) {
+		this.is_practice = is_practice;
+	}
+
+	public Integer getLy_order() {
+		return ly_order;
+	}
+
+	public void setLy_order(Integer ly_order) {
+		this.ly_order = ly_order;
+	}
+}

+ 95 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfAspectOptr.java

@@ -0,0 +1,95 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import cn.hmsoft.jdbc.entity.Table;
+
+/**
+ * 专业评审老师和专业映射
+ * @author zq
+ *
+ */
+@Table(tableName = "cf_aspect_optr", keyColumn = "", sequenceName = "")
+public class CfAspectOptr implements Serializable {
+
+	private static final long serialVersionUID = 7804087104221940238L;
+	private Integer school_id;
+	private Integer batch_id;
+	private Integer aspect_id;
+	private Integer optr_id;
+	
+	protected String login_name;
+	protected String optr_name;
+	protected String optr_sex;
+	protected String optr_pass;
+	protected String optr_mobile;
+	protected Integer optr_dept;
+	protected String optr_addr;
+	
+	public Integer getAspect_id() {
+		return aspect_id;
+	}
+	public void setAspect_id(Integer aspect_id) {
+		this.aspect_id = aspect_id;
+	}
+	public Integer getOptr_id() {
+		return optr_id;
+	}
+	public void setOptr_id(Integer optr_id) {
+		this.optr_id = optr_id;
+	}
+	public String getLogin_name() {
+		return login_name;
+	}
+	public void setLogin_name(String login_name) {
+		this.login_name = login_name;
+	}
+	public String getOptr_name() {
+		return optr_name;
+	}
+	public void setOptr_name(String optr_name) {
+		this.optr_name = optr_name;
+	}
+	public String getOptr_sex() {
+		return optr_sex;
+	}
+	public void setOptr_sex(String optr_sex) {
+		this.optr_sex = optr_sex;
+	}
+	public String getOptr_pass() {
+		return optr_pass;
+	}
+	public void setOptr_pass(String optr_pass) {
+		this.optr_pass = optr_pass;
+	}
+	public String getOptr_mobile() {
+		return optr_mobile;
+	}
+	public void setOptr_mobile(String optr_mobile) {
+		this.optr_mobile = optr_mobile;
+	}
+	public Integer getOptr_dept() {
+		return optr_dept;
+	}
+	public void setOptr_dept(Integer optr_dept) {
+		this.optr_dept = optr_dept;
+	}
+	public String getOptr_addr() {
+		return optr_addr;
+	}
+	public void setOptr_addr(String optr_addr) {
+		this.optr_addr = optr_addr;
+	}
+	public Integer getSchool_id() {
+		return school_id;
+	}
+	public void setSchool_id(Integer school_id) {
+		this.school_id = school_id;
+	}
+	public Integer getBatch_id() {
+		return batch_id;
+	}
+	public void setBatch_id(Integer batch_id) {
+		this.batch_id = batch_id;
+	}
+	
+}

+ 47 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfAuthTag.java

@@ -0,0 +1,47 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import cn.hmsoft.jdbc.entity.Table;
+
+@Table(tableName = "CF_AUTH_TAG", keyColumn = "TAG_ID", sequenceName = "TAG_ID")
+public class CfAuthTag implements Serializable {
+	
+	private static final long serialVersionUID = 7868315374687630596L;
+	private Integer tag_id;
+	private String tag_name;
+	private String tag_desc;
+	private String tag_color;
+	private Integer school_id;
+	
+	public Integer getTag_id() {
+		return tag_id;
+	}
+	public String getTag_name() {
+		return tag_name;
+	}
+	public String getTag_desc() {
+		return tag_desc;
+	}
+	public String getTag_color() {
+		return tag_color;
+	}
+	public Integer getSchool_id() {
+		return school_id;
+	}
+	public void setTag_id(Integer tag_id) {
+		this.tag_id = tag_id;
+	}
+	public void setTag_name(String tag_name) {
+		this.tag_name = tag_name;
+	}
+	public void setTag_desc(String tag_desc) {
+		this.tag_desc = tag_desc;
+	}
+	public void setTag_color(String tag_color) {
+		this.tag_color = tag_color;
+	}
+	public void setSchool_id(Integer school_id) {
+		this.school_id = school_id;
+	}
+	
+}

+ 286 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfBatch.java

@@ -0,0 +1,286 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import cn.hmsoft.jdbc.entity.Table;
+
+@Table(tableName = "CF_BATCH", keyColumn =  "BATCH_ID" , sequenceName = "BATCH_ID")
+public class CfBatch implements Serializable {
+
+	private static final long serialVersionUID = -5118338436346369018L;
+	private Integer batch_id;
+	private Integer pattern_id;//对应模式ID
+	private String batch_name;
+	private Integer school_id;
+	private Integer dept_id;
+	private LocalDateTime upload_start_time;
+	private LocalDateTime upload_end_time;
+	private LocalDateTime scond_upload_start;//重传开始时间
+	private LocalDateTime scond_upload_end;//重传结束时间
+	private LocalDateTime intial_review_start;
+	private LocalDateTime intial_review_end;
+	private LocalDateTime intial_show_start;
+	private LocalDateTime intial_show_end;
+	private LocalDateTime profes_review_start;
+	private LocalDateTime profes_review_end;
+	private LocalDateTime ticket_start_time;
+	private LocalDateTime ticket_end_time;
+	private LocalDateTime score_public_start;
+	private LocalDateTime score_public_end;
+	private LocalDateTime profes_publish_start;//录取发布时间
+	private LocalDateTime profes_publish_end;
+	private LocalDateTime profes_show_start;//学术审核结果展示时间
+	private LocalDateTime profes_show_end;//学术审核结果展示时间
+	private LocalDateTime scond_apply_review_start;//驳回而此次提交审核开始时间
+	private LocalDateTime scond_apply_review_end;//驳回而此次提交审核结束时间
+	private String review_mode;
+	private LocalDateTime create_time;
+	private Integer status;//启用标志 1,0
+	private Integer pass_pct;//默认通过率,会初始化到专业
+	private Integer need_promise;//是否需要承若书标志,1,0
+
+	private LocalDateTime score_check_start;
+	private LocalDateTime score_check_end;
+
+	private LocalDateTime score_check_public_start;
+	private LocalDateTime score_check_public_end;
+
+	private LocalDateTime show_upload_start;
+	private LocalDateTime show_upload_end;
+	
+	
+	public Integer getBatch_id() {
+		return batch_id;
+	}
+	public void setBatch_id(Integer batch_id) {
+		this.batch_id = batch_id;
+	}
+	public String getBatch_name() {
+		return batch_name;
+	}
+	public void setBatch_name(String batch_name) {
+		this.batch_name = batch_name;
+	}
+	public Integer getSchool_id() {
+		return school_id;
+	}
+	public void setSchool_id(Integer school_id) {
+		this.school_id = school_id;
+	}
+	public LocalDateTime getUpload_start_time() {
+		return upload_start_time;
+	}
+	public void setUpload_start_time(LocalDateTime upload_start_time) {
+		this.upload_start_time = upload_start_time;
+	}
+	public LocalDateTime getUpload_end_time() {
+		return upload_end_time;
+	}
+	public void setUpload_end_time(LocalDateTime upload_end_time) {
+		this.upload_end_time = upload_end_time;
+	}
+	public LocalDateTime getIntial_review_start() {
+		return intial_review_start;
+	}
+	public void setIntial_review_start(LocalDateTime intial_review_start) {
+		this.intial_review_start = intial_review_start;
+	}
+	public LocalDateTime getIntial_review_end() {
+		return intial_review_end;
+	}
+	public void setIntial_review_end(LocalDateTime intial_review_end) {
+		this.intial_review_end = intial_review_end;
+	}
+	public LocalDateTime getProfes_review_start() {
+		return profes_review_start;
+	}
+	public void setProfes_review_start(LocalDateTime profes_review_start) {
+		this.profes_review_start = profes_review_start;
+	}
+	public LocalDateTime getProfes_review_end() {
+		return profes_review_end;
+	}
+	public void setProfes_review_end(LocalDateTime profes_review_end) {
+		this.profes_review_end = profes_review_end;
+	}
+	public LocalDateTime getProfes_publish_start() {
+		return profes_publish_start;
+	}
+	public void setProfes_publish_start(LocalDateTime profes_publish_start) {
+		this.profes_publish_start = profes_publish_start;
+	}
+	public LocalDateTime getProfes_publish_end() {
+		return profes_publish_end;
+	}
+	public void setProfes_publish_end(LocalDateTime profes_publish_end) {
+		this.profes_publish_end = profes_publish_end;
+	}
+	public LocalDateTime getTicket_start_time() {
+		return ticket_start_time;
+	}
+	public void setTicket_start_time(LocalDateTime ticket_start_time) {
+		this.ticket_start_time = ticket_start_time;
+	}
+	public LocalDateTime getCreate_time() {
+		return create_time;
+	}
+	public void setCreate_time(LocalDateTime create_time) {
+		this.create_time = create_time;
+	}
+	public LocalDateTime getScore_public_end() {
+		return score_public_end;
+	}
+	public void setScore_public_end(LocalDateTime score_public_end) {
+		this.score_public_end = score_public_end;
+	}
+	public LocalDateTime getScore_public_start() {
+		return score_public_start;
+	}
+	public void setScore_public_start(LocalDateTime score_public_start) {
+		this.score_public_start = score_public_start;
+	}
+	public String getReview_mode() {
+		return review_mode;
+	}
+	public Integer getStatus() {
+		return status;
+	}
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+	public void setReview_mode(String review_mode) {
+		this.review_mode = review_mode;
+	}
+	public LocalDateTime getTicket_end_time() {
+		return ticket_end_time;
+	}
+	public void setTicket_end_time(LocalDateTime ticket_end_time) {
+		this.ticket_end_time = ticket_end_time;
+	}
+	public Integer getPass_pct() {
+		return pass_pct;
+	}
+	public void setPass_pct(Integer pass_pct) {
+		this.pass_pct = pass_pct;
+	}
+	public Integer getNeed_promise() {
+		return need_promise;
+	}
+	public void setNeed_promise(Integer need_promise) {
+		this.need_promise = need_promise;
+	}
+	public LocalDateTime getProfes_show_start() {
+		return profes_show_start;
+	}
+	public LocalDateTime getProfes_show_end() {
+		return profes_show_end;
+	}
+	public void setProfes_show_start(LocalDateTime profes_show_start) {
+		this.profes_show_start = profes_show_start;
+	}
+	public void setProfes_show_end(LocalDateTime profes_show_end) {
+		this.profes_show_end = profes_show_end;
+	}
+	public LocalDateTime getScond_apply_review_start() {
+		return scond_apply_review_start;
+	}
+	public LocalDateTime getScond_apply_review_end() {
+		return scond_apply_review_end;
+	}
+	public void setScond_apply_review_start(LocalDateTime scond_apply_review_start) {
+		this.scond_apply_review_start = scond_apply_review_start;
+	}
+	public void setScond_apply_review_end(LocalDateTime scond_apply_review_end) {
+		this.scond_apply_review_end = scond_apply_review_end;
+	}
+	public Integer getPattern_id() {
+		return pattern_id;
+	}
+	public void setPattern_id(Integer pattern_id) {
+		this.pattern_id = pattern_id;
+	}
+	public LocalDateTime getScond_upload_start() {
+		return scond_upload_start;
+	}
+	public LocalDateTime getScond_upload_end() {
+		return scond_upload_end;
+	}
+	public void setScond_upload_start(LocalDateTime scond_upload_start) {
+		this.scond_upload_start = scond_upload_start;
+	}
+	public void setScond_upload_end(LocalDateTime scond_upload_end) {
+		this.scond_upload_end = scond_upload_end;
+	}
+
+	public LocalDateTime getScore_check_start() {
+		return score_check_start;
+	}
+
+	public void setScore_check_start(LocalDateTime score_check_start) {
+		this.score_check_start = score_check_start;
+	}
+
+	public LocalDateTime getScore_check_end() {
+		return score_check_end;
+	}
+
+	public void setScore_check_end(LocalDateTime score_check_end) {
+		this.score_check_end = score_check_end;
+	}
+
+	public LocalDateTime getScore_check_public_start() {
+		return score_check_public_start;
+	}
+
+	public void setScore_check_public_start(LocalDateTime score_check_public_start) {
+		this.score_check_public_start = score_check_public_start;
+	}
+
+	public LocalDateTime getScore_check_public_end() {
+		return score_check_public_end;
+	}
+
+	public void setScore_check_public_end(LocalDateTime score_check_public_end) {
+		this.score_check_public_end = score_check_public_end;
+	}
+
+	public Integer getDept_id() {
+		return dept_id;
+	}
+
+	public void setDept_id(Integer dept_id) {
+		this.dept_id = dept_id;
+	}
+
+	public LocalDateTime getIntial_show_start() {
+		return intial_show_start;
+	}
+
+	public void setIntial_show_start(LocalDateTime intial_show_start) {
+		this.intial_show_start = intial_show_start;
+	}
+
+	public LocalDateTime getIntial_show_end() {
+		return intial_show_end;
+	}
+
+	public void setIntial_show_end(LocalDateTime intial_show_end) {
+		this.intial_show_end = intial_show_end;
+	}
+
+	public LocalDateTime getShow_upload_start() {
+		return show_upload_start;
+	}
+
+	public void setShow_upload_start(LocalDateTime show_upload_start) {
+		this.show_upload_start = show_upload_start;
+	}
+
+	public LocalDateTime getShow_upload_end() {
+		return show_upload_end;
+	}
+
+	public void setShow_upload_end(LocalDateTime show_upload_end) {
+		this.show_upload_end = show_upload_end;
+	}
+}

+ 83 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfEnrolParam.java

@@ -0,0 +1,83 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import cn.hmsoft.jdbc.entity.Table;
+
+/**********************************************
+* 配置表-参数配置
+* @author: zxq
+* @date: 2019-07-13 14:43:35
+* @version: 2.0.0
+* @email: revisit@126.com
+* @Company: www.hmsoft.cn
+*/
+@Table(tableName = "CF_ENROL_PARAM", keyColumn =  "PARAM_NAME" , sequenceName = "")
+public class CfEnrolParam implements Serializable{
+	private static final long serialVersionUID = -4270751593099801169L;
+	//参数分类
+	private String param_type;
+	//参数名称
+	private String param_name;
+	//参数值
+	private String param_value;
+	//参数说明
+	private String param_note;
+
+	/****
+	 * 参数分类
+	 */
+	public String getParam_type() {
+		return this.param_type;
+	}
+
+	/****
+	 * 参数分类
+	 */
+	public void setParam_type(String param_type) {
+		this.param_type = param_type;
+	}
+
+	/****
+	 * 参数名称
+	 */
+	public String getParam_name() {
+		return this.param_name;
+	}
+
+	/****
+	 * 参数名称
+	 */
+	public void setParam_name(String param_name) {
+		this.param_name = param_name;
+	}
+
+	/****
+	 * 参数值
+	 */
+	public String getParam_value() {
+		return this.param_value;
+	}
+
+	/****
+	 * 参数值
+	 */
+	public void setParam_value(String param_value) {
+		this.param_value = param_value;
+	}
+
+	/****
+	 * 参数说明
+	 */
+	public String getParam_note() {
+		return this.param_note;
+	}
+
+	/****
+	 * 参数说明
+	 */
+	public void setParam_note(String param_note) {
+		this.param_note = param_note;
+	}
+
+
+}

+ 63 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfInitialOptr.java

@@ -0,0 +1,63 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import cn.hmsoft.jdbc.entity.Table;
+
+/**
+ * 初审考生类型账号配置.
+ * @author zq
+ *
+ */
+@Table(tableName = "CF_INITIAL_OPTR", keyColumn =  "ID" , sequenceName = "ID")
+public class CfInitialOptr implements Serializable {
+
+	private static final long serialVersionUID = 1244111445639962943L;
+	private Integer id;
+	private Integer school_id;
+	private String std_edu;
+	private Integer optr_cnt;
+	private Integer re_optr_cnt;
+	
+	public Integer getId() {
+		return id;
+	}
+	public Integer getSchool_id() {
+		return school_id;
+	}
+	public String getStd_edu() {
+		return std_edu;
+	}
+	public Integer getOptr_cnt() {
+		return optr_cnt;
+	}
+	public void setId(Integer id) {
+		this.id = id;
+	}
+	public void setSchool_id(Integer school_id) {
+		this.school_id = school_id;
+	}
+	public void setStd_edu(String std_edu) {
+		this.std_edu = std_edu;
+	}
+	public void setOptr_cnt(Integer optr_cnt) {
+		this.optr_cnt = optr_cnt;
+	}
+
+	public Integer getRe_optr_cnt() {
+		return re_optr_cnt;
+	}
+
+	public void setRe_optr_cnt(Integer re_optr_cnt) {
+		this.re_optr_cnt = re_optr_cnt;
+	}
+
+	protected String std_edu_name;
+
+	public String getStd_edu_name() {
+		return std_edu_name;
+	}
+
+	public void setStd_edu_name(String std_edu_name) {
+		this.std_edu_name = std_edu_name;
+	}
+}

+ 26 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfInitialOptrDetail.java

@@ -0,0 +1,26 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+
+import cn.hmsoft.jdbc.entity.Table;
+
+@Table(tableName = "CF_INITIAL_OPTR_DETAIL", keyColumn =  "" , sequenceName = "")
+public class CfInitialOptrDetail implements Serializable {
+	
+	private static final long serialVersionUID = 8355069116468844145L;
+	private Integer main_id;
+	private Integer optr_id;
+	
+	public Integer getMain_id() {
+		return main_id;
+	}
+	public Integer getOptr_id() {
+		return optr_id;
+	}
+	public void setMain_id(Integer main_id) {
+		this.main_id = main_id;
+	}
+	public void setOptr_id(Integer optr_id) {
+		this.optr_id = optr_id;
+	}
+}

+ 26 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfInitialReOptrDetail.java

@@ -0,0 +1,26 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import cn.hmsoft.jdbc.entity.Table;
+
+import java.io.Serializable;
+
+@Table(tableName = "CF_INITIAL_RE_OPTR_DETAIL", keyColumn =  "" , sequenceName = "")
+public class CfInitialReOptrDetail implements Serializable {
+	
+	private static final long serialVersionUID = 8355069116468844145L;
+	private Integer main_id;
+	private Integer optr_id;
+	
+	public Integer getMain_id() {
+		return main_id;
+	}
+	public Integer getOptr_id() {
+		return optr_id;
+	}
+	public void setMain_id(Integer main_id) {
+		this.main_id = main_id;
+	}
+	public void setOptr_id(Integer optr_id) {
+		this.optr_id = optr_id;
+	}
+}

+ 48 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfMajor.java

@@ -0,0 +1,48 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+
+import cn.hmsoft.jdbc.entity.Table;
+
+@Table(tableName = "cf_major", keyColumn = "MAJOR_ID", sequenceName = "MAJOR_ID")
+public class CfMajor implements Serializable {
+
+	private static final long serialVersionUID = 2358326976909460989L;
+	private Integer school_id;
+	private Integer batch_id;
+	private Integer major_id;
+	private String major_code;
+	private String major_name;
+	
+	public Integer getSchool_id() {
+		return school_id;
+	}
+	public void setSchool_id(Integer school_id) {
+		this.school_id = school_id;
+	}
+	public Integer getBatch_id() {
+		return batch_id;
+	}
+	public void setBatch_id(Integer batch_id) {
+		this.batch_id = batch_id;
+	}
+	public Integer getMajor_id() {
+		return major_id;
+	}
+	public void setMajor_id(Integer major_id) {
+		this.major_id = major_id;
+	}
+	public String getMajor_name() {
+		return major_name;
+	}
+	public void setMajor_name(String major_name) {
+		this.major_name = major_name;
+	}
+	public String getMajor_code() {
+		return major_code;
+	}
+	public void setMajor_code(String major_code) {
+		this.major_code = major_code;
+	}
+	
+}

+ 48 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialCategory.java

@@ -0,0 +1,48 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+
+import cn.hmsoft.jdbc.entity.Table;
+
+@Table(tableName = "CF_MATERIAL_CATEGORY", keyColumn =  "CATEGORY_ID" , sequenceName = "CATEGORY_ID")
+public class CfMaterialCategory implements Serializable {
+
+	private static final long serialVersionUID = 1488700434766902624L;
+	private Integer school_id;
+	private Integer category_id;
+	private String category_name;
+	private String category_desc;
+	private Integer ord;
+	
+	public Integer getSchool_id() {
+		return school_id;
+	}
+	public void setSchool_id(Integer school_id) {
+		this.school_id = school_id;
+	}
+	public Integer getCategory_id() {
+		return category_id;
+	}
+	public void setCategory_id(Integer category_id) {
+		this.category_id = category_id;
+	}
+	public String getCategory_name() {
+		return category_name;
+	}
+	public void setCategory_name(String category_name) {
+		this.category_name = category_name;
+	}
+	public String getCategory_desc() {
+		return category_desc;
+	}
+	public void setCategory_desc(String category_desc) {
+		this.category_desc = category_desc;
+	}
+	public Integer getOrd() {
+		return ord;
+	}
+	public void setOrd(Integer ord) {
+		this.ord = ord;
+	}
+	
+}

+ 146 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialDef.java

@@ -0,0 +1,146 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import cn.hmsoft.jdbc.entity.Table;
+
+/**
+ * 材料定义
+ * @author zq
+ *
+ */
+@Table(tableName = "CF_MATERIAL_DEF", keyColumn =  "MATERIAL_DEF_ID" , sequenceName = "MATERIAL_DEF_ID")
+public class CfMaterialDef implements Serializable {
+
+	private static final long serialVersionUID = 35850145479087075L;
+	private Integer material_def_id;
+	private Integer school_id;
+	private Integer batch_id;
+	private Integer category_id;
+	private String material_code;//自动生成材料编码
+	private String material_type;
+	private String material_name;
+	private Integer max_size;
+	private Integer min_size;
+	private String material_desc;
+	private Integer ord;
+	private Integer need_review;//是否导师评审
+	private Integer max_upload_cnt;//最多上传材料文件个数
+	private Integer min_upload_cnt;//最少上传材料文件个数
+	private Integer need_upload;////1-是,0-否
+	private Integer status;//1-启用,0-禁用
+	private String remark;
+	private LocalDateTime create_time;
+	
+	
+	public Integer getMaterial_def_id() {
+		return material_def_id;
+	}
+	public void setMaterial_def_id(Integer material_def_id) {
+		this.material_def_id = material_def_id;
+	}
+	public Integer getSchool_id() {
+		return school_id;
+	}
+	public void setSchool_id(Integer school_id) {
+		this.school_id = school_id;
+	}
+	public Integer getBatch_id() {
+		return batch_id;
+	}
+	public void setBatch_id(Integer batch_id) {
+		this.batch_id = batch_id;
+	}
+	public Integer getCategory_id() {
+		return category_id;
+	}
+	public void setCategory_id(Integer category_id) {
+		this.category_id = category_id;
+	}
+	public String getMaterial_type() {
+		return material_type;
+	}
+	public void setMaterial_type(String material_type) {
+		this.material_type = material_type;
+	}
+	public String getMaterial_name() {
+		return material_name;
+	}
+	public void setMaterial_name(String material_name) {
+		this.material_name = material_name;
+	}
+	public Integer getMax_size() {
+		return max_size;
+	}
+	public void setMax_size(Integer max_size) {
+		this.max_size = max_size;
+	}
+	public Integer getMin_size() {
+		return min_size;
+	}
+	public void setMin_size(Integer min_size) {
+		this.min_size = min_size;
+	}
+	public String getMaterial_desc() {
+		return material_desc;
+	}
+	public void setMaterial_desc(String material_desc) {
+		this.material_desc = material_desc;
+	}
+	public LocalDateTime getCreate_time() {
+		return create_time;
+	}
+	public void setCreate_time(LocalDateTime create_time) {
+		this.create_time = create_time;
+	}
+	public Integer getOrd() {
+		return ord;
+	}
+	public void setOrd(Integer ord) {
+		this.ord = ord;
+	}
+
+	public Integer getMax_upload_cnt() {
+		return max_upload_cnt;
+	}
+	public Integer getMin_upload_cnt() {
+		return min_upload_cnt;
+	}
+	public void setMax_upload_cnt(Integer max_upload_cnt) {
+		this.max_upload_cnt = max_upload_cnt;
+	}
+	public void setMin_upload_cnt(Integer min_upload_cnt) {
+		this.min_upload_cnt = min_upload_cnt;
+	}
+	public Integer getNeed_review() {
+		return need_review;
+	}
+	public Integer getNeed_upload() {
+		return need_upload;
+	}
+	public Integer getStatus() {
+		return status;
+	}
+	public void setNeed_review(Integer need_review) {
+		this.need_review = need_review;
+	}
+	public void setNeed_upload(Integer need_upload) {
+		this.need_upload = need_upload;
+	}
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+	public String getRemark() {
+		return remark;
+	}
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+	public String getMaterial_code() {
+		return material_code;
+	}
+	public void setMaterial_code(String material_code) {
+		this.material_code = material_code;
+	}
+	
+}

+ 42 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialFeedBack.java

@@ -0,0 +1,42 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import cn.hmsoft.jdbc.entity.Table;
+
+@Table(tableName = "CF_MATERIAL_FEEDBACK", keyColumn =  "FEED_ID" , sequenceName = "FEED_ID")
+public class CfMaterialFeedBack implements Serializable {
+
+	private static final long serialVersionUID = 7581687585698240611L;
+	private Integer feed_id;
+	private Integer material_def_id;
+	private String feedback_msg;
+	private LocalDateTime create_time;
+	
+	public LocalDateTime getCreate_time() {
+		return create_time;
+	}
+	public void setCreate_time(LocalDateTime create_time) {
+		this.create_time = create_time;
+	}
+	public Integer getFeed_id() {
+		return feed_id;
+	}
+	public Integer getMaterial_def_id() {
+		return material_def_id;
+	}
+	public String getFeedback_msg() {
+		return feedback_msg;
+	}
+	public void setFeed_id(Integer feed_id) {
+		this.feed_id = feed_id;
+	}
+	public void setMaterial_def_id(Integer material_def_id) {
+		this.material_def_id = material_def_id;
+	}
+	public void setFeedback_msg(String feedback_msg) {
+		this.feedback_msg = feedback_msg;
+	}
+	
+}

+ 63 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialRule.java

@@ -0,0 +1,63 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import cn.hmsoft.jdbc.entity.Table;
+
+@Table(tableName = "CF_MATERIAL_RULE", keyColumn =  "MATERIAL_RULE_ID" , sequenceName = "MATERIAL_RULE_ID")
+public class CfMaterialRule implements Serializable {
+
+	private static final long serialVersionUID = -6729720630809939075L;
+	private Integer material_rule_id;
+	private Integer school_id;
+	private Integer batch_id;
+	private Integer material_def_id;
+	private Integer std_edu_cnt;//-1 表示全部
+	private Integer aspect_cnt;//-1 表示全部
+	
+	protected String material_name;
+	
+	public Integer getMaterial_rule_id() {
+		return material_rule_id;
+	}
+	public void setMaterial_rule_id(Integer material_rule_id) {
+		this.material_rule_id = material_rule_id;
+	}
+	public Integer getSchool_id() {
+		return school_id;
+	}
+	public void setSchool_id(Integer school_id) {
+		this.school_id = school_id;
+	}
+	public Integer getBatch_id() {
+		return batch_id;
+	}
+	public void setBatch_id(Integer batch_id) {
+		this.batch_id = batch_id;
+	}
+	public Integer getMaterial_def_id() {
+		return material_def_id;
+	}
+	public void setMaterial_def_id(Integer material_def_id) {
+		this.material_def_id = material_def_id;
+	}
+	public Integer getStd_edu_cnt() {
+		return std_edu_cnt;
+	}
+	public void setStd_edu_cnt(Integer std_edu_cnt) {
+		this.std_edu_cnt = std_edu_cnt;
+	}
+	public Integer getAspect_cnt() {
+		return aspect_cnt;
+	}
+	public void setAspect_cnt(Integer aspect_cnt) {
+		this.aspect_cnt = aspect_cnt;
+	}
+	public String getMaterial_name() {
+		return material_name;
+	}
+	public void setMaterial_name(String material_name) {
+		this.material_name = material_name;
+	}
+	
+	
+}

+ 46 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialRuleDetail.java

@@ -0,0 +1,46 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import cn.hmsoft.jdbc.entity.Table;
+
+@Table(tableName = "CF_MATERIAL_RULE_DETAIL", keyColumn =  "" , sequenceName = "")
+public class CfMaterialRuleDetail implements Serializable {
+
+	private static final long serialVersionUID = -886310923879277346L;
+	private Integer detail_id;
+	private Integer material_rule_id;
+	private Integer material_def_id;
+	private String rule_type;//aspect-专业,std_edu-考生学历类型
+	private String rule_value;
+	
+	public Integer getMaterial_def_id() {
+		return material_def_id;
+	}
+	public void setMaterial_def_id(Integer material_def_id) {
+		this.material_def_id = material_def_id;
+	}
+	public Integer getMaterial_rule_id() {
+		return material_rule_id;
+	}
+	public void setMaterial_rule_id(Integer material_rule_id) {
+		this.material_rule_id = material_rule_id;
+	}
+	public String getRule_type() {
+		return rule_type;
+	}
+	public void setRule_type(String rule_type) {
+		this.rule_type = rule_type;
+	}
+	public String getRule_value() {
+		return rule_value;
+	}
+	public void setRule_value(String rule_value) {
+		this.rule_value = rule_value;
+	}
+	public Integer getDetail_id() {
+		return detail_id;
+	}
+	public void setDetail_id(Integer detail_id) {
+		this.detail_id = detail_id;
+	}
+}

+ 89 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfMaterialTextAttr.java

@@ -0,0 +1,89 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import cn.hmsoft.jdbc.entity.Table;
+
+/**
+ *  模型.
+ * 
+ * @author: shudonghui
+ * @date: 2023-05-23 09:24:51
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Table(tableName = "cf_material_text_attr", keyColumn = "attr_id", sequenceName = "")
+public class CfMaterialTextAttr implements Serializable {
+	private static final long serialVersionUID = 625480991663960184L;
+  	//id
+  	private Integer attr_id;
+  	//定义ID
+  	private Integer material_def_id;
+  	//文字标题
+  	private String attr_name;
+  	//是否必填
+  	private String attr_requrid;
+  	//文字格式
+  	private String attr_formart;
+  
+	/**
+	 * id
+	 */	
+  	public void setAttr_id(Integer attr_id) {
+		this.attr_id = attr_id;
+  	}
+ 	/**
+	 * id
+	 */	 	
+  	public Integer getAttr_id() {
+		return attr_id;
+  	}
+	/**
+	 * 定义ID
+	 */	
+  	public void setMaterial_def_id(Integer material_def_id) {
+		this.material_def_id = material_def_id;
+  	}
+ 	/**
+	 * 定义ID
+	 */	 	
+  	public Integer getMaterial_def_id() {
+		return material_def_id;
+  	}
+	/**
+	 * 文字标题
+	 */	
+  	public void setAttr_name(String attr_name) {
+		this.attr_name = attr_name;
+  	}
+ 	/**
+	 * 文字标题
+	 */	 	
+  	public String getAttr_name() {
+		return attr_name;
+  	}
+	/**
+	 * 是否必填
+	 */	
+  	public void setAttr_requrid(String attr_requrid) {
+		this.attr_requrid = attr_requrid;
+  	}
+ 	/**
+	 * 是否必填
+	 */	 	
+  	public String getAttr_requrid() {
+		return attr_requrid;
+  	}
+	/**
+	 * 文字格式
+	 */	
+  	public void setAttr_formart(String attr_formart) {
+		this.attr_formart = attr_formart;
+  	}
+ 	/**
+	 * 文字格式
+	 */	 	
+  	public String getAttr_formart() {
+		return attr_formart;
+  	}
+}

+ 69 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfPattern.java

@@ -0,0 +1,69 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+import cn.hmsoft.jdbc.entity.Table;
+
+@Table(tableName = "CF_PATTERN", keyColumn =  "PATTERN_ID" , sequenceName = "PATTERN_ID")
+public class CfPattern implements Serializable {
+
+	private static final long serialVersionUID = 3237119708064139673L;
+	private Integer pattern_id;//主键
+	private String pattern_name;//模式名称
+	private boolean is_auth_dtl_dur_submit;//提交期间是否审核明细材料-资格审核
+	private boolean is_auth_main_dur_submit;//提交期间是否审核考生主记录材料-资格审核
+	private boolean is_auth_recheck;//是否需要资格复审
+	private boolean is_msg_dur_submit;//提交期间是否实时发送通知-资格审核
+	private boolean is_msg_dur_auth;//审核期间是否实时发送通知-资格审核
+	private boolean is_enable_auth_lable;//是否启用审核标签
+	
+	public Integer getPattern_id() {
+		return pattern_id;
+	}
+	public String getPattern_name() {
+		return pattern_name;
+	}
+	public boolean isIs_auth_dtl_dur_submit() {
+		return is_auth_dtl_dur_submit;
+	}
+	public boolean isIs_auth_main_dur_submit() {
+		return is_auth_main_dur_submit;
+	}
+	public boolean isIs_auth_recheck() {
+		return is_auth_recheck;
+	}
+	public boolean isIs_msg_dur_submit() {
+		return is_msg_dur_submit;
+	}
+	public boolean isIs_msg_dur_auth() {
+		return is_msg_dur_auth;
+	}
+	public boolean isIs_enable_auth_lable() {
+		return is_enable_auth_lable;
+	}
+	public void setPattern_id(Integer pattern_id) {
+		this.pattern_id = pattern_id;
+	}
+	public void setPattern_name(String pattern_name) {
+		this.pattern_name = pattern_name;
+	}
+	public void setIs_auth_dtl_dur_submit(boolean is_auth_dtl_dur_submit) {
+		this.is_auth_dtl_dur_submit = is_auth_dtl_dur_submit;
+	}
+	public void setIs_auth_main_dur_submit(boolean is_auth_main_dur_submit) {
+		this.is_auth_main_dur_submit = is_auth_main_dur_submit;
+	}
+	public void setIs_auth_recheck(boolean is_auth_recheck) {
+		this.is_auth_recheck = is_auth_recheck;
+	}
+	public void setIs_msg_dur_submit(boolean is_msg_dur_submit) {
+		this.is_msg_dur_submit = is_msg_dur_submit;
+	}
+	public void setIs_msg_dur_auth(boolean is_msg_dur_auth) {
+		this.is_msg_dur_auth = is_msg_dur_auth;
+	}
+	public void setIs_enable_auth_lable(boolean is_enable_auth_lable) {
+		this.is_enable_auth_lable = is_enable_auth_lable;
+	}
+	
+	
+}

+ 54 - 0
src/main/java/cn/hmsoft/mr/data/model/cf/CfPromiseInfo.java

@@ -0,0 +1,54 @@
+package cn.hmsoft.mr.data.model.cf;
+
+import java.io.Serializable;
+
+import cn.hmsoft.jdbc.entity.Table;
+
+/**
+ * 承诺书
+ * @author zq
+ *
+ */
+@Table(tableName = "CF_PROMISE_INFO", keyColumn =  "id" , sequenceName = "id")
+public class CfPromiseInfo implements Serializable {
+
+	private static final long serialVersionUID = -5914485239225642289L;
+	private Integer id;
+	private Integer school_id;
+	private String biz_type;//业务类型-初审、专业评审
+	private String promise_text;
+	private Integer count_down_secs;//承若书倒计时
+	
+	public Integer getSchool_id() {
+		return school_id;
+	}
+	public String getPromise_text() {
+		return promise_text;
+	}
+	public void setSchool_id(Integer school_id) {
+		this.school_id = school_id;
+	}
+	public void setPromise_text(String promise_text) {
+		this.promise_text = promise_text;
+	}
+	public String getBiz_type() {
+		return biz_type;
+	}
+	public void setBiz_type(String biz_type) {
+		this.biz_type = biz_type;
+	}
+	public Integer getCount_down_secs() {
+		return count_down_secs;
+	}
+	public void setCount_down_secs(Integer count_down_secs) {
+		this.count_down_secs = count_down_secs;
+	}
+	public Integer getId() {
+		return id;
+	}
+	public void setId(Integer id) {
+		this.id = id;
+	}
+	
+	
+}

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