zm
2024-09-06 51065db2a119ddde88c7e1a7c4b37d9ef622921e
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
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
package com.product.file.service;
 
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.product.common.collect.ListUtils;
import com.product.common.collect.MapUtils;
import com.product.common.lang.DateUtils;
import com.product.common.lang.StringUtils;
import com.product.core.dao.BaseDao;
import com.product.core.entity.DataTableEntity;
import com.product.core.entity.FieldMetaEntity;
import com.product.core.entity.FieldSetEntity;
import com.product.core.exception.BaseException;
import com.product.core.service.support.AbstractBaseService;
import com.product.core.service.support.QueryFilterService;
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.core.transfer.Transactional;
import com.product.file.config.CmnConst;
import com.product.file.config.DocumentCode;
import com.product.file.service.ide.IDocumentService;
import com.product.module.sys.entity.SystemUser;
import com.product.util.BaseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.*;
 
/**
 * Copyright lx
 *
 * @Title: ClaimExpenseController
 * @Project: lx-SERVER
 * @Date: 2020-11-18 11:30:48
 * @Author: luoxin
 * @Description: 文件管理service
 */
@Component
public class DocumentService extends AbstractBaseService implements IDocumentService {
 
    @Autowired
    public BaseDao baseDao;
 
    @Autowired
    public DocumentService documentService;
 
    @Autowired
    QueryFilterService queryFilterService;
 
    @Autowired
    DocumentDirectoryService documentDirectoryService;
 
    @Override
    @Transactional
    public String addDocument(FieldSetEntity fse) throws BaseException {
        //获取附件目录和附件uuid
        String directory_uuid = fse.getString(CmnConst.DIRECTORY_UUID);
        String fileUUIDs = fse.getString(CmnConst.ATTACHMENTS_UUID);
        String[] fileUUIDArray = fileUUIDs.split(",");
        //获取附件信息
        DataTableEntity attachments = baseDao.listTable(CmnConst.PRODUCT_SYS_ATTACHMENTS, BaseUtil.buildQuestionMarkFilter(CmnConst.UUID, fileUUIDArray, true));
        List<String> uuidList = ListUtils.newArrayList();
        List<String> fileNameList = ListUtils.newArrayList();
        //循环附件信息,生成文档信息
        for (int i = 0, length = attachments.getRows(); i < length; i++) {
            FieldSetEntity attachment = attachments.getFieldSetEntity(i);
            //创建文档数据容器
            FieldSetEntity fseDocument = new FieldSetEntity(CmnConst.PRODUCT_OA_DOCUMENT);
            fseDocument.setValue(CmnConst.ATTACHMENTS_UUID, attachment.getUUID());
            fseDocument.setValue(CmnConst.DIRECTORY_UUID, directory_uuid);
            fseDocument.setValue(CmnConst.FILE_SIZE, attachment.getString(CmnConst.ATTACHMENT_SIZE));
            fseDocument.setValue(CmnConst.CREATED_BY, SpringMVCContextHolder.getCurrentUser().getUser_id());
            fseDocument.setValue(CmnConst.CREATED_UTC_DATETIME, DateUtils.getDateTime());
            //文件名称
            String file_name = attachment.getString(CmnConst.FILE_NAME);
            fseDocument.setValue(CmnConst.FILE_NAME, file_name);
            //文件类型
            String file_type = file_name.substring(file_name.lastIndexOf(".") + 1);
            fseDocument.setValue(CmnConst.FILE_TYPE, file_type);
            //保存数据
            String documentUUID = baseDao.add(fseDocument);
 
            //创建文档版本数据容器
            FieldSetEntity fseDocumentHistory = new FieldSetEntity(CmnConst.PRODUCT_OA_DOCUMENT_HISTORY);
            BaseUtil.createCreatorAndCreationTime(fseDocumentHistory);
            fseDocumentHistory.setValue("document_uuid", documentUUID);
            fseDocumentHistory.setValue("attachment_uuid", attachment.getUUID());
            fseDocumentHistory.setValue("version_number", "v1");
            baseDao.add(fseDocumentHistory);
 
            uuidList.add(documentUUID);
            fileNameList.add(file_name);
        }
        this.documentation(uuidList.toArray(), "新增", fileNameList.toArray(), null);
        return uuidList.toString();
    }
 
    @Override
    @Transactional
    public boolean upDocumentName(FieldSetEntity fieldSetEntity) throws BaseException {
        String uuid = fieldSetEntity.getString(CmnConst.UUID);
        String file_name = fieldSetEntity.getString(CmnConst.FILE_NAME);
        fieldSetEntity.setValue(CmnConst.UPDATED_BY, SpringMVCContextHolder.getCurrentUser().getUser_id());// 修改人
        fieldSetEntity.setValue(CmnConst.UPDATED_UTC_DATETIME, DateUtils.getDateTime());// 修改时间
        FieldSetEntity fie = baseDao.getFieldSetEntity(CmnConst.PRODUCT_OA_DOCUMENT, uuid, false);
        String name = fie.getString(CmnConst.FILE_NAME);
        //每次修改都亲空已读人员
        fieldSetEntity.setValue(CmnConst.READ_NUM, "");
        boolean flag = baseDao.update(fieldSetEntity);
        this.documentRepeatOrder(new Object[]{uuid}, "重命名", new Object[]{name}, new Object[]{file_name});
        return flag;
    }
 
