瀏覽代碼

研究生流程更新

wangliang 10 月之前
父節點
當前提交
1c1dc897c3
共有 28 個文件被更改,包括 789 次插入196 次删除
  1. 208 0
      sop-api/install/mysql/upgrade/1.1.1.sql
  2. 37 0
      sop-api/src/main/java/com/qmth/sop/server/api/TBCrmDetailController.java
  3. 2 3
      sop-api/src/main/java/com/qmth/sop/server/api/TBUserArchivesAllocationController.java
  4. 二進制
      sop-api/src/main/resources/cloudMarkSopFlow.zip
  5. 0 151
      sop-api/src/main/resources/cloudMarkSopFlow/cloudMarkSopFlow.bpmn
  6. 0 0
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_check_final.form
  7. 0 1
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_device_in.form
  8. 0 1
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_device_out.form
  9. 0 1
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_env_test.form
  10. 0 0
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_first.form
  11. 0 0
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_information.form
  12. 0 0
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_inside_approve.form
  13. 0 1
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_mark_check.form
  14. 0 0
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_mark_final.form
  15. 0 1
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_mark_prep.form
  16. 0 0
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_scan_ready.form
  17. 0 1
      sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_start.form
  18. 197 0
      sop-business/src/main/java/com/qmth/sop/business/bean/params/TBCrmDetailParam.java
  19. 29 1
      sop-business/src/main/java/com/qmth/sop/business/entity/TBCrmDetail.java
  20. 17 0
      sop-business/src/main/java/com/qmth/sop/business/service/TBCrmDetailService.java
  21. 12 1
      sop-business/src/main/java/com/qmth/sop/business/service/TBUserArchivesAllocationService.java
  22. 114 21
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBCrmDetailServiceImpl.java
  23. 48 4
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBSopInfoServiceImpl.java
  24. 62 6
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBUserArchivesAllocationServiceImpl.java
  25. 19 1
      sop-business/src/main/resources/mapper/TBCrmDetailMapper.xml
  26. 7 1
      sop-common/src/main/java/com/qmth/sop/common/enums/ProcessLimitedEnum.java
  27. 3 1
      sop-common/src/main/java/com/qmth/sop/common/enums/ServiceScopeEnum.java
  28. 34 0
      sop-common/src/main/java/com/qmth/sop/common/enums/SopRoleTypeCompositeEnum.java

+ 208 - 0
sop-api/install/mysql/upgrade/1.1.1.sql

