2369059705@qq.com
2023-07-07 c913a335643619ac7d1943d75ce06f71a31b8185
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
package com.product.project.management.service;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import com.alibaba.fastjson.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
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.project.management.config.Cmnconst;
import com.product.project.management.config.SystemCode;
import com.product.util.BaseUtil;
 
import cn.hutool.json.JSONObject;
 
@Component("qxlw-project-service")
public class ProjectInfoService extends AbstractBaseService {
 
    @Autowired
    BaseDao baseDao;
 
    /**
     * 通过项目类型获取项目分项(获取模板分项)
     *
     * @param projectType
     * @return
     */
    public DataTableEntity getProjectTypeItem(String projectType) {
        DataTableEntity dtProjectItem = baseDao.listTable(Cmnconst.PRODUCT_PROJECT_BASE_PROJECT_ITEM, "itemize_type=?", new Object[]{projectType}, new Object[]{Cmnconst.ITEMIZE, Cmnconst.ITEMIZE_CODE, Cmnconst.ITEMIZE_TYPE, Cmnconst.ITEMIZE_PARENT_CODE});
        if (!BaseUtil.dataTableIsEmpty(dtProjectItem)) {
            DataTableEntity newDtProjectItem = BaseUtil.dataTableToTreeTable(dtProjectItem, Cmnconst.ITEMIZE_CODE, Cmnconst.ITEMIZE_PARENT_CODE, null);
            return newDtProjectItem;
        }
        return null;
    }
 
    /**
     * 通过项目UUID获取项目分项(获取保存的子表分项--多个树)
     *
     * @param uuid
     * @return
     */
    public FieldSetEntity getProjectItem(String uuid) {
        FieldSetEntity fseProject = baseDao.getFieldSetEntity(Cmnconst.PRODUCT_PROJECT_QXLW, uuid, true);
        DataTableEntity newDtProjectItem = BaseUtil.dataTableToTreeTable(fseProject.getSubDataTable(Cmnconst.PRODUCT_PROJECT_ITEM), Cmnconst.ITEMIZE_CODE, Cmnconst.ITEMIZE_PARENT_CODE, null);
        Map<String, DataTableEntity> dtSubTable = fseProject.getSubData();
        dtSubTable.put(Cmnconst.PRODUCT_PROJECT_ITEM, newDtProjectItem);
        return fseProject;
    }
 
    /**
     * 通过项目UUID获取项目分项(获取保存的子表分项--单个树)
     *
     * @param uuid
     * @return
     */
    public DataTableEntity getProjectAllItem(String uuid) {
        DataTableEntity dtProjectItemize = baseDao.listTable(Cmnconst.PRODUCT_PROJECT_ITEM, "project_uuid=?", new Object[]{uuid}, new Object[]{CoreConst.UUID, Cmnconst.ITEMIZE, Cmnconst.ITEMIZE_CODE, Cmnconst.ITEMIZE_PARENT_CODE});
        if (!BaseUtil.dataTableIsEmpty(dtProjectItemize)) {
            DataTableEntity newDtProjectItem = BaseUtil.dataTableToTreeTable(dtProjectItemize, Cmnconst.ITEMIZE_CODE, Cmnconst.ITEMIZE_PARENT_CODE, null);
            return newDtProjectItem;
        }
        return null;
    }
 
    /**
     * 获取所有项目信息
     *
     * @return
     */
    public DataTableEntity listProject() {
        return baseDao.listTable(Cmnconst.PRODUCT_PROJECT_QXLW, null, null, new Object[]{CoreConst.UUID, Cmnconst.PROJECT_NAME});
    }
 
