浏览代码

管理员创建&编辑流程

warrior 8 月之前
父节点
当前提交
87b7393d43

+ 2 - 1
projects/textbook/src/modules/nav-admin/collection-edit/collection-edit.component.html

@@ -17,6 +17,7 @@
         *nzSpaceItem
         nz-button
         nzType="primary"
+        (click)="onCreateProcess()"
       >
       发起报送流程
       </button>
@@ -27,7 +28,7 @@
   <nz-tabset [(nzSelectedIndex)]="active">
     <nz-tab nzTitle="报送流程">
       @if (active == 0) {
-      <app-process></app-process>
+      <app-process [eduCollectionId]="eduCollection?.id"></app-process>
       }
     </nz-tab>
     <nz-tab nzTitle="合集管理">

+ 9 - 2
projects/textbook/src/modules/nav-admin/collection-edit/collection-edit.component.ts

@@ -5,7 +5,7 @@ import { CommonCompModule } from '../../../services/common.modules';
 import { NzTabsModule } from 'ng-zorro-antd/tabs';
 import { ProcessComponent } from '../components/process/process.component';
 import { CreateCollectionComponent } from '../create-collection/create-collection.component';
-import { ActivatedRoute } from '@angular/router';
+import { ActivatedRoute, Router } from '@angular/router';
 import Parse from 'parse';
 import { EduTextbook } from '../../../schemas/EduTextbook';
 import { CompTableListComponent } from '../../../app/comp-table/comp-table-list/comp-table-list.component';
@@ -35,7 +35,8 @@ export class CollectionEditComponent implements OnInit {
   fieldsArray: Array<any> | undefined;
 
   constructor(
-    private activeRoute:ActivatedRoute
+    private activeRoute:ActivatedRoute,
+    private router: Router,
   ) {
     this.user = Parse.User.current();
     this.className = this.EduTextbook.className;
@@ -43,6 +44,8 @@ export class CollectionEditComponent implements OnInit {
     this.queryParams = {
       where: {
         isDeleted: { $ne: true },
+        render: true,
+        status: '200',
       },
     };
   }
@@ -57,4 +60,8 @@ export class CollectionEditComponent implements OnInit {
       }
     })
   }
+
+  onCreateProcess(){
+    this.router.navigate(['/nav-admin/manage/process/create',{cid:this.eduCollection?.id}])
+  }
 }

+ 2 - 0
projects/textbook/src/modules/nav-admin/components/process/process.component.ts

