354798ggg
2023-07-21 e31fe4140580a730dcb2f2aecb6ac0d7a66df7c0
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
package com.product.project.management.service;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
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.project.management.config.Cmnconst;
import com.product.project.management.config.SystemCode;
import com.product.project.management.util.ProjectItemUtil;
import com.product.util.BaseUtil;
 
import cn.hutool.core.lang.UUID;
 
@Service("projectBudget")
public class ProjectBudgetService extends AbstractBaseService{
    
    @Autowired
    BaseDao baseDao;
    
    /**
     *     项目预算导入
     * @param dtParseData     解析数据
     * @param headerDataList excel标题数据
     */
    public DataTableEntity importBudget2(DataTableEntity dtParseData, List<List<String>> headerDataList) {
        //判断是否有解析EXCEL数据
        if (BaseUtil.dataTableIsEmpty(dtParseData)) {
            return null;
        }
        //临时存储集合
        Map<String, String> itemizeFullNameAndUUID = new HashMap<>();
        Map<String, String> itemizeFullNameAndCode = new HashMap<>();
        Map<String, String> itemizeFullNameAndMaxCode = new HashMap<>();
        DataTableEntity dtNewProjectItem = new DataTableEntity();
        
        //遍历excel转换数据
        for (int i = 0; i < dtParseData.getRows(); i++) {
            //获取excel行数据
            FieldSetEntity fseParseData = dtParseData.getFieldSetEntity(i);
            String uuid = autoCreateProjectItem(dtNewProjectItem, fseParseData, itemizeFullNameAndUUID, itemizeFullNameAndCode, itemizeFullNameAndMaxCode);
            fseParseData.setValue(Cmnconst.PROJECT_ITEMIZE_UUID, uuid);
        }
        if (!BaseUtil.dataTableIsEmpty(dtNewProjectItem)) {
            try {
                baseDao.add(dtNewProjectItem);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return dtParseData;
    }
    
    /**
     *     通过field1,field2,field3,field4,field5,field6数据自动生成项目分项数据
     *     如果项目分项已存在数据库或者新生成,将存入map集合中以便使用
     *     如果项目分项不存在于数据库则生成项目分项数据
     * @param dtNewProjectItem
     * @param fseParseData
     * @param itemizeFullNameAndUUID
     * @param itemizeFullNameAndCode
     * @param itemizeFullNameAndMaxCode
     * @return
     */
    public String autoCreateProjectItem(DataTableEntity dtNewProjectItem, FieldSetEntity fseParseData, Map<String, String> itemizeFullNameAndUUID, Map<String, String> itemizeFullNameAndCode, Map<String, String> itemizeFullNameAndMaxCode) {
        String itemizFullName = null;
        String finalUUID = null;
        //循环field1~field6字段,逐步生成对应的项目分项数据
        for (int i = 1; i < 7; i++) {
            
            //获取分项名称,判断是否为空
            String itemize = fseParseData.getString("field"+i);
            //判断项目分项名称是否为空(如为空:则该预算对应的项目分项生成完毕,预算关联的UUID为上一个field分项对应的UUID
            if (BaseUtil.strIsNull(itemize)) {
                finalUUID = itemizeFullNameAndUUID.get(itemizFullName);
                break;
            }
            
            //获取上级分项和当前分项全称(如当前分项没有上级:则全称等于名称;如有上级:则全称等于上级全称/名称)
            String itemizeParent = null;
            //获取分项全称
            if (BaseUtil.strIsNull(itemizFullName)) {
                itemizFullName = itemize;
            }else {
                itemizeParent = itemizFullName;
                itemizFullName = itemizFullName + "/" + itemize;
            }
            
            //判断项目分项是否存在于集合中
            if(!itemizeFullNameAndCode.containsKey(itemizFullName)) {
                //查询分项和上级分项是否存在于数据库中
                FieldSetEntity fseProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, "itemize_full_name=?", new Object[] {itemizFullName}, false);
                if (fseProjectItem == null) {
                    String uuid = UUID.randomUUID().toString();
                    String code;
                    
                    if (!BaseUtil.strIsNull(itemizeFullNameAndMaxCode.get(itemizeParent))) {
                        code = ProjectItemUtil.autoAddOneCode(itemizeFullNameAndMaxCode.get(itemizeParent));
                    }else {
                        FieldSetEntity fseMaxProjectItem;
                        if(BaseUtil.strIsNull(itemizeParent)) {
                            fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, "itemize_parent_code IS NULL", new Object[] {}, false, null);
                        }else {
                            fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, "itemize_parent_code = ?", new Object[] {itemizeFullNameAndCode.get(itemizeParent)}, false, null);
                        }
                        if (fseMaxProjectItem==null || BaseUtil.strIsNull(fseMaxProjectItem.getString(Cmnconst.ITEMIZE_CODE))) {
                            code = ProjectItemUtil.autoCreateCode(itemizeFullNameAndCode.get(itemizeParent));
                        }else {
                            code = ProjectItemUtil.autoAddOneCode(fseMaxProjectItem.getString(Cmnconst.ITEMIZE_CODE));
                        }
                    }
                    FieldSetEntity fseNewProject = new FieldSetEntity(Cmnconst.PRODUCT_PROJECT_ITEM);
                    fseNewProject.setValue(Cmnconst.UUID, uuid);
                    fseNewProject.setValue("~type~", "add");
//                    fseNewProject.setValue(Cmnconst.PROJECT_UUID, );
                    fseNewProject.setValue(Cmnconst.ITEMIZE, itemize);
                    fseNewProject.setValue(Cmnconst.ITEMIZE_CODE, code);
                    fseNewProject.setValue(Cmnconst.ITEMIZE_PARENT_CODE, itemizeFullNameAndCode.get(itemizeParent));
                    fseNewProject.setValue(Cmnconst.ITEMIZE_FULL_NAME, itemizFullName);
                    dtNewProjectItem.addFieldSetEntity(fseNewProject);
                    
                    itemizeFullNameAndUUID.put(itemizFullName, uuid);
                    itemizeFullNameAndCode.put(itemizFullName, code);
                    itemizeFullNameAndMaxCode.put(itemizeParent, code);
                }else {
                    String uuid = fseProjectItem.getUUID();
                    String code = fseProjectItem.getString(Cmnconst.ITEMIZE_CODE);
                    FieldSetEntity fseMaxProjectItem;
                    if (BaseUtil.strIsNull(fseProjectItem.getString(Cmnconst.ITEMIZE_PARENT_CODE))) {
                        fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, "itemize_parent_code IS NULL", new Object[] {}, false, null);
                    }else {
                        fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, "itemize_parent_code=?", new Object[] {fseProjectItem.getString(Cmnconst.ITEMIZE_PARENT_CODE)}, false, null);
                    }
                    itemizeFullNameAndUUID.put(itemizFullName, uuid);
                    itemizeFullNameAndCode.put(itemizFullName, code);
                    itemizeFullNameAndMaxCode.put(itemizeParent, fseMaxProjectItem.getString(Cmnconst.ITEMIZE_CODE));
                }
            }
        }
        return finalUUID;
    }
 
    /**
     *     项目预算导入
     * @param dtParseData     解析数据
     * @param headerDataList excel标题数据
     */
    public DataTableEntity importBudget(DataTableEntity dtParseData, List<List<String>> headerDataList) {
        //判断是否有解析EXCEL数据
        if (BaseUtil.dataTableIsEmpty(dtParseData)) {
            return null;
        }
        //声明异常集
        StringBuilder sbError = new StringBuilder();
        //遍历excel转换数据
        for (int i = 0; i < dtParseData.getRows(); i++) {
            FieldSetEntity fseParseData = dtParseData.getFieldSetEntity(i);
            
            //根据解析数据获取项目分项信息
            List<Object> params = new ArrayList<>();
            String projectItem = autoCreateFilter(params, fseParseData);
            
            //根据模板项目分项查询数据库项目分项
            FieldSetEntity fseProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, "project_uuid IN (SELECT uuid FROM product_project_qxlw WHERE project_name=?) AND itemize_full_name=?", params.toArray(), false);
            if(fseProjectItem==null) {
                sbError.append(String.format("第 %s 行项目分项 '%s' 不存在于系统中。", fseParseData.getString("~row~"), projectItem));
                continue;
            }
            //设置关联项目分项
            fseParseData.setValue("project_itemize_uuid", fseProjectItem.getUUID());
            
            //获取编码生成材料类型
            String budgetCode = fseParseData.getString(Cmnconst.BUDGET_CODE);
            Integer materialType = 0;
            if("架立筋".equals(budgetCode)) {
                materialType = 1;
            }else if("声测管".equals(budgetCode)) {
                materialType = 2;
            }else {
                //网片
                FieldSetEntity materialInfo = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_BASE_MATERIAL, "material_type=3 AND material_name like ?", new Object[] {fseParseData.getString(Cmnconst.MATERIAL_CODE)+"%"}, false);
                if (materialInfo!=null) {
                    materialType = 3;
                }
            }
            fseParseData.setValue(Cmnconst.MATERIAL_TYPE, materialType);
        }
        //判断是否包含错误信息
        if (!BaseUtil.strIsNull(sbError.toString())) {
            throw new BaseException(SystemCode.PROJECT_BUDGET_IMPORT_FAIL.getValue(), sbError.toString());
        }
        return dtParseData;
    }
    
    /**
     *     自动生成查询项目分项filter
     * @param params
     * @param fseParseData
     * @return
     */
    public String autoCreateFilter(List<Object> params , FieldSetEntity fseParseData) {
        StringBuilder projectItem = new StringBuilder();
        for (int i = 1; i < 7; i++) {
            String fieldValue = fseParseData.getString("field"+i);
            if(!BaseUtil.strIsNull(fieldValue)) {
                if (i>2) {
                    projectItem.append("/");
                }
                if(i==1) {
                    params.add(fieldValue);
                }else{
                    projectItem.append(fieldValue);
                }
            }
        }
        params.add(projectItem.toString());
        return projectItem.toString();
    }
}