黎星凯
2024-04-15 62b6a7fac3f2acde70b578431147c4a01f19c182
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
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
package com.consum.base.service.impl;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import cn.hutool.core.collection.CollectionUtil;
import com.consum.base.pojo.query.LWhLedgerQry;
import com.consum.base.service.*;
import org.apache.commons.compress.utils.Lists;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
 
import com.consum.base.core.CodeGeneratorEnum;
import com.consum.base.core.CodeGeneratorService;
import com.consum.base.core.type.InventoryStatesType;
import com.consum.base.core.utils.IdUtil;
import com.consum.base.core.utils.MapUtils;
import com.consum.base.core.utils.MapperUtil;
import com.consum.base.core.utils.PageUtil;
import com.consum.base.pojo.excel.InventoryExcelTemplate;
import com.consum.base.pojo.query.LWhFormInventoryQry;
import com.consum.base.pojo.request.FormInventoryParam;
import com.consum.base.pojo.request.LWhFormInventoryParam;
import com.consum.base.pojo.response.FormInventoryDetailVO;
import com.consum.base.pojo.response.FormInventoryGoodsVO;
import com.consum.base.pojo.response.FormInventoryVO;
import com.consum.base.service.core.LWhFormInventoryCoreService;
import com.consum.model.po.BaseWarehouse;
import com.consum.model.po.FinSysTenant;
import com.consum.model.po.FinSysTenantUser;
import com.consum.model.po.LWhFormInventory;
import com.iplatform.model.po.S_user_core;
import com.walker.db.page.GenericPager;
import com.walker.infrastructure.utils.DateUtils;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.jdbc.service.BaseServiceImpl;
 
import lombok.extern.slf4j.Slf4j;
 
import javax.annotation.Resource;
 
/**
 * @Description 盘点
 * @Author 卢庆阳
 * @Date 2023/10/23
 */
@Slf4j
@Service
public class LWhFormInventoryServiceImpl extends BaseServiceImpl implements LWhFormInventoryService {
 
    @Autowired
    private CodeGeneratorService codeGeneratorService;
    @Autowired
    private BaseWarehouseService baseWarehouseService;
    @Autowired
    private LWhFormInventoryGoodsService inventoryGoodsService;
    @Autowired
    private LWhGoodsService lWhGoodsService;
    @Autowired
    private FinSysTenantService finSysTenantService;
    @Autowired
    @Lazy
    private LWhFormInventoryCoreService lWhFormInventoryCoreService;
    @Resource
    private FinWarehouseLedgerServiceImpl finWarehouseLedgerService;
 
    private static final String QUERY_LIST = "select * from l_wh_form_inventory where 1=1 ";
 
    private static final String QUERY_PD_DETAIL_LIST =
            "SELECT fig.id,fi.WAREHOUSE_NAME,fig.GOODS_TEMPLATE_NAME,fig.BASE_GOODS_MODELS_NAME,fig.INVENTORY_RESULT,fig.INIT_COUNTS,fig.INVENTORY_COUNTS,"
                    + "fig.ERROR_COUNTS,fi.AGENCY_NAME,fi.OPERATOR_NAME,fi.STOP_TIME operatorTime,"
                    + "CASE WHEN fig.INVENTORY_RESULT = 2 THEN fi.IN_BUSINESS_FORM_CODE WHEN fig.INVENTORY_RESULT = 3 THEN fi.OUT_BUSINESS_FORM_CODE END warehouseFormCode "
                    + "FROM l_wh_form_inventory fi INNER JOIN l_wh_form_inventory_goods fig ON fi.ID = fig.WH_FORM_INVENTORY_ID where 1=1 ";
 
    /**
     * @param param
     * @param currentUser  当前登录用户
     * @param operatorUser 盘点人
     * @param monitorUser  监盘人
     * @return
     * @Description 新增
     * @Author 卢庆阳
     * @Date 2023/10/31
     */
    @Override
    public int add(FormInventoryParam param, FinSysTenantUser currentUser, FinSysTenantUser operatorUser,
                   FinSysTenantUser monitorUser) {
        // 新增盘点单
        LWhFormInventory lWhFormInventory = new LWhFormInventory();
        BeanUtils.copyProperties(param, lWhFormInventory);
        lWhFormInventory.setId(IdUtil.generateId());
        // 盘点单编码
        String businessFormCode = codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.Inventory);
        lWhFormInventory.setBusinessFormCode(businessFormCode);
        // 根据仓库id查询仓库
        BaseWarehouse baseWarehouse = this.baseWarehouseService.getById(param.getWarehouseId());
        if (baseWarehouse != null) {
            lWhFormInventory.setWarehouseName(baseWarehouse.getWarehouseName());
        }
        if (operatorUser != null) {
            lWhFormInventory.setOperatorId(operatorUser.getId());
            lWhFormInventory.setOperatorName(operatorUser.getUserName());
        }
        if (monitorUser != null) {
            lWhFormInventory.setOperatorId2(monitorUser.getId());
            lWhFormInventory.setOperatorName2(monitorUser.getUserName());
        }
 
