futian.liu
2023-12-20 1b8db0473522c886428767f7eeaaf7f52d47ce42
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
package com.consum.base.service.impl;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
 
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
 
import com.consum.base.core.utils.MapUtils;
import com.consum.base.core.utils.MapperUtil;
import com.consum.base.pojo.dto.GoodsInfoDTO;
import com.consum.base.pojo.dto.GoodsModelCountDTO;
import com.consum.base.service.LWhGoodsService;
import com.walker.infrastructure.utils.CollectionUtils;
import com.walker.jdbc.service.BaseServiceImpl;
 
/**
 * @ClassName LWhGoodsService
 * @Date 2023/10/24
 * @Description
 * @Version 1.0
 **/
@Service
public class LWhGoodsServiceImpl extends BaseServiceImpl implements LWhGoodsService {
 
    /**
     * @param warehouseType 仓库类型0机构1部门
     * @param warehouseId 所属仓库仓库编号
     * @param baseGoodsModelsId 规格型号编号
     * @param states (0=在途调拨;1=入库未分发;2=已下发;3=报废)
     * @param buyType 采购方式(1:集采;2=自采)
     * @return 查询某个型号在仓库中的数量
     */
    private static String query_Goods_Model_Num = "SELECT COUNT(1) from L_WH_GOODS where 1=1";
 
    @Override
    public int queryGoodsModelNum(Integer warehouseType, List<Long> warehouseId, Long baseGoodsModelsId, Integer states,
        Integer buyType) {
        StringBuilder sql = new StringBuilder(query_Goods_Model_Num);
        Map<String, Object> paramts = new HashMap<>();
 
        if (warehouseType != null) {
            sql.append(" and WAREHOUSE_TYPE=:warehouseType");
            paramts.put("warehouseType", warehouseType);
        }
        if (warehouseId != null) {
            sql.append(" and WAREHOUSE_ID in (:warehouseId)");
            paramts.put("warehouseId", warehouseId);
        }
        if (baseGoodsModelsId != null) {
            sql.append(" and BASE_GOODS_MODELS_ID=:baseGoodsModelsId");
            paramts.put("baseGoodsModelsId", baseGoodsModelsId);
        }
        if (states != null) {
            sql.append(" and STATES=:states");
            paramts.put("states", states);
        }
        if (buyType != null) {
            sql.append(" and BUY_TYPE=:buyType");
            paramts.put("buyType", buyType);
        }
        return queryForInt(sql.toString(), paramts);
    }
 
    @Override
    public int queryGoodsModelInWareHouseNum(Integer warehouseType, List<Long> warehouseId, Long baseGoodsModelsId,
        Integer states, Integer buyType) {
        StringBuilder sql = new StringBuilder(query_Goods_Model_Num);
        Map<String, Object> paramts = new HashMap<>();
 
        if (warehouseType != null) {
            sql.append(" and WAREHOUSE_TYPE=:warehouseType");
            paramts.put("warehouseType", warehouseType);
        }
        if (warehouseId != null) {
            sql.append(" and WAREHOUSE_ID in (:warehouseId)");
            paramts.put("warehouseId", warehouseId);
        }
        if (baseGoodsModelsId != null) {
            sql.append(" and BASE_GOODS_MODELS_ID=:baseGoodsModelsId");
            paramts.put("baseGoodsModelsId", baseGoodsModelsId);
        }
        if (states != null) {
            sql.append(" and STATES=:states");
            paramts.put("states", states);
        }
        if (buyType != null) {
            sql.append(" and BUY_TYPE=:buyType");
            paramts.put("buyType", buyType);
        }
        return queryForInt(sql.toString(), paramts);
    }
 
    /**
     * 出库时候,先入库的先出库,同时入库的,按价格高的先出库
     *
     * @param warehouseId 所属仓库仓库编号
     * @param baseGoodsModelsId 规格型号编号
     * @param states 状态(0=在途调拨;1=入库未分发;2=已下发;3=报废)
     * @param buyType 采购方式(1:集采;2=自采)
     * @param goodsModelNum 取出的数量
     * @return
     */
    private static String QUERY_OUT_GOODS_ID = "SELECT * FROM L_WH_GOODS WHERE 1=1";
 
