|
1
2
|
package com.huaheng.pc.receipt.receiptDetail.service;
|
|
3
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
周鸿
authored
|
4
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
5
|
import com.huaheng.common.constant.QuantityConstant;
|
|
6
|
import com.huaheng.common.exception.service.ServiceException;
|
|
7
8
|
import com.huaheng.common.support.Convert;
import com.huaheng.common.utils.StringUtils;
|
周鸿
authored
|
9
|
import com.huaheng.common.utils.Wrappers;
|
|
10
11
|
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
|
|
12
|
import com.huaheng.mobile.receipt.ReceiptBill;
|
|
13
14
|
import com.huaheng.pc.check.checkHeader.domain.CheckHeader;
import com.huaheng.pc.check.checkHeader.service.CheckHeaderService;
|
|
15
16
|
import com.huaheng.pc.config.company.domain.Company;
import com.huaheng.pc.config.company.service.CompanyService;
|
|
17
18
|
import com.huaheng.pc.config.configValue.domain.ConfigValue;
import com.huaheng.pc.config.configValue.service.ConfigValueService;
|
|
19
20
|
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
|
|
21
22
23
24
25
26
27
28
|
import com.huaheng.pc.config.materialType.domain.MaterialType;
import com.huaheng.pc.config.materialType.service.MaterialTypeService;
import com.huaheng.pc.config.receiptPreference.domain.ReceiptPreference;
import com.huaheng.pc.config.receiptPreference.service.ReceiptPreferenceService;
import com.huaheng.pc.config.receiptType.domain.ReceiptType;
import com.huaheng.pc.config.receiptType.service.ReceiptTypeService;
import com.huaheng.pc.config.statusFlow.domain.StatusFlowDetail;
import com.huaheng.pc.config.statusFlow.service.StatusFlowDetailService;
|
周鸿
authored
|
29
30
|
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.mapper.ReceiptDetailMapper;
|
|
31
32
|
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
|
|
33
|
import com.huaheng.pc.system.dict.service.IDictDataService;
|
|
34
|
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
|
|
35
|
import org.springframework.stereotype.Service;
|
周鸿
authored
|
36
37
|
import org.springframework.transaction.annotation.Transactional;
|
|
38
|
import javax.annotation.Resource;
|
|
39
|
import java.math.BigDecimal;
|
|
40
41
|
import java.util.*;
import java.util.stream.Collectors;
|
|
42
|
|
|
43
|
@Service
|
周鸿
authored
|
44
|
public class ReceiptDetailServiceImpl extends ServiceImpl<ReceiptDetailMapper, ReceiptDetail> implements ReceiptDetailService {
|
|
45
|
|
|
46
47
|
@Resource
private MaterialService materialService;
|
|
48
49
|
@Resource
private ReceiptHeaderService receiptHeaderService;
|
|
50
51
52
53
54
55
56
57
|
@Resource
private ReceiptTypeService receiptTypeService;
@Resource
private StatusFlowDetailService statusFlowDetailService;
@Resource
private MaterialTypeService materialTypeService;
@Resource
private ReceiptPreferenceService receiptPreferenceService;
|
|
58
59
|
@Resource
private IDictDataService dictDataService;
|
|
60
61
|
@Resource
private CheckHeaderService checkHeaderService;
|
|
62
63
|
@Resource
private ConfigValueService configValueService;
|
|
64
65
|
@Resource
private ReceiptDetailMapper receiptDetailMapper;
|
|
66
67
68
|
@Resource
private CompanyService companyService;
|
|
69
70
|
/**
* 新增入库明细
|
周鸿
authored
|
71
|
*
|
|
72
73
74
|
* @param receiptDetail
* @return
*/
|
|
75
|
@Transactional(rollbackFor = Exception.class)
|
|
76
|
@Override
|
周鸿
authored
|
77
|
public AjaxResult saveReceiptDetaial(ReceiptDetail receiptDetail) {
|
|
78
|
/* 判断入库头表状态*/
|
|
79
80
81
82
83
|
LambdaQueryWrapper<ReceiptHeader> lambdaReceiptHeader = Wrappers.lambdaQuery();
lambdaReceiptHeader.eq(ReceiptHeader::getId, receiptDetail.getReceiptId());
ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaReceiptHeader);
//判断入库头表状态
|
周鸿
authored
|
84
|
if (receiptHeader == null) {
|
|
85
|
throw new ServiceException("找不到主单据");
|
周鸿
authored
|
86
|
} else if (receiptHeader.getFirstStatus() > QuantityConstant.RECEIPT_HEADER_POOL) {
|
|
87
|
throw new ServiceException("单据进入订单池后,不允许新增明细");
|
|
88
|
} else if (receiptHeader.getFirstStatus() == 20) {
|
|
89
|
throw new ServiceException("单据已作废");
|
|
90
91
92
93
|
}
receiptDetail.setReceiptCode(receiptHeader.getCode());
/* 判断物料编码*/
|
|
94
|
LambdaQueryWrapper<Material> lambdaQueryWrapper = Wrappers.lambdaQuery();
|
|
95
|
lambdaQueryWrapper.eq(Material::getCode, receiptDetail.getMaterialCode());
|
|
96
|
lambdaQueryWrapper.eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode());
|
|
97
98
|
Material material = materialService.getOne(lambdaQueryWrapper);
if (material == null) {
|
|
99
|
throw new ServiceException("物料不存在");
|
|
100
|
}
|
|
101
|
receiptDetail.setCompanyCode(receiptHeader.getCompanyCode());
|
|
102
|
receiptDetail.setMaterialCode(material.getCode());
|
|
103
104
105
106
|
receiptDetail.setMaterialName(material.getName());
receiptDetail.setMaterialSpec(material.getSpec());
receiptDetail.setMaterialUnit(material.getUnit());
|
|
107
|
receiptDetail.setInventorySts(QuantityConstant.GOOD);
|
|
108
109
|
receiptDetail.setCreatedBy(ShiroUtils.getLoginName());
receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
|
|
110
|
receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
|
|
111
|
receiptDetail.setUWarehouseCode(receiptHeader.getUWarehouseCode());
|
|
112
|
|
|
113
114
|
//根据流程配置更新入库明细下一流程
ReceiptDetail receiptDetail1 = queryflow(receiptDetail);
|
|
115
|
|
|
116
|
if (this.save(receiptDetail1)) {
|
|
117
118
119
120
|
// receiptHeader.setTotalQty(receiptHeader.getTotalQty().add(receiptDetail1.getTotalQty()));
// receiptHeader.setTotalLines(receiptHeader.getTotalLines()+1);
// receiptHeaderService.updateById(receiptHeader);
updateReceiptHeader(receiptHeader);
|
|
121
122
123
124
125
|
return AjaxResult.success("新增单据明细成功");
} else {
return AjaxResult.error("新增单据明细失败!");
}
|
|
126
|
}
|
|
127
128
129
|
/**
* 修改入库明细
|
周鸿
authored
|
130
|
*
|
|
131
132
133
134
135
136
137
138
|
* @param receiptDetail
* @return
*/
@Override
@Transactional
public AjaxResult updateReceiptDetaial(ReceiptDetail receiptDetail) {
/* 先修改入库头表中的总数量和总行数,再更新记录,完成后更新入库头表中总数量和总行数*/
|
|
139
|
//查询原记录
|
周鸿
authored
|
140
|
ReceiptDetail originalReceiptDetail = this.getById(receiptDetail.getId());
|
|
141
|
ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
|
|
142
|
//判断物料编码是否被修改
|
周鸿
authored
|
143
|
if (!originalReceiptDetail.getMaterialCode().equals(receiptDetail.getMaterialCode())) {
|
|
144
|
LambdaQueryWrapper<Material> lambdaMaterial = Wrappers.lambdaQuery();
|
周鸿
authored
|
145
|
lambdaMaterial.eq(Material::getCode, receiptDetail.getMaterialCode());
|
|
146
|
Material material = materialService.getOne(lambdaMaterial);
|
|
147
148
149
|
if (material == null) {
throw new ServiceException("该物料编码不存在");
|
周鸿
authored
|
150
|
} else {
|
|
151
152
153
|
receiptDetail.setMaterialName(material.getName());
receiptDetail.setMaterialSpec(material.getSpec());
receiptDetail.setMaterialUnit(material.getUnit());
|
|
154
155
156
157
158
159
|
// receiptDetail.setProcessStamp("0");
// receiptHeader.setTotalQty(receiptHeader.getTotalQty().subtract(originalReceiptDetail.getTotalQty()));
// receiptHeader.setTotalLines(receiptHeader.getTotalLines()-1);
// if ( !receiptHeaderService.updateById(receiptHeader)){
// return AjaxResult.error("入库头表更新失败");
// }
|
|
160
|
}
|
|
161
|
}
|
|
162
|
//如果单据状态为驳回则设置状态为提交审核
|
|
163
164
165
|
// if ("10".equals(receiptDetail.getProcessStamp())){
// receiptDetail.setProcessStamp("5");
// }
|
|
166
|
receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
|
周鸿
authored
|
167
|
if (!this.updateById(receiptDetail)) {
|
|
168
169
|
return AjaxResult.error("入库明细更新失败");
} else {
|
|
170
|
|
|
171
|
updateReceiptHeader(receiptHeader);
|
|
172
173
174
|
return AjaxResult.success("修改单据明细成功");
}
}
|
|
175
|
|
|
176
177
|
/**
* 更新入库单头表状态
|
周鸿
authored
|
178
|
*
|
|
179
180
181
|
* @param receiptHeader 入库单按头表
* @return
*/
|
|
182
|
@Override
|
|
183
|
public AjaxResult updateReceiptHeader(ReceiptHeader receiptHeader) {
|
|
184
185
186
|
BigDecimal totalQty = new BigDecimal(0);
int totalLines = 0;
LambdaQueryWrapper<ReceiptDetail> receiptDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
|
周鸿
authored
|
187
188
189
|
receiptDetailLambdaQueryWrapper.eq(ReceiptDetail::getReceiptId, receiptHeader.getId());
List<ReceiptDetail> receiptDetailList = list(receiptDetailLambdaQueryWrapper);
for (ReceiptDetail receiptDetail : receiptDetailList) {
|
|
190
|
totalLines++;
|
|
191
|
totalQty = totalQty.add(receiptDetail.getQty());
|
|
192
193
194
|
}
receiptHeader.setTotalQty(totalQty);
receiptHeader.setTotalLines(totalLines);
|
周鸿
authored
|
195
|
if (!receiptHeaderService.updateById(receiptHeader)) {
|
|
196
197
198
199
200
|
return AjaxResult.error("入库头表更新失败");
}
return AjaxResult.success("入库头表更新成功");
}
|
|
201
202
203
204
205
206
207
|
@Override
public List<ReceiptDetail> findByReceiptId(Integer id) {
LambdaQueryWrapper<ReceiptDetail> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(ReceiptDetail::getReceiptId, id);
return list(queryWrapper);
}
|
|
208
209
|
/**
* 根据流程配置更新入库明细下一流程
|
|
210
211
212
213
214
|
* 1.先查询入库子表要没有设置入库流程
* 2.查询入库主表的入库单据流程
* 3.物料是否有入库流程
* 4.物料类别是否有入库流程
* 5.入库首选项的入库流程
|
周鸿
authored
|
215
|
*
|
|
216
217
218
|
* @param receiptDetail
* @return
*/
|
|
219
|
@Override
|
|
220
|
@Transactional(rollbackFor = Exception.class)
|
周鸿
authored
|
221
|
public ReceiptDetail queryflow(ReceiptDetail receiptDetail) {
|
|
222
|
//当单据状态为驳回或作废时不更新状态
|
周鸿
authored
|
223
|
if (QuantityConstant.RECEIPT_HEADER_REJECTED.toString().equals(receiptDetail.getProcessStamp()) || QuantityConstant.RECEIPT_HEADER_OBSOLETE.toString().equals(receiptDetail.getProcessStamp())) {
|
|
224
225
226
|
return receiptDetail;
}
|
|
227
|
//如果入库明细绑定了入库流程则从入库明细中选择流程
|
周鸿
authored
|
228
|
if (StringUtils.isNotEmpty(receiptDetail.getStatusFlowCode())) {
|
|
229
230
231
|
List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptDetail.getStatusFlowCode());
String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
//在状态到达时候是判断是否要质检
|
周鸿
authored
|
232
|
if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)) {
|
|
233
|
receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
|
|
234
235
236
237
238
|
} else {
receiptDetail.setProcessStamp(status);
}
return receiptDetail;
}
|
|
239
240
241
|
//查询头表信息
LambdaQueryWrapper<ReceiptHeader> lambdaReceiptHeader = Wrappers.lambdaQuery();
lambdaReceiptHeader.eq(ReceiptHeader::getCode, receiptDetail.getReceiptCode());
|
|
242
|
lambdaReceiptHeader.last("limit 1");
|
|
243
244
245
246
247
|
ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaReceiptHeader);
//查询明细表中入库物料信息
LambdaQueryWrapper<Material> lambdaMaterial = Wrappers.lambdaQuery();
lambdaMaterial.eq(Material::getCode, receiptDetail.getMaterialCode());
|
|
248
|
lambdaMaterial.eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode());
|
|
249
|
lambdaMaterial.last("limit 1");
|
|
250
251
252
253
|
Material material = materialService.getOne(lambdaMaterial);
//查询头表中绑定的入库类型中的入库流程
LambdaQueryWrapper<ReceiptType> lambdaReceiptType = Wrappers.lambdaQuery();
|
周鸿
authored
|
254
255
|
lambdaReceiptType.eq(ReceiptType::getCode, receiptHeader.getReceiptType())
.eq(ReceiptType::getWarehouseCode, ShiroUtils.getWarehouseCode());
|
|
256
|
// .eq(ReceiptType::getCompanyCode, receiptDetail.getCompanyCode());
|
|
257
|
lambdaReceiptType.last("limit 1");
|
|
258
|
ReceiptType receiptType = receiptTypeService.getOne(lambdaReceiptType);
|
|
259
260
|
|
周鸿
authored
|
261
|
if (receiptType.getReceiptFlow() != null) {
|
|
262
263
|
//物料是否有入库流程
List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptType.getReceiptFlow());
|
|
264
|
String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
|
|
265
|
//在状态到达时候是判断是否要质检
|
周鸿
authored
|
266
|
if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)) {
|
|
267
|
receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
|
|
268
269
270
|
} else {
receiptDetail.setProcessStamp(status);
}
|
|
271
|
return receiptDetail;
|
周鸿
authored
|
272
|
} else if (material.getReceivingFlow() != null) {
|
|
273
274
|
//物料是否有入库流程
List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(material.getReceivingFlow());
|
|
275
|
String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
|
|
276
|
//在状态到达时候是判断是否要质检
|
周鸿
authored
|
277
|
if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)) {
|
|
278
|
receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
|
|
279
280
281
|
} else {
receiptDetail.setProcessStamp(status);
}
|
|
282
283
284
285
286
287
288
289
|
return receiptDetail;
} else {
//该物料类别是否有入库流程
LambdaQueryWrapper<MaterialType> lambdaMaterialType = Wrappers.lambdaQuery();
lambdaMaterialType.eq(MaterialType::getCode, material.getType());
MaterialType materialType = materialTypeService.getOne(lambdaMaterialType);
if (materialType.getReceivingFlow() != null) {
List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(materialType.getReceivingFlow());
|
|
290
|
String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
|
|
291
|
//在状态到达时候是判断是否要质检
|
周鸿
authored
|
292
|
if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)) {
|
|
293
|
receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
|
|
294
295
296
|
} else {
receiptDetail.setProcessStamp(status);
}
|
|
297
298
|
return receiptDetail;
} else {
|
|
299
|
//以上都没有的情况下查询入库首选项中的入库流程
|
|
300
301
302
303
|
LambdaQueryWrapper<ConfigValue> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(ConfigValue::getModuleType, "receipt");
ConfigValue configValue = configValueService.getOne(lambdaQueryWrapper);
|
|
304
|
LambdaQueryWrapper<ReceiptPreference> lambda = Wrappers.lambdaQuery();
|
|
305
|
lambda.eq(ReceiptPreference::getCode, configValue.getValue());
|
|
306
307
|
ReceiptPreference receiptPreference = receiptPreferenceService.getOne(lambda);
List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptPreference.getReceivingFlow());
|
|
308
|
String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
|
|
309
|
//在状态到达时候是判断是否要质检
|
周鸿
authored
|
310
|
if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)) {
|
|
311
|
receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
|
|
312
313
314
|
} else {
receiptDetail.setProcessStamp(status);
}
|
|
315
316
317
318
319
|
return receiptDetail;
}
}
}
|
|
320
321
|
/**
* 获取配置流程中下一状态
|
周鸿
authored
|
322
|
*
|
|
323
|
* @param statusFlowDetails 流程列表
|
周鸿
authored
|
324
|
* @param status 当前状态
|
|
325
|
*/
|
周鸿
authored
|
326
|
public String nextStatusFlow(List<StatusFlowDetail> statusFlowDetails, String status) {
|
|
327
|
//判断当前状态是否为最后状态,若为最后状态返回当前状态
|
周鸿
authored
|
328
|
if (StringUtils.isEmpty(status)) {
|
|
329
330
|
status = "0";
}
|
周鸿
authored
|
331
|
if (status.equals(statusFlowDetails.get(statusFlowDetails.size() - 1).getFlowCode())) {
|
|
332
333
|
return status;
} else {
|
周鸿
authored
|
334
335
|
for (int i = 0; i < statusFlowDetails.size(); i++) {
if (Integer.parseInt(statusFlowDetails.get(i).getFlowCode()) > Integer.parseInt(status)) {
|
|
336
337
338
339
340
341
|
return statusFlowDetails.get(i).getFlowCode();
}
}
return status;
}
}
|
|
342
|
|
|
343
|
@Override
|
周鸿
authored
|
344
|
public List<StatusFlowDetail> queryflow() {
|
|
345
346
347
348
349
350
351
352
353
354
355
|
LambdaQueryWrapper<ConfigValue> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(ConfigValue::getModuleType, "receipt");
ConfigValue configValue = configValueService.getOne(lambdaQueryWrapper);
LambdaQueryWrapper<ReceiptPreference> lambda = Wrappers.lambdaQuery();
lambda.eq(ReceiptPreference::getCode, configValue.getValue());
ReceiptPreference receiptPreference = receiptPreferenceService.getOne(lambda);
List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptPreference.getReceivingFlow());
return statusFlowDetails;
}
|
|
356
|
/**
|
周鸿
authored
|
357
|
* @param id 头表id
|
|
358
359
360
361
|
* @description 更新头表尾状态
* 每次明细表更新后调用该方法
* 当所有明细表到达该状态时,更新头表状态
*/
|
|
362
|
@Override
|
周鸿
authored
|
363
|
public void updateReceiptHeaderLastStatus(Integer id) {
|
|
364
365
366
367
368
|
LambdaQueryWrapper<ReceiptDetail> lambdaDetails = Wrappers.lambdaQuery();
lambdaDetails.eq(ReceiptDetail::getReceiptId, id);
List<ReceiptDetail> receiptDetails = this.list(lambdaDetails);
//查询出头表信息
ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
|
|
369
370
371
|
int minStatus;
int maxStatus;
// 判断入库明细是否为空, 为空时入库单头表状态为新建
|
周鸿
authored
|
372
|
if (receiptDetails.isEmpty()) {
|
|
373
374
375
376
377
378
|
minStatus = 0;
maxStatus = 0;
} else {
minStatus = Integer.parseInt(receiptDetails.get(0).getProcessStamp());
maxStatus = Integer.parseInt(receiptDetails.get(0).getProcessStamp());
//遍历明细状态得出最小状态值
|
周鸿
authored
|
379
380
|
for (int i = 1; i < receiptDetails.size(); i++) {
if (minStatus > Integer.parseInt(receiptDetails.get(i).getProcessStamp())) {
|
|
381
382
|
minStatus = Integer.parseInt(receiptDetails.get(i).getProcessStamp());
}
|
周鸿
authored
|
383
|
if (maxStatus < Integer.parseInt(receiptDetails.get(i).getProcessStamp())) {
|
|
384
385
|
maxStatus = Integer.parseInt(receiptDetails.get(i).getProcessStamp());
}
|
|
386
387
388
|
}
}
//若更新状态值小于头状态,更新尾状态否则更新头尾状态
|
|
389
390
391
392
|
receiptHeader.setFirstStatus(maxStatus);
receiptHeader.setLastStatus(minStatus);
if (!receiptHeaderService.updateById(receiptHeader)) {
throw new ServiceException("更新状态失败");
|
|
393
394
|
}
}
|
周鸿
authored
|
395
|
|
|
396
|
/**
|
周鸿
authored
|
397
|
* @param receiptHeaderIdSet 头表id
|
|
398
399
400
401
402
|
* @description 更新头表尾状态
* 每次明细表更新后调用该方法
* 当所有明细表到达该状态时,更新头表状态
*/
@Override
|
周鸿
authored
|
403
404
|
public void updateReceiptHeaderLastStatusV2(Set<Integer> receiptHeaderIdSet) {
for (Integer id : receiptHeaderIdSet) {
|
|
405
406
407
408
409
410
|
LambdaQueryWrapper<ReceiptDetail> lambdaDetails = Wrappers.lambdaQuery();
lambdaDetails.eq(ReceiptDetail::getReceiptId, id);
lambdaDetails.orderByDesc(ReceiptDetail::getProcessStamp);
List<ReceiptDetail> receiptDetails = this.list(lambdaDetails);
//查询出头表信息
ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
|
周鸿
authored
|
411
412
413
|
int minStatus = 0;
int maxStatus = 0;
if (receiptDetails != null && receiptDetails.size() > 0) {
|
|
414
|
receiptDetails = receiptDetails.stream().sorted(Comparator.comparing(ReceiptDetail::getProcessStamp)).collect(Collectors.toList());
|
周鸿
authored
|
415
416
|
minStatus = Integer.valueOf(receiptDetails.get(0).getProcessStamp());
maxStatus = Integer.valueOf(receiptDetails.get(receiptDetails.size() - 1).getProcessStamp());
|
|
417
418
419
420
421
422
423
424
425
|
}
//若更新状态值小于头状态,更新尾状态否则更新头尾状态
receiptHeader.setFirstStatus(maxStatus);
receiptHeader.setLastStatus(minStatus);
if (!receiptHeaderService.updateById(receiptHeader)) {
throw new ServiceException("更新状态失败");
}
}
}
|
周鸿
authored
|
426
|
|
|
427
428
|
/**
* 入库单审核
|
周鸿
authored
|
429
|
*
|
|
430
431
432
433
|
* @param ids
* @param approval
* @return
*/
|
|
434
435
436
|
@Override
public AjaxResult approval(String ids, Integer approval) {
ReceiptHeader receiptHeader = new ReceiptHeader();
|
周鸿
authored
|
437
|
if (StringUtils.isEmpty(ids)) {
|
|
438
439
440
|
return AjaxResult.error("id不能为空");
}
Integer[] idArray = Convert.toIntArray(ids);
|
周鸿
authored
|
441
|
for (Integer id : idArray) {
|
|
442
443
444
445
|
receiptHeader.setId(id);
receiptHeader.setLastStatus(approval);
receiptHeader.setFirstStatus(approval);
receiptHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
|
周鸿
authored
|
446
|
if (!receiptHeaderService.updateById(receiptHeader)) {
|
|
447
448
449
450
451
|
throw new ServiceException("更新头表失败");
} else {
LambdaQueryWrapper<ReceiptDetail> lambda = Wrappers.lambdaQuery();
lambda.eq(ReceiptDetail::getReceiptId, id);
List<ReceiptDetail> receiptDetails = this.list(lambda);
|
周鸿
authored
|
452
|
for (ReceiptDetail receiptDetail : receiptDetails) {
|
|
453
|
receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_POOL.toString());
|
|
454
|
receiptDetail = this.queryflow(receiptDetail);
|
周鸿
authored
|
455
|
if (!this.updateById(receiptDetail)) {
|
|
456
457
458
459
|
throw new ServiceException("更新入库明细表失败");
}
}
}
|
|
460
|
this.updateReceiptHeaderLastStatus(id);
|
|
461
462
463
|
}
return AjaxResult.success("审核完成");
}
|
|
464
|
|
|
465
|
@Override
|
|
466
|
public List<TaskDetail> getReceiptQtyLast7Days() {
|
|
467
468
469
470
|
return receiptDetailMapper.getReceiptQtyLast7Days();
}
@Override
|
|
471
|
public List<TaskDetail> getWarehouseReceipt() {
|
|
472
473
474
475
|
return receiptDetailMapper.getWarehouseReceipt();
}
@Override
|
|
476
|
public List<TaskDetail> getCompanyReceipt() {
|
|
477
478
479
|
return receiptDetailMapper.getCompanyReceipt();
}
|
|
480
|
|
|
481
482
483
|
/**
* 判断明细中是否质检
*/
|
周鸿
authored
|
484
|
public boolean inspection(ReceiptDetail receiptDetail) {
|
|
485
|
//如果明细中需要质检,则判断是否已经生成质检单
|
周鸿
authored
|
486
|
if ("0".equals(receiptDetail.getQcCheck())) {
|
|
487
|
LambdaQueryWrapper<CheckHeader> lambda = Wrappers.lambdaQuery();
|
|
488
|
lambda.eq(CheckHeader::getCode, receiptDetail.getReceiptCode());
|
|
489
|
CheckHeader checkHeader = checkHeaderService.getOne(lambda);
|
周鸿
authored
|
490
|
if (checkHeader == null) {
|
|
491
492
493
494
495
|
return true;
}
}
return false;
}
|
|
496
497
|
/**
|
周鸿
authored
|
498
499
500
501
502
503
|
* // * 移动端收货
* // *
* // * @param code
* // * @return
* //
*/
|
|
504
505
506
507
508
509
510
511
|
@Override
public AjaxResult scanReceiptCode(String code, String type, String companyCode) {
LambdaQueryWrapper<ReceiptHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(ReceiptHeader::getReferCode, code)
.eq(ReceiptHeader::getReceiptType, type);
ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaQueryWrapper);
if (receiptHeader == null) {
LambdaQueryWrapper<Company> companyLambdaQueryWrapper = Wrappers.lambdaQuery();
|
周鸿
authored
|
512
|
companyLambdaQueryWrapper.eq(Company::getCode, companyCode);
|
|
513
514
|
Company company = companyService.getOne(companyLambdaQueryWrapper);
return AjaxResult.success("");
|
huhai
authored
|
515
|
// return receiptHeaderService.findErpReceipt(String.valueOf(company.getId()), receiptHeader.getReferType(), receiptHeader.getReferCode());
|
|
516
517
518
519
520
521
522
523
524
525
|
} else {
LambdaQueryWrapper<ReceiptDetail> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(ReceiptDetail::getReceiptCode, receiptHeader.getCode());
List<ReceiptDetail> receiptDetailList = list(queryWrapper);
return AjaxResult.success(receiptDetailList);
}
}
@Override
|
|
526
|
@Transactional(rollbackFor = Exception.class)
|
|
527
528
529
530
|
public List<Integer> insertTodayReceiptDetail(int headerId, List<ReceiptBill> receiptBills, boolean isCompletedQty, String companyCode) {
List<Integer> mReceiptDetailIds = new ArrayList<>();
ReceiptHeader receiptHeader = receiptHeaderService.getById(headerId);
|
周鸿
authored
|
531
|
for (ReceiptBill receiptBill : receiptBills) {
|
|
532
533
534
|
ReceiptDetail receiptDetail = new ReceiptDetail();
receiptDetail.setId(null);
receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
|
周鸿
authored
|
535
|
receiptDetail.setCompanyCode(companyCode);
|
|
536
|
receiptDetail.setUWarehouseCode(receiptHeader.getUWarehouseCode());
|
|
537
538
539
|
receiptDetail.setReceiptId(receiptHeader.getId());
receiptDetail.setReceiptCode(receiptHeader.getCode());
receiptDetail.setMaterialCode(receiptBill.getMaterialCode());
|
|
540
|
receiptDetail.setMaterialName(receiptBill.getMaterialName());
|
周鸿
authored
|
541
542
|
Material material = materialService.getMaterialByCode(receiptBill.getMaterialCode(), ShiroUtils.getWarehouseCode());
if (material != null) {
|
|
543
544
545
546
|
receiptDetail.setMaterialName(material.getName());
receiptDetail.setMaterialUnit(material.getUnit());
receiptDetail.setMaterialSpec(material.getSpec());
}
|
|
547
|
receiptDetail.setInventorySts("good");
|
|
548
|
receiptDetail.setQty(receiptBill.getQty());
|
周鸿
authored
|
549
|
if (isCompletedQty) {
|
|
550
|
receiptDetail.setTaskQty(receiptBill.getQty());
|
|
551
552
553
554
555
556
557
558
559
560
|
}
receiptDetail.setCreatedBy(ShiroUtils.getLoginName());
receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
receiptDetail.setDeleted(false);
receiptDetail.setBatch(receiptBill.getBatch());
save(receiptDetail);
mReceiptDetailIds.add(receiptDetail.getId());
}
return mReceiptDetailIds;
}
|
|
561
562
|
@Override
|
|
563
|
@Transactional(rollbackFor = Exception.class)
|
|
564
565
|
public String insertExcelData(List<ReceiptDetail> list, boolean updateSupport, String operName) {
if (StringUtils.isNull(list) || list.size() == 0) {
|
|
566
|
throw new ServiceException("导入数据不能为空!");
|
|
567
|
}
|
|
568
569
|
//过滤物料为空的数据
list = list.stream().filter(e -> StringUtils.isNotEmpty(e.getMaterialCode())).collect(Collectors.toList());
|
|
570
|
//新增入库头表
|
周鸿
authored
|
571
|
ReceiptHeader receiptHeader = createHeader(operName, list);
|
|
572
573
574
575
576
|
int successNum = 0;
int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
for (ReceiptDetail importData : list) {
|
|
577
|
/*if(StringUtils.isEmpty(importData.getWarehouseCode())){
|
|
578
579
580
581
582
583
584
585
586
587
|
failureNum++;
String msg = "<br/>" + failureNum + "、仓库编码为空 导入失败:";
failureMsg.append(msg );
continue;
}
if(StringUtils.isEmpty(importData.getCompanyCode())){
failureNum++;
String msg = "<br/>" + failureNum + "、货主编码为空 导入失败:";
failureMsg.append(msg );
continue;
|
|
588
|
}*/
|
周鸿
authored
|
589
|
if (StringUtils.isNull(importData.getQty())) {
|
|
590
591
|
failureNum++;
String msg = "<br/>" + failureNum + "、数量为空 导入失败:";
|
周鸿
authored
|
592
|
failureMsg.append(msg);
|
|
593
594
|
continue;
}
|
|
595
596
|
try {
importData.setReceiptId(receiptHeader.getId());
|
|
597
|
importData.setReceiptCode(receiptHeader.getCode());
|
|
598
599
600
601
|
Material material = materialService.getMaterialByCode(importData.getMaterialCode());
importData.setMaterialName(material.getName());
importData.setMaterialSpec(material.getSpec());
importData.setMaterialUnit(material.getUnit());
|
周鸿
authored
|
602
603
|
importData.setWarehouseCode(receiptHeader.getWarehouseCode());
importData.setCompanyCode(receiptHeader.getCompanyCode());
|
|
604
|
importData.setInventorySts(QuantityConstant.GOOD);
|
|
605
606
607
608
609
610
611
612
613
614
615
616
|
this.save(importData);
successNum++;
successMsg.append("<br/>" + successNum + "、数据 " + importData.getMaterialCode() + " 导入成功");
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum + "、物料编码 " + importData.getMaterialCode() + " 导入失败:";
failureMsg.append(msg + e.getMessage());
}
}
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
|
|
617
|
throw new ServiceException(failureMsg.toString());
|
|
618
619
620
621
622
|
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
|
|
623
|
|
周鸿
authored
|
624
625
|
public ReceiptHeader createHeader(String operName, List<ReceiptDetail> list) {
ReceiptHeader receiptHeader = new ReceiptHeader();
|
|
626
|
receiptHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
|
周鸿
authored
|
627
628
629
630
631
|
String receipttype = QuantityConstant.RECEIPT_TYPE_PPI;
if (!receiptHeader.getWarehouseCode().equals(QuantityConstant.WAREHOUSE_CS)) {
receipttype = QuantityConstant.RECEIPT_TYPE_PPII;
}
String code = receiptHeaderService.createCode(receipttype, receiptHeader.getWarehouseCode());
|
|
632
633
634
635
636
|
receiptHeader.setId(null);
receiptHeader.setLastUpdated(null);
receiptHeader.setLastUpdatedBy(operName);
receiptHeader.setCreated(null);
receiptHeader.setCreatedBy(operName);
|
|
637
|
|
周鸿
authored
|
638
639
640
641
642
|
if (receiptHeader.getWarehouseCode().equals(QuantityConstant.WAREHOUSE_CS)) {
receiptHeader.setCompanyCode(QuantityConstant.COMPANY_CS);
} else {
receiptHeader.setCompanyCode(ShiroUtils.getCompanyCodeList().get(0));
}
|
|
643
|
receiptHeader.setCode(code);
|
周鸿
authored
|
644
|
receiptHeader.setReceiptType(receipttype);
|
|
645
646
647
648
649
650
651
652
653
654
655
|
receiptHeader.setTotalLines(list.size());
receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
BigDecimal bigDecimal = list.stream().map(ReceiptDetail::getQty).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
receiptHeader.setTotalQty(bigDecimal);
if (!receiptHeaderService.save(receiptHeader)) {
throw new ServiceException("导入失败,添加入库单头表失败");
}
return receiptHeader;
}
|
|
656
657
658
659
660
|
@Override
public String getWorkNo(Integer id) {
LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
detailLambda.eq(ReceiptDetail::getId, id);
detailLambda.last("limit 1");
|
周鸿
authored
|
661
662
|
ReceiptDetail receiptDetail = this.getOne(detailLambda);
if (receiptDetail != null) {
|
|
663
664
665
666
|
return receiptDetail.getMoCode();
}
return null;
}
|
|
667
668
|
@Override
|
周鸿
authored
|
669
|
public List<ReceiptDetail> getByHeaderCode(String code) {
|
|
670
|
LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
|
周鸿
authored
|
671
672
|
detailLambda.eq(ReceiptDetail::getReceiptCode, code);
List<ReceiptDetail> list = this.list(detailLambda);
|
|
673
674
|
return list;
}
|
周鸿
authored
|
675
|
|
|
676
|
@Override
|
周鸿
authored
|
677
|
public List<ReceiptDetail> selectListEntityByLike(ReceiptDetail receiptDetail) {
|
|
678
|
LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
|
周鸿
authored
|
679
680
681
|
detailLambda.eq(StringUtils.isNotEmpty(receiptDetail.getReceiptCode()), ReceiptDetail::getReceiptCode, receiptDetail.getReceiptCode());
detailLambda.eq(StringUtils.isNotNull(receiptDetail.getReceiptId()), ReceiptDetail::getReceiptId, receiptDetail.getReceiptId());
detailLambda.eq(ReceiptDetail::getDeleted, false);
|
|
682
|
|
周鸿
authored
|
683
|
List<ReceiptDetail> list = this.list(detailLambda);
|
|
684
685
|
return list;
}
|
周鸿
authored
|
686
|
|
|
687
|
@Override
|
周鸿
authored
|
688
|
public ReceiptDetail selectFirstEntity(ReceiptDetail receiptDetail) {
|
|
689
|
LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
|
周鸿
authored
|
690
691
|
detailLambda.eq(StringUtils.isNotNull(receiptDetail.getId()), ReceiptDetail::getReceiptCode, receiptDetail.getReceiptCode());
detailLambda.eq(ReceiptDetail::getDeleted, false);
|
|
692
693
694
|
detailLambda.last("limit 1");
return this.getOne(detailLambda);
}
|
周鸿
authored
|
695
|
|
|
696
697
|
@Override
public List<Map<String, Object>> selectList(String code, String goodsShelfNo) {
|
周鸿
authored
|
698
699
700
|
String warehouseCode = ShiroUtils.getWarehouseCode();
String shelfNo = goodsShelfNo.substring(1, 5);
return receiptDetailMapper.selectLists(code, shelfNo, warehouseCode);
|
|
701
|
}
|
|
702
|
}
|