浏览代码

根据最新需求原型勾勒出教务处SOP和研究生SOP的10大流程的动态表单的基础数据结构

刘洋 1 年之前
父节点
当前提交
5f81f5fe66

+ 18 - 0
src/router/asyncRoutes.js

@@ -34,6 +34,24 @@ export const routesNotMenu = [
       mount: 'Bootstrap', //需要挂载在哪个路由节点下
     },
   },
+  {
+    name: 'SopStep',
+    path: '/sop/sop-manage/sop-step',
+    component: () => import('@/views/sop/sop-manage/sop-step/index.vue'),
+    meta: {
+      title: '教务处SOP流程',
+      mount: 'SopManage',
+    },
+  },
+  {
+    name: 'StuSopStep',
+    path: '/sop/sop-manage/stu-sop-step',
+    component: () => import('@/views/sop/sop-manage/stu-sop-step/index.vue'),
+    meta: {
+      title: '研究生SOP流程',
+      mount: 'SopManage',
+    },
+  },
 ];
 
 //菜单的白名单,比如“我的工作台”,不依赖权限配置,只要登录,就能加入菜单

+ 21 - 10
src/router/modules/sop.js

@@ -41,16 +41,16 @@ export default {
             // bind: 'OfficeSop',
           },
         },
-        {
-          name: 'SopStep',
-          path: '/sop/sop-manage/sop-step',
-          component: () => import('@/views/sop/sop-manage/sop-step/index.vue'),
-          meta: {
-            title: '当前SOP流程',
-            bind: 'office',
-            // bind: 'OfficeSop',
-          },
-        },
+        // {
+        //   name: 'SopStep',
+        //   path: '/sop/sop-manage/sop-step',
+        //   component: () => import('@/views/sop/sop-manage/sop-step/index.vue'),
+        //   meta: {
+        //     title: '教务处SOP流程',
+        //     bind: 'office',
+        //     // bind: 'OfficeSop',
+        //   },
+        // },
         {
           name: 'StudentSop',
           path: '/sop/sop-manage/student-sop',
@@ -62,6 +62,17 @@ export default {
             alias: 'cloudMark',
           },
         },
+        // {
+        //   name: 'StuSopStep',
+        //   path: '/sop/sop-manage/stu-sop-step',
+        //   component: () =>
+        //     import('@/views/sop/sop-manage/stu-sop-step/index.vue'),
+        //   meta: {
+        //     title: '研究生SOP流程',
+        //     bind: 'cloudMark',
+        //     // bind: 'OfficeSop',
+        //   },
+        // },
         {
           name: 'DeviceOutIn',
           path: '/sop/sop-manage/device-out-in',

+ 9 - 9
src/style/tdesign-reset.less

@@ -45,15 +45,15 @@
   width: 100%;
   margin-right: 0;
 }