    @Override
    public List<Map<String, Object>> queryOutGoods(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId,
        Integer states, Integer buyType, Integer goodsModelNum) {
        StringBuilder sql = new StringBuilder(QUERY_OUT_GOODS_ID);
        Map<String, Object> paramts = new HashMap<>();
        if (warehouseType != null) {
            sql.append(" and WAREHOUSE_TYPE=:warehouseType");
            paramts.put("warehouseType", warehouseType);
        }
        if (warehouseId != null) {
            sql.append(" and WAREHOUSE_ID=:warehouseId");
            paramts.put("warehouseId", warehouseId);
        }
        if (baseGoodsModelsId != null) {
            sql.append(" and BASE_GOODS_MODELS_ID=:baseGoodsModelsId");
            paramts.put("baseGoodsModelsId", baseGoodsModelsId);
        }
        if (states != null) {
            sql.append(" and STATES=:states");
            paramts.put("states", states);
        }
        if (buyType != null) {
            sql.append(" and BUY_TYPE=:buyType");
            paramts.put("buyType", buyType);
        }
        return select(sql.append(" limit ").append(goodsModelNum).toString(), paramts);
    }
 
    /**
     * 出库时候,先入库的先出库,同时入库的,按价格高的先出库
     *
     * @param warehouseId 所属仓库仓库编号
     * @param baseGoodsModelsId 规格型号编号
     * @param states 状态(0=在途调拨;1=入库未分发;2=已下发;3=报废)
     * @param buyType 采购方式(1:集采;2=自采)
     * @param goodsModelNum 取出的数量
     * @return
     */
    @Override
    public List<Long> queryOutGoodsId(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId, Integer states,
        Integer buyType, Integer goodsModelNum) {
        List<Map<String, Object>> outGoods =
            queryOutGoods(warehouseType, warehouseId, baseGoodsModelsId, states, buyType, goodsModelNum);
        if (CollectionUtils.isEmpty(outGoods)) {
            return null;
        }
        List<Long> whGoodsIds = outGoods.stream().map(map -> (Long)map.get("id")).collect(Collectors.toList());
        return whGoodsIds;
    }
 
    private static String QUERY_GOODS_PRICE_BY_ID = "SELECT sum(PRICE)totalPrice from L_WH_GOODS goods where 1=1";
 
    @Override
    public long queryGoodsPriceById(List<Long> goodsIds) {
        StringBuilder sql = new StringBuilder(QUERY_GOODS_PRICE_BY_ID);
        Map<String, Object> paramts = new HashMap<>();
        if (!CollectionUtils.isEmpty(goodsIds)) {
            sql.append(" and id in(:goodsIds)");
            paramts.put("goodsIds", goodsIds);
        }
        List<Map<String, Object>> map = this.select(sql.toString(), paramts);
        if (CollectionUtils.isEmpty(map)) {
            return 0;
        }
        BigDecimal totalPrice = (BigDecimal)map.get(0).get("totalPrice");
        return totalPrice.longValue();
    }
 
    /**
     * 查询报废物品 默认优先报废最高价的物品
     *
     * @param warehouseType
     * @param warehouseId
     * @param transBusinessId 调拨单号
     * @param nowUserName 使用人姓名
     * @param baseGoodsModelsId 物品型号
     * @param states 状态(0=在途调拨;1=入库未分发;2=已下发;3=报废 4 零星出库)
     * @param goodsModelNum 取出的数量
     * @return
     */
 
    private static String QUERY_SCRAPPED_GOODS_PREFIX_1 =
        "SELECT goods.id, goods.PRICE FROM L_WH_GOODS goods LEFT JOIN L_GOODS_USER_RECORD useRecord ON goods.id=useRecord.WH_GOODS_ID AND useRecord.LAST_RECORD=1 WHERE 1=1 ";
    private static String QUERY_SCRAPPED_GOODS_PREFIX_2 =
        " AND goods.id IN (SELECT lwgrd.WH_GOODS_ID FROM L_WAREHOUSE_FLOW flow LEFT JOIN L_WH_GOODS_RECORD lwgr ON lwgr.WAREHOUSE_FLOW_ID=flow.id LEFT JOIN L_WH_GOODS_RECORD_DETAILS lwgrd ON lwgrd.WH_GOODS_RECORD_ID=lwgr.id WHERE flow.THIS_TYPE=1 AND flow.BUSINESS_FORM_ID=:transBusinessId)";
    private static String QUERY_SCRAPPED_GOODS_PREFIX_2_MODEL_NOT_NULL =
        " AND goods.id IN (SELECT lwgrd.WH_GOODS_ID FROM L_WAREHOUSE_FLOW flow LEFT JOIN L_WH_GOODS_RECORD lwgr ON lwgr.WAREHOUSE_FLOW_ID=flow.id LEFT JOIN L_WH_GOODS_RECORD_DETAILS lwgrd ON lwgrd.WH_GOODS_RECORD_ID=lwgr.id WHERE flow.THIS_TYPE=1 AND flow.BUSINESS_FORM_ID=:transBusinessId AND lwgr.BASE_GOODS_MODELS_ID = :lwgrGoodsModelId)";
    private static String QUERY_SCRAPPED_GOODS_END = " ORDER BY goods.PRICE DESC,goods.PROCURE_DATE ASC,goods.id";
 
