attachment.component.ts 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
  2. import { CommonCompModule } from '../../../../services/common.modules';
  3. import { NzSelectModule } from 'ng-zorro-antd/select';
  4. import { ReactiveFormsModule } from '@angular/forms';
  5. import { NzRadioModule } from 'ng-zorro-antd/radio';
  6. import { NzMessageService } from 'ng-zorro-antd/message';
  7. import { NzGridModule } from 'ng-zorro-antd/grid';
  8. import { NzCheckboxModule } from 'ng-zorro-antd/checkbox';
  9. import { NzTableModule } from 'ng-zorro-antd/table';
  10. import { NzUploadChangeParam } from 'ng-zorro-antd/upload';
  11. import { NzUploadModule } from 'ng-zorro-antd/upload';
  12. import { NzModalService } from 'ng-zorro-antd/modal';
  13. import Parse from 'parse';
  14. import { CompUploadComponent } from '../../../../app/comp-upload/comp-upload.component';
  15. import {
  16. FormControl,
  17. FormGroup,
  18. NonNullableFormBuilder,
  19. Validators,
  20. ValidatorFn,
  21. AbstractControl,
  22. } from '@angular/forms';
  23. import { textbookServer } from '../../../../services/textbook';
  24. import * as eduTextBook from '../../../../services/EduTextbook'
  25. @Component({
  26. selector: 'app-attachment',
  27. imports: [
  28. CommonCompModule,
  29. ReactiveFormsModule,
  30. NzSelectModule,
  31. NzRadioModule,
  32. NzGridModule,
  33. NzCheckboxModule,
  34. NzTableModule,
  35. NzUploadModule,
  36. CompUploadComponent,
  37. ],
  38. standalone: true,
  39. templateUrl: './attachment.component.html',
  40. styleUrls: ['./attachment.component.scss'],
  41. })
  42. export class AttachmentComponent implements OnInit {
  43. @Input('eduTextbook') eduTextbook: any;
  44. @Input('maxWidth') maxWidth: number = 0;
  45. @Output() state: EventEmitter<any> = new EventEmitter<any>();
  46. @Output() save: EventEmitter<any> = new EventEmitter<any>();
  47. //填写诚信承诺是否正确
  48. confirmationValidator: ValidatorFn = (
  49. control: AbstractControl
  50. ): { [s: string]: boolean } => {
  51. if (
  52. control.value !=
  53. '本人自愿参加此次申报,已认真填写并检查以上材料,保证内容真实'
  54. ) {
  55. return { required: true };
  56. }
  57. return {};
  58. };
  59. /** 版权页截图*/
  60. copyrightImgUrl: string = ''
  61. /** 中国版本图书馆CIP查询截图*/
  62. CIPImgUrl: string = ''
  63. /**图书编校质量自查结果记录表 */
  64. selfResults: any = {
  65. name: '',
  66. url: '',
  67. }
  68. /** 专家审核意见表*/
  69. expertOpinion: any = {
  70. name: '',
  71. url: '',
  72. }
  73. /** 教材使用情况证明材料*/
  74. evidence: any = {
  75. name: '',
  76. url: '',
  77. }
  78. /**其他材料 {name: '',url: '',} */
  79. moreMaterial: Array<any> = []
  80. /**申报单位承诺意见 */
  81. unitMaterial: any = {
  82. name: '',
  83. url: '',
  84. }
  85. constructor(
  86. public tbookSer: textbookServer,
  87. private msg: NzMessageService,
  88. private modal: NzModalService
  89. ) { }
  90. ngOnInit() {
  91. if (this.eduTextbook.id) {
  92. this.copyrightImgUrl = this.eduTextbook?.get('copyrightImgUrl') || this.copyrightImgUrl
  93. this.CIPImgUrl = this.eduTextbook?.get('CIPImgUrl') || this.CIPImgUrl
  94. this.selfResults = this.eduTextbook?.get('selfResults') || this.selfResults
  95. this.expertOpinion = this.eduTextbook?.get('expertOpinion') || this.expertOpinion
  96. this.evidence = this.eduTextbook?.get('evidence') || this.evidence
  97. this.moreMaterial = this.eduTextbook?.get('moreMaterial') || this.moreMaterial
  98. this.unitMaterial = this.eduTextbook?.get('unitMaterial') || this.unitMaterial
  99. }
  100. console.log(
  101. 'copyrightImgUrl',this.copyrightImgUrl,
  102. 'CIPImgUrl',this.CIPImgUrl,
  103. 'selfResults',this.selfResults,
  104. 'expertOpinion',this.expertOpinion,
  105. 'evidence',this.evidence,
  106. 'moreMaterial',this.moreMaterial,
  107. 'unitMaterial',this.unitMaterial)
  108. }
  109. /**本页必填是否存在空项 */
  110. examineNull() {
  111. let isNull = false
  112. let msgList = []
  113. if (this.copyrightImgUrl == '' || !this.copyrightImgUrl) {
  114. msgList.push('版权页截图')
  115. isNull = true
  116. }
  117. if (this.CIPImgUrl == '' || !this.CIPImgUrl) {
  118. msgList.push('CIP查询截图')
  119. isNull = true
  120. }
  121. if (this.selfResults.url == '' || !this.selfResults.url) {
  122. msgList.push('自查结果记录表')
  123. isNull = true
  124. }
  125. if (this.expertOpinion.url == '' || !this.expertOpinion.url) {
  126. msgList.push('专家审核意见表')
  127. isNull = true
  128. }
  129. if (this.evidence.url == '' || !this.evidence.url) {
  130. msgList.push('证明材料')
  131. isNull = true
  132. }
  133. if (this.moreMaterial?.length > 0) {
  134. let isExist = this.moreMaterial.every(item => item?.url == '' || !item?.url)
  135. if (isExist) {
  136. msgList.push('其他材料')
  137. isNull = true
  138. }
  139. }
  140. if (this.unitMaterial.url == '' || !this.unitMaterial.url) {
  141. msgList.push('申报单位承诺意见')
  142. isNull = true
  143. }
  144. if (isNull) {
  145. this.msg.create('error', `请上传完整 ${msgList.join()}`)
  146. }
  147. return isNull
  148. }
  149. /**判断是否存在未填字段 */
  150. isIgnoreFiledNull() {
  151. let selectList = this.eduTextbook?.get('characteristic')
  152. let check = false
  153. for(let i in selectList){
  154. if(selectList[i].label=='通识课'||selectList[i].label=='公共基础课'||selectList[i].label=='专业课'){
  155. if(selectList[i].checked) {
  156. check=true
  157. break;
  158. }
  159. }
  160. }
  161. if(!check){
  162. this.msg.create('warning','请返回选择适用课程性质')
  163. return
  164. }
  165. let eduColumn = eduTextBook.EduTextbook.fields
  166. let ignoreFiled = [
  167. 'typeNumber', 'code','editionNumber', 'importantProjectOther',
  168. 'textbookFiles', 'createdAt', 'updatedAt', 'copyright', 'authorSign',
  169. 'CIP', 'isDeleted', 'opinions', 'printNumber', 'printSum', 'render',
  170. 'importantProject', 'importantProjectOther', 'complete', 'links', 'recommend',
  171. 'printSun', 'discard', 'edition', 'eduProcess', 'authors', 'editor',
  172. 'copyrightImgUrl', 'CIPImgurl', 'selfResults', 'expertOpinion', 'evidence',
  173. 'moreMaterial', 'unitMaterial','approvedImgUrl','department'
  174. ] //非必填字段
  175. let textBookJson = this.eduTextbook.toJSON()
  176. let isVrifly = Object.keys(eduColumn).some((item: string) => {
  177. if (!ignoreFiled.includes(item) && (textBookJson[item] === '' || textBookJson[item] === undefined || textBookJson[item] === null)) {
  178. console.warn('字段未填写:' + item)
  179. return true
  180. }
  181. return
  182. })
  183. if (isVrifly) {
  184. this.msg.warning('存在未填项')
  185. return true
  186. } else {
  187. return false
  188. }
  189. }
  190. async submitForm(event?: string): Promise<void> {
  191. let params = {
  192. copyrightImgUrl: this.copyrightImgUrl,
  193. CIPImgUrl: this.CIPImgUrl,
  194. selfResults: this.selfResults,
  195. expertOpinion: this.expertOpinion,
  196. evidence: this.evidence,
  197. moreMaterial: this.moreMaterial,
  198. unitMaterial: this.unitMaterial,
  199. }
  200. await this.saveEduTextbook(params, true);
  201. if (event == 'pre') {//上一步
  202. this.state.emit({ type: 'pre' });
  203. return;
  204. }
  205. if (event == 'complete') {
  206. let isPageNull = this.examineNull()//检查本页空项
  207. if (isPageNull) return
  208. let isIgnoreFiled = this.isIgnoreFiledNull()//检查数据空项
  209. if (isIgnoreFiled) return
  210. this.state.emit({ type: 'complete', textBook: this.eduTextbook });
  211. this.eduTextbook.set('complete', true)
  212. this.eduTextbook.set('status', '102')
  213. await this.eduTextbook.save()
  214. this.msg.success('已填写完成')
  215. } else if (event == 'save') {
  216. this.modal.success({
  217. nzTitle: '保存成功',
  218. nzContent: '<p>已保存并且至空间</p>',
  219. nzOnOk: () => console.log('Info OK'),
  220. });
  221. return;
  222. }
  223. }
  224. async saveEduTextbook(params: any, isComplete: boolean) {
  225. console.log(params);
  226. if (!this.eduTextbook) {
  227. this.msg.error('请先创建教材');
  228. return;
  229. }
  230. //如果填写未完整,仅保存,状态修改待完善101
  231. if (this.eduTextbook.get('status') == '102' && !isComplete) {
  232. this.eduTextbook?.set('status', '101');
  233. } else if (!this.eduTextbook.get('status')) {
  234. this.eduTextbook?.set('status', '101');
  235. }
  236. this.eduTextbook?.set('user', Parse.User.current()?.toPointer());
  237. this.eduTextbook?.set('company', {
  238. __type: 'Pointer',
  239. className: 'Company',
  240. objectId: this.tbookSer.company,
  241. });
  242. params.selfResults &&
  243. this.eduTextbook?.set('selfResults', params.selfResults);
  244. params.unitMaterial &&
  245. this.eduTextbook?.set('unitMaterial', params.unitMaterial);
  246. params.expertOpinion &&
  247. this.eduTextbook?.set('expertOpinion', params.expertOpinion);
  248. params.evidence && this.eduTextbook?.set('evidence', params.evidence);
  249. params.moreMaterial &&
  250. this.eduTextbook?.set('moreMaterial', params.moreMaterial);
  251. this.eduTextbook?.set('copyrightImgUrl', params.copyrightImgUrl);
  252. this.eduTextbook?.set('CIPImgUrl', params.CIPImgUrl);
  253. await this.eduTextbook?.save();
  254. return;
  255. }
  256. upload(e: any, type: string) {
  257. console.log(e);
  258. let file = e[0];
  259. if (type == 'copyrightImgUrl' || type == 'CIPImgUrl') {
  260. this[type] = file?.url
  261. } else if (type == 'selfResults' || type == 'expertOpinion' ||
  262. type == 'evidence' || type == 'unitMaterial') {
  263. this[type].url = file?.url
  264. // this[type].name = this.getFileName(file)
  265. this[type].name = file?.name
  266. } else if (type == 'moreMaterial') {
  267. let newList = e.map((item: any) => {
  268. return { name: this.getFileName(item), url: item }
  269. })
  270. this[type]=newList
  271. }
  272. }
  273. /**获取文件名 */
  274. getFileName(url: string) {
  275. if (!url) return ''
  276. let str = url?.split('/')[5]
  277. let index = str?.indexOf('-')
  278. let result = decodeURIComponent(str?.substring(index + 1))
  279. return result || '未知文件名'
  280. }
  281. }