    /**
     * 需要批量删除
     *
     * @param fieldSetEntity
     * @return
     * @throws BaseException
     */
    @Override
    @Transactional
    public boolean delDocument(FieldSetEntity fieldSetEntity) throws BaseException {
        String uuids = fieldSetEntity.getString(CmnConst.UUID);
        String file_names = fieldSetEntity.getString(CmnConst.FILE_NAME);
        String[] file_name = file_names.split(",");
        String[] uuid = uuids.split(",");
        boolean flag = baseDao.delete(CmnConst.PRODUCT_OA_DOCUMENT, uuid);
        this.documentation(uuid, "删除", file_name, null);
        return flag;
    }
 
    @Override
    public DataTableEntity documentAll(FieldSetEntity fieldSetEntity) throws BaseException {
        //文档目录uuid
        String directory_uuid = fieldSetEntity.getString(CmnConst.DIRECTORY_UUID);
        String queryFilter = queryFilterService.getQueryFilter(fieldSetEntity);
        if (!BaseUtil.strIsNull(queryFilter)) {
            queryFilter = " AND " + queryFilter;
        }
        // file_name created_by  created_utc_datetime
 
        StringBuffer sql = new StringBuffer();
 
        sql.append("SELECT \n");
        sql.append("  E.route_name,A.*,B.show_name name, \n");
        sql.append("  CONCAT(CONVERT(a.file_size / 1024, decimal(10,2)), 'KB') file_size_kb, \n");
        sql.append("  CASE WHEN D.document_uuid IS NOT NULL THEN '1' ELSE '0' END AS is_collection, \n");
        sql.append(" (SELECT case when COUNT(*)=0 then 1 else COUNT(*) end  FROM product_oa_document_history where product_oa_document_history.document_uuid=A.uuid) -1 history_count ");
        sql.append(" ,if(A.turn_button is null,'否','是') turn");
        sql.append(" FROM( \n");
        if ("!borrow".equals(directory_uuid)) {
            //借阅文件夹查询文件特殊处理
            sql.append("SELECT\n");
            sql.append("doc.*\n");
            sql.append("        FROM\n");
            sql.append("product_oa_directory dir\n");
            sql.append("JOIN product_oa_document doc ON dir.uuid = doc.uuid\n");
            sql.append("WHERE\n");
            sql.append("dir.directory_type = 1\n");
            sql.append("AND doc.attachments_uuid IN (\n");
            sql.append("        SELECT\n");
            sql.append("    sub_uuid\n");
            sql.append("        FROM\n");
            sql.append("    product_oa_document_borrow_sub\n");
            sql.append("        WHERE\n");
            sql.append("    borrow_uuid IN ( SELECT uuid FROM product_oa_document_borrow WHERE borrower = ? AND flow_flag=2))\n");
            directory_uuid = SpringMVCContextHolder.getCurrentUserId();
        } else if ("!favorite".equals(directory_uuid)) {
            sql.append("SELECT\n");
            sql.append("doc.*\n");
            sql.append("            FROM\n");
            sql.append("product_oa_document_collection collect\n");
            sql.append("JOIN product_oa_document doc ON collect.document_uuid = doc.uuid\n");
            sql.append("where document_collector=?\n");
            directory_uuid = SpringMVCContextHolder.getCurrentUserId();
        } else {
 
            sql.append("  SELECT * FROM product_oa_document \n");
            sql.append("  WHERE directory_uuid = ? \n");
        }
        sql.append(queryFilter);
        sql.append(")A \n");
        sql.append("LEFT JOIN product_sys_staffs B ON B.user_id = A.created_by \n");
        sql.append("LEFT JOIN product_sys_attachments C ON C.uuid = B.staff_avatar \n");
        sql.append("LEFT JOIN product_oa_document_collection D ON D.document_uuid = A.uuid AND D.created_by = ?");
        sql.append("LEFT JOIN product_sys_function_buttons E ON E.uuid = A.turn_button ");
 
        DataTableEntity documentData = baseDao.listTable(sql.toString(), new String[]{directory_uuid, SpringMVCContextHolder.getCurrentUserId()},
                fieldSetEntity.getInteger(CmnConst.PAGESIZE), fieldSetEntity.getInteger(CmnConst.CPAGE));
        baseDao.listInternationDataTable(documentData, null);
        return documentData;
    }
 
    @Override
    public FieldSetEntity documentInfo(FieldSetEntity fieldSetEntity) throws BaseException {
        String uuid = fieldSetEntity.getString(CmnConst.UUID);
        FieldSetEntity fieldSet = baseDao.getFieldSetEntity(CmnConst.PRODUCT_OA_DOCUMENT, uuid, true);
        String file_name = fieldSet.getString(CmnConst.FILE_NAME);
        String user_ids = fieldSetEntity.getString(CmnConst.USER_IDS);
        String read = fieldSetEntity.getString(CmnConst.READ_NUM);
        if (!BaseUtil.strIsNull(user_ids)) {
            fieldSetEntity.setValue(CmnConst.REQUIRED_NUMBER, user_ids.split(",").length);
            fieldSetEntity.setValue(CmnConst.READ_NUM, read.split(",").length);
        }
        this.documentation(new Object[]{uuid}, "查看", new Object[]{file_name}, null);
        return fieldSet;
    }
 
