杜洪波
2024-08-29 2035c5bb9f019462bf4e3585a80bbc120485380c
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
package com.product.file.service;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.product.common.collect.ListUtils;
import com.product.common.lang.DateUtils;
import com.product.core.config.CoreConst;
import com.product.core.dao.BaseDao;
import com.product.core.entity.DataTableEntity;
import com.product.core.entity.FieldSetEntity;
import com.product.core.exception.BaseException;
import com.product.core.service.support.AbstractBaseService;
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.core.transfer.Transactional;
import com.product.core.util.CodeUtil;
import com.product.file.config.CmnConst;
import com.product.file.config.DocumentCode;
import com.product.file.service.ide.IDocumentDirectoryService;
import com.product.module.sys.entity.SystemUser;
import com.product.util.BaseUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.List;
 
/**
 * Copyright lx
 *
 * @Title: ClaimExpenseController
 * @Project: lx-SERVER
 * @Date: 2020-11-18 11:30:48
 * @Author: luoxin
 * @Description: 文件夹管理server
 */
@Component
public class DocumentDirectoryService extends AbstractBaseService implements IDocumentDirectoryService {
 
    @Autowired
    public BaseDao baseDao;
    @Autowired
    public DocumentDirectoryService documentDirectoryService;
    
    /**
     *     单位文件夹树
     * @return
     */
    public DataTableEntity allDirectoryTree() {
        DataTableEntity dtTree = baseDao.listTable(CmnConst.PRODUCT_OA_DIRECTORY, "directory_type = 1");
        if (!BaseUtil.dataTableIsEmpty(dtTree)) {
            return BaseUtil.dataTableToTreeTable(dtTree, CmnConst.TRICODE, CmnConst.TRICODE_PARENT, null);
        }
        return dtTree;
    }
 
    /**
     *     文档目录保存
     * @param fse
     * @return
     */
    @Transactional
    public boolean saveDocumentDireactory(FieldSetEntity fse) {
        BaseUtil.createCreatorAndCreationTime(fse);
        String tricode = null;
        String tricodeParent = BaseUtil.strIsNull(fse.getString(CmnConst.TRICODE_PARENT)) ? "" : fse.getString(CmnConst.TRICODE_PARENT);
        if(BaseUtil.strIsNull(fse.getUUID())) {
            tricode = CodeUtil.getNewCodeByTemp(CmnConst.PRODUCT_OA_DIRECTORY, CmnConst.TRICODE, tricodeParent);
        } else {
            FieldSetEntity fseOrigin = baseDao.getFieldSetEntity(CmnConst.PRODUCT_OA_DIRECTORY, fse.getUUID(), false);
            if(fseOrigin == null) {
                fse.remove(CoreConst.UUID);
            }
            String originParent = BaseUtil.strIsNull(fseOrigin.getString(CmnConst.TRICODE_PARENT)) ? "" : fseOrigin.getString(CmnConst.TRICODE_PARENT);
            if (!originParent.equals(tricodeParent)) {
                String originTricode = BaseUtil.strIsNull(fseOrigin.getString(CmnConst.TRICODE)) ? "" : fseOrigin.getString(CmnConst.TRICODE);
                tricode = CodeUtil.getNewCodeByTemp(CmnConst.PRODUCT_OA_DIRECTORY, CmnConst.TRICODE, tricodeParent);
                StringBuilder sql = new StringBuilder();
                sql.append("update product_oa_directory ");
                sql.append("set tricode=concat(replace(substring(tricode,1,locate(?,tricode)+length(?)),?,?),substring(tricode,locate(?,tricode)+length(?)+1)), ");
                sql.append("tricode_parent=concat(replace(substring(tricode_parent,1,locate(?,tricode_parent)+length(?)),?,?),substring(tricode_parent,locate(?,tricode_parent)+length(?)+1)) ");
                sql.append("where tricode like ? ");
                baseDao.executeUpdate(sql.toString(), new Object[] {originTricode,originTricode,originTricode,tricode,originTricode,originTricode,
                        originTricode,originTricode,originTricode,tricode,originTricode,originTricode,originTricode+"-%"});
            }else {
                tricode = fseOrigin.getString(CmnConst.TRICODE);
            }
        }
        fse.setValue(CmnConst.TRICODE, tricode);
        fse.setValue(CmnConst.DIRECTORY_TIER, tricode.split(",").length);
        return baseDao.saveFieldSetEntity(fse);
    }
    
 
    @Override
    @Transactional
    public boolean delDocumentDirectory(FieldSetEntity fieldSetEntity) throws BaseException {
        String uuid = fieldSetEntity.getString(CmnConst.UUID);
        String directory_type = fieldSetEntity.getString(CmnConst.DIRECTORY_TYPE);
        String filter = "";
        if ("2".equals(directory_type)) {
            filter = " AND " + "created_by = " + SpringMVCContextHolder.getCurrentUserId();
        }
        DataTableEntity dataTableEntity = baseDao.listTable(
                "SELECT * FROM PRODUCT_OA_directory WHERE directory_type = ? AND tricode_parent = (SELECT tricode FROM PRODUCT_OA_directory where uuid = ?)"
                        + filter,
                new String[] { directory_type, uuid });
        if (BaseUtil.dataTableIsEmpty(dataTableEntity)) {
            baseDao.delete(CmnConst.PRODUCT_OA_DOCUMENT, "directory_uuid = ?", new String[] { uuid });
            return baseDao.delete(CmnConst.PRODUCT_OA_DIRECTORY, new String[] { uuid });
        } else {
            throw new BaseException(DocumentCode.DOCUMENT_CATALOG_DELETE_FAIL.getValue(),
                    DocumentCode.DOCUMENT_CATALOG_DELETE_FAIL.getText(), this.getClass(),
                    "public boolean delDocumentDirectory(FieldSetEntity fieldSetEntity) throws BaseException");
        }
    }
 
