|
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.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
25
26
|
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;
|
|
27
28
|
import com.huaheng.pc.receipt.receiptDetailHistory.domain.ReceiptDetailHistory;
import com.huaheng.pc.receipt.receiptDetailHistory.service.ReceiptDetailHistoryService;
|
|
29
30
|
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
|
|
31
32
|
import com.huaheng.pc.receipt.receiptHeaderHistory.domain.ReceiptHeaderHistory;
import com.huaheng.pc.receipt.receiptHeaderHistory.service.ReceiptHeaderHistoryService;
|
|
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
68
|
/**
* 入库单下发
|
|
69
|
*
|
|
70
71
72
73
|
* @param receipt 入库单
* @return 是否下发成功
*/
@Transactional(rollbackFor = Exception.class)
|
|
74
|
public AjaxResult receipt(ReceiptDomain receipt) {
|
|
75
76
77
78
79
|
/* 0.step 获取入库头表,获取入库明细*/
ReceiptHeader receiptHeader = receipt.getReceiptHeader();
List<ReceiptDetail> receiptDetails = receipt.getReceiptDetails();
/* 1.step 校验入库单是否为空*/
|
|
80
81
82
83
84
|
if (receiptHeader == null || receiptDetails == null) {
return AjaxResult.error("入库主单或入库子单为空");
}
if(receiptDetails.isEmpty()) {
return AjaxResult.error("入库子单为空");
|
|
85
|
}
|
|
86
87
|
String receiptCode = receiptHeaderService.createCode(receiptHeader.getReceiptType());
receiptHeader.setCode(receiptCode);
|
|
88
89
90
|
if(StringUtils.isEmpty(receiptHeader.getCreatedBy())){
receiptHeader.setCreatedBy(QuantityConstant.PLATFORM_ERP);
}
|
|
91
92
|
receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING);
|
|
93
94
|
/* 2.step 检查入库头表合法性*/
AjaxResult checkReceiptHeaderResult = checkReceiptHeader(receiptHeader);
|
|
95
|
if (checkReceiptHeaderResult.hasErr()) {
|
|
96
97
98
99
|
return AjaxResult.error(checkReceiptHeaderResult.getMsg());
}
/* 3.step 检查入库明细合法性*/
AjaxResult checkReceiptDetailResult = checkReceiptDetail(receiptDetails);
|
|
100
|
if (checkReceiptDetailResult.hasErr()) {
|
|
101
102
103
104
105
|
return AjaxResult.error(checkReceiptDetailResult.getMsg());
}
/* 4.step 计算入库明细总行数、总数量*/
BigDecimal totalQty = new BigDecimal(0);
|
|
106
|
for (ReceiptDetail receiptDetail : receiptDetails) {
|
|
107
|
totalQty = totalQty.add(receiptDetail.getQty());
|
|
108
109
110
111
|
}
receiptHeader.setTotalLines(receiptDetails.size());
receiptHeader.setTotalQty(totalQty);
|
|
112
113
114
115
|
try {
receiptHeaderService.save(receiptHeader);
} catch (Exception e) {
return AjaxResult.error(e.getMessage());
|
|
116
117
118
119
120
121
122
|
}
/* 6.step 保存入库明细*/
LambdaQueryWrapper<ReceiptHeader> lambda = Wrappers.lambdaQuery();
lambda.eq(ReceiptHeader::getWarehouseCode, receiptHeader.getWarehouseCode())
.eq(ReceiptHeader::getCode, receiptHeader.getCode());
receiptHeader = receiptHeaderService.getOne(lambda);
|
|
123
|
List<ReceiptDetail> receiptDetailList = new ArrayList<ReceiptDetail>();
|
|
124
125
126
127
|
for (ReceiptDetail receiptDetail : receiptDetails) {
receiptDetail.setReceiptId(receiptHeader.getId());
receiptDetail.setReceiptCode(receiptHeader.getCode());
receiptDetail.setWarehouseCode(receiptHeader.getWarehouseCode());
|
|
128
|
receiptDetail.setCompanyCode(receiptHeader.getCompanyCode());
|
|
129
130
|
Material material = materialService.getMaterialByCode(receiptDetail.getMaterialCode(),
receiptDetail.getWarehouseCode());
|
|
131
132
133
|
receiptDetail.setMaterialName(material.getName());
receiptDetail.setMaterialSpec(material.getSpec());
receiptDetail.setMaterialUnit(material.getUnit());
|
|
134
|
if (!receiptDetailService.save(receiptDetail)) {
|
|
135
136
|
throw new ServiceException("保存入库明细失败");
}
|
|
137
|
receiptDetailList.add(receiptDetail);
|
|
138
|
|
|
139
|
}
|
|
140
|
/* 7.step回传入库单和入库明细单 */
|
|
141
|
ReceiptDomain receiptDomain = new ReceiptDomain();
|
|
142
|
receiptDomain.setReceiptHeader(receiptHeader);
|
|
143
|
receiptDomain.setReceiptDetails(receiptDetailList);
|
|
144
|
|
|
145
|
return AjaxResult.success(receiptDomain);
|
|
146
147
148
149
|
}
/**
* 检查入库头表合法性
|
|
150
|
*
|
|
151
152
153
|
* @param receiptHeader 入库头表
* @return 检查结果
*/
|
|
154
|
private AjaxResult checkReceiptHeader(ReceiptHeader receiptHeader) {
|
|
155
156
|
/* 0.step 必填项是否为空*/
if (StringUtils.isEmpty(receiptHeader.getCode()) || StringUtils.isEmpty(receiptHeader.getCompanyCode()) ||
|
|
157
|
StringUtils.isEmpty(receiptHeader.getWarehouseCode()) || StringUtils.isEmpty(receiptHeader.getReceiptType())) {
|
|
158
159
160
161
162
|
return AjaxResult.error("入库主单字段有误");
}
/* 1.step 查询该单据编码是否已存在*/
LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambda = Wrappers.lambdaQuery(receiptHeader);
|
|
163
164
|
if (receiptHeaderService.getOne(receiptHeaderLambda) != null) {
return AjaxResult.error("该单据已存在:" + receiptHeader.getCode());
|
|
165
166
167
168
|
}
/* 2.step 判断入库类型是否匹配*/
LambdaQueryWrapper<ReceiptType> receiptTypeLambda = Wrappers.lambdaQuery();
|
|
169
|
receiptTypeLambda.eq(ReceiptType::getCode, receiptHeader.getReceiptType())
|
|
170
171
172
|
.eq(ReceiptType::getWarehouseCode, receiptHeader.getWarehouseCode())
.eq(ReceiptType::getCompanyCode, receiptHeader.getCompanyCode());
if (receiptTypeService.getOne(receiptTypeLambda) == null) {
|
|
173
174
175
176
177
178
|
return AjaxResult.error("没有对应的入库单类型");
}
/* 3.step 判断仓库是否存在*/
LambdaQueryWrapper<Warehouse> warehouseLambda = Wrappers.lambdaQuery();
warehouseLambda.eq(Warehouse::getCode, receiptHeader.getWarehouseCode());
|
|
179
|
if (warehouseService.getOne(warehouseLambda) == null) {
|
|
180
181
182
183
184
185
|
return AjaxResult.error("该仓库不存在");
}
/* 4.step 判断货主是否存在*/
LambdaQueryWrapper<Company> companyLambda = Wrappers.lambdaQuery();
companyLambda.eq(Company::getCode, receiptHeader.getCompanyCode());
|
|
186
|
if (companyService.getOne(companyLambda) == null) {
|
|
187
188
189
190
191
192
193
194
|
return AjaxResult.error("该货主不存在");
}
return AjaxResult.success("");
}
/**
* 检查入库明细合法性
|
|
195
|
*
|
|
196
197
198
|
* @param receiptDetails 入库明细
* @return 检查结果
*/
|
|
199
|
private AjaxResult checkReceiptDetail(List<ReceiptDetail> receiptDetails) {
|
|
200
|
|
|
201
|
for (ReceiptDetail receiptDetail : receiptDetails) {
|
|
202
203
|
/* 0.step 判断必填字段是否为空且总数量不能为0*/
if (receiptDetail.getMaterialCode() == null ||
|
|
204
205
|
new BigDecimal(0).compareTo(receiptDetail.getQty() != null ?
receiptDetail.getQty() : new BigDecimal(0)) == 0) {
|
|
206
207
208
209
|
return AjaxResult.error("入库明细字段有误");
}
/* 1.step 判断供应商是否存在*/
|
|
210
|
if (StringUtils.isNotEmpty(receiptDetail.getSupplierCode())) {
|
|
211
212
213
214
215
216
217
|
LambdaQueryWrapper<Supplier> supplierLambda = Wrappers.lambdaQuery();
supplierLambda.eq(Supplier::getCode, receiptDetail.getSupplierCode());
if (supplierService.getOne(supplierLambda) == null) {
return AjaxResult.error("供应商不存在");
}
}
|
|
218
219
220
221
222
|
String materialCode = receiptDetail.getMaterialCode();
String warehouseCode = receiptDetail.getWarehouseCode();
Material material = materialService.getMaterialByCode(materialCode, warehouseCode);
if(material == null) {
return AjaxResult.error(materialCode + "物料不存在");
|
|
223
224
|
}
}
|
|
225
226
227
|
return AjaxResult.success("");
}
|
|
228
229
230
|
@Transactional
|
|
231
232
233
234
235
236
237
|
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) {
|
|
238
239
|
return AjaxResult.success("");
}
|
|
240
241
|
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)) {
|
|
242
243
244
245
|
ReceiptHeaderHistory receiptHeaderHistory = new ReceiptHeaderHistory();
List<ReceiptDetailHistory> receiptDetailHistoryList = new ArrayList<>();
//查询入库单明细
LambdaQueryWrapper<ReceiptDetail> lambdaQueryWrapper = Wrappers.lambdaQuery();
|
|
246
|
lambdaQueryWrapper.eq(ReceiptDetail::getReceiptCode, receiptCode);
|
|
247
|
List<ReceiptDetail> list = receiptDetailService.list(lambdaQueryWrapper);
|
|
248
249
250
251
252
253
254
|
//复制到入库历史实体
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);
|
|
255
256
|
}
|
|
257
|
|
|
258
|
receiptHeaderHistory.setLastUpdatedBy(ShiroUtils.getLoginName());
|
|
259
|
if (!receiptHeaderService.removeById(receiptHeader.getId())) {
|
|
260
261
|
throw new ServiceException("删除头表失败");
}
|
|
262
|
if (!receiptHeaderHistoryService.save(receiptHeaderHistory)) {
|
|
263
264
265
|
throw new ServiceException("新增历史入库单失败");
}
// 当存在明细时删除
|
|
266
|
if (list.size() != 0) {
|
|
267
268
|
//删除入库明细
List<Integer> receiptDetailIds = new ArrayList<>();
|
|
269
|
for (int i = 0; i < receiptDetailHistoryList.size(); i++) {
|
|
270
271
272
273
274
275
276
|
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("删除明细表失败");
}
|
|
277
|
if (!receiptDetailHistoryService.saveBatch(receiptDetailHistoryList)) {
|
|
278
|
throw new ServiceException("新增明细失败");
|
|
279
280
281
|
}
}
} else {
|
|
282
283
284
285
286
|
return AjaxResult.success("入库单没有完成,无法删除");
}
}
return AjaxResult.success("删除成功");
}
|
|
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
|
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);
}
|
|
310
|
}
|