        lWhFormInventory.setStates(InventoryStatesType.NEW.getValue());
        lWhFormInventory.setAgencyId(Long.valueOf(currentUser.getTenantId()));
        FinSysTenant finSysTenant = finSysTenantService.selectById(Long.valueOf(currentUser.getTenantId()));
        lWhFormInventory.setAgencyName(finSysTenant.getName());
        lWhFormInventory.setCreatorId(currentUser.getSysUserId());
        lWhFormInventory.setCreatorName(currentUser.getUserName());
        lWhFormInventory.setCreateTime(DateUtils.getDateTimeNumber(System.currentTimeMillis()));
        lWhFormInventory.setBeiz1(param.getRemark());
        return this.insert(lWhFormInventory);
    }
 
    /**
     * @Description 盘点单列表查询
     * @Author 卢庆阳
     * @Date 2023/10/31
     */
    @Override
    public GenericPager<LWhFormInventory> queryList(LWhFormInventoryQry param, FinSysTenantUser sysInfo) {
        StringBuilder sql = new StringBuilder(QUERY_LIST);
        HashMap<String, Object> paramts = new HashMap<>();
 
        // 盘点单号
        if (!StringUtils.isEmpty(param.getBusinessFormCode())) {
            sql.append("and BUSINESS_FORM_CODE =:BUSINESS_FORM_CODE ");
            paramts.put("BUSINESS_FORM_CODE", param.getBusinessFormCode());
        }
        // 盘点单名称
        if (!StringUtils.isEmpty(param.getBusinessFormName())) {
            sql.append("and BUSINESS_FORM_NAME like :BUSINESS_FORM_NAME ");
            paramts.put("BUSINESS_FORM_NAME",
                    StringUtils.CHAR_PERCENT + param.getBusinessFormName() + StringUtils.CHAR_PERCENT);
        }
        // 仓库编号
        if (param.getWarehouseId() != null) {
            sql.append("and WAREHOUSE_ID =:WAREHOUSE_ID ");
            paramts.put("WAREHOUSE_ID", param.getWarehouseId());
        }
        // 盘点时间
        if (param.getStartTime() != null) {
            sql.append("and INVENTORY_DATE >=:inventoryDateStart ");
            paramts.put("inventoryDateStart", param.getStartTime() * 1000000);
        }
        if (param.getEndTime() != null) {
            sql.append("and INVENTORY_DATE <:inventoryDateEnd ");
            paramts.put("inventoryDateEnd", param.getEndTime() * 1000000 + 240000);
        }
        // 机构
        sql.append("and AGENCY_ID =:agencyId ");
        paramts.put("agencyId", sysInfo.getTenantId());
 
        sql.append("ORDER BY CREATE_TIME DESC ");
        return selectSplit(sql.toString(), paramts, new LWhFormInventory());
    }
 
    @Override
    public FormInventoryVO saveInventory(FormInventoryVO dto, Long id) {
        // 1.根据盘点单id查询盘点单
        LWhFormInventory lWhFormInventory = this.get(new LWhFormInventory(id));
        if (lWhFormInventory == null) {
            log.error("根据盘点单id查询盘点单失败");
        }
        // 2.修改盘点单
        lWhFormInventory.setStates(InventoryStatesType.PENDING.getValue());
        lWhFormInventory.setInventoryDate(DateUtils.getDateTimeNumber(System.currentTimeMillis()));
        int flag1 = this.update(lWhFormInventory);
        if (flag1 == 0) {
            log.error("修改盘点单失败");
        }
        // 3.添加盘点单物品
        List<FormInventoryGoodsVO> formInventoryGoodsList = dto.getFormInventoryGoodsList();
        if (CollectionUtils.isEmpty(formInventoryGoodsList)) {
            log.error("盘点单物品为空");
        }
        List<FormInventoryGoodsVO> result = inventoryGoodsService.add(formInventoryGoodsList, id);
        dto.setFormInventoryGoodsList(result);
        return dto;
    }
 
    /**
     * 保存盘点信息
     *
     * @author 卢庆阳
     * @date 2023/10/31
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int updateInventoryInfo(LWhFormInventoryParam dto, Integer state, S_user_core currentUser,
                                   FinSysTenantUser sysInfo) {
        // 1.根据盘点单id查询盘点单
        LWhFormInventory lWhFormInventory = this.get(new LWhFormInventory(dto.getId()));
        if (lWhFormInventory == null) {
            log.error("根据盘点单id查询盘点单失败");
            return 0;
        }
        // 添加盘点单物品
        List<FormInventoryGoodsVO> inventoryGoodsList = dto.getInventoryGoodsList();
        if (CollectionUtils.isEmpty(inventoryGoodsList)) {
            log.error("盘点单物品为空");
            return 0;
        }
        inventoryGoodsService.updateInventoryGoods(inventoryGoodsList);
        // 修改盘点单
        if (state == 2) {
            // 完成盘点时设置完成盘点时间
            lWhFormInventory.setStopTime(DateUtils.getDateTimeNumber(System.currentTimeMillis()));
 
            // 完成盘点时设置完成盘点时间
            String inOutFormByInventoryId =
                    lWhFormInventoryCoreService.createInOutFormByInventoryId(dto.getId(), currentUser, sysInfo);
            if (!StringUtils.isEmpty(inOutFormByInventoryId)) {
                log.error(inOutFormByInventoryId);
                return 0;
            }
        }
        lWhFormInventory.setStates(state);
        lWhFormInventory.setInventoryDate(DateUtils.getDateTimeNumber(System.currentTimeMillis()));
        int flag1 = this.update(lWhFormInventory);
        if (flag1 == 0) {
            log.error("修改盘点单失败");
            return 0;
        }
 
        return 1;
    }
 
    /**
     * @return
     * @Description 异常明细列表查询
     * @Author 卢庆阳
     * @Date 2023/11/1
     */
    @Override
    public PageUtil<FormInventoryDetailVO> queryPdDetailList(LWhFormInventoryQry param, FinSysTenantUser sysInfo) {
        StringBuilder sql = new StringBuilder(QUERY_PD_DETAIL_LIST);
        HashMap<String, Object> paramts = new HashMap<>();
 
        // 机构
        sql.append(" and AGENCY_ID like:AGENCY_ID ");
        if (param.getAgencyId() != null) {
            paramts.put("AGENCY_ID", param.getAgencyId() + StringUtils.CHAR_PERCENT);
        } else {
            paramts.put("AGENCY_ID", sysInfo.getTenantId() + StringUtils.CHAR_PERCENT);
        }
        // 仓库编号
        if (param.getWarehouseId() != null) {
            sql.append("and WAREHOUSE_ID =:WAREHOUSE_ID ");
            paramts.put("WAREHOUSE_ID", param.getWarehouseId());
        }
        // 物品名称
        if (!StringUtils.isEmpty(param.getGoodsTemplateName())) {
            sql.append("and GOODS_TEMPLATE_NAME =:GOODS_TEMPLATE_NAME ");
            paramts.put("GOODS_TEMPLATE_NAME",
                    StringUtils.CHAR_PERCENT + param.getGoodsTemplateName() + StringUtils.CHAR_PERCENT);
        }
        // 规格型号
        if (param.getBaseGoodsModelsId() != null) {
            sql.append("and BASE_GOODS_MODELS_ID =:BASE_GOODS_MODELS_ID ");
            paramts.put("BASE_GOODS_MODELS_ID", param.getBaseGoodsModelsId());
        }
        // 类型(出入库类型)
        Integer inventoryResult = param.getInventoryResult();
        if (inventoryResult != null) {
            sql.append("and INVENTORY_RESULT =:INVENTORY_RESULT ");
            paramts.put("INVENTORY_RESULT", inventoryResult);
        }
        // 出入库单号
        if (param.getWarehouseFormCode() != null) {
            sql.append(
                    " and CASE WHEN fig.INVENTORY_RESULT = 2 THEN fi.IN_BUSINESS_FORM_CODE =:warehouseFormCode WHEN fig.INVENTORY_RESULT = 3 THEN fi.OUT_BUSINESS_FORM_CODE =:warehouseFormCode END ");
            paramts.put("warehouseFormCode", param.getWarehouseFormCode());
        }
        // 操作人
        if (!StringUtils.isEmpty(param.getOperatorName())) {
            sql.append("and OPERATOR_NAME =:OPERATOR_NAME ");
            paramts.put("OPERATOR_NAME", StringUtils.CHAR_PERCENT + param.getOperatorName() + StringUtils.CHAR_PERCENT);
        }
        // 结束时间
        if (param.getStartTime() != null) {
            sql.append("and STOP_TIME >=:stopTimeStart ");
            paramts.put("stopTimeStart", param.getStartTime() * 1000000);
        }
        if (param.getEndTime() != null) {
            sql.append("and STOP_TIME <:stopTimeEnd ");
            paramts.put("stopTimeEnd", param.getEndTime() * 1000000 + 240000);
        }
        sql.append("AND fig.INVENTORY_RESULT in(2,3) ");
        sql.append("ORDER BY CREATE_TIME DESC ");
        GenericPager<Map<String, Object>> mapGenericPager =
                selectSplit(sql.toString(), paramts, param.getPageNum(), param.getPageSize(), new MapperUtil());
        PageUtil<FormInventoryDetailVO> pageUtil = new PageUtil<>(mapGenericPager);
        List<FormInventoryDetailVO> result = Lists.newArrayList();
        mapGenericPager.getDatas().forEach(item -> {
            FormInventoryDetailVO formInventoryDetailVO = MapUtils.convertMapToObj(item, FormInventoryDetailVO.class);
            formInventoryDetailVO.setInventoryResultType(formInventoryDetailVO.getInventoryResult() == null ? null
                    : (formInventoryDetailVO.getInventoryResult() == 2 ? "盘盈" : "盘亏"));
            formInventoryDetailVO.setInventoryType(formInventoryDetailVO.getInventoryResult() == null ? null
                    : (formInventoryDetailVO.getInventoryResult() == 2 ? "盘盈入库" : "盘亏出库"));
            formInventoryDetailVO.setWarehouseFormCode(formInventoryDetailVO.getWarehouseFormCode());
            result.add(formInventoryDetailVO);
        });
        pageUtil.setDatas(result);
        return pageUtil;
    }
 
    @Override
    public List<FormInventoryGoodsVO> selectDetailById(Long id) {
 
        String sql = "select fig.id, fig.BASE_GOODS_TEMPLATE_ID,fig.GOODS_TEMPLATE_NAME,fig.BASE_GOODS_MODELS_NAME,"
                + "fig.INIT_COUNTS inventoryCount,fig.INVENTORY_COUNTS realNum,fig.INVENTORY_RESULT status,fig.unit,bgt.CLASSIFICATION type from "
                + "l_wh_form_inventory_goods fig left join base_goods_template bgt on bgt.id =fig.BASE_GOODS_TEMPLATE_ID  where fig.WH_FORM_INVENTORY_ID = :id";
        HashMap<String, Object> param = new HashMap<>();
        param.put("id", id);
        List<Map<String, Object>> select = select(sql, param, new MapperUtil());
        List<FormInventoryGoodsVO> result = Lists.newArrayList();
        select.forEach(item -> {
            FormInventoryGoodsVO formInventoryGoodsVO = MapUtils.convertMapToObj(item, FormInventoryGoodsVO.class);
            result.add(formInventoryGoodsVO);
        });
        return result;
    }
 
    @Override
    public FormInventoryVO queryInventBaseGoodTemplate(Long id) {
        FormInventoryVO formInventoryVO = new FormInventoryVO();
 
        LWhFormInventory lWhFormInventory = new LWhFormInventory();
        lWhFormInventory.setId(id);
        LWhFormInventory inventory = this.get(lWhFormInventory);
        if (inventory == null) {
            return null;
        }
        Long warehouseId = inventory.getWarehouseId();
 
        formInventoryVO.setBusinessFormCode(inventory.getBusinessFormCode());
        formInventoryVO.setBusinessFormName(inventory.getBusinessFormName());
        formInventoryVO.setWarehouseId(warehouseId);
        formInventoryVO.setWarehouseName(inventory.getWarehouseName());
 
        // 统计仓库内的物品
        String sql =
                "SELECT distinct bgt.id baseGoodsTemplateId,bgm.id baseGoodsModelId,bgt.GOODS_NAME goodsTemplateName,bgm.MODEL_NAME baseGoodsModelsName,"
                        + "bgt.CLASSIFICATION TYPE,bgm.UNIT FROM l_wh_goods g "
                        + "LEFT JOIN base_goods_template bgt ON g.BASE_GOODS_TEMPLATE_ID = bgt.ID "
                        + "LEFT JOIN base_goods_models bgm ON bgm.GOODS_TEMPLATES_ID = bgt.id WHERE "
                        + "WAREHOUSE_ID = :warehouseId GROUP BY g.BASE_GOODS_MODELS_ID ";
        HashMap<String, Object> param = new HashMap<>();
        param.put("warehouseId", warehouseId);
 
        List<Map<String, Object>> result = this.select(sql, param, new MapperUtil());
        List<FormInventoryGoodsVO> goodsVOList = Lists.newArrayList();
        result.forEach(item -> {
            FormInventoryGoodsVO baseGoodsModels = MapUtils.convertMapToObj(item, FormInventoryGoodsVO.class);
            List<Long> warehouseIds = new ArrayList<>(Arrays.asList(warehouseId));
            int inventoryCount = this.lWhGoodsService.queryGoodsModelNum(null, warehouseIds,
                    baseGoodsModels.getBaseGoodsModelId(), 1, null);
            baseGoodsModels.setInventoryCount(inventoryCount);
            goodsVOList.add(baseGoodsModels);
        });
        formInventoryVO.setFormInventoryGoodsList(goodsVOList);
        return formInventoryVO;
    }
 
    @Override
    public List<InventoryExcelTemplate> getExportList(Long id) {
        String sql = "SELECT\n" + "\tfi.INVENTORY_DATE createTime,\n" + "\tfi.STOP_TIME endTime,\n"
                + "\tfi.OPERATOR_NAME,\n" + "\tfi.OPERATOR_NAME2 monitorName,\n" + "\tfi.AGENCY_NAME tenantName,\n"
                + "\tfig.GOODS_TEMPLATE_NAME templateName,\n" + "\tfig.BASE_GOODS_MODELS_NAME baseModelName,\n"
                + "\tfig.INVENTORY_COUNTS num,\n" + "\tfig.INIT_COUNTS stockNum,\n" + "\tfig.INVENTORY_RESULT,\n"
                + "\tBEIZ1 remark\n" + "FROM\n" + "\tl_wh_form_inventory fi\n"
                + "\tLEFT JOIN l_wh_form_inventory_goods fig ON fi.ID = fig.WH_FORM_INVENTORY_ID\n" + "WHERE\n"
                + "\tfi.ID = :id";
        HashMap<String, Object> param = new HashMap<>();
        param.put("id", id);
        List<Map<String, Object>> select = this.select(sql, param, new MapperUtil());
        if (CollectionUtils.isEmpty(select)) {
            return Collections.emptyList();
        }
        List<InventoryExcelTemplate> list = Lists.newArrayList();
        select.forEach(item -> {
            InventoryExcelTemplate inventoryExcelTemplate =
                    MapUtils.convertMapToObj(item, InventoryExcelTemplate.class);
            inventoryExcelTemplate.setInventoryDeception(inventoryExcelTemplate.getInventoryResult() == 1 ? "是" : "否");
            inventoryExcelTemplate.setDeception(inventoryExcelTemplate.getInventoryResult() == 1 ? "正常"
                    : (inventoryExcelTemplate.getInventoryResult() == 2 ? "盘盈" : "盘亏"));
            list.add(inventoryExcelTemplate);
        });
        return list;
 
    }
 
    @Override
    public Integer isAddInventory(LWhFormInventoryQry param, FinSysTenantUser sysInfo) {
        // isAddInventory
        StringBuilder sql = new StringBuilder(QUERY_LIST);
        HashMap<String, Object> paramts = new HashMap<>();
        // 机构
        sql.append("and AGENCY_ID =:agencyId ");
        paramts.put("agencyId", sysInfo.getTenantId());
        // 状态
        sql.append("and states !=:states ");
        paramts.put("states", "2");
        List<LWhFormInventory> select = select(sql.toString(), paramts, new LWhFormInventory());
        if (!CollectionUtil.isEmpty(select)) {
            return 0;
        }
        LWhLedgerQry query = new LWhLedgerQry();
        query.setAgencyId(new Long(sysInfo.getTenantId()));
        query.setPageSize(100);
        query.setPageNum(1);
        query.setStates(new Short("1"));
        GenericPager pager = finWarehouseLedgerService.ledgerList(query);
        if(pager==null || CollectionUtil.isEmpty(pager.getDatas())){
            return -1;
        }
        return 1;
    }
}