瀏覽代碼

Merge branch 'master' of http://git.fmode.cn:3000/bin/edu-textbook

warrior 8 月之前
父節點
當前提交
ff21a0eb17

+ 1 - 1
docker-front

@@ -1 +1 @@
-Subproject commit 13fab33134e89b9b2401ea77a8090298219e724d
+Subproject commit 35c65cd78afe8a3192172113d4c90970da91c345

+ 12 - 3
projects/textbook/src/modules/nav-author/apply/apply.component.html

@@ -1,6 +1,6 @@
 <div id="top"></div>
 <div class="site-page-header">
-  <nz-page-header nzTitle="创建/编辑空间" nzSubtitle="" style="padding: 0">
+  <nz-page-header [nzTitle]="eduId?'编辑教材':'创建教材'" nzSubtitle="" style="padding: 0">
     <nz-breadcrumb nz-page-header-breadcrumb>
       <div class="back" (click)="back()">
         <span nz-icon nzType="left" nzTheme="outline"></span>返回
@@ -12,7 +12,8 @@
       <nz-step nzTitle="填写基本信息" nzDescription=""></nz-step>
       <nz-step nzTitle="填写教材适用情况" nzDescription=""></nz-step>
       <nz-step nzTitle="填写教材内容" nzDescription=""></nz-step>
-      <nz-step nzTitle="上传附件及承诺" nzDescription=""></nz-step>
+      <nz-step nzTitle="填写承诺内容" nzDescription=""></nz-step>
+      <nz-step nzTitle="上传附件材料" nzDescription=""></nz-step>
     </nz-steps>
   </div>
 </div>
@@ -41,7 +42,15 @@
       (save)="save()"
       (maxWidth)="(submitComp.style.width)"
     ></app-textbook-content>
-    } @case (3) {
+    }@case (3) {
+      <app-faith
+        [eduTextbook]="textBook"
+        (state)="changeState($event)"
+        (save)="save()"
+        (maxWidth)="(submitComp.style.width)"
+      ></app-faith>
+      } 
+    @case (4) {
     <app-attachment
       [eduTextbook]="textBook"
       (state)="changeState($event)"

+ 9 - 2
projects/textbook/src/modules/nav-author/apply/apply.component.ts

@@ -6,6 +6,7 @@ import { BasicInComponent } from '../components/basic-in/basic-in.component';
 import { TextbookPertainComponent } from '../components/textbook-pertain/textbook-pertain.component';
 import { TextbookContentComponent } from '../components/textbook-content/textbook-content.component';
 import { AttachmentComponent } from '../components/attachment/attachment.component';
+import { FaithComponent } from '../components/faith/faith.component';
 // import { NzLayoutModule } from 'ng-zorro-antd/layout';
 import Parse from 'parse';
 
@@ -18,6 +19,7 @@ import Parse from 'parse';
     TextbookPertainComponent,
     TextbookContentComponent,
     AttachmentComponent,
+    FaithComponent
   ],
   standalone: true,
   templateUrl: './apply.component.html',
@@ -31,17 +33,22 @@ export class ApplyComponent implements OnInit {
       '0': '教材基本信息',
       '1': '教材适用情况',
       '2': '申报教材建设历程',
-      '3': '附件材料',
+      '3':'',
+      '4': '附件材料',
     };
     return map[this.state];
   }
   showFrom: boolean = false;
 
   constructor(private router: Router, private activeRoute: ActivatedRoute) {}