    @Override
    public void documentation(Object[] uuid, String opetype, Object[] file_name, String file_directory) throws BaseException {
        //获取文件信息存入日志表
        SystemUser user = SpringMVCContextHolder.getCurrentUser();
        DataTableEntity dataTableEntity = new DataTableEntity();
        FieldMetaEntity fieldMeta = new FieldMetaEntity();
        fieldMeta.setTableName(new String[]{CmnConst.PRODUCT_OA_DOCUMENT_LOG});
        dataTableEntity.setMeta(fieldMeta);
        for (int i = 0; i < uuid.length; i++) {
            FieldSetEntity fieldSetEntity = new FieldSetEntity();
            fieldSetEntity.setTableName(CmnConst.PRODUCT_OA_DOCUMENT_LOG);
            fieldSetEntity.setMeta(fieldMeta);
            fieldSetEntity.setValue(CmnConst.DOCUMENT_UUID, uuid[i]);
            //fieldSetEntity.setValue(CmnConst.RECORD,record);
            fieldSetEntity.setValue(CmnConst.OPETYPE, opetype);
            fieldSetEntity.setValue(CmnConst.OPE_DOCUMENT, file_name[i]);
            StringBuffer state = new StringBuffer();
            state.append(opetype)
                    .append("了[")
                    .append(file_name[i])
                    .append("]");
            if (!BaseUtil.strIsNull(file_directory)) {
                state.append("到").append(file_directory).append("目录下");
            }
            fieldSetEntity.setValue(CmnConst.STATE, state.toString()); //说明
            fieldSetEntity.setValue(CmnConst.CREATED_BY, user.getUser_id());// 创建人
            fieldSetEntity.setValue(CmnConst.CREATED_UTC_DATETIME, DateUtils.getDateTime());// 创建时间
            dataTableEntity.addFieldSetEntity(fieldSetEntity);
        }
        baseDao.add(dataTableEntity);
    }
 
    @Override
    public void documentRepeatOrder(Object[] uuid, String opetype, Object[] file_name, Object[] newFile_name) throws BaseException {
        //获取文件信息存入日志表
        SystemUser user = SpringMVCContextHolder.getCurrentUser();
        DataTableEntity dataTableEntity = new DataTableEntity();
        FieldMetaEntity fieldMeta = new FieldMetaEntity();
        fieldMeta.setTableName(new String[]{CmnConst.PRODUCT_OA_DOCUMENT_LOG});
        dataTableEntity.setMeta(fieldMeta);
        for (int i = 0; i < uuid.length; i++) {
            FieldSetEntity fieldSetEntity = new FieldSetEntity();
            fieldSetEntity.setTableName(CmnConst.PRODUCT_OA_DOCUMENT_LOG);
            fieldSetEntity.setMeta(fieldMeta);
            fieldSetEntity.setValue(CmnConst.DOCUMENT_UUID, uuid[i]);
            //fieldSetEntity.setValue(CmnConst.RECORD,record);
            fieldSetEntity.setValue(CmnConst.OPETYPE, opetype);
            fieldSetEntity.setValue(CmnConst.OPE_DOCUMENT, file_name[i]);
            StringBuffer state = new StringBuffer();
            state.append("把[")
                    .append(file_name[i])
                    .append("]")
                    .append(opetype)
                    .append("为[")
                    .append(newFile_name[i])
                    .append("]");
            fieldSetEntity.setValue(CmnConst.STATE, state.toString()); //说明
            fieldSetEntity.setValue(CmnConst.CREATED_BY, user.getUser_id());// 创建人
            fieldSetEntity.setValue(CmnConst.CREATED_UTC_DATETIME, DateUtils.getDateTime());// 创建时间
            dataTableEntity.addFieldSetEntity(fieldSetEntity);
        }
        baseDao.add(dataTableEntity);
    }
 
    public boolean verifyOrgExist(String org) {
        Integer user_id = SpringMVCContextHolder.getCurrentUser().getUser_id();
        String code = SpringMVCContextHolder.getCurrentUser().getCurrentStaff().getString("tricode");
        //获取所有上级编码
        String[] superior_code = new String[code.split("-").length - 1];
        for (int i = 0; i < code.split("-").length - 1; i++) {
            superior_code[i] = code.substring(0, code.length() - ((i + 1) * 4));
        }
        String this_user = String.valueOf(user_id);
        SpringMVCContextHolder.getCurrentUser().getLanguageCode();
        String[][] orgArr = BaseUtil.decomposesMultipleTypeValues(org);
        String[] user = orgArr[3];
        if (null != user) {
            for (int i = 0; i < user.length; i++) {
                if (this_user.equals(user[i])) {
                    return true;
                }
            }
        }
        String[] level = orgArr[0];
        String[] dept = orgArr[1];
        // List<String> list = Arrays.asList(a);  --OK
        // List<String> list = Arrays.asList("A","B","C"); --OK
        // list.add("F"); --UnsupportedOperationException
        // list.remove("A"); --UnsupportedOperationException
        // list.set(1,"javaee");--OK (因为是把数组转为集合,其本质还是数组,数组长度固定不变,但内容可以改变)
        // 结论:虽然可以把数组转为集合,但是集合长度不能改变
        List list = new ArrayList();
        ;
        if (null != level) {
            list.addAll(Arrays.asList(level));
        }
        if (null != dept) {
            list.addAll(Arrays.asList(dept));
        }
        String[] level_dept = new String[list.size()];
        list.toArray(level_dept);
 
 
        String[] post = orgArr[2];
        if (level_dept.length != 0) {
            DataTableEntity org_level_uuid = baseDao.listTable(CmnConst.TABLE_PRODUCT_SYS_ORG_LEVELS, BaseUtil.buildQuestionMarkFilter("uuid", level_dept, true) + " and " + BaseUtil.buildQuestionMarkFilter("org_level_code", superior_code, true), new String[]{});
            if (org_level_uuid.getRows() > 0) return true;
        }
        if (null != post) {
            DataTableEntity post_uuid = baseDao.listTable(CmnConst.PRODUCT_SYS_STAFFS, BaseUtil.buildQuestionMarkFilter("job_post_uuid", post, true) + " and user_id=?", new String[]{this_user});
            if (post_uuid.getRows() > 0) return true;
        }
        return false;
    }
 