    /**
     * 获取当前文件路径
     * 
     * @param fieldSetEntity
     * @return
     * @throws BaseException
     */
    @Override
    public DataTableEntity getDirectoryStructure(FieldSetEntity fieldSetEntity) throws BaseException {
        String uuid = fieldSetEntity.getString(CmnConst.DIRECTORY_UUID);
        fieldSetEntity = baseDao.getFieldSetEntity(CmnConst.PRODUCT_OA_DIRECTORY, uuid, false);
        String triCode = fieldSetEntity.getString(CmnConst.TRICODE);
        String type = fieldSetEntity.getString(CmnConst.DIRECTORY_TYPE);
        List<String> codeList = ListUtils.newArrayList();
        // 拆分为上级目录
        if (triCode.indexOf('-') != -1) {
            do {
                codeList.add(0, triCode);
                triCode = triCode.substring(0, triCode.lastIndexOf('-'));
            } while (triCode.indexOf('-') != -1);
            codeList.add(0, triCode);
        } else {
            codeList.add(triCode);
        }
        SystemUser user = SpringMVCContextHolder.getCurrentUser();
        DataTableEntity dataTableEntity;
        // 单位文件夹
        if ("1".equals(type)) {
            codeList.add(0, user.getOrg_level_uuid());
            dataTableEntity = baseDao.listTable(CmnConst.PRODUCT_OA_DIRECTORY,
                    "directory_type = 1 AND org_level_uuid = ? AND "
                            + BaseUtil.buildQuestionMarkFilter(CmnConst.TRICODE, codeList.size() - 1, true),
                    codeList.toArray(), "tricode");
            // 个人文件夹
        } else {
            codeList.add(0, String.valueOf(user.getUser_id()));
            dataTableEntity = baseDao.listTable(CmnConst.PRODUCT_OA_DIRECTORY,
                    "directory_type = 2 AND created_by = ? AND "
                            + BaseUtil.buildQuestionMarkFilter(CmnConst.TRICODE, codeList.size() - 1, true),
                    codeList.toArray(), "tricode");
        }
        baseDao.listInternationDataTable(dataTableEntity, null);
        return dataTableEntity;
    }
 
    @Override
    public JSONArray treeListAll(FieldSetEntity fieldSetEntity) throws BaseException {
        // 关联公司uuid
        String directory_type = fieldSetEntity.getString(CmnConst.DIRECTORY_TYPE);
        // 公司文件夹
        DataTableEntity data;
        SystemUser user = SpringMVCContextHolder.getCurrentUser();
        StringBuffer sql = new StringBuffer();
        sql.append("SELECT a.*,ifnull(b.number,0) number FROM PRODUCT_OA_directory a LEFT JOIN ");
        sql.append(
                "(SELECT COUNT(*) number,directory_uuid FROM PRODUCT_OA_document GROUP BY directory_uuid)  b on a.uuid=b.directory_uuid ");
 
        if ("1".equals(directory_type)) {
            String org_level_uuid = user.getOrg_level_uuid();
            sql.append("where directory_type = 1 AND org_level_uuid = ? ");
            data = baseDao.listTable(sql.toString(), new Object[] { org_level_uuid });
//      data = baseDao.listTable(CmnConst.PRODUCT_OA_DIRECTORY, " directory_type = 1 AND org_level_uuid = ?", new String[]{org_level_uuid}, "tricode");
            // 个人文件夹
        } else {
            Integer userId = user.getUser_id();
            sql.append("where directory_type = 2 AND created_by = ? ");
            data = baseDao.listTable(sql.toString(), new Object[] { userId });
 
//      data = baseDao.listTable(CmnConst.PRODUCT_OA_DIRECTORY, " directory_type = 2 AND created_by = ?", new Object[]{userId}, "tricode");
        }
        baseDao.listInternationDataTable(data, null);
        JSONArray menus = this.encapsulationTree(data);
        // 获取当前公司
        JSONObject orgLevelInfo = new JSONObject();
        orgLevelInfo.put("directory_name", user.getOrg_level_name());
        orgLevelInfo.put("tricode", "");
        orgLevelInfo.put("org_level_uuid", user.getOrg_level_uuid());
        orgLevelInfo.put("children", menus);
        JSONArray array = new JSONArray();
        array.add(orgLevelInfo);
        return array;
    }
 