    /**
     * 项目数据分析
     *
     * @param project_uuid
     * @return
     */
    public JSONObject statistAnalysis(String project_uuid) {
 
        JSONObject returnJson = new JSONObject();
 
        //获取数据库原始数据
        StringBuilder sb = new StringBuilder();
        sb.append("WITH outbound AS(")
                .append(" SELECT A.project_uuid,D.itemize project_itemize,C.material_type,B.material_code,SUM(B.outbound_weight)outbound_weight ")
                .append(" FROM product_project_outbound A ")
                .append(" LEFT JOIN product_project_outbound_sub B ON A.uuid=B.outbound_uuid ")
                .append(" LEFT JOIN product_project_base_material C ON B.material_uuid = C.uuid ")
                .append(" LEFT JOIN product_project_item D ON A.project_itemize = D.uuid ")
                .append(" WHERE A.flow_flag=2 AND A.project_uuid = ? ")
                .append(" GROUP BY A.project_uuid,D.itemize,C.material_type,B.material_code ")
                .append(" ) ")
                .append(" SELECT A.project_uuid,A.project_itemize,A.total_outbound_weight,B.material_type,B.material_code,B.outbound_weight ")
                .append(" FROM ( ")
                .append(" SELECT project_uuid,project_itemize,SUM(outbound_weight)total_outbound_weight ")
                .append(" FROM outbound ")
                .append(" GROUP BY project_uuid,project_itemize ")
                .append(" )A ")
                .append(" RIGHT JOIN outbound B ON A.project_uuid=B.project_uuid AND A.project_itemize=B.project_itemize ")
                .append(" ORDER BY project_itemize,material_code");
        DataTableEntity dtItemizeInfo = baseDao.listTable(sb.toString(), new Object[]{project_uuid});
        if (!BaseUtil.dataTableIsEmpty(dtItemizeInfo)) {
 
            Map<String, FieldSetEntity> convertData = new HashMap<>();
            String[] materialTypes = new String[3];
 
            //通过Java循环将"材料"和"出库量"数据行转列
            for (int i = 0; i < dtItemizeInfo.getRows(); i++) {
                FieldSetEntity fseItemize = dtItemizeInfo.getFieldSetEntity(i);
 
                //获取材料编码,材料类型,出库量
                String materialCode = fseItemize.getString(Cmnconst.MATERIAL_CODE);
                String outboundWeight = fseItemize.getString(Cmnconst.OUTBOUND_WEIGHT);
                Integer materialType = fseItemize.getInteger(Cmnconst.MATERIAL_TYPE);
 
                //收集获取所有表头列(材料编码)
                if (BaseUtil.strIsNull(materialTypes[materialType])) {
                    materialTypes[materialType] = materialCode;
                } else {
                    if(materialTypes[fseItemize.getInteger(Cmnconst.MATERIAL_TYPE)].indexOf(materialCode)<0) {
                        materialTypes[fseItemize.getInteger(Cmnconst.MATERIAL_TYPE)] += "," + materialCode;
                    }
                }
 
                //收集行转列数据
                String itemize = fseItemize.getString(Cmnconst.PROJECT_ITEMIZE);
                if (convertData.containsKey(itemize)) {
                    convertData.get(itemize).setValue(materialCode, outboundWeight);
                } else {
                    FieldSetEntity fseConvertData = new FieldSetEntity(Cmnconst.PRODUCT_PROJECT_QXLW);
                    fseConvertData.setValue(Cmnconst.PROJECT_ITEMIZE, itemize);
                    fseConvertData.setValue(Cmnconst.TOTAL_OUTBOUND_WEIGHT, fseItemize.getString(Cmnconst.TOTAL_OUTBOUND_WEIGHT));
                    fseConvertData.setValue(materialCode, outboundWeight);
                    convertData.put(itemize, fseConvertData);
                }
            }
            //将数据转为DataTableEntity返回
            if (!convertData.isEmpty()) {
                DataTableEntity finalConvertData = new DataTableEntity();
                convertData.forEach((k, v) -> {
                    finalConvertData.addFieldSetEntity(v);
                });
                returnJson.set("data", BaseUtil.dataTableEntityToJson(finalConvertData));
            }
            for (int i = 0; i < materialTypes.length; i++) {
                if (!BaseUtil.strIsNull(materialTypes[i])) {
                    returnJson.set("type" + i, materialTypes[i]);
                }
            }
        }
        return returnJson;
    }
 
