limit-initiation-time.component.ts 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. import { Component, OnInit } from "@angular/core";
  2. import { ActivatedRoute } from "@angular/router";
  3. import { FormBuilder, Validators, FormGroup } from "@angular/forms";
  4. import { ToolService } from "../../services/tool.service";
  5. import { LimitInitiationTimeService } from './limit-initiation-time.service';
  6. import { Subject } from 'rxjs';
  7. import { debounceTime } from 'rxjs/operators';
  8. import { format, startOfMinute, endOfMinute } from 'date-fns';
  9. import { NzMessageService } from 'ng-zorro-antd/message';
  10. @Component({
  11. selector: "app-limit-initiation-time",
  12. templateUrl: "./limit-initiation-time.component.html",
  13. styleUrls: ["./limit-initiation-time.component.less"],
  14. })
  15. export class LimitInitiationTimeComponent implements OnInit {
  16. constructor(
  17. private fb: FormBuilder,
  18. private limitInitiationTimeService: LimitInitiationTimeService,
  19. private route: ActivatedRoute,
  20. private tool: ToolService,
  21. private message: NzMessageService,
  22. ) {}
  23. userInfo: any = JSON.parse(localStorage.getItem("user")) || {}; //登录用户信息
  24. listOfData: any[] = []; //表格数据
  25. pageIndex: number = 1; //表格当前页码
  26. pageSize: number = 10; //表格每页展示条数
  27. listLength: number = 10; //表格总数据量
  28. tableHeight: number; //表格动态高
  29. modal: boolean = false; //新增/编辑模态框
  30. add: boolean; //true:新增;false:编辑
  31. validateForm: FormGroup; //新增/编辑表单
  32. coopId: any; //当前操作列
  33. currentHospital; //当前院区
  34. btnLoading: boolean = false; //提交按钮loading状态
  35. promptContent: string; //操作提示框提示信息
  36. ifSuccess: boolean; //操作成功/失败
  37. promptInfo: string; //操作结果提示信息
  38. promptModalShow: boolean; //操作提示框是否展示
  39. modelName = ""; //模态框名称
  40. changeInpSubject = new Subject(); //防抖
  41. ngOnInit() {
  42. //防抖
  43. this.changeInpSubject.pipe(debounceTime(500)).subscribe((v) => {
  44. if(v[1] === 'taskType'){
  45. this.getTaskTypeList(true, v[0]);
  46. }else if(v[1] === 'building'){
  47. this.getBuildingList(true, v[0]);
  48. }else if(v[1] === 'department'){
  49. this.getDepartmentList(true, v[0]);
  50. }
  51. });
  52. this.currentHospital = this.tool.getCurrentHospital();
  53. this.coopBtns = this.tool.initCoopBtns(this.route);
  54. this.initForm();
  55. this.getList(1);
  56. }
  57. // 写入
  58. variableNamesCreate = ['[$待接单数量$]', '[$执行中数量$]'];
  59. variableNamesYy = ['[$预约单数量$]'];
  60. writeIn(content, event, type){
  61. var element = event.target.parentElement.parentElement.parentElement.parentElement.getElementsByTagName('input')[0];
  62. if (element.selectionStart || element.selectionStart == '0') {
  63. var startPos = element.selectionStart;
  64. var endPos = element.selectionEnd;
  65. this.validateForm.controls[type].setValue(element.value.substring(0, startPos) + content + element.value.substring(endPos));
  66. element.focus();
  67. setTimeout(() => {
  68. element.setSelectionRange(startPos + content.length, startPos + content.length);
  69. },0)
  70. } else {
  71. var val = element.value + content;
  72. this.validateForm.controls[type].setValue(val);
  73. element.focus();
  74. }
  75. }
  76. // 初始化增删改按钮
  77. coopBtns: any = {};
  78. // 表格数据
  79. loading1 = false;
  80. getList(type) {
  81. if (type == 1) {
  82. this.pageIndex = 1;
  83. }
  84. let data = {
  85. idx: this.pageIndex - 1,
  86. sum: this.pageSize,
  87. workTimeRule: {
  88. hosId: this.currentHospital.id,
  89. },
  90. };
  91. this.loading1 = true;
  92. this.limitInitiationTimeService
  93. .getFetchDataList(data)
  94. .subscribe((data) => {
  95. this.loading1 = false;
  96. if (data.status == 200) {
  97. this.listOfData = data.list.map(v => ({...v, taskNames: v.taskTypeDTO.map(v => v.taskName.toString())}));
  98. this.listLength = data.totalNum;
  99. }
  100. });
  101. }
  102. //打开查询任务类型下拉框
  103. isLoading:boolean = false;
  104. taskTypeList:any[] = [];
  105. getTaskTypeList(flag, keyWord = '') {
  106. if (flag) {
  107. let postData = {
  108. idx: 0,
  109. sum: 9999,
  110. taskType: {
  111. simpleQuery: true,
  112. taskName: keyWord,
  113. hosId: {
  114. id: this.currentHospital.id,
  115. },
  116. }
  117. };
  118. this.isLoading = true;
  119. this.limitInitiationTimeService
  120. .getTaskTypes(postData)
  121. .subscribe((data) => {
  122. this.isLoading = false;
  123. if (data.status == 200) {
  124. this.taskTypeList = data.list;
  125. }
  126. });
  127. }
  128. }
  129. //打开查询楼栋下拉框
  130. buildingList:any[] = [];
  131. getBuildingList(flag, keyWord = '') {
  132. if (flag) {
  133. let postData = {
  134. idx: 0,
  135. sum: 9999,
  136. building: {
  137. simpleQuery: true,
  138. buildingName: keyWord,
  139. cascadeHosId: this.currentHospital.id,
  140. }
  141. };
  142. this.isLoading = true;
  143. this.limitInitiationTimeService
  144. .getBuildings(postData)
  145. .subscribe((data) => {
  146. this.isLoading = false;
  147. if (data.status == 200) {
  148. this.buildingList = data.list;
  149. }
  150. });
  151. }
  152. }
  153. //打开查询科室下拉框
  154. departmentList:any[] = [];
  155. getDepartmentList(flag, keyWord = '') {
  156. if (flag) {
  157. let postData = {
  158. idx: 0,
  159. sum: 9999,
  160. department: {
  161. searchType: 1,// 简单查询
  162. dept: keyWord,
  163. cascadeHosId: this.currentHospital.id,
  164. }
  165. };
  166. this.isLoading = true;
  167. this.limitInitiationTimeService
  168. .getDepartments(postData)
  169. .subscribe((data) => {
  170. this.isLoading = false;
  171. if (data.status == 200) {
  172. this.departmentList = data.list;
  173. }
  174. });
  175. }
  176. }
  177. //搜索
  178. changeInp(e, type) {
  179. this.isLoading = true;
  180. this.changeInpSubject.next([e, type]);
  181. }
  182. // 新增弹框
  183. addModal() {
  184. this.modelName = "新增";
  185. this.add = true; //新增
  186. this.modal = true;
  187. this.initForm();
  188. }
  189. //关闭新增/编辑弹框
  190. hideAddModal() {
  191. this.modal = false;
  192. this.initForm();
  193. }
  194. //服务时间选择
  195. // 禁用的小时
  196. startTimeHourdis() {
  197. return [];
  198. }
  199. endTimeHourdis() {
  200. return [];
  201. }
  202. // 禁用的分钟
  203. startTimeMindis() {
  204. return [];
  205. }
  206. endTimeMindis() {
  207. return [];
  208. }
  209. timeChange(e: boolean, type: string) {
  210. if (!e && this.validateForm.value[type]) {
  211. let hour = new Date(this.validateForm.value[type]).getHours();
  212. // let minute = new Date(this.validateForm.value[type]).getMinutes();
  213. if (type == "startTime") {
  214. this.endTimeHourdis = () => this.generateArray(0, hour);
  215. // this.endTimeMindis = () => this.generateArray(0, minute + 1);
  216. } else if (type == "endTime") {
  217. this.startTimeHourdis = () => this.generateArray(hour + 1, 24);
  218. // this.startTimeMindis = () => this.generateArray(minute, 60);
  219. }
  220. }
  221. }
  222. /**
  223. * 生成一个从 start 到 end 的连续数组
  224. * @param start
  225. * @param end
  226. */
  227. generateArray(start, end) {
  228. return Array.from(new Array(end).keys()).slice(start);
  229. }
  230. // 初始化新增form表单
  231. initForm() {
  232. this.endTimeHourdis = () => [];
  233. this.endTimeMindis = () => [];
  234. this.startTimeHourdis = () => [];
  235. this.startTimeMindis = () => [];
  236. this.validateForm = this.fb.group({
  237. taskType: [null, [Validators.required]],
  238. limitAllDept: [1, [Validators.required]],
  239. buildingIds: [[]],
  240. deptIds: [[]],
  241. limitType: [1, [Validators.required]],
  242. startTime: [null],
  243. endTime: [null],
  244. remark: ['', [Validators.required]],
  245. // new
  246. limitNum: [0, [Validators.required]],
  247. limitTime: ['0.5', [Validators.required]],
  248. fqLimitNum: [0, [Validators.required]],
  249. yyLimitNum: [0, [Validators.required]],
  250. createRemark: ['', [Validators.required]],
  251. yyLimitRemark: ['', [Validators.required]],
  252. limitDispatchDesk: [0, [Validators.required]],
  253. });
  254. }
  255. // 修改是否限制所有科室
  256. changeLimitAllDept(e){
  257. this.validateForm.controls.buildingIds.setValue([]);
  258. this.validateForm.controls.deptIds.setValue([]);
  259. }
  260. // 修改限制方式
  261. changeLimitType(e){
  262. console.log(e);
  263. this.validateForm.controls.limitDispatchDesk.setValue(0);
  264. if(e == 1){
  265. // 仅提示允许建单
  266. this.validateForm.get('limitDispatchDesk')!.clearValidators();
  267. this.validateForm.get('limitDispatchDesk')!.markAsPristine();
  268. }else if(e == 2){
  269. // 提示不允许建单
  270. this.validateForm.get('limitDispatchDesk')!.setValidators(Validators.required);
  271. this.validateForm.get('limitDispatchDesk')!.markAsDirty();
  272. }
  273. this.validateForm.get('limitDispatchDesk')!.updateValueAndValidity();
  274. }
  275. // 修改是否限制发起数量
  276. changeLimitNum(e){
  277. console.log(e);
  278. this.validateForm.controls.limitTime.setValue('0.5');
  279. this.validateForm.controls.fqLimitNum.setValue(0);
  280. this.validateForm.controls.yyLimitNum.setValue(0);
  281. this.validateForm.controls.createRemark.setValue('');
  282. this.validateForm.controls.yyLimitRemark.setValue('');
  283. if(e == 1){
  284. // 是
  285. this.validateForm.get('limitTime')!.setValidators(Validators.required);
  286. this.validateForm.get('limitTime')!.markAsDirty();
  287. this.validateForm.get('fqLimitNum')!.setValidators(Validators.required);
  288. this.validateForm.get('fqLimitNum')!.markAsDirty();
  289. this.validateForm.get('yyLimitNum')!.setValidators(Validators.required);
  290. this.validateForm.get('yyLimitNum')!.markAsDirty();
  291. this.validateForm.get('createRemark')!.setValidators(Validators.required);
  292. this.validateForm.get('createRemark')!.markAsDirty();
  293. this.validateForm.get('yyLimitRemark')!.setValidators(Validators.required);
  294. this.validateForm.get('yyLimitRemark')!.markAsDirty();
  295. this.validateForm.get('remark')!.clearValidators();
  296. this.validateForm.get('remark')!.markAsPristine();
  297. }else if(e == 0){
  298. // 否
  299. this.validateForm.get('limitTime')!.clearValidators();
  300. this.validateForm.get('limitTime')!.markAsPristine();
  301. this.validateForm.get('fqLimitNum')!.clearValidators();
  302. this.validateForm.get('fqLimitNum')!.markAsPristine();
  303. this.validateForm.get('yyLimitNum')!.clearValidators();
  304. this.validateForm.get('yyLimitNum')!.markAsPristine();
  305. this.validateForm.get('createRemark')!.clearValidators();
  306. this.validateForm.get('createRemark')!.markAsPristine();
  307. this.validateForm.get('yyLimitRemark')!.clearValidators();
  308. this.validateForm.get('yyLimitRemark')!.markAsPristine();
  309. this.validateForm.get('remark')!.setValidators(Validators.required);
  310. this.validateForm.get('remark')!.markAsDirty();
  311. }
  312. this.validateForm.get('limitDispatchDesk')!.updateValueAndValidity();
  313. this.validateForm.get('fqLimitNum')!.updateValueAndValidity();
  314. this.validateForm.get('yyLimitNum')!.updateValueAndValidity();
  315. this.validateForm.get('createRemark')!.updateValueAndValidity();
  316. this.validateForm.get('yyLimitRemark')!.updateValueAndValidity();
  317. }
  318. // 新增/编辑表单提交
  319. submitForm(): void {
  320. for (const i in this.validateForm.controls) {
  321. this.validateForm.controls[i].markAsDirty();
  322. this.validateForm.controls[i].updateValueAndValidity();
  323. }
  324. if (this.validateForm.invalid) {
  325. return;
  326. }
  327. if(this.validateForm.value.limitAllDept == 0 && !this.validateForm.value.buildingIds.length && !this.validateForm.value.deptIds.length){
  328. this.message.info('请设置楼栋或科室!');
  329. return;
  330. }
  331. if((/^\s+/.test(this.validateForm.value.remark) || /\s+$/.test(this.validateForm.value.remark)) && !this.validateForm.value.remark.trim()){
  332. this.message.info('请设置提示备注!');
  333. return;
  334. }
  335. if(this.validateForm.value.startTime.getTime() >= this.validateForm.value.endTime.getTime()){
  336. this.message.info('开始时间不能大于结束时间!');
  337. return;
  338. }
  339. this.btnLoading = true;
  340. let data = {};
  341. if (this.add) {
  342. //增加
  343. data = {
  344. taskType: this.validateForm.value.taskType.toString(),
  345. limitAllDept: this.validateForm.value.limitAllDept,
  346. buildingIds: this.validateForm.value.buildingIds.length ? this.validateForm.value.buildingIds.toString() : null,
  347. deptIds: this.validateForm.value.deptIds.length ? this.validateForm.value.deptIds.toString() : null,
  348. limitType: this.validateForm.value.limitType,
  349. startTime: format(startOfMinute(this.validateForm.value.startTime), "yyyy-MM-dd HH:mm:ss"),
  350. endTime: format(endOfMinute(this.validateForm.value.endTime), "yyyy-MM-dd HH:mm:ss"),
  351. remark: this.validateForm.value.remark.trim(),
  352. hosId: this.currentHospital.id,
  353. limitNum: this.validateForm.value.limitNum,
  354. limitTime: this.validateForm.value.limitTime,
  355. fqLimitNum: this.validateForm.value.fqLimitNum,
  356. yyLimitNum: this.validateForm.value.yyLimitNum,
  357. createRemark: this.validateForm.value.createRemark.trim(),
  358. yyLimitRemark: this.validateForm.value.yyLimitRemark.trim(),
  359. limitDispatchDesk: this.validateForm.value.limitDispatchDesk,
  360. };
  361. } else {
  362. //编辑
  363. data = {
  364. ...this.coopId,
  365. taskType: this.validateForm.value.taskType.toString(),
  366. limitAllDept: this.validateForm.value.limitAllDept,
  367. buildingIds: this.validateForm.value.buildingIds.length ? this.validateForm.value.buildingIds.toString() : null,
  368. deptIds: this.validateForm.value.deptIds.length ? this.validateForm.value.deptIds.toString() : null,
  369. limitType: this.validateForm.value.limitType,
  370. startTime: format(startOfMinute(this.validateForm.value.startTime), "yyyy-MM-dd HH:mm:ss"),
  371. endTime: format(endOfMinute(this.validateForm.value.endTime), "yyyy-MM-dd HH:mm:ss"),
  372. remark: this.validateForm.value.remark.trim(),
  373. hosId: this.currentHospital.id,
  374. limitNum: this.validateForm.value.limitNum,
  375. limitTime: this.validateForm.value.limitTime,
  376. fqLimitNum: this.validateForm.value.fqLimitNum,
  377. yyLimitNum: this.validateForm.value.yyLimitNum,
  378. createRemark: this.validateForm.value.createRemark.trim(),
  379. yyLimitRemark: this.validateForm.value.yyLimitRemark.trim(),
  380. limitDispatchDesk: this.validateForm.value.limitDispatchDesk,
  381. };
  382. }
  383. this.limitInitiationTimeService
  384. .simplePost("addData", "workTimeRule", data)
  385. .subscribe((result) => {
  386. this.btnLoading = false;
  387. this.hideAddModal();
  388. this.initForm();
  389. if (result.status == 200) {
  390. if (this.add) {
  391. this.showPromptModal("新增", true, "");
  392. this.listLength++;
  393. }else{
  394. this.showPromptModal("编辑", true, "");
  395. }
  396. } else {
  397. this.showPromptModal(this.add ? '新增' : '修改', false, result.msg);
  398. }
  399. });
  400. }
  401. // 编辑
  402. edit(data) {
  403. console.log(data);
  404. this.modelName = "编辑";
  405. this.add = false;
  406. this.modal = true;
  407. this.coopId = data;
  408. this.taskTypeList = data.taskTypeDTO || [];
  409. this.validateForm.controls.taskType.setValue(this.taskTypeList.map(v => v.id)); //任务类型
  410. this.validateForm.controls.limitAllDept.setValue(data.limitAllDept); //是否限制所有科室
  411. this.buildingList = data.buildingList || [];
  412. this.validateForm.controls.buildingIds.setValue(this.buildingList.map(v => v.id)); //楼栋
  413. this.departmentList = data.deptList || [];
  414. this.validateForm.controls.deptIds.setValue( this.departmentList.map(v => v.id)); //科室
  415. this.validateForm.controls.limitType.setValue(data.limitType); //限制方式
  416. if (data.startTime && data.endTime) {
  417. this.validateForm.controls.startTime.setValue(new Date(data.startTime));
  418. this.validateForm.controls.endTime.setValue(new Date(data.endTime));
  419. }
  420. this.validateForm.controls.remark.setValue(data.remark); //提示备注
  421. this.validateForm.controls.limitNum.setValue(data.limitNum);
  422. this.validateForm.controls.limitTime.setValue(data.limitTime);
  423. this.validateForm.controls.fqLimitNum.setValue(data.fqLimitNum);
  424. this.validateForm.controls.yyLimitNum.setValue(data.yyLimitNum);
  425. this.validateForm.controls.createRemark.setValue(data.createRemark);
  426. this.validateForm.controls.yyLimitRemark.setValue(data.yyLimitRemark);
  427. this.validateForm.controls.limitDispatchDesk.setValue(data.limitDispatchDesk);
  428. }
  429. // 展示信息提示框(con:提示信息,success:操作是否成功,promptInfo:操作结果提示信息)
  430. showPromptModal(con, success, promptInfo?) {
  431. this.promptModalShow = false;
  432. this.promptContent = con;
  433. this.ifSuccess = success;
  434. this.promptInfo = promptInfo;
  435. setTimeout(() => {
  436. this.promptModalShow = true;
  437. }, 100);
  438. this.getList(0);
  439. }
  440. delModal: boolean = false; //删除模态框
  441. tipsMsg1: string; //提示框信息
  442. tipsMsg2: string; //操作后信息
  443. confirmDelType: string; //确认的类型(启用/停用,删除)
  444. showDelModal(
  445. data,
  446. tipsMsg1: string,
  447. tipsMsg2: string,
  448. type: string,
  449. ) {
  450. this.confirmDelType = type;
  451. this.delModal = true;
  452. this.coopId = data;
  453. this.tipsMsg1 = tipsMsg1;
  454. this.tipsMsg2 = tipsMsg2;
  455. }
  456. // 隐藏删除框
  457. hideDelModal() {
  458. this.delModal = false;
  459. }
  460. // 确认删除
  461. confirmDel() {
  462. this.btnLoading = true;
  463. if (this.confirmDelType === "del") {
  464. //删除
  465. this.limitInitiationTimeService
  466. .simplePost("rmvData", "workTimeRule", [this.coopId.id])
  467. .subscribe((data) => {
  468. this.btnLoading = false;
  469. this.delModal = false;
  470. if (data.status == 200) {
  471. if (
  472. this.listOfData.length == 1 &&
  473. this.pageIndex == Math.ceil(this.listLength / this.pageSize)
  474. ) {
  475. this.listLength--;
  476. if (this.listLength === 0) {
  477. this.pageIndex = 1;
  478. } else {
  479. this.pageIndex = Math.ceil(this.listLength / this.pageSize);
  480. }
  481. }
  482. this.showPromptModal(this.tipsMsg2, true, "");
  483. } else {
  484. this.showPromptModal(this.tipsMsg2, false, data.msg);
  485. }
  486. });
  487. }
  488. }
  489. }