|
1
2
|
package com.huaheng.api.general.service;
|
|
3
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
4
|
import com.huaheng.common.utils.Wrappers;
|
|
5
|
import com.huaheng.api.general.domain.Receipt;
|
|
6
|
import com.huaheng.api.general.domain.ReceiptDomain;
|
|
7
|
import com.huaheng.common.constant.QuantityConstant;
|
|
8
|
import com.huaheng.common.exception.service.ServiceException;
|
|
9
|
import com.huaheng.common.utils.DataUtils;
|
|
10
|
import com.huaheng.common.utils.StringUtils;
|
|
11
|
import com.huaheng.common.utils.security.ShiroUtils;
|
|
12
|
import com.huaheng.framework.web.domain.AjaxResult;
|
|
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import com.huaheng.pc.config.FilterConfigDetail.domain.FilterConfigDetail;
import com.huaheng.pc.config.FilterConfigDetail.service.FilterConfigDetailService;
import com.huaheng.pc.config.company.domain.Company;
import com.huaheng.pc.config.company.service.CompanyService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.receiptType.domain.ReceiptType;
import com.huaheng.pc.config.receiptType.service.ReceiptTypeService;
import com.huaheng.pc.config.statusFlow.domain.StatusFlowHeader;
import com.huaheng.pc.config.statusFlow.service.StatusFlowHeaderService;
import com.huaheng.pc.config.supplier.domain.Supplier;
import com.huaheng.pc.config.supplier.service.SupplierService;
import com.huaheng.pc.config.warehouse.domain.Warehouse;
import com.huaheng.pc.config.warehouse.service.WarehouseService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
|
|
29
30
|
import com.huaheng.pc.receipt.receiptDetailHistory.domain.ReceiptDetailHistory;
import com.huaheng.pc.receipt.receiptDetailHistory.service.ReceiptDetailHistoryService;
|
|
31
32
|
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
|
|
33
34
|
import com.huaheng.pc.receipt.receiptHeaderHistory.domain.ReceiptHeaderHistory;
import com.huaheng.pc.receipt.receiptHeaderHistory.service.ReceiptHeaderHistoryService;
|
|
35
|
import com.huaheng.pc.shipment.shipmentContainerDetail.domain.ShipmentContainerDetail;
|
|
36
37
38
|
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
|
|
39
40
|
import javax.annotation.Resource;
import java.math.BigDecimal;
|
|
41
|
import java.util.ArrayList;
|
|
42
|
import java.util.List;
|
|
43
|
import java.util.stream.Collectors;
|
|
44
|
|
|
45
46
47
|
@Component
@Transactional
public class ReceiptApiService {
|
|
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
@Resource
private ReceiptHeaderService receiptHeaderService;
@Resource
private ReceiptDetailService receiptDetailService;
@Resource
private ReceiptTypeService receiptTypeService;
@Resource
private WarehouseService warehouseService;
@Resource
private CompanyService companyService;
@Resource
private MaterialService materialService;
@Resource
private SupplierService supplierService;
@Resource
private FilterConfigDetailService filterConfigDetailService;
@Resource
private StatusFlowHeaderService statusFlowHeaderService;
|
|
66
67
68
69
|
@Resource
private ReceiptHeaderHistoryService receiptHeaderHistoryService;
@Resource
private ReceiptDetailHistoryService receiptDetailHistoryService;
|
|
70
|
|
|
71
72
|
/**
* 入库单下发
|
|
73
|
*
|
|
74
75
76
77
|
* @param receipt 入库单
* @return 是否下发成功
*/
@Transactional(rollbackFor = Exception.class)
|
|
78
|
public AjaxResult receipt(ReceiptDomain receipt) {
|
|
79
80
81
82
83
|
/* 0.step 获取入库头表,获取入库明细*/
ReceiptHeader receiptHeader = receipt.getReceiptHeader();
List<ReceiptDetail> receiptDetails = receipt.getReceiptDetails();
/* 1.step 校验入库单是否为空*/
|
|
84
85
86
87
88
|
if (receiptHeader == null || receiptDetails == null) {
return AjaxResult.error("入库主单或入库子单为空");
}
if(receiptDetails.isEmpty()) {
return AjaxResult.error("入库子单为空");
|
|
89
|
}
|
|
90
|
|
|
91
92
|
/* 4.step 计算入库明细总行数、总数量*/
BigDecimal totalQty = new BigDecimal(0);
|
|
93
|
for (ReceiptDetail receiptDetail : receiptDetails) {
|
|
94
|
// totalQty = totalQty.add(receiptDetail.getTotalQty());
|
|
95
|
totalQty = totalQty.add(receiptDetail.getUnitId1Qty());
|
|
96
97
98
99
|
}
receiptHeader.setTotalLines(receiptDetails.size());
receiptHeader.setTotalQty(totalQty);
|
|
100
|
List<ReceiptHeader> list = receiptHeaderService.list(new LambdaQueryWrapper<ReceiptHeader>().eq(ReceiptHeader::getReferCode,receiptHeader.getReferCode()));
|
|
101
|
|
|
102
|
//如果有重复getReferCode的单据的话
|
|
103
104
105
|
if(list.size()>0){
try {
for (ReceiptHeader header : list) {
|
|
106
|
if (header.getFirstStatus()<=QuantityConstant.RECEIPT_HEADER_RECEIVING) {
|
|
107
108
109
110
111
112
113
114
115
116
|
header.setReferCode(receiptHeader.getReferCode());
header.setReferId(receiptHeader.getReferId());
header.setReceiptType(receiptHeader.getReceiptType());
header.setSupplierCode(receiptHeader.getSupplierCode());
receiptHeaderService.updateById(header);
LambdaQueryWrapper<ReceiptDetail> ReceiptDetailLQM = new LambdaQueryWrapper<ReceiptDetail>().eq(ReceiptDetail::getReceiptId, header.getId());
receiptDetailService.remove(ReceiptDetailLQM);
receiptHeader = receiptHeaderService.getById(header);
}else {
return AjaxResult.error("入库单已被使用,不能覆盖了");
|
|
117
118
119
120
121
122
|
}
}
} catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}else{
|
|
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
|
try {
String receiptCode = receiptHeaderService.createCode(receiptHeader.getReceiptType());
receiptHeader.setCode(receiptCode);
receiptHeader.setCreatedBy(QuantityConstant.PLATFORM_ERP);
if(receiptHeader.getCreatedBy()!=null){
receiptHeader.setCreatedBy(receiptHeader.getCreatedBy());
}
receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
/* 2.step 检查入库头表合法性*/
AjaxResult checkReceiptHeaderResult = checkReceiptHeader(receiptHeader);
if (checkReceiptHeaderResult.hasErr()) {
return AjaxResult.error(checkReceiptHeaderResult.getMsg());
}
/* 3.step 检查入库明细合法性*/
AjaxResult checkReceiptDetailResult = checkReceiptDetail(receiptDetails);
if (checkReceiptDetailResult.hasErr()) {
return AjaxResult.error(checkReceiptDetailResult.getMsg());
}
receiptHeaderService.save(receiptHeader);
} catch (Exception e) {
return AjaxResult.error(e.getMessage());
}
}
|
|
148
|
/* 6.step 保存入库明细*/
|
|
149
150
151
|
receiptHeader = receiptHeaderService.getOne(new LambdaQueryWrapper<ReceiptHeader>()
.eq(ReceiptHeader::getWarehouseCode, receiptHeader.getWarehouseCode())
.eq(ReceiptHeader::getCode, receiptHeader.getCode()));
|
|
152
153
|
Supplier supplier=null;
|
|
154
|
if ("CGRKD".equals(receiptHeader.getReceiptType())){
|
|
155
156
157
158
159
|
List<Supplier> list1 = supplierService.list(new LambdaQueryWrapper<Supplier>().eq(Supplier::getCode, receiptHeader.getSupplierCode()));
if (list1.size()>1) {
return AjaxResult.error("WMS系统有两个相同的供应商");
}
supplier = list1.get(0);
|
|
160
|
if (supplier==null){
|
|
161
|
return AjaxResult.error("没有这个供应商"+receiptHeader.getSupplierCode());
|
|
162
|
}
|
|
163
|
}
|
|
164
|
|
|
165
|
List<ReceiptDetail> receiptDetailList = new ArrayList<>();
|
|
166
167
168
169
|
for (ReceiptDetail receiptDetail : receiptDetails) {
receiptDetail.setReceiptId(receiptHeader.getId());
receiptDetail.setReceiptCode(receiptHeader.getCode());
receiptDetail.setWarehouseCode(receiptHeader.getWarehouseCode());
|
|
170
|
receiptDetail.setCompanyCode(receiptHeader.getCompanyCode());
|
|
171
|
receiptDetail.setSupplierCode(receiptHeader.getSupplierCode());
|
|
172
|
Material material = materialService.findAllByCode(receiptDetail.getMaterialCode(), receiptHeader.getWarehouseCode());
|
|
173
|
if(material==null){
|
|
174
|
return AjaxResult.error("找不到物料编码:"+receiptDetail.getMaterialCode());
|
|
175
|
}
|
|
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
//添加 电池类型判断
// if("1".equals(material.getIsBattery())){
String spec = material.getSpec();
if(spec.contains("三元")){
receiptDetail.setBatteryModel("三元");
}else if(spec.contains("磷酸铁锂")){
receiptDetail.setBatteryModel("磷酸铁锂");
}else if(spec.contains("锰酸锂")){
receiptDetail.setBatteryModel("锰酸锂");
}else if(spec.contains("镍氢")){
receiptDetail.setBatteryModel("镍氢");
}else if(spec.contains("钴酸锂")){
receiptDetail.setBatteryModel("钴酸锂");
}else if(spec.contains("超级电容器")){
receiptDetail.setBatteryModel("超级电容器");
}else{
receiptDetail.setBatteryModel("其他");
}
// }
|
|
195
|
receiptDetail.setInventorySts("good");
|
|
196
197
|
receiptDetail.setOrderNo(receiptDetail.getOrderNo());
receiptDetail.setTotalQty(receiptDetail.getUnitId1Qty());
|
|
198
199
200
201
202
|
receiptDetail.setUnitId1Qty(receiptDetail.getUnitId1Qty());
receiptDetail.setUnitId2Qty(receiptDetail.getUnitId2Qty());
receiptDetail.setMultiple(receiptDetail.getMultiple());
receiptDetail.setUnitId1(receiptDetail.getUnitId1());
receiptDetail.setUnitId2(receiptDetail.getUnitId2());
|
|
203
204
205
|
receiptDetail.setMaterialName(material.getName());
receiptDetail.setMaterialSpec(material.getSpec());
receiptDetail.setMaterialUnit(material.getUnit());
|
|
206
|
receiptDetail.setMaterialIsBattery(material.getIsBattery());
|
|
207
208
|
if (supplier!=null) {
receiptDetail.setAllCreditCode(supplier.getAllCreditCode());
|
|
209
|
receiptDetail.setOldBatterySource(supplier.getName());
|
|
210
|
}
|
|
211
|
|
|
212
213
214
215
216
|
//电池类才生成电池包二维码
String batteryPackTwoCode=receiptDetailService.findBatteryPackTwoCode(receiptDetail);
receiptDetail.setBatteryPackTwoCode(batteryPackTwoCode);
//过磅号
String poundCode=receiptDetailService.findPoundCode(receiptDetail);
|
|
217
|
receiptDetail.setPoundCode(poundCode);
|
|
218
|
|
|
219
|
if (!receiptDetailService.save(receiptDetail)) {
|
|
220
221
|
throw new ServiceException("保存入库明细失败");
}
|
|
222
|
receiptDetailList.add(receiptDetail);
|
|
223
|
|
|
224
|
}
|
|
225
|
/* 7.step回传入库单和入库明细单 */
|
|
226
|
ReceiptDomain receiptDomain = new ReceiptDomain();
|
|
227
|
receiptDomain.setReceiptHeader(receiptHeader);
|
|
228
|
receiptDomain.setReceiptDetails(receiptDetailList);
|
|
229
|
return AjaxResult.success(receiptDomain);
|
|
230
231
232
233
|
}
/**
* 检查入库头表合法性
|
|
234
|
*
|
|
235
236
237
|
* @param receiptHeader 入库头表
* @return 检查结果
*/
|
|
238
|
private AjaxResult checkReceiptHeader(ReceiptHeader receiptHeader) {
|
|
239
240
|
/* 0.step 必填项是否为空*/
if (StringUtils.isEmpty(receiptHeader.getCode()) || StringUtils.isEmpty(receiptHeader.getCompanyCode()) ||
|
|
241
|
StringUtils.isEmpty(receiptHeader.getWarehouseCode()) || StringUtils.isEmpty(receiptHeader.getReceiptType())) {
|
|
242
243
244
245
246
|
return AjaxResult.error("入库主单字段有误");
}
/* 1.step 查询该单据编码是否已存在*/
LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambda = Wrappers.lambdaQuery(receiptHeader);
|
|
247
248
|
if (receiptHeaderService.getOne(receiptHeaderLambda) != null) {
return AjaxResult.error("该单据已存在:" + receiptHeader.getCode());
|
|
249
250
251
252
253
254
|
}
/* 3.step 判断仓库是否存在*/
LambdaQueryWrapper<Warehouse> warehouseLambda = Wrappers.lambdaQuery();
warehouseLambda.eq(Warehouse::getCode, receiptHeader.getWarehouseCode());
|
|
255
|
if (warehouseService.getOne(warehouseLambda) == null) {
|
|
256
257
258
259
260
261
|
return AjaxResult.error("该仓库不存在");
}
/* 4.step 判断货主是否存在*/
LambdaQueryWrapper<Company> companyLambda = Wrappers.lambdaQuery();
companyLambda.eq(Company::getCode, receiptHeader.getCompanyCode());
|
|
262
|
if (companyService.getOne(companyLambda) == null) {
|
|
263
264
265
|
return AjaxResult.error("该货主不存在");
}
|
|
266
267
268
269
270
271
272
273
274
|
/* 2.step 判断入库类型是否匹配*/
LambdaQueryWrapper<ReceiptType> receiptTypeLambda = Wrappers.lambdaQuery();
receiptTypeLambda.eq(ReceiptType::getCode, receiptHeader.getReceiptType())
.eq(ReceiptType::getWarehouseCode, receiptHeader.getWarehouseCode())
.eq(ReceiptType::getCompanyCode, receiptHeader.getCompanyCode());
if (receiptTypeService.getOne(receiptTypeLambda) == null) {
return AjaxResult.error("没有对应的入库单类型");
}
|
|
275
276
277
278
279
|
return AjaxResult.success("");
}
/**
* 检查入库明细合法性
|
|
280
|
*
|
|
281
282
283
|
* @param receiptDetails 入库明细
* @return 检查结果
*/
|
|
284
|
private AjaxResult checkReceiptDetail(List<ReceiptDetail> receiptDetails) {
|
|
285
|
|
|
286
|
for (ReceiptDetail receiptDetail : receiptDetails) {
|
|
287
|
/* 0.step 判断必填字段是否为空且总数量不能为0*/
|
|
288
|
if (receiptDetail.getMaterialCode() == null) {
|
|
289
290
|
return AjaxResult.error("入库明细字段有误");
}
|
|
291
292
293
294
295
|
// if (new BigDecimal(0).compareTo(receiptDetail.getTotalWeight() != null ?
// receiptDetail.getTotalWeight() : new BigDecimal(0)) == 0 && new BigDecimal(0).compareTo(receiptDetail.getUnitId2Qty() != null ?
// receiptDetail.getUnitId2Qty() : new BigDecimal(0)) == 0) {
// return AjaxResult.error("重量或数量为空");
// }
|
|
296
297
|
/* 1.step 判断供应商是否存在*/
|
|
298
|
if (receiptDetail.getSupplierCode() != null) {
|
|
299
300
301
302
303
304
305
306
|
LambdaQueryWrapper<Supplier> supplierLambda = Wrappers.lambdaQuery();
supplierLambda.eq(Supplier::getCode, receiptDetail.getSupplierCode());
if (supplierService.getOne(supplierLambda) == null) {
return AjaxResult.error("供应商不存在");
}
}
/* 2.step 判断定位规则是否存在*/
|
|
307
|
if (receiptDetail.getLocatingRule() != null) {
|
|
308
309
310
311
312
|
LambdaQueryWrapper<FilterConfigDetail> filterConfigDetailLambda = Wrappers.lambdaQuery();
filterConfigDetailLambda.eq(FilterConfigDetail::getCode, receiptDetail.getLocatingRule())
.eq(FilterConfigDetail::getModuleType, "receipt")
.eq(FilterConfigDetail::getRecordType, "locationRule");
FilterConfigDetail filterConfigDetail = filterConfigDetailService.getOne(filterConfigDetailLambda);
|
|
313
314
|
if (filterConfigDetail == null) {
return AjaxResult.error(receiptDetail.getLocatingRule() + "定位规则不存在");
|
|
315
316
317
318
|
}
}
/* 3.step 判断流程编码是否存在*/
|
|
319
|
if (receiptDetail.getStatusFlowCode() != null) {
|
|
320
321
322
323
324
|
LambdaQueryWrapper<StatusFlowHeader> statusFlowHeaderLambda = Wrappers.lambdaQuery();
statusFlowHeaderLambda.eq(StatusFlowHeader::getCode, receiptDetail.getStatusFlowCode())
.eq(StatusFlowHeader::getModuleType, "receipt")
.eq(StatusFlowHeader::getRecordType, "receivingFlow");
StatusFlowHeader statusFlowHeader = statusFlowHeaderService.getOne(statusFlowHeaderLambda);
|
|
325
326
|
if (statusFlowHeader == null) {
return AjaxResult.error(receiptDetail.getLocatingRule() + "该流程不存在");
|
|
327
328
|
}
}
|
|
329
|
|
|
330
|
}
|
|
331
332
333
|
return AjaxResult.success("");
}
|
|
334
335
336
|
@Transactional
|
|
337
338
339
340
341
342
343
|
public AjaxResult remove(List<String> receiptCodeList) {
LambdaQueryWrapper<ReceiptHeader> headerQueryWrapper;
for (String receiptCode : receiptCodeList) {
headerQueryWrapper = Wrappers.lambdaQuery();
headerQueryWrapper.eq(ReceiptHeader::getCode,receiptCode);
ReceiptHeader receiptHeader = receiptHeaderService.getOne(headerQueryWrapper);
if (receiptHeader == null) {
|
|
344
345
|
return AjaxResult.success("");
}
|
|
346
347
|
if ((receiptHeader.getFirstStatus() >= QuantityConstant.RECEIPT_HEADER_POSTING && receiptHeader.getLastStatus() >= QuantityConstant.RECEIPT_HEADER_POSTING) ||
(receiptHeader.getFirstStatus() < QuantityConstant.RECEIPT_HEADER_POOL & receiptHeader.getLastStatus() < QuantityConstant.RECEIPT_HEADER_POOL)) {
|
|
348
349
350
351
|
ReceiptHeaderHistory receiptHeaderHistory = new ReceiptHeaderHistory();
List<ReceiptDetailHistory> receiptDetailHistoryList = new ArrayList<>();
//查询入库单明细
LambdaQueryWrapper<ReceiptDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
|
|
352
|
lambdaQueryWrapper.eq(ReceiptDetail::getReceiptCode, receiptCode);
|
|
353
|
List<ReceiptDetail> list = receiptDetailService.list(lambdaQueryWrapper);
|
|
354
355
356
357
358
359
360
|
//复制到入库历史实体
com.huaheng.common.utils.bean.BeanUtils.copyBeanProp(receiptHeaderHistory, receiptHeader);
for (ReceiptDetail receiptDetail : list) {
ReceiptDetailHistory receiptDetailHistory = new ReceiptDetailHistory();
com.huaheng.common.utils.bean.BeanUtils.copyBeanProp(receiptDetailHistory, receiptDetail);
receiptDetailHistoryList.add(receiptDetailHistory);
|
|
361
362
|
}
|
|
363
|
|
|
364
|
receiptHeaderHistory.setLastUpdatedBy(ShiroUtils.getLoginName());
|
|
365
|
if (!receiptHeaderService.removeById(receiptHeader.getId())) {
|
|
366
367
|
throw new ServiceException("删除头表失败");
}
|
|
368
|
if (!receiptHeaderHistoryService.save(receiptHeaderHistory)) {
|
|
369
370
371
|
throw new ServiceException("新增历史入库单失败");
}
// 当存在明细时删除
|
|
372
|
if (list.size() != 0) {
|
|
373
374
|
//删除入库明细
List<Integer> receiptDetailIds = new ArrayList<>();
|
|
375
|
for (int i = 0; i < receiptDetailHistoryList.size(); i++) {
|
|
376
377
378
379
380
381
382
|
receiptDetailHistoryList.get(i).setLastUpdatedBy(ShiroUtils.getLoginName());
receiptDetailHistoryList.get(i).setReceiptId(receiptHeaderHistory.getId());
receiptDetailIds.add(receiptDetailHistoryList.get(i).getId());
}
if (!receiptDetailService.removeByIds(receiptDetailIds)) {
throw new ServiceException("删除明细表失败");
}
|
|
383
|
if (!receiptDetailHistoryService.saveBatch(receiptDetailHistoryList)) {
|
|
384
|
throw new ServiceException("新增明细失败");
|
|
385
386
387
|
}
}
} else {
|
|
388
389
390
391
392
|
return AjaxResult.success("入库单没有完成,无法删除");
}
}
return AjaxResult.success("删除成功");
}
|
|
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
|
public AjaxResult search(String receiptCode, String companyCode, String warehouseCode) {
if (companyCode == null) {
return AjaxResult.error("货主编码不能为空");
}
if (warehouseCode == null) {
return AjaxResult.error("仓库编码不能为空");
}
ReceiptDomain receiptDomain = new ReceiptDomain();
LambdaQueryWrapper<ReceiptHeader> headerLambdaQuery = Wrappers.lambdaQuery();
LambdaQueryWrapper<ReceiptDetail> detailLambdaQuery = Wrappers.lambdaQuery();
headerLambdaQuery.eq(ReceiptHeader::getWarehouseCode, warehouseCode)
.eq(ReceiptHeader::getCompanyCode, companyCode)
.eq(ReceiptHeader::getCode, receiptCode);
detailLambdaQuery.eq(ReceiptDetail::getWarehouseCode, warehouseCode)
.eq(ReceiptDetail::getCompanyCode, companyCode)
.eq(ReceiptDetail::getReceiptCode, receiptCode);
ReceiptHeader receiptHeader = receiptHeaderService.getOne(headerLambdaQuery);
List<ReceiptDetail> receiptDetailList = receiptDetailService.list(detailLambdaQuery);
receiptDomain.setReceiptHeader(receiptHeader);
receiptDomain.setReceiptDetails(receiptDetailList);
return AjaxResult.success("查询成功", receiptDomain);
}
|
|
416
|
}
|