    @Override
    public List<Map<String, Object>> queryScrappedGoods(Integer warehouseType, Long warehouseId, Long transBusinessId,
        String nowUserName, Long baseGoodsModelsId, Short states, Integer goodsModelNum) {
        if (warehouseType == null) {
            warehouseType = 0;
        }
        StringBuilder sql = new StringBuilder(QUERY_SCRAPPED_GOODS_PREFIX_1);
        Map<String, Object> paramts = new HashMap<>();
        if (warehouseType != null) {
            sql.append(" AND goods.WAREHOUSE_TYPE=:warehouseType");
            paramts.put("warehouseType", warehouseType);
        }
        if (warehouseId != null) {
            sql.append(" AND goods.WAREHOUSE_ID=:warehouseId");
            paramts.put("warehouseId", warehouseId);
        }
        if (StringUtils.isNotEmpty(nowUserName)) {
            sql.append(" AND useRecord.NOW_USER_NAME=:nowUserName");
            paramts.put("nowUserName", nowUserName);
        }
        if (baseGoodsModelsId != null) {
            sql.append(" AND goods.BASE_GOODS_MODELS_ID=:baseGoodsModelsId");
            paramts.put("baseGoodsModelsId", baseGoodsModelsId);
        }
        if (states != null) {
            sql.append(" AND goods.STATES=:states");
            paramts.put("states", states);
        }
        if (transBusinessId != null) {
            if (baseGoodsModelsId != null) {
                sql.append(QUERY_SCRAPPED_GOODS_PREFIX_2_MODEL_NOT_NULL);
                paramts.put("transBusinessId", transBusinessId);
                paramts.put("lwgrGoodsModelId", baseGoodsModelsId);
            } else {
                sql.append(QUERY_SCRAPPED_GOODS_PREFIX_2);
                paramts.put("transBusinessId", transBusinessId);
            }
        }
        sql.append(QUERY_SCRAPPED_GOODS_END);
        if (goodsModelNum != null) {
            sql.append(" limit ").append(goodsModelNum);
        }
        return select(sql.toString(), paramts);
    }
 
    /**
     * 查询报废物品 默认优先报废最高价的物品
     *
     * @param warehouseType
     * @param warehouseId
     * @param transBusinessId 调拨单号
     * @param nowUserName 使用人姓名
     * @param baseGoodsModelsId 物品型号
     * @param states 状态(0=在途调拨;1=入库未分发;2=已下发;3=报废 4 零星出库)
     * @param goodsModelNum 取出的数量
     * @return
     */
    @Override
    public List<Long> queryScrappedGoodsIds(Integer warehouseType, Long warehouseId, Long transBusinessId,
        String nowUserName, Long baseGoodsModelsId, Short states, Integer goodsModelNum) {
        List<Map<String, Object>> outGoods = queryScrappedGoods(warehouseType, warehouseId, transBusinessId,
            nowUserName, baseGoodsModelsId, states, goodsModelNum);
        if (CollectionUtils.isEmpty(outGoods)) {
            return null;
        }
        List<Long> whGoodsIds = outGoods.stream().map(map -> (Long)map.get("id")).collect(Collectors.toList());
        return whGoodsIds;
    }
 
    /**
     * 设置物品状态为调拨中
     *
     * @param whGoods
     * @param toWarehouseId
     * @param toWarehouseName
     * @return
     */
    private static String MOD_GOODS_TRANSFERING_PREFIX = "update L_WH_GOODS set ";
 
