|
1
2
|
package com.huaheng.api.general.service;
|
|
3
4
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
5
|
import com.huaheng.api.general.domain.ReceiptDomain;
|
|
6
|
import com.huaheng.common.constant.QuantityConstant;
|
|
7
8
|
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
|
|
9
|
import com.huaheng.common.utils.security.ShiroUtils;
|
|
10
|
import com.huaheng.framework.web.domain.AjaxResult;
|
|
11
12
13
14
15
16
17
18
19
20
21
22
|
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.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;
|
|
23
|
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
|
|
24
25
|
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
|
|
26
27
|
import com.huaheng.pc.receipt.receiptDetailHistory.domain.ReceiptDetailHistory;
import com.huaheng.pc.receipt.receiptDetailHistory.service.ReceiptDetailHistoryService;
|
|
28
29
|
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
|
|
30
31
|
import com.huaheng.pc.receipt.receiptHeaderHistory.domain.ReceiptHeaderHistory;
import com.huaheng.pc.receipt.receiptHeaderHistory.service.ReceiptHeaderHistoryService;
|
|
32
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
33
34
35
|
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
|
|
36
37
|
import javax.annotation.Resource;
import java.math.BigDecimal;
|
|
38
|
import java.util.ArrayList;
|
|
39
40
|
import java.util.List;
|
|
41
42
43
|
@Component
@Transactional
public class ReceiptApiService {
|
|
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
@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;
|
|
62
63
64
65
|
@Resource
private ReceiptHeaderHistoryService receiptHeaderHistoryService;
@Resource
private ReceiptDetailHistoryService receiptDetailHistoryService;
|
|
66
67
|
@Autowired
private InventoryDetailService inventoryDetailService;
|
|
68
|
|
|
69
70
|
/**
* 入库单下发
|
|
71
|
*
|
|
72
73
74
75
|
* @param receipt 入库单
* @return 是否下发成功
*/
@Transactional(rollbackFor = Exception.class)
|
|
76
|
public AjaxResult receipt(ReceiptDomain receipt) {
|
|
77
78
79
80
81
|
/* 0.step 获取入库头表,获取入库明细*/
ReceiptHeader receiptHeader = receipt.getReceiptHeader();
List<ReceiptDetail> receiptDetails = receipt.getReceiptDetails();
/* 1.step 校验入库单是否为空*/
|
|
82
83
84
|
if (receiptHeader == null || receiptDetails == null) {
return AjaxResult.error("入库主单或入库子单为空");
}
|
|
85
|
if (receiptDetails.isEmpty()) {
|
|
86
|
return AjaxResult.error("入库子单为空");
|
|
87
|
}
|
|
88
|
if (StringUtils.isEmpty(receiptHeader.getZoneCode())) {
|
|
89
90
|
return AjaxResult.error("库区为空");
}
|
|
91
92
|
String companyCode = receiptHeader.getCompanyCode();
|
|
93
|
receiptHeader.setReceiptType(QuantityConstant.DEFALT_RECEIPT_TYPE);
|
|
94
|
String receiptCode = receiptHeaderService.createCode(receiptHeader.getReceiptType(), receiptHeader.getZoneCode());
|
|
95
|
receiptHeader.setWarehouseCode(QuantityConstant.WAREHOUSECODE);
|
|
96
|
receiptHeader.setCompanyCode(receiptHeader.getCompanyCode() == null ? QuantityConstant.COMPANYCODE : receiptHeader.getCompanyCode());
|
|
97
|
receiptHeader.setCode(receiptCode);
|
|
98
|
receiptHeader.setCreatedBy(QuantityConstant.PLATFORM_ERP);
|
|
99
100
|
receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
|
|
101
102
|
/* 2.step 检查入库头表合法性*/
AjaxResult checkReceiptHeaderResult = checkReceiptHeader(receiptHeader);
|
|
103
|
if (checkReceiptHeaderResult.hasErr()) {
|
|
104
105
106
107
|
return AjaxResult.error(checkReceiptHeaderResult.getMsg());
}
/* 3.step 检查入库明细合法性*/
AjaxResult checkReceiptDetailResult = checkReceiptDetail(receiptDetails);
|
|
108
|
if (checkReceiptDetailResult.hasErr()) {
|
|
109
110
111
112
113
|
return AjaxResult.error(checkReceiptDetailResult.getMsg());
}
/* 4.step 计算入库明细总行数、总数量*/
BigDecimal totalQty = new BigDecimal(0);
|
|
114
|
for (ReceiptDetail receiptDetail : receiptDetails) {
|
|
115
|
totalQty = totalQty.add(receiptDetail.getQty());
|
|
116
117
118
119
|
}
receiptHeader.setTotalLines(receiptDetails.size());
receiptHeader.setTotalQty(totalQty);
|
|
120
|
try {
|
|
121
|
if (StringUtils.isEmpty(receiptHeader.getReferCode())) {
|
|
122
|
// 保存ReceiptHeader,没有则生成,有则返回id
|
|
123
|
int receiptHeaderId = receiptHeaderService.createHeader(companyCode, receiptHeader.getZoneCode());
|
|
124
125
126
|
LambdaQueryWrapper<ReceiptHeader> lambda = Wrappers.lambdaQuery();
lambda.eq(ReceiptHeader::getId, receiptHeaderId);
receiptHeader = receiptHeaderService.getOne(lambda);
|
|
127
|
} else {
|
|
128
129
130
131
132
133
134
135
|
receiptHeaderService.save(receiptHeader);
/* 6.step 保存入库明细*/
LambdaQueryWrapper<ReceiptHeader> lambda = Wrappers.lambdaQuery();
lambda.eq(ReceiptHeader::getWarehouseCode, receiptHeader.getWarehouseCode())
.eq(ReceiptHeader::getCode, receiptHeader.getCode());
receiptHeader = receiptHeaderService.getOne(lambda);
}
|
|
136
137
|
} catch (Exception e) {
return AjaxResult.error(e.getMessage());
|
|
138
|
}
|
|
139
|
//保存详情
|
|
140
|
List<ReceiptDetail> receiptDetailList = saveDetail(receiptDetails, receiptHeader);
|
|
141
|
|
|
142
143
144
145
146
147
148
149
|
/* 7.step回传入库单和入库明细单 */
ReceiptDomain receiptDomain = new ReceiptDomain();
receiptDomain.setReceiptHeader(receiptHeader);
receiptDomain.setReceiptDetails(receiptDetailList);
return AjaxResult.success(receiptDomain);
}
|
|
150
|
public List<ReceiptDetail> saveDetail(List<ReceiptDetail> receiptDetails, ReceiptHeader receiptHeader) {
|
|
151
|
List<ReceiptDetail> receiptDetailList = new ArrayList<ReceiptDetail>();
|
|
152
153
154
155
|
for (ReceiptDetail receiptDetail : receiptDetails) {
receiptDetail.setReceiptId(receiptHeader.getId());
receiptDetail.setReceiptCode(receiptHeader.getCode());
receiptDetail.setWarehouseCode(receiptHeader.getWarehouseCode());
|
|
156
|
receiptDetail.setReferCode(receiptHeader.getReferCode());
|
|
157
|
receiptDetail.setReferId(receiptHeader.getReferId());
|
|
158
159
|
receiptDetail.setInventorySts(receiptDetail.getInventorySts() == null ? QuantityConstant.GOOD : receiptDetail.getInventorySts());
receiptDetail.setCompanyCode(receiptHeader.getCompanyCode() == null ? "BHF" : receiptHeader.getCompanyCode());
|
|
160
161
|
Material material = materialService.getMaterialByCode(receiptDetail.getMaterialCode(),
receiptDetail.getWarehouseCode());
|
|
162
163
|
receiptDetail.setMaterialName(material.getName());
receiptDetail.setMaterialSpec(material.getSpec());
|
|
164
|
if (StringUtils.isEmpty(receiptDetail.getMaterialUnit())) {
|
|
165
166
|
receiptDetail.setMaterialUnit(material.getUnit());
}
|
|
167
168
169
170
|
if (StringUtils.isNotEmpty(receiptDetail.getRollNumber())) {
boolean tag = inventoryDetailService.isRollNumber(null, receiptDetail);
if (tag) {
throw new ServiceException(receiptDetail.getRollNumber() + ",卷号已存在");
|
|
171
172
|
}
}
|
|
173
|
if (!receiptDetailService.save(receiptDetail)) {
|
|
174
175
|
throw new ServiceException("保存入库明细失败");
}
|
|
176
|
receiptDetailList.add(receiptDetail);
|
|
177
|
|
|
178
|
}
|
|
179
|
return receiptDetailList;
|
|
180
181
|
}
|
|
182
|
|
|
183
184
|
/**
* 检查入库头表合法性
|
|
185
|
*
|
|
186
187
188
|
* @param receiptHeader 入库头表
* @return 检查结果
*/
|
|
189
|
public AjaxResult checkReceiptHeader(ReceiptHeader receiptHeader) {
|
|
190
191
|
/* 0.step 必填项是否为空*/
if (StringUtils.isEmpty(receiptHeader.getCode()) || StringUtils.isEmpty(receiptHeader.getCompanyCode()) ||
|
|
192
|
StringUtils.isEmpty(receiptHeader.getWarehouseCode())
|
|
193
|
// || StringUtils.isEmpty(receiptHeader.getReceiptType())
|
|
194
|
) {
|
|
195
196
197
198
|
return AjaxResult.error("入库主单字段有误");
}
/* 1.step 查询该单据编码是否已存在*/
LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambda = Wrappers.lambdaQuery(receiptHeader);
|
|
199
200
|
if (receiptHeaderService.getOne(receiptHeaderLambda) != null) {
return AjaxResult.error("该单据已存在:" + receiptHeader.getCode());
|
|
201
|
}
|
|
202
|
//检查reforcode是否重复
|
|
203
204
|
if (StringUtils.isNotEmpty(receiptHeader.getReferCode())) {
ReceiptHeader receiptHeader1 = new ReceiptHeader();
|
|
205
206
207
208
209
210
|
receiptHeader1.setReferCode(receiptHeader.getReferCode());
LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambda1 = Wrappers.lambdaQuery(receiptHeader1);
if (receiptHeaderService.getOne(receiptHeaderLambda1) != null) {
return AjaxResult.error("该订单号已存在:" + receiptHeader.getReferCode());
}
}
|
|
211
212
|
/* 2.step 判断入库类型是否匹配*/
LambdaQueryWrapper<ReceiptType> receiptTypeLambda = Wrappers.lambdaQuery();
|
|
213
|
receiptTypeLambda.eq(ReceiptType::getCode, receiptHeader.getReceiptType())
|
|
214
215
216
|
.eq(ReceiptType::getWarehouseCode, receiptHeader.getWarehouseCode())
.eq(ReceiptType::getCompanyCode, receiptHeader.getCompanyCode());
if (receiptTypeService.getOne(receiptTypeLambda) == null) {
|
|
217
218
219
220
221
222
|
return AjaxResult.error("没有对应的入库单类型");
}
/* 3.step 判断仓库是否存在*/
LambdaQueryWrapper<Warehouse> warehouseLambda = Wrappers.lambdaQuery();
warehouseLambda.eq(Warehouse::getCode, receiptHeader.getWarehouseCode());
|
|
223
|
if (warehouseService.getOne(warehouseLambda) == null) {
|
|
224
225
226
227
228
229
|
return AjaxResult.error("该仓库不存在");
}
/* 4.step 判断货主是否存在*/
LambdaQueryWrapper<Company> companyLambda = Wrappers.lambdaQuery();
companyLambda.eq(Company::getCode, receiptHeader.getCompanyCode());
|
|
230
|
if (companyService.getOne(companyLambda) == null) {
|
|
231
232
233
234
235
236
|
return AjaxResult.error("该货主不存在");
}
return AjaxResult.success("");
}
|
|
237
|
|
|
238
239
|
/**
* 检查入库明细合法性
|
|
240
|
*
|
|
241
242
243
|
* @param receiptDetails 入库明细
* @return 检查结果
*/
|
|
244
|
private AjaxResult checkReceiptDetail(List<ReceiptDetail> receiptDetails) {
|
|
245
|
|
|
246
|
for (ReceiptDetail receiptDetail : receiptDetails) {
|
|
247
248
|
/* 0.step 判断必填字段是否为空且总数量不能为0*/
if (receiptDetail.getMaterialCode() == null ||
|
|
249
250
|
new BigDecimal(0).compareTo(receiptDetail.getQty() != null ?
receiptDetail.getQty() : new BigDecimal(0)) == 0) {
|
|
251
252
253
254
|
return AjaxResult.error("入库明细字段有误");
}
/* 1.step 判断供应商是否存在*/
|
|
255
|
if (StringUtils.isNotEmpty(receiptDetail.getSupplierCode())) {
|
|
256
257
258
259
260
261
262
|
LambdaQueryWrapper<Supplier> supplierLambda = Wrappers.lambdaQuery();
supplierLambda.eq(Supplier::getCode, receiptDetail.getSupplierCode());
if (supplierService.getOne(supplierLambda) == null) {
return AjaxResult.error("供应商不存在");
}
}
|
|
263
264
265
|
String materialCode = receiptDetail.getMaterialCode();
String warehouseCode = receiptDetail.getWarehouseCode();
Material material = materialService.getMaterialByCode(materialCode, warehouseCode);
|
|
266
|
if (material == null) {
|
|
267
|
return AjaxResult.error(materialCode + "物料不存在");
|
|
268
269
|
}
}
|
|
270
271
272
|
return AjaxResult.success("");
}
|
|
273
274
275
|
@Transactional
|
|
276
277
278
279
|
public AjaxResult remove(List<String> receiptCodeList) {
LambdaQueryWrapper<ReceiptHeader> headerQueryWrapper;
for (String receiptCode : receiptCodeList) {
headerQueryWrapper = Wrappers.lambdaQuery();
|
|
280
|
headerQueryWrapper.eq(ReceiptHeader::getCode, receiptCode);
|
|
281
282
|
ReceiptHeader receiptHeader = receiptHeaderService.getOne(headerQueryWrapper);
if (receiptHeader == null) {
|
|
283
284
|
return AjaxResult.success("");
}
|
|
285
286
|
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)) {
|
|
287
288
289
290
|
ReceiptHeaderHistory receiptHeaderHistory = new ReceiptHeaderHistory();
List<ReceiptDetailHistory> receiptDetailHistoryList = new ArrayList<>();
//查询入库单明细
LambdaQueryWrapper<ReceiptDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
|
|
291
|
lambdaQueryWrapper.eq(ReceiptDetail::getReceiptCode, receiptCode);
|
|
292
|
List<ReceiptDetail> list = receiptDetailService.list(lambdaQueryWrapper);
|
|
293
294
295
296
297
298
299
|
//复制到入库历史实体
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);
|
|
300
301
|
}
|
|
302
|
|
|
303
|
receiptHeaderHistory.setLastUpdatedBy(ShiroUtils.getLoginName());
|
|
304
|
if (!receiptHeaderService.removeById(receiptHeader.getId())) {
|
|
305
306
|
throw new ServiceException("删除头表失败");
}
|
|
307
|
if (!receiptHeaderHistoryService.save(receiptHeaderHistory)) {
|
|
308
309
310
|
throw new ServiceException("新增历史入库单失败");
}
// 当存在明细时删除
|
|
311
|
if (list.size() != 0) {
|
|
312
313
|
//删除入库明细
List<Integer> receiptDetailIds = new ArrayList<>();
|
|
314
|
for (int i = 0; i < receiptDetailHistoryList.size(); i++) {
|
|
315
316
317
318
319
320
321
|
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("删除明细表失败");
}
|
|
322
|
if (!receiptDetailHistoryService.saveBatch(receiptDetailHistoryList)) {
|
|
323
|
throw new ServiceException("新增明细失败");
|
|
324
325
326
|
}
}
} else {
|
|
327
328
329
330
331
|
return AjaxResult.success("入库单没有完成,无法删除");
}
}
return AjaxResult.success("删除成功");
}
|
|
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
|
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);
}
|
|
355
356
|
public AjaxResult confirmReceipt(String receiptCode) {
|
|
357
|
// String receiptCode=receipt.getReceiptHeader().getCode().toString();
|
|
358
359
360
361
362
363
364
365
366
367
368
|
ReceiptDomain receiptDomain = new ReceiptDomain();
LambdaQueryWrapper<ReceiptHeader> headerLambdaQuery = Wrappers.lambdaQuery();
LambdaQueryWrapper<ReceiptDetail> detailLambdaQuery = Wrappers.lambdaQuery();
headerLambdaQuery.eq(ReceiptHeader::getCode, receiptCode);
detailLambdaQuery.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);
}
|
|
369
|
}
|