inspection-plan-config.component.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. import { Component, OnInit, ViewChild, AfterViewInit } from "@angular/core";
  2. import { NzFormatEmitEvent, NzTreeNodeOptions, NzTreeComponent, NzMessageService } from 'ng-zorro-antd';
  3. import { ToolService } from 'src/app/services/tool.service';
  4. import { MainService } from 'src/app/services/main.service';
  5. import uniqBy from 'lodash-es/uniqBy'
  6. import cloneDeep from 'lodash-es/cloneDeep'
  7. import { OverlayScrollbarsComponent } from 'overlayscrollbars-ngx';
  8. import { Router, ActivatedRoute } from '@angular/router';
  9. import { Subject, forkJoin } from 'rxjs';
  10. import { debounceTime } from 'rxjs/operators';
  11. @Component({
  12. selector: "app-inspection-plan-config",
  13. templateUrl: "./inspection-plan-config.component.html",
  14. styleUrls: ["./inspection-plan-config.component.less"],
  15. })
  16. export class InspectionPlanConfigComponent implements OnInit, AfterViewInit {
  17. constructor(
  18. private tool: ToolService,
  19. private mainService: MainService,
  20. private message: NzMessageService,
  21. private router: Router,
  22. private route: ActivatedRoute,
  23. ){}
  24. @ViewChild('nzTreeComponent', { static: false }) nzTreeComponent: NzTreeComponent;
  25. @ViewChild('nzTreeComponentCopy', { static: false }) nzTreeComponentCopy: NzTreeComponent;
  26. @ViewChild("osComponentRef1", {
  27. read: OverlayScrollbarsComponent,
  28. static: false,
  29. })
  30. osComponentRef1: OverlayScrollbarsComponent;
  31. @ViewChild("osComponentRef2", {
  32. read: OverlayScrollbarsComponent,
  33. static: false,
  34. })
  35. osComponentRef2: OverlayScrollbarsComponent;
  36. defaultCheckedKeys = [];
  37. defaultSelectedKeys = [];
  38. defaultExpandedKeys = [];
  39. nodes: NzTreeNodeOptions[] = [];
  40. currentHospital; //当前院区
  41. changeInpSubject = new Subject(); //防抖
  42. ngOnInit(): void {
  43. //防抖
  44. this.changeInpSubject.pipe(debounceTime(500)).subscribe((v) => {
  45. if(v[0] === 'user'){
  46. this.getUsers(v[1]);
  47. } else if(v[0] === 'group'){
  48. this.getGroups(v[1]);
  49. }
  50. });
  51. this.currentHospital = this.tool.getCurrentHospital();
  52. this.getUsers();
  53. this.getGroups();
  54. this.getInfo();
  55. }
  56. getInfo(){
  57. let getPlanDetail$ = this.getPlanDetail();
  58. let getAddressList$ = this.getAddressList();
  59. let getTagList$ = this.getTagList();
  60. this.maskFlag = this.message.loading("正在加载中..", {
  61. nzDuration: 0,
  62. }).messageId;
  63. forkJoin(getPlanDetail$, getAddressList$, getTagList$).subscribe((res:any) => {
  64. this.message.remove(this.maskFlag);
  65. this.maskFlag = false;
  66. // getPlanDetail
  67. {
  68. this.planDetail = res[0].data || {};
  69. let nodeList = res[0].data ? (res[0].data.nodeList || []) : [];
  70. this.generateTree(nodeList);
  71. }
  72. // getAddressList
  73. {
  74. if (res[1].status == 200) {
  75. let addressList = res[1].list || [];
  76. let buildingAndAddressList = this.generateList(addressList);
  77. this.buildingAndAddressList = this.tool.tranListToTreeData(buildingAndAddressList, undefined, "parentId", "key");
  78. console.log(this.buildingAndAddressList);
  79. }else{
  80. this.message.error(res[1].msg || "请求数据失败");
  81. }
  82. }
  83. // getTagList
  84. {
  85. if (res[2].status == 200) {
  86. this.tagList = res[2].list || [];
  87. }
  88. }
  89. });
  90. }
  91. // 表格数据
  92. isLoading = false;
  93. buildingAndAddressList: NzTreeNodeOptions[] = [];
  94. buildingAndAddressListCopy: NzTreeNodeOptions[] = [];
  95. getAddressList() {
  96. let data = {
  97. idx: 0,
  98. sum: 9999,
  99. inspectionNode: {
  100. hosId: this.currentHospital.id,
  101. },
  102. };
  103. return this.mainService.getFetchDataList("simple/data", "inspectionNode", data)
  104. }
  105. nzCheck(event: NzFormatEmitEvent): void {
  106. console.log(event);
  107. console.log(event.node);
  108. console.log(event.node.parentNode);
  109. let buildingAndAddressListCopy = cloneDeep(this.buildingAndAddressListCopy);
  110. if(event.eventName === 'check'){
  111. if(event.node.isChecked){
  112. // 选中
  113. if(event.node.isLeaf){
  114. // 叶子节点
  115. let parent = buildingAndAddressListCopy.find(v => v.key === event.node.parentNode.key);
  116. if(parent){
  117. parent.children.push({ ...event.node.origin, selectable: true, checked: false });
  118. }else{
  119. let parent = cloneDeep({ ...event.node.parentNode.origin, selectable: true, checked: false });
  120. parent.children = [{ ...event.node.origin, selectable: true, checked: false }];
  121. buildingAndAddressListCopy.push(parent);
  122. }
  123. console.log("选中叶子节点");
  124. }else{
  125. // 非叶子节点
  126. buildingAndAddressListCopy = buildingAndAddressListCopy.filter(v => v.key !== event.node.key);
  127. event.node.origin.children.forEach( v => {
  128. v.selectable = true;
  129. v.checked = false;
  130. })
  131. buildingAndAddressListCopy.push({ ...event.node.origin, selectable: true, checked: false });
  132. console.log("选中非叶子节点");
  133. }
  134. } else {
  135. // 未选中
  136. if(event.node.isLeaf){
  137. // 叶子节点
  138. let parent = buildingAndAddressListCopy.find(v => v.key === event.node.parentNode.key);
  139. parent.children = parent.children.filter(v => v.key !== event.node.key);
  140. if(!parent.children.length){
  141. buildingAndAddressListCopy = [];
  142. }
  143. console.log("未选中叶子节点");
  144. }else{
  145. // 非叶子节点
  146. buildingAndAddressListCopy = buildingAndAddressListCopy.filter(v => v.key !== event.node.key);
  147. console.log("未选中非叶子节点");
  148. }
  149. }
  150. }
  151. this.buildingAndAddressListCopy = buildingAndAddressListCopy;
  152. console.log('buildingAndAddressListCopy', this.buildingAndAddressListCopy);
  153. }
  154. // 边输边搜节流阀
  155. changeInp(model, e) {
  156. this.isLoading = true;
  157. this.changeInpSubject.next([model, e]);
  158. }
  159. // 修改处理人
  160. changeUser(userId){
  161. this.activeAddress.origin.userId = userId;
  162. }
  163. // 修改处理组
  164. changeGroup(groupId){
  165. this.activeAddress.origin.groupId = groupId;
  166. }
  167. searchDto:any = {};
  168. // 搜索
  169. // 获取所有科室
  170. userList: any = []; //所有所属科室(搜索)
  171. getUsers(keyword = '') {
  172. let postData = {
  173. user: {
  174. hospital: { id: this.currentHospital.id },
  175. name: keyword,
  176. simpleQuery: true,
  177. menuId: 414,
  178. roleCodes: 'inspectman',
  179. engineer: 1,
  180. },
  181. idx: 0,
  182. sum: 10,
  183. };
  184. this.mainService
  185. .getFetchDataList("data", "user", postData)
  186. .subscribe((data) => {
  187. this.isLoading = false;
  188. this.userList = data.list || [];
  189. });
  190. }
  191. // 获取组
  192. groupList: any = []; //所有所属科室(搜索)
  193. getGroups(keyword = '') {
  194. let postData = {
  195. group2: {
  196. groupName: keyword,
  197. hospitals: this.currentHospital.id,
  198. type: 3,
  199. },
  200. idx: 0,
  201. sum: 10,
  202. };
  203. this.mainService
  204. .getFetchDataList("data", "group2", postData)
  205. .subscribe((data) => {
  206. this.isLoading = false;
  207. this.groupList = data.list || [];
  208. });
  209. }
  210. // 选择单个巡检点
  211. activeAddress:any;
  212. activeAddressId:any;
  213. nzClick(event: NzFormatEmitEvent): void {
  214. console.log(event);
  215. this.activeAddress = event.node;
  216. this.activeAddressId = event.selectedKeys[0];
  217. this.activeAddress.origin.radioValue = event.node.origin.userId ? 1 : (event.node.origin.groupId ? 2 : undefined);
  218. if(event.node.origin.userId){
  219. let flag = this.userList.find(v => v.id === event.node.origin.userId);
  220. if(!flag){
  221. this.userList.unshift({ id: event.node.origin.userId, name: event.node.origin.userName })
  222. }
  223. }
  224. if(event.node.origin.groupId){
  225. let flag = this.groupList.find(v => v.id === event.node.origin.groupId);
  226. if(!flag){
  227. this.groupList.unshift({ id: event.node.origin.groupId, groupName: event.node.origin.groupName })
  228. }
  229. }
  230. }
  231. // 计划详情
  232. planDetail:any = {};
  233. getPlanDetail(){
  234. return this.mainService.getFetchData("simple/data", "inspection", +this.route.snapshot.paramMap.get('id'));
  235. }
  236. // 标签
  237. tagList:any = [];
  238. getTagList(){
  239. let postData = {
  240. idx: 0,
  241. sum: 99,
  242. tag: {
  243. hosId: this.currentHospital.id,
  244. onlyBind: 1,
  245. modelType: { value: 'inspection' },
  246. }
  247. }
  248. return this.mainService.getFetchDataList("simple/data", "tag", postData)
  249. }
  250. // 点击标签
  251. currentTagId;
  252. clickTag(tag){
  253. this.currentTagId = tag.id;
  254. this.maskFlag = this.message.loading("正在加载中..", {
  255. nzDuration: 0,
  256. }).messageId;
  257. let postData = {
  258. inspectionNode: {
  259. hosId: this.currentHospital.id,
  260. tagIds: tag.id.toString(),
  261. },
  262. idx: 0,
  263. sum: 9999,
  264. };
  265. this.mainService
  266. .getFetchDataList("simple/data", "inspectionNode", postData)
  267. .subscribe((result) => {
  268. this.message.remove(this.maskFlag);
  269. this.maskFlag = false;
  270. let addressList = result.list || [];
  271. let buildingAndAddressListCopy = this.generateList(addressList, true);
  272. console.log(buildingAndAddressListCopy);
  273. this.defaultCheckedKeys = buildingAndAddressListCopy.map(v => v.key).filter(v => !(/b-/.test(v)));
  274. this.buildingAndAddressListCopy = this.tool.tranListToTreeData(buildingAndAddressListCopy, undefined, "parentId", "key");
  275. console.log(this.buildingAndAddressListCopy);
  276. });
  277. }
  278. // 回显树形结构
  279. generateTree(nodeList){
  280. console.log('nodeList:', nodeList);
  281. let buildingAndAddressList = nodeList.map(v => ({
  282. title: v.nodeId ? v.inspectionNodeDTO.name : v.buildingDTO.buildingName,
  283. key: v.nodeId ? `${v.nodeId}` : `b-${v.buildId}`,
  284. parentId: v.nodeId ? `b-${v.buildId}` : undefined,
  285. hosId: v.hosId,
  286. children: [],
  287. selectable: false,
  288. isLeaf: Boolean(v.nodeId),
  289. checked: false,
  290. }));
  291. this.defaultCheckedKeys = buildingAndAddressList.map(v => v.key).filter(v => !(/b-/.test(v)));
  292. let buildingAndAddressListCopy = nodeList.map(v => ({
  293. title: v.nodeId ? v.inspectionNodeDTO.name : v.buildingDTO.buildingName,
  294. key: v.nodeId ? `${v.nodeId}` : `b-${v.buildId}`,
  295. parentId: v.nodeId ? `b-${v.buildId}` : undefined,
  296. userId: v.userId,
  297. userName: v.userDTO ? v.userDTO.name : undefined,
  298. groupId: v.groupId,
  299. groupName: v.groupDTO ? v.groupDTO.name : undefined,
  300. hosId: v.hosId,
  301. children: [],
  302. selectable: true,
  303. isLeaf: Boolean(v.nodeId),
  304. checked: false,
  305. }));
  306. console.log('buildingAndAddressList:', buildingAndAddressList);
  307. this.buildingAndAddressListCopy = this.tool.tranListToTreeData(buildingAndAddressListCopy, undefined, "parentId", "key");
  308. console.log('this.buildingAndAddressListCopy', this.buildingAndAddressListCopy);
  309. }
  310. // 处理巡检点数据
  311. generateList(addressList, selectableFlag = false){
  312. // 楼栋
  313. let buildingList = addressList.map((item) => {
  314. return {
  315. title: item.buildingDTO.buildingName,
  316. key: 'b-' + item.buildingDTO.id,
  317. children: [],
  318. selectable: selectableFlag,
  319. hosId: this.currentHospital.id,
  320. }
  321. })
  322. buildingList = uniqBy(buildingList, "key");
  323. // 巡检点
  324. addressList = addressList.map((item) => {
  325. return {
  326. title: item.name,
  327. key: item.id.toString(),
  328. parentId: 'b-' + item.buildingDTO.id,
  329. isLeaf: true,
  330. selectable: selectableFlag,
  331. hosId: this.currentHospital.id,
  332. }
  333. })
  334. let buildingAndAddressList = buildingList.concat(addressList);
  335. console.log(buildingAndAddressList);
  336. return buildingAndAddressList;
  337. }
  338. // 填写模板名称-确定
  339. templateLoading = false;
  340. templateFlag = false;
  341. submitFormHand(name){
  342. this.maskFlag = this.message.loading("正在加载中..", {
  343. nzDuration: 0,
  344. }).messageId;
  345. let nodeList = this.tool.tranTreeToListData(this.buildingAndAddressListCopy).map(v => ({
  346. nodeId: v.parentId ? Number(v.key) : undefined,
  347. userId: v.userId,
  348. groupId: v.groupId,
  349. hosId: v.hosId,
  350. buildId: v.parentId ? Number(v.parentId.replace(/b-/, '')): Number(v.key.replace(/b-/, '')),
  351. }));
  352. console.log(name);
  353. console.log(nodeList);
  354. console.log('保存并存为模板');
  355. let postData = {
  356. inspection: {
  357. ...this.planDetail,
  358. nodeList,
  359. },
  360. template: {
  361. hosId: this.currentHospital.id,
  362. name,
  363. },
  364. };
  365. console.log(postData);
  366. this.mainService
  367. .inspectionPost("templateToInspection", postData)
  368. .subscribe((result) => {
  369. this.message.remove(this.maskFlag);
  370. this.maskFlag = false;
  371. if (result.status == 200) {
  372. this.message.success("保存成功");
  373. this.router.navigateByUrl("/main/inspectionPlan");
  374. } else {
  375. this.message.error(result.msg || '保存失败');
  376. }
  377. });
  378. }
  379. // 填写模板名称-取消
  380. cancelFlagHand(e) {
  381. this.templateFlag = false;
  382. }
  383. // 返回
  384. goBack(){
  385. this.router.navigateByUrl("/main/inspectionPlan");
  386. }
  387. // 保存并存为模板
  388. maskFlag: any = false;
  389. saveToTemplate(){
  390. let nodeList = this.tool.tranTreeToListData(this.buildingAndAddressListCopy);
  391. console.log(nodeList);
  392. if(!nodeList.length){
  393. this.message.warning('请选择至少一个巡检点');
  394. return;
  395. }
  396. this.templateFlag = true;
  397. }
  398. // 保存
  399. save(){
  400. this.maskFlag = this.message.loading("正在加载中..", {
  401. nzDuration: 0,
  402. }).messageId;
  403. let nodeList = this.tool.tranTreeToListData(this.buildingAndAddressListCopy).map(v => ({
  404. nodeId: v.parentId ? Number(v.key) : undefined,
  405. userId: v.userId,
  406. groupId: v.groupId,
  407. hosId: v.hosId,
  408. buildId: v.parentId ? Number(v.parentId.replace(/b-/, '')): Number(v.key.replace(/b-/, '')),
  409. }));
  410. console.log(nodeList);
  411. console.log('保存');
  412. let postData = {
  413. ...this.planDetail,
  414. nodeList,
  415. saveButton: '启动',
  416. };
  417. console.log(postData);
  418. this.mainService
  419. .simplePost("addData", "inspection", postData)
  420. .subscribe((result) => {
  421. this.message.remove(this.maskFlag);
  422. this.maskFlag = false;
  423. if (result.status == 200) {
  424. this.message.success("保存成功");
  425. this.router.navigateByUrl("/main/inspectionPlan");
  426. } else {
  427. this.message.error(result.msg || '保存失败');
  428. }
  429. });
  430. }
  431. // 引入模板
  432. inspectionTemplatePromptModalShow = false;
  433. showInspectionTemplate() {
  434. this.inspectionTemplatePromptModalShow = true;
  435. }
  436. // 关闭弹窗
  437. closeModelInspectionTemplate(e) {
  438. this.inspectionTemplatePromptModalShow = JSON.parse(e).show;
  439. }
  440. // 确认弹窗
  441. confirmModelInspectionTemplate(tempId) {
  442. this.inspectionTemplatePromptModalShow = false;
  443. this.maskFlag = this.message.loading("正在加载中..", {
  444. nzDuration: 0,
  445. }).messageId;
  446. let postData = {
  447. idx: 0,
  448. sum: 9999,
  449. inspectionTempNodes: {
  450. tempId,
  451. }
  452. }
  453. this.mainService.getFetchDataList("simple/data", "inspectionTempNodes", postData).subscribe((result:any) => {
  454. this.message.remove(this.maskFlag);
  455. this.maskFlag = false;
  456. let nodeList = result.list || [];
  457. this.generateTree(nodeList);
  458. })
  459. }
  460. ngAfterViewInit(): void {
  461. // get node by key: '10011'
  462. console.log(this.nzTreeComponent.getTreeNodeByKey('10011'));
  463. // use tree methods
  464. console.log(
  465. this.nzTreeComponent.getTreeNodes(),
  466. this.nzTreeComponent.getCheckedNodeList(),
  467. this.nzTreeComponent.getSelectedNodeList(),
  468. this.nzTreeComponent.getExpandedNodeList()
  469. );
  470. }
  471. }