-
+/** 路由传递教材id*/
+eduId:any
   async ngOnInit() {
+    let that = this
     this.activeRoute.paramMap.subscribe(async (params) => {
       let id = params.get('id');
+      that.eduId = id
+      console.log(that.eduId)
       if (id) {
         let query = new Parse.Query('EduTextbook');
         query.equalTo('objectId', id);

+ 158 - 178
projects/textbook/src/modules/nav-author/components/attachment/attachment.component.html

@@ -1,182 +1,98 @@
 <div class="entry">
   <!-- <form nz-form [formGroup]="validateForm" class="login-form" (ngSubmit)="submitForm()"> -->
-  
-  
-  
-    <div class="author-content">
-      <div class="title">所有作者政治审查意见</div>
-      <div class="text">
-        <span style="color: red;">*</span>
-        从本申报平台 
-        <a (click)="downloadFile('教材编写人员政治审查表.docx')">下载格式要求</a>
-         后,对应作者姓名上传“作者政治审查表”,支持 PDF、JPG、JPEG、PNG 格式,大小不超过 2M。作者单位党委对作者进行审查,对政治思想表现情况进行评价,确保作者的正确政治方向、价值取向,无违法违纪等记录。
-        教材编写成员涉及多个不同单位时需要各单位分别出具意见,并由所在单位党委盖章。</div>
-     
-
-
-
-        
-        <nz-table #basicTable [nzData]="authorList" [nzScroll]="{ x: (maxWidth || '1200') + 'px' }">
-          <thead>
-            <tr>
-              <th nzWidth="80px" nzLeft nzAlign="right">序号</th>
-              <th nzWidth="160px" nzLeft>姓名</th>
-              <th nzWidth="160px">单位</th>
-              <th nzWidth="160px">出生年月</th>
-              <th nzWidth="160px">国籍</th>
-              <th nzWidth="160px">职务</th>
-              <th nzWidth="160px">职称</th>
-              <th nzWidth="300px">手机号码</th>
-              <th nzWidth="160px">电子邮箱</th>
-              <th nzWidth="160px">分工</th>
-              <th nzWidth="120px" nzRight>
+
+
+
+  <div class="author-content">
+    <div class="title">1.所有作者政治审查意见(必须上传 )</div>
+    <div class="text">
+      <span style="color: red;">*</span>
+      从本申报平台
+      <a (click)="downloadFile('教材编写人员政治审查表.docx')">下载格式要求</a>
+      后,对应作者姓名上传“作者政治审查表”,支持 PDF、JPG、JPEG、PNG 格式,大小不超过 2M。作者单位党委对作者进行审查,对政治思想表现情况进行评价,确保作者的正确政治方向、价值取向,无违法违纪等记录。
+      教材编写成员涉及多个不同单位时需要各单位分别出具意见,并由所在单位党委盖章。
+    </div>
+    <nz-table #basicTable [nzData]="authorList" [nzScroll]="{ x: (maxWidth || '1200') + 'px' }">
+      <thead>
+        <tr>
+          <th nzWidth="80px" nzLeft nzAlign="right">序号</th>
+          <th nzWidth="160px" nzLeft>姓名</th>
+          <th nzWidth="160px">单位</th>
+          <th nzWidth="160px">出生年月</th>
+          <th nzWidth="160px">国籍</th>
+          <th nzWidth="160px">职务</th>
+          <th nzWidth="160px">职称</th>
+          <th nzWidth="300px">手机号码</th>
+          <th nzWidth="160px">电子邮箱</th>
+          <th nzWidth="160px">分工</th>
+          <!-- <th nzWidth="120px" nzRight>
                 作者诚信承诺签名
                 <span style="color: red;">*</span>
-              </th>
-              <th nzWidth="120px" nzRight>
-                作者政治审查表
-                <span style="color: red;">*</span>
-              </th>
-              <th nzWidth="100px" nzRight>操作</th>
-            </tr>
-          </thead>
-          <tbody>
-            @for (data of authorList; track data.mobile;let index = $index) {
-            <tr>
-              <td nzLeft nzAlign="right">{{ index + 1 }}</td>
-              <td nzLeft>
-                {{data.name}}
-              </td>
-              <td>
-               {{data.unit}}
-              </td>
-              <td>
-                {{data.birth|date:'yyyy-MM'}}
-              </td>
-              <td>
-                {{data.nationality}}
-              </td>
-              <td>
-                {{data.job}}
-              </td>
-              <td>
-                {{data.title}}
-              </td>
-              <td>
-                {{data.mobile}}
-              </td>
-              <td>
-                {{data.email}}
-              </td>
-              <td>
-                {{data.work}}
-              </td>
-              <td nzRight>
+              </th> -->
+          <th nzWidth="120px" nzRight>
+            作者政治审查表
+            <span style="color: red;">*</span>
+          </th>
+          <th nzWidth="100px" nzRight>操作</th>
+        </tr>
+      </thead>
+      <tbody>
+        @for (data of authorList; track data.mobile;let index = $index) {
+        <tr>
+          <td nzLeft nzAlign="right">{{ index + 1 }}</td>
+          <td nzLeft>
+            {{data.name}}
+          </td>
+          <td>
+            {{data.unit}}
+          </td>
+          <td>
+            {{data.birth|date:'yyyy-MM'}}
+          </td>
+          <td>
+            {{data.nationality}}
+          </td>
+          <td>
+            {{data.job}}
+          </td>
+          <td>
+            {{data.title}}
+          </td>
+          <td>
+            {{data.mobile}}
+          </td>
+          <td>
+            {{data.email}}
+          </td>
+          <td>
+            {{data.work}}
+          </td>
+          <!-- <td nzRight>
                 @if (data.signature) {
                   <a style="color: #3e49b3;" (click)="openFile(data.signature)">签名文件</a>
                 }
                 <app-comp-upload (change)="upload($event, 'signature',index)"></app-comp-upload>
-              </td>
-              <td nzRight>
-                @if (data.examine) {
-                <a style="color: #3e49b3;" (click)="openFile(data.examine)">政治审查表 </a>
-                }
-                <app-comp-upload (change)="upload($event,'examine',index)"></app-comp-upload>
-              </td>
-              <td nzRight>
-                <!-- <a (click)="onPush('authorList', index)"><span nz-icon style="font-size: 20px; margin-right: 10px"
-                    nzType="plus-circle" nzTheme="outline"></span></a> -->
-                <a (click)="onDel('authorList', index)"><span nz-icon style="font-size: 20px" nzType="delete"
-                    nzTheme="outline"></span></a>
-              </td>
-            </tr>
+              </td> -->
+          <td nzRight>
+            @if (data.examine) {
+            <a style="color: #3e49b3;" (click)="openFile(data.examine)">政治审查表 </a>
             }
-          </tbody>
-        </nz-table>
-
-
-
-    </div>
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-    <div class="author-content">
-    <div class="title">教材版权信息</div>
-    <nz-form-item class="row" style="margin-bottom: 16px">
-     <nz-form-label class="label" [nzNoColon]="true" [nzSm]="10" [nzXs]="10" nzRequired>版权页截图</nz-form-label>
-      <nz-form-control class="val" nzErrorTip="请上传版权页截图" style="width: 100%">
-        @if (copyrightImgUrl) {
-        <a style="color: #3e49b3;" (click)="openFile(copyrightImgUrl)">
-          <span nz-icon nzType="file" nzTheme="outline"></span>
-          版权页截图
-        </a>
-        }
-        <app-comp-upload [type]="'pdf'" [width]="320" [type]="'pdf'" (change)="upload($event, 'copyrightImgUrl')" title="上传PDF"></app-comp-upload>
-
-        <div class="text upText" style="margin: 10px 0">
-          支持上传PDF,大小不超过 2M
-        </div>
-      </nz-form-control>
-    </nz-form-item>
-    
-    <nz-form-item class="row" style="margin-bottom: 16px">
-      <nz-form-label class="label" [nzNoColon]="true" [nzSm]="10" [nzXs]="10" nzRequired>中国版本图书馆 CIP
-        查询截图</nz-form-label>
-      <nz-form-control class="val" nzErrorTip="请上传中国版本图书馆 CIP 查询截图" style="width: 100%">
-        @if (CIPImgUrl) {
-        <a style="color: #3e49b3;" (click)="openFile(CIPImgUrl)">
-          <span nz-icon nzType="file" nzTheme="outline"></span>
-          CIP 查询截图
-        </a>
+            <app-comp-upload (change)="upload($event,'examine',index)"></app-comp-upload>
+          </td>
+          <td nzRight>
+            <!-- <a (click)="onPush('authorList', index)"><span nz-icon style="font-size: 20px; margin-right: 10px"
+                    nzType="plus-circle" nzTheme="outline"></span></a> -->
+            <a (click)="onDel('authorList', index)"><span nz-icon style="font-size: 20px" nzType="delete"
+                nzTheme="outline"></span></a>
+          </td>
+        </tr>
         }
-        <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'CIPImgUrl')" title="上传PDF"></app-comp-upload>
-
-        <div class="text upText" style="margin: 10px 0">
-          支持批量上传 PDF 格式,单个文件大小不超过 2M。
-        </div>
-      </nz-form-control>
-    </nz-form-item>
-
-
-
-    <div class="author-content">
-      <div class="text">如 CIP 数据中无“教材”字样的,须再上传内容提要或前言或后记中可以证明本书为教材的相关内容截图</div>
-      @if (cipProveFile.length>0) {
-      @for (url of cipProveFile; track $index) {
-      <p>
-        <a style="color: #3e49b3;font-size: 14px;" (click)="openFile(url?.url)">
-          <span nz-icon nzType="file" nzTheme="outline"></span>
-          CIP 相关截图 {{$index+1}}
-        </a>
-      </p>
-      }
-      }
-      <app-comp-upload [type]="'pdf'" [width]="320" [maxlenght]="99" (change)="upload($event, 'cipProveFile')"
-        title="上传PDF"></app-comp-upload>
-  
-      <div class="text upText" style="margin: 10px 0">
-        支持上传PDF,大小不超过 2M
-      </div>
-    </div>
-
-
-
-
-
+      </tbody>
+    </nz-table>
   </div>
+ 
   <div class="author-content">
-    <div class="title">图书编校质量自查结果记录表</div>
+    <div class="title">2.图书编校质量自查结果记录表(必须上传)</div>
     <div class="text">
       教材出版单位对申报教材的编校质量自查后,按要求提供图书编校质量自查结果记录表,并加盖出版社公章。全册教材的不同分册以不同文件分别上传。<a
         (click)="downloadFile('图书编校质量自查结果记录表.docx')">下载模板</a>
@@ -190,7 +106,8 @@
           自查结果记录表
         </a>
         }
-        <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'selfResults')" title="上传PDF"></app-comp-upload>
+        <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'selfResults')"
+          title="上传文件"></app-comp-upload>
         <div class="text upText" style="margin: 10px 0">
           支持上传PDF,大小不超过 2M
         </div>
@@ -198,7 +115,7 @@
     </nz-form-item>
   </div>
   <div class="author-content">
-    <div class="title">专家审查意见表</div>
+    <div class="title">3.专家审查意见表(必须上传)</div>
     <div class="text">
       由第一主编所在单位和出版机构邀请校内外相关学科专业领域专家,对教材进行思想性、学术性审核。专家不少于
       3
@@ -213,15 +130,16 @@
           专家审查意见表
         </a>
         }
-        <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'expertOpinion')" title="上传PDF"></app-comp-upload>
+        <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'expertOpinion')"
+          title="上传文件"></app-comp-upload>
         <div class="text upText" style="margin: 10px 0">