    @Override
    public FieldSetEntity getButtonPermissions(FieldSetEntity fieldSetEntity) throws BaseException {
        String butt = "";
        DataTableEntity dataTable = null;
        FieldSetEntity fse = new FieldSetEntity();
        fse.setTableName(CmnConst.PRODUCT_OA_DOCUMENT);
        if (StringUtils.equalsAny(fieldSetEntity.getString(CmnConst.DIRECTORY_UUID), "!borrow", "!favorite")) {
            // 收藏夹和借阅文件夹特殊处理
 
            dataTable = this.documentAll(fieldSetEntity);
            butt = "1,2";
        } else if ("1".equals(fieldSetEntity.getString(CmnConst.DIRECTORY_TYPE))) {
            //获取的user_id
            Integer user_id = SpringMVCContextHolder.getCurrentUser().getUser_id();
            String key = "%," + user_id + ",%";
            String directory_uuid = fieldSetEntity.getString(CmnConst.DIRECTORY_UUID);
            //String key = "%,140,%";
            DataTableEntity dataTableEntity = new DataTableEntity();
 
            FieldSetEntity org = recursionRole(directory_uuid);
            if (verifyOrgExist(org.getString("storage_uuid"))) {
                StringBuffer sql = new StringBuffer();
                sql.append(" SELECT  substring_index(substring_index(a.rigths,',',b.help_topic_id+1),',',-1) fun FROM  PRODUCT_OA_directory_rights a ")
                        .append(" INNER join   mysql.help_topic b on b.help_topic_id < (length(a.rigths) - length(replace(a.rigths,',',''))+1) ")
                        .append(" WHERE a.directory_uuid = ? ");
                dataTableEntity = baseDao.listTable(sql.toString(), new String[]{org.getString("directory_uuid")});
            }
            StringBuffer button = new StringBuffer();
            if (!BaseUtil.dataTableIsEmpty(dataTableEntity)) {
                for (int i = 0, length = dataTableEntity.getRows(); i < length; i++) {
                    FieldSetEntity field = dataTableEntity.getFieldSetEntity(i);
                    String fun = field.getString("fun");
                    //权限1(查看),2(下载),3(新增上传),4(修改,重命名),5(删除),6(移动)
                    button.append(fun).append(",");
                    if ("1".equals(fun)) {
                        //有查看权限就加载列表
                        dataTable = this.documentAll(fieldSetEntity);
                    }
                }
            }
            if (!BaseUtil.strIsNull(button.toString())) {
                butt = button.substring(0, button.length() - 1);
            }
        } else {
            dataTable = this.documentAll(fieldSetEntity);
        }
        Map<String, DataTableEntity> dataMap = MapUtils.newHashMap();
        fse.setValue("button", butt);
        //加载文件路径
        DataTableEntity file_list;
        if (StringUtils.equalsAny(fieldSetEntity.getString(CmnConst.DIRECTORY_UUID), "!borrow", "!favorite")) {
            file_list = new DataTableEntity();
            FieldSetEntity ff = new FieldSetEntity("product_oa_directory");
            ff.setValue("uuid", fieldSetEntity.getString(CmnConst.DIRECTORY_UUID));
            ff.setValue("directory_name", "!borrow".equals(fieldSetEntity.getString(CmnConst.DIRECTORY_UUID)) ? "借阅文件夹" : "收藏夹");
            file_list.addFieldSetEntity(ff);
        } else {
            file_list = documentDirectoryService.getDirectoryStructure(fieldSetEntity);
        }
        dataMap.put("file_list", file_list);
        if (BaseUtil.dataTableIsEmpty(dataTable) || dataTable.getSqle() == null) {
            fse.setValue(CmnConst.PAGESIZE, 0);
            fse.setValue(CmnConst.CPAGE, 0);
            fse.setValue("total", 0);
        } else {
            dataMap.put("dataTable", dataTable);
            fse.setValue(CmnConst.PAGESIZE, dataTable.getSqle().getPsize());
            fse.setValue(CmnConst.CPAGE, dataTable.getSqle().getPindex());
            fse.setValue("total", dataTable.getSqle().getTotalCount());
        }
        fse.setSubData(dataMap);
 
        return fse;
    }
 
    /**
     * 递归获取权限如果当前文档未配置权限就去递归查询父级权限
     * @param directory_uuid
     * @return
     */
    private FieldSetEntity recursionRole(String directory_uuid){
        FieldSetEntity org = baseDao.getFieldSetByFilter(CmnConst.PRODUCT_OA_DIRECTORY_RIGHTS, "directory_uuid=?", new String[]{directory_uuid}, false);
        if (FieldSetEntity.isEmpty(org)&&!StringUtils.isEmpty(directory_uuid)){
            FieldSetEntity directoryFs = baseDao.getFieldSet(CmnConst.PRODUCT_OA_DIRECTORY, directory_uuid,false);
            FieldSetEntity parentFs = baseDao.getFieldSetByFilter(CmnConst.PRODUCT_OA_DIRECTORY, "tricode=?",new String[]{directoryFs.getString("tricode_parent")},false);
            org=recursionRole(parentFs.getUUID());
        }
        return org;
    }
 