    /**
     * 封装树方法
     * 
     * @param
     * @return
     * @throws BaseException
     */
    @Override
    public JSONArray encapsulationTree(DataTableEntity data) throws BaseException {
        JSONArray menus = new JSONArray();
        JSONObject parent_menu = new JSONObject();
        if (!BaseUtil.dataTableIsEmpty(data)) {
            for (int i = 0; i < data.getRows(); i++) {
                FieldSetEntity fs = data.getFieldSetEntity(i);
                JSONObject menu = BaseUtil.fieldSetEntityToJson(fs);
                String tricode = fs.getString(CmnConst.TRICODE_PARENT);
                if (StringUtils.isEmpty(tricode) || parent_menu.getString(tricode) == null) {
                    menus.add(menu);
                } else {// 上级目录
                    JSONObject pm = parent_menu.getJSONObject(tricode);
                    JSONArray subs = pm.getJSONArray(CmnConst.CHILDREN);
                    JSONArray submenus = null;
                    if (subs == null) {
                        submenus = new JSONArray();
                        pm.put(CmnConst.CHILDREN, submenus);
                    } else {
                        submenus = subs;
                    }
                    submenus.add(menu);
                }
                parent_menu.put(menu.getString(CmnConst.TRICODE), menu);
            }
        }
        return menus;
    }
 
    @Override
    public FieldSetEntity documentDirectoryInfo(FieldSetEntity fieldSetEntity) throws BaseException {
        String uuid = fieldSetEntity.getString(CmnConst.UUID);
        return baseDao.getFieldSetEntity(CmnConst.PRODUCT_OA_DIRECTORY, uuid, true);
    }
 
    /**
     * 移动到目录列表(根据当前用户过滤展示目录列表) 获取用户有新增(上传)权限的列表
     * 
     * @param
     * @return
     * @throws BaseException
     */
    @Override
    public DataTableEntity moveToList(FieldSetEntity fse) throws BaseException {
        String type = fse.getString(CmnConst.DIRECTORY_TYPE);
        StringBuffer sql = new StringBuffer();
        Integer userId = SpringMVCContextHolder.getCurrentUser().getUser_id();
        StringBuffer param = new StringBuffer();
        // 1为单位文件夹
        if ("1".equals(type)) {
            param.append("%").append(userId).append("%");
            sql.append("SELECT a.* FROM " + CmnConst.PRODUCT_OA_DIRECTORY + " a LEFT JOIN ")
                    .append(" PRODUCT_OA_directory_rights b ON a.uuid = b.directory_uuid ")
                    .append(" LEFT JOIN product_sys_organizational_structure_storage c on b.storage_uuid = c.uuid ")
                    .append(" WHERE a.directory_type = 1 AND b.rigths like '%3%' AND c.staff_ids like ? GROUP BY a.tricode ");
        } else {
            param.append(userId);
            sql.append("SELECT * FROM PRODUCT_OA_directory ").append(" WHERE directory_type = 2 AND created_by = ? ");
        }
        DataTableEntity dataTableEntity = baseDao.listTable(sql.toString(), new String[] { param.toString() });
        baseDao.listInternationDataTable(dataTableEntity, null);
        return dataTableEntity;
    }
 
    @Override
    @Transactional
    public boolean upDocumentDirectoryName(FieldSetEntity fse) throws BaseException {
        String uuid = fse.getString(CmnConst.UUID);
        String directoryName = fse.getString(CmnConst.DIRECTORY_NAME);
        FieldSetEntity docField = baseDao.getFieldSetEntity(CmnConst.PRODUCT_OA_DIRECTORY, uuid, false);
        docField.setValue(CmnConst.DIRECTORY_NAME, directoryName);
        return baseDao.update(docField);
    }
}