liusheng
2025-04-25 fce30cf9f7692d49c3d408475dfb72d289b1cd4f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
package com.smartor.service.impl;
 
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.StringUtils;
import com.smartor.domain.*;
import com.smartor.mapper.*;
import com.smartor.service.IPatArchiveService;
import com.smartor.service.IPatMedInhospService;
import com.smartor.service.IPatMedOuthospService;
import com.smartor.service.IPatMedPhysicalService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
 
import java.io.FileOutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
 
/**
 * 患者档案Service业务层处理
 *
 * @author smartor
 * @date 2023-03-04
 */
@Slf4j
@Service
public class PatArchiveServiceImpl implements IPatArchiveService {
    @Autowired
    private PatArchiveMapper patArchiveMapper;
 
    @Autowired
    private ServiceSubtaskMapper serviceSubtaskMapper;
 
    @Autowired
    private BaseTagMapper baseTagMapper;
 
    @Autowired
    private PatArchivetagMapper patArchivetagMapper;
 
    @Autowired
    private IPatMedInhospService patMedInhospService;
 
    @Autowired
    private PatArchivecontactMapper patArchivecontactMapper;
 
    @Autowired
    private IPatMedPhysicalService patMedPhysicalService;
 
    @Autowired
    private RedisCache redisCache;
 
 
    /**
     * 查询患者档案
     *
     * @param patid 患者档案主键
     * @return 患者档案
     */
    @Override
    public PatArchive selectPatArchiveByPatid(Long patid) {
        return patArchiveMapper.selectPatArchiveByPatid(patid);
    }
 