@@ -12,6 +12,7 @@ import { EduProcess } from '../../../../schemas/eduProcess';
   standalone: true,
 })
 export class ProcessComponent  implements OnInit {
+  @Input('eduCollectionId')eduCollectionId:string|any
 
   @ViewChild(CompTableListComponent) list: CompTableListComponent | undefined;
 
@@ -28,6 +29,7 @@ export class ProcessComponent  implements OnInit {
     this.queryParams = {
       where: {
         isDeleted: { $ne: true },
+        eduCollection:this.eduCollectionId,
       },
     };
   }

+ 1 - 1
projects/textbook/src/modules/nav-admin/components/profile/profile.component.ts

@@ -56,7 +56,7 @@ export class ProfileComponent  implements OnInit {
     let query = new Parse.Query('Profile')
     this.identity && query.equalTo('identity',this.identity)
     this.province && query.equalTo('province',this.province)
-    this.disabled && query.equalTo('objectId',this.idList[0])
+    this.disabled && query.containedIn('objectId',this.idList)
     this.profiles = await query.find()
   }
   onChange(id:string){

+ 10 - 10
projects/textbook/src/modules/nav-admin/create-collection/create-collection.component.html

@@ -1,11 +1,11 @@
 <!-- 表格头部 -->
 @if (!isEdit) {
-  <nz-page-header nzTitle="创建新合集">
-    <nz-breadcrumb nz-page-header-breadcrumb>
-      <nz-breadcrumb-item>创建合集</nz-breadcrumb-item>
-      <nz-breadcrumb-item><a>报送合集</a></nz-breadcrumb-item>
-    </nz-breadcrumb>
-  </nz-page-header>
+<nz-page-header nzTitle="创建新合集">
+  <nz-breadcrumb nz-page-header-breadcrumb>
+    <nz-breadcrumb-item>创建合集</nz-breadcrumb-item>
+    <nz-breadcrumb-item><a>报送合集</a></nz-breadcrumb-item>
+  </nz-breadcrumb>
+</nz-page-header>
 }
 <div class="content" [style.padding]="isEdit ? '0' : '0 24px 16px'">
   <form
@@ -38,7 +38,7 @@
                 <input
                   nz-input
                   type="text"
-                  placeholder="请填写作者姓名"
+                  placeholder="请填写合集名称"
                   formControlName="name"
                   nzStatus=""
                   maxlength="50"
@@ -77,6 +77,8 @@
             </nz-form-control>
           </nz-form-item>
         </div>
+      </div>
+      <div nz-row>
         <div nz-col nzSpan="12">
           <nz-form-item class="row" style="margin-bottom: 16px">
             <nz-form-label
@@ -123,9 +125,7 @@
               nzErrorTip="请填写流程数量"
               style="width: 100%"
             >
-              <nz-input-group
-                [nzAddOnAfter]="getNumlength() + '/' + 50"
-              >
+              <nz-input-group [nzAddOnAfter]="getNumlength() + '/' + 50">
                 <input
                   nz-input
                   type="number"

+ 5 - 0
projects/textbook/src/modules/nav-admin/modules.routes.ts

@@ -6,6 +6,7 @@ import { PageCollectionComponent } from './page-collection/page-collection.compo
 import { PageRoleComponent } from './page-role/page-role.component';
 import { PageTextbookComponent } from './page-textbook/page-textbook.component';
 import { PageUserComponent } from './page-user/page-user.component';
+import { ProcessCreateComponent } from './process-create/process-create.component';
 const routes: Routes = [
   {
     path: '',
@@ -27,6 +28,10 @@ const routes: Routes = [
         path: 'collection/edit', //合集编辑
         component: CollectionEditComponent,
       },
+      {
+        path: 'process/create', //合集编辑
+        component: ProcessCreateComponent,
+      },
       {
         path: 'allcollection', //合集列表
         component: PageTextbookComponent,

+ 257 - 0
projects/textbook/src/modules/nav-admin/process-create/process-create.component.html

@@ -0,0 +1,257 @@
+<nz-page-header nzTitle="发起报送流程">
+  <nz-breadcrumb nz-page-header-breadcrumb>
+    <nz-breadcrumb-item>报送合集</nz-breadcrumb-item>
+    <nz-breadcrumb-item>北京市</nz-breadcrumb-item>
+    <nz-breadcrumb-item>报送流程</nz-breadcrumb-item>
+    <nz-breadcrumb-item><a>发起报送流程</a></nz-breadcrumb-item>
+  </nz-breadcrumb>
+</nz-page-header>
+<div class="content" [style.padding]="isEdit ? '0' : '0 24px 16px'">
+  <form
+    nz-form
+    [formGroup]="validateForm"
+    class="login-form"
+    (ngSubmit)="submitForm('save')"
+  >
+    <div class="title">基本信息</div>
+    <div class="fill-template">
+      <div nz-row>
+        <div nz-col nzSpan="12">
+          <nz-form-item class="row" style="margin-bottom: 16px">
+            <nz-form-label
+              class="label"
+              [nzNoColon]="true"
+              [nzSm]="18"
+              [nzXs]="18"
+              nzRequired
+              >流程名称</nz-form-label
+            >
+            <nz-form-control
+              class="val"
+              nzErrorTip="请填写流程名称"
+              style="width: 100%"
+            >
+              <nz-input-group
+                [nzAddOnAfter]="validateForm.value.name.length + '/' + 50"
+              >
+                <input
+                  nz-input
+                  type="text"
+                  placeholder="请填写流程名称"
+                  formControlName="name"
+                  nzStatus=""
+                  maxlength="50"
+                />
+              </nz-input-group>
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+        <div nz-col nzSpan="12">
+          <nz-form-item class="row" style="margin-bottom: 16px">
+            <nz-form-label
+              class="label"
+              [nzNoColon]="true"
+              [nzSm]="18"
+              [nzXs]="18"
+              nzRequired
+              >流程描述</nz-form-label
+            >
+            <nz-form-control
+              class="val"
+              nzErrorTip="请填写合集描述"
+              style="width: 100%"
+            >
+              <nz-input-group
+                [nzAddOnAfter]="validateForm.value.desc.length + '/' + 50"
+              >
+                <input
+                  nz-input
+                  type="text"
+                  placeholder="请填流程描述"
+                  formControlName="desc"
+                  nzStatus=""
+                  maxlength="50"
+                />
+              </nz-input-group>
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+      </div>
+      <div nz-row>
+        <div nz-col nzSpan="12">
+          <nz-form-item class="row" style="margin-bottom: 16px">
+            <nz-form-label
+              class="label"
+              [nzNoColon]="true"
+              [nzSm]="18"
+              [nzXs]="18"
+              nzRequired
+              >流程唯一标识</nz-form-label
+            >
+            <nz-form-control
+              class="val"
+              nzErrorTip="请填写流程唯一标识"
+              style="width: 100%"
+            >
+              <nz-input-group
+                [nzAddOnAfter]="validateForm.value.code.length + '/' + 50"
+              >
+                <input
+                  nz-input
+                  type="text"
+                  placeholder="请填写流程唯一标识"
+                  formControlName="code"
+                  nzStatus=""
+                  maxlength="50"
+                />
+              </nz-input-group>
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+        <div nz-col nzSpan="12">
+          <nz-form-item class="row" style="margin-bottom: 16px">
+            <nz-form-label
+              class="label"
+              [nzNoColon]="true"
+              [nzSm]="18"
+              [nzXs]="18"
+              nzRequired
+              >报送配额</nz-form-label
+            >
+            <nz-form-control
+              class="val"
+              nzErrorTip="请填写报送配额"
+              style="width: 100%"
+            >
+              <nz-input-group [nzAddOnAfter]="getNumlength() + '/' + 50">
+                <input
+                  nz-input
+                  type="number"
+                  placeholder="请填写报送配额"
+                  formControlName="num"
+                  nzStatus=""
+                  maxlength="50"
+                />
+              </nz-input-group>
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+      </div>
+      <div nz-row>
+        <div nz-col nzSpan="12">
+          <nz-form-item class="row" style="margin-bottom: 16px">
+            <nz-form-label
+              class="label"
+              [nzNoColon]="true"
+              [nzSm]="18"
+              [nzXs]="18"
+              nzRequired
+              >开始时间</nz-form-label
+            >
+            <nz-form-control
+              class="val"
+              nzErrorTip="请填写开始时间"
+              style="width: 100%"
+            >
+              <nz-date-picker
+                nzFormat="yyyy-MM-dd HH:mm:ss"
+                formControlName="startDate"
+                [nzShowTime]="{ nzDefaultOpenValue: timeDefaultValue }"
+              ></nz-date-picker>
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+        <div nz-col nzSpan="12">
+          <nz-form-item class="row" style="margin-bottom: 16px">
+            <nz-form-label
+              class="label"
+              [nzNoColon]="true"
+              [nzSm]="18"
+              [nzXs]="18"
+              nzRequired
+              >结束时间</nz-form-label
+            >
+            <nz-form-control
+              class="val"
+              nzErrorTip="请填写结束时间"
+              style="width: 100%"
+            >
+              <nz-date-picker
+                nzFormat="yyyy-MM-dd HH:mm:ss"
+                formControlName="deadline"
+                [nzShowTime]="{ nzDefaultOpenValue: timeDefaultValue }"
+              ></nz-date-picker>
+            </nz-form-control>
+          </nz-form-item>
+        </div>
+      </div>
+      <div nz-row>
+        <div nz-col nzSpan="24">
+          <div class="title-row">
+            <div>
+              <div class="title">流程管理员</div>
+              <!-- <div class="tips">
+                流程管理员可查看合集中所有流程报送的教材、报送配额、用户,可创建所属省份与自己相同的账号、用户组;可公示和报送合集中所有教材。
+              </div> -->
+            </div>
+            <a class="btn" (click)="onShowCheck()">选择流程管理员</a>
+          </div>
+          <div class="tabs" #maxWidth>
+            @if (eduProcess?.get('profileSubmitted') && !showProfileFrom) {
+            <app-profile
+              [idList]="profileIds ? profileIds : []"
+              (change)="changeSubmitted($event)"
+              [maxWidth]="maxWidth"
+              [disabled]="true"
+            ></app-profile>
+            } @else if(showProfileFrom){
+            <app-profile
+              [maxChecked]="99"
+              [idList]="profileIds ? profileIds : []"
+              [maxWidth]="maxWidth"
+              (change)="changeSubmitted($event)"
+            ></app-profile>
+            }
+          </div>
+          <div class="fonter">
+            @if (!eduProcess?.id) {
+            <button
+              class="form-button"
+              type="button"
+              mat-raised-button
+              (click)="submitForm('save')"
+            >
+              创建报送流程
+            </button>
+            <button
+              class="form-button close"
+              type="button"
+              mat-raised-button
+              (click)="submitForm('close')"
+            >
+              取消
+            </button>
+            } @else {
+            <button
+              class="form-button"
+              type="button"
+              mat-raised-button
+              (click)="submitForm('save')"
+            >
+              发起报送流程
+            </button>
+            <button
+              class="form-button close"
+              type="button"
+              mat-raised-button
+              (click)="submitForm('close')"
+            >
+              取消
+            </button>
+            }
+          </div>
+        </div>
+      </div>
+    </div>
+  </form>
+</div>

+ 74 - 0
projects/textbook/src/modules/nav-admin/process-create/process-create.component.scss

@@ -0,0 +1,74 @@
+.content {
+  padding: 0 24px 16px;
+  min-width: 800px;
+  font-family: PingFang SC;
+  .title {
+    //styleName: 字体/标题-中-Medium;
+    font-family: PingFang SC;
+    font-size: 20px;
+    font-weight: 500;
+    line-height: 32px;
+    text-align: left;
+  }
+  .row {
+    display: flex;
+    flex-direction: column;
+    align-items: start;
+    width: 84%;
+    .label {
+      margin: 10px 0 6px;
+    }
+    .val {
+      min-height: auto;
+    }
+  }
+  .title-row {
+    margin-top: 20px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    .tips {
+      font-family: PingFang SC;
+      font-size: 14px;
+      font-weight: 400;
+      line-height: 16px;
+      text-align: left;
+      margin-top: 10px;
+    }
+    .btn {
+      margin-left: 20px;
+      flex-shrink: 0;
+      color: #006ded;
+    }
+  }
+
+}
+.fonter{
+  text-align: right;
+  .form-button {
+    width: 160px;
+    height: 40px;
+    margin: 20px 0;
+    color: white !important;
+    background-color: #3E49B3!important;
+    border-radius: 4px;
+    font-family: PingFang SC;
+    font-size: 14px;
+    font-weight: 400;
+    line-height: 20px;
+    text-align: center;
+  }
+  .close{
+    width: 80px;
+    background-color: #eae6e6 !important;
+    color: black !important;
+    margin-left: 20px;
+  }
+}
+
+// ::ng-deep .ant-page-header {
+//   padding: 16px 24px 0;
+// }
+::ng-deep .ant-page-header-heading-title {
+  color: black;
+}

+ 24 - 0
projects/textbook/src/modules/nav-admin/process-create/process-create.component.spec.ts

@@ -0,0 +1,24 @@
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { ProcessCreateComponent } from './process-create.component';
+
+describe('ProcessCreateComponent', () => {
+  let component: ProcessCreateComponent;
+  let fixture: ComponentFixture<ProcessCreateComponent>;
+
+  beforeEach(waitForAsync(() => {
+    TestBed.configureTestingModule({
+      declarations: [ ProcessCreateComponent ],
+      imports: [IonicModule.forRoot()]
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(ProcessCreateComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  }));
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 205 - 0
projects/textbook/src/modules/nav-admin/process-create/process-create.component.ts

@@ -0,0 +1,205 @@
+import { Component, Input, OnInit } from '@angular/core';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { CommonCompModule } from '../../../services/common.modules';
+import { Router, ActivatedRoute } from '@angular/router';
+import { NzSelectModule } from 'ng-zorro-antd/select';
+import Parse from 'parse';
+import {
+  FormControl,
+  FormGroup,
+  NonNullableFormBuilder,
+  Validators,
+} from '@angular/forms';
+import { textbookServer } from '../../../services/textbook';
+import { NzMessageService } from 'ng-zorro-antd/message';
+import { NzModalService } from 'ng-zorro-antd/modal';
+import { SubmittedComponent } from '../components/submitted/submitted.component';
+import { ProfileComponent } from '../components/profile/profile.component';
+import { MatButtonModule } from '@angular/material/button';
+import { differenceInCalendarDays, setHours } from 'date-fns';
+@Component({
+  selector: 'app-process-create',
+  templateUrl: './process-create.component.html',
+  styleUrls: ['./process-create.component.scss'],
+  imports: [
+    CommonCompModule,
+    FormsModule,
+    ReactiveFormsModule,
+    NzSelectModule,
+    SubmittedComponent,
+    ProfileComponent,
+    MatButtonModule,
+  ],
+  standalone: true,
+})
+export class ProcessCreateComponent implements OnInit {
+  eduCollectionId:string|undefined //指向的合集
+
+  eduProcess: Parse.Object | undefined;
+  showProfileFrom: boolean = false;
+  @Input('isEdit') isEdit: boolean = false; //当前是否作为编辑子组件
+  profileIds: Array<string> = []; //报送人
+
+  timeDefaultValue = setHours(new Date(), 0);
+  
+  validateForm: FormGroup<{
+    name: FormControl<Array<string> | any>; //流程名称
+    desc: FormControl<Array<string> | any>; //流程描述
+    code: FormControl<string | any>; //流程唯一标识
+    num: FormControl<number | any>; //报送配额
+    startDate: FormControl<Date>; //开始时间
+    deadline: FormControl<Date>; //结束时间
+  }> = this.fb.group({
+    name: ['', [Validators.required]],
+    desc: ['', [Validators.required]],
+    code: ['', [Validators.required]],
+    num: ['', [Validators.required]],
+    startDate: [new Date(), [Validators.required]],
+    deadline: [new Date(), [Validators.required]],
+  });
+  getNumlength(): number {
+    return this.validateForm.value.num.toString().length;
+  }
+  constructor(
+    private activeRoute: ActivatedRoute,
+    private router: Router,
+    public tbookSer: textbookServer,
+    private fb: NonNullableFormBuilder,
+    private msg: NzMessageService,
+    private modal: NzModalService
+  ) {}
+
+  ngOnInit() {
+    this.activeRoute.paramMap.subscribe(async (params) => {
+      let id = params.get('id');
+      this.eduCollectionId = params.get('cid')!;
+      console.log(id);
+      if (id) {
+        this.isEdit = true;
+        let query = new Parse.Query('EduProcess');
+        query.equalTo('eduProcess', id);
+        this.eduProcess = await query.first();
+        this.validateForm = this.fb.group({
+          name: [this.eduProcess?.get('name') || '', [Validators.required]],
+          desc: [this.eduProcess?.get('desc') || '', [Validators.required]],
+          code: [this.eduProcess?.get('code') || '', [Validators.required]],
+          num: [this.eduProcess?.get('num') || '', [Validators.required]],
+          startDate: [
+            this.eduProcess?.get('startDate') || new Date(),
+            new Date(),
+            [Validators.required],
+          ],
+          deadline: [
+            this.eduProcess?.get('deadline') || new Date(),
+            ,
+            [Validators.required],
+          ],
+        });
+        this.profileIds = this.eduProcess?.get('profileSubmitteds')?.map((item:any)=> item.objectId)
+        // let querySubmitted = new Parse.Query('Submitted')
+        // querySubmitted.equalTo('eduProcess',this.eduProcess?.id)
+        // let submitteds = await querySubmitted.find()
+        // if(submitteds?.length > 0){
+        //   this.profileIds = submitteds.map(item=> item.id)
+        // }
+      }
+    });
+  }
+  onShowCheck() {
+    if (!this.eduProcess?.id) {
+      this.msg.warning('请先创建报送流程');
+      return;
+    }
+    this.showProfileFrom = true;
+  }
+  async submitForm(type: string): Promise<void> {
+    if (type == 'close') {
+      this.modal.confirm({
+        nzTitle: '你确定取消吗?',
+        nzContent: '',
+        nzOkText: '是',
+        nzOkType: 'primary',
+        nzOkDanger: true,
+        nzOnOk: () => history.back(),
+        nzCancelText: '否',
+        nzOnCancel: () => console.log('Cancel'),
+      });
+      return;
+    }
+    if (this.validateForm.valid) {
+      console.log('submit', this.validateForm.value);
+      let params = this.validateForm.value;
+      this.saveEduCollection(params);
+    } else {
+      this.msg.warning('请填写完整信息');
+      Object.values(this.validateForm.controls).forEach((control) => {
+        if (control.invalid) {
+          control.markAsDirty();
+          control.updateValueAndValidity({ onlySelf: true });
+        }
+      });
+    }
+  }
+
+  async saveEduCollection(params: any) {
+    if (!this.eduProcess?.id) {
+      let obj = Parse.Object.extend('EduProcess');
+      this.eduProcess = new obj();
+    }
+    this.eduProcess?.set('user', Parse.User.current()?.toPointer());
+    this.eduProcess?.set('company', {
+      __type: 'Pointer',
+      className: 'Company',
+      objectId: this.tbookSer.company,
+    });
+    this.eduProcess?.set('eduCollection', {
+      __type: 'Pointer',
+      className: 'EduCollection',
+      objectId: this.eduCollectionId,
+    });
+    this.eduProcess?.set('name', params.name);
+    this.eduProcess?.set('desc', params.desc);
+    this.eduProcess?.set('code', params.code);
+    this.eduProcess?.set('num', params.num);
+    this.eduProcess?.set('startDate', params.startDate);
+    this.eduProcess?.set('deadline', params.deadline);
+    let profileSubmitteds = this.profileIds?.map(id=>{
+      let pointer = {
+        __type: 'Pointer',
+        className: 'Profile',
+        objectId: id,
+      }
+      return pointer
+    })|| []
+    this.eduProcess?.set('profileSubmitteds',profileSubmitteds)
+    this.eduProcess = await this.eduProcess?.save();
+    this.msg.success(this.isEdit ? '已保存' : '已创建');
+    this.showProfileFrom = false;
+  }
+  // async setSubmitted(){
+  //   for (let index = 0; index < this.profileIds.length; index++) {
+  //     const id = this.profileIds[index];
+  //     let obj = Parse.Object.extend('Submitted');
+  //     let submitted = new obj();
+  //     this.eduProcess?.set('company', {
+  //       __type: 'Pointer',
+  //       className: 'Company',
+  //       objectId: this.tbookSer.company,
+  //     });
+  //     this.eduProcess?.set('profileSubmitted', {
+  //       __type: 'Pointer',
+  //       className: 'Profile',
+  //       objectId: id,
+  //     })
+  //     this.eduProcess?.set('profileSubmitted', {
+  //       __type: 'Pointer',
+  //       className: 'Profile',
+  //       objectId: id,
+  //     })
+  //   }
+  // }
+  async changeSubmitted(e: Array<string>) {
+    console.log(e);
+    if (e[0]) this.profileIds = e;
+  }
+}

+ 8 - 0
server/db/schemas/EduProcess.js

@@ -6,6 +6,10 @@ export const EduProcess = {
       "targetClass": "EduCollection",
       "required": false
     },
+    "profileSubmitteds": {//流程管理员
+      "type": "Array",
+      "required": false
+    },
     "name": {//流程名称
       "type": "String",
       "required": false
@@ -14,6 +18,10 @@ export const EduProcess = {
       "type": "Number",
       "required": false
     },
+    "code": {//流程唯一标识
+      "type": "Number",
+      "required": false
+    },
     "startDate": {//开始时间
       "type": "Date",
       "required": false

+ 1 - 1
server/db/schemas/EduTextbook.js

@@ -2,7 +2,7 @@ export const EduTextbook = {
     "className": "EduTextbook",
     "fields": {
         "status": {
-            //状态 101:待完善资料 102:可提交状态
+            //状态 101:待完善资料 102:可提交状态 200:已提交遴选中 300:被打回 400:已通过
             "type": "String",
             "required": false
         },