-.t-tabs {
-  border: 1px solid #dcdfe6;
-  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04);
-  .t-tabs__content {
-    .t-tab-panel {
-      padding: 15px;
-    }
-  }
-}
+// .t-tabs {
+//   border: 1px solid #dcdfe6;
+//   box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04);
+//   .t-tabs__content {
+//     .t-tab-panel {
+//       padding: 15px;
+//     }
+//   }
+// }
 
 .t-select {
   &.t-select-input--multiple {

+ 1 - 0
src/views/sop/components/CHECKBOX.vue

@@ -1,5 +1,6 @@
 <template>
   <t-checkbox-group
+    style="min-height: 32px"
     v-model="value"
     :name="config.binding"
     :options="config.options || []"

+ 73 - 0
src/views/sop/components/DEVICE_IN_TABLE.vue

@@ -0,0 +1,73 @@
+<template>
+  <t-table
+    class="dynamic-table"
+    ref="tableRef"
+    row-key="key"
+    :columns="columns"
+    :data="tableData"
+    bordered
+    size="small"
+  >
+    <template #key="{ row }">
+      <div class="flex items-center key-cell">
+        <span class="key-index">{{ row.key }}</span>
+      </div>
+    </template>
+
+    <template #h="{ row }">
+      <span>上传图片</span>
+    </template>
+  </t-table>
+</template>
+<script setup name="DEVICEINTABLE">
+import { ref } from 'vue';
+const { config, onChange } = defineProps(['config', 'onChange']);
+const columns = [
+  {
+    title: '',
+    coleKey: 'key',
+    cell: 'key',
+    align: 'left',
+    width: 80,
+  },
+  {
+    title: '设备编号',
+    colKey: 'a',
+    width: 150,
+  },
+  {
+    title: '设备编号',
+    colKey: 'b',
+    width: 150,
+  },
+  {
+    title: '供应商',
+    colKey: 'c',
+  },
+  {
+    title: '运行状态',
+    colKey: 'd',
+    width: 80,
+  },
+  {
+    title: '总扫描量',
+    colKey: 'e',
+    width: 80,
+  },
+  {
+    title: '当前所在地',
+    colKey: 'f',
+  },
+  {
+    title: '发往地',
+    colKey: 'g',
+  },
+  {
+    title: '快递单拍照',
+    colKey: 'h',
+    width: 100,
+  },
+];
+const tableData = ref([]);
+</script>
+<style></style>

+ 106 - 0
src/views/sop/components/DEVICE_OUT_TABLE.vue

@@ -0,0 +1,106 @@
+<template>
+  <t-table
+    class="dynamic-table"
+    ref="tableRef"
+    row-key="key"
+    :columns="columns"
+    :data="tableData"
+    bordered
+    size="small"
+  >
+    <template #key="{ row }">
+      <div class="flex items-center key-cell">
+        <Icon name="delete" class="delete-icon" @click="deleteRow(row)"></Icon>
+        <span class="key-index">{{ row.key }}</span>
+      </div>
+    </template>
+    <template #a="{ row }">
+      <t-select v-model="row.a">
+        <t-option value="1">111</t-option>
+        <t-option value="2">222</t-option>
+      </t-select>
+    </template>
+
+    <template #h="{ row }">
+      <span>上传图片</span>
+    </template>
+  </t-table>
+</template>
+<script setup name="DEVICEOUTTABLE">
+import { ref } from 'vue';
+const { config, onChange } = defineProps(['config', 'onChange']);
+const columns = [
+  {
+    title: '',
+    coleKey: 'key',
+    cell: 'key',
+    align: 'left',
+    width: 80,
+  },
+  {
+    title: '设备编号',
+    colKey: 'a',
+    width: 150,
+  },
+  {
+    title: '设备编号',
+    colKey: 'b',
+    width: 150,
+  },
+  {
+    title: '供应商',
+    colKey: 'c',
+  },
+  {
+    title: '运行状态',
+    colKey: 'd',
+    width: 80,
+  },
+  {
+    title: '总扫描量',
+    colKey: 'e',
+    width: 80,
+  },
+  {
+    title: '当前所在地',
+    colKey: 'f',
+  },
+  {
+    title: '发往地',
+    colKey: 'g',
+  },
+  {
+    title: '快递单拍照',
+    colKey: 'h',
+    width: 100,
+  },
+];
+const tableData = ref([]);
+const resetKeys = () => {
+  tableData.value.forEach((item, index) => {
+    item.key = index + 1 + '';
+  });
+};
+
+const createOneRow = () => {
+  tableData.value.push({
+    a: '',
+    b: '',
+    c: '',
+    d: '',
+    e: '',
+    f: '',
+    g: '',
+    h: '',
+  });
+  resetKeys();
+};
+
+createOneRow();
+const deleteRow = (row) => {
+  let index = tableData.value.findIndex((item) => item.key == row.key);
+  tableData.value.splice(index, 1);
+  resetKeys();
+};
+</script>
+<style></style>

+ 3 - 3
src/views/sop/components/PROJECT_HEADER.vue → src/views/sop/components/FORM_GROUP_TITLE.vue

@@ -1,13 +1,13 @@
 <template>
-  <div class="project-header"></div>
+  <div class="form-group-title"></div>
 </template>
 
-<script setup name="PROJECTHEADER">
+<script setup name="FORMGROUPTITLE">
 const { config } = defineProps(['config']);
 </script>
 
 <style lang="less" scoped>
-.project-header {
+.form-group-title {
   width: 100%;
   color: var(--td-text-color-primary);
   padding-bottom: 3px;

+ 2 - 1
src/views/sop/components/RADIO.vue

@@ -1,11 +1,12 @@
 <template>
   <t-radio-group
+    style="min-height: 32px; width: 100%"
     v-model="value"
     allow-uncheck
     :name="config.binding"
     :options="config.options || []"
     @change="change"
-    style="width: 100%"
+    :disabled="config.disabled"
   ></t-radio-group>
 </template>
 

+ 28 - 0
src/views/sop/components/RADIO_WITH_INPUT.vue

@@ -0,0 +1,28 @@
+<template>
+  <t-radio-group
+    style="min-height: 32px; width: 100%"
+    v-model="value"
+    allow-uncheck
+    :name="config.binding"
+    :options="config.options || []"
+    @change="change"
+  >
+    <t-radio
+      :value="item.value"
+      v-for="item in config.options"
+      :key="item.value"
+      >{{ item.label }}</t-radio
+    >
+    <t-input v-model="inputValue" placeholder="请填写具体内容"></t-input>
+  </t-radio-group>
+</template>
+
+<script setup name="RADIOWITHINPUT">
+import { ref } from 'vue';
+const { config, onChange } = defineProps(['config', 'onChange']);
+const value = ref('');
+const inputValue = ref('');
+const change = () => {};
+</script>
+
+<style></style>

+ 8 - 0
src/views/sop/components/SIGN.vue

@@ -0,0 +1,8 @@
+<template>
+  <div>手写签名组件待定...</div>
+</template>
+<script setup name="SIGN">
+import { ref } from 'vue';
+const { config, onChange } = defineProps(['config', 'onChange']);
+</script>
+<style></style>

+ 91 - 0
src/views/sop/components/UPLOAD_IMAGE .vue

@@ -0,0 +1,91 @@
+<template>
+  <t-upload
+    ref="uploadRef3"
+    v-model="files"
+    :theme="theme"
+    :tips="`最多只能上传 ${config.limit || 3} 张图片`"
+    accept="image/*"
+    :abridge-name="[6, 6]"
+    :auto-upload="true"
+    :upload-all-files-in-one-request="false"
+    multiple
+    :max="config.limit || 3"
+    :before-upload="handleBeforeUpload"
+    :request-method="upload"
+    @fail="handleFail"
+    @change="change"
+  >
+  </t-upload>
+</template>
+<script setup name="UploadImage">
+import { ref } from 'vue';
+import { MessagePlugin } from 'tdesign-vue-next';
+import { uploadFiles } from '@/api/common';
+import { getFileMD5 } from '@/utils/crypto';
+const props = defineProps({
+  theme: {
+    type: String,
+    default: 'image',
+  },
+  accept: {
+    type: String,
+    default: '.jpg,.jpeg,.png',
+  },
+  maxSize: {
+    // 单位kb
+    type: Number,
+    default: 20 * 1024,
+  },
+  config: {
+    type: Object,
+  },
+  onChange: {
+    type: Function,
+  },
+});
+const files = ref([]);
+const checkFileFormat = (fileType) => {
+  const _file_format = '.' + fileType.split('.').pop().toLocaleLowerCase();
+  return props.accept.split(',').includes(_file_format.toLocaleLowerCase());
+};
+const handleBeforeUpload = (file) => {
+  if (file.size > props.maxSize * 1024) {
+    const size =
+      props.maxSize < 1024
+        ? `${props.maxSize}kb`
+        : `${Math.floor(props.maxSize / 1024)}M`;
+    const content = '文件大小不能超过' + size;
+    MessagePlugin.error(content);
+    return false;
+  }
+
+  if (!checkFileFormat(file.name)) {
+    const content = '只支持文件格式为' + props.accept;
+    MessagePlugin.error(content);
+    return false;
+  }
+
+  return true;
+};
+const handleFail = ({ file }) => {
+  MessagePlugin.error(`文件 ${file.name} 上传失败`);
+};
+
+const upload = async (files) => {
+  let formData = new FormData();
+  const file = files[0].raw;
+  const md5 = await getFileMD5(file);
+  formData.append('file', file);
+  formData.append('type', 'FILE');
+
+  const res = await uploadFiles(formData, md5).catch(() => {});
+  if (res) {
+    return { status: 'success', response: res };
+  } else {
+    return { status: 'fail', error: '上传失败' };
+  }
+};
+const change = (fileList) => {
+  onChange({ prop: config.binding, value: fileList });
+};
+</script>

+ 49 - 19
src/views/sop/components/my-form-item.vue

@@ -1,10 +1,19 @@
 <template>
-  <t-form-item :label="''" :name="config.binding" class="my-form-item">
-    <div class="top-label flex items-center">
-      <span class="require-icon" :class="{ hide: !config.required }">*</span>
+  <t-form-item
+    :label="isBigTitle ? '' : config.title"
+    :name="config.binding"
+    :label-width="isBigTitle || !config.title ? 0 : transLabelWidth"
+    class="my-form-item"
+  >
+    <div
+      class="top-label flex items-center"
+      :class="{ 'm-t-20px': isBigTitle }"
+      v-if="isBigTitle"
+    >
+      <!-- <span class="require-icon" :class="{ hide: !config.required }">*</span> -->
       <p>{{ config.title }}</p>
     </div>
-    <div class="sub-title" v-if="config.subTitle">
+    <!-- <div class="sub-title" v-if="config.subTitle">
       <p
         v-for="(item, index) in config.subTitle"
         :key="index"
@@ -12,28 +21,41 @@
       >
         {{ item.content }}
       </p>
-    </div>
+    </div> -->
     <RenderTest></RenderTest>
   </t-form-item>
 </template>
 <script setup lang="jsx" name="MyFormItem">
-import { defineComponent } from 'vue';
+import { defineComponent, ref, computed } from 'vue';
 import TEXT from './TEXT.vue';
 import SELECT from './SELECT.vue';
-import POPSELECT from './POP_SELECT.vue';
-import LABELS from './LABELS';
-import LABEL from './LABEL';
 import DATE from './DATE';
 import UPLOAD from './UPLOAD';
 import TABLE from './TABLE';
-import PROJECTHEADER from './PROJECT_HEADER.vue';
+import FORMGROUPTITLE from './FORM_GROUP_TITLE.vue';
 import RADIO from './RADIO.vue';
 import CHECKBOX from './CHECKBOX.vue';
 import TEXTAREA from './TEXTAREA.vue';
-const { config } = defineProps(['config']);
+import UPLOADIMAGE from './UPLOAD_IMAGE .vue';
+import RADIOWITHINPUT from './RADIO_WITH_INPUT.vue';
+import SIGN from './SIGN.vue';
+import DEVICEOUTTABLE from './DEVICE_OUT_TABLE.vue';
+import DEVICEINTABLE from './DEVICE_IN_TABLE.vue';
+const { config, labelWidth } = defineProps(['config', 'labelWidth']);
 const onChange = (obj) => {
   console.log('obj', obj);
 };
+const bigTitles = ref(['FORM_GROUP_TITLE', 'ONLY_TITLE']);
+const isBigTitle = computed(() => {
+  return bigTitles.value.includes(config.code);
+});
+const transLabelWidth = computed(() => {
+  if (config.title.length > 13) {
+    return config.title.length * 16;
+  } else {
+    return labelWidth;
+  }
+});
 const RenderTest = defineComponent({
   render() {
     if (!config) {
@@ -44,26 +66,34 @@ const RenderTest = defineComponent({
         return <TEXT config={config} onChange={onChange}></TEXT>;
       case 'SELECT':
         return <SELECT config={config} onChange={onChange}></SELECT>;
-      case 'POP_SELECT':
-        return <POPSELECT config={config} onChange={onChange}></POPSELECT>;
-      case 'LABELS':
-        return <LABELS config={config}></LABELS>;
-      case 'LABEL':
-        return <LABEL config={config}></LABEL>;
       case 'DATE':
         return <DATE config={config} onChange={onChange}></DATE>;
       case 'FILE':
         return <UPLOAD config={config} onChange={onChange}></UPLOAD>;
       case 'TABLE':
         return <TABLE config={config} onChange={onChange}></TABLE>;
-      case 'PROJECT_HEADER':
-        return <PROJECTHEADER config={config}></PROJECTHEADER>;
+      case 'FORM_GROUP_TITLE':
+        return <FORMGROUPTITLE config={config}></FORMGROUPTITLE>;
       case 'RADIO':
         return <RADIO config={config} onChange={onChange}></RADIO>;
       case 'CHECKBOX':
         return <CHECKBOX config={config} onChange={onChange}></CHECKBOX>;
       case 'TEXTAREA':
         return <TEXTAREA config={config} onChange={onChange}></TEXTAREA>;
+      case 'UPLOAD_IMAGE':
+        return <UPLOADIMAGE config={config} onChange={onChange}></UPLOADIMAGE>;
+      case 'RADIO_WITH_INPUT':
+        return (
+          <RADIOWITHINPUT config={config} onChange={onChange}></RADIOWITHINPUT>
+        );
+      case 'DEVICE_OUT_TABLE':
+        return <DEVICEOUTTABLE></DEVICEOUTTABLE>;
+      case 'DEVICE_IN_TABLE':
+        return <DEVICEINTABLE></DEVICEINTABLE>;
+      case 'SIGN':
+        return <SIGN></SIGN>;
+      case 'ONLY_TITLE':
+        return <div></div>;
       case '':
         return <div></div>;
       default:

+ 1 - 1
src/views/sop/sop-manage/office-sop/index.vue

@@ -137,7 +137,7 @@ const {
 } = useFetchTable(getTableData);
 
 const createSopFlow = (row) => {
-  router.push({ name: 'SopFlow' });
+  router.push({ name: 'SopStep' });
 };
 const toCurSopFlow = (row) => {
   router.push({ name: 'SopStep' });

+ 48 - 32
src/views/sop/sop-manage/sop-step/index.vue

@@ -1,23 +1,21 @@
 <template>
-  <div class="sop-flow">
+  <div class="sop-step">
     <div class="page-wrap">
-      <t-form colon :label-width="0">
-        <t-row :gutter="[0, 20]">
-          <t-col :span="6" v-for="config in baseConfig" :key="config.id">
-            <MyFormItem :config="config"></MyFormItem>
-          </t-col>
-        </t-row>
-      </t-form>
       <p class="split-line"></p>
-      <t-tabs v-model="curStep" theme="card" class="m-t-20px">
+      <t-tabs v-model="curStep" placement="left" class="m-t-20px">
         <t-tab-panel
           v-for="item in tabs"
           :key="item.taskKey"
           :value="item.value"
           :label="item.label"
         >
-          <t-form ref="form" colon :label-width="0" class="cur-step-view">
-            <t-row :gutter="[0, 20]">
+          <t-form
+            ref="form"
+            colon
+            :label-width="labelWidth"
+            class="cur-step-view"
+          >
+            <t-row :gutter="[0, 10]">
               <t-col
                 :span="
                   fullWidthCodes.includes(config.code) ? 12 : config.span || 6
@@ -25,10 +23,18 @@
                 v-for="config in curFormConfig"
                 :key="config.id"
               >
-                <MyFormItem :config="config"></MyFormItem>
+                <MyFormItem
+                  :config="config"
+                  :labelWidth="labelWidth"
+                ></MyFormItem>
               </t-col>
             </t-row>
           </t-form>
+          <s-buttons
+            confirmText="提交"
+            @cancel="router.back()"
+            class="m-t-50px"
+          ></s-buttons>
         </t-tab-panel>
       </t-tabs>
     </div>
@@ -38,29 +44,40 @@
 <script setup name="SopStep">
 import { ref, computed } from 'vue';
 import MyFormItem from '../../components/my-form-item.vue';
+import { useRouter } from 'vue-router';
 import testData from '../test';
-
-const fullWidthCodes = ref(['TABLE', 'PROJECT_HEADER']);
+const router = useRouter();
+const labelWidth = ref(230);
+const fullWidthCodes = ref([
+  'TABLE',
+  'FORM_GROUP_TITLE',
+  'TEXTAREA',
+  'ONLY_TITLE',
+  'DEVICE_OUT_TABLE',
+  'DEVICE_IN_TABLE',
+]);
 const form = ref();
-const allConfigMap = ref(testData.setupMap);
-let baseConfig = ref(testData.setupMap.f_usertask_jwc_start.formProperty);
 
 // const curStep = ref('f_usertask_jwc_project');
-const curStep = ref('评卷校验及收尾');
+const curStep = ref('设备入库登记');
+let allSteps = ref([
+  ...testData.flowTaskHistoryList,
+  testData.currFlowTaskResult,
+]);
+let tabsArr = [
+  ...testData.flowTaskHistoryList.map((item) => {
+    return { value: item.taskName, label: item.taskName };
+  }),
+  {
+    value: testData.currFlowTaskResult.taskName,
+    label: testData.currFlowTaskResult.taskName,
+  },
+];
+let tabs = ref(tabsArr);
 const curFormConfig = computed(() => {
-  return allConfigMap.value[curStep.value].formProperty;
+  return allSteps.value.find((item) => item.taskName === curStep.value)
+    .formProperty;
 });
-let tabs = ref(
-  Object.values(testData.setupMap)
-    .slice(1)
-    .map((item) => {
-      return {
-        value: item.taskKey,
-        label: item.taskName,
-      };
-    })
-);
-
 const submitHandle = () => {
   form.value.validate().then(async (result) => {
     alert(result);
@@ -74,15 +91,14 @@ const back = () => {
 </script>
 
 <style lang="less" scoped>
-.sop-flow {
+.sop-step {
   .page-wrap {
-    padding-right: 20%;
     .split-line {
       border-bottom: 1px dashed #ddd;
       margin: 30px 0 10px;
     }
     .cur-step-view {
-      padding: 20px 0;
+      // padding: 20px 0;
     }
   }
 }

+ 89 - 0
src/views/sop/sop-manage/sop-step/old.vue

@@ -0,0 +1,89 @@
+<template>
+  <div class="sop-flow">
+    <div class="page-wrap">
+      <t-form colon :label-width="0">
+        <t-row :gutter="[0, 20]">
+          <t-col :span="6" v-for="config in baseConfig" :key="config.id">
+            <MyFormItem :config="config"></MyFormItem>
+          </t-col>
+        </t-row>
+      </t-form>
+      <p class="split-line"></p>
+      <t-tabs v-model="curStep" theme="card" class="m-t-20px">
+        <t-tab-panel
+          v-for="item in tabs"
+          :key="item.taskKey"
+          :value="item.value"
+          :label="item.label"
+        >
+          <t-form ref="form" colon :label-width="0" class="cur-step-view">
+            <t-row :gutter="[0, 20]">
+              <t-col
+                :span="
+                  fullWidthCodes.includes(config.code) ? 12 : config.span || 6
+                "
+                v-for="config in curFormConfig"
+                :key="config.id"
+              >
+                <MyFormItem :config="config"></MyFormItem>
+              </t-col>
+            </t-row>
+          </t-form>
+        </t-tab-panel>
+      </t-tabs>
+    </div>
+  </div>
+</template>
+
+<script setup name="SopStep">
+import { ref, computed } from 'vue';
+import MyFormItem from '../../components/my-form-item.vue';
+import testData from '../test';
+
+const fullWidthCodes = ref(['TABLE', 'PROJECT_HEADER']);
+const form = ref();
+const allConfigMap = ref(testData.setupMap);
+let baseConfig = ref(testData.setupMap.f_usertask_jwc_start.formProperty);
+
+// const curStep = ref('f_usertask_jwc_project');
+const curStep = ref('评卷校验及收尾');
+const curFormConfig = computed(() => {
+  return allConfigMap.value[curStep.value].formProperty;
+});
+let tabs = ref(
+  Object.values(testData.setupMap)
+    .slice(1)
+    .map((item) => {
+      return {
+        value: item.taskKey,
+        label: item.taskName,
+      };
+    })
+);
+
+const submitHandle = () => {
+  form.value.validate().then(async (result) => {
+    alert(result);
+    if (result === true) {
+    }
+  });
+};
+const back = () => {
+  history.back();
+};
+</script>
+
+<style lang="less" scoped>
+.sop-flow {
+  .page-wrap {
+    padding-right: 20%;
+    .split-line {
+      border-bottom: 1px dashed #ddd;
+      margin: 30px 0 10px;
+    }
+    .cur-step-view {
+      padding: 20px 0;
+    }
+  }
+}
+</style>

+ 105 - 0
src/views/sop/sop-manage/stu-sop-step/index.vue

@@ -0,0 +1,105 @@
+<template>
+  <div class="stu-sop-step">
+    <div class="page-wrap">
+      <p class="split-line"></p>
+      <t-tabs v-model="curStep" placement="left" class="m-t-20px">
+        <t-tab-panel
+          v-for="item in tabs"
+          :key="item.taskKey"
+          :value="item.value"
+          :label="item.label"
+        >
+          <t-form
+            ref="form"
+            colon
+            :label-width="labelWidth"
+            class="cur-step-view"
+          >
+            <t-row :gutter="[0, 10]">
+              <t-col
+                :span="
+                  fullWidthCodes.includes(config.code) ? 12 : config.span || 6
+                "
+                v-for="config in curFormConfig"
+                :key="config.id"
+              >
+                <MyFormItem
+                  :config="config"
+                  :labelWidth="labelWidth"
+                ></MyFormItem>
+              </t-col>
+            </t-row>
+          </t-form>
+          <s-buttons
+            confirmText="提交"
+            @cancel="router.back()"
+            class="m-t-50px"
+          ></s-buttons>
+        </t-tab-panel>
+      </t-tabs>
+    </div>
+  </div>
+</template>
+
+<script setup name="SopStep">
+import { ref, computed } from 'vue';
+import MyFormItem from '../../components/my-form-item.vue';
+import { useRouter } from 'vue-router';
+import testData from '../test2';
+const router = useRouter();
+const labelWidth = ref(230);
+const fullWidthCodes = ref([
+  'TABLE',
+  'FORM_GROUP_TITLE',
+  'TEXTAREA',
+  'ONLY_TITLE',
+  'DEVICE_OUT_TABLE',
+  'DEVICE_IN_TABLE',
+]);
+const form = ref();
+
+// const curStep = ref('f_usertask_jwc_project');
+const curStep = ref('项目内审');
+let allSteps = ref([
+  ...testData.flowTaskHistoryList,
+  testData.currFlowTaskResult,
+]);
+let tabsArr = [
+  ...testData.flowTaskHistoryList.map((item) => {
+    return { value: item.taskName, label: item.taskName };
+  }),
+  {
+    value: testData.currFlowTaskResult.taskName,
+    label: testData.currFlowTaskResult.taskName,
+  },
+];
+let tabs = ref(tabsArr);
+const curFormConfig = computed(() => {
+  return allSteps.value.find((item) => item.taskName === curStep.value)
+    .formProperty;
+});
+const submitHandle = () => {
+  form.value.validate().then(async (result) => {
+    alert(result);
+    if (result === true) {
+    }
+  });
+};
+const back = () => {
+  history.back();
+};
+</script>
+
+<style lang="less" scoped>
+.stu-sop-step {
+  .page-wrap {
+    .split-line {
+      border-bottom: 1px dashed #ddd;
+      margin: 30px 0 10px;
+    }
+    .cur-step-view {
+      // padding: 20px 0;
+    }
+  }
+}
+</style>

+ 32 - 0
src/views/sop/sop-manage/student-sop/index.vue

@@ -57,10 +57,21 @@ const columns = [
             hover="color"
             onClick={(e) => {
               e.stopPropagation();
+              toCurSopFlow(row);
             }}
           >
             填报
           </t-link>
+          <t-link
+            theme="primary"
+            hover="color"
+            onClick={(e) => {
+              e.stopPropagation();
+              createSopFlow(row);
+            }}
+          >
+            新增SOP
+          </t-link>
           <t-link
             theme="primary"
             hover="color"
@@ -79,6 +90,16 @@ const columns = [
           >
             上报质量问题
           </t-link>
+          <t-link
+            theme="primary"
+            hover="color"
+            onClick={(e) => {
+              e.stopPropagation();
+              planChange(row);
+            }}
+          >
+            计划变更报备
+          </t-link>
         </div>
       );
     },
@@ -104,6 +125,17 @@ const {
   fetchData,
   onChange,
 } = useFetchTable(getTableData);
+const createSopFlow = (row) => {
+  router.push({ name: 'StuSopStep' });
+};
+const toCurSopFlow = (row) => {
+  router.push({ name: 'StuSopStep' });
+};
+
+const planChange = (row) => {
+  curRow.value = row;
+  showPlanChangeDialog.value = true;
+};
 </script>
 
 <style></style>

+ 458 - 1101
src/views/sop/sop-manage/test.js

@@ -1,272 +1,157 @@
+/**
+ * 【code取值包含以下】:
+ * FORM_GROUP_TITLE  带虚线分割线的标题
+ * TEXT  文本输入框
+ * DATE 日期选择器
+ * SELECT 下拉框,可能需要提供对应的api获取下拉列表
+ * ONLY_TITLE  普通标题,独占一行
+ * CHECKBOX 复选框组
+ * TEXTAREA  多行文本输入域
+ * TABLE 可编辑表格
+ * RADIO 单选框
+ * RADIO_WITH_INPUT  带1个输入框的单选框,比如选“其他”选项时,需要输入一定的文案
+ * SIGN 手写签名
+ * DEVICE_OUT_TABLE 设备出库的表格组件,内部较为复杂,于是单独封装前端业务组件,不细化成table配置数据
+ * UPLOAD_IMAGE  上传图片组件,同时需要limit标记所需上传的数量值
+ */
 export default {
-  id: '414471842594553856', //主键
-  flowDeploymentId: '414471841768275968', //流程部署id,后台用
-  flowName: 'testform1.bpmn', //流程名称
-  setupMap: {
-    f_usertask_jwc_start: {
-      //流程节点key
-      taskName: '新增sop', //流程节点名称
-      taskKey: 'f_usertask_jwc_start', //流程节点key
-      setup: 1, //流程步骤,1为初始,0为结束,-1为终止
-      formKey: 'start_1.form', //表单名称
+  flowId: '416278876461727744',
+  status: 'AUDITING', //流程状态
+  statusStr: '审核中',
+  sopNo: '416278876860186625', //sop单号
+  taskIdList: '[416279837896867847, 416279837905256450]', //待审批流程任务
+  currFlowTaskResult: {
+    taskName: '设备入库登记',
+    taskKey: 'XXX',
+    setup: 10,
+    formKey: 'XXX',
+    formProperty: [
+      {
+        code: 'RADIO',
+        title: '设备出入库',
+        options: [
+          { value: '1', label: '出库' },
+          { value: '2', label: '入库' },
+        ],
+        disabled: true,
+      },
+      {
+        code: 'DATE',
+        title: '设备出入库时间',
+      },
+      {
+        code: 'DEVICE_IN_TABLE',
+        title: '设备入库登记',
+        api: '/api/******', //获取表格整体数据的api
+      },
+    ],
+  },
+  flowTaskHistoryList: [
+    {
+      taskName: '项目初审',
+      taskKey: 'XXX',
+      setup: 1,
+      formKey: 'XXX',
       formProperty: [
-        //表单数据,参考测试sop动态表单
         {
-          id: '1',
-          code: 'TEXT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|crm_child_no',
-          formName: 'f_usertask_jwc_start|crm_child_no',
-          title: '项目子单编号',
-          inputType: 'STRING',
-          required: false,
-          readable: true,
-          writable: false,
-          visable: true,
-          binding: 'crm_child_no',
-          name: '文本',
-        },
-        {
-          id: '2',
-          code: 'SELECT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|custom_type',
-          formName: 'f_usertask_jwc_start|custom_type',
-          title: '客户类型',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          binding: 'custom_type',
-          dataGrid: '/api/admin/widget/custom/list',
-          name: '下拉框',
-        },
-        {
-          id: '3',
-          code: 'POP_SELECT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|crm_manager',
-          formName: 'f_usertask_jwc_start|crm_manager',
-          title: '派单客户经理',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          binding: 'crm_manager',
-          dataGrid: '/api/admin/widget/crm/manager',
-          name: '弹出选择框',
-        },
-        {
-          id: '4',
-          code: 'SELECT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|custom_name',
-          formName: 'f_usertask_jwc_start|custom_name',
-          title: '客户名称',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          binding: 'custom_name',
-          dataGrid: '/api/admin/widget/school/list',
-          name: '下拉框',
-        },
-        {
-          id: '5',
-          code: 'SELECT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|crm_parent_no',
-          formName: 'f_usertask_jwc_start|crm_parent_no',
-          title: '项目母单编号',
-          required: false,
-          readable: false,
-          writable: true,
-          visable: true,
-          binding: 'crm_parent_no',
-          dataGrid: '/api/admin/widget/crm/parent_no/list',
-          name: '下拉框',
-        },
-        {
-          id: '6',
-          code: 'TEXT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|crm_name',
-          formName: 'f_usertask_jwc_start|crm_name',
-          title: '项目名称',
-          inputType: 'STRING',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          name: '文本',
-        },
-        {
-          id: '7',
-          code: 'TEXT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|org_name',
-          formName: 'f_usertask_jwc_start|org_name',
-          title: '学院分(子)机构',
-          inputType: 'STRING',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          name: '文本',
-        },
-        {
-          id: '8',
-          code: 'SELECT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|product',
-          formName: 'f_usertask_jwc_start|product',
-          title: '实施产品',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          binding: 'product',
-          dataGrid: '/api/admin/widget/product/list',
-          name: '下拉框',
-        },
-        {
-          id: '9',
-          code: 'POP_SELECT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|child_manager',
-          formName: 'f_usertask_jwc_start|child_manager',
-          title: '子项目经理',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          binding: 'child_manager',
-          dataGrid: '/api/admin/widget/crm/manager',
-          name: '弹出选择框',
-        },
-        {
-          id: '10',
-          code: 'LABEL',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|crm_info',
-          formName: 'f_usertask_jwc_start|crm_info',
-          title: '派单信息',
-          inputType: 'STRING',
-          required: false,
-          readable: true,
-          writable: false,
-          visable: true,
-          name: '标签',
-        },
-        {
-          id: '11',
+          code: 'FORM_GROUP_TITLE',
+          title: '项目基本信息',
+        },
+        {
           code: 'TEXT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|exam_start_time',
-          formName: 'f_usertask_jwc_start|exam_start_time',
-          title: '考试开始时间',
-          inputType: 'STRING',
-          required: false,
-          readable: true,
-          writable: false,
-          visable: true,
-          binding: 'exam_start_time',
-          name: '文本',
-        },
-        {
-          id: '12',
+          title: '科目数量',
+        },
+        {
           code: 'TEXT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|exam_end_time',
-          formName: 'f_usertask_jwc_start|exam_end_time',
-          title: '考试结束时间',
-          inputType: 'STRING',
-          required: false,
-          readable: true,
-          writable: false,
-          visable: true,
-          binding: 'exam_end_time',
-          name: '文本',
-        },
-        {
-          id: '13',
+          title: '考试科次',
+        },
+        {
+          code: 'DATE',
+          title: '考生数据内部交接时间',
+        },
+        {
+          code: 'DATE',
+          title: '考试时间安排表获取时间',
+        },
+        {
           code: 'TEXT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|remark',
-          formName: 'f_usertask_jwc_start|remark',
-          title: '特殊要求及备注',
-          inputType: 'STRING',
-          required: false,
-          readable: true,
-          writable: false,
-          visable: true,
-          binding: 'remark',
-          name: '文本',
-        },
-        {
-          id: '14',
+          title: '扫描仪数量(台)',
+        },
+        {
           code: 'TEXT',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_start|project_type',
-          formName: 'f_usertask_jwc_start|project_type',
-          title: '项目类型',
-          inputType: 'STRING',
-          required: false,
-          readable: true,
-          writable: false,
-          visable: true,
-          binding: 'project_type',
-          name: '文本',
+          title: '现场标准服务周期(人天)',
         },
-      ],
-    },
-    f_usertask_jwc_project: {
-      taskName: '教务处sop_项目关键信息',
-      taskKey: 'f_usertask_jwc_project',
-      setup: 2,
-      formKey: 'project_2.form',
-      formProperty: [
         {
-          id: '15',
-          code: 'FILE',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_project|screen',
-          formName: 'f_usertask_jwc_project|screen',
-          title: '客户沟通或邮件截图',
-          inputType: 'STRING',
-          required: false,
-          readable: true,
-          writable: false,
-          visable: true,
-          name: '标签',
-          subTitle: [
-            {
-              content:
-                '提示:考虑到存在因客户原因信息收集不全,或客户无法确认的情况,因此客户确认截图不强制要求上传。但为了发生质量问题后,公司内部准确定责,保护项目经理的合理权益,请项目经理尽可能上传。',
-              color: 'green',
-            },
+          code: 'DATE',
+          title: '项目关键信息提交截止时间',
+        },
+        {
+          code: 'DATE',
+          title: '现场服务完成撤场计划时间',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '项目人员安排及风险评估',
+        },
+        {
+          code: 'SELECT',
+          title: '区域协调人',
+          api: '/api/******',
+          span: 4,
+        },
+        {
+          code: 'SELECT',
+          title: '实施工程师',
+          api: '/api/******',
+          span: 4,
+        },
+        {
+          code: 'SELECT',
+          title: '助理实施工程师',
+          api: '/api/******',
+          span: 4,
+        },
+        {
+          code: 'ONLY_TITLE',
+          title: '项目风险评估(仅供参考)',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '延期风险',
+          options: [
+            { value: '1', label: '低' },
+            { value: '2', label: '中' },
+            { value: '3', label: '高' },
+          ],
+        },
+        {
+          code: 'CHECKBOX',
+          title: '实施难度',
+          options: [
+            { value: '1', label: '低' },
+            { value: '2', label: '中' },
+            { value: '3', label: '高' },
           ],
         },
         {
-          id: '18',
+          code: 'TEXTAREA',
+          title: '其它备注(建议关注的其它方面)',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '项目联系人',
+        },
+        {
           code: 'TABLE',
-          type: 'FORM',
-          formId: 'f_usertask_jwc_project|exam_time_table',
-          formName: 'f_usertask_jwc_project|exam_time_table',
-          title: '考试时间安排表格',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          name: '表格',
+          title: '',
           tablePropList: [
             {
-              id: '1',
-              widgetId: '18',
+              id: 'XXX',
+              widgetId: 'XXX',
               tdIndex: 1,
-              tdId: 'f_usertask_jwc_project|18|course_count',
-              tdName: 'f_usertask_jwc_project|18|course_count',
-              title: '科目数量',
+              tdId: 'XXX',
+              tdName: 'XXX',
+              title: '学院/分(子)机构',
               tdOrder: true,
               tdSearch: true,
               editWidgetId: '19',
@@ -276,1041 +161,513 @@ export default {
               },
             },
             {
-              id: '2',
-              widgetId: '18',
+              id: 'XXX',
+              widgetId: 'XXX',
               tdIndex: 2,
-              tdId: 'f_usertask_jwc_project|18|course_num',
-              tdName: 'f_usertask_jwc_project|18|course_num',
-              title: '科次',
+              tdId: 'XXX',
+              tdName: 'XXX',
+              title: '姓名',
               tdOrder: true,
               tdSearch: true,
-              editWidgetId: '19',
+              editWidgetId: 'XXX',
               tdFormWidget: {
                 code: 'TEXT',
                 name: '文本',
               },
             },
             {
-              id: '3',
-              widgetId: '18',
+              id: 'XXX',
+              widgetId: 'XXX',
               tdIndex: 3,
-              tdId: 'f_usertask_jwc_project|18|exam_start_time',
-              tdName: 'f_usertask_jwc_project|18|exam_start_time',
-              title: '考试开始时间',
+              tdId: 'XXX',
+              tdName: 'XXX',
+              title: '职务',
               tdOrder: true,
               tdSearch: true,
-              editWidgetId: '20',
+              editWidgetId: 'XXX',
               tdFormWidget: {
-                code: 'DATE',
-                name: '日期',
-                format: 'yyyy-MM-dd HH:mm:ss',
+                code: 'TEXT',
+                name: '文本',
               },
             },
             {
-              id: '4',
-              widgetId: '18',
+              id: 'XXX',
+              widgetId: 'XXX',
               tdIndex: 4,
-              tdId: 'f_usertask_jwc_project|18|exam_end_time',
-              tdName: 'f_usertask_jwc_project|18|exam_end_time',
-              title: '考试结束时间',
+              tdId: 'XXX',
+              tdName: 'XXX',
+              title: '手机',
               tdOrder: true,
               tdSearch: true,
-              editWidgetId: '20',
+              editWidgetId: 'XXX',
               tdFormWidget: {
-                code: 'DATE',
-                name: '日期',
-                format: 'yyyy-MM-dd HH:mm:ss',
+                code: 'TEXT',
+                name: '文本',
               },
             },
           ],
         },
+      ],
+    },
+    {
+      taskName: '项目关键信息',
+      taskKey: 'XXX',
+      setup: 2,
+      formKey: 'XXX',
+      formProperty: [
         {
-          id: 'XXX',
-          code: 'PROJECT_HEADER',
-          title: '云阅卷',
+          code: 'FORM_GROUP_TITLE',
+          title: '云阅卷(填写前请先认真查阅移交的项目初审及项目基本信息)',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'TEXT',
-          span: 12,
-          title: '扫描仪数量',
-          required: true,
+          code: 'RADIO',
+          title: '部署方式',
+          options: [
+            { value: '1', label: '线上部署' },
+            { value: '2', label: '本地部署' },
+          ],
+        },
+        {
+          code: 'RADIO',
+          title: '阅卷方式',
+          options: [
+            { value: '1', label: '集中阅卷' },
+            { value: '2', label: '分散阅卷' },
+          ],
+        },
+        {
+          code: 'RADIO',
+          title: '扫描场地网络情况',
+          options: [
+            { value: '1', label: '提供外网' },
+            { value: '2', label: '不提供外网' },
+          ],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'DATE',
           title: '扫描开始时间',
-          required: true,
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'DATE',
           title: '扫描结束时间',
-          required: true,
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'CASCADE_ADDRESS',
-          title: '扫描地址',
-          required: true,
-          dataGrid: '',
+          code: 'DATE',
+          title: '评卷开始时间',
+        },
+        {
+          code: 'DATE',
+          title: '评卷开始时间',
+        },
+        {
+          code: 'TEXTAREA',
+          title: '其他特殊要求',
+        },
+        {
+          code: 'UPLOAD_IMAGE',
+          title: '上传项目关键信息表(纸质)拍照',
+          limit: 5,
+        },
+      ],
+    },
+    {
+      taskName: '项目内审',
+      taskKey: 'XXX',
+      setup: 3,
+      formKey: 'XXX',
+      formProperty: [
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '项目基本信息',
+        },
+        {
+          code: 'TEXT',
+          title: '科目数量',
+        },
+        {
+          code: 'TEXT',
+          title: '考试科次',
+        },
+        {
+          code: 'DATE',
+          title: '考生数据内部交接时间',
+        },
+        {
+          code: 'DATE',
+          title: '考试时间安排表获取时间',
+        },
+        {
+          code: 'TEXT',
+          title: '扫描仪数量(台)',
+        },
+        {
+          code: 'TEXT',
+          title: '现场标准服务周期(人天)',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'DATE',
-          title: '阅卷开始时间',
-          required: true,
+          title: '项目关键信息提交截止时间',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'DATE',
-          title: '阅卷结束时间',
-          required: true,
+          title: '现场服务完成撤场计划时间',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '云阅卷(填写前请先认真查阅移交的项目初审及项目基本信息)',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'RADIO',
-          title: '阅卷方式',
-          required: true,
-          subTitle: [{ content: '提示:一般教务处分题阅', color: 'gray' }],
+          title: '部署方式',
           options: [
-            { value: '1', label: '整卷阅' },
-            { value: '2', label: '分题阅' },
+            { value: '1', label: '线上部署' },
+            { value: '2', label: '本地部署' },
           ],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'RADIO',
-          title: '是否启用轨迹阅卷',
-          required: true,
-          subTitle: [
-            { content: '提示:一般教务处需要启用该项', color: 'gray' },
-          ],
+          title: '阅卷方式',
           options: [
-            { value: '1', label: '启用' },
-            { value: '2', label: '不器用' },
+            { value: '1', label: '集中阅卷' },
+            { value: '2', label: '分散阅卷' },
           ],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'RADIO',
-          title: '评卷组织形式',
-          required: true,
-          subTitle: [
-            { content: '提示:评卷组织形式根据学校要求选择', color: 'gray' },
-            {
-              content:
-                '1.集中阅:老师集中在既定地点评阅,对现场网络环境的稳定性、外接带宽多少有依赖性,需要提前确认网络情况(详见“网络情况调研”)',
-              color: 'red',
-            },
-            {
-              content: '2.分散阅:老师可分散评阅,只要可上外网即可',
-              color: 'gray',
-            },
-          ],
+          title: '扫描场地网络情况',
           options: [
-            { value: '1', label: '集中阅' },
-            { value: '2', label: '分散阅' },
+            { value: '1', label: '提供外网' },
+            { value: '2', label: '不提供外网' },
           ],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'CHECKBOX',
-          title: '集中阅-网络情况调研',
-          subTitle: [
-            {
-              content:
-                '提示:请根据检查项要求与客户进行核对确认后如实填写,检查项符合则勾选,不符合则不勾选,如果网络情况不满足集中阅的形式,则可参考如下建议:',
-              color: 'gray',
-            },
-            {
-              content: '1.与学校沟通,协助整改网络状况;',
-              color: 'gray',
-            },
-            {
-              content: '2.更换评卷组织形式。',
-              color: 'gray',
-            },
-            {
-              content:
-                '注意:若需要整改网络,整改情况无法立即落实,则检查项确认情况先如实填写,待整改完毕后,可对该信息进行变更操作。',
-              color: 'red',
-            },
-          ],
-          options: [
-            { value: '1', label: '能连接外网' },
-            { value: '2', label: '符合标准运行环境' },
-            { value: '3', label: '局域网络稳定' },
-          ],
+          code: 'DATE',
+          title: '扫描开始时间',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'DATE',
-          title: '合分时间',
-          required: true,
+          title: '扫描结束时间',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'RADIO',
-          title: '是否需要教研分析',
-          required: true,
-          options: [
-            { value: '1', label: '是' },
-            { value: '2', label: '否' },
-          ],
+          code: 'DATE',
+          title: '评卷开始时间',
+        },
+        {
+          code: 'DATE',
+          title: '评卷开始时间',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'TEXTAREA',
-          title: '阅卷特殊需求备注',
-          required: true,
-          subTitle: [
-            { content: '提示:若没有特殊需求,则填写"无"', color: 'gray' },
-          ],
+          title: '其他特殊要求',
         },
-      ],
-    },
-    f_usertask_jwc_inside_approve: {
-      taskName: '教务处sop_内审',
-      taskKey: 'f_usertask_jwc_inside_approve',
-      setup: 3,
-      formKey: 'inside_approve_3.form',
-      formProperty: [
         {
-          id: 'XXX',
-          code: '', //code为空的话,则表示主控件没有,但是其他的:比如标题或者描述文字可能会有
-          binding: 'XXX',
-          title: '风险提示确认',
-          subTitle: [
-            { content: '请项目经理重点关注扫描风险点。例如:', color: 'gray' },
-            { content: '①答题卡印刷不规范;', color: 'gray' },
-            {
-              content: '②客观题填涂区域边界不清晰、线条不连贯;',
-              color: 'gray',
-            },
-            {
-              content:
-                '上述风险处置建议:请采用200DPI进行扫描,能很大程度改善客观题识别情况。',
-              color: 'blue',
-            },
-            {
-              content:
-                '注意:以上风险仅作项目经理预判风险的参考提示,并未穷尽全部风险点。若项目经理一旦发现其它风险点,例如非常规操作、印刷错误导致的连带风险点等,必须及时上报给实施部门负责人决策再处置。',
-              color: 'red',
-            },
-          ],
+          code: 'FORM_GROUP_TITLE',
+          title: '项目内审(请于24小时内完成内审)',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'RADIO',
-          title: '我已阅读风险提示内容,对风险点预判如下',
-          subTitle: [
-            {
-              content: '若预判有风险,则请简单填写预判的具体风险点',
-              color: 'blue',
-            },
-          ],
-          required: true,
+          title: '我对以上项目关键信息已审核,确认内容无误',
           options: [
-            { value: '1', label: '无风险' },
-            { value: '2', label: '其他' },
+            { value: '1', label: '同意' },
+            { value: '2', label: '不同意' },
           ],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'SIGN',
           title: '手写签名',
-          required: true,
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'TEXTAREA',
           title: '审批意见',
-          required: true,
-        },
-        // {
-        //   id: '21',
-        //   code: 'LABEL',
-        //   type: 'FORM',
-        //   formId: 'f_usertask_jwc_inside_approve|risk_title',
-        //   formName: 'f_usertask_jwc_inside_approve|risk_title',
-        //   title: '风险提示确认',
-        //   inputType: 'STRING',
-        //   required: false,
-        //   readable: true,
-        //   writable: false,
-        //   visable: true,
-        //   value:
-        //     '请项目经理重点关注扫描风险点。例如:\n①答题卡印刷不规范;\n②客观题填涂区域边界不清晰、线条不连贯;\n上述风险处置建议:请采用200DP进行扫描,能很大程度改善容观题识别情况。\n注意:以上风险仅作项目经理预判风险的参考提示,并未安尽全部风险点。若项目经理一旦发现其亡风险点,例如非常规操作、印刷错误\n导致的连带风险点等,必须及时上报给实施部门负责人决策再处置。',
-        //   name: '标签',
-        // },
-        // {
-        //   id: '22',
-        //   code: 'LABEL',
-        //   type: 'FORM',
-        //   formId: 'f_usertask_jwc_inside_approve|risk_knowe_title',
-        //   formName: 'f_usertask_jwc_inside_approve|risk_knowe_title',
-        //   title: '我已阅读风险提示内容,对风险点预判如下:',
-        //   inputType: 'STRING',
-        //   required: true,
-        //   readable: true,
-        //   writable: false,
-        //   visable: true,
-        //   value: '若预判有风险,则请简要填写预判的具体风险点',
-        //   name: '标签',
-        // },
-        // {
-        //   id: '23',
-        //   code: 'RADIO',
-        //   type: 'FORM',
-        //   formId: 'f_usertask_jwc_inside_approve|risk_no',
-        //   formName: 'f_usertask_jwc_inside_approve|risk_no',
-        //   title: '无风险',
-        //   inputType: 'STRING',
-        //   required: true,
-        //   readable: false,
-        //   writable: true,
-        //   visable: true,
-        //   name: '单选框',
-        // },
-        // {
-        //   id: '24',
-        //   code: 'RADIO',
-        //   type: 'FORM',
-        //   formId: 'f_usertask_jwc_inside_approve|risk_other',
-        //   formName: 'f_usertask_jwc_inside_approve|risk_other',
-        //   title: '其他',
-        //   inputType: 'STRING',
-        //   required: true,
-        //   readable: false,
-        //   writable: true,
-        //   visable: true,
-        //   name: '单选框',
-        // },
-        // {
-        //   id: '25',
-        //   parentId: '24',
-        //   code: 'TEXTAREA',
-        //   type: 'FORM',
-        //   formId: 'f_usertask_jwc_inside_approve|risk_other_textarea',
-        //   formName: 'f_usertask_jwc_inside_approve|risk_other_textarea',
-        //   title: '其他风险文本域',
-        //   inputType: 'STRING',
-        //   required: false,
-        //   readable: false,
-        //   writable: true,
-        //   visable: false,
-        //   name: '文本域',
-        // },
-        // {
-        //   id: '26',
-        //   code: 'LABEL',
-        //   type: 'FORM',
-        //   formId: 'f_usertask_jwc_inside_approve|sign_label',
-        //   formName: 'f_usertask_jwc_inside_approve|sign_label',
-        //   title: '手写签名',
-        //   inputType: 'STRING',
-        //   required: true,
-        //   readable: true,
-        //   writable: false,
-        //   visable: true,
-        //   name: '标签',
-        // },
-        // {
-        //   id: '27',
-        //   code: 'SIGN',
-        //   type: 'FORM',
-        //   formId: 'f_usertask_jwc_inside_approve|sign',
-        //   formName: 'f_usertask_jwc_inside_approve|sign',
-        //   title: '添加签名',
-        //   inputType: 'STRING',
-        //   required: true,
-        //   readable: false,
-        //   writable: true,
-        //   visable: true,
-        //   name: '签名',
-        // },
-        // {
-        //   id: '28',
-        //   code: 'TEXTAREA',
-        //   type: 'FORM',
-        //   formId: 'f_usertask_jwc_inside_approve|approve_suggestion',
-        //   formName: 'f_usertask_jwc_inside_approve|approve_suggestion',
-        //   title: '审批意见',
-        //   inputType: 'STRING',
-        //   required: false,
-        //   readable: false,
-        //   writable: true,
-        //   visable: true,
-        //   name: '文本域',
-        // },
+        },
       ],
     },
-    // f_usertask_jwc_end: {
-    //   taskName: '结束',
-    //   taskKey: 'f_usertask_jwc_end',
-    //   setup: 0,
-    //   formKey: null,
-    //   formProperty: null,
-    // },
-    扫描仪出库登记: {
-      taskName: '扫描仪出库登记',
-      taskKey: '扫描仪出库登记',
+    {
+      taskName: '设备出库登记',
+      taskKey: 'XXX',
+      setup: 4,
+      formKey: 'XXX',
       formProperty: [
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'RADIO',
-          title: '扫描仪出入库选择',
-          required: true,
+          title: '设备出入库',
           options: [
             { value: '1', label: '出库' },
             { value: '2', label: '入库' },
           ],
+          disabled: true,
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'DATE',
           title: '设备出入库时间',
-          required: true,
+          api: '/api/******', //获取设备列表的api
         },
         {
-          id: 'XXX',
-          code: 'TABLE',
-          type: 'FORM',
-          formId: 'XXX',
-          formName: 'XXX',
-          title: '扫描仪设备出库登记',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          name: '表格',
-          tablePropList: [
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 1,
-              tdId: 'aaa',
-              tdName: 'aaa',
-              title: '设备编号',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 2,
-              tdId: 'bbb',
-              tdName: 'bbb',
-              title: '运行状态',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 3,
-              tdId: 'ccc',
-              tdName: 'ccc',
-              title: '总扫描量',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 1,
-              tdId: 'ddd',
-              tdName: 'ddd',
-              title: '当前所在地',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-          ],
+          code: 'DEVICE_OUT_TABLE',
+          title: '设备出库登记',
         },
       ],
     },
-    扫描校验及收尾: {
-      taskName: '扫描校验及收尾',
-      taskKey: '扫描校验及收尾',
+    {
+      taskName: '扫描准备',
+      taskKey: 'XXX',
+      setup: 5,
+      formKey: 'XXX',
       formProperty: [
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'TEXT',
-          title: '扫描-是否进行缺考人工核对-核对缺考答题卡',
-          required: true,
-          subTitle: [{ content: '100%全检,填写核对筛查结果', color: 'red' }],
+          code: 'FORM_GROUP_TITLE',
+          title: '导入数据',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'TEXT',
-          title: '扫描-是否进行查漏-a.核对签到表',
-          required: true,
-          subTitle: [{ content: '100%全检,填写核对筛查结果', color: 'red' }],
+          code: 'CHECKBOX',
+          title: '',
+          options: [{ value: '1', label: '导入数据与原始数据是否一致' }],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'TEXT',
-          title: '扫描-是否进行查漏-b.核对缺考名单',
-          required: true,
-          subTitle: [{ content: '100%全检,填写核对筛查结果', color: 'red' }],
+          title: '导入考生数量',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'TEXT',
-          title: '扫描-是否进行查漏-c.提供签到无试卷信息(客户沟通截图)',
-          required: true,
-          subTitle: [
+          code: 'FORM_GROUP_TITLE',
+          title: '扫描仪设置',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '扫描仪设置',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          span: 12,
+          options: [
             {
-              content: '100%全检,填写核对结果,提交签到无试卷信息表给客户确认',
-              color: 'red',
+              value: '1',
+              label:
+                '1、扫描仪分辨率设置是否150、扫描模式是否双面、图像类型是否灰度',
             },
+            { value: '2', label: '2、选择“扫描模式”-“设置”-“装订边缘”-“上”' },
           ],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'FILE',
-          title: '扫描-是否进行查漏-c.提供签到无试卷信息(客户沟通截图)',
-          required: true,
-          subTitle: [{ content: '请上传客户沟通截图', color: 'gray' }],
+          code: 'FORM_GROUP_TITLE',
+          title: '卡格式制作',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'FILE',
-          title: '扫描-是否对手工修改准考证号的答题卡核对-核对信息是否有误',
-          required: true,
-          subTitle: [{ content: '100%全检,上传查询后的截图', color: 'red' }],
+          code: 'CHECKBOX',
+          title: '',
+          span: 12,
+          options: [
+            {
+              value: '1',
+              label: '1、定位点、校验点是否制作',
+            },
+            { value: '2', label: '2、缺考区域是否框选' },
+            {
+              value: '3',
+              label: '3、客观题区域是否正确框选、行列以及单选多选是否正确',
+            },
+            { value: '4', label: '4、条码识别区是否制作' },
+            { value: '5', label: '5、屏蔽区是否制作' },
+            { value: '6', label: '6、卷型:若有,则框选' },
+            { value: '7', label: '7、页码:若答题卡超过1张,则框选' },
+          ],
         },
+      ],
+    },
+    {
+      taskName: '正式扫描',
+      taskKey: 'XXX',
+      setup: 6,
+      formKey: 'XXX',
+      formProperty: [
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'SELECT',
-          title: '是否完成识别对照',
-          required: true,
-          dataGrid: '',
+          code: 'FORM_GROUP_TITLE',
+          title: '试扫检查',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'FILE',
-          title: '扫描-是否对手工修改准考证号的答题卡核对-核对客观题识别情况',
-          required: true,
-          subTitle: [{ content: '100%全检,上传查询后的截图', color: 'red' }],
+          code: 'CHECKBOX',
+          title: '',
+          span: 12,
+          options: [
+            {
+              value: '1',
+              label: '1、查看条码是否识别正确',
+            },
+            { value: '2', label: '2、缺考、客观题是否识别正确' },
+            { value: '3', label: '3、扫描原图正反面是否正确显示' },
+            { value: '4', label: '4、裁切图屏蔽区是否正确' },
+            { value: '5', label: '5、卷型:若有,是否识别正确' },
+            { value: '6', label: '6、页码:若答题卡超过1张,是否页码识别正确' },
+          ],
         },
       ],
     },
-    阅卷参数核对: {
-      taskName: '阅卷参数核对',
-      taskKey: '阅卷参数核对',
+    {
+      taskName: '校验收尾',
+      taskKey: 'XXX',
+      setup: 7,
+      formKey: 'XXX',
       formProperty: [
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'RADIO',
-          title: '特殊评卷规则',
-          required: true,
+          code: 'FORM_GROUP_TITLE',
+          title: '未上传考生核对',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
           options: [
-            { value: '1', label: '无' },
-            { value: '2', label: '多选题漏选不得分' },
-            { value: '3', label: '多选题漏选得分' },
-            { value: '4', label: '其他' },
+            {
+              value: '1',
+              label:
+                '1、未上传考生是否与签到表进行核对,是否为缺考、违纪、免考等情况',
+            },
+            { value: '2', label: '2、是否将未上传考生发给学校确认' },
           ],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
           code: 'TEXT',
-          title: '阅卷参数核对-1.录入科目数量',
-          required: true,
+          title: '完成数量',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'SELECT',
-          title: '客观题是否核对',
-          required: true,
-          dataGrid: '',
+          code: 'UPLOAD_IMAGE',
+          title: '上传学校未上传考生沟通确认截图',
+          limit: 1,
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'SELECT',
-          title: '客观题满分是否核对',
-          required: true,
-          dataGrid: '',
+          code: 'FORM_GROUP_TITLE',
+          title: '识别对照',
         },
-      ],
-    },
-    评卷校验及收尾: {
-      taskName: '评卷校验及收尾',
-      taskKey: '评卷校验及收尾',
-      formProperty: [
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'TEXT',
-          title: '阅卷参数核对-1.录入科目数量',
-          required: true,
-          readable: true,
-          writable: false,
+          code: 'CHECKBOX',
+          title: '',
+          options: [
+            { value: '1', label: '是否将客观题识别异常的全部人工修改处理' },
+          ],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'SELECT',
-          title: '客观题是否核对',
-          required: true,
-          dataGrid: '',
-          readable: true,
-          writable: false,
+          code: 'FORM_GROUP_TITLE',
+          title: '缺考名单对比',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'SELECT',
-          title: '客观题满分是否核对',
-          required: true,
-          dataGrid: '',
-          readable: true,
-          writable: false,
+          code: 'CHECKBOX',
+          title: '',
+          options: [
+            {
+              value: '1',
+              label:
+                '核对未上传条数是否与学校提供的缺考名单吻合,人工指定为缺考(考生管理>导入名单>导入缺考名单)',
+            },
+          ],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'FILE',
-          title: '评卷-主客观参数核对-是否主客观满分100',
-          required: true,
-          subTitle: [{ content: '100%全检,上传查询后的截图', color: 'red' }],
+          code: 'TEXT',
+          title: '缺考科次数量',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'FILE',
-          title: '评卷-评卷收尾-是否所有科目进度100%',
-          required: true,
-          subTitle: [{ content: '100%全检,上传查询后的截图', color: 'red' }],
+          code: 'FORM_GROUP_TITLE',
+          title: '手工输入条码确认',
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'FILE',
-          title: '评卷-分数核对-统计客观题得分为0',
-          required: true,
-          subTitle: [{ content: '100%全检,上传查询后的截图', color: 'red' }],
+          code: 'CHECKBOX',
+          title: '',
+          options: [
+            {
+              value: '1',
+              label: '“数据检查" -"人工确认“,确认完成',
+            },
+          ],
         },
       ],
     },
-    扫描仪入库登记: {
-      taskName: '扫描仪入库登记',
-      taskKey: '扫描仪入库登记',
+    {
+      taskName: '评卷准备',
+      taskKey: 'XXX',
+      setup: 8,
+      formKey: 'XXX',
       formProperty: [
         {
-          id: 'XXX',
-          binding: 'XXX',
+          code: 'FORM_GROUP_TITLE',
+          title: '评卷模式确认',
+        },
+        {
           code: 'RADIO',
-          title: '扫描仪出入库选择',
-          required: true,
+          label: '评卷模式',
           options: [
-            { value: '1', label: '出库' },
-            { value: '2', label: '入库' },
+            { value: '1', label: '轨迹模式' },
+            { value: '2', label: '普通模式' },
           ],
         },
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'DATE',
-          title: '设备出入库时间',
-          required: true,
+          code: 'FORM_GROUP_TITLE',
+          title: '评卷参数核对',
         },
         {
-          id: 'XXX',
-          code: 'TABLE',
-          type: 'FORM',
-          formId: 'XXX',
-          formName: 'XXX',
-          title: '扫描仪设备出库登记',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          name: '表格',
-          tablePropList: [
+          code: 'CHECKBOX',
+          title: '',
+          span: 12,
+          options: [
             {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 1,
-              tdId: 'aaa',
-              tdName: 'aaa',
-              title: '设备编号',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
+              value: '1',
+              label: '1、核查每个科目的满分是否正确(大部分科目都是100分)',
             },
             {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 2,
-              tdId: 'bbb',
-              tdName: 'bbb',
-              title: '运行状态',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
+              value: '2',
+              label:
+                '2、核对客观题标答以及分数是否录入正确、多选题判分规则(漏选是否得分、任选得分)',
             },
             {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 3,
-              tdId: 'ccc',
-              tdName: 'ccc',
-              title: '总扫描量',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 1,
-              tdId: 'ddd',
-              tdName: 'ddd',
-              title: '当前所在地',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
+              value: '3',
+              label:
+                '3、检查所有科目结构和分组是否全部导入。(评卷管理>评卷进度查看分组状态)',
             },
           ],
         },
       ],
     },
-    项目总结报告: {
-      taskName: '项目总结报告',
-      taskKey: '项目总结报告',
+    {
+      taskName: '评卷收尾',
+      taskKey: 'XXX',
+      setup: 9,
+      formKey: 'XXX',
       formProperty: [
         {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'TEXT',
-          title: '云阅卷-科目数量(单位:门)',
-          required: true,
-        },
-        {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'TEXT',
-          title: '云阅卷-日扫量(单位:张/日)',
-          required: true,
-        },
-        {
-          id: 'XXX',
-          binding: 'XXX',
-          code: 'TEXT',
-          title: '云阅卷-扫描总量(单位:张)',
-          required: true,
-        },
-        {
-          id: 'XXX',
-          code: 'TABLE',
-          type: 'FORM',
-          formId: 'XXX',
-          formName: 'XXX',
-          title: '扫描明细',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          name: '表格',
-          tablePropList: [
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 1,
-              tdId: 'aaa',
-              tdName: 'aaa',
-              title: '答题卡类型(及规格)',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 2,
-              tdId: 'bbb',
-              tdName: 'bbb',
-              title: '答题卡数量 (单位:份)',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 3,
-              tdId: 'ccc',
-              tdName: 'ccc',
-              title: '签到表规格',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 1,
-              tdId: 'ddd',
-              tdName: 'ddd',
-              title: '签到表数量 (单位:份)',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 1,
-              tdId: 'eee',
-              tdName: 'eee',
-              title: '小计 (单位:份)',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-          ],
+          code: 'FORM_GROUP_TITLE',
+          title: '成绩提交核查',
         },
         {
-          id: 'XXX',
-          code: 'TABLE',
-          type: 'FORM',
-          formId: 'XXX',
-          formName: 'XXX',
-          title: '项目异常情况汇总',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          name: '表格',
-          tablePropList: [
+          code: 'CHECKBOX',
+          title: '',
+          span: 12,
+          options: [
             {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 1,
-              tdId: 'aaa',
-              tdName: 'aaa',
-              title: '明细',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
+              value: '1',
+              label: '1、是否已核对不缺考、客观题为0分的情况。',
             },
             {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 2,
-              tdId: 'bbb',
-              tdName: 'bbb',
-              title: '备注',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
+              value: '2',
+              label: '2、是否已核对主观题为0、客观题有分的情况。',
             },
-          ],
-        },
-        {
-          id: 'XXX',
-          code: 'TABLE',
-          type: 'FORM',
-          formId: 'XXX',
-          formName: 'XXX',
-          title: '程序bug或者错误',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          name: '表格',
-          tablePropList: [
             {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 1,
-              tdId: 'aaa',
-              tdName: 'aaa',
-              title: '明细',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
+              value: '3',
+              label: '3、是否检查客观题小题得分率低于20%的情况。',
             },
             {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 2,
-              tdId: 'bbb',
-              tdName: 'bbb',
-              title: '备注',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
+              value: '4',
+              label:
+                '4、核对导出成绩表数据条数是否与考生表数量一致,不能带有“未导出全量数据”字样;请填写导出成绩数量以及完成时间',
             },
-          ],
-        },
-        {
-          id: 'XXX',
-          code: 'TABLE',
-          type: 'FORM',
-          formId: 'XXX',
-          formName: 'XXX',
-          title: '客户意见及建议',
-          required: true,
-          readable: false,
-          writable: true,
-          visable: true,
-          name: '表格',
-          tablePropList: [
             {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 1,
-              tdId: 'aaa',
-              tdName: 'aaa',
-              title: '明细',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
-            },
-            {
-              id: 'XXX',
-              widgetId: 'XXX',
-              tdIndex: 2,
-              tdId: 'bbb',
-              tdName: 'bbb',
-              title: '备注',
-              tdOrder: true,
-              tdSearch: true,
-              editWidgetId: 'XXX',
-              tdFormWidget: {
-                code: 'TEXT',
-                name: '文本',
-              },
+              value: '5',
+              label: '5、核对导出图片工具是否正常运行',
             },
           ],
         },
         {
-          id: 'XXX',
-          code: 'FILE',
-          binding: 'XXX',
-          title: '现场照片',
-          required: false,
-          span: 12,
-        },
-        {
-          id: 'XXX',
-          code: 'TEXTAREA',
-          title: '照片备注',
-          binding: 'xxx',
-          required: false,
-          span: 12,
+          code: 'UPLOAD_IMAGE',
+          title: '上传验收报告(纸质)拍照',
+          limit: 5,
         },
       ],
     },
-  },
-  version: 1,
+  ],
 };

+ 733 - 0
src/views/sop/sop-manage/test2.js

@@ -0,0 +1,733 @@
+/**
+ * 【code取值包含以下】:
+ * FORM_GROUP_TITLE  带虚线分割线的标题
+ * TEXT  文本输入框
+ * DATE 日期选择器
+ * SELECT 下拉框,可能需要提供对应的api获取下拉列表
+ * ONLY_TITLE  普通标题,独占一行
+ * CHECKBOX 复选框组
+ * TEXTAREA  多行文本输入域
+ * TABLE 可编辑表格
+ * RADIO 单选框
+ * RADIO_WITH_INPUT  带1个输入框的单选框,比如选“其他”选项时,需要输入一定的文案
+ * SIGN 手写签名
+ * DEVICE_OUT_TABLE 设备出库的表格组件,内部较为复杂,于是单独封装前端业务组件,不细化成table配置数据
+ * UPLOAD_IMAGE  上传图片组件,同时需要limit标记所需上传的数量值
+ */
+export default {
+  flowId: '416278876461727744',
+  status: 'AUDITING', //流程状态
+  statusStr: '审核中',
+  sopNo: '416278876860186625', //sop单号
+  taskIdList: '[416279837896867847, 416279837905256450]', //待审批流程任务
+  currFlowTaskResult: {
+    taskName: '设备入库登记',
+    taskKey: 'XXX',
+    setup: 10,
+    formKey: 'XXX',
+    formProperty: [
+      {
+        code: 'RADIO',
+        title: '设备出入库',
+        options: [
+          { value: '1', label: '出库' },
+          { value: '2', label: '入库' },
+        ],
+        disabled: true,
+      },
+      {
+        code: 'DATE',
+        title: '设备出入库时间',
+      },
+      {
+        code: 'DEVICE_IN_TABLE',
+        title: '设备入库登记',
+        api: '/api/******', //获取表格整体数据的api
+      },
+    ],
+  },
+  flowTaskHistoryList: [
+    {
+      taskName: '项目初审',
+      taskKey: 'XXX',
+      setup: 1,
+      formKey: 'XXX',
+      formProperty: [
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '项目基本信息',
+        },
+        {
+          code: 'TEXT',
+          title: '科目数量',
+        },
+        {
+          code: 'TEXT',
+          title: '考生科次',
+        },
+        {
+          code: 'RADIO',
+          title: '条码标准张数',
+          options: [
+            { value: '1', label: '3张' },
+            { value: '2', label: '4张' },
+          ],
+        },
+        {
+          code: 'RADIO_WITH_INPUT',
+          title: '条码粘贴方式',
+          span: 12,
+          options: [
+            { value: '1', label: '考生自贴/数码印刷' },
+            { value: '2', label: '回卷后粘贴' },
+            { value: '3', label: '其他' },
+          ],
+        },
+        {
+          code: 'RADIO',
+          title: '有无客观题卡',
+          options: [
+            { value: '1', label: '有' },
+            { value: '2', label: '无' },
+          ],
+        },
+        {
+          code: 'TEXT',
+          title: '扫描仪数量(台)',
+        },
+        {
+          code: 'DATE',
+          title: '考生数据交接时间',
+        },
+        {
+          code: 'TEXT',
+          title: '现场标准服务周期(人天)',
+        },
+        {
+          code: 'DATE',
+          title: '项目关键信息提交截止时间',
+        },
+        {
+          code: 'DATE',
+          title: '现场服务完成撤场计划时间',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '项目人员安排及风险评估',
+        },
+        {
+          code: 'SELECT',
+          title: '区域协调人',
+          api: '/api/******',
+          span: 4,
+        },
+        {
+          code: 'SELECT',
+          title: '实施工程师',
+          api: '/api/******',
+          span: 4,
+        },
+        {
+          code: 'SELECT',
+          title: '助理实施工程师',
+          api: '/api/******',
+          span: 4,
+        },
+        {
+          code: 'ONLY_TITLE',
+          title: '项目风险评估(仅供参考)',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '延期风险',
+          options: [
+            { value: '1', label: '低' },
+            { value: '2', label: '中' },
+            { value: '3', label: '高' },
+          ],
+        },
+        {
+          code: 'CHECKBOX',
+          title: '实施难度',
+          options: [
+            { value: '1', label: '低' },
+            { value: '2', label: '中' },
+            { value: '3', label: '高' },
+          ],
+        },
+        {
+          code: 'TEXTAREA',
+          title: '其它备注(建议关注的其它方面)',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '项目联系人',
+        },
+        {
+          code: 'TABLE',
+          title: '',
+          tablePropList: [
+            {
+              id: 'XXX',
+              widgetId: 'XXX',
+              tdIndex: 1,
+              tdId: 'XXX',
+              tdName: 'XXX',
+              title: '学院/分(子)机构',
+              tdOrder: true,
+              tdSearch: true,
+              editWidgetId: '19',
+              tdFormWidget: {
+                code: 'TEXT',
+                name: '文本',
+              },
+            },
+            {
+              id: 'XXX',
+              widgetId: 'XXX',
+              tdIndex: 2,
+              tdId: 'XXX',
+              tdName: 'XXX',
+              title: '姓名',
+              tdOrder: true,
+              tdSearch: true,
+              editWidgetId: 'XXX',
+              tdFormWidget: {
+                code: 'TEXT',
+                name: '文本',
+              },
+            },
+            {
+              id: 'XXX',
+              widgetId: 'XXX',
+              tdIndex: 3,
+              tdId: 'XXX',
+              tdName: 'XXX',
+              title: '职务',
+              tdOrder: true,
+              tdSearch: true,
+              editWidgetId: 'XXX',
+              tdFormWidget: {
+                code: 'TEXT',
+                name: '文本',
+              },
+            },
+            {
+              id: 'XXX',
+              widgetId: 'XXX',
+              tdIndex: 4,
+              tdId: 'XXX',
+              tdName: 'XXX',
+              title: '手机',
+              tdOrder: true,
+              tdSearch: true,
+              editWidgetId: 'XXX',
+              tdFormWidget: {
+                code: 'TEXT',
+                name: '文本',
+              },
+            },
+          ],
+        },
+      ],
+    },
+    {
+      taskName: '项目关键信息',
+      taskKey: 'XXX',
+      setup: 2,
+      formKey: 'XXX',
+      formProperty: [
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '云阅卷(填写前请先认真查阅移交的项目初审及项目基本信息)',
+        },
+        {
+          code: 'RADIO',
+          title: '运行环境调研是否符合要求',
+          options: [
+            { value: '1', label: '符合' },
+            { value: '2', label: '不符合' },
+          ],
+        },
+        {
+          code: 'DATE',
+          title: '环境部署时间',
+        },
+        {
+          code: 'DATE',
+          title: '扫描开始时间',
+        },
+        {
+          code: 'DATE',
+          title: '扫描结束时间',
+        },
+        {
+          code: 'DATE',
+          title: '评卷机房检查时间',
+        },
+        {
+          code: 'DATE',
+          title: '评卷机房数量(个)',
+        },
+        {
+          code: 'TEXT',
+          title: '最大评卷教师数量',
+        },
+        {
+          code: 'DATE',
+          title: '评卷参数提供时间',
+        },
+        {
+          code: 'DATE',
+          title: '评卷开始时间',
+        },
+        {
+          code: 'DATE',
+          title: '评卷结束时间',
+        },
+        {
+          code: 'TEXT',
+          title: '有选做题的科目数量(门)',
+        },
+        {
+          code: 'TEXTAREA',
+          title: '其他特殊要求',
+        },
+        {
+          code: 'UPLOAD_IMAGE',
+          title: '上传项目关键信息表(纸质)拍照',
+          limit: 3,
+        },
+      ],
+    },
+    {
+      taskName: '项目内审',
+      taskKey: 'XXX',
+      setup: 3,
+      formKey: 'XXX',
+      formProperty: [
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '项目基本信息',
+        },
+        {
+          code: 'TEXT',
+          title: '科目数量',
+        },
+        {
+          code: 'TEXT',
+          title: '考生科次',
+        },
+        {
+          code: 'RADIO',
+          title: '条码标准张数',
+          options: [
+            { value: '1', label: '3张' },
+            { value: '2', label: '4张' },
+          ],
+        },
+        {
+          code: 'RADIO_WITH_INPUT',
+          title: '条码粘贴方式',
+          span: 12,
+          options: [
+            { value: '1', label: '考生自贴/数码印刷' },
+            { value: '2', label: '回卷后粘贴' },
+            { value: '3', label: '其他' },
+          ],
+        },
+        {
+          code: 'RADIO',
+          title: '有无客观题卡',
+          options: [
+            { value: '1', label: '有' },
+            { value: '2', label: '无' },
+          ],
+        },
+        {
+          code: 'TEXT',
+          title: '扫描仪数量(台)',
+        },
+        {
+          code: 'DATE',
+          title: '考生数据交接时间',
+        },
+        {
+          code: 'TEXT',
+          title: '现场标准服务周期(人天)',
+        },
+        {
+          code: 'DATE',
+          title: '项目关键信息提交截止时间',
+        },
+        {
+          code: 'DATE',
+          title: '现场服务完成撤场计划时间',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '云阅卷',
+        },
+        {
+          code: 'RADIO',
+          title: '运行环境调研是否符合要求',
+          options: [
+            { value: '1', label: '符合' },
+            { value: '2', label: '不符合' },
+          ],
+        },
+        {
+          code: 'DATE',
+          title: '环境部署时间',
+        },
+        {
+          code: 'DATE',
+          title: '扫描开始时间',
+        },
+        {
+          code: 'DATE',
+          title: '扫描结束时间',
+        },
+        {
+          code: 'DATE',
+          title: '评卷机房检查时间',
+        },
+        {
+          code: 'TEXT',
+          title: '评卷机房数量',
+        },
+        {
+          code: 'TEXT',
+          title: '最大评卷教师数量',
+        },
+        {
+          code: 'DATE',
+          title: '评卷参数提供时间',
+        },
+        {
+          code: 'DATE',
+          title: '评卷开始时间',
+        },
+        {
+          code: 'DATE',
+          title: '评卷结束时间',
+        },
+        {
+          code: 'TEXT',
+          title: '有选做题的科目数量',
+        },
+        {
+          code: 'TEXTAREA',
+          title: '其它特殊要求',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '项目内审(请于24小时内完成内审)',
+        },
+        {
+          code: 'RADIO',
+          title: '我对以上项目关键信息已审核,确认内容无误',
+          options: [
+            { value: '1', label: '同意' },
+            { value: '2', label: '不同意' },
+          ],
+        },
+        {
+          code: 'SIGN',
+          title: '手写签名',
+        },
+        {
+          code: 'TEXTAREA',
+          title: '审批意见',
+        },
+      ],
+    },
+    {
+      taskName: '设备出库登记',
+      taskKey: 'XXX',
+      setup: 4,
+      formKey: 'XXX',
+      formProperty: [
+        {
+          code: 'RADIO',
+          title: '设备出入库',
+          options: [
+            { value: '1', label: '出库' },
+            { value: '2', label: '入库' },
+          ],
+          disabled: true,
+        },
+        {
+          code: 'DATE',
+          title: '设备出入库时间',
+          api: '/api/******', //获取设备列表的api
+        },
+        {
+          code: 'DEVICE_OUT_TABLE',
+          title: '设备出库登记',
+        },
+      ],
+    },
+    {
+      taskName: '扫描准备',
+      taskKey: 'XXX',
+      setup: 5,
+      formKey: 'XXX',
+      formProperty: [
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '导入数据',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          options: [{ value: '1', label: '导入数据与原始数据是否一致' }],
+        },
+        {
+          code: 'TEXT',
+          title: '导入考生数量',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '扫描仪设置',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '扫描仪设置',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          span: 12,
+          options: [
+            {
+              value: '1',
+              label:
+                '1、扫描仪分辨率设置是否150、扫描模式是否双面、图像类型是否灰度',
+            },
+            { value: '2', label: '2、选择“扫描模式”-“设置”-“装订边缘”-“上”' },
+          ],
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '卡格式制作',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          span: 12,
+          options: [
+            {
+              value: '1',
+              label: '1、定位点、校验点是否制作',
+            },
+            { value: '2', label: '2、缺考区域是否框选' },
+            {
+              value: '3',
+              label: '3、客观题区域是否正确框选、行列以及单选多选是否正确',
+            },
+            { value: '4', label: '4、条码识别区是否制作' },
+            { value: '5', label: '5、屏蔽区是否制作' },
+            { value: '6', label: '6、卷型:若有,则框选' },
+            { value: '7', label: '7、页码:若答题卡超过1张,则框选' },
+          ],
+        },
+      ],
+    },
+    {
+      taskName: '正式扫描',
+      taskKey: 'XXX',
+      setup: 6,
+      formKey: 'XXX',
+      formProperty: [
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '试扫检查',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          span: 12,
+          options: [
+            {
+              value: '1',
+              label: '1、查看条码是否识别正确',
+            },
+            { value: '2', label: '2、缺考、客观题是否识别正确' },
+            { value: '3', label: '3、扫描原图正反面是否正确显示' },
+            { value: '4', label: '4、裁切图屏蔽区是否正确' },
+            { value: '5', label: '5、卷型:若有,是否识别正确' },
+            { value: '6', label: '6、页码:若答题卡超过1张,是否页码识别正确' },
+          ],
+        },
+      ],
+    },
+    {
+      taskName: '校验收尾',
+      taskKey: 'XXX',
+      setup: 7,
+      formKey: 'XXX',
+      formProperty: [
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '未上传考生核对',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          options: [
+            {
+              value: '1',
+              label:
+                '1、未上传考生是否与签到表进行核对,是否为缺考、违纪、免考等情况',
+            },
+            { value: '2', label: '2、是否将未上传考生发给学校确认' },
+          ],
+        },
+        {
+          code: 'TEXT',
+          title: '完成数量',
+        },
+        {
+          code: 'UPLOAD_IMAGE',
+          title: '上传学校未上传考生沟通确认截图',
+          limit: 1,
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '识别对照',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          options: [
+            { value: '1', label: '是否将客观题识别异常的全部人工修改处理' },
+          ],
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '缺考名单对比',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          options: [
+            {
+              value: '1',
+              label:
+                '核对未上传条数是否与学校提供的缺考名单吻合,人工指定为缺考(考生管理>导入名单>导入缺考名单)',
+            },
+          ],
+        },
+        {
+          code: 'TEXT',
+          title: '缺考科次数量',
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '手工输入条码确认',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          options: [
+            {
+              value: '1',
+              label: '“数据检查" -"人工确认“,确认完成',
+            },
+          ],
+        },
+      ],
+    },
+    {
+      taskName: '评卷准备',
+      taskKey: 'XXX',
+      setup: 8,
+      formKey: 'XXX',
+      formProperty: [
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '评卷模式确认',
+        },
+        {
+          code: 'RADIO',
+          label: '评卷模式',
+          options: [
+            { value: '1', label: '轨迹模式' },
+            { value: '2', label: '普通模式' },
+          ],
+        },
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '评卷参数核对',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          span: 12,
+          options: [
+            {
+              value: '1',
+              label: '1、核查每个科目的满分是否正确(大部分科目都是100分)',
+            },
+            {
+              value: '2',
+              label:
+                '2、核对客观题标答以及分数是否录入正确、多选题判分规则(漏选是否得分、任选得分)',
+            },
+            {
+              value: '3',
+              label:
+                '3、检查所有科目结构和分组是否全部导入。(评卷管理>评卷进度查看分组状态)',
+            },
+          ],
+        },
+      ],
+    },
+    {
+      taskName: '评卷收尾',
+      taskKey: 'XXX',
+      setup: 9,
+      formKey: 'XXX',
+      formProperty: [
+        {
+          code: 'FORM_GROUP_TITLE',
+          title: '成绩提交核查',
+        },
+        {
+          code: 'CHECKBOX',
+          title: '',
+          span: 12,
+          options: [
+            {
+              value: '1',
+              label: '1、是否已核对不缺考、客观题为0分的情况。',
+            },
+            {
+              value: '2',
+              label: '2、是否已核对主观题为0、客观题有分的情况。',
+            },
+            {
+              value: '3',
+              label: '3、是否检查客观题小题得分率低于20%的情况。',
+            },
+            {
+              value: '4',
+              label:
+                '4、核对导出成绩表数据条数是否与考生表数量一致,不能带有“未导出全量数据”字样;请填写导出成绩数量以及完成时间',
+            },
+            {
+              value: '5',
+              label: '5、核对导出图片工具是否正常运行',
+            },
+          ],
+        },
+        {
+          code: 'UPLOAD_IMAGE',
+          title: '上传验收报告(纸质)拍照',
+          limit: 5,
+        },
+      ],
+    },
+  ],
+};