354798ggg
2023-08-17 96b6c0cf5b5a55cb9681ba832ad1278945e5ff78
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
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.ItemizeUtil;
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) {
        try {
            
        
        //判断是否有解析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);
            
            //生成材料类型
            String bugetCode = fseParseData.getString(Cmnconst.BUDGET_CODE);
            String materialType = null;
            if ("声测管".equals(bugetCode)) {
                materialType = "2";
            }else {
                String materialCode = fseParseData.getString(Cmnconst.MATERIAL_CODE);
                if (materialCode.contains("架立筋")) {
                    materialType = "1";
                    fseParseData.setValue(Cmnconst.MATERIAL_CODE, ItemizeUtil.getChineseOrEnglishOrNumber("ENGLISHNUMBER", materialCode));
                }else if (materialCode.contains("钢筋网")) {
                    materialType = "3";
                    fseParseData.setValue(Cmnconst.MATERIAL_CODE, ItemizeUtil.getChineseOrEnglishOrNumber("ENGLISHNUMBER", materialCode));
                }else{
                    FieldSetEntity fseMaterial = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_BASE_MATERIAL,"material_code=?", new Object[] {materialCode}, false);
                    if (fseMaterial != null) {
                        materialType = fseMaterial.getString(Cmnconst.MATERIAL_TYPE);
                        if (materialType.indexOf("0")>-1) {
                            materialType = "0";
                        }
                    }
                }
            }
            fseParseData.setValue(Cmnconst.MATERIAL_TYPE, materialType);
        }
        if (!BaseUtil.dataTableIsEmpty(dtNewProjectItem)) {
            try {
                baseDao.add(dtNewProjectItem);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        } 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;
        FieldSetEntity fseProject = baseDao.getFieldSetByFilter(Cmnconst.PRODUCT_PROJECT_QXLW, "project_name=?", new Object[] {fseParseData.getString("field0")}, false);
        String projectUUID = fseProject.getUUID();
        //循环field1~field6字段,逐步生成对应的项目分项数据
        for (int i = 1; i < 9; i++) {
            
            //获取分项名称,判断是否为空
            String itemize = fseParseData.getString("field"+i);
            //判断项目分项名称是否为空(如为空:则该预算对应的项目分项生成完毕,预算关联的UUID为上一个field分项对应的UUID
            if (BaseUtil.strIsNull(itemize)) {
                if (i==8) {
                    finalUUID = itemizeFullNameAndUUID.get(itemizFullName);
                }
                continue;
            }
            
            //获取上级分项和当前分项全称(如当前分项没有上级:则全称等于名称;如有上级:则全称等于上级全称/名称)
            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, "project_uuid = ? AND itemize_full_name=?", new Object[] {projectUUID,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"}, "project_uuid = ? AND itemize_parent_code IS NULL", new Object[] {projectUUID}, false, null);
                        }else {
                            fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, "project_uuid = ? AND itemize_parent_code = ?", new Object[] {projectUUID, 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, projectUUID);
                    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"}, "project_uuid = ? AND itemize_parent_code IS NULL", new Object[] {projectUUID}, false, null);
                    }else {
                        fseMaxProjectItem = baseDao.getFieldSetEntityByFilter(Cmnconst.PRODUCT_PROJECT_ITEM, new String[] {"Max(itemize_code)itemize_code"}, " project_uuid = ? AND itemize_parent_code=?", new Object[] {projectUUID, 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 projectUUID
     * @return
     */
    public boolean clearBudget(String projectUUID, String itemizeCode) {
        DataTableEntity dtOutbound;
        if(BaseUtil.strIsNull(itemizeCode)) {
            dtOutbound = baseDao.listTable(Cmnconst.PRODUCT_PROJECT_OUTBOUND, "project_uuid=?", new Object[] {projectUUID});
        }else {
            dtOutbound = baseDao.listTable(Cmnconst.PRODUCT_PROJECT_OUTBOUND, "project_uuid=? AND project_itemize IN (SELECT uuid FROM product_project_item WHERE project_uuid=? AND itemize_code LIKE ?)", new Object[] {projectUUID,projectUUID,itemizeCode+"%"});
        }
        if (!BaseUtil.dataTableIsEmpty(dtOutbound)) {
            throw new BaseException(SystemCode.PROJeCT_BUDGET_CLEAR_FAIL_HAS_OUTBOUND.getValue(), SystemCode.PROJeCT_BUDGET_CLEAR_FAIL_HAS_OUTBOUND.getText());
        }
        return false;
//        if (BaseUtil.strIsNull(itemizeCode)) {
//            return baseDao.executeUpdate("DELETE FROM product_project_budget WHERE project_itemize_uuid IN (SELECT uuid FROM product_project_item WHERE project_uuid=?)", new Object[] {projectUUID});
//        }else {
//            return baseDao.executeUpdate("DELETE FROM product_project_budget WHERE project_itemize_uuid IN (SELECT uuid FROM product_project_item WHERE project_uuid=? AND itemize_code LIKE ?)", new Object[] {projectUUID,itemizeCode+"%"});
//        }
    }
}