process-list.component.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. import { Component, OnInit, ViewChild } from '@angular/core';
  2. import { ActivatedRoute, RouterOutlet, Router } from '@angular/router';
  3. import { CompTableListComponent } from '../../../../app/comp-table/comp-table-list/comp-table-list.component';
  4. import _Role from '../../../../schemas/_Role';
  5. // import { TranslateService } from '@ngx-translate/core';
  6. import * as Parse from 'parse';
  7. import { CommonModule } from '@angular/common';
  8. import { Department } from '../../../../schemas/Department';
  9. import { NzSpaceModule } from 'ng-zorro-antd/space';
  10. import { NzPageHeaderModule } from 'ng-zorro-antd/page-header';
  11. import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb';
  12. import { CommonCompModule } from '../../../../services/common.modules';
  13. import { NzModalModule } from 'ng-zorro-antd/modal';
  14. import {
  15. NzFormatEmitEvent,
  16. NzTreeModule,
  17. NzTreeNode,
  18. } from 'ng-zorro-antd/tree';
  19. import { NzCheckboxModule } from 'ng-zorro-antd/checkbox';
  20. import { NzEmptyModule } from 'ng-zorro-antd/empty';
  21. import { NzRadioModule } from 'ng-zorro-antd/radio';
  22. import { NzMessageService } from 'ng-zorro-antd/message';
  23. import { NzModalService } from 'ng-zorro-antd/modal';
  24. import { textbookServer } from '../../../../services/textbook';
  25. import { NzTabsModule } from 'ng-zorro-antd/tabs';
  26. interface nodes {
  27. title: string;
  28. key: string;
  29. isLeaf?: boolean;
  30. isParent?: boolean;
  31. children?: Array<any>;
  32. }
  33. interface depart {
  34. name: string;
  35. id?: string;
  36. code?: string;
  37. desc?: string;
  38. parent?: object | any;
  39. branch: string;
  40. }
  41. @Component({
  42. selector: 'app-process-list',
  43. templateUrl: './process-list.component.html',
  44. styleUrls: ['./process-list.component.scss'],
  45. imports: [
  46. CommonModule,
  47. CommonCompModule,
  48. RouterOutlet,
  49. CompTableListComponent,
  50. NzSpaceModule,
  51. NzPageHeaderModule,
  52. NzBreadCrumbModule,
  53. NzTreeModule,
  54. NzCheckboxModule,
  55. NzEmptyModule,
  56. NzModalModule,
  57. NzRadioModule,NzTabsModule
  58. ],
  59. standalone: true,
  60. })
  61. export class ProcessListComponent implements OnInit {
  62. @ViewChild(CompTableListComponent) list: CompTableListComponent | undefined;
  63. // _Role = _Role
  64. Department = Department;
  65. user: Parse.User | undefined;
  66. className: string | undefined;
  67. queryParams: any | undefined;
  68. fieldsArray: Array<any> | undefined;
  69. searchValue: string = ''; //搜索内容
  70. searchValuePro: string = ''; //搜索流程内容
  71. nodes: Array<nodes | any> = [];
  72. currentDepart: nodes | any = null;
  73. eduProcessList: Array<any> = [];
  74. statusMap: any = {};
  75. eduProcessLength: number = 0;
  76. pageSize: number = 10;
  77. pageIndex: number = 1;
  78. checkedShowFilter: boolean = false;
  79. checkedAll: boolean = false; //全选
  80. indeterminate = false;
  81. loading = false;
  82. isVisible: boolean = false;
  83. activatedNode: NzTreeNode | any; //当前选择节点
  84. editType: string = 'add'; //弹窗类型
  85. activeDepart?: Parse.Object; //当前编辑部门
  86. editObject: depart = {
  87. name: '',
  88. code: '',
  89. desc: '',
  90. parent: {},
  91. branch: '',
  92. };
  93. parentMap: Array<any> = [];
  94. setOfCheckedId = new Set<string>();
  95. formatStatus = (e: any) => {
  96. if (e.get('status') == '100') {
  97. return {
  98. title: '已暂停',
  99. color: 'lime',
  100. strat: true,
  101. stop: true,
  102. end: false,
  103. del: false,
  104. };
  105. }
  106. if(e?.get('collectStartData') && new Date() < new Date(e?.get('collectStartData'))){
  107. return {
  108. title: '待收集',
  109. color: 'default',
  110. strat: false,
  111. stop: false,
  112. end: false,
  113. del: false,
  114. collect:true
  115. };
  116. }
  117. if(e?.get('collectStartData') && new Date() > new Date(e?.get('collectStartData'))
  118. && new Date() < e?.get('collectEndData')){
  119. return {
  120. title: '收集中',
  121. color: 'orange',
  122. strat: false,
  123. stop: false,
  124. end: false,
  125. del: false,
  126. collect:true
  127. };
  128. }
  129. if (
  130. e?.get('deadline') &&
  131. new Date() > new Date(e?.get('deadline')) &&
  132. e?.get('status') == '400'
  133. ) {
  134. return {
  135. title: '已结束',
  136. color: 'gold',
  137. strat: false,
  138. stop: false,
  139. end: false,
  140. del: true,
  141. };
  142. }
  143. if (e?.get('status') == '400') {
  144. return {
  145. title: '已完成',
  146. color: 'green',
  147. strat: false,
  148. stop: false,
  149. end: true,
  150. del: false,
  151. };
  152. }
  153. if (!e?.get('startDate') || new Date() < new Date(e.get('startDate'))) {
  154. return {
  155. title: '未开始',
  156. color: 'grey',
  157. strat: true,
  158. stop: false,
  159. end: false,
  160. del: true,
  161. };
  162. }
  163. if (e?.get('deadline') && new Date() > new Date(e?.get('deadline'))) {
  164. return {
  165. title: '已逾期',
  166. color: 'red',
  167. strat: true,
  168. stop: false,
  169. end: false,
  170. del: true,
  171. };
  172. }
  173. if (
  174. e.get('status') == '200' &&
  175. e?.get('startDate') &&
  176. new Date() >= new Date(e?.get('startDate'))
  177. ) {
  178. return {
  179. title: '遴选中',
  180. color: 'blue',
  181. strat: false,
  182. stop: true,
  183. end: true,
  184. del: false,
  185. };
  186. }
  187. if (e.get('status') == '300') {
  188. return {
  189. title: '已公示',
  190. color: 'red',
  191. strat: false,
  192. stop: true,
  193. end: true,
  194. del: false,
  195. };
  196. }
  197. if (e.get('status') == '201') {
  198. return {
  199. title: '评审中',
  200. color: 'cyan',
  201. strat: false,
  202. stop: true,
  203. end: true,
  204. del: false,
  205. };
  206. }
  207. return;
  208. };
  209. editLoading:boolean = true
  210. active: number = 0;
  211. constructor(
  212. public tbookSer: textbookServer,
  213. private route: Router,
  214. private activeRoute: ActivatedRoute,
  215. private message: NzMessageService,
  216. private modal: NzModalService
  217. ) {
  218. this.user = Parse.User.current();
  219. this.className = this.Department.className;
  220. this.fieldsArray = this.Department.fieldsArray;
  221. this.queryParams = {
  222. where: {
  223. isDeleted: { $ne: true },
  224. },
  225. };
  226. }
  227. ngOnInit(): void {
  228. this.activeRoute.paramMap.subscribe(async (params) => {
  229. // this.nodes = await this.getDepart();
  230. this.getEduProcess()
  231. });
  232. }
  233. async getDepart(
  234. parent?: string,
  235. searchValue?: string
  236. ): Promise<Array<nodes>> {
  237. let nodes: any = [];
  238. let query = new Parse.Query('Department');
  239. searchValue && query.contains('name', searchValue);
  240. query.notEqualTo('isDeleted', true);
  241. query.select('code', 'name', 'branch', 'parent', 'type');
  242. query.descending('createdAt');
  243. query.limit(100);
  244. query.equalTo('objectId', this.tbookSer.profile.user.department?.objectId)
  245. let res = await query.find();
  246. res.forEach((item) => {
  247. nodes.push({
  248. title: item.get('name'),
  249. key: item.id,
  250. children: [],
  251. isLeaf: true,
  252. });
  253. });
  254. return nodes;
  255. }
  256. async onSearch(e: string) {
  257. this.nodes = await this.getDepart('', e);
  258. }
  259. onSearchPro(e: string){
  260. this.getEduProcess()
  261. }
  262. changeDepart(e: any) {
  263. this.currentDepart = e;
  264. this.getEduProcess();
  265. }
  266. async getEduProcess() {
  267. this.eduProcessList = [];
  268. this.loading = true;
  269. let query1= Parse.Query.fromJSON('EduProcess', {
  270. where: {
  271. $or: [
  272. {
  273. name: { "$regex": `.*${this.searchValuePro}.*`},
  274. },
  275. ]
  276. }
  277. });
  278. let query2= Parse.Query.fromJSON('EduProcess', {
  279. where: {
  280. $or: [
  281. {
  282. code: { "$regex": `.*${this.searchValuePro}.*`},
  283. },
  284. ]
  285. }
  286. });
  287. let query = Parse.Query.or(query1, query2)
  288. query.include('profileSubmitted', 'profileSubmitted.user');
  289. query.notEqualTo('isDeleted', true);
  290. query.equalTo('department',this.tbookSer.profile.user.department?.objectId)
  291. query.descending('createdAt');
  292. query.equalTo('profileSubmitted',this.tbookSer?.profile?.objectId)
  293. let r = await query.find();
  294. // let list: any[] = [];
  295. r.forEach((item) => {
  296. // let _item = item.toJSON();
  297. // _item['checked'] = false;
  298. // _item['state'] = this.formatStatus(_item);
  299. this.statusMap[item.id] = this.formatStatus(item);
  300. });
  301. this.eduProcessList = r;
  302. this.editLoading = false
  303. this.loading = false;
  304. }
  305. //分页切换
  306. pageIndexChange(e: any) {
  307. console.log(e);
  308. this.pageIndex = e;
  309. this.getEduProcess();
  310. }
  311. onAllChecked(checked: boolean): void {
  312. console.log(checked);
  313. this.eduProcessList.forEach((item) => {
  314. if (checked) {
  315. this.setOfCheckedId.add(item.id);
  316. } else {
  317. this.setOfCheckedId.delete(item.id);
  318. }
  319. });
  320. this.checkedAll = checked;
  321. }
  322. onItemChecked(id: string, e: boolean) {
  323. if (e) {
  324. this.setOfCheckedId.add(id);
  325. } else {
  326. this.setOfCheckedId.delete(id);
  327. }
  328. this.checkedAll = this.eduProcessList.every((item) =>
  329. this.setOfCheckedId.has(item.id)
  330. );
  331. }
  332. statusSelected(type: string) {
  333. let map: any = {
  334. strat: '开始',
  335. stop: '暂停',
  336. end: '结束',
  337. };
  338. this.modal.confirm({
  339. nzTitle: '批量删除',
  340. nzContent:
  341. type == 'del'
  342. ? `删除后数据不可恢复,请谨慎操作`
  343. : `确认批量${map[type]}吗`,
  344. nzOkText: '确认',
  345. nzOkType: 'primary',
  346. nzOkDanger: map[type] ? true : false,
  347. nzOnOk: async () => {
  348. let selectedList = this.eduProcessList.filter((item: any) =>
  349. this.setOfCheckedId.has(item?.id)
  350. );
  351. let deletePromiseList = selectedList.map((item: any) => {
  352. return new Promise((resolve) => {
  353. resolve(this.onStatusChange(item, type));
  354. });
  355. });
  356. try {
  357. await Promise.all(deletePromiseList);
  358. this.getEduProcess();
  359. } catch (err) {}
  360. },
  361. nzCancelText: '取消',
  362. nzOnCancel: () => console.log('Cancel'),
  363. });
  364. }
  365. //暂停流程
  366. async onStatusChange(
  367. data: Parse.Object,
  368. type: string,
  369. end?: boolean
  370. ): Promise<void> {
  371. console.log(data, type);
  372. switch (type) {
  373. case 'strat':
  374. if (data?.get('status') == '100') {
  375. data?.set('status', null);
  376. }
  377. if (data?.get('startDate') > new Date()) {
  378. data?.set('startDate', new Date());
  379. }
  380. if (data?.get('deadline') < new Date()) {
  381. data?.set(
  382. 'deadline',
  383. new Date(new Date().getTime() + 60 * 1000 * 60 * 24 * 7)
  384. );
  385. console.warn('结束时间延长一周之后');
  386. }
  387. break;
  388. case 'stop':
  389. data?.set('status', '100');
  390. break;
  391. case 'end':
  392. data?.set('status', '400');
  393. data?.set('deadline', new Date());
  394. break;
  395. case 'del':
  396. data?.set('isDeleted', true);
  397. break;
  398. }
  399. await data.save();
  400. if (end) {
  401. this.getEduProcess();
  402. }
  403. }
  404. toUrl(url: string, params?: object) {
  405. if (params) {
  406. this.route.navigate([url, params]);
  407. } else {
  408. this.route.navigate([url]);
  409. }
  410. }
  411. }