123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487 |
- import { Component, Input, OnInit } from '@angular/core';
- import { CommonModule } from '@angular/common';
- import { NzSpaceModule } from 'ng-zorro-antd/space';
- import { CommonCompModule } from '../../../../services/common.modules';
- import { ActivatedRoute, Router } from '@angular/router';
- import { NzMessageModule } from 'ng-zorro-antd/message';
- import { NzMessageService } from 'ng-zorro-antd/message';
- import Parse from 'parse';
- import { textbookServer } from '../../../../services/textbook';
- import { NzModalService } from 'ng-zorro-antd/modal';
- import { MatDialog } from '@angular/material/dialog';
- import { NzEmptyModule } from 'ng-zorro-antd/empty';
- import { DatePipe } from '@angular/common';
- import { NzPopoverModule } from 'ng-zorro-antd/popover';
- @Component({
- selector: 'app-review-details',
- templateUrl: './review-details.component.html',
- styleUrls: ['./review-details.component.scss'],
- imports: [
- CommonModule,
- NzSpaceModule,
- CommonCompModule,
- NzMessageModule,
- NzEmptyModule,
- NzPopoverModule,
- ],
- providers: [DatePipe],
- standalone: true,
- })
- export class ReviewDetailsComponent implements OnInit {
- reviewList: Array<Parse.Object> = [];
- count: number = 0;
- @Input('limit') limit: number = 10;
- pageIndex: number = 1;
- loading: boolean = false;
- @Input('maxWidth') maxWidth: any; //最大宽度
- @Input('eduProcess') eduProcess?: Parse.Object; //流程id,verify存在时需要
- @Input('listOfFilter') listOfFilter: Array<any> = []; //评审组
- @Input('filterObj') filterObj: any = {
- showGroup: false,
- contained: [],
- bookMap: {}, //教材对应评审组结构{booid:评审组名称}
- };
- searchValue: string = '';
- listOfColumns: any = {
- lang: {
- // listOfFilter: [{ value: '中文', text: '中文' }],
- onChange: (data: Array<string>) => {
- console.log(data);
- if (data?.length < 1) {
- this.filterObj.contained = Object.keys(this.filterObj.bookMap);
- } else {
- this.filterObj.contained = [];
- for (const key in this.filterObj.bookMap) {
- const item = this.filterObj.bookMap[key];
- if (data.includes(item.id)) {
- this.filterObj.contained.push(key);
- }
- }
- }
- this.getTextbook(this.searchValue);
- },
- },
- };
- showLoading: boolean = false; //全局
- time: any;
- /* 格式化拓展表字段 */
- fromatFiled(list: Array<Parse.Object>, filed: string): string {
- let arr: Array<string | null> = [];
- let isDate = false;
- list.forEach((item: Parse.Object) => {
- // arr.add(item.get(filed))
- if (
- isDate ||
- Object.prototype.toString.call(item.get(filed)).indexOf('Date') != -1
- ) {
- arr.push(this.datePipe.transform(item.get(filed), 'yyyy-MM'));
- isDate = true;
- } else {
- arr.push(item.get(filed));
- }
- });
- let j = Array.from(arr).join(',');
- if (!isDate) {
- j = Array.from(new Set(arr)).join(' ');
- }
- return j || '-';
- }
- constructor(
- private activeRoute: ActivatedRoute,
- public tbookSer: textbookServer,
- private router: Router,
- private msg: NzMessageService,
- public dialog: MatDialog,
- private route: Router,
- private datePipe: DatePipe,
- private modal: NzModalService
- ) {}
- ngOnInit() {
- this.getTextbook();
- }
- async getTextbook(val?: string, exported?: boolean): Promise<any[] | void> {
- if (this.loading) return;
- if (!exported) this.loading = true;
- try {
- let queryParams: any = {
- where: {
- $or: [
- {
- eduTextbook: {
- $inQuery: {
- where: {
- $or: [
- {
- title: { $regex: `.*${val || ''}.*` },
- },
- {
- childrens: {
- $inQuery: {
- where: {
- $or: [
- {
- ISBN: { $regex: `.*${val || ''}.*` },
- },
- {
- author: { $regex: `.*${val || ''}.*` },
- },
- ],
- },
- className: 'EduTextbookVolume',
- },
- },
- },
- ],
- },
- className: 'EduTextbook',
- },
- },
- },
- {
- profile: {
- $inQuery: {
- where: {
- $or: [
- {
- user: {
- $inQuery: {
- where: {
- $or: [
- {
- name: { $regex: `.*${val || ''}.*` },
- },
- ],
- },
- className: '_User',
- },
- },
- },
- ],
- },
- className: 'Profile',
- },
- },
- },
- ],
- eduTextbook: { $in: this.filterObj.contained },
- },
- };
- let query = Parse.Query.fromJSON('EduReview', queryParams);
- this.eduProcess?.id && query.equalTo('eduProcess', this.eduProcess.id);
- query.descending('updatedAt');
- query.notEqualTo('isDeleted', true);
- query.exists('score');
- query.equalTo('verify',true)
- query.include(
- 'eduTextbook',
- 'eduTextbook.childrens',
- 'profile',
- 'profile.user'
- );
- this.count = await query.count();
- query.limit(this.limit);
- query.skip(this.limit * (this.pageIndex - 1));
- if (exported) {
- query.limit(1000);
- let r = await query.find();
- this.loading = false;
- return r;
- }
- this.reviewList = await query.find();
- console.log(this.reviewList);
- this.loading = false;
- } catch (err) {
- console.warn(err);
- this.msg.error('获取超时');
- }
- this.loading = false;
- }
- onSearch(e: string) {
- this.pageIndex = 1;
- console.log(e);
- if (this.time) clearTimeout(this.time);
- this.time = setTimeout(() => {
- this.getTextbook(e);
- }, 500);
- }
- //分页切换
- pageIndexChange(e: any) {
- console.log(e);
- this.pageIndex = e;
- this.getTextbook(this.searchValue);
- }
- //切换分页条数
- onPageSizeChange(): void {
- console.log(this.limit);
- // this.onAllChecked(false)
- this.pageIndex = 1;
- this.getTextbook(this.searchValue);
- }
- toUrl(url: string, param?: Object) {
- console.log(url);
- if (param) {
- this.route.navigate([url, param]);
- return;
- }
- this.route.navigate([url]);
- }
- //导出表格
- async export() {
- if (this.showLoading) return;
- this.showLoading = true;
- try {
- let table;
- let data: any = await this.getTextbook('', true);
- if (this.filterObj.showGroup) {
- table = this.getActivityTable(data);
- } else {
- table = this.getTable(data);
- }
- let title = '评审明细表';
- this.excel(table, `${title}.xls`);
- this.showLoading = false;
- } catch (err) {
- console.log(err);
- this.showLoading = false;
- this.msg.error('导出超时');
- }
- }
- //合并后(活动详情)
- getActivityTable(data: Array<Parse.Object>): string {
- let groupMap: any = {};
- data.forEach((item: Parse.Object) => {
- let obj = {
- name: item?.get('profile')?.get('user')?.get('name'),
- score: item?.get('score'),
- };
- if (!groupMap[item?.get('eduTextbook')?.id]) {
- groupMap[item?.get('eduTextbook')?.id] = {
- eduTextbook: item?.get('eduTextbook'),
- groupList: [obj],
- };
- } else {
- groupMap[item?.get('eduTextbook')?.id]['groupList'].push(obj);
- }
- });
- console.log(groupMap);
- let table = `<table border="1px" cellspacing="0" cellpadding="0">
- <thead>
- <tr>
- <th>序号</th>
- <th>教材申报编号</th>
- <th>申报教材名称</th>
- <th>所属学科专业类</th>
- <th>第一主编/作者</th>
- <th>出版单位</th>
- <th>所属评审组</th>
- `;
- let l = 0;
- let dataLsit: any = Object.values(groupMap);
- dataLsit.forEach((val: any) => {
- if (val?.groupList.length > l) l = val?.groupList.length;
- });
- for (let index = 0; index < l; index++) {
- table += `<th>评审专家${index + 1}</th>`;
- }
- table += `
- <th>平均分值(若为空请点击计算后再导出)</th>
- </tr>
- </thead>
- <tbody>`;
- let _body = '';
- for (var row = 0; row < dataLsit.length; row++) {
- _body += '<tr>';
- _body += '<td>';
- _body += `${row + 1}`;
- _body += '</td>';
- _body += '<td>';
- _body += ` ${dataLsit[row]?.eduTextbook?.get('code') || ''}`;
- _body += '</td>';
- _body += '<td>';
- _body += ` ${dataLsit[row]?.eduTextbook?.get('title') || ''}`;
- _body += '</td>';
- _body += '<td>';
- _body += ` ${
- (dataLsit[row]?.eduTextbook?.get('majorPoniter')?.code || '') +
- '/' +
- dataLsit[row]?.eduTextbook?.get('majorPoniter')?.name || ''
- }`;
- _body += '</td>';
- _body += '<td>';
- _body += ` ${this.fromatFiled(
- dataLsit[row]?.eduTextbook?.get('childrens'),
- 'author'
- )}`;
- _body += '</td>';
- _body += '<td>';
- _body += `${this.fromatFiled(
- dataLsit[row]?.eduTextbook?.get('childrens'),
- 'editionUnit'
- )}`;
- _body += '</td>';
- _body += '<td>';
- _body += `${this.filterObj.bookMap[dataLsit[row]?.eduTextbook?.id].name}`;
- _body += '</td>';
-
- for (let i = 0; i < l; i++) {
- const element = dataLsit[row]['groupList'][i];
- _body += '<td>';
- _body += `${element?.name ?? ''} ${element?.score??''}`;
- _body += '</td>';
- }
- // _body += '<td>';
- // _body += ` ${
- // this.filterObj.bookMap[dataLsit[row]?.eduTextbook?.id].name || '-'
- // }`;
- // _body += '</td>';
- // _body += '<td>';
- // _body += `${
- // dataLsit[row]?.get('profile')?.get('user')?.get('name') || '-'
- // }`;
- // _body += '</td>';
- // _body += '<td>';
- // _body += ` ${this.datePipe.transform(
- // dataLsit[row]?.updatedAt,
- // 'yyyy-MM-dd HH:mm:ss'
- // )}`;
- // _body += '</td>';
- _body += '<td>';
- _body += `${dataLsit[row]?.eduTextbook?.get('score') ?? '-'}`;
- _body += '</td>';
- _body += '</tr>';
- }
- table += _body;
- table += '</tbody>';
- table += '</table>';
- return table;
- }
- //非合并(评审组详情)
- getTable(data: Array<Parse.Object>): string {
- let table = `<table border="1px" cellspacing="0" cellpadding="0">
- <thead>
- <tr>
- <th>序号</th>
- <th>教材申报编号</th>
- <th>申报教材名称</th>
- <th>所属学科专业类</th>
- <th>第一主编/作者</th>
- <th>出版单位</th>
- <th>评审专家</th>
- <th>提交时间</th>
- <th>分值</th>
- </tr>
- </thead>
- <tbody>
- `;
- let _body = '';
- for (var row = 0; row < data.length; row++) {
- _body += '<tr>';
- _body += '<td>';
- _body += `${row + 1}`;
- _body += '</td>';
- _body += '<td>';
- _body += ` ${data[row]?.get('eduTextbook')?.get('code') || ''}`;
- _body += '</td>';
- _body += '<td>';
- _body += ` ${data[row]?.get('eduTextbook')?.get('title') || ''}`;
- _body += '</td>';
- _body += '<td>';
- _body += ` ${
- (data[row]?.get('eduTextbook')?.get('majorPoniter')?.code || '') +
- '/' +
- data[row]?.get('eduTextbook')?.get('majorPoniter')?.name || ''
- }`;
- _body += '</td>';
- _body += '<td>';
- _body += ` ${this.fromatFiled(
- data[row]?.get('eduTextbook')?.get('childrens'),
- 'author'
- )}`;
- _body += '</td>';
- _body += '<td>';
- _body += `${this.fromatFiled(
- data[row]?.get('eduTextbook')?.get('childrens'),
- 'editionUnit'
- )}`;
- _body += '</td>';
- // if (this.filterObj.showGroup) {
- // _body += '<td>';
- // _body += ` ${
- // this.filterObj.bookMap[data[row]?.get('eduTextbook')?.id].name ||
- // '-'
- // }`;
- // _body += '</td>';
- // }
- _body += '<td>';
- _body += `${data[row]?.get('profile')?.get('user')?.get('name') || '-'}`;
- _body += '</td>';
- _body += '<td>';
- _body += ` ${this.datePipe.transform(
- data[row]?.updatedAt,
- 'yyyy-MM-dd HH:mm:ss'
- )}`;
- _body += '</td>';
- _body += '<td>';
- _body += `${data[row]?.get('score') ?? '-'}`;
- _body += '</td>';
- _body += '</tr>';
- }
- table += _body;
- table += '</tbody>';
- table += '</table>';
- return table;
- }
- excel(data: any, filename: string) {
- let html =
- "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>";
- html +=
- '<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">';
- html += '<meta http-equiv="content-type" content="application/vnd.ms-excel';
- html += '; charset=UTF-8">';
- html += '<head>';
- html += '</head>';
- html += '<body>';
- html += data;
- html += '</body>';
- html += '</html>';
- let uri =
- 'data:application/vnd.ms-excel;charset=utf-8,' + encodeURIComponent(html);
- let link = document.createElement('a');
- link.href = uri;
- link.download = `${filename}`;
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- }
- }
|