-          支持批量上传 PDF、JPG、JPEG、PNG 格式单个大小不超过 2M
+          支持上传PDF,大小不超过 2M
         </div>
       </nz-form-control>
     </nz-form-item>
   </div>
   <div class="author-content">
-    <div class="title">教材使用情况证明材料</div>
+    <div class="title">4.教材使用情况证明材料(必须上传)</div>
     <div class="text">
       教材出版单位提供教材主要使用高校名单及使用情况证明材料,并加盖公章。
       <!-- <a (click)="downloadFile('专家审查意见表.docx')">下载模板</a> -->
@@ -235,7 +153,8 @@
           证明材料
         </a>
         }
-        <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'evidence')" title="上传PDF"></app-comp-upload>
+        <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'evidence')"
+          title="上传文件"></app-comp-upload>
         <div class="text upText" style="margin: 10px 0">
           支持上传PDF,大小不超过 2M
         </div>
@@ -243,7 +162,68 @@
     </nz-form-item>
   </div>
   <div class="author-content">
-    <div class="title">其他材料</div>
+    <div class="title">5.教材版权信息(必须上传)</div>
+    <nz-form-item class="row" style="margin-bottom: 16px">
+      <nz-form-label class="label" [nzNoColon]="true" [nzSm]="10" [nzXs]="10" nzRequired>版权页截图</nz-form-label>
+      <nz-form-control class="val" nzErrorTip="请上传版权页截图" style="width: 100%">
+        @if (copyrightImgUrl) {
+        <a style="color: #3e49b3;" (click)="openFile(copyrightImgUrl)">
+          <span nz-icon nzType="file" nzTheme="outline"></span>
+          版权页截图
+        </a>
+        }
+        <app-comp-upload [type]="'pdf'" [width]="320" [type]="'pdf'" (change)="upload($event, 'copyrightImgUrl')"
+          title="上传文件"></app-comp-upload>
+
+        <div class="text upText" style="margin: 10px 0">
+          支持上传PDF,大小不超过 2M
+        </div>
+      </nz-form-control>
+    </nz-form-item>
+
+    <nz-form-item class="row" style="margin-bottom: 16px">
+      <nz-form-label class="label" [nzNoColon]="true" [nzSm]="10" [nzXs]="10" nzRequired>中国版本图书馆 CIP
+        查询截图</nz-form-label>
+      <nz-form-control class="val" nzErrorTip="请上传中国版本图书馆 CIP 查询截图" style="width: 100%">
+        @if (CIPImgUrl) {
+        <a style="color: #3e49b3;" (click)="openFile(CIPImgUrl)">
+          <span nz-icon nzType="file" nzTheme="outline"></span>
+          CIP 查询截图
+        </a>
+        }
+        <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'CIPImgUrl')"
+          title="上传文件"></app-comp-upload>
+
+        <div class="text upText" style="margin: 10px 0">
+          支持批量上传 PDF 格式,单个文件大小不超过 2M。
+        </div>
+      </nz-form-control>
+    </nz-form-item>
+
+
+
+    <div class="author-content">
+      <div class="text">如 CIP 数据中无“教材”字样的,须再上传内容提要或前言或后记中可以证明本书为教材的相关内容截图</div>
+      @if (cipProveFile.length>0) {
+      @for (url of cipProveFile; track $index) {
+      <p>
+        <a style="color: #3e49b3;font-size: 14px;" (click)="openFile(url?.url)">
+          <span nz-icon nzType="file" nzTheme="outline"></span>
+          CIP 相关截图 {{$index+1}}
+        </a>
+      </p>
+      }
+      }
+      <app-comp-upload [type]="'pdf'" [width]="320" [maxlenght]="99" (change)="upload($event, 'cipProveFile')"
+        title="上传文件"></app-comp-upload>
+
+      <div class="text upText" style="margin: 10px 0">
+        支持上传PDF,大小不超过 2M
+      </div>
+    </div>
+  </div>
+  <div class="author-content">
+    <div class="title">6.其他材料(可选上传)</div>
     <div class="text">其他佐证材料。</div>
     @if (moreMaterial.length>0) {
     @for (url of moreMaterial; track $index) {
@@ -256,10 +236,10 @@
     }
     }
     <app-comp-upload [type]="'pdf'" [width]="320" [maxlenght]="99" (change)="upload($event, 'moreMaterial')"