    /**
     * 删除子项验证(已经生成预算的子项不能删除)
     *
     * @param uuid
     */
    public void deleteItemizeValidate(String uuid) {
        DataTableEntity dtBudget = baseDao.listTable(Cmnconst.PRODUCT_PROJECT_BUDGET, "budget_code=?", new Object[]{uuid});
        if (!BaseUtil.dataTableIsEmpty(dtBudget)) {
            throw new BaseException(SystemCode.PROJECT_MANAGEMENT_ITEMIZE_DEL_FAIL.getValue(), SystemCode.PROJECT_MANAGEMENT_ITEMIZE_DEL_FAIL.getText());
        }
    }
 
    /**
     * 获取分项预算信息
     *
     * @param projectUUID 项目UUID
     * @param itemizeCode 分项编码
     * @param capge       当前页
     * @param pageSize    页大小
     * @return
     */
    public DataTableEntity listItemizeBudget(String projectUUID, String itemizeCode, Integer capge, Integer pageSize) {
 
        String filter;
        List<String> params = new ArrayList<>();
        if (BaseUtil.strIsNull(itemizeCode)) {
            filter = "project_itemize_uuid IN (SELECT uuid FROM product_project_item WHERE project_uuid=?)";
            params.add(projectUUID);
        } else {
            filter = "project_itemize_uuid IN (SELECT uuid FROM product_project_item WHERE project_uuid=? AND itemize_code like ?)";
            params.add(projectUUID);
            params.add(itemizeCode + "%");
        }
        DataTableEntity dtItemizeBudget = baseDao.listTable(Cmnconst.PRODUCT_PROJECT_BUDGET, filter, params.toArray(), null, null, pageSize, capge);
        if (!BaseUtil.dataTableIsEmpty(dtItemizeBudget)) {
            baseDao.loadPromptData(dtItemizeBudget);
        }
        return dtItemizeBudget;
    }
 
    /**
     * 更具项目分项uuid获取项目分项下的材料
     * @param uuid
     * @param capge
     * @param pageSize
     * @return
     */
    public DataTableEntity listMaterialV(String uuid, Integer capge, Integer pageSize) {
        return baseDao.listTable("product_project_base_material_v","project_itemize_uuid=?",new String[]{uuid},null,null,pageSize, capge);
    }
    /**
     * 更具仓库和材料获取库存
     * @return
     */
    public FieldSetEntity findInventoryV(String warehouse_uuid, String material_uuid) {
        return baseDao.getFieldSetByFilter("product_project_inventory_v","warehouse_uuid=? and uuid=?",new String[]{warehouse_uuid,material_uuid},false);
    }
    /**
     * 根据项目uuid获取项目分项树结构
     * @param uuid
     * @return
     */
 
    public JSONArray getTreeProjectItem(String uuid) {
        DataTableEntity dtProjectItemize = baseDao.listTable(Cmnconst.PRODUCT_PROJECT_ITEM, "project_uuid=?", new Object[]{uuid}, new Object[]{CoreConst.UUID, Cmnconst.ITEMIZE, Cmnconst.ITEMIZE_CODE, Cmnconst.ITEMIZE_PARENT_CODE});
        DataTableEntity newDtProjectItem = BaseUtil.dataTableToTreeTable(dtProjectItemize, Cmnconst.ITEMIZE_CODE, Cmnconst.ITEMIZE_PARENT_CODE, null);
        JSONArray objects = BaseUtil.dataTableEntityToJson(newDtProjectItem);
        JSONObject json = new JSONObject();
        json.set("itemize", "项目分部分项");
        json.set("children", objects);
        json.set("type", 1);
        JSONArray array = new JSONArray();
        array.add(json);
        return array;
    }
}