    @Override
    public int modGoodsTransfering(List<Long> whGoods, Integer warehouseType, Long toWarehouseId,
        String toWarehouseName, Integer states) {
        StringBuilder sql = new StringBuilder(MOD_GOODS_TRANSFERING_PREFIX);
        ArrayList<Object> params = new ArrayList<>();
        if (warehouseType != null) {
            sql.append(", WAREHOUSE_TYPE=?");
            params.add(warehouseType);
        }
        if (toWarehouseId != null) {
            sql.append(", WAREHOUSE_ID=?");
            params.add(toWarehouseId);
        }
        if (toWarehouseName != null) {
            sql.append(", WAREHOUSE_NAME=?");
            params.add(toWarehouseName);
        }
        if (states != null) {
            sql.append(", STATES=?");
            params.add(states);
        }
        sql.deleteCharAt(22);
        sql.append(" where id in(").append(StringUtils.join(whGoods, ",")).append(")");
        return update(sql.toString(), params.toArray());
    }
 
    private static String GOODS_NUM_PRICE =
        "SELECT t.tenantId,count(id) total_Num,count(CASE WHEN STATES=2 THEN 1 END) xia_fa_num,IFNULL(round(sum(PRICE)/1000000,2),0) total_price,IFNULL(ROUND(count(CASE WHEN STATES=2 THEN 1 END)/count(id),4),0)*100 AS zhan_you_percent,count(CASE COST_TYPE WHEN 1 THEN 1 END) a_total_Num,count(CASE COST_TYPE WHEN 2 THEN 1 END) b_total_Num,count(CASE COST_TYPE WHEN 3 THEN 1 END) c_total_Num,IFNULL( round( sum( CASE COST_TYPE WHEN 1 THEN PRICE END  )/ 1000000, 2 ), 0 )  a_total_price,IFNULL( round( sum( CASE COST_TYPE WHEN 2 THEN PRICE END  )/ 1000000, 2 ), 0 ) b_total_price,IFNULL( round( sum( CASE COST_TYPE WHEN 3 THEN PRICE END  )/ 1000000, 2 ), 0 ) c_total_price FROM (SELECT tCangKu.tenantId,tKuCun.id,tKuCun.STATES,tKuCun.COST_TYPE,tKuCun.price FROM (SELECT tenant.id tenantId,tenant.NAME AS org_name,ware.*FROM fin_sys_tenant tenant RIGHT JOIN ( SELECT 0 WAREHOUSE_TYPE,id,AGENCY_ID,WAREHOUSE_NAME FROM BASE_WAREHOUSE UNION ALL SELECT 1 WAREHOUSE_TYPE,id,TENANT_ID AGENCY_ID,`NAME` WAREHOUSE_NAME FROM fin_sys_tenant_department) ware ON tenant.id=ware.AGENCY_ID WHERE 1=1 ";
    private static String GOODS_NUM_PRICE_END =
        ") tCangKu LEFT JOIN L_WH_GOODS tKuCun ON tCangKu.WAREHOUSE_TYPE=tKuCun.WAREHOUSE_TYPE AND tCangKu.id=tKuCun.WAREHOUSE_ID AND tKuCun.STATES BETWEEN 1 AND 2 where tKuCun.id is not null) t GROUP BY t.tenantId";
 
    // 按机构统计物品价值、数量/金额等
    @Override
    public List<Map<String, Object>> getGoodsNumPrice(Long agencyId) {
        StringBuilder sql = new StringBuilder(GOODS_NUM_PRICE);
        Map<String, Object> paramts = new HashMap<>();
        sql.append(" and tenant.id=:agencyId");
        paramts.put("agencyId", agencyId);
        return select(sql.append(GOODS_NUM_PRICE_END).toString(), paramts, new MapperUtil());
    }
 
