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 { FormControl, FormGroup, NonNullableFormBuilder, Validators, ValidatorFn, AbstractControl, } from '@angular/forms'; import { textbookServer } from '../../../../services/textbook'; import * as eduTextBook from '../../../../services/EduTextbook' @Component({ selector: 'app-attachment', imports: [ CommonCompModule, ReactiveFormsModule, NzSelectModule, NzRadioModule, NzGridModule, NzCheckboxModule, NzTableModule, NzUploadModule, CompUploadComponent, ], standalone: true, templateUrl: './attachment.component.html', styleUrls: ['./attachment.component.scss'], }) export class AttachmentComponent implements OnInit { @Input('eduTextbook') eduTextbook: any; @Input('maxWidth') maxWidth: number = 0; @Output() state: EventEmitter = new EventEmitter(); @Output() save: EventEmitter = new EventEmitter(); //填写诚信承诺是否正确 confirmationValidator: ValidatorFn = ( control: AbstractControl ): { [s: string]: boolean } => { if ( control.value != '本人自愿参加此次申报,已认真填写并检查以上材料,保证内容真实' ) { return { required: true }; } return {}; }; /** 版权页截图*/ copyrightImgUrl: string = '' /** 中国版本图书馆CIP查询截图*/ CIPImgUrl: string = '' /**图书编校质量自查结果记录表 */ selfResults: any = { name: '', url: '', } /** 专家审核意见表*/ expertOpinion: any = { name: '', url: '', } /** 教材使用情况证明材料*/ evidence: any = { name: '', url: '', } /**其他材料 {name: '',url: '',} */ moreMaterial: Array = [] /**申报单位承诺意见 */ unitMaterial: any = { name: '', url: '', } constructor( public tbookSer: textbookServer, private msg: NzMessageService, private modal: NzModalService ) { } ngOnInit() { if (this.eduTextbook.id) { this.copyrightImgUrl = this.eduTextbook?.get('copyrightImgUrl') || this.copyrightImgUrl this.CIPImgUrl = this.eduTextbook?.get('CIPImgUrl') || this.CIPImgUrl this.selfResults = this.eduTextbook?.get('selfResults') || this.selfResults this.expertOpinion = this.eduTextbook?.get('expertOpinion') || this.expertOpinion this.evidence = this.eduTextbook?.get('evidence') || this.evidence this.moreMaterial = this.eduTextbook?.get('moreMaterial') || this.moreMaterial this.unitMaterial = this.eduTextbook?.get('unitMaterial') || this.unitMaterial } console.log( 'copyrightImgUrl',this.copyrightImgUrl, 'CIPImgUrl',this.CIPImgUrl, 'selfResults',this.selfResults, 'expertOpinion',this.expertOpinion, 'evidence',this.evidence, 'moreMaterial',this.moreMaterial, 'unitMaterial',this.unitMaterial) } /**本页必填是否存在空项 */ examineNull() { let isNull = false let msgList = [] if (this.copyrightImgUrl == '' || !this.copyrightImgUrl) { msgList.push('版权页截图') isNull = true } if (this.CIPImgUrl == '' || !this.CIPImgUrl) { msgList.push('CIP查询截图') isNull = true } if (this.selfResults.url == '' || !this.selfResults.url) { msgList.push('自查结果记录表') isNull = true } if (this.expertOpinion.url == '' || !this.expertOpinion.url) { msgList.push('专家审核意见表') isNull = true } if (this.evidence.url == '' || !this.evidence.url) { msgList.push('证明材料') isNull = true } if (this.moreMaterial?.length > 0) { let isExist = this.moreMaterial.every(item => item?.url == '' || !item?.url) if (isExist) { msgList.push('其他材料') isNull = true } } if (this.unitMaterial.url == '' || !this.unitMaterial.url) { msgList.push('申报单位承诺意见') isNull = true } if (isNull) { this.msg.create('error', `请上传完整 ${msgList.join()}`) } return isNull } /**判断是否存在未填字段 */ isIgnoreFiledNull() { let selectList = this.eduTextbook?.get('characteristic') let check = false for(let i in selectList){ if(selectList[i].label=='通识课'||selectList[i].label=='公共基础课'||selectList[i].label=='专业课'){ if(selectList[i].checked) { check=true break; } } } if(!check){ this.msg.create('warning','请返回选择适用课程性质') return } let eduColumn = eduTextBook.EduTextbook.fields let ignoreFiled = [ 'typeNumber', 'code','editionNumber', 'importantProjectOther', 'textbookFiles', 'createdAt', 'updatedAt', 'copyright', 'authorSign', 'CIP', 'isDeleted', 'opinions', 'printNumber', 'printSum', 'render', 'importantProject', 'importantProjectOther', 'complete', 'links', 'recommend', 'printSun', 'discard', 'edition', 'eduProcess', 'authors', 'editor', 'copyrightImgUrl', 'CIPImgurl', 'selfResults', 'expertOpinion', 'evidence', 'moreMaterial', 'unitMaterial','approvedImgUrl','department' ] //非必填字段 let textBookJson = this.eduTextbook.toJSON() let isVrifly = Object.keys(eduColumn).some((item: string) => { if (!ignoreFiled.includes(item) && (textBookJson[item] === '' || textBookJson[item] === undefined || textBookJson[item] === null)) { console.warn('字段未填写:' + item) return true } return }) if (isVrifly) { this.msg.warning('存在未填项') return true } else { return false } } async submitForm(event?: string): Promise { let params = { copyrightImgUrl: this.copyrightImgUrl, CIPImgUrl: this.CIPImgUrl, selfResults: this.selfResults, expertOpinion: this.expertOpinion, evidence: this.evidence, moreMaterial: this.moreMaterial, unitMaterial: this.unitMaterial, } await this.saveEduTextbook(params, true); if (event == 'pre') {//上一步 this.state.emit({ type: 'pre' }); return; } if (event == 'complete') { let isPageNull = this.examineNull()//检查本页空项 if (isPageNull) return let isIgnoreFiled = this.isIgnoreFiledNull()//检查数据空项 if (isIgnoreFiled) return this.state.emit({ type: 'complete', textBook: this.eduTextbook }); this.eduTextbook.set('complete', true) this.eduTextbook.set('status', '102') await this.eduTextbook.save() this.msg.success('已填写完成') } else if (event == 'save') { this.modal.success({ nzTitle: '保存成功', nzContent: '

已保存并且至空间

', nzOnOk: () => console.log('Info OK'), }); return; } } async saveEduTextbook(params: any, isComplete: boolean) { console.log(params); if (!this.eduTextbook) { this.msg.error('请先创建教材'); return; } //如果填写未完整,仅保存,状态修改待完善101 if (this.eduTextbook.get('status') == '102' && !isComplete) { this.eduTextbook?.set('status', '101'); } else if (!this.eduTextbook.get('status')) { this.eduTextbook?.set('status', '101'); } this.eduTextbook?.set('user', Parse.User.current()?.toPointer()); this.eduTextbook?.set('company', { __type: 'Pointer', className: 'Company', objectId: this.tbookSer.company, }); params.selfResults && this.eduTextbook?.set('selfResults', params.selfResults); params.unitMaterial && this.eduTextbook?.set('unitMaterial', params.unitMaterial); params.expertOpinion && this.eduTextbook?.set('expertOpinion', params.expertOpinion); params.evidence && this.eduTextbook?.set('evidence', params.evidence); params.moreMaterial && this.eduTextbook?.set('moreMaterial', params.moreMaterial); this.eduTextbook?.set('copyrightImgUrl', params.copyrightImgUrl); this.eduTextbook?.set('CIPImgUrl', params.CIPImgUrl); await this.eduTextbook?.save(); return; } upload(e: any, type: string) { console.log(e); let file = e[0]; if (type == 'copyrightImgUrl' || type == 'CIPImgUrl') { this[type] = file?.url } else if (type == 'selfResults' || type == 'expertOpinion' || type == 'evidence' || type == 'unitMaterial') { this[type].url = file?.url // this[type].name = this.getFileName(file) this[type].name = file?.name } else if (type == 'moreMaterial') { let newList = e.map((item: any) => { return { name: this.getFileName(item), url: item } }) this[type]=newList } } /**获取文件名 */ getFileName(url: string) { if (!url) return '' let str = url?.split('/')[5] let index = str?.indexOf('-') let result = decodeURIComponent(str?.substring(index + 1)) return result || '未知文件名' } }