    @Override
    public JSONObject popBoxGetFileDirectory(FieldSetEntity fse) throws BaseException {
        //文件目录uuid
        String directory_uuid = fse.getString(CmnConst.DIRECTORY_UUID);
        String type = fse.getString(CmnConst.DIRECTORY_TYPE);
        List<Object> param = ListUtils.newArrayList();
        SystemUser user = SpringMVCContextHolder.getCurrentUser();
        StringBuffer sql = new StringBuffer();
        //1为公司文件目录
        if ("1".equals(type)) {
            //String staffId = user.getCurrentStaff().getString("staff_id");
            sql.append(" select a.* from PRODUCT_OA_directory a  ")
                    .append(" LEFT JOIN (  SELECT a.directory_uuid FROM PRODUCT_OA_directory_rights a  LEFT JOIN product_sys_organizational_structure_storage b ")
                    .append(" on a.storage_uuid = b.uuid WHERE a.rigths like '%3%' AND CONCAT(',',b.staff_ids,',') like ? GROUP BY ")
                    .append(" a.directory_uuid) b ON a.uuid = b.directory_uuid  where a.directory_type = 1  and a.org_level_uuid = ? ");
            String staffId = "%" + user.getCurrentStaff().getString("staff_id") + "%";
            param.add(staffId);
            param.add(user.getOrg_level_uuid());
            //param.add("%,140,%");
        } else {
            sql.append(" select * from PRODUCT_OA_directory where directory_type = 2 AND created_by = ? ");
            param.add(user.getUser_id());
        }
        JSONObject object = new JSONObject();
        //directory_uuid为空就是未选择文件目录  获取当前根目录列表
        if (BaseUtil.strIsNull(directory_uuid)) {
            sql.append(" and directory_tier = 1 ");
            //不为空就获取选择文件目录
        } else {
            String triCode = fse.getString(CmnConst.TRICODE);
            param.add(triCode);
            sql.append(" and tricode_parent = ? ");
            //加载文件路径
            DataTableEntity dataTableEntity = documentDirectoryService.getDirectoryStructure(fse);
            object.put("product_oa_directory_path", BaseUtil.dataTableEntityToJson(dataTableEntity));
        }
        //sql.append(" GROUP BY tricode,tricode_parent,directory_name");
        DataTableEntity data = baseDao.listTable(sql.toString(), param.toArray());
 
        object.put("product_oa_directory_sub", BaseUtil.dataTableEntityToJson(data));
        baseDao.listInternationDataTable(data, null);
 
        return object;
    }
 
    @Override
    @Transactional
    public void downloadFile(FieldSetEntity fieldSetEntity) throws BaseException {
        String uuid = fieldSetEntity.getString(CmnConst.UUID);
        FieldSetEntity fieldSet = baseDao.getFieldSetEntity(CmnConst.PRODUCT_OA_DOCUMENT, uuid, false);
        String file_name = fieldSet.getString(CmnConst.FILE_NAME);
        this.documentation(new String[]{uuid}, "下载", new String[]{file_name}, null);
        this.markRead(fieldSet);
    }
 
    @Override
    public void markRead(FieldSetEntity fieldSetEntity) throws BaseException {
 
        //获取必读人员ID集
        String user_ids = fieldSetEntity.getString(CmnConst.USER_IDS);
        String read = fieldSetEntity.getString(CmnConst.READ_NUM);
        SystemUser user = SpringMVCContextHolder.getCurrentUser();
        user_ids = "," + user_ids + ",";
        String rawRead = "," + read + ",";
        String userId = "," + user.getUser_id() + ",";
        //如果包含用户ID
        if (BaseUtil.strIsNull(read)) {
            fieldSetEntity.setValue(CmnConst.READ_NUM, user.getUser_id());
            baseDao.update(fieldSetEntity);
        } else {
            if (user_ids.contains(userId) && !rawRead.contains(userId)) {
                read = read + "," + user.getUser_id();
                fieldSetEntity.setValue(CmnConst.READ_NUM, read);
                baseDao.update(fieldSetEntity);
            }
        }
    }
 