    private static String GET_GOODS_NUM_BY_MONTH =
        "SELECT monthT.month_Num,IFNULL(datat.total_Num,0) total_Num,IFNULL(datat.add_total_Num,0) add_total_Num,IFNULL(datat.reduce_total_Num,0) reduce_total_Num FROM (SELECT monthT.month_Num FROM (SELECT ( SELECT 1) month_Num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) monthT) monthT LEFT JOIN ( SELECT t.tenantId,count(t.THIS_COUNT) total_Num,count(CASE t.THIS_TYPE WHEN 1 THEN t.THIS_COUNT END) add_total_Num,count(CASE t.THIS_TYPE WHEN 2 THEN t.THIS_COUNT END) reduce_total_Num,SUBSTR(DEAL_TIME,5,2) data_month FROM ( SELECT tCangKu.tenantId,tKuCun.id,tKuCun.THIS_TYPE,tKuCun.THIS_COUNT,tKuCun.DEAL_TIME FROM (SELECT tenant.id tenantId,tenant.NAME AS org_name,ware.*FROM fin_sys_tenant tenant RIGHT JOIN ( SELECT 0 WAREHOUSE_TYPE,id,AGENCY_ID,WAREHOUSE_NAME FROM BASE_WAREHOUSE UNION ALL SELECT 1 WAREHOUSE_TYPE,id,TENANT_ID AGENCY_ID,`NAME` WAREHOUSE_NAME FROM fin_sys_tenant_department) ware ON tenant.id=ware.AGENCY_ID WHERE 1=1 ";
    private static String GET_GOODS_NUM_BY_MONTH_END =
        ")tCangKu LEFT JOIN L_WH_GOODS_RECORD tKuCun ON tCangKu.WAREHOUSE_TYPE=tKuCun.WAREHOUSE_TYPE AND tCangKu.id=tKuCun.WAREHOUSE_ID and tKuCun.DEAL_TIME between cast(CONCAT(DATE_FORMAT(NOW(), '%Y'),'1231240000') as UNSIGNED) and  cast(CONCAT(DATE_FORMAT(NOW(), '%Y'),'0101000000') as UNSIGNED)) t GROUP BY t.tenantId,SUBSTR(DEAL_TIME,5,2)) datat ON datat.data_month=monthT.month_Num ORDER BY monthT.month_Num ASC";
 
    // 按机构统计物品价值、数量/金额等
    @Override
    public List<Map<String, Object>> getGoodsNumByMonth(Long agencyId) {
        StringBuilder sql = new StringBuilder(GET_GOODS_NUM_BY_MONTH);
        Map<String, Object> paramts = new HashMap<>();
        sql.append(" and tenant.id=:agencyId");
        paramts.put("agencyId", agencyId);
        return select(sql.append(GET_GOODS_NUM_BY_MONTH_END).toString(), paramts, new MapperUtil());
    }
 
    @Override
    public GoodsModelCountDTO queryGoodsAmount(Long baseGoodsModelsId, Integer type) {
        StringBuilder sql = new StringBuilder(
            "SELECT sum(PRICE) amount from L_WH_GOODS where base_goods_models_id =:baseGoodsModelsId and states =:type");
        Map<String, Object> param = new HashMap<>();
        param.put("baseGoodsModelsId", baseGoodsModelsId);
        param.put("type", type);
        List<Map<String, Object>> result = this.select(sql.toString(), param);
        if (!CollectionUtils.isEmpty(result)) {
            List<GoodsModelCountDTO> goodsModelCount = Lists.newArrayList();
            for (Map<String, Object> item : result) {
                GoodsModelCountDTO goodsModelCountDTO = MapUtils.convertMapToObj(item, GoodsModelCountDTO.class);
                goodsModelCount.add(goodsModelCountDTO);
            }
            return goodsModelCount.get(0);
        }
 
        return null;
    }
 
    @Override
    public List<GoodsInfoDTO> queryGoodsInfo(Set<Long> baseModelIds, Set<Long> wareHouseIds) {
 
        List<GoodsInfoDTO> goodsInfoDTOS = Lists.newArrayList();
        StringBuilder sql = new StringBuilder(
            "SELECT distinct WAREHOUSE_ID,WAREHOUSE_NAME from L_WH_GOODS where base_goods_models_id in (:baseGoodsModelsIds) "
                + "and WAREHOUSE_TYPE =0 and BUY_TYPE =1 and states =1 and WAREHOUSE_ID in (:wareHouseIds)");
        Map<String, Object> param = new HashMap<>();
        if (!CollectionUtils.isEmpty(baseModelIds)) {
            param.put("baseGoodsModelsIds", baseModelIds);
        }
        param.put("wareHouseIds", wareHouseIds);
        List<Map<String, Object>> result = this.select(sql.toString(), param, new MapperUtil());
        result.forEach(item -> {
            GoodsInfoDTO goodsInfoDTO = MapUtils.convertMapToObj(item, GoodsInfoDTO.class);
            goodsInfoDTOS.add(goodsInfoDTO);
        });
        return goodsInfoDTOS;
    }
}