Browse Source

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

ryanemax 6 months ago
parent
commit
bb35643edd

+ 49 - 10
projects/textbook/src/app/comp-upload/comp-upload.component.ts

@@ -6,11 +6,13 @@ import { NzUploadChangeParam, NzUploadFile } from 'ng-zorro-antd/upload';
 import { ProvierOssAli } from './provider-oss-aliyun';
 import { NzImageService } from 'ng-zorro-antd/image';
 import { NzImageModule } from 'ng-zorro-antd/image';
+import { NzNotificationModule } from 'ng-zorro-antd/notification';
+import { NzNotificationService } from 'ng-zorro-antd/notification';
 
 @Component({
   selector: 'app-comp-upload',
   standalone: true,
-  imports: [NzUploadModule, CommonCompModule, NzImageModule],
+  imports: [NzUploadModule, CommonCompModule, NzImageModule,NzNotificationModule],
   templateUrl: './comp-upload.component.html',
   styleUrls: ['./comp-upload.component.scss'],
 })
@@ -56,11 +58,12 @@ export class CompUploadComponent implements OnInit {
   Previewfilelist: any;
   ossProvider: { upload: any } | undefined;
 
-  disabled:boolean = false
+  disabled: boolean = false
 
   constructor(
     private msg: NzMessageService,
-    private nzImageService: NzImageService
+    private nzImageService: NzImageService,
+    private notification: NzNotificationService
   ) {
     this.ossProvider = new ProvierOssAli();
   }
@@ -78,9 +81,13 @@ export class CompUploadComponent implements OnInit {
   }
   async handleChange(info: NzUploadChangeParam) {
     console.log(info);
-    if(info.type == 'removed'){
+    if (info.type == 'removed') {
       return
     }
+    let isEncrypt = await this.isEncrypt(info)
+    // if (isEncrypt) {
+    //   return
+    // }
     this.disabled = true
     if (info.file.status !== 'uploading') {
       // 选择文件后,自动开始上传
@@ -93,7 +100,7 @@ export class CompUploadComponent implements OnInit {
         };
         return f;
       })
-      
+
       let fileList = [...this.fileList, ...nowUploadFiles];
       this.fileList = fileList.slice(-this.maxlenght);
       // fileList = fileList.map((file) => {
@@ -106,7 +113,6 @@ export class CompUploadComponent implements OnInit {
 
       this.Previewfilelist = [...this.fileList];
       // this.ossFileList = ossFileList;
-
       this.change.emit(this.fileList);
       this.disabled = false
     }
@@ -127,7 +133,7 @@ export class CompUploadComponent implements OnInit {
         let ossFile;
         try {
           ossFile = await this.ossProvider?.upload(file?.originFileObj);
-        } catch (err) {}
+        } catch (err) { }
         if (ossFile) {
           ossFile.locaname = file.name;
           ossFileList.push(ossFile);
@@ -136,10 +142,10 @@ export class CompUploadComponent implements OnInit {
     }
     return ossFileList;
   }
-  onRemove = (e: any):boolean =>{
+  onRemove = (e: any): boolean => {
     console.log(e);
-    let i =  this.fileList.findIndex((item:any)=> item.url == e?.url)
-    this.fileList.splice(i,1)
+    let i = this.fileList.findIndex((item: any) => item.url == e?.url)
+    this.fileList.splice(i, 1)
     this.change.emit(this.fileList);
     return false
   }
@@ -156,4 +162,37 @@ export class CompUploadComponent implements OnInit {
       this.nzImageService.preview([{ src: url }], { nzZoom: 1, nzRotate: 0 });
     }
   };
+  timeOut: any
+  /**判断pdf文件是否加密 */
+  isEncrypt(info: NzUploadChangeParam): Promise<boolean> {//只查file,不查fileList
+    return new Promise((resolve) => {
+      let isEncrypt: boolean = false
+      if (info.file.originFileObj) {
+        let reader = new FileReader()
+        let file = info.file.originFileObj
+        reader.readAsArrayBuffer(file)
+        reader.onload = () => {
+          if (reader.result) {
+            let files = new Blob([reader.result], { type: 'application/pdf' })
+            files.text().then(x => {
+              isEncrypt = x.substring(x.lastIndexOf("<<"), x.lastIndexOf(">>")).includes("/Encrypt")
+              if (isEncrypt) {
+                clearTimeout(this.timeOut)
+                this.timeOut = setTimeout(() => {
+                  this.notification.create(
+                    'error',
+                    '请勿上传加密文件',
+                    `${file.name} 为加密文件,影响导出,请替换。`,
+                    { nzDuration: 0 }
+                  );
+
+                }, 1000);
+              }
+              resolve(isEncrypt)
+            })
+          } else { resolve(false) }
+        }
+      } else { resolve(false) }
+    })
+  }
 }

+ 10 - 3
projects/textbook/src/modules/nav-admin/components/collect-textbook/collect-textbook.component.html

@@ -40,8 +40,11 @@
         <th nzEllipsis nzWidth="120px">ISBN</th>
         <th nzEllipsis nzWidth="120px">出版单位</th>
         <th nzEllipsis nzWidth="120px">出版单位联系人</th>
+        @if (!eduProcess?.id) {
+          <th nzEllipsis nzWidth="120px">申报部门</th>
+        }
         <th nzEllipsis nzWidth="80px" nzAlign="center">文件状态</th>
-        <th nzEllipsis nzWidth="80px" nzAlign="center" nzRight>操作</th>
+        <th nzEllipsis nzWidth="100px" nzAlign="center" nzRight>操作</th>
       </tr>
     </thead>
     @if (textbookList.length > 0) {
@@ -109,14 +112,18 @@
             </div>
           </ng-template>
         </td>
+        @if (!eduProcess?.id) {
+          <td nzEllipsis>{{data?.get('department')?.get('name')}}</td>
+        }
         <td nzEllipsis nzAlign="center">
           <span [style.color]="statusMap[data.id].color">{{
             statusMap[data.id].status
           }}</span>
         </td>
-        <td nzEllipsis nzRight nzAlign="center">
+        <td nzEllipsis nzRight nzAlign="left">
           @if (statusMap[data.id].btn == '查看') {
-          <a nz-button nzType="link" (click)="onReview(data)"> 查看</a>
+          <a nz-button nzType="link" (click)="onReview(data)">查看</a>
+          <a nz-button nzType="link" style="color:#c6233f;" (click)="onReject(data)">退回</a>
           }@else {
           <a nz-button nzType="link" (click)="onEmitMsg(data)">提醒</a>
           }

+ 32 - 2
projects/textbook/src/modules/nav-admin/components/collect-textbook/collect-textbook.component.ts

@@ -139,13 +139,13 @@ export class CollectTextbookComponent implements OnInit {
         },
       };
       let query = Parse.Query.fromJSON('EduTextbook', queryParams);
-      query.equalTo('eduProcess', this.eduProcess?.id);
+      this.eduProcess?.id && query.equalTo('eduProcess', this.eduProcess?.id);
       query.descending('updatedAt');
       query.notEqualTo('isDeleted', true);
       query.equalTo('status', '400');
       query.equalTo('recommend', true);
       query.notEqualTo('discard', true);
-      query.include('childrens');
+      query.include('childrens','department.name');
       this.count = await query.count();
       query.limit(this.limit);
       query.skip(this.limit * (this.pageIndex - 1));
@@ -307,4 +307,34 @@ export class CollectTextbookComponent implements OnInit {
     this.msg.success('设置成功');
     this.showModal = false;
   }
+
+  /* 退回 */
+  onReject(data:Parse.Object){
+    console.log(data);
+    this.modal.confirm({
+      nzTitle: '是否退回文件?',
+      nzContent: '退回后,工作联系人将需要重新提交文件。',
+      nzOkText: '确定',
+      nzOkType: 'primary',
+      nzOkDanger: true,
+      nzOnOk:async () => {
+        console.log('OK')
+        let rejectPromiseList = data.get('childrens').map((volume: any) => {
+          return new Promise((resolve) => {
+            volume?.set('collectStatus','100')
+            volume?.save().then(()=>  resolve(true))
+          })
+        })
+        await Promise.all(rejectPromiseList);
+        this.statusMap[data.id] = {
+          status: '待上传',
+          color: '#1890ff',
+          btn: '提醒',
+        };
+        this.msg.success('已退回')
+      },
+      nzCancelText: '取消',
+      nzOnCancel: () => console.log('Cancel')
+    });
+  }
 }