    /**
     * 移动(文件批量移动)6
     *
     * @param
     * @return
     * @throws BaseException
     */
    @Override
    @Transactional
    public boolean fileMoveTo(FieldSetEntity fse) throws BaseException {
        String directory_uuid = fse.getString(CmnConst.DIRECTORY_UUID);
        Integer directory_type = fse.getInteger(CmnConst.DIRECTORY_TYPE);
        Integer row = 0;
        //1为公司文件夹
        if (directory_type == 1) {
            StringBuffer sql = new StringBuffer();
            sql.append(" SELECT * FROM PRODUCT_OA_directory_rights  ")
                    .append(" WHERE directory_uuid = ? ")
                    .append(" AND rigths like '%3%' AND concat(',',storage_uuid,',') like ? ");//3为新增
            String user_id = String.valueOf(SpringMVCContextHolder.getCurrentUser().getUser_id());
            user_id = "%," + user_id + ",%";
            DataTableEntity dataTableEntity = baseDao.listTable(sql.toString(), new String[]{directory_uuid, user_id});
            row = dataTableEntity.getRows();
        }
        //1为个人文件夹
        if (directory_type == 2 || row > 0) {
            FieldSetEntity fieldSetEntity = baseDao.getFieldSetEntity(CmnConst.PRODUCT_OA_DIRECTORY, directory_uuid, false);
            //获取移动到的目录名
            String directory_name = fieldSetEntity.getString(CmnConst.DIRECTORY_NAME);
            String uuids = fse.getString(CmnConst.UUID);
            String[] uuid = uuids.split(",");
            DataTableEntity dataTable = baseDao.listTable(CmnConst.PRODUCT_OA_DOCUMENT, BaseUtil.buildQuestionMarkFilter(CmnConst.UUID, uuid.length, true), uuid);
            List<String> uuidList = ListUtils.newArrayList();
            List<String> fileNameList = ListUtils.newArrayList();
            for (int i = 0, length = dataTable.getRows(); i < length; i++) {
                uuidList.add(dataTable.getFieldSetEntity(i).getString(CmnConst.UUID));
                fileNameList.add(dataTable.getFieldSetEntity(i).getString(CmnConst.FILE_NAME));
            }
 
            String params = directory_uuid + "," + uuids;
            String[] param = params.split(",");
            boolean flag = baseDao.executeUpdate("UPDATE PRODUCT_OA_document SET directory_uuid = ? WHERE " + BaseUtil.buildQuestionMarkFilter(CmnConst.UUID, uuid.length, true), param);
            this.documentation(uuidList.toArray(), "移动", fileNameList.toArray(), directory_name);
            return flag;
        } else {
            return false;
        }
    }
 
    @Override
    public DataTableEntity getDocumentLog(FieldSetEntity fieldSetEntity) throws BaseException {
        return baseDao.listTable("SELECT CONCAT(b.show_name, a.state) log,a.created_utc_datetime FROM PRODUCT_OA_document_log a LEFT JOIN product_sys_staffs b on a.created_by = b.user_id WHERE document_uuid = ? ORDER BY a.created_utc_datetime DESC",
                new String[]{fieldSetEntity.getString(CmnConst.DOCUMENT_UUID)}, fieldSetEntity.getInteger(CmnConst.PAGESIZE), fieldSetEntity.getInteger(CmnConst.CPAGE));
    }
 
    /**
     * 文档收藏
     *
     * @param fse
     * @return
     */
    public String documentCollection(FieldSetEntity fse) {
        BaseUtil.createCreatorAndCreationTime(fse);
        fse.setValue("document_collector", SpringMVCContextHolder.getCurrentUserId());
        return baseDao.add(fse);
    }
 
    /**
     * 文档取消收藏
     *
     * @param documentUUID
     * @return
     */
    public boolean documentCancelCollection(String documentUUID) {
        return baseDao.delete(CmnConst.PRODUCT_OA_DOCUMENT_COLLECTION, "document_uuid = ? AND document_collector = ?", new Object[]{documentUUID, SpringMVCContextHolder.getCurrentUserId()});
    }
 
    /**
     * 查询文档历史版本
     *
     * @param documentUUID
     * @return
     */
    public DataTableEntity findDocumentHistory(String documentUUID) {
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT A.*,B.file_name\n");
        sql.append("FROM product_oa_document_history A \n");
        sql.append("LEFT JOIN product_oa_document B ON B.uuid = A.document_uuid \n");
        sql.append("WHERE A.document_uuid = ?\n");
        sql.append("ORDER BY A.version_number");
        return baseDao.listTable(sql.toString(), new Object[]{documentUUID});
    }
 
    /**
     * 文档最新版本保存
     *
     * @param fse
     * @return
     */
    @Transactional
    public boolean documentSaveNewVersion(FieldSetEntity fse) {
        // 获取文档数据和最大编号
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT A.*, IFNULL(B.max_version_number, '0')AS max_version_number \n");
        sql.append("FROM product_oa_document A \n");
        sql.append("LEFT JOIN ( \n");
        sql.append("    SELECT document_uuid, MAX(version_number) AS max_version_number \n");
        sql.append("    FROM product_oa_document_history B \n");
        sql.append("    WHERE document_uuid = ? \n");
        sql.append("    GROUP BY document_uuid \n");
        sql.append(") B ON B.document_uuid = A.uuid \n");
        sql.append("WHERE uuid = ? \n");
        String documentUuid = fse.getString("document_uuid");
        FieldSetEntity fseDocument = baseDao.getFieldSetEntityBySQL(sql.toString(), new Object[]{documentUuid, documentUuid}, false);
        if (fseDocument == null) {
            throw new BaseException(DocumentCode.DOCUMENT_DATA_NO_EXIST.getValue(), DocumentCode.DOCUMENT_DATA_NO_EXIST.getText());
        }
 
        String attachmentUuid = fse.getString("attachment_uuid");
        FieldSetEntity fieldSetEntity = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_ATTACHMENTS, attachmentUuid, false);
        fseDocument.setValue("file_size", fieldSetEntity.getString(CmnConst.ATTACHMENT_SIZE));
        fseDocument.setValue("file_name", fieldSetEntity.getString("file_name"));
        fseDocument.setValue("attachments_uuid", attachmentUuid);
        fseDocument.setValue("latest_version", fseDocument.getInteger("max_version_number") + 1);
 