    /**
     * 查询患者档案列表
     *
     * @param patArchive 患者档案
     * @return 患者档案
     */
    @Override
    public List<PatArchive> selectPatArchiveList(PatArchive patArchive) {
        return patArchiveMapper.selectPatArchiveList(patArchive);
    }
 
 
    /**
     * 新增患者档案
     *
     * @param patArchive 患者档案
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Integer insertPatArchive(PatArchive patArchive) {
        patArchive.setCreateTime(DateUtils.getNowDate());
        patArchiveMapper.insertPatArchiveSingle(patArchive);
        return patArchive.getId().intValue();
    }
 
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean update(PatArchive patArchive) {
        int i = patArchiveMapper.updatePatArchive(patArchive);
        if (i != 1) {
            return false;
        } else {
            ServiceSubtask serviceSubtask = new ServiceSubtask();
            serviceSubtask.setPatid(patArchive.getId());
            serviceSubtask.setSendname(patArchive.getName());
            serviceSubtask.setPhone(patArchive.getTelcode());
            serviceSubtask.setSex(patArchive.getSex());
            serviceSubtask.setAge(patArchive.getAge());
            serviceSubtask.setSfzh(patArchive.getIdcardno());
            serviceSubtask.setAddr(patArchive.getPlaceOfResidence());
            serviceSubtaskMapper.updateServiceSubtaskByPatId(serviceSubtask);
        }
        return true;
    }
 
    /**
     * 新增或修改患者档信息
     *
     * @param patArchiveVO 新增或修改患者档信息
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean saveOrUpdatePatInfo(PatArchiveVO patArchiveVO) {
        //通过isoperation来判断是否新增
        PatArchive patArchive = DtoConversionUtils.sourceToTarget(patArchiveVO, PatArchive.class);
        if (patArchiveVO.getIsoperation() != null && patArchiveVO.getIsoperation() == 1 || patArchiveVO.getId() == null) {
            //新增
            List<PatArchive> patArchives = new ArrayList<>();
            patArchive.setUpdateTime(DateUtils.getNowDate());
            patArchives.add(patArchive);
            patArchiveMapper.insertPatArchive(patArchives);
        } else if (patArchiveVO.getIsoperation() != null && patArchiveVO.getIsoperation() == 2 || patArchiveVO.getId() != null) {
            //修改
            patArchiveVO.setIsoperation(2);
            patArchiveMapper.updatePatArchive(patArchive);
            if (StringUtils.isNotEmpty(patArchive.getNotrequiredFlag()) && patArchive.getNotrequiredFlag().equals("1")) {
                //不需要服务了,需要通过patid和sendstate=2或者sendstate=1去查询一下,service_subtask里是否有正在执行的任务,有的话,立即停了
                ServiceSubtaskVO serviceSubtaskVO = new ServiceSubtaskVO();
                serviceSubtaskVO.setPatid(patArchive.getId());
                serviceSubtaskVO.setSendstate(2L);
                List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
                serviceSubtaskVO.setSendstate(1L);
                List<ServiceSubtask> serviceSubtaskList1 = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
                if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
                    if (CollectionUtils.isNotEmpty(serviceSubtaskList1)) serviceSubtaskList.addAll(serviceSubtaskList1);
                } else {
                    if (CollectionUtils.isNotEmpty(serviceSubtaskList1)) serviceSubtaskList = serviceSubtaskList1;
                }
                //去redis中,查询是否有subid,有的话移除cache-exist
                if (CollectionUtils.isNotEmpty(serviceSubtaskList)) {
                    for (ServiceSubtask serviceSubtask : serviceSubtaskList) {
                        log.error("需要移除的subId为:{}", serviceSubtask.getId().toString());
                        serviceSubtaskMapper.deleteServiceSubtaskById(serviceSubtask.getId());
                        redisCache.removeElementFromList("cache-exist", serviceSubtask.getId().toString());
                        redisCache.removeElementFromList("cache-0", serviceSubtask.getId().toString());
                        redisCache.removeElementFromList("cache-1", serviceSubtask.getId().toString());
                        redisCache.removeElementFromList("cache-2", serviceSubtask.getId().toString());
                        redisCache.removeElementFromList("cache-3", serviceSubtask.getId().toString());
                        redisCache.removeElementFromList("cache-4", serviceSubtask.getId().toString());
                    }
                }
            }
        }
 
        if (CollectionUtils.isNotEmpty(patArchiveVO.getTagList())) {
            //处理标签(新增、删除)
            for (PatArchivetag patArchivetag : patArchiveVO.getTagList()) {
                patArchivetag.setGuid(patArchiveVO.getGuid());
                patArchivetag.setOrgid(patArchiveVO.getOrgid());
                if (patArchivetag.getIsoperation() != null && patArchivetag.getIsoperation() == 1 || patArchivetag.getIsoperation() == null && patArchiveVO.getIsoperation() == 1) {
                    //判断一下base_tag里是不是存在,如果不存在,先新增
                    BaseTag baseTag = new BaseTag();
                    baseTag.setTagname(patArchivetag.getTagname().trim());
                    List<BaseTag> baseTags = baseTagMapper.selectBaseTagListByTagname(baseTag);
                    if (CollectionUtils.isEmpty(baseTags)) {
                        //先给放到未分类中
                        baseTag.setTagcategoryid(6L);
                        baseTag.setOrgid(patArchiveVO.getOrgid());
                        baseTag.setDelFlag("0");
                        baseTag.setUpdateTime(new Date());
                        baseTag.setCreateTime(new Date());
                        baseTagMapper.insertBaseTag(baseTag);
                        patArchivetag.setTagid(baseTag.getTagid());
                    } else {
                        patArchivetag.setTagid(baseTags.get(0).getTagid());
                    }
                    //新增
                    patArchivetag.setUpdateBy(null);
                    patArchivetag.setCreateTime(new Date());
                    patArchivetag.setPatid(patArchive.getId());
                    patArchivetagMapper.insertPatArchivetag(patArchivetag);
                } else if (patArchivetag.getIsoperation() != null && patArchivetag.getIsoperation() == 3 || patArchivetag.getIsoperation() == null && patArchiveVO.getIsoperation() == 3) {
                    patArchivetag.setDelFlag("1");
                    //删除
                    log.info("标签的id为:{}", patArchivetag.getTagid());
                    patArchivetagMapper.deletePatArchivetagById(patArchivetag);
                }
            }
 
        }
        return true;
    }
 
    /**
     * 批量删除患者档案
     *
     * @param patids 需要删除的患者档案主键
     * @return 结果
     */
    @Override
    public int deletePatArchiveByPatids(Long[] patids) {
        return patArchiveMapper.deletePatArchiveByPatids(patids);
    }
 
