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