        baseDao.saveFieldSetEntity(fseDocument);
 
        // 创建文档操作日志信息
        FieldSetEntity fseDocumentLog = new FieldSetEntity(CmnConst.PRODUCT_OA_DOCUMENT_LOG);
        BaseUtil.createCreatorAndCreationTime(fseDocumentLog);
        fseDocumentLog.setValue("document_uuid", documentUuid);
        fseDocumentLog.setValue("opetype", "新增");
        fseDocumentLog.setValue("ope_document", fieldSetEntity.getString("file_name"));
        fseDocumentLog.setValue("state", "新增了[" + fieldSetEntity.getString("file_name") + "]最新版本");
 
        //创建文档版本数据容器
        FieldSetEntity fseDocumentHistory = new FieldSetEntity(CmnConst.PRODUCT_OA_DOCUMENT_HISTORY);
        BaseUtil.createCreatorAndCreationTime(fseDocumentHistory);
        fseDocumentHistory.setValue("document_uuid", documentUuid);
        fseDocumentHistory.setValue("attachment_uuid", attachmentUuid);
        fseDocumentHistory.setValue("version_number", fseDocument.getObject("latest_version"));
        return baseDao.saveFieldSetEntity(fseDocumentHistory);
    }
 
    /**
     * 文档版本+1
     *
     * @param originNumber
     * @return
     */
    public String versionNUmberAddne(String originNumber) {
        String numberStr = originNumber.substring(1); // 去掉前缀"v"
        int number = Integer.parseInt(numberStr); // 将字符串转
        // 数字加一
        number += 1;
 
        // 重新构建字符串(这里我们假设前缀总是"v")
        return "v" + number;
    }
 
    @Override
    public DataTableEntity getApplyDocument(FieldSetEntity fse) throws BaseException {
 
        String sub_uuid = fse.getString("sub_uuid");
        String sub_uuid_replace = sub_uuid.replace("\"", "");
        String[] sub_uuid_split = sub_uuid_replace.split(",");
        String sub_uuids="";
        for (int i = 0; i < sub_uuid_split.length; i++) {
 
            if(i==sub_uuid_split.length-1){
                sub_uuids=sub_uuids+"\""+sub_uuid_split[i]+"\"";
            }else {
                sub_uuids=sub_uuids+"\""+sub_uuid_split[i]+"\",";
            }
        }
        List<String> param = new ArrayList<>();
        StringBuilder sb=new StringBuilder();
        sb.append(" SELECT a.*,f.show_name");
        sb.append(" FROM product_sys_attachments a  ");
        sb.append(" LEFT JOIN  product_sys_staffs f ");
        sb.append(" on a.created_by =f.user_id ");
        sb.append(" where a.uuid in ("+sub_uuids+")");
        DataTableEntity product_sys_attachments = baseDao.listTable(sb.toString(),param.toArray());
        return product_sys_attachments;
    }
 
    @Override
    public void addOrUpdateApplyDocument(FieldSetEntity fse) throws BaseException {
 
        String[] attachment = new String[0];
        if (ObjectUtil.isNotEmpty(fse.getString("uuid"))) {
            UUID uuid = UUID.randomUUID();
            fse.setValue("uuid", uuid);
            baseDao.add(fse);
 
            if (ObjectUtil.isNotEmpty(fse.getString("attachment_uuid"))) {
                String attachment_uuid = fse.getString("attachment_uuid");
                attachment = attachment_uuid.split(",");
            }
            for (int i = 0; i < attachment.length; i++) {
                FieldSetEntity fieldSetEntity = new FieldSetEntity();
                fieldSetEntity.setTableName("product_oa_document_borrow_sub");
                fieldSetEntity.setValue("borrow_uuid", uuid);
                fieldSetEntity.setValue("sub_uuid", attachment[i]);
 
            }
 
        } else {
            String uuid = fse.getString("uuid");
            String filter = "borrow_uuid='" + uuid + "'";
            //删除原来附件信息
            baseDao.delete("product_oa_document_borrow_sub", filter, new Object[]{});
            baseDao.update(fse);
            if (ObjectUtil.isNotEmpty(fse.getString("attachment_uuid"))) {
                String attachment_uuid = fse.getString("attachment_uuid");
                attachment = attachment_uuid.split(",");
            }
 
            //重新跟新附件信息
            for (int i = 0; i < attachment.length; i++) {
                FieldSetEntity fieldSetEntity = new FieldSetEntity();
                fieldSetEntity.setTableName("product_oa_document_borrow_sub");
                fieldSetEntity.setValue("borrow_uuid", uuid);
                fieldSetEntity.setValue("sub_uuid", attachment[i]);
                baseDao.add(fieldSetEntity);
 
            }
 
 
        }
 
    }
 
    @Override
    public DataTableEntity getApplyFileSort() throws BaseException {
        StringBuilder sb = new StringBuilder();
        List<String> param = new ArrayList<>();
        sb.append(" SELECT b.* FROM (");
        sb.append(" SELECT t.uuid,t.file_name,t.attachment_size as file_size,s.show_name,t.created_utc_datetime,count(t.uuid) as applyCount");
        sb.append(" FROM product_oa_document_borrow_sub b");
        sb.append(" JOIN product_sys_attachments t");
        sb.append(" on b.sub_uuid=t.uuid");
        sb.append(" JOIN product_sys_staffs s ");
        sb.append(" on t.created_by=s.user_id");
        sb.append(" group by t.file_name,t.uuid,s.show_name,t.created_utc_datetime,t.attachment_size");
        sb.append(" )b order by  b.applyCount asc");
        DataTableEntity dataTableEntity = baseDao.listTable(sb.toString(), param.toArray());
        return dataTableEntity;
    }
 
    @Override
    public DataTableEntity getApplyUserSort() throws BaseException {
        StringBuilder sb = new StringBuilder();
        List<String> param = new ArrayList<>();
        sb.append(" SELECT b.*,a.applayCount ");
        sb.append(" FROM (");
        sb.append(" SELECT borrower,count(borrower) as applayCount");
        sb.append(" FROM product_oa_document_borrow ");
        sb.append(" group by borrower");
        sb.append(" ) a LEFT JOIN ");
        sb.append(" (");
        sb.append(" SELECT a.borrower,a.show_name,a.applayFileCount ");
        sb.append(" FROM (");
        sb.append(" SELECT w.borrower,s.show_name,");
        sb.append(" count( borrower )  AS applayCount,");
        sb.append(" count(sub_uuid) as applayFileCount ");
        sb.append(" FROM product_oa_document_borrow  w ");
        sb.append(" left JOIN product_oa_document_borrow_sub b");
        sb.append(" on b.borrow_uuid=w.uuid");
        sb.append(" left JOIN product_sys_attachments t");
        sb.append(" on b.sub_uuid=t.uuid");
        sb.append(" left JOIN product_sys_staffs s");
        sb.append(" on w.borrower=s.user_id");
        sb.append(" GROUP BY w.borrower,s.show_name");
        sb.append(" )a )b");
        sb.append(" on a.borrower=b.borrower ");
        sb.append(" order by a.applayCount,b.applayFileCount asc");
        DataTableEntity dataTableEntity = baseDao.listTable(sb.toString(), param.toArray());
        return dataTableEntity;
    }
 
    @Override
    public FieldSetEntity getApplyInfo(FieldSetEntity fes) throws BaseException {
        String uuid = fes.getString("uuid");
        FieldSetEntity product_oa_document_borrow = baseDao.getFieldSetEntity("product_oa_document_borrow", uuid, false);
        return product_oa_document_borrow;
    }
 
    public Map<String, String> isPermission(String documentUuid) {
        //    验证文档权限
        if (StringUtils.isEmpty(documentUuid)) {
            throw new BaseException(DocumentCode.DOCUMENT_FORM_NODATA);
        }
 
        String[] docuemnts = documentUuid.split(",");
        //查询借阅记录
        DataTableEntity dt = baseDao.listTable(" SELECT 1 isPermission,sub_uuid document_uuid from product_oa_document_borrow_sub where borrow_uuid in" +
                        " (select uuid from product_oa_document_borrow where start_time>=now() and end_time<=now() and  borrower=? and flow_flag=2) and " + BaseUtil.buildQuestionMarkFilter("sub_uuid", docuemnts, true),
                new Object[]{SpringMVCContextHolder.getCurrentUserId()});
 
        Map<String, String> permission = new HashMap<>();
        if (!DataTableEntity.isEmpty(dt)) {
            for (int i = 0; i < dt.getRows(); i++) {
                String docUuid = dt.getString(i, "document_uuid");
                if (dt.getBoolean(i, "isPermission")) {
                    permission.put(docUuid, "1");
                }
            }
        }
 
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT\n");
        sql.append("document.uuid document_uuid,\n");
        sql.append("rights.*\n");
        sql.append("        FROM\n");
        sql.append("product_oa_document document\n");
        sql.append("JOIN product_oa_directory dir ON dir.uuid = document.directory_uuid\n");
        sql.append("JOIN product_oa_directory_rights rights ON dir.uuid = rights.directory_uuid\n");
        sql.append("WHERE\n");
        sql.append("dir.directory_type = 1\n");
        sql.append("AND rights.rigths LIKE '%1%'\n");
        sql.append(" and ").append(BaseUtil.buildQuestionMarkFilter("document.uuid", docuemnts.length, true));
        dt = baseDao.listTable(sql.toString(), docuemnts);
        if (!DataTableEntity.isEmpty(dt)) {
            for (int i = 0; i < dt.getRows(); i++) {
                String docUuid = dt.getString(i, "document_uuid");
                String storage_uuid = dt.getString(i, "storage_uuid");
                if (verifyOrgExist(storage_uuid)) {
                    String rights = permission.get(docUuid);
                    if (StringUtils.isEmpty(rights)) {
                        rights = "1";
                    }
                    if (rights.indexOf("2") == -1 && StringUtils.indexOf(dt.getString(i, "rigths"), "2") != -1) {
                        rights += ",2";
                    }
                    permission.put(docUuid, rights);
                }
            }
        }
        return permission;
    }
    public DataTableEntity getFileItemize(FieldSetEntity fes) throws BaseException {
        DataTableEntity dt = baseDao.listTable("SELECT b.classify_name,COUNT(1) number FROM product_oa_document a LEFT JOIN product_oa_document_classify_config b  on  a.business_classify_uuid=b.uuid\n" +
                "where classify_name is not null GROUP BY b.classify_name ORDER BY COUNT(1)",new String[]{});
        for (int i = 0; i <dt.getRows() ; i++) {
            dt.setFieldValue(i,"ranking",i+1);
        }
        return dt;
    }
}