    /**
     * 删除患者档案信息
     *
     * @param patid 患者档案主键
     * @return 结果
     */
    @Override
    public int deletePatArchiveByPatid(Long patid) {
        return patArchiveMapper.deletePatArchiveByPatid(patid);
    }
 
    /**
     * 获取患者信息
     *
     * @param patArchiveReq
     * @return
     */
    @Override
    public List<PatArchiveOthreInfo> getPatientInfo(PatArchiveReq patArchiveReq) {
        if (CollectionUtils.isEmpty(patArchiveReq.getLeavehospitaldistrictcodes()) || patArchiveReq.getLeavehospitaldistrictcodes().size() == 0) {
            patArchiveReq.setLeavehospitaldistrictcodes(null);
        }
        if (CollectionUtils.isEmpty(patArchiveReq.getLeaveldeptcodes()) || patArchiveReq.getLeaveldeptcodes().size() == 0) {
            patArchiveReq.setLeaveldeptcodes(null);
        }
 
        List<PatArchiveOthreInfo> patArchiveList = new ArrayList<>();
        if (patArchiveReq.getAllhosp() != null && patArchiveReq.getAllhosp() == 1) {
            //  查看住院  1  查看门诊  2   查看体检  3
            List<PatArchiveOthreInfo> patArchives1 = patArchiveMapper.selectPatArchiveInfoByInhosp(patArchiveReq);
            if (CollectionUtils.isNotEmpty(patArchives1)) {
                patArchiveList.addAll(patArchives1);
            }
        } else if (patArchiveReq.getAllhosp() != null && patArchiveReq.getAllhosp() == 2) {
            // 查看住院  1  查看门诊  2   查看体检  3
            List<PatArchiveOthreInfo> patArchives2 = patArchiveMapper.selectPatArchiveInfoByOuthosp(patArchiveReq);
            if (CollectionUtils.isNotEmpty(patArchives2)) {
                patArchiveList.addAll(patArchives2);
            }
        } else if (patArchiveReq.getAllhosp() != null && patArchiveReq.getAllhosp() == 3) {
            //  查看住院  1  查看门诊  2   查看体检  3
            List<PatArchiveOthreInfo> patArchives3 = patArchiveMapper.selectPatArchiveInfoByPhysical(patArchiveReq);
            if (CollectionUtils.isNotEmpty(patArchives3)) {
                patArchiveList.addAll(patArchives3);
            }
        }
 
        return patArchiveList;
    }
 
 
    @Override
    @Transactional
    public PatUpInfoVO importFilehandle(SysUser user, String tags, MultipartFile file) {
        System.out.println("start : " + System.currentTimeMillis() / 1000);
        PatUpInfoVO patUpInfoVO = new PatUpInfoVO();
        //需要处理的总行数
        int lastRowNum = 0;
 
        final List<PatArchive> errorpatArchiveList = new ArrayList<>();
        //创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(10);
        try {
            Workbook workbook = new XSSFWorkbook(file.getInputStream());
            Sheet sheet = workbook.getSheetAt(0);
 
            //获取文件里的总行数
            lastRowNum = sheet.getLastRowNum();
            //将文件里的数据分成10份
            int partsize = lastRowNum / 10;
            for (int i = 0; i < 10; i++) {
                int start = i * partsize + 1;
                int end = (i + 1) * partsize;
 
                pool.execute(new Runnable() {
                    @Override
                    public void run() {
                        for (int j = start; j <= end; j++) {
                            List<PatArchive> patArchives = new ArrayList<>();
                            String name = Thread.currentThread().getName();
                            Row row = sheet.getRow(j);
                            //如果行为空,进行下一次循环
                            if (ObjectUtils.isEmpty(row)) {
                                continue;
                            }
                            PatArchive patArchive = new PatArchive();
                            if (ObjectUtils.isEmpty(row.getCell(6)) || StringUtils.isEmpty(row.getCell(6).toString())) {
                                addRemark("证件号码为空", patArchive);
                            } else {
                                patArchive.setIdcardno(row.getCell(6).toString());
                                //根据身份证,先去患者管理表里看看有没有这个人,如果有这个人,也不需要插入患者表
                                // (这一块查询会影响整体的速度,需要优化)
                                List<PatArchive> patArchiveList1 = patArchiveMapper.selectPatArchiveList(patArchive);
                                if (patArchiveList1.size() > 0) {
                                    patArchive.setRemark("该患者已存在");
                                }
                            }
 
                            //判断姓名是否为空
                            if (Objects.isNull(row.getCell(0)) || StringUtils.isEmpty(row.getCell(0).toString())) {
                                addRemark("姓名为空", patArchive);
                            } else {
                                patArchive.setName(row.getCell(0).toString());
                            }
 
                            //判断性别是否为空
                            if (ObjectUtils.isEmpty(row.getCell(1)) || StringUtils.isEmpty(row.getCell(1).toString())) {
                                addRemark("性别为空", patArchive);
                            } else {
                                patArchive.setSex(row.getCell(1).toString().equals("男") ? 1L : 2L);
                            }
 
                            //判断证件类型是否为空
                            if (ObjectUtils.isEmpty(row.getCell(2)) || StringUtils.isEmpty(row.getCell(2).toString())) {
                                addRemark("证件类型为空", patArchive);
                            } else {
                                patArchive.setIdcardtype(row.getCell(2).toString());
                            }
 
                            //判断籍贯是否为空
                            if (ObjectUtils.isEmpty(row.getCell(3)) || StringUtils.isEmpty(row.getCell(3).toString())) {
                                patArchive.setNativePlace(null);
                            } else {
                                patArchive.setNativePlace(row.getCell(3).toString());
                            }
 
                            //判断居住地是否为空
                            if (ObjectUtils.isEmpty(row.getCell(4)) || StringUtils.isEmpty(row.getCell(4).toString())) {
                                patArchive.setPlaceOfResidence(null);
                            } else {
                                patArchive.setPlaceOfResidence(row.getCell(4).toString());
                            }
 
                            //判断居住地是否为空
                            if (ObjectUtils.isEmpty(row.getCell(5)) || StringUtils.isEmpty(row.getCell(5).toString())) {
                                patArchive.setBirthplace(null);
                            } else {
                                patArchive.setBirthplace(row.getCell(5).toString());
                            }
 
                            //判断出生日期是否为空
                            if (ObjectUtils.isEmpty(row.getCell(7)) || StringUtils.isEmpty(row.getCell(7).toString())) {
//                    addRemark("出生日期为空", patArchive);
                                patArchive.setBirthdate(null);
                            } else {
                                //格式转换,转成日期
                                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                                Date javaDate = new Date();
                                if (row.getCell(7).getCellType().toString().equals("NUMERIC")) {
                                    javaDate = HSSFDateUtil.getJavaDate(row.getCell(7).getNumericCellValue());
                                } else {
                                    try {
                                        javaDate = dateFormat.parse(row.getCell(7).toString());
                                    } catch (ParseException e) {
                                        e.printStackTrace();
                                    }
                                }
                                dateFormat.format(javaDate);
                                patArchive.setBirthdate(javaDate);
                            }
 
                            //判断年龄是否为空
                            if (ObjectUtils.isEmpty(row.getCell(8)) || StringUtils.isEmpty(row.getCell(8).toString())) {
                                patArchive.setAge(null);
                            } else {
                                patArchive.setAge(Long.valueOf(row.getCell(8).toString()));
                            }
 
                            //判断本人联系是否为空,和长度是否正确
                            if (ObjectUtils.isEmpty(row.getCell(12)) || StringUtils.isEmpty(row.getCell(12).toString())) {
                                addRemark("本人联系电话为空", patArchive);
                            } else {
                                //格式转换,转成文本
                                if (row.getCell(12).getCellType().toString().equals("NUMERIC")) {
                                    String cellData = String.valueOf((long) row.getCell(12).getNumericCellValue());
                                    patArchive.setTelcode(cellData);
                                } else {
                                    DataFormatter dataFormatter = new DataFormatter();
                                    String cellValue = dataFormatter.formatCellValue(row.getCell(12));
                                    patArchive.setTelcode(cellValue);
                                }
                            }
 
                            //判断亲属联系方式是否为空,长度是否正确
                            if (ObjectUtils.isEmpty(row.getCell(13)) || StringUtils.isEmpty(row.getCell(13).toString())) {
//                    addRemark("亲属联系方式为空", patArchive);
                                patArchive.setRelativetelcode(null);
                            } else {
                                //格式转换,转成文本
                                if (row.getCell(13).getCellType().toString().equals("NUMERIC")) {
                                    String cellData = String.valueOf((long) row.getCell(13).getNumericCellValue());
                                    patArchive.setRelativetelcode(cellData);
                                } else {
                                    DataFormatter dataFormatter = new DataFormatter();
                                    String cellValue = dataFormatter.formatCellValue(row.getCell(13));
                                    patArchive.setRelativetelcode(cellValue);
                                }
                            }
                            //判断民族是否为空
                            if (ObjectUtils.isEmpty(row.getCell(14)) || StringUtils.isEmpty(row.getCell(14).toString())) {
                                patArchive.setNation(null);
                            } else {
                                patArchive.setNation(row.getCell(14).toString());
                            }
 
                            //患都标签是否为空
                            if (ObjectUtils.isEmpty(row.getCell(17)) || StringUtils.isEmpty(row.getCell(17).toString())) {
                                patArchive.setTag(tags);
                            } else {
                                if (StringUtils.isNotEmpty(tags)) {
                                    patArchive.setTag(row.getCell(17).toString() + "," + tags);
                                } else {
                                    patArchive.setTag(row.getCell(17).toString());
                                }
                            }
 
                            //判断备注是否为空
                            if (!StringUtils.isEmpty(patArchive.getRemark())) {
                                //如果备注字段不为空,说有该患者填写有问题
                                errorpatArchiveList.add(patArchive);
                                continue;
                            }
 
                            patArchive.setUploadTime(new Date());
                            patArchive.setIsupload(0L);
                            //往患者表里新增,并获取到新增ID
                            patArchive.setOrgid(user.getOrgid());
                            patArchives.add(patArchive);
                            int i1 = patArchiveMapper.insertPatArchive(patArchives);
 
//                            // 根据标签名查询出标签信息
//                            String s = patArchive.getTag();
//                            String[] split = s.split(",");
//                            for (String tagName : split) {
//                                BaseTag baseTag = new BaseTag();
//                                baseTag.setTagname(tagName);
//                                List<BaseTag> baseTags = baseTagMapper.selectBaseTagList(baseTag);
//
//                                //如果该标签为空,现标签管理没有出现过的新标签时,自动将标签添加到"标签管理"未分类“中。编辑人为导入账号
//                                if (CollectionUtils.isEmpty(baseTags)) {
//                                    baseTag = new BaseTag();
//                                    baseTag.setTagcategoryid(1L);
//                                    baseTag.setTagname(tagName);
//                                    baseTag.setOrgid(user.getDeptId().toString());
//                                    baseTag.setDelFlag("0");
//                                    baseTag.setCreateBy(user.getUserName());
//                                    baseTag.setCreateTime(new Date());
//                                    baseTag.setCreateBy(user.getUserName());
//                                    baseTag.setCreateTime(new Date());
//                                    baseTagMapper.insertBaseTag(baseTag);
//                                } else {
//                                    baseTag = baseTags.get(0);
//                                }
//
//                                // 新增患者档案标签
//                                PatArchivetag patArchivetag = DtoConversionUtils.sourceToTarget(baseTag, PatArchivetag.class);
//                                patArchivetag.setUpdateBy(user.getUserName());
//                                patArchivetag.setCreateTime(new Date());
//                                patArchivetag.setPatid(patArchive.getPatid());
//                                patArchivetagMapper.insertPatArchivetag(patArchivetag);
//                            }
 
                            patArchives.clear();
                        }
                    }
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        pool.shutdown();
        Boolean aa = true;
        d:
        while (aa) {
            boolean terminated = pool.isTerminated();
            if (terminated) {
                aa = false;
                continue d;
            }
        }
 
        if (errorpatArchiveList.size() != 0) {
            patUpInfoVO.setSuccessNum(lastRowNum - errorpatArchiveList.size());
            patUpInfoVO.setFailNum(errorpatArchiveList.size());
        } else {
            patUpInfoVO.setSuccessNum(lastRowNum == 0 ? 0 : lastRowNum);
            patUpInfoVO.setFailNum(0);
        }
        patUpInfoVO.setPatArchiveList(errorpatArchiveList);
        return patUpInfoVO;
    }
 
    @Override
    public String exportErrPatInfo(List<PatArchive> patArchiveList) {
        // 创建工作簿和工作表
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Sheet1");
        // 创建行和单元格,并设置单元格的值
        Row row = sheet.createRow(0);
        getdata(row, null, true);
 
        for (int i = 0; i < patArchiveList.size(); i++) {
            row = sheet.createRow(i + 1);
            getdata(row, patArchiveList.get(i), false);
        }
        // 保存工作簿到文件
        FileOutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream("患者错误信息.xlsx");
            workbook.write(outputStream);
            outputStream.close();
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
            return "导出失败";
        }
        return "导出成功";
    }
 
    @Override
    public List<PatArchive> patInfoByContion(PatArchiveReq patArchive) {
        List<PatArchive> patArchives = new ArrayList<>();
 
        //根据条件获取患者信息
//        List<PatArchive> patArchiveList = patArchiveMapper.patInfoByContion(patArchive);
        List<PatArchiveOthreInfo> patArchiveList = new ArrayList<>();
 
        if (patArchive.getEndtime() != null) {
            //出院时间只有住院才有
            patArchive.setAllhosp(1L);
        }
 
        if (patArchive.getAllhosp() != null && patArchive.getAllhosp() == 0) {
            List<PatArchiveOthreInfo> patArchives0 = patArchiveMapper.selectPatArchiveInfoByAllhosp(patArchive);
            if (CollectionUtils.isNotEmpty(patArchives0)) {
                patArchiveList.addAll(patArchives0);
            }
        } else if (patArchive.getAllhosp() != null && patArchive.getAllhosp() == 1) {
            List<PatArchiveOthreInfo> patArchives1 = patArchiveMapper.selectPatArchiveInfoByInhosp(patArchive);
            if (CollectionUtils.isNotEmpty(patArchives1)) {
                patArchiveList.addAll(patArchives1);
            }
        } else if (patArchive.getAllhosp() != null && patArchive.getAllhosp() == 2) {
            List<PatArchiveOthreInfo> patArchives2 = patArchiveMapper.selectPatArchiveInfoByOuthosp(patArchive);
            if (CollectionUtils.isNotEmpty(patArchives2)) {
                patArchiveList.addAll(patArchives2);
            }
        } else if (patArchive.getAllhosp() != null && patArchive.getAllhosp() == 3) {
            List<PatArchiveOthreInfo> patArchives3 = patArchiveMapper.selectPatArchiveInfoByPhysical(patArchive);
            if (CollectionUtils.isNotEmpty(patArchives3)) {
                patArchiveList.addAll(patArchives3);
            }
        }
 
        //根据患者ID进行分组
        Map<Long, List<PatArchiveOthreInfo>> listMap = patArchiveList.stream().collect(Collectors.groupingBy(PatArchiveOthreInfo::getId));
 
        //对数据进行封装
        for (List<PatArchiveOthreInfo> list : listMap.values()) {
            PatArchive patArchive1 = new PatArchive();
            Set<PatArchivetag> stringList = new HashSet<>();
            for (int i = 0; i < list.size(); i++) {
                if (i == 0) {
                    patArchive1 = DtoConversionUtils.sourceToTarget(list.get(0), PatArchive.class);
                    //将标签置空,不空也没有问题
                    patArchive1.setTag("");
                }
                //将查出的tag,放到patArchive1里的TagList中
                PatArchivetag patArchivetag = new PatArchivetag();
                patArchivetag.setTagname(list.get(i).getTag());
                patArchivetag.setTagid(list.get(i).getTagid());
                stringList.add(patArchivetag);
            }
            patArchive1.setTagList(stringList.stream().collect(Collectors.toList()));
            patArchives.add(patArchive1);
        }
        //将patArchives里的tagList放到patArchiveList的对象里
        for (PatArchiveOthreInfo poi : patArchiveList) {
            for (PatArchive pa : patArchives) {
                if (poi.getId() == pa.getId()) {
                    poi.setTagList(pa.getTagList());
 
                }
            }
        }
 
        List<PatArchive> patArchiveList1 = DtoConversionUtils.sourceToTarget(patArchiveList, PatArchive.class);
        //给患者联系人赋值
//        for (PatArchive pa : patArchives) {
        for (PatArchive pa : patArchiveList1) {
            PatArchivecontact patArchivecontact = new PatArchivecontact();
            patArchivecontact.setPatid(pa.getId());
            pa.setPatArchivecontactList(patArchivecontactMapper.selectPatArchivecontactList(patArchivecontact));
        }
 
        return patArchiveList1;
    }
 
    @Override
    public List<PatArchivetagAndPatientInfo> patTagByContion(List<Long> tagids) {
        List<PatArchivetagAndPatientInfo> patArchivetagAndPatientInfos = new ArrayList<>();
        if (tagids.size() > 0) {
            for (int i = 0; i < tagids.size(); i++) {
                PatArchivetag patArchivetag = new PatArchivetag();
                patArchivetag.setTagid(tagids.get(i));
                //获取患者patid
                List<PatArchivetag> patArchivetags1 = patArchivetagMapper.selectPatArchivetagAndBaseTagList(patArchivetag);
                for (int j = 0; j < patArchivetags1.size(); j++) {
                    PatArchivetagAndPatientInfo patArchivetagAndPatientInfo = DtoConversionUtils.sourceToTarget(patArchivetags1.get(j), PatArchivetagAndPatientInfo.class);
                    PatArchive patArchive = new PatArchive();
                    patArchive.setId(patArchivetagAndPatientInfo.getPatid());
                    List<PatArchive> patArchiveList = patArchiveMapper.selectPatArchiveList(patArchive);
                    patArchivetagAndPatientInfo.setPatNum(patArchiveList.size());
                    // patArchivetagAndPatientInfo.setPatArchives(patArchiveList);
                    patArchivetagAndPatientInfos.add(patArchivetagAndPatientInfo);
                }
            }
        } else {
            PatArchivetag patArchivetag = new PatArchivetag();
            //获取患者patid
            List<PatArchivetag> patArchivetags1 = patArchivetagMapper.selectPatArchivetagAndBaseTagList(patArchivetag);
            for (int j = 0; j < patArchivetags1.size(); j++) {
                PatArchivetagAndPatientInfo patArchivetagAndPatientInfo = DtoConversionUtils.sourceToTarget(patArchivetags1.get(j), PatArchivetagAndPatientInfo.class);
                PatArchive patArchive = new PatArchive();
                patArchive.setId(patArchivetagAndPatientInfo.getPatid());
                List<PatArchive> patArchiveList = patArchiveMapper.selectPatArchiveList(patArchive);
                //  patArchivetagAndPatientInfo.setPatArchives(patArchiveList);
                patArchivetagAndPatientInfo.setPatNum(patArchiveList.size());
                patArchivetagAndPatientInfos.add(patArchivetagAndPatientInfo);
            }
        }
        return patArchivetagAndPatientInfos;
    }
 
    @Override
    public List<PatArchivetagAndPatientInfo> patInfoByTag(List<Long> tagids) {
 
 
        return null;
    }
 
    @Override
    public List<Object> getUserTreatmentInfo(String pid, String type) {
        if (StringUtils.isEmpty(pid) || StringUtils.isEmpty(type)) {
            throw new BaseException("入参为空,请检查入参");
        }
        List<Object> objectList = new ArrayList<>();
 
        //通过患者获取门诊信息
        PatMedInhosp patMedInhosp = new PatMedInhosp();
        patMedInhosp.setInhospno(pid);
        List<PatMedInhosp> patMedInhosps = patMedInhospService.selectPatMedInhospList(patMedInhosp);
        objectList.addAll(patMedInhosps);
 
 
        return null;
    }
 
    private void getdata(Row row, PatArchive patArchive, Boolean head) {
        if (head) {
            row.createCell(0).setCellValue("姓名");
            row.createCell(1).setCellValue("性别");
            row.createCell(2).setCellValue("证件类型");
            row.createCell(3).setCellValue("证件号码");
            row.createCell(4).setCellValue("出生日期");
            row.createCell(5).setCellValue("本人联系方式");
            row.createCell(6).setCellValue("亲属联系方式");
            row.createCell(7).setCellValue("患者标签");
            row.createCell(8).setCellValue("错误原因");
        } else {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
            row.createCell(0).setCellValue(patArchive.getName());
            row.createCell(1).setCellValue(patArchive.getSex() == 1 ? "男" : "女");
            row.createCell(2).setCellValue(patArchive.getIdcardtype());
            row.createCell(3).setCellValue(patArchive.getIdcardno());
            if (ObjectUtils.isNotEmpty(patArchive.getBirthdate())) {
                row.createCell(4).setCellValue(simpleDateFormat.format(patArchive.getBirthdate()).toString());
            }
            row.createCell(5).setCellValue(patArchive.getTelcode());
            row.createCell(6).setCellValue(patArchive.getRelativetelcode());
            row.createCell(7).setCellValue(patArchive.getTag());
            row.createCell(8).setCellValue(patArchive.getRemark());
 
 
        }
 
    }
 
    public void addRemark(String info, PatArchive patArchive) {
        if (StringUtils.isNotEmpty(patArchive.getRemark()) == true) {
            patArchive.setRemark(patArchive.getRemark() + "," + info);
        } else {
            patArchive.setRemark(info);
        }
    }
 
    /**
     * 获取患者信息(去重)
     *
     * @param patArchiveReq
     * @return
     */
    @Override
    public List<PatArchiveOthreInfo> getPatientInfoQC(PatArchiveReq patArchiveReq) {
        if (CollectionUtils.isEmpty(patArchiveReq.getLeavehospitaldistrictcodes()) || patArchiveReq.getLeavehospitaldistrictcodes().size() == 0) {
            patArchiveReq.setLeavehospitaldistrictcodes(null);
        }
        if (CollectionUtils.isEmpty(patArchiveReq.getLeaveldeptcodes()) || patArchiveReq.getLeaveldeptcodes().size() == 0) {
            patArchiveReq.setLeaveldeptcodes(null);
        }
 
        List<PatArchiveOthreInfo> patArchiveList = new ArrayList<>();
        if (patArchiveReq.getAllhosp() != null && patArchiveReq.getAllhosp() == 1) {
            //  查看住院  1  查看门诊  2   查看体检  3
            List<PatArchiveOthreInfo> patArchives1 = patArchiveMapper.selectPatArchiveInfoByInhospQC(patArchiveReq);
            if (CollectionUtils.isNotEmpty(patArchives1)) {
                patArchiveList.addAll(patArchives1);
            }
        } else if (patArchiveReq.getAllhosp() != null && patArchiveReq.getAllhosp() == 2) {
            // 查看住院  1  查看门诊  2   查看体检  3
            List<PatArchiveOthreInfo> patArchives2 = patArchiveMapper.selectPatArchiveInfoByOuthospQC(patArchiveReq);
            if (CollectionUtils.isNotEmpty(patArchives2)) {
                patArchiveList.addAll(patArchives2);
            }
        } else if (patArchiveReq.getAllhosp() != null && patArchiveReq.getAllhosp() == 3) {
            //  查看住院  1  查看门诊  2   查看体检  3
            List<PatArchiveOthreInfo> patArchives3 = patArchiveMapper.selectPatArchiveInfoByPhysicalQC(patArchiveReq);
            if (CollectionUtils.isNotEmpty(patArchives3)) {
                patArchiveList.addAll(patArchives3);
            }
        }
 
        return patArchiveList;
    }
}