-      title="上传PDF"></app-comp-upload>
+      title="上传文件"></app-comp-upload>
 
     <div class="text upText" style="margin: 10px 0">
-      支持上传PDF,大小不超过 2M
+      支持批量上传PDF,大小不超过 2M
     </div>
   </div>
 
@@ -284,7 +264,7 @@
     }
     }
     <app-comp-upload [type]="'pdf'" [width]="320" [maxlenght]="99" (change)="upload($event, 'examine')"
-      title="上传PDF"></app-comp-upload>
+      title="上传文件"></app-comp-upload>
 
     <div class="text upText" style="margin: 10px 0">
       支持上传PDF,大小不超过 2M
@@ -318,7 +298,7 @@
               申报单位承诺意见
             </a>
           }
-          <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'unitMaterial')" title="上传PDF"></app-comp-upload>
+          <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'unitMaterial')" title="上传文件"></app-comp-upload>
           <div class="text upText" style="margin: 10px 0">
             支持上传PDF,大小不超过 2M
           </div>

+ 1 - 1
projects/textbook/src/modules/nav-author/components/attachment/attachment.component.ts

@@ -354,7 +354,7 @@ export class AttachmentComponent implements OnInit {
 
   downloadFile(fileName: string) {
     // let fileName = '十四五”普通高等教育本科国家级规划教材第一次遴选推荐申报表.docx'
-    const fileUrl = `../../../../../public/file/${fileName}`;
+    const fileUrl = `/file/${fileName}`;
     this.http.get(fileUrl, { responseType: 'blob' }).subscribe((blob) => {
       const url = window.URL.createObjectURL(blob);
       const a = document.createElement('a');

+ 4 - 4
projects/textbook/src/modules/nav-author/components/basic-in/basic-in.component.html

@@ -10,12 +10,12 @@
     </nz-form-item>
     <nz-form-item style="margin-bottom: 16px">
       <nz-form-label [nzSm]="8" [nzNoColon]="true" [nzXs]="8" nzRequired>国际标准书号(ISBN)</nz-form-label>
-      <nz-form-control nzErrorTip="请输入国际标准书号" [nzSm]="12" [nzXs]="12">
+      <nz-form-control nzErrorTip="请输入国际标准书号,仅可输入数字" [nzSm]="12" [nzXs]="12">
         <nz-input-group nzSearch [nzAddOnAfter]="autoButton">
-          <input type="text" nz-input formControlName="ISBN" placeholder="请输入国际标准书号" />
+          <input type="number" nz-input formControlName="ISBN" placeholder="请输入国际标准书号,仅可输入数字" />
         </nz-input-group>
         <ng-template #autoButton>
-          <button (click)="autoCompleteByISBN()" nz-button nzType="primary">自动补全</button>
+          <button (click)="autoCompleteByISBN()" nz-button nzType="primary">获取教材信息</button>
         </ng-template>
       </nz-form-control>
     </nz-form-item>
@@ -66,7 +66,7 @@
               <label nz-radio nzValue="全册">全册</label>
               @if (validateForm.value.type =='全册') {
               <nz-input-group style="flex: 1; margin-left: 20px" [nzSuffix]="suffixTemplateInfo">
-                <input min="2" type="number" formControlName="typeNumber" nz-input placeholder="输入册数" />
+                <input min="2"  type="number" [ngModelOptions]="{standalone: true}" [(ngModel)]="typeNumber" (ngModelChange)="typeNumberChange()" nz-input placeholder="输入册数" />
               </nz-input-group>
               <ng-template #suffixTemplateInfo> 册 </ng-template>
               }

+ 25 - 14
projects/textbook/src/modules/nav-author/components/basic-in/basic-in.component.ts

@@ -78,6 +78,14 @@ export class BasicInComponent implements OnInit {
   disabledEditionDate=(current:Date):boolean=>{
     return current< new Date(2022,11,1)
   }
+    /** 全册次数*/
+    typeNumber:number=2
+    typeNumberChange(){
+      if(this.typeNumber<2){
+        this.msg.create('warning','不得小于两册')
+        this.typeNumber=2
+      }
+    }
   validateForm: FormGroup<{
     title: FormControl<string>; //申报教材名称
     ISBN: FormControl<string>; //国际标准书号
@@ -86,7 +94,7 @@ export class BasicInComponent implements OnInit {
     unitType:FormControl<string>//第一主编(作者)单位类型
 
     type: FormControl<string>; //申报类型
-    typeNumber: FormControl<number|any>; //全册次数
+    // typeNumber: FormControl<number|any>; //全册次数
 
     majorPoniter: FormControl<string>; //教材应用对象及所诉学科专业类
     lang: FormControl<string>; //教材主要语种类型
@@ -117,7 +125,7 @@ export class BasicInComponent implements OnInit {
     author: ['', [Validators.required]],
     unit: ['', [Validators.required]],
     type: ['', [Validators.required]],
-    typeNumber: [2],
+    // typeNumber: [2],
     majorPoniter: ['', [Validators.required]],
     lang: ['', [Validators.required]],
     authors: [''],
@@ -238,7 +246,7 @@ export class BasicInComponent implements OnInit {
       code: '否',
     }
   ];
-  
+
   constructor(
     public tbookSer: textbookServer,
     private fb: NonNullableFormBuilder,
@@ -262,6 +270,7 @@ export class BasicInComponent implements OnInit {
     }
  
     this.approvedImgList[0].url = this.eduTextbook.get('approvedImgUrl')
+    this.typeNumber = this.eduTextbook?.get('typeNumber') || 2
     // console.log(this.approvedImgList)
     console.log(this.eduTextbook);
     this.validateForm = this.fb.group({
@@ -270,7 +279,7 @@ export class BasicInComponent implements OnInit {
       author: [this.eduTextbook?.get('author') || '', [Validators.required]],
       unit: [this.eduTextbook?.get('unit') || '', [Validators.required]],
       type: [this.eduTextbook?.get('type') || '', [Validators.required]],
-      typeNumber: [this.eduTextbook?.get('typeNumber') || 2],
+      // typeNumber: [this.eduTextbook?.get('typeNumber') || 2],
   
       majorPoniter: [this.eduTextbook?.get('majorPoniter') || '', [Validators.required]],
       lang: [this.eduTextbook?.get('lang') || '', [Validators.required]],
@@ -308,14 +317,14 @@ export class BasicInComponent implements OnInit {
     this.validateForm.controls.importantProjectOther.updateValueAndValidity();
     
     //校验全册册数是否需填
-    if (this.validateForm.value.type == '单册') {
-      this.validateForm.controls.typeNumber.clearValidators();
-      this.validateForm.controls.typeNumber.markAsPristine();
-    } else {
-      this.validateForm.controls.typeNumber.setValidators(Validators.required);
-      this.validateForm.controls.typeNumber.markAsDirty();
-    }
-    this.validateForm.controls.typeNumber.updateValueAndValidity();
+    // if (this.validateForm.value.type == '单册') {
+    //   this.validateForm.controls.typeNumber.clearValidators();
+    //   this.validateForm.controls.typeNumber.markAsPristine();
+    // } else {
+    //   this.validateForm.controls.typeNumber.setValidators(Validators.required);
+    //   this.validateForm.controls.typeNumber.markAsDirty();
+    // }
+    // this.validateForm.controls.typeNumber.updateValueAndValidity();
 
     //校验教材获批截图是否需填
     if (!this.validateForm.value.approval || this.validateForm.value.approval == '否') {
@@ -335,9 +344,10 @@ export class BasicInComponent implements OnInit {
     if(type=='approvedImgUrl'){
       this.validateForm.value[type] = file?.url
     }
+    console.log(this.validateForm.value)
   }
   async submitForm(event?: string): Promise<void> {
-    this.required()
+    // this.required()
     console.log(this.validateForm.value);
     console.log(this.validateForm.valid);
     if (this.validateForm.valid) {
@@ -408,7 +418,8 @@ export class BasicInComponent implements OnInit {
     this.eduTextbook?.set('author', params.author);
     this.eduTextbook?.set('unit', params.unit);
     this.eduTextbook?.set('type', params.type);
-    this.eduTextbook?.set('typeNumber', params.typeNumber);
+    // this.eduTextbook?.set('typeNumber', params.typeNumber);
+    this.eduTextbook?.set('typeNumber', this.typeNumber);
     this.eduTextbook?.set('majorPoniter', params.majorPoniter);
     this.eduTextbook?.set('lang', params.lang);
     this.eduTextbook?.set('authors', params.authors);

+ 74 - 0
projects/textbook/src/modules/nav-author/components/faith/faith.component.html

@@ -0,0 +1,74 @@
+<div class="entry">
+
+
+
+  <!-- <div class="author-content">
+      <div class="nav"><b>申报单位承诺意见</b></div>
+      <div class="text">
+        作者 /
+        主编所在高校主管领导或出版单位主管领导在申报单位承诺意见表格签字并加盖高校
+        / 出版单位公章后上传此项。<a (click)="downloadFile('申报单位承诺意见.docx')">下载模板</a>
+      </div>
+      <nz-form-item class="row" style="margin-bottom: 16px">
+        <nz-form-label class="label" [nzNoColon]="true" [nzSm]="16" [nzXs]="16" nzRequired>申报单位承诺意见材料</nz-form-label>
+        <nz-form-control class="val" nzErrorTip="请上传申报单位承诺意见材料" style="width: 450px">
+          @if (unitMaterial?.url) {
+            <a style="color: #3e49b3;" (click)="openFile(unitMaterial?.url)">
+              <span nz-icon nzType="file" nzTheme="outline"></span>
+              申报单位承诺意见
+            </a>
+          }
+          <app-comp-upload [type]="'pdf'" [width]="320" (change)="upload($event, 'unitMaterial')" title="上传PDF"></app-comp-upload>
+          <div class="text upText" style="margin: 10px 0">
+            支持上传PDF,大小不超过 2M
+          </div>
+        </nz-form-control>
+      </nz-form-item>
+    </div> -->
+
+    <div class="author-content">
+      <div class="nav"><b>教材作者诚信承诺</b></div>
+      <div class="text">
+        请输入承诺内容,导出函报文件后加入所有作者签名(或电子签名):本人自愿参加此次申报,已认真填写并检查以上材料,保证内容真实。
+      </div>
+      <input nz-input placeholder="请输入诚信承诺内容" [(ngModel)]="value" type="number" />
+
+    </div>
+
+
+  <div class="author-content">
+    <div class="nav"><b>申报单位承诺意见</b></div>
+    <div class="text">
+      高校主管领导输入以下承诺:已对教材有关信息及填报的内容进行核实,保证真实性。经对该教材评审评价,同意该教材申报。并在导出函报文件后签字加盖高校公章;
+      <br> 出版单位主管领导输入以下承诺:已核实该教材未通过其他渠道申报,
+      对教材有关信息及填报的内容进行了核实,保证真实性。经对该教材评审评价,同意该教材申报。并在导出函报文件后签字加盖出版单位公章。
+      <a (click)="downloadFile('申报单位承诺意见.docx')">下载模板</a>
+    </div>
+    <form nz-form [formGroup]="form" nzLayout="vertical">
+      <nz-form-item>
+        <nz-form-control>
+          <nz-textarea-count [nzMaxCharacterCount]="200">
+            <textarea maxlength="200" rows="4" formControlName="comment" nz-input></textarea>
+          </nz-textarea-count>
+        </nz-form-control>
+      </nz-form-item>
+    </form>
+  </div>
+
+
+
+
+
+
+</div>
+<div class="footer">
+  <button nz-button nzType="default" style="margin-right: 20px" (click)="submitForm('save')">
+    保存本页
+  </button>
+  <button nz-button nzType="default" style="margin-right: 20px" (click)="submitForm('pre')">
+    上一页
+  </button>
+  <button nz-button nzType="primary" style="background: #3e49b3; border: 1px #3e49b3" (click)="submitForm('next')">
+    下一页
+  </button>
+</div>

+ 63 - 0
projects/textbook/src/modules/nav-author/components/faith/faith.component.scss

@@ -0,0 +1,63 @@
+.entry{
+    min-height: 500px;
+    font-family: PingFang SC;
+    .row{
+      display: flex;
+      flex-direction: column;
+      align-items: start;
+      width: 100%;
+      .label{
+        margin: 10px 0 6px;
+      }
+      .val{
+        min-height: auto;
+      }
+    }
+    .author-content{
+      .edit-icon{
+        color:#756B6D;
+      }
+      .nav{
+        font-family: PingFang SC;
+        font-size: 20px;
+        font-weight: 500;
+        line-height: 28px;
+        text-align: left;
+        margin: 20px 0 10px;
+      }
+      .title{
+        font-family: PingFang SC;
+        font-size: 16px;
+        font-weight: 600;
+        line-height: 22px;
+        text-align: left;
+        margin: 10px 0;
+      }
+      .text{
+        font-family: PingFang SC;
+        font-size: 14px;
+        font-weight: 400;
+        line-height: 22px;
+        text-align: left;
+      }
+    }
+    .tips{
+      margin-top: 10px;
+      padding: 10px;
+      background: #3e49b314;
+      border-radius: 6px;
+    }
+  
+  }
+  .footer{
+    display: flex;
+    margin: 10px auto;
+    align-items: center;
+    justify-content: space-evenly;
+    // width: 200px;
+    justify-content: end;
+    // padding-right: 100px;
+  }
+  .upText{
+    color: gray;
+  }

+ 24 - 0
projects/textbook/src/modules/nav-author/components/faith/faith.component.spec.ts

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

+ 163 - 0
projects/textbook/src/modules/nav-author/components/faith/faith.component.ts

@@ -0,0 +1,163 @@
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
+import { CommonCompModule } from '../../../../services/common.modules';
+import { NzSelectModule } from 'ng-zorro-antd/select';
+import { ReactiveFormsModule } from '@angular/forms';
+import { NzRadioModule } from 'ng-zorro-antd/radio';
+import { NzMessageService } from 'ng-zorro-antd/message';
+import { NzGridModule } from 'ng-zorro-antd/grid';
+import { NzCheckboxModule } from 'ng-zorro-antd/checkbox';
+import { NzTableModule } from 'ng-zorro-antd/table';
+import { NzUploadChangeParam } from 'ng-zorro-antd/upload';
+import { NzUploadModule } from 'ng-zorro-antd/upload';
+import { NzModalService } from 'ng-zorro-antd/modal';
+import Parse from 'parse';
+import { CompUploadComponent } from '../../../../app/comp-upload/comp-upload.component';
+import { DatePipe } from '@angular/common';
+import {
+  FormControl,
+  FormGroup,
+  NonNullableFormBuilder,
+  Validators,
+  ValidatorFn,
+  AbstractControl,
+} from '@angular/forms';
+import { textbookServer } from '../../../../services/textbook';
+import * as eduTextBook from '../../../../services/EduTextbook'
+import { HttpClient } from '@angular/common/http';
+import { Router } from '@angular/router'
+import { FormBuilder} from '@angular/forms';
+
+
+
+@Component({
+  imports: [
+    CommonCompModule,
+    ReactiveFormsModule,
+    NzSelectModule,
+    NzRadioModule,
+    NzGridModule,
+    NzCheckboxModule,
+    NzTableModule,
+    NzUploadModule,
+    CompUploadComponent,DatePipe
+  ],
+  standalone: true,
+  selector: 'app-faith',
+  templateUrl: './faith.component.html',
+  styleUrls: ['./faith.component.scss'],
+  providers: [DatePipe],
+})
+export class FaithComponent  implements OnInit {
+
+
+  @Input('eduTextbook') eduTextbook: any;
+  @Input('maxWidth') maxWidth: number = 0;
+  @Output() state: EventEmitter<any> = new EventEmitter<any>();
+  @Output() save: EventEmitter<any> = new EventEmitter<any>();
+
+  
+  /**申报单位承诺意见 */
+  unitMaterial: any = {
+    name: '',
+    url: '',
+  }
+  constructor(
+    public tbookSer: textbookServer,
+    private msg: NzMessageService,
+    private modal: NzModalService,
+    private http: HttpClient,
+    private router: Router,
+    private formBuilder: FormBuilder
+  ) { }
+  ngOnInit() {
+    if (this.eduTextbook.id) {
+      this.unitMaterial = this.eduTextbook?.get('unitMaterial') || this.unitMaterial
+    }
+  }
+  value:string=''
+
+
+  async submitForm(event?: string): Promise<void> {
+    let params = {
+      unitMaterial: this.unitMaterial,
+    }
+    if (event == 'pre') {//上一步
+      this.state.emit({ type: 'pre' });
+      return;
+    }
+    await this.saveEduTextbook(params);
+    if(event == 'next'){
+      this.state.emit({type:'next',textBook:this.eduTextbook});
+    }
+    else if (event == 'save') {
+      this.modal.success({
+        nzTitle: '保存成功',
+        nzContent: '<p>已保存并且至空间</p>',
+        nzOnOk: () => console.log('Info OK'),
+      });
+      return;
+    }
+  }
+
+  async saveEduTextbook(params: any) {
+    if (!this.eduTextbook) {
+      this.msg.error('请先创建教材');
+      return;
+    }
+    this.eduTextbook?.set('user', Parse.User.current()?.toPointer());
+    this.eduTextbook?.set('company', {
+      __type: 'Pointer',
+      className: 'Company',
+      objectId: this.tbookSer.company,
+    });
+    params.unitMaterial &&
+      this.eduTextbook?.set('unitMaterial', params.unitMaterial);
+    await this.eduTextbook?.save();
+    return;
+  }
+  upload(e: any, type: string, index?: any) {
+    let file = e[(e?.length - 1) || 0];
+    if(type=='unitMaterial'){
+      this[type].url = file?.url
+      this[type].name = file?.name
+    }
+  }
+
+
+
+  /**获取文件名 */
+  getFileName(url: string) {
+    if (!url) return ''
+    let str = url?.split('/')[5]
+    let index = str?.indexOf('-')
+    let result = decodeURIComponent(str?.substring(index + 1))
+    return result || '未知文件名'
+  }
+
+  downloadFile(fileName: string) {
+    // let fileName = '十四五”普通高等教育本科国家级规划教材第一次遴选推荐申报表.docx'
+    const fileUrl = `../../../../../public/file/${fileName}`;
+    this.http.get(fileUrl, { responseType: 'blob' }).subscribe((blob) => {
+      const url = window.URL.createObjectURL(blob);
+      const a = document.createElement('a');
+      a.href = url;
+      a.download = fileName;
+      document.body.appendChild(a);
+      a.click();
+      document.body.removeChild(a);
+      window.URL.revokeObjectURL(url);
+    })
+  }
+  openFile(url: string) {
+    console.log(url);
+    window.open(url)
+  }
+
+
+  form: FormGroup<{
+    comment: FormControl<string | null>;
+  }> = this.formBuilder.group({
+    comment: ['', [Validators.maxLength(100)]]
+  });
+
+}

+ 1 - 1
server/cloud/tbook/func-tbook-export.js

@@ -299,7 +299,7 @@ function renderReportDocsByTextbook(textbook){
         currentY:currentYear,
         currentM:currentMonth,
         currentNum:json?.editionNumber || "",
-        printSum:json?.printSum || "",
+        printSum:json?.printSum?json?.printSum+"万":"" || "",
         isBGJ:circleCheck[(importantProject?.indexOf("本科国家")>-1)?1:0],
         isBSYX:circleCheck[(importantProject?.indexOf("省级优秀")>-1)?1:0],
         isBSGH:circleCheck[(importantProject?.indexOf("省级规划")>-1)?1:0],

二進制
server/cloud/tbook/template/模板-推荐申报表.docx