+ 3 - 3
projects/textbook/src/modules/nav-admin/page-process/page-process.component.html

@@ -14,7 +14,7 @@
       在流程中邀请作者、高校联系人、评审员登录系统,创建并提交教材,由工作联系人评审、提交推荐教材完成流程工作
     </div>
   </nz-page-header-title>
-  @if (active == 2) {
+  @if (eduProcess?.get('status') == '400') {
   <nz-page-header-extra>
     <nz-space>
       <button
@@ -47,12 +47,12 @@
     </nz-tab>
 
     <nz-tab nzTitle="教材文件">
-      @if (active == 2) {
+      <!-- @if (active == 2) { -->
       <app-collect-textbook
         #collect
         [eduProcess]="eduProcess"
       ></app-collect-textbook>
-      }
+      <!-- } -->
     </nz-tab>
   </nz-tabset>
 </div>

+ 10 - 4
projects/textbook/src/modules/nav-admin/page-textbook/page-textbook.component.html

@@ -3,11 +3,17 @@
   <nz-page-header-title
     >全部教材
     <br />
-    <div class="subtitle">
-      查看全部申报流程所提交的教材推荐表
-    </div>
+    <div class="subtitle">查看全部申报流程所提交的教材推荐表</div>
   </nz-page-header-title>
 </nz-page-header>
 <div class="conetent">
-  <app-textbook [filterObj]="filterObj"></app-textbook>
+  <nz-tabset [(nzSelectedIndex)]="active">
+    <nz-tab nzTitle="教材列表">
+      <app-textbook [filterObj]="filterObj"></app-textbook>
+    </nz-tab>
+    <nz-tab nzTitle="教材文件">
+      <app-collect-textbook
+    ></app-collect-textbook>
+    </nz-tab>
+  </nz-tabset>
 </div>

+ 17 - 0
projects/textbook/src/modules/nav-admin/page-textbook/page-textbook.component.scss

@@ -11,4 +11,21 @@
 .conetent{
   margin: 0 0 20px;
   padding: 0 24px;
+  height: calc(100vh - 250px);
+}
+
+::ng-deep .ant-page-header-heading-title{
+  white-space: normal;
+}
+::ng-deep .ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn{
+  color: #c6233f;
+}
+::ng-deep .ant-tabs-ink-bar{
+  background: #c6233f;
+}
+::ng-deep .ant-tabs-tab:hover{
+  color: #e97488;
+}
+::ng-deep .ant-tabs-tab-btn:active{
+  color: #e97488;
 }

+ 8 - 0
projects/textbook/src/modules/nav-admin/page-textbook/page-textbook.component.ts

@@ -7,6 +7,10 @@ import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb';
 import * as Parse from 'parse';
 import { CommonModule } from '@angular/common';
 import { TextbookComponent } from '../../../app/textbook/textbook.component';
+import { NzTabsModule } from 'ng-zorro-antd/tabs';
+import { CollectTextbookComponent } from '../components/collect-textbook/collect-textbook.component';
+
+
 @Component({
   selector: 'app-page-textbook',
   templateUrl: './page-textbook.component.html',
@@ -18,6 +22,8 @@ import { TextbookComponent } from '../../../app/textbook/textbook.component';
     NzPageHeaderModule,
     NzBreadCrumbModule,
     TextbookComponent,
+    CollectTextbookComponent,
+    NzTabsModule
   ],
   standalone: true,
 })
@@ -37,6 +43,8 @@ export class PageTextbookComponent implements OnInit {
     status: ['400'],
     btns: {review:true},
   };
+  active: number = 0;
+
   constructor(
     private router: Router,
     private activeRoute: ActivatedRoute // private translate:TranslateService,

+ 1 - 1
projects/textbook/src/modules/nav-province-contact/collect-file/collect-file.component.html

@@ -137,7 +137,7 @@
       @if (currentTextbook?.get('type')=='全册') {
       <nz-collapse [nzBordered]="false">
         @for (panel of currentTextbook?.get('childrens'); track panel) { @if
-          (panel?.get('editionUnit') == this.eduProcess?.get('name')) {
+          (panel?.get('editionUnit') == tbookSer.profile.user?.department?.name) {
         <nz-collapse-panel
           #p
           [nzHeader]="title"

+ 34 - 12
projects/textbook/src/modules/nav-province-contact/collect-file/collect-file.component.ts

@@ -40,7 +40,7 @@ import { NzCollapseModule } from 'ng-zorro-antd/collapse';
 })
 export class CollectFileComponent implements OnInit {
   textbookList: Array<Parse.Object> = [];
-  eduProcess?: Parse.Object; //流程
+  // eduProcess?: Parse.Object; //流程
   count: number = 0;
 
   limit: number = 10;
@@ -91,8 +91,8 @@ export class CollectFileComponent implements OnInit {
   ) {}
 
   async ngOnInit() {
-    await this.getEduProcess();
-    if(!this.eduProcess?.id) return
+    // await this.getEduProcess();
+    if(!this.tbookSer.profile.user?.department?.name) return
     this.getTextbook();
   }
   async getEduProcess() {
@@ -102,7 +102,7 @@ export class CollectFileComponent implements OnInit {
     query.containedIn('status', ['400']);
     let r = await query.first();
     console.log(r);
-    this.eduProcess = r;
+    // this.eduProcess = r;
   }
 
   async getTextbook(val?: string): Promise<any[] | void> {
@@ -136,12 +136,32 @@ export class CollectFileComponent implements OnInit {
           childrens: {
             $inQuery: {
               where: {
-                editionUnit: this.eduProcess?.get('name'),
+                editionUnit: this.tbookSer.profile.user?.department?.name,
                 // editionUnit: '高等教育出版社',
               },
               className: 'EduTextbookVolume',
             },
           },
+          eduProcess:{
+            $inQuery: {
+              where: {
+                status: '400',
+                collectStartData:{
+                  $lt:{
+                    "__type": "Date",
+                    "iso": new Date()
+                  },
+                },
+                collectEndData:{
+                  $gt:{
+                    "__type": "Date",
+                    "iso": new Date()
+                  },
+                }
+              },
+              className: 'EduProcess',
+            },
+          }
         },
       };
       let query = Parse.Query.fromJSON('EduTextbook', queryParams);
@@ -153,6 +173,8 @@ export class CollectFileComponent implements OnInit {
       query.include(
         'childrens',
         'eduProcess.profileSubmitted.user',
+        'eduProcess.collectStartData',
+        'eduProcess.collectEndData',
         'department'
       );
       this.count = await query.count();
@@ -169,7 +191,7 @@ export class CollectFileComponent implements OnInit {
         //是否保存
         let isSave = item?.get('childrens').some((child: Parse.Object) => {
           return (
-            this.eduProcess?.get('name') == child?.get('editionUnit') &&
+            this.tbookSer.profile.user?.department?.name == child?.get('editionUnit') &&
             child?.get('collectStatus') == '100'
           );
         });
@@ -184,8 +206,8 @@ export class CollectFileComponent implements OnInit {
         //是否提交
         let isSbmit = item?.get('childrens').every((child: Parse.Object) => {
           return (
-            this.eduProcess?.get('name') != child?.get('editionUnit') ||
-            (this.eduProcess?.get('name') == child?.get('editionUnit') &&
+            this.tbookSer.profile.user?.department?.name != child?.get('editionUnit') ||
+            (this.tbookSer.profile.user?.department?.name == child?.get('editionUnit') &&
               child?.get('collectStatus') == '200')
           );
         });
@@ -238,10 +260,10 @@ export class CollectFileComponent implements OnInit {
   //打开上传弹窗
   onEditModal(data: Parse.Object) {
     if (
-      !this.eduProcess?.get('collectStartData') ||
-      !this.eduProcess?.get('collectEndData') ||
-      this.eduProcess?.get('collectStartData') > new Date() ||
-      this.eduProcess?.get('collectEndData') < new Date()
+      !data.get('eduProcess')?.get('collectStartData') ||
+      !data.get('eduProcess')?.get('collectEndData') ||
+      data.get('eduProcess')?.get('collectStartData') > new Date() ||
+      data.get('eduProcess')?.get('collectEndData') < new Date()
     ) {
       this.msg.warning('非收集文件工作期内');
       return;