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