@@ -0,0 +1,208 @@
+USE sop_db;
+
+ALTER TABLE t_b_crm_detail MODIFY COLUMN service_scope varchar(30) NOT NULL COMMENT '服务范围,SCAN:仅扫描,SCAN_MARK:扫描+阅卷,CLOUD_MARK:研究生阅卷';
+
+UPDATE sys_privilege
+SET name='创建sop', url='CreateSop', `type`='LINK', parent_id=51, `sequence`=4, property='AUTH', related='2024,2061,2062,3080,3081,3082,3083,3084,3085,3086,3087,3096', enable=1, default_auth=0, front_display=1
+WHERE id=3079;
+
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(3096, '编辑派单明细研究生sop', '/api/admin/tb/crm/detail/sop/cloud_mark/save', 'URL', 3079, 9, 'AUTH', NULL, 1, 1, 0);
+
+INSERT INTO t_d_form_widget
+(id, code, `type`, form_id, form_name, title, input_type, required, readable, writable, visable, `scale`, `length`, binding, data_grid, tips, format, span, sub_title, `options`, flow_type, form_setup, handle, form_group, role_type, create_id, create_time)
+VALUES(191, 'SINGLE_SELECT', 'FORM', 'region_manager_id', 'region_manager_id', '大区经理', 'LONG', 0, 1, 0, 1, NULL, NULL, NULL, '/api/admin/user/archives/allocation/can_choose?crmDetailId=#{id}&sopRoleType=REGION_MANAGER', NULL, NULL, 4, NULL, NULL, 'CLOUD_MARK_SOP_FLOW', 1, 0, NULL, NULL, 1, 17);
+
+UPDATE t_d_form_widget
+SET code='SINGLE_SELECT', `type`='FORM', form_id='region_coordinator_id', form_name='region_coordinator_id', title='区域协调人', input_type='LONG', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid='/api/admin/user/archives/allocation/can_choose?crmDetailId=#{id}&sopRoleType=REGION_COORDINATOR', tips=NULL, format=NULL, span=4, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=14
+WHERE id=104;
+UPDATE t_d_form_widget
+SET code='MULTIPLE_SELECT', `type`='FORM', form_id='engineer_users_id', form_name='engineer_users_id', title='工程师', input_type='ARRAY', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid='/api/admin/user/archives/allocation/can_choose?crmDetailId=#{id}&sopRoleType=ENGINEER', tips=NULL, format=NULL, span=4, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=15
+WHERE id=105;
+UPDATE t_d_form_widget
+SET code='SINGLE_SELECT', `type`='FORM', form_id='project_manager_id', form_name='project_manager_id', title='项目经理', input_type='LONG', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid='/api/admin/user/archives/allocation/can_choose?crmDetailId=#{id}&sopRoleType=PROJECT_MANAGER', tips=NULL, format=NULL, span=4, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=16
+WHERE id=106;
+UPDATE t_d_form_widget
+SET code='ONLY_TITLE', `type`='FORM', form_id='project_rish_title', form_name='project_rish_title', title='项目风险预估(仅供参考)', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=18
+WHERE id=107;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='delay_rish_cb', form_name='delay_rish_cb', title='延期风险', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"LOW","label":"低"},{"value":"MIDDLE","label":"中"},{"value":"HIGH","label":"高"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=19
+WHERE id=108;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='engineer_rish_cb', form_name='engineer_rish_cb', title='实施难度', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"LOW","label":"低"},{"value":"MIDDLE","label":"中"},{"value":"HIGH","label":"高"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=20
+WHERE id=109;
+UPDATE t_d_form_widget
+SET code='TEXTAREA', `type`='FORM', form_id='other_remark', form_name='other_remark', title='其它备注(建议关注的其它方面)', input_type='STRING', required=0, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=21
+WHERE id=110;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='project_contacts_title', form_name='project_contacts_title', title='项目联系人', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=22
+WHERE id=111;
+UPDATE t_d_form_widget
+SET code='TABLE', `type`='FORM', form_id='project_contacts_table', form_name='project_contacts_table', title='项目联系人表格', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=23
+WHERE id=112;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_college', form_name='school_college', title='项目联系人表格_机构输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=24
+WHERE id=113;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_name', form_name='school_name', title='项目联系人表格_姓名输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=25
+WHERE id=114;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_job', form_name='school_job', title='项目联系人表格_职务输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=26
+WHERE id=115;
+UPDATE t_d_form_widget
+SET code='TEXT', `type`='TABLE', form_id='school_tel', form_name='school_tel', title='项目联系人表格_电话输入框', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=3, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=27
+WHERE id=116;
+UPDATE t_d_form_widget
+SET code='DATE', `type`='FORM', form_id='service_finish_plan_begin_date', form_name='service_finish_plan_begin_date', title='现场服务完成进场计划时间', input_type='LONG', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format='yyyy-MM-dd', span=6, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=1, handle=1, form_group=NULL, role_type=NULL, create_id=1, create_time=11
+WHERE id=190;
+
+DELETE FROM t_d_form_widget
+WHERE id=144;
+DELETE FROM t_d_form_widget
+WHERE id=145;
+DELETE FROM t_d_form_widget
+WHERE id=146;
+
+DELETE FROM t_d_form_widget
+WHERE id=185;
+DELETE FROM t_d_form_widget
+WHERE id=186;
+DELETE FROM t_d_form_widget
+WHERE id=187;
+
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='upload_list_title', form_name='upload_list_title', title='上传清单和报告', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=4, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=141;
+UPDATE t_d_form_widget
+SET code='FILE', `type`='FORM', form_id='upload_device_version_photos', form_name='upload_device_version_photos', title='上传扫描仪固件版本号拍照', input_type='ARRAY', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=5, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=4, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=188;
+
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='import_data_title', form_name='import_data_title', title='导入数据', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=5, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=147;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='data_same', form_name='data_same', title='导入数据', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=6, sub_title=NULL, `options`='[{"value":"true","label":"导入数据与原始数据是否一致"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=5, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=148;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='import_exam_student_count', form_name='import_exam_student_count', title='导入考生数量', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=6, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=5, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=149;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='scan_set_title', form_name='scan_set_title', title='扫描仪设置', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=5, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=150;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='scan_set_cb', form_name='scan_set_cb', title='扫描仪设置', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"1","label":"1、扫描仪分辨率设置是150"},{"value":"2","label":"2、是否勾选“自动剪切”,“纠正歪斜”"},{"value":"3","label":"3、是否勾选“边界去除”"},{"value":"4","label":"4、勾选“双张进纸检测”-“有效”-动作“停止”"},{"value":"5","label":"5、爱普生型号,选择“扫描模式”-“设置”-“装订边缘”-“上”"},{"value":"6","label":"6、华高扫描仪型号,检查背面图像;如背面图像倒转,则勾选“背面旋转180°”"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=5, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=151;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='card_format_title', form_name='card_format_title', title='卡格式制作', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=5, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=152;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='card_format_cb', form_name='card_format_cb', title='卡格式制作', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"1","label":"1、定位线:上方紧挨装钉“线”字,但是不超过“线”字;考生信息遮挡区需按要求框选"},{"value":"2","label":"2、扫描原图正反面检查是否正确"},{"value":"3","label":"3、扫描裁切图屏蔽区检查是否正确"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=5, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=153;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='paper_list_title', form_name='paper_list_title', title='纸质检查表上传', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=5, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=154;
+UPDATE t_d_form_widget
+SET code='FILE', `type`='FORM', form_id='paper_check_photos', form_name='paper_check_photos', title='上传关键节点检查(纸质)表单拍照', input_type='ARRAY', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=5, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=5, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=155;
+
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='manual_bar_code_title', form_name='manual_bar_code_title', title='手工输入条码确认', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=156;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='manual_bar_code_cb', form_name='manual_bar_code_cb', title='手工输入条码确认', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=6, sub_title=NULL, `options`='[{"value":"1","label":"“数据检查”-“人工确认”,”确认已完成”"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=157;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='complete_count', form_name='complete_count', title='完成数量', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=6, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=158;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='bar_code_full_title', form_name='bar_code_full_title', title='条码数量完整性检查', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=159;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='bar_code_full_cb', form_name='bar_code_full_cb', title='条码数量完整性检查', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"1","label":"“缺页异常”查询需无数据“"},{"value":"2","label":"“无条码考生”查询需无数据“"},{"value":"3","label":"“追加题卡”需和学校记录一致“"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=160;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='missing_list_title', form_name='missing_list_title', title='缺考名单比对', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=161;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='missing_list_cb', form_name='missing_list_cb', title='缺考名单比对', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"1","label":"核对“无答题卡考生”的考生是否与学校提供的缺考名单吻合,人工指定为缺考(缺考一致性>导入缺考>导入缺考缺页);需核对平台“考生管理”中状态为“未上传”的考生是否全部为缺考、是否全部变为“人工指定”。"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=162;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='missing_course_count', form_name='missing_course_count', title='缺考科次数量', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=6, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=163;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='paper_form_upload_title', form_name='paper_form_upload_title', title='纸质表单上传', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=164;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='school_sign_radio', form_name='school_sign_radio', title='学校是否确认签字', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"YES","label":"是"},{"value":"NO","label":"否"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=165;
+UPDATE t_d_form_widget
+SET code='FILE', `type`='FORM', form_id='paper_form_photos', form_name='paper_form_photos', title='上传关键节点检查表(纸质)拍照', input_type='ARRAY', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=5, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=6, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=166;
+
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='mark_param_check_title', form_name='mark_param_check_title', title='评卷参数核对', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=7, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=167;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='mark_param_check_cb', form_name='mark_param_check_cb', title='评卷参数核对', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"1","label":"1、核查每个科目的满分是否正确(100分、150分、300分)"},{"value":"2","label":"2、检查所有科目结构和分组是否全部导入。(评卷管理>评卷进度查看分组状态)"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=7, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=168;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='paper_form_upload_title', form_name='paper_form_upload_title', title='纸质表单上传', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=7, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=169;
+UPDATE t_d_form_widget
+SET code='FILE', `type`='FORM', form_id='paper_form_photos', form_name='paper_form_photos', title='上传关键节点检查表(纸质)拍照', input_type='ARRAY', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=5, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=7, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=170;
+
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='score_check_title', form_name='score_check_title', title='分数复核', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=8, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=171;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='score_check_cb', form_name='score_check_cb', title='分数复核', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"1","label":"是否建议学校复核小题0分,大题0分,全卷0分的情况"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=8, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=172;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='school_score_check_radio', form_name='school_score_check_radio', title='学校是否选择复核', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"YES","label":"复核(推荐)"},{"value":"NO","label":"不复核","remark":[{"content":"若选择该项,则需要学校签字确认,签字随关键节点检查表上传","color":"red"}]}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=8, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=173;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='paper_form_upload_title', form_name='paper_form_upload_title', title='纸质表单上传', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=8, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=175;
+UPDATE t_d_form_widget
+SET code='FILE', `type`='FORM', form_id='paper_form_photos', form_name='paper_form_photos', title='上传关键节点检查表(纸质)拍照', input_type='ARRAY', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=5, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=8, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=176;
+
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='mark_progress_title', form_name='mark_progress_title', title='评卷进度核查', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=9, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=177;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='mark_progress_cb', form_name='mark_progress_cb', title='评卷进度核查', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"1","label":"1、核对阅卷总进度是否为100%"},{"value":"2","label":"2、核对科目阅卷进度是否为100%"},{"value":"3","label":"3、核对问题卷是否处理完成"},{"value":"4","label":"4、核对所有科目状态点击“结束”"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=9, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=178;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='cross_check_title', form_name='cross_check_title', title='交叉比对', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=9, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=179;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='cross_check_cb', form_name='cross_check_cb', title='交叉比对', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"1","label":"是否建议学校进行同一考生多科目分数交叉比对(成绩复核-成绩校验),需所有科目全部改完后管理员账号才能查看。"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=9, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=180;
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='mark_submit_title', form_name='mark_submit_title', title='成绩提交核查', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=9, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=181;
+UPDATE t_d_form_widget
+SET code='CHECKBOX', `type`='FORM', form_id='mark_submit_cb', form_name='mark_submit_cb', title='成绩提交核查', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"1","label":"1、核对导出成绩表数据条数是否与考生表数量一致,不能带有“未导出全量数据”字样"},{"value":"2","label":"2、导出验收报告(考试管理-详情-验收报告),和学校签字确认盖章,上报验收报告至质控平台"},{"value":"3","label":"3、核对导出图片工具是否正常运行"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=9, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=182;
+UPDATE t_d_form_widget
+SET code='NUMBER', `type`='FORM', form_id='export_score_count', form_name='export_score_count', title='导出成绩数量', input_type='INT', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=9, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=183;
+UPDATE t_d_form_widget
+SET code='FILE', `type`='FORM', form_id='upload_check_report_photos', form_name='upload_check_report_photos', title='上传验收报告(纸质)拍照', input_type='ARRAY', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=5, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=9, handle=0, form_group=NULL, role_type=NULL, create_id=1, create_time=1
+WHERE id=184;
+
+UPDATE t_d_form_widget
+SET code='FORM_GROUP_TITLE', `type`='FORM', form_id='inside_title_project', form_name='inside_title_project', title='项目经理项目内审(请于24小时内完成内审)', input_type='STRING', required=0, readable=1, writable=0, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=3, handle=0, form_group=2, role_type='PROJECT_MANAGER', create_id=1, create_time=1
+WHERE id=137;
+UPDATE t_d_form_widget
+SET code='RADIO', `type`='FORM', form_id='approve_radio_project', form_name='approve_radio_project', title='我对以上项目关键信息已审核,确认内容无误:', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`='[{"value":"1","label":"同意"},{"value":"0","label":"不同意"}]', flow_type='CLOUD_MARK_SOP_FLOW', form_setup=3, handle=0, form_group=2, role_type='PROJECT_MANAGER', create_id=1, create_time=1
+WHERE id=138;
+UPDATE t_d_form_widget
+SET code='SIGN', `type`='FORM', form_id='sign_project', form_name='sign_project', title='添加签名', input_type='STRING', required=1, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=6, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=3, handle=0, form_group=2, role_type='PROJECT_MANAGER', create_id=1, create_time=1
+WHERE id=139;
+UPDATE t_d_form_widget
+SET code='TEXTAREA', `type`='FORM', form_id='approve_ramark_project', form_name='approve_ramark_project', title='审批意见', input_type='STRING', required=0, readable=0, writable=1, visable=1, `scale`=NULL, `length`=NULL, binding=NULL, data_grid=NULL, tips=NULL, format=NULL, span=12, sub_title=NULL, `options`=NULL, flow_type='CLOUD_MARK_SOP_FLOW', form_setup=3, handle=0, form_group=2, role_type='PROJECT_MANAGER', create_id=1, create_time=1
+WHERE id=140;

+ 37 - 0
sop-api/src/main/java/com/qmth/sop/server/api/TBCrmDetailController.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.sop.business.bean.params.CrmDetailSopParam;
+import com.qmth.sop.business.bean.params.TBCrmDetailParam;
 import com.qmth.sop.business.bean.result.EditResult;
 import com.qmth.sop.business.entity.TBCrmDetail;
 import com.qmth.sop.business.service.TBCrmDetailService;
@@ -97,6 +98,42 @@ public class TBCrmDetailController {
         return ResultUtil.ok(tbCrmDetailService.list(new Page<>(pageNumber, pageSize), crmNo));
     }
 
+    @ApiOperation(value = "创建/编辑派单明细研究生sop")
+    @RequestMapping(value = "/sop/cloud_mark/save", method = RequestMethod.POST)
+    @OperationLog(logType = LogTypeEnum.ADD)
+    @ApiResponses({ @ApiResponse(code = 200, message = "派单明细sop信息", response = EditResult.class) })
+    public Result sopCloudMarkSave(
+            @Valid @ApiParam(value = "派单明细sop信息", required = true) @RequestBody TBCrmDetailParam tbCrmDetailParam,
+            BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        boolean lock = memoryLock.lock(
+                SystemConstant.LOCK_CRM_DETAIL_SOP_CREATE_PREFIX + tbCrmDetailParam.getCrmNo() + "_"
+                        + tbCrmDetailParam.getCourseName(),
+                tbCrmDetailParam.getCrmNo() + "_" + tbCrmDetailParam.getCourseName(),
+                SystemConstant.LOCK_CRM_DETAIL_SOP_TIME_OUT);
+        if (!lock) {
+            throw ExceptionResultEnum.ERROR.exception("正在保存数据,请稍候再试!");
+        }
+        boolean result = false;
+        try {
+            result = tbCrmDetailService.sopCloudMarkSave(tbCrmDetailParam);
+            //            result = tbCrmDetailService.sopAutoCloudMarkCreate(tbCrmDetailParam);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {
+            memoryLock.unlock(SystemConstant.LOCK_CRM_DETAIL_SOP_CREATE_PREFIX + tbCrmDetailParam.getCrmNo() + "_"
+                    + tbCrmDetailParam.getCourseName());
+        }
+        return ResultUtil.ok(result);
+    }
+
     @ApiOperation(value = "创建/编辑派单明细sop")
     @RequestMapping(value = "/sop/save", method = RequestMethod.POST)
     @OperationLog(logType = LogTypeEnum.ADD)

+ 2 - 3
sop-api/src/main/java/com/qmth/sop/server/api/TBUserArchivesAllocationController.java

@@ -1,6 +1,5 @@
 package com.qmth.sop.server.api;
 
-
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.sop.business.bean.params.AutoAllocationParam;
 import com.qmth.sop.business.bean.params.UserArchivesAllocationParam;
@@ -14,7 +13,7 @@ import com.qmth.sop.common.annotation.OperationLog;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.LogTypeEnum;
 import com.qmth.sop.common.enums.RoleTypeEnum;
-import com.qmth.sop.common.enums.SopRoleTypeEnum;
+import com.qmth.sop.common.enums.SopRoleTypeCompositeEnum;
 import com.qmth.sop.common.util.Result;
 import com.qmth.sop.common.util.ResultUtil;
 import io.swagger.annotations.*;
@@ -152,7 +151,7 @@ public class TBUserArchivesAllocationController {
     @RequestMapping(value = "/can_choose", method = RequestMethod.POST)
     @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = ArchivesSourceResult.class) })
     public Result findCanChoose(@ApiParam(value = "派单详情id", required = true) @RequestParam String crmDetailId,
-            @ApiParam(value = "sop角色身份", required = true) @RequestParam SopRoleTypeEnum sopRoleType) {
+            @ApiParam(value = "sop角色身份", required = true) @RequestParam SopRoleTypeCompositeEnum sopRoleType) {
         return ResultUtil.ok(tbUserArchivesAllocationService.findCanChooseArchives(SystemConstant.convertIdToLong(crmDetailId),
                 sopRoleType));
     }

二進制
sop-api/src/main/resources/cloudMarkSopFlow.zip


+ 0 - 151
sop-api/src/main/resources/cloudMarkSopFlow/cloudMarkSopFlow.bpmn

@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test" id="m1626068475250" name="">
-  <process id="CLOUD_MARK_SOP_FLOW" isExecutable="true" isClosed="false" processType="None">
-    <userTask id="f_usertask_cloudmark_inside_approve_3" name="内审" activiti:assignee="${assignee3}" activiti:formKey="cloudmark_sop_inside_approve.form">
-      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${assigneeList3}" activiti:elementVariable="assignee3">
-        <completionCondition>${nrOfCompletedInstances/nrOfInstances==1 || reject3==1}</completionCondition>
-      </multiInstanceLoopCharacteristics>
-    </userTask>
-    <endEvent id="f_usertask_cloudmark_end_0" name="结束"></endEvent>
-    <userTask id="f_usertask_cloudmark_information_2" name="项目关键信息" activiti:candidateUsers="${assigneeList2}" activiti:formKey="cloudmark_sop_information.form"></userTask>
-    <startEvent id="startevent1" name="Start" activiti:formKey="cloudmark_sop_start.form"></startEvent>
-    <userTask id="f_usertask_cloudmark_first_1" name="项目初审" activiti:candidateUsers="${assigneeList1}" activiti:formKey="cloudmark_sop_first.form"></userTask>
-    <sequenceFlow id="flow6" sourceRef="startevent1" targetRef="f_usertask_cloudmark_first_1"></sequenceFlow>
-    <sequenceFlow id="flow14" sourceRef="f_usertask_cloudmark_first_1" targetRef="f_usertask_cloudmark_information_2"></sequenceFlow>
-    <userTask id="f_usertask_cloudmark_device_out_4" name="设备出库登记" activiti:candidateUsers="${assigneeList4}" activiti:formKey="cloudmark_sop_device_out.form"></userTask>
-    <userTask id="f_usertask_cloudmark_scan_ready_6" name="扫描准备" activiti:candidateUsers="${assigneeList6}" activiti:formKey="cloudmark_sop_scan_ready.form"></userTask>
-    <userTask id="f_usertask_cloudmark_check_final_7" name="校验收尾" activiti:candidateUsers="${assigneeList7}" activiti:formKey="cloudmark_sop_check_final.form"></userTask>
-    <userTask id="f_usertask_cloudmark_mark_prep_8" name="评卷准备" activiti:candidateUsers="${assigneeList8}" activiti:formKey="cloudmark_sop_mark_prep.form"></userTask>
-    <userTask id="f_usertask_cloudmark_mark_final_10" name="评卷收尾" activiti:candidateUsers="${assigneeList10}" activiti:formKey="cloudmark_sop_mark_final.form"></userTask>
-    <userTask id="f_usertask_cloudmark_device_in_11" name="设备入库登记" activiti:candidateUsers="${assigneeList11}" activiti:formKey="cloudmark_sop_device_in.form"></userTask>
-    <sequenceFlow id="flow28" sourceRef="f_usertask_cloudmark_device_in_11" targetRef="f_usertask_cloudmark_end_0"></sequenceFlow>
-    <sequenceFlow id="flow29" sourceRef="f_usertask_cloudmark_mark_final_10" targetRef="f_usertask_cloudmark_device_in_11"></sequenceFlow>
-    <userTask id="f_usertask_cloudmark_env_test_5" name="现场环境测试" activiti:candidateUsers="${assigneeList5}" activiti:formKey="cloudmark_sop_env_test.form"></userTask>
-    <sequenceFlow id="flow32" sourceRef="f_usertask_cloudmark_scan_ready_6" targetRef="f_usertask_cloudmark_check_final_7"></sequenceFlow>
-    <sequenceFlow id="flow33" sourceRef="f_usertask_cloudmark_check_final_7" targetRef="f_usertask_cloudmark_mark_prep_8"></sequenceFlow>
-    <userTask id="f_usertask_cloudmark_mark_check_9" name="成绩复核" activiti:candidateUsers="${assigneeList9}" activiti:formKey="cloudmark_sop_mark_check.form"></userTask>
-    <sequenceFlow id="flow34" sourceRef="f_usertask_cloudmark_mark_prep_8" targetRef="f_usertask_cloudmark_mark_check_9"></sequenceFlow>
-    <sequenceFlow id="flow35" sourceRef="f_usertask_cloudmark_mark_check_9" targetRef="f_usertask_cloudmark_mark_final_10"></sequenceFlow>
-    <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway>
-    <sequenceFlow id="flow39" name="驳回" sourceRef="exclusivegateway1" targetRef="f_usertask_cloudmark_information_2">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 'f_usertask_cloudmark_information_2'}]]></conditionExpression>
-    </sequenceFlow>
-    <sequenceFlow id="flow44" sourceRef="f_usertask_cloudmark_information_2" targetRef="f_usertask_cloudmark_inside_approve_3"></sequenceFlow>
-    <sequenceFlow id="flow45" sourceRef="f_usertask_cloudmark_inside_approve_3" targetRef="exclusivegateway1"></sequenceFlow>
-    <sequenceFlow id="flow46" name="通过" sourceRef="exclusivegateway1" targetRef="f_usertask_cloudmark_device_out_4">
-      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 'f_usertask_cloudmark_device_out_4'}]]></conditionExpression>
-    </sequenceFlow>
-    <sequenceFlow id="flow47" sourceRef="f_usertask_cloudmark_device_out_4" targetRef="f_usertask_cloudmark_env_test_5"></sequenceFlow>
-    <sequenceFlow id="flow48" sourceRef="f_usertask_cloudmark_env_test_5" targetRef="f_usertask_cloudmark_scan_ready_6"></sequenceFlow>
-  </process>
-  <bpmndi:BPMNDiagram id="BPMNDiagram_CLOUD_MARK_SOP_FLOW">
-    <bpmndi:BPMNPlane bpmnElement="CLOUD_MARK_SOP_FLOW" id="BPMNPlane_CLOUD_MARK_SOP_FLOW">
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_inside_approve_3" id="BPMNShape_f_usertask_cloudmark_inside_approve_3">
-        <omgdc:Bounds height="55.0" width="85.0" x="456.0" y="20.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_end_0" id="BPMNShape_f_usertask_cloudmark_end_0">
-        <omgdc:Bounds height="35.0" width="35.0" x="481.0" y="270.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_information_2" id="BPMNShape_f_usertask_cloudmark_information_2">
-        <omgdc:Bounds height="55.0" width="85.0" x="290.0" y="20.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
-        <omgdc:Bounds height="35.0" width="35.0" x="30.0" y="30.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_first_1" id="BPMNShape_f_usertask_cloudmark_first_1">
-        <omgdc:Bounds height="55.0" width="85.0" x="140.0" y="20.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_device_out_4" id="BPMNShape_f_usertask_cloudmark_device_out_4">
-        <omgdc:Bounds height="55.0" width="85.0" x="620.0" y="141.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_scan_ready_6" id="BPMNShape_f_usertask_cloudmark_scan_ready_6">
-        <omgdc:Bounds height="55.0" width="85.0" x="299.0" y="141.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_check_final_7" id="BPMNShape_f_usertask_cloudmark_check_final_7">
-        <omgdc:Bounds height="55.0" width="85.0" x="142.0" y="141.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_mark_prep_8" id="BPMNShape_f_usertask_cloudmark_mark_prep_8">
-        <omgdc:Bounds height="55.0" width="85.0" x="10.0" y="141.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_mark_final_10" id="BPMNShape_f_usertask_cloudmark_mark_final_10">
-        <omgdc:Bounds height="55.0" width="85.0" x="150.0" y="260.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_device_in_11" id="BPMNShape_f_usertask_cloudmark_device_in_11">
-        <omgdc:Bounds height="55.0" width="85.0" x="299.0" y="260.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_env_test_5" id="BPMNShape_f_usertask_cloudmark_env_test_5">
-        <omgdc:Bounds height="55.0" width="85.0" x="456.0" y="143.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="f_usertask_cloudmark_mark_check_9" id="BPMNShape_f_usertask_cloudmark_mark_check_9">
-        <omgdc:Bounds height="55.0" width="85.0" x="10.0" y="260.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
-        <omgdc:Bounds height="40.0" width="40.0" x="642.0" y="27.0"></omgdc:Bounds>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
-        <omgdi:waypoint x="65.0" y="47.0"></omgdi:waypoint>
-        <omgdi:waypoint x="140.0" y="47.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow14" id="BPMNEdge_flow14">
-        <omgdi:waypoint x="225.0" y="47.0"></omgdi:waypoint>
-        <omgdi:waypoint x="290.0" y="47.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow28" id="BPMNEdge_flow28">
-        <omgdi:waypoint x="384.0" y="287.0"></omgdi:waypoint>
-        <omgdi:waypoint x="481.0" y="287.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow29" id="BPMNEdge_flow29">
-        <omgdi:waypoint x="235.0" y="287.0"></omgdi:waypoint>
-        <omgdi:waypoint x="299.0" y="287.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow32" id="BPMNEdge_flow32">
-        <omgdi:waypoint x="299.0" y="168.0"></omgdi:waypoint>
-        <omgdi:waypoint x="227.0" y="168.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow33" id="BPMNEdge_flow33">
-        <omgdi:waypoint x="142.0" y="168.0"></omgdi:waypoint>
-        <omgdi:waypoint x="95.0" y="168.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow34" id="BPMNEdge_flow34">
-        <omgdi:waypoint x="52.0" y="196.0"></omgdi:waypoint>
-        <omgdi:waypoint x="52.0" y="260.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow35" id="BPMNEdge_flow35">
-        <omgdi:waypoint x="95.0" y="287.0"></omgdi:waypoint>
-        <omgdi:waypoint x="150.0" y="287.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow39" id="BPMNEdge_flow39">
-        <omgdi:waypoint x="662.0" y="67.0"></omgdi:waypoint>
-        <omgdi:waypoint x="506.0" y="118.0"></omgdi:waypoint>
-        <omgdi:waypoint x="332.0" y="118.0"></omgdi:waypoint>
-        <omgdi:waypoint x="332.0" y="75.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="16.0" width="22.0" x="662.0" y="67.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow44" id="BPMNEdge_flow44">
-        <omgdi:waypoint x="375.0" y="47.0"></omgdi:waypoint>
-        <omgdi:waypoint x="456.0" y="47.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow45" id="BPMNEdge_flow45">
-        <omgdi:waypoint x="541.0" y="47.0"></omgdi:waypoint>
-        <omgdi:waypoint x="642.0" y="47.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow46" id="BPMNEdge_flow46">
-        <omgdi:waypoint x="662.0" y="67.0"></omgdi:waypoint>
-        <omgdi:waypoint x="662.0" y="141.0"></omgdi:waypoint>
-        <bpmndi:BPMNLabel>
-          <omgdc:Bounds height="16.0" width="100.0" x="662.0" y="67.0"></omgdc:Bounds>
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow47" id="BPMNEdge_flow47">
-        <omgdi:waypoint x="620.0" y="168.0"></omgdi:waypoint>
-        <omgdi:waypoint x="541.0" y="170.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge bpmnElement="flow48" id="BPMNEdge_flow48">
-        <omgdi:waypoint x="456.0" y="170.0"></omgdi:waypoint>
-        <omgdi:waypoint x="384.0" y="168.0"></omgdi:waypoint>
-      </bpmndi:BPMNEdge>
-    </bpmndi:BPMNPlane>
-  </bpmndi:BPMNDiagram>
-</definitions>

File diff suppressed because it is too large
+ 0 - 0
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_check_final.form


+ 0 - 1
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_device_in.form

@@ -1 +0,0 @@
-[{"id":"185","code":"ONLY_TITLE","type":"FORM","formId":"device_in_out_label","formName":"device_in_out_label","title":"设备入库","inputType":"STRING","required":false,"readable":true,"writable":false,"visable":true,"name":"普通标题,独占一行","span":6},{"id":"186","code":"DATE","type":"FORM","formId":"device_in_time","formName":"device_in_time","title":"设备入库时间","inputType":"STRING","required":true,"readable":false,"writable":true,"visable":true,"format":"yyyy-MM-dd","name":"日期","span":6},{"id":"187","code":"DEVICE_IN_TABLE","type":"FORM","formId":"device_in_table","formName":"device_in_table","title":"设备入库表格","inputType":"STRING","required":true,"readable":false,"writable":true,"visable":true,"name":"设备入库表格","span":12}]

+ 0 - 1
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_device_out.form

@@ -1 +0,0 @@
-[{"id":"144","code":"ONLY_TITLE","type":"FORM","formId":"device_in_out_label","formName":"device_in_out_label","title":"设备出库","inputType":"STRING","required":false,"readable":true,"writable":false,"visable":true,"name":"普通标题,独占一行","span":12},{"id":"145","code":"DATE","type":"FORM","formId":"device_out_time","formName":"device_out_time","title":"设备出库时间","inputType":"STRING","required":true,"readable":false,"writable":true,"visable":true,"format":"yyyy-MM-dd","name":"日期","span":6},{"id":"146","code":"DEVICE_OUT_TABLE","type":"FORM","formId":"device_out_table","formName":"device_out_table","title":"设备出库表格","inputType":"STRING","required":true,"readable":false,"writable":true,"visable":true,"name":"设备出库表格","span":12}]

+ 0 - 1
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_env_test.form

@@ -1 +0,0 @@
-[{"id":"141","code":"FORM_GROUP_TITLE","type":"FORM","formId":"upload_list_title","formName":"upload_list_title","title":"上传清单和报告","inputType":"STRING","required":false,"readable":true,"writable":false,"visable":true,"name":"带虚线分割线的标题","span":12},{"id":"188","code":"FILE","type":"FORM","formId":"upload_device_version_photos","formName":"upload_device_version_photos","title":"上传扫描仪固件版本号拍照","inputType":"ARRAY","required":true,"readable":false,"writable":true,"visable":true,"length":5,"name":"文件","span":12}]

File diff suppressed because it is too large
+ 0 - 0
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_first.form


File diff suppressed because it is too large
+ 0 - 0
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_information.form


File diff suppressed because it is too large
+ 0 - 0
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_inside_approve.form


+ 0 - 1
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_mark_check.form

@@ -1 +0,0 @@
-[{"id":"171","code":"FORM_GROUP_TITLE","type":"FORM","formId":"score_check_title","formName":"score_check_title","title":"分数复核","inputType":"STRING","required":false,"readable":true,"writable":false,"visable":true,"name":"带虚线分割线的标题","span":12},{"id":"172","code":"CHECKBOX","type":"FORM","formId":"score_check_cb","formName":"score_check_cb","title":"分数复核","inputType":"STRING","required":true,"readable":false,"writable":true,"visable":true,"name":"复选框","span":12,"options":"[{\"value\":\"1\",\"label\":\"是否建议学校复核小题0分,大题0分,全卷0分的情况\"}]"},{"id":"173","code":"RADIO","type":"FORM","formId":"school_score_check_radio","formName":"school_score_check_radio","title":"学校是否选择复核","inputType":"STRING","required":true,"readable":false,"writable":true,"visable":true,"name":"单选框","span":12,"options":"[{\"value\":\"YES\",\"label\":\"复核(推荐)\"},{\"value\":\"NO\",\"label\":\"不复核\",\"remark\":[{\"content\":\"若选择该项,则需要学校签字确认,签字随关键节点检查表上传\",\"color\":\"red\"}]}]"},{"id":"175","code":"FORM_GROUP_TITLE","type":"FORM","formId":"paper_form_upload_title","formName":"paper_form_upload_title","title":"纸质表单上传","inputType":"STRING","required":false,"readable":true,"writable":false,"visable":true,"name":"带虚线分割线的标题","span":12},{"id":"176","code":"FILE","type":"FORM","formId":"paper_form_photos","formName":"paper_form_photos","title":"上传关键节点检查表(纸质)拍照","inputType":"ARRAY","required":true,"readable":false,"writable":true,"visable":true,"length":5,"name":"文件","span":12}]

File diff suppressed because it is too large
+ 0 - 0
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_mark_final.form


+ 0 - 1
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_mark_prep.form

@@ -1 +0,0 @@
-[{"id":"167","code":"FORM_GROUP_TITLE","type":"FORM","formId":"mark_param_check_title","formName":"mark_param_check_title","title":"评卷参数核对","inputType":"STRING","required":false,"readable":true,"writable":false,"visable":true,"name":"带虚线分割线的标题","span":12},{"id":"168","code":"CHECKBOX","type":"FORM","formId":"mark_param_check_cb","formName":"mark_param_check_cb","title":"评卷参数核对","inputType":"STRING","required":true,"readable":false,"writable":true,"visable":true,"name":"复选框","span":12,"options":"[{\"value\":\"1\",\"label\":\"1、核查每个科目的满分是否正确(100分、150分、300分)\"},{\"value\":\"2\",\"label\":\"2、检查所有科目结构和分组是否全部导入。(评卷管理>评卷进度查看分组状态)\"}]"},{"id":"169","code":"FORM_GROUP_TITLE","type":"FORM","formId":"paper_form_upload_title","formName":"paper_form_upload_title","title":"纸质表单上传","inputType":"STRING","required":false,"readable":true,"writable":false,"visable":true,"name":"带虚线分割线的标题","span":12},{"id":"170","code":"FILE","type":"FORM","formId":"paper_form_photos","formName":"paper_form_photos","title":"上传关键节点检查表(纸质)拍照","inputType":"ARRAY","required":true,"readable":false,"writable":true,"visable":true,"length":5,"name":"文件","span":12}]

File diff suppressed because it is too large
+ 0 - 0
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_scan_ready.form


+ 0 - 1
sop-api/src/main/resources/cloudMarkSopFlow/cloudmark_sop_start.form

@@ -1 +0,0 @@
-{"approveRejectMap":{"f_usertask_cloudmark_inside_approve_3":[{"afterFlowTaskKey":"f_usertask_cloudmark_information_2","setup":2}]}}

+ 197 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/params/TBCrmDetailParam.java

@@ -0,0 +1,197 @@
+package com.qmth.sop.business.bean.params;
+
+import com.qmth.sop.common.base.BaseEntity;
+import com.qmth.sop.common.enums.CrmStatusEnum;
+import com.qmth.sop.common.enums.ServiceScopeEnum;
+import com.qmth.sop.common.enums.SopStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: crmDetail参数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2024/8/15
+ */
+public class TBCrmDetailParam extends BaseEntity implements Serializable {
+
+    @ApiModelProperty(value = "派单号")
+    @NotNull(message = "派单号不能为空")
+    private String crmNo;
+
+    @ApiModelProperty(value = "流程部署id")
+    private String flowDeploymentId;
+
+    @ApiModelProperty(value = "sop单号")
+    private String sopNo;
+
+    @ApiModelProperty(value = "状态,UN_PUBLISH:未发布,PUBLISH:发布")
+    private CrmStatusEnum status;
+
+    @ApiModelProperty(value = "科目名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "考生人数")
+    private Integer examStudentCount;
+
+    @ApiModelProperty(value = "联系人")
+    private String contacts;
+
+    @ApiModelProperty(value = "电话")
+    private String mobileNumber;
+
+    @ApiModelProperty(value = "服务范围,SCAN:仅扫描,SCAN_MARK:扫描+阅卷,CLOUD_MARK:研究生阅卷")
+    private ServiceScopeEnum serviceScope;
+
+    @ApiModelProperty(value = "扫描开始时间")
+    private Long scanStartTime;
+
+    @ApiModelProperty(value = "扫描结束时间")
+    private Long scanEndTime;
+
+    @ApiModelProperty(value = "阅卷开始时间")
+    private Long markPaperStartTime;
+
+    @ApiModelProperty(value = "阅卷结束时间")
+    private Long markPaperEndTime;
+
+    @ApiModelProperty(value = "sop状态")
+    String sopStatusStr;
+
+    @ApiModelProperty(value = "状态,DRAFT:草稿,START:提交")
+    private SopStatusEnum sopStatus;
+
+    @ApiModelProperty(value = "发布时间")
+    private Long publishTime;
+
+    public String getCrmNo() {
+        return crmNo;
+    }
+
+    public void setCrmNo(String crmNo) {
+        this.crmNo = crmNo;
+    }
+
+    public String getFlowDeploymentId() {
+        return flowDeploymentId;
+    }
+
+    public void setFlowDeploymentId(String flowDeploymentId) {
+        this.flowDeploymentId = flowDeploymentId;
+    }
+
+    public String getSopNo() {
+        return sopNo;
+    }
+
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
+    }
+
+    public CrmStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(CrmStatusEnum status) {
+        this.status = status;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public Integer getExamStudentCount() {
+        return examStudentCount;
+    }
+
+    public void setExamStudentCount(Integer examStudentCount) {
+        this.examStudentCount = examStudentCount;
+    }
+
+    public String getContacts() {
+        return contacts;
+    }
+
+    public void setContacts(String contacts) {
+        this.contacts = contacts;
+    }
+
+    public String getMobileNumber() {
+        return mobileNumber;
+    }
+
+    public void setMobileNumber(String mobileNumber) {
+        this.mobileNumber = mobileNumber;
+    }
+
+    public ServiceScopeEnum getServiceScope() {
+        return serviceScope;
+    }
+
+    public void setServiceScope(ServiceScopeEnum serviceScope) {
+        this.serviceScope = serviceScope;
+    }
+
+    public Long getScanStartTime() {
+        return scanStartTime;
+    }
+
+    public void setScanStartTime(Long scanStartTime) {
+        this.scanStartTime = scanStartTime;
+    }
+
+    public Long getScanEndTime() {
+        return scanEndTime;
+    }
+
+    public void setScanEndTime(Long scanEndTime) {
+        this.scanEndTime = scanEndTime;
+    }
+
+    public Long getMarkPaperStartTime() {
+        return markPaperStartTime;
+    }
+
+    public void setMarkPaperStartTime(Long markPaperStartTime) {
+        this.markPaperStartTime = markPaperStartTime;
+    }
+
+    public Long getMarkPaperEndTime() {
+        return markPaperEndTime;
+    }
+
+    public void setMarkPaperEndTime(Long markPaperEndTime) {
+        this.markPaperEndTime = markPaperEndTime;
+    }
+
+    public String getSopStatusStr() {
+        return sopStatusStr;
+    }
+
+    public void setSopStatusStr(String sopStatusStr) {
+        this.sopStatusStr = sopStatusStr;
+    }
+
+    public SopStatusEnum getSopStatus() {
+        return sopStatus;
+    }
+
+    public void setSopStatus(SopStatusEnum sopStatus) {
+        this.sopStatus = sopStatus;
+    }
+
+    public Long getPublishTime() {
+        return publishTime;
+    }
+
+    public void setPublishTime(Long publishTime) {
+        this.publishTime = publishTime;
+    }
+}

+ 29 - 1
sop-business/src/main/java/com/qmth/sop/business/entity/TBCrmDetail.java

@@ -55,7 +55,7 @@ public class TBCrmDetail extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "电话")
     private String mobileNumber;
 
-    @ApiModelProperty(value = "服务范围,SCAN:仅扫描,SCAN_MARK:扫描+阅卷")
+    @ApiModelProperty(value = "服务范围,SCAN:仅扫描,SCAN_MARK:扫描+阅卷,CLOUD_MARK:研究生阅卷")
     @NotNull(message = "服务范围不能为空")
     private ServiceScopeEnum serviceScope;
 
@@ -126,6 +126,19 @@ public class TBCrmDetail extends BaseEntity implements Serializable {
         insertInfo(userId);
     }
 
+    /**
+     * 更新研究生sop信息
+     */
+    public void initCloudMarkSop() {
+        this.courseName = "所有科目";
+        this.examStudentCount = -1;
+        this.serviceScope = ServiceScopeEnum.CLOUD_MARK;
+        this.scanStartTime = -1L;
+        this.scanEndTime = -1L;
+        this.markPaperStartTime = -1L;
+        this.markPaperEndTime = -1L;
+    }
+
     /**
      * 修改状态
      *
@@ -136,6 +149,21 @@ public class TBCrmDetail extends BaseEntity implements Serializable {
         this.flowDeploymentId = tbCrmDetail.getFlowDeploymentId();
         this.sopNo = tbCrmDetail.getSopNo();
         this.status = tbCrmDetail.getStatus();
+        if (Objects.isNull(this.examStudentCount) && Objects.nonNull(tbCrmDetail.getExamStudentCount())) {
+            this.examStudentCount = tbCrmDetail.getExamStudentCount();
+        }
+        if (Objects.isNull(this.scanStartTime) && Objects.nonNull(tbCrmDetail.getScanStartTime())) {
+            this.scanStartTime = tbCrmDetail.getScanStartTime();
+        }
+        if (Objects.isNull(this.scanEndTime) && Objects.nonNull(tbCrmDetail.getScanEndTime())) {
+            this.scanEndTime = tbCrmDetail.getScanEndTime();
+        }
+        if (Objects.isNull(this.markPaperStartTime) && Objects.nonNull(tbCrmDetail.getMarkPaperStartTime())) {
+            this.markPaperStartTime = tbCrmDetail.getMarkPaperStartTime();
+        }
+        if (Objects.isNull(this.markPaperEndTime) && Objects.nonNull(tbCrmDetail.getMarkPaperEndTime())) {
+            this.markPaperEndTime = tbCrmDetail.getMarkPaperEndTime();
+        }
         updateInfo(userId);
     }
 

+ 17 - 0
sop-business/src/main/java/com/qmth/sop/business/service/TBCrmDetailService.java

@@ -3,6 +3,7 @@ package com.qmth.sop.business.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.sop.business.bean.params.CrmDetailSopParam;
+import com.qmth.sop.business.bean.params.TBCrmDetailParam;
 import com.qmth.sop.business.bean.result.CrmProjectResult;
 import com.qmth.sop.business.entity.TBCrmDetail;
 import com.qmth.sop.business.entity.TFCustomFlow;
@@ -63,6 +64,22 @@ public interface TBCrmDetailService extends IService<TBCrmDetail> {
      */
     public boolean sopSave(TBCrmDetail tbCrmDetail);
 
+    /**
+     * 编辑派单明细研究生sop
+     *
+     * @param tbCrmDetailParam
+     * @return
+     */
+    public boolean sopCloudMarkSave(TBCrmDetailParam tbCrmDetailParam);
+
+    /**
+     * 自动创建派单明细研究生sop
+     *
+     * @param tbCrmDetailParam
+     * @return
+     */
+    public boolean sopAutoCloudMarkCreate(TBCrmDetailParam tbCrmDetailParam);
+
     /**
      * 查询自定义流程
      *

+ 12 - 1
sop-business/src/main/java/com/qmth/sop/business/service/TBUserArchivesAllocationService.java

@@ -10,6 +10,7 @@ import com.qmth.sop.business.bean.result.CrmDetailAllocationResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationResult;
 import com.qmth.sop.business.bean.result.UserArchivesAllocationSubTotalResult;
 import com.qmth.sop.business.entity.TBUserArchivesAllocation;
+import com.qmth.sop.common.enums.SopRoleTypeCompositeEnum;
 import com.qmth.sop.common.enums.SopRoleTypeEnum;
 
 import java.util.List;
@@ -39,7 +40,8 @@ public interface TBUserArchivesAllocationService extends IService<TBUserArchives
      * @return 分页查询结果
      */
     @Deprecated
-    IPage<UserArchivesAllocationResult> findCrmAllocationPage(Long serviceUnitId, String province, String city, String area, String customName, Integer gap, Long regionId, Integer pageNumber, Integer pageSize);
+    IPage<UserArchivesAllocationResult> findCrmAllocationPage(Long serviceUnitId, String province, String city,
+            String area, String customName, Integer gap, Long regionId, Integer pageNumber, Integer pageSize);
 
     /**
      * 查询派单小计
@@ -112,6 +114,15 @@ public interface TBUserArchivesAllocationService extends IService<TBUserArchives
      */
     List<UserArchivesDto> findCanChooseArchives(Long crmDetailId, SopRoleTypeEnum sopRoleTypeEnum);
 
+    /**
+     * 查询派单详情中可以分配的人员(复合角色)
+     *
+     * @param crmDetailId
+     * @param sopRoleTypeCompositeEnum
+     * @return
+     */
+    List<UserArchivesDto> findCanChooseArchives(Long crmDetailId, SopRoleTypeCompositeEnum sopRoleTypeCompositeEnum);
+
     /**
      * 根据派单明细id查询派单分配信息
      *

+ 114 - 21
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBCrmDetailServiceImpl.java

@@ -11,6 +11,7 @@ import com.qmth.sop.business.activiti.service.ActivitiService;
 import com.qmth.sop.business.bean.dto.CrmDetailImportDto;
 import com.qmth.sop.business.bean.params.CrmDetailSopParam;
 import com.qmth.sop.business.bean.params.SopPublishParam;
+import com.qmth.sop.business.bean.params.TBCrmDetailParam;
 import com.qmth.sop.business.bean.result.CrmProjectResult;
 import com.qmth.sop.business.bean.result.FlowFormWidgetResult;
 import com.qmth.sop.business.bean.result.FlowResult;
@@ -21,6 +22,7 @@ import com.qmth.sop.business.service.*;
 import com.qmth.sop.business.util.excel.BasicExcelListener;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.*;
+import com.qmth.sop.common.util.GsonUtil;
 import com.qmth.sop.common.util.JacksonUtil;
 import com.qmth.sop.common.util.ResultUtil;
 import com.qmth.sop.common.util.ServletUtil;
@@ -96,9 +98,9 @@ public class TBCrmDetailServiceImpl extends ServiceImpl<TBCrmDetailMapper, TBCrm
         TBService tbService = tbServiceService.getById(tbCrm.getServiceId());
         Objects.requireNonNull(tbService, "未找到服务单元");
 
-        if (tbService.getType() == ProductTypeEnum.CLOUD_MARK) {
-            throw ExceptionResultEnum.ERROR.exception(tbService.getType().getTitle() + "暂不支持创建sop");
-        }
+        //        if (tbService.getType() == ProductTypeEnum.CLOUD_MARK) {
+        //            throw ExceptionResultEnum.ERROR.exception(tbService.getType().getTitle() + "暂不支持创建sop");
+        //        }
         if (Objects.isNull(crmProjectResult.getProcessVar())) {
             if (tbService.getType() == ProductTypeEnum.OFFICE) {
                 List<FlowFormWidgetResult> flowFormWidgetResultList = tdFormWidgetService.flowWidgetQuery(
@@ -336,6 +338,89 @@ public class TBCrmDetailServiceImpl extends ServiceImpl<TBCrmDetailMapper, TBCrm
         return false;
     }
 
+    /**
+     * 编辑派单明细研究生sop
+     *
+     * @param tbCrmDetailParam
+     * @return
+     */
+    @Override
+    @Transactional
+    public boolean sopCloudMarkSave(TBCrmDetailParam tbCrmDetailParam) {
+        try {
+            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+            TBCrmDetail tbCrmDetail = GsonUtil.fromJson(JacksonUtil.parseJson(tbCrmDetailParam), TBCrmDetail.class);
+            if (Objects.isNull(tbCrmDetail.getId())) {//说明创建sop
+                TFCustomFlow tfCustomFlow = tbCrmDetailService.queryCustomFlow(tbCrmDetail.getCrmNo());
+                tbCrmDetail.createSop(tfCustomFlow.getFlowDeploymentId(), sysUser.getId());
+                tbCrmDetail.initCloudMarkSop();
+            } else {
+                TBCrmDetail tbCrmDetailDb = tbCrmDetailService.getById(tbCrmDetail.getId());
+                Objects.requireNonNull(tbCrmDetailDb, "未找到派单sop信息");
+
+                tbCrmDetail.updateSop(tbCrmDetailDb, sysUser.getId());
+                if (tbCrmDetail.getStatus() == CrmStatusEnum.PUBLISH) {
+                    SopStatusEnum sopStatus = tbSopInfoService.findBySopNo(tbCrmDetail.getSopNo());
+                    if (sopStatus == SopStatusEnum.START) {
+                        throw ExceptionResultEnum.ERROR.exception("该条sop状态已改变,请刷新页面");
+                    }
+                    CrmProjectResult crmProjectResult = tbCrmService.findCrmProjectInfo(tbCrmDetail.getSopNo(),
+                            tbCrmDetail.getId(), tbCrmDetail.getCrmNo());
+                    Objects.requireNonNull(crmProjectResult, "未找到派单信息");
+                    tbDingService.resetDingExceptionBySopNo(tbCrmDetail.getSopNo());
+                }
+            }
+            return tbCrmDetailService.saveOrUpdate(tbCrmDetail);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof DuplicateKeyException) {
+                String errorColumn = e.getCause().toString();
+                String[] strs = StringUtils.split(errorColumn, "-");
+                String[] columns = StringUtils.split(strs[strs.length - 1], "\\'");
+                throw ExceptionResultEnum.SQL_ERROR.exception(
+                        FieldUniqueEnum.convertToTitle(columns[columns.length - 1]) + ":[" + columns[0] + "]数据不允许重复插入");
+            } else if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 自动创建派单明细研究生sop
+     *
+     * @param tbCrmDetailParam
+     * @return
+     */
+    @Override
+    @Transactional
+    public boolean sopAutoCloudMarkCreate(TBCrmDetailParam tbCrmDetailParam) {
+        try {
+            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+            TBCrmDetail tbCrmDetail = GsonUtil.fromJson(JacksonUtil.parseJson(tbCrmDetailParam), TBCrmDetail.class);
+            TFCustomFlow tfCustomFlow = tbCrmDetailService.queryCustomFlow(tbCrmDetail.getCrmNo());
+            tbCrmDetail.createSop(tfCustomFlow.getFlowDeploymentId(), sysUser.getId());
+            tbCrmDetail.initCloudMarkSop();
+            return tbCrmDetailService.save(tbCrmDetail);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof DuplicateKeyException) {
+                String errorColumn = e.getCause().toString();
+                String[] strs = StringUtils.split(errorColumn, "-");
+                String[] columns = StringUtils.split(strs[strs.length - 1], "\\'");
+                throw ExceptionResultEnum.SQL_ERROR.exception(
+                        FieldUniqueEnum.convertToTitle(columns[columns.length - 1]) + ":[" + columns[0] + "]数据不允许重复插入");
+            } else if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return false;
+    }
+
     /**
      * 查询自定义流程
      *
@@ -345,17 +430,21 @@ public class TBCrmDetailServiceImpl extends ServiceImpl<TBCrmDetailMapper, TBCrm
     @Override
     public TFCustomFlow queryCustomFlow(String crmNo) {
         TBCrm tbCrm = tbCrmService.findByCrmNo(crmNo);
-        if (Objects.isNull(tbCrm.getProcessVar()) || Objects.equals(tbCrm.getProcessVar().trim(), "")) {
-            throw ExceptionResultEnum.ERROR.exception("请先保存属性【部署方式】【阅卷方式】【扫描场地网络】");
-        }
+        Objects.requireNonNull(tbCrm, "未找到派单号");
         TBService tbService = tbServiceService.getById(tbCrm.getServiceId());
         Objects.requireNonNull(tbService, "未找到服务单元");
 
         TFCustomFlow tfCustomFlow = null;
         if (tbService.getType() == ProductTypeEnum.OFFICE) {
+            if (Objects.isNull(tbCrm.getProcessVar()) || Objects.equals(tbCrm.getProcessVar().trim(), "")) {
+                throw ExceptionResultEnum.ERROR.exception("请先保存属性【部署方式】【阅卷方式】【扫描场地网络】");
+            }
             tfCustomFlow = tfCustomFlowService.findMaxVersion(null, null, TFCustomTypeEnum.OFFICE_SOP_FLOW);
+            Objects.requireNonNull(tfCustomFlow, "未找到教务处流程");
+        } else {
+            tfCustomFlow = tfCustomFlowService.findMaxVersion(null, null, TFCustomTypeEnum.CLOUD_MARK_SOP_FLOW);
+            Objects.requireNonNull(tfCustomFlow, "未找到研究生流程");
         }
-        Objects.requireNonNull(tfCustomFlow, "未找到教务处流程");
         return tfCustomFlow;
     }
 
@@ -380,9 +469,9 @@ public class TBCrmDetailServiceImpl extends ServiceImpl<TBCrmDetailMapper, TBCrm
         TBCrm tbCrm = tbCrmService.findByCrmNo(tbCrmDetail.getCrmNo());
         //发布流程
         TFCustomFlow tfCustomFlow = tbCrmDetailService.queryCustomFlow(tbCrmDetail.getCrmNo());
-        if (tfCustomFlow.getType() == TFCustomTypeEnum.CLOUD_MARK_SOP_FLOW) {
-            throw ExceptionResultEnum.ERROR.exception("研究生SOP暂不支持发布");
-        }
+        //        if (tfCustomFlow.getType() == TFCustomTypeEnum.CLOUD_MARK_SOP_FLOW) {
+        //            throw ExceptionResultEnum.ERROR.exception("研究生SOP暂不支持发布");
+        //        }
         Map<String, Object> var = new HashMap<>();
         var.put(SystemConstant.CRM_DETAIL, tbCrmDetail);
         var.put(SystemConstant.PROCESS_VAR, tbCrm.getProcessVar());
@@ -392,17 +481,21 @@ public class TBCrmDetailServiceImpl extends ServiceImpl<TBCrmDetailMapper, TBCrm
         String sopNo = tbSopInfoService.sopPublish(sopPublishParam);
         tbCrmDetail.setSopNo(sopNo);
 
-        if (Objects.nonNull(tbCrmDetail.getScanStartTime()) && Objects.nonNull(tbCrmDetail.getScanEndTime())
-                && tbCrmDetail.getScanEndTime().longValue() <= tbCrmDetail.getScanStartTime().longValue()) {
-            throw ExceptionResultEnum.ERROR.exception("扫描结束时间不能小于等于扫描开始时间");
-        }
-        if (Objects.nonNull(tbCrmDetail.getScanEndTime()) && Objects.nonNull(tbCrmDetail.getMarkPaperStartTime())
-                && tbCrmDetail.getMarkPaperStartTime().longValue() <= tbCrmDetail.getScanEndTime().longValue()) {
-            throw ExceptionResultEnum.ERROR.exception("阅卷开始时间不能小于等于扫描结束时间");
-        }
-        if (Objects.nonNull(tbCrmDetail.getMarkPaperStartTime()) && Objects.nonNull(tbCrmDetail.getMarkPaperEndTime())
-                && tbCrmDetail.getMarkPaperEndTime().longValue() <= tbCrmDetail.getMarkPaperStartTime().longValue()) {
-            throw ExceptionResultEnum.ERROR.exception("阅卷结束时间不能小于等于阅卷开始时间");
+        if (tfCustomFlow.getType() == TFCustomTypeEnum.OFFICE_SOP_FLOW) {
+            if (Objects.nonNull(tbCrmDetail.getScanStartTime()) && Objects.nonNull(tbCrmDetail.getScanEndTime())
+                    && tbCrmDetail.getScanEndTime().longValue() <= tbCrmDetail.getScanStartTime().longValue()) {
+                throw ExceptionResultEnum.ERROR.exception("扫描结束时间不能小于等于扫描开始时间");
+            }
+            if (Objects.nonNull(tbCrmDetail.getScanEndTime()) && Objects.nonNull(tbCrmDetail.getMarkPaperStartTime())
+                    && tbCrmDetail.getMarkPaperStartTime().longValue() <= tbCrmDetail.getScanEndTime().longValue()) {
+                throw ExceptionResultEnum.ERROR.exception("阅卷开始时间不能小于等于扫描结束时间");
+            }
+            if (Objects.nonNull(tbCrmDetail.getMarkPaperStartTime()) && Objects.nonNull(
+                    tbCrmDetail.getMarkPaperEndTime())
+                    && tbCrmDetail.getMarkPaperEndTime().longValue() <= tbCrmDetail.getMarkPaperStartTime()
+                    .longValue()) {
+                throw ExceptionResultEnum.ERROR.exception("阅卷结束时间不能小于等于阅卷开始时间");
+            }
         }
         return tbCrmDetailService.updateById(tbCrmDetail);
     }

+ 48 - 4
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBSopInfoServiceImpl.java

@@ -265,10 +265,6 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
         if (CollectionUtils.isEmpty(crmProjectResult.getEngineerList())) {
             throw ExceptionResultEnum.ERROR.exception("未设置工程师");
         }
-        List<String> approveUserIds = new ArrayList<>(crmProjectResult.getProjectManagerList().size());
-        crmProjectResult.getProjectManagerList().stream().peek(e -> approveUserIds.add(e.getUserId().toString()))
-                .collect(Collectors.toList());
-        sopPublishParam.setApproveUserIds(approveUserIds);
 
         TBService tbService = tbServiceService.getById(crmProjectResult.getServiceUnitId());
         Optional.ofNullable(tbService).orElseThrow(() -> ExceptionResultEnum.SERVICE_NO_DATA.exception());
@@ -292,6 +288,17 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
                 && tfCustomFlow.getType() != TFCustomTypeEnum.CLOUD_MARK_SOP_FLOW) {
             throw ExceptionResultEnum.ERROR.exception("sop流程类型错误");
         }
+
+        if (tfCustomFlow.getType() == TFCustomTypeEnum.OFFICE_SOP_FLOW) {
+            List<String> approveUserIds = new ArrayList<>(crmProjectResult.getProjectManagerList().size());
+            crmProjectResult.getProjectManagerList().stream().peek(e -> approveUserIds.add(e.getUserId().toString()))
+                    .collect(Collectors.toList());
+            sopPublishParam.setApproveUserIds(approveUserIds);
+        } else if (tfCustomFlow.getType() == TFCustomTypeEnum.CLOUD_MARK_SOP_FLOW) {
+            sopPublishParam.setApproveUserIds(
+                    new ArrayList(Arrays.asList(crmProjectResult.getRegionManagerId().toString())));
+        }
+
         sopPublishParam = tbSopInfoService.setSetupOne(sopPublishParam, tfCustomFlow, crmProjectResult);
         Map<String, Object> map = activitiService.taskApprove(new FlowApproveParam(sopPublishParam));
         tfCustomFlow = Objects.isNull(tfCustomFlow) ? (TFCustomFlow) map.get(SystemConstant.FLOW_CUSTOM) : tfCustomFlow;
@@ -407,6 +414,43 @@ public class TBSopInfoServiceImpl extends ServiceImpl<TBSopInfoMapper, TBSopInfo
                         }
                     }
                 }
+            } else if (tfCustomFlow.getType() == TFCustomTypeEnum.CLOUD_MARK_SOP_FLOW) {
+                for (FlowFormWidgetResult f : flowFormWidgetResultList) {
+                    if (Objects.nonNull(tbCrmDetail) && f.getFormId()
+                            .contains(ProcessLimitedEnum.REGION_MANAGER_ID.getKey())) {
+                        if (Objects.nonNull(crmProjectResult.getRegionManagerId())) {
+                            JSONObject jsonObject = new JSONObject();
+                            jsonObject.put(SystemConstant.VALUE, crmProjectResult.getRegionManagerId().toString());
+                            f.setValue(jsonObject.toJSONString());
+                        }
+                    } else if (Objects.nonNull(tbCrmDetail) && f.getFormId()
+                            .contains(ProcessLimitedEnum.ENGINEER_USERS_ID.getKey())) {
+                        if (!CollectionUtils.isEmpty(crmProjectResult.getEngineerList())) {
+                            List<String> list = new ArrayList<>(crmProjectResult.getEngineerList().size());
+                            crmProjectResult.getEngineerList().stream().peek(s -> list.add(s.getUserId().toString()))
+                                    .collect(Collectors.toList());
+                            JSONObject jsonObject = new JSONObject();
+                            jsonObject.put(SystemConstant.VALUE, list);
+                            f.setValue(jsonObject.toJSONString());
+                        }
+                    } else if (Objects.nonNull(tbCrmDetail) && f.getFormId()
+                            .contains(ProcessLimitedEnum.PROJECT_MANAGER_ID.getKey())) {
+                        if (!CollectionUtils.isEmpty(crmProjectResult.getProjectManagerList())) {
+                            JSONObject jsonObject = new JSONObject();
+                            jsonObject.put(SystemConstant.VALUE,
+                                    crmProjectResult.getProjectManagerList().get(0).getUserId().toString());
+                            f.setValue(jsonObject.toJSONString());
+                        }
+                    } else if (Objects.nonNull(tbCrmDetail) && f.getFormId()
+                            .contains(ProcessLimitedEnum.REGION_COORDINATOR_ID.getKey())) {
+                        if (!CollectionUtils.isEmpty(crmProjectResult.getRegionCoordinatorList())) {
+                            JSONObject jsonObject = new JSONObject();
+                            jsonObject.put(SystemConstant.VALUE,
+                                    crmProjectResult.getRegionCoordinatorList().get(0).getUserId().toString());
+                            f.setValue(jsonObject.toJSONString());
+                        }
+                    }
+                }
             }
         }
         return flowTaskResult;

+ 62 - 6
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBUserArchivesAllocationServiceImpl.java

@@ -194,7 +194,6 @@ public class TBUserArchivesAllocationServiceImpl
                         .eq(TBUserArchivesAllocation::getCrmDetailId, crmDetailId));
             }
 
-
             // 经过对比要新增的人员档案id集合
             List<Long> addList = userIdList.stream().filter(e -> !allocatedIdList.contains(e)).distinct()
                     .collect(Collectors.toList());
@@ -523,7 +522,8 @@ public class TBUserArchivesAllocationServiceImpl
 
         List<SopRoleTypeEnum> result = new ArrayList<>();
         if (CollectionUtils.isNotEmpty(tbUserArchivesAllocationList)) {
-            result = tbUserArchivesAllocationList.stream().map(TBUserArchivesAllocation::getSopRoleType).collect(Collectors.toList());
+            result = tbUserArchivesAllocationList.stream().map(TBUserArchivesAllocation::getSopRoleType)
+                    .collect(Collectors.toList());
         }
         return result;
     }
@@ -534,10 +534,12 @@ public class TBUserArchivesAllocationServiceImpl
         switch (sopRoleTypeEnum) {
         case ENGINEER:
         case PROJECT_MANAGER:
-            datasource = tbUserArchivesService.list().stream().map(TBUserArchives::getId).distinct().collect(Collectors.toList());
+            datasource = tbUserArchivesService.list().stream().map(TBUserArchives::getId).distinct()
+                    .collect(Collectors.toList());
             break;
         case REGION_COORDINATOR:
-            datasource = tbUserArchivesService.findArchivesSourceByType(RoleTypeEnum.REGION_COORDINATOR).stream().map(ArchivesSourceResult::getArchivesId).distinct().collect(Collectors.toList());
+            datasource = tbUserArchivesService.findArchivesSourceByType(RoleTypeEnum.REGION_COORDINATOR).stream()
+                    .map(ArchivesSourceResult::getArchivesId).distinct().collect(Collectors.toList());
             break;
         }
         List<Long> effectArchivesIdList = datasource.stream().distinct().collect(Collectors.toList());
@@ -555,8 +557,9 @@ public class TBUserArchivesAllocationServiceImpl
                 cell.setSupplierName(tbUserArchivesResult.getSupplierName());
                 cell.setMobileNumber(tbUserArchivesResult.getMobileNumber());
                 List<RoleResult> roleInfoList = tbUserArchivesResult.getRoleInfoList();
-                if (CollectionUtils.isNotEmpty(roleInfoList)){
-                    cell.setArchivesRoleName(roleInfoList.stream().map(RoleResult::getRoleName).collect(Collectors.joining(",")));
+                if (CollectionUtils.isNotEmpty(roleInfoList)) {
+                    cell.setArchivesRoleName(
+                            roleInfoList.stream().map(RoleResult::getRoleName).collect(Collectors.joining(",")));
                 }
                 result.add(cell);
             }
@@ -564,6 +567,59 @@ public class TBUserArchivesAllocationServiceImpl
         return result;
     }
 
+    /**
+     * 查询派单详情中可以分配的人员(复合角色)
+     *
+     * @param crmDetailId
+     * @param sopRoleTypeCompositeEnum
+     * @return
+     */
+    @Override
+    public List<UserArchivesDto> findCanChooseArchives(Long crmDetailId,
+            SopRoleTypeCompositeEnum sopRoleTypeCompositeEnum) {
+        List<UserArchivesDto> result = new ArrayList<>();
+        if (sopRoleTypeCompositeEnum == SopRoleTypeCompositeEnum.REGION_COORDINATOR
+                || sopRoleTypeCompositeEnum == SopRoleTypeCompositeEnum.PROJECT_MANAGER
+                || sopRoleTypeCompositeEnum == SopRoleTypeCompositeEnum.ENGINEER) {
+            List<Long> datasource = new ArrayList<>();
+            switch (sopRoleTypeCompositeEnum) {
+            case ENGINEER:
+            case PROJECT_MANAGER:
+                datasource = tbUserArchivesService.list().stream().map(TBUserArchives::getId).distinct()
+                        .collect(Collectors.toList());
+                break;
+            case REGION_COORDINATOR:
+                datasource = tbUserArchivesService.findArchivesSourceByType(RoleTypeEnum.REGION_COORDINATOR).stream()
+                        .map(ArchivesSourceResult::getArchivesId).distinct().collect(Collectors.toList());
+                break;
+            }
+            List<Long> effectArchivesIdList = datasource.stream().distinct().collect(Collectors.toList());
+            for (Long effectArchivesId : effectArchivesIdList) {
+                UserArchivesResult tbUserArchivesResult = tbUserArchivesService.findUserArchivesByArchivesIdORUserId(
+                        effectArchivesId, null);
+                if (tbUserArchivesResult.getAuthenticationStatus()) {
+                    UserArchivesDto cell = new UserArchivesDto();
+                    cell.setUserId(tbUserArchivesResult.getUserId());
+                    cell.setUserArchivesId(tbUserArchivesResult.getUserArchivesId());
+                    cell.setName(tbUserArchivesResult.getName());
+                    cell.setProvince(tbUserArchivesResult.getProvince());
+                    cell.setCity(tbUserArchivesResult.getCity());
+                    cell.setSupplierName(tbUserArchivesResult.getSupplierName());
+                    cell.setMobileNumber(tbUserArchivesResult.getMobileNumber());
+                    List<RoleResult> roleInfoList = tbUserArchivesResult.getRoleInfoList();
+                    if (CollectionUtils.isNotEmpty(roleInfoList)) {
+                        cell.setArchivesRoleName(
+                                roleInfoList.stream().map(RoleResult::getRoleName).collect(Collectors.joining(",")));
+                    }
+                    result.add(cell);
+                }
+            }
+        } else {
+
+        }
+        return result;
+    }
+
     @Override
     public CrmDetailAllocationResult findCrmDetailAllocationInfo(Long crmDetailId) {
         CrmProjectResult crmProjectResult = tbCrmService.findCrmProjectInfo(null, crmDetailId, null);

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

@@ -3,7 +3,25 @@
 <mapper namespace="com.qmth.sop.business.mapper.TBCrmDetailMapper">
 
     <select id="list" resultType="com.qmth.sop.business.entity.TBCrmDetail">
-        select t.*,tbsi.status as sopStatus from t_b_crm_detail t
+        select t.id,
+               t.crm_no as crmNo,
+               t.flow_deployment_id as flowDeploymentId,
+               t.sop_no as sopNo,
+               t.status,
+               t.course_name as courseName,
+               IF(t.exam_student_count >= 0,t.exam_student_count,null) as examStudentCount,
+               t.contacts,
+               t.mobile_number as mobileNumber,
+               t.service_scope as serviceScope,
+               IF(t.scan_start_time >= 0,t.scan_start_time,null) as scanStartTime,
+               IF(t.scan_end_time >= 0,t.scan_end_time,null) as scanEndTime,
+               IF(t.mark_paper_start_time >= 0,t.mark_paper_start_time,null) as markPaperStartTime,
+               IF(t.mark_paper_end_time >= 0,t.mark_paper_end_time,null) as markPaperEndTime,
+               t.create_id as createId,
+               t.create_time as createTime,
+               t.update_id as updateId,
+               t.update_time as updateTime,
+               t.publish_time as publishTime,tbsi.status as sopStatus from t_b_crm_detail t
         left join t_f_custom_flow_entity tfcfe on tfcfe.code = t.sop_no
         left join t_b_sop_info tbsi on tbsi.sop_no = t.sop_no
         where t.crm_no = #{crmNo}

+ 7 - 1
sop-common/src/main/java/com/qmth/sop/common/enums/ProcessLimitedEnum.java

@@ -45,7 +45,13 @@ public enum ProcessLimitedEnum {
 
     MARK_WAY_RADIO("mark_way_radio", "阅卷方式"),
 
-    SCAN_NET_RADIO("scan_net_radio", "扫描场地网络情况");
+    SCAN_NET_RADIO("scan_net_radio", "扫描场地网络情况"),
+
+    REGION_MANAGER_ID("region_manager_id", "大区经理"),
+
+    PROJECT_MANAGER_ID("project_manager_id", "项目经理"),
+
+    REGION_COORDINATOR_ID("region_coordinator_id", "区域协调人");
 
     private String key;
 

+ 3 - 1
sop-common/src/main/java/com/qmth/sop/common/enums/ServiceScopeEnum.java

@@ -12,7 +12,9 @@ import java.util.Objects;
 public enum ServiceScopeEnum {
     SCAN("仅扫描"),
 
-    SCAN_MARK("扫描+阅卷");
+    SCAN_MARK("扫描+阅卷"),
+
+    CLOUD_MARK("研究生阅卷");
 
     ServiceScopeEnum(String title) {
         this.title = title;

+ 34 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/SopRoleTypeCompositeEnum.java

@@ -0,0 +1,34 @@
+package com.qmth.sop.common.enums;
+
+/**
+ * @Description: sop执行 角色类型枚举
+ * @Author: CaoZixuan
+ * @Date: 2024-05-14
+ */
+public enum SopRoleTypeCompositeEnum {
+    REGION_COORDINATOR("区域协调人", new RoleTypeEnum[] { RoleTypeEnum.REGION_MANAGER, RoleTypeEnum.REGION_COORDINATOR,
+            RoleTypeEnum.EFFECT_ENGINEER, RoleTypeEnum.ASSISTANT_ENGINEER }),
+    PROJECT_MANAGER("项目经理", new RoleTypeEnum[] { RoleTypeEnum.REGION_MANAGER, RoleTypeEnum.REGION_COORDINATOR,
+            RoleTypeEnum.EFFECT_ENGINEER, RoleTypeEnum.ASSISTANT_ENGINEER }),
+    ENGINEER("工程师", new RoleTypeEnum[] { RoleTypeEnum.REGION_MANAGER, RoleTypeEnum.REGION_COORDINATOR,
+            RoleTypeEnum.EFFECT_ENGINEER, RoleTypeEnum.ASSISTANT_ENGINEER }),
+    REGION_MANAGER("大区经理", new RoleTypeEnum[] {});
+
+    private final String title;
+
+    // 可选择的用户所属角色类型
+    private final RoleTypeEnum[] roleTypes;
+
+    SopRoleTypeCompositeEnum(String title, RoleTypeEnum[] roleTypes) {
+        this.title = title;
+        this.roleTypes = roleTypes;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public RoleTypeEnum[] getRoleTypes() {
+        return roleTypes;
+    }
+}

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