WMS3.9号修改
This commit is contained in:
+3
-3
@@ -437,14 +437,14 @@ public class ContractManageApplicationService {
|
|||||||
List<ContractManageDetailPO> contractManageDetailPOList = contractManageDetailDomainService.queryListByManageId(resultContract.getContractManageId());
|
List<ContractManageDetailPO> contractManageDetailPOList = contractManageDetailDomainService.queryListByManageId(resultContract.getContractManageId());
|
||||||
List<ContractManageDetailPO> contractManageDetailSaveList = new ArrayList<>();
|
List<ContractManageDetailPO> contractManageDetailSaveList = new ArrayList<>();
|
||||||
if(contractManageDetailPOList != null && contractManageDetailPOList.size()>0){
|
if(contractManageDetailPOList != null && contractManageDetailPOList.size()>0){
|
||||||
//将临时合同中没有,但是通用合同中有的数据过滤出
|
//将临时合同中没有,但是通用合同中有的数据过滤出(使用 ObjectUtil.equal 避免 firstSubjectCode/secondSubjectCode 为 null 时 NPE)
|
||||||
contractManageDetailSaveList = contractManageDetailPOList.stream().filter(item -> contractManageDetailPOList.stream().noneMatch(item1 -> item1.getFirstSubjectCode().equals(item.getFirstSubjectCode()) && item1.getSecondSubjectCode().equals(item.getSecondSubjectCode()) && item1.getSubjectType()==1)).collect(Collectors.toList());
|
contractManageDetailSaveList = contractManageDetailPOList.stream().filter(item -> contractManageDetailPOList.stream().noneMatch(item1 -> ObjectUtil.equal(item1.getFirstSubjectCode(), item.getFirstSubjectCode()) && ObjectUtil.equal(item1.getSecondSubjectCode(), item.getSecondSubjectCode()) && item1.getSubjectType()==1)).collect(Collectors.toList());
|
||||||
//首先根据结算科目类型将临时合同过滤出
|
//首先根据结算科目类型将临时合同过滤出
|
||||||
List<ContractManageDetailPO> tempContractManageDetailPOList = contractManageDetailPOList.stream().filter(item -> item.getSubjectType()==2).collect(Collectors.toList());
|
List<ContractManageDetailPO> tempContractManageDetailPOList = contractManageDetailPOList.stream().filter(item -> item.getSubjectType()==2).collect(Collectors.toList());
|
||||||
//遍历两个集合,将相同费用科目code的数据,进行比较,如果结算科目类型是临时且合同有效期有效,则使用该条数据,将另一条移除
|
//遍历两个集合,将相同费用科目code的数据,进行比较,如果结算科目类型是临时且合同有效期有效,则使用该条数据,将另一条移除
|
||||||
for (ContractManageDetailPO manageDetailPO : tempContractManageDetailPOList) {
|
for (ContractManageDetailPO manageDetailPO : tempContractManageDetailPOList) {
|
||||||
for (ContractManageDetailPO contractManageDetailPO : contractManageDetailPOList) {
|
for (ContractManageDetailPO contractManageDetailPO : contractManageDetailPOList) {
|
||||||
if(contractManageDetailPO.getFirstSubjectCode().equals(manageDetailPO.getFirstSubjectCode()) && contractManageDetailPO.getSecondSubjectCode().equals(manageDetailPO.getSecondSubjectCode())){
|
if(ObjectUtil.equal(contractManageDetailPO.getFirstSubjectCode(), manageDetailPO.getFirstSubjectCode()) && ObjectUtil.equal(contractManageDetailPO.getSecondSubjectCode(), manageDetailPO.getSecondSubjectCode())){
|
||||||
//判断如果是临时合同在有效期内,则将该条数据保存到集合contractManageDetailSaveList
|
//判断如果是临时合同在有效期内,则将该条数据保存到集合contractManageDetailSaveList
|
||||||
DateTime start = DateUtil.parseDate(DateUtil.format(manageDetailPO.getSubjectEffectiveDate(),"yyyy-MM-dd"));
|
DateTime start = DateUtil.parseDate(DateUtil.format(manageDetailPO.getSubjectEffectiveDate(),"yyyy-MM-dd"));
|
||||||
DateTime end = DateUtil.parseDateTime(DateUtil.format(manageDetailPO.getSubjectEffectiveDate(),"yyyy-MM-dd"));
|
DateTime end = DateUtil.parseDateTime(DateUtil.format(manageDetailPO.getSubjectEffectiveDate(),"yyyy-MM-dd"));
|
||||||
|
|||||||
+3
-3
@@ -119,14 +119,14 @@ public class ContractManageDomainService {
|
|||||||
List<ContractManageDetailPO> contractManageDetailPOList = contractManageDetailDomainService.queryListByManageId(contractManagePO.getContractManageId());
|
List<ContractManageDetailPO> contractManageDetailPOList = contractManageDetailDomainService.queryListByManageId(contractManagePO.getContractManageId());
|
||||||
List<ContractManageDetailPO> contractManageDetailSaveList = new ArrayList<>();
|
List<ContractManageDetailPO> contractManageDetailSaveList = new ArrayList<>();
|
||||||
if(contractManageDetailPOList != null && contractManageDetailPOList.size()>0){
|
if(contractManageDetailPOList != null && contractManageDetailPOList.size()>0){
|
||||||
//将临时合同中没有,但是通用合同中有的数据过滤出
|
//将临时合同中没有,但是通用合同中有的数据过滤出(使用 ObjectUtil.equal 避免 firstSubjectCode/secondSubjectCode 为 null 时 NPE)
|
||||||
contractManageDetailSaveList = contractManageDetailPOList.stream().filter(item -> contractManageDetailPOList.stream().anyMatch(item1 -> item1.getFirstSubjectCode().equals(item.getFirstSubjectCode()) && item1.getSecondSubjectCode().equals(item.getSecondSubjectCode()) && item1.getSubjectType()==1)).collect(Collectors.toList());
|
contractManageDetailSaveList = contractManageDetailPOList.stream().filter(item -> contractManageDetailPOList.stream().anyMatch(item1 -> ObjectUtil.equal(item1.getFirstSubjectCode(), item.getFirstSubjectCode()) && ObjectUtil.equal(item1.getSecondSubjectCode(), item.getSecondSubjectCode()) && item1.getSubjectType()==1)).collect(Collectors.toList());
|
||||||
//首先根据结算科目类型将临时合同过滤出
|
//首先根据结算科目类型将临时合同过滤出
|
||||||
List<ContractManageDetailPO> tempContractManageDetailPOList = contractManageDetailPOList.stream().filter(item -> item.getSubjectType()==2).collect(Collectors.toList());
|
List<ContractManageDetailPO> tempContractManageDetailPOList = contractManageDetailPOList.stream().filter(item -> item.getSubjectType()==2).collect(Collectors.toList());
|
||||||
//遍历两个集合,将相同费用科目code的数据,进行比较,如果结算科目类型是临时且合同有效期有效,则使用该条数据,将另一条移除
|
//遍历两个集合,将相同费用科目code的数据,进行比较,如果结算科目类型是临时且合同有效期有效,则使用该条数据,将另一条移除
|
||||||
for (ContractManageDetailPO manageDetailPO : tempContractManageDetailPOList) {
|
for (ContractManageDetailPO manageDetailPO : tempContractManageDetailPOList) {
|
||||||
for (ContractManageDetailPO contractManageDetailPO : contractManageDetailPOList) {
|
for (ContractManageDetailPO contractManageDetailPO : contractManageDetailPOList) {
|
||||||
if(contractManageDetailPO.getFirstSubjectCode().equals(manageDetailPO.getFirstSubjectCode()) && contractManageDetailPO.getSecondSubjectCode().equals(manageDetailPO.getSecondSubjectCode())){
|
if(ObjectUtil.equal(contractManageDetailPO.getFirstSubjectCode(), manageDetailPO.getFirstSubjectCode()) && ObjectUtil.equal(contractManageDetailPO.getSecondSubjectCode(), manageDetailPO.getSecondSubjectCode())){
|
||||||
//判断如果是临时合同在有效期内,则将该条数据保存到集合contractManageDetailSaveList
|
//判断如果是临时合同在有效期内,则将该条数据保存到集合contractManageDetailSaveList
|
||||||
DateTime start = DateUtil.parseDate(DateUtil.format(manageDetailPO.getSubjectEffectiveDate(),"yyyy-MM-dd"));
|
DateTime start = DateUtil.parseDate(DateUtil.format(manageDetailPO.getSubjectEffectiveDate(),"yyyy-MM-dd"));
|
||||||
DateTime end = DateUtil.parseDateTime(DateUtil.format(manageDetailPO.getSubjectEffectiveDate(),"yyyy-MM-dd"));
|
DateTime end = DateUtil.parseDateTime(DateUtil.format(manageDetailPO.getSubjectEffectiveDate(),"yyyy-MM-dd"));
|
||||||
|
|||||||
+6
-3
@@ -144,8 +144,11 @@ public class CostCalculationApplicationService {
|
|||||||
throw new ServiceException("单据类型未找到");
|
throw new ServiceException("单据类型未找到");
|
||||||
}
|
}
|
||||||
//遍历费用科目取出对应配置的费用科目项
|
//遍历费用科目取出对应配置的费用科目项
|
||||||
AjaxResult expenseAccountAjax = systemServiceFeign.getSubInfoByCode2(costCalculationDTO.getSubjectCode(),costCalculationDTO.getTopOrganizationId());
|
if (costCalculationDTO.getTopOrganizationId() == null) {
|
||||||
if(!"200".equals(String.valueOf(ajaxResult.get("code")))) {
|
throw new ServiceException("组织信息不能为空,无法查询费用科目");
|
||||||
|
}
|
||||||
|
AjaxResult expenseAccountAjax = systemServiceFeign.getSubInfoByCode2(costCalculationDTO.getSubjectCode(), costCalculationDTO.getTopOrganizationId());
|
||||||
|
if (!"200".equals(String.valueOf(expenseAccountAjax.get("code")))) {
|
||||||
throw new ServiceException("费用科目不存在或已被删除");
|
throw new ServiceException("费用科目不存在或已被删除");
|
||||||
}
|
}
|
||||||
ExpenseAccountPO expenseAccountPO = JSON.parseObject(JSONObject.toJSONString(expenseAccountAjax.get("data")), ExpenseAccountPO.class);
|
ExpenseAccountPO expenseAccountPO = JSON.parseObject(JSONObject.toJSONString(expenseAccountAjax.get("data")), ExpenseAccountPO.class);
|
||||||
@@ -166,7 +169,7 @@ public class CostCalculationApplicationService {
|
|||||||
taskFlowRecordsDO.setSecondSubjectName(expenseAccountPO.getSubjectName());
|
taskFlowRecordsDO.setSecondSubjectName(expenseAccountPO.getSubjectName());
|
||||||
}
|
}
|
||||||
if(null == contractManageDetailPO){
|
if(null == contractManageDetailPO){
|
||||||
throw new ServiceException("合同中不包含该费用科目的计费策略,请查正后重试");
|
throw new ServiceException("合同中不包含该费用科目的计费策略,请查证后重试");
|
||||||
}
|
}
|
||||||
//根据计费策略查询计费规则信息
|
//根据计费策略查询计费规则信息
|
||||||
BillingRulesPO billingRulesPO = billingRulesDomainService.getInfo(contractManageDetailPO.getAccountingStrategyId());
|
BillingRulesPO billingRulesPO = billingRulesDomainService.getInfo(contractManageDetailPO.getAccountingStrategyId());
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import javax.annotation.Resource;
|
|||||||
import com.mhd.common.core.web.controller.BaseController;
|
import com.mhd.common.core.web.controller.BaseController;
|
||||||
import com.mhd.common.core.web.domain.AjaxResult;
|
import com.mhd.common.core.web.domain.AjaxResult;
|
||||||
import com.mhd.common.core.web.page.TableDataInfo;
|
import com.mhd.common.core.web.page.TableDataInfo;
|
||||||
|
import com.mhd.common.core.exception.ServiceException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 业务单据Api
|
* 业务单据Api
|
||||||
@@ -70,8 +71,10 @@ public class BusinessDocumentApi extends BaseController{
|
|||||||
}else {
|
}else {
|
||||||
return toAjax(businessDocumentApplicationService.insert(businessDocumentDO));
|
return toAjax(businessDocumentApplicationService.insert(businessDocumentDO));
|
||||||
}
|
}
|
||||||
}catch (Exception e){
|
} catch (ServiceException e) {
|
||||||
return AjaxResult.error("保存业务单据失败" +e.getMessage());
|
return AjaxResult.error(e.getMessage());
|
||||||
|
} catch (Exception e){
|
||||||
|
return AjaxResult.error("保存业务单据失败:" + e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+80
-41
@@ -252,28 +252,18 @@ public class StockReceiptOrderApplicationService {
|
|||||||
// 5. 清空质检相关字段(如果是否质检为否)
|
// 5. 清空质检相关字段(如果是否质检为否)
|
||||||
clearQualityInspectionFieldsRecursively(receiptMaterialDetailPOList);
|
clearQualityInspectionFieldsRecursively(receiptMaterialDetailPOList);
|
||||||
|
|
||||||
// 6. 汇总第一层明细的净重、毛重、体积、面积
|
// 6. 汇总明细的净重、毛重、体积、面积(递归包含主项+子项)
|
||||||
BigDecimal totalNetWeight = BigDecimal.ZERO;
|
BigDecimal totalNetWeight = BigDecimal.ZERO;
|
||||||
BigDecimal totalGrossWeight = BigDecimal.ZERO;
|
BigDecimal totalGrossWeight = BigDecimal.ZERO;
|
||||||
BigDecimal totalVolume = BigDecimal.ZERO;
|
BigDecimal totalVolume = BigDecimal.ZERO;
|
||||||
BigDecimal totalArea = BigDecimal.ZERO;
|
BigDecimal totalArea = BigDecimal.ZERO;
|
||||||
if (!CollectionUtils.isEmpty(receiptMaterialDetailPOList)) {
|
if (!CollectionUtils.isEmpty(receiptMaterialDetailPOList)) {
|
||||||
// receiptMaterialDetailPOList 已经是树形结构,第一层明细的 level 应该是 1 或 null
|
|
||||||
for (ReceiptMaterialDetailPO detail : receiptMaterialDetailPOList) {
|
for (ReceiptMaterialDetailPO detail : receiptMaterialDetailPOList) {
|
||||||
// 只汇总第一层明细(level=1或没有level字段)
|
|
||||||
if (detail.getLevel() == null || detail.getLevel() == 1) {
|
if (detail.getLevel() == null || detail.getLevel() == 1) {
|
||||||
if (detail.getTotalNetWeight() != null) {
|
totalNetWeight = totalNetWeight.add(sumDetailRecursively(detail, ReceiptMaterialDetailPO::getTotalNetWeight));
|
||||||
totalNetWeight = totalNetWeight.add(detail.getTotalNetWeight());
|
totalGrossWeight = totalGrossWeight.add(sumDetailRecursively(detail, ReceiptMaterialDetailPO::getTotalGrossWeight));
|
||||||
}
|
totalVolume = totalVolume.add(sumDetailRecursively(detail, ReceiptMaterialDetailPO::getTotalVolume));
|
||||||
if (detail.getTotalGrossWeight() != null) {
|
totalArea = totalArea.add(sumDetailRecursively(detail, ReceiptMaterialDetailPO::getTotalArea));
|
||||||
totalGrossWeight = totalGrossWeight.add(detail.getTotalGrossWeight());
|
|
||||||
}
|
|
||||||
if (detail.getTotalVolume() != null) {
|
|
||||||
totalVolume = totalVolume.add(detail.getTotalVolume());
|
|
||||||
}
|
|
||||||
if (detail.getTotalArea() != null) {
|
|
||||||
totalArea = totalArea.add(detail.getTotalArea());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -360,6 +350,80 @@ public class StockReceiptOrderApplicationService {
|
|||||||
return materialMoreDetailPOList;
|
return materialMoreDetailPOList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 递归汇总明细及其子项的某字段值(用于汇总净重、毛重、体积、面积)
|
||||||
|
*/
|
||||||
|
private BigDecimal sumDetailRecursively(ReceiptMaterialDetailPO detail, Function<ReceiptMaterialDetailPO, BigDecimal> getter) {
|
||||||
|
BigDecimal sum = BigDecimal.ZERO;
|
||||||
|
if (detail == null) {
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
BigDecimal v = getter.apply(detail);
|
||||||
|
if (v != null) {
|
||||||
|
sum = sum.add(v);
|
||||||
|
}
|
||||||
|
List<ReceiptMaterialDetailPO> children = detail.getChildren();
|
||||||
|
if (!CollectionUtils.isEmpty(children)) {
|
||||||
|
for (ReceiptMaterialDetailPO child : children) {
|
||||||
|
sum = sum.add(sumDetailRecursively(child, getter));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扁平化明细:将子项收货数据合并到父级并清空 children,使每条明细只显示一行(PDA 与 PC 端收货一致)
|
||||||
|
* @param receiptMaterialDetailPOList 物料明细列表(树形,level 1 父级含 children)
|
||||||
|
*/
|
||||||
|
private void flattenMaterialDetailList(List<ReceiptMaterialDetailPO> receiptMaterialDetailPOList) {
|
||||||
|
if (CollectionUtils.isEmpty(receiptMaterialDetailPOList)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (ReceiptMaterialDetailPO parent : receiptMaterialDetailPOList) {
|
||||||
|
List<ReceiptMaterialDetailPO> children = parent.getChildren();
|
||||||
|
if (CollectionUtils.isEmpty(children)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 将子项收货数据合并到父级
|
||||||
|
BigDecimal receiptQuantitySum = parent.getReceiptQuantity() != null ? parent.getReceiptQuantity() : BigDecimal.ZERO;
|
||||||
|
BigDecimal totalNetWeightSum = parent.getTotalNetWeight() != null ? parent.getTotalNetWeight() : BigDecimal.ZERO;
|
||||||
|
BigDecimal totalGrossWeightSum = parent.getTotalGrossWeight() != null ? parent.getTotalGrossWeight() : BigDecimal.ZERO;
|
||||||
|
BigDecimal totalVolumeSum = parent.getTotalVolume() != null ? parent.getTotalVolume() : BigDecimal.ZERO;
|
||||||
|
BigDecimal totalAreaSum = parent.getTotalArea() != null ? parent.getTotalArea() : BigDecimal.ZERO;
|
||||||
|
Integer maxReceiptStatus = parent.getReceiptStatus();
|
||||||
|
for (ReceiptMaterialDetailPO child : children) {
|
||||||
|
if (child.getReceiptQuantity() != null) {
|
||||||
|
receiptQuantitySum = receiptQuantitySum.add(child.getReceiptQuantity());
|
||||||
|
}
|
||||||
|
if (child.getTotalNetWeight() != null) {
|
||||||
|
totalNetWeightSum = totalNetWeightSum.add(child.getTotalNetWeight());
|
||||||
|
}
|
||||||
|
if (child.getTotalGrossWeight() != null) {
|
||||||
|
totalGrossWeightSum = totalGrossWeightSum.add(child.getTotalGrossWeight());
|
||||||
|
}
|
||||||
|
if (child.getTotalVolume() != null) {
|
||||||
|
totalVolumeSum = totalVolumeSum.add(child.getTotalVolume());
|
||||||
|
}
|
||||||
|
if (child.getTotalArea() != null) {
|
||||||
|
totalAreaSum = totalAreaSum.add(child.getTotalArea());
|
||||||
|
}
|
||||||
|
if (child.getReceiptStatus() != null && (maxReceiptStatus == null || child.getReceiptStatus() > maxReceiptStatus)) {
|
||||||
|
maxReceiptStatus = child.getReceiptStatus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parent.setReceiptQuantity(receiptQuantitySum);
|
||||||
|
parent.setTotalNetWeight(totalNetWeightSum);
|
||||||
|
parent.setTotalGrossWeight(totalGrossWeightSum);
|
||||||
|
parent.setTotalVolume(totalVolumeSum);
|
||||||
|
parent.setTotalArea(totalAreaSum);
|
||||||
|
if (maxReceiptStatus != null) {
|
||||||
|
parent.setReceiptStatus(maxReceiptStatus);
|
||||||
|
}
|
||||||
|
// 清空子项,使前端只显示父级一行
|
||||||
|
parent.setChildren(new ArrayList<>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 递归为物料明细设置更多属性
|
* 递归为物料明细设置更多属性
|
||||||
* @param receiptMaterialDetailPOList 物料明细列表
|
* @param receiptMaterialDetailPOList 物料明细列表
|
||||||
@@ -810,32 +874,7 @@ public class StockReceiptOrderApplicationService {
|
|||||||
* @return Boolean
|
* @return Boolean
|
||||||
*/
|
*/
|
||||||
public Boolean receivingGoodsByApp(StockReceiptOrderDO stockReceiptOrderDO){
|
public Boolean receivingGoodsByApp(StockReceiptOrderDO stockReceiptOrderDO){
|
||||||
List<ReceiptMaterialDetailDO> receiptMaterialDetailDOList = stockReceiptOrderDO.getMaterialDetailList();
|
// PDA 收货与 PC 一致,保留主项子项结构
|
||||||
receiptMaterialDetailDOList.forEach(receiptMaterialDetailDO -> {
|
|
||||||
List<ReceiptMaterialDetailDO> receiptMaterialDetailDOChildrenList1 = receiptMaterialDetailDO.getChildren();
|
|
||||||
if (receiptMaterialDetailDOChildrenList1 != null && receiptMaterialDetailDOChildrenList1.size() > 0) {
|
|
||||||
//ReceiptMaterialDetailDO receiptMaterialDetailDOChildren = receiptMaterialDetailDOChildrenList1.stream().filter(p -> 1 == p.getLevel()).collect(Collectors.toList()).get(0);
|
|
||||||
ReceiptMaterialDetailDO receiptMaterialDetailDOChildren =
|
|
||||||
receiptMaterialDetailDOChildrenList1.stream()
|
|
||||||
.filter(p -> 1 == p.getLevel())
|
|
||||||
.findFirst() // 返回 Optional<ReceiptMaterialDetailDO>
|
|
||||||
.orElse(null); // 没有符合条件的元素时返回null(也可以自定义默认值)
|
|
||||||
if (receiptMaterialDetailDOChildren != null) {
|
|
||||||
receiptMaterialDetailDO.setMaterialDetailId(receiptMaterialDetailDOChildren.getMaterialDetailId());
|
|
||||||
receiptMaterialDetailDO.setReceiptQuantity(receiptMaterialDetailDOChildren.getReceiptQuantity());
|
|
||||||
receiptMaterialDetailDO.setMaterialStatusCode(receiptMaterialDetailDOChildren.getMaterialStatusCode());
|
|
||||||
receiptMaterialDetailDO.setBatchNumber(receiptMaterialDetailDOChildren.getBatchNumber());
|
|
||||||
receiptMaterialDetailDO.setContainerId(receiptMaterialDetailDOChildren.getContainerId());
|
|
||||||
receiptMaterialDetailDO.setLevel(receiptMaterialDetailDOChildren.getLevel());
|
|
||||||
receiptMaterialDetailDO.setMaterialMoreDetailList(receiptMaterialDetailDOChildren.getMaterialMoreDetailList());
|
|
||||||
receiptMaterialDetailDO.setMaterialDetailSerialNumberList(receiptMaterialDetailDOChildren.getMaterialDetailSerialNumberList());
|
|
||||||
}
|
|
||||||
//只留二级
|
|
||||||
List<ReceiptMaterialDetailDO> receiptMaterialDetailDOChildrenList2 = receiptMaterialDetailDOChildrenList1.stream().filter(p -> 2 == p.getLevel()).collect(Collectors.toList());
|
|
||||||
receiptMaterialDetailDO.setChildren(receiptMaterialDetailDOChildrenList2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
//收货装配参数
|
|
||||||
StockReceiptOrderDO assembleStockReceiptOrderDO = assembleParamByReceipt(stockReceiptOrderDO);
|
StockReceiptOrderDO assembleStockReceiptOrderDO = assembleParamByReceipt(stockReceiptOrderDO);
|
||||||
return stockReceiptOrderDomainService.receivingGoods(assembleStockReceiptOrderDO);
|
return stockReceiptOrderDomainService.receivingGoods(assembleStockReceiptOrderDO);
|
||||||
}
|
}
|
||||||
|
|||||||
+79
@@ -245,6 +245,9 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
|
|||||||
List<InMaterialDetailSerialNumber> materialDetailSerialNumberList = new ArrayList<>();
|
List<InMaterialDetailSerialNumber> materialDetailSerialNumberList = new ArrayList<>();
|
||||||
for (ReceiptMaterialDetailDO receiptMaterialDetailDO : receiptMaterialDetailDOList){
|
for (ReceiptMaterialDetailDO receiptMaterialDetailDO : receiptMaterialDetailDOList){
|
||||||
List<MaterialMoreDetailDO> materialMoreDetailList1 = receiptMaterialDetailDO.getMaterialMoreDetailList();
|
List<MaterialMoreDetailDO> materialMoreDetailList1 = receiptMaterialDetailDO.getMaterialMoreDetailList();
|
||||||
|
if (CollectionUtils.isEmpty(materialMoreDetailList1)) {
|
||||||
|
materialMoreDetailList1 = new ArrayList<>();
|
||||||
|
}
|
||||||
for (MaterialMoreDetailDO materialMoreDetailDO : materialMoreDetailList1) {
|
for (MaterialMoreDetailDO materialMoreDetailDO : materialMoreDetailList1) {
|
||||||
String batchLabels = materialMoreDetailDO.getBatchLabels();
|
String batchLabels = materialMoreDetailDO.getBatchLabels();
|
||||||
String attributeValue = materialMoreDetailDO.getAttributeValue();
|
String attributeValue = materialMoreDetailDO.getAttributeValue();
|
||||||
@@ -310,6 +313,10 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
|
|||||||
}
|
}
|
||||||
// 自动生成批次号并校验唯一性(包括子项)
|
// 自动生成批次号并校验唯一性(包括子项)
|
||||||
generateAndValidateBatchNumber(receiptMaterialDetailDO, shipperId);
|
generateAndValidateBatchNumber(receiptMaterialDetailDO, shipperId);
|
||||||
|
// 当 materialMoreDetailList 为空时(如 PDA 未传),从 receiptMaterialDetailDO 的 batch_number、material_status_code 等字段构建,确保更多属性能保存并回显
|
||||||
|
if (CollectionUtils.isEmpty(receiptMaterialDetailDO.getMaterialMoreDetailList())) {
|
||||||
|
receiptMaterialDetailDO.setMaterialMoreDetailList(buildMaterialMoreDetailFromReceiptFields(receiptMaterialDetailDO));
|
||||||
|
}
|
||||||
//更多属性
|
//更多属性
|
||||||
materialMoreDetailList.addAll(genMaterialMoreDetail(receiptMaterialDetailDO));
|
materialMoreDetailList.addAll(genMaterialMoreDetail(receiptMaterialDetailDO));
|
||||||
//序列号
|
//序列号
|
||||||
@@ -703,6 +710,78 @@ public class ReceiptMaterialDetailImpl extends ServiceImpl<ReceiptMaterialDetail
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当 PDA 未传 materialMoreDetailList 时,从 receiptMaterialDetailDO 的 batch_number、batch_ref_no、material_status_code 等字段构建,
|
||||||
|
* 确保更多属性能保存到 material_more_detail 表并正确回显
|
||||||
|
*/
|
||||||
|
private List<MaterialMoreDetailDO> buildMaterialMoreDetailFromReceiptFields(ReceiptMaterialDetailDO receiptMaterialDetailDO) {
|
||||||
|
List<MaterialMoreDetailDO> result = new ArrayList<>();
|
||||||
|
Long materialBaseInfoId = receiptMaterialDetailDO.getMaterialBaseInfoId();
|
||||||
|
if (materialBaseInfoId == null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
|
||||||
|
if (ajaxResult == null || !"200".equals(String.valueOf(ajaxResult.get("code")))) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
List<BatchDetailFeignPO> list = JSON.parseArray(JSON.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class);
|
||||||
|
if (CollectionUtils.isEmpty(list)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
Map<String, String> labelToField = new HashMap<>();
|
||||||
|
labelToField.put("Batch Ref NO's", "batchRefNo");
|
||||||
|
labelToField.put("Batch Ref NO", "batchRefNo");
|
||||||
|
labelToField.put("批次参考号", "batchRefNo");
|
||||||
|
labelToField.put("Sheet Ref NO's", "sheetRefNo");
|
||||||
|
labelToField.put("Sheet Ref NO", "sheetRefNo");
|
||||||
|
labelToField.put("单据参考号", "sheetRefNo");
|
||||||
|
labelToField.put("箱号/卡板号", "boxPalletNo");
|
||||||
|
labelToField.put("批次号", "batchNumber");
|
||||||
|
labelToField.put("物料状态", "materialStatusCode");
|
||||||
|
|
||||||
|
for (BatchDetailFeignPO po : list) {
|
||||||
|
if (po.getIsDisplay() == null || po.getIsDisplay() != 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String fieldName = po.getFieldName();
|
||||||
|
if (StringUtils.isBlank(fieldName) && StringUtils.isNotBlank(po.getBatchLabels())) {
|
||||||
|
fieldName = labelToField.get(po.getBatchLabels().trim());
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(fieldName)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String value = getReceiptFieldValue(receiptMaterialDetailDO, fieldName);
|
||||||
|
if (StringUtils.isBlank(value)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
MaterialMoreDetailDO dto = new MaterialMoreDetailDO();
|
||||||
|
dto.setBatchId(po.getBatchId());
|
||||||
|
dto.setBatchDetailId(po.getBatchDetailId());
|
||||||
|
dto.setBatchLabels(po.getBatchLabels());
|
||||||
|
dto.setAttributeValue(value);
|
||||||
|
result.add(dto);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("从收货明细构建更多属性失败,materialBaseInfoId:{},错误:{}", materialBaseInfoId, e.getMessage());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getReceiptFieldValue(ReceiptMaterialDetailDO dto, String fieldName) {
|
||||||
|
if (dto == null || StringUtils.isBlank(fieldName)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
java.lang.reflect.Field field = ReceiptMaterialDetailDO.class.getDeclaredField(fieldName);
|
||||||
|
field.setAccessible(true);
|
||||||
|
Object v = field.get(dto);
|
||||||
|
return v != null ? v.toString().trim() : null;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 生成物料明细
|
* @description 生成物料明细
|
||||||
* @author ZhouGY
|
* @author ZhouGY
|
||||||
|
|||||||
+8
-2
@@ -216,6 +216,14 @@ public class StockReceiptOrderDomainService {
|
|||||||
.collect(Collectors.groupingBy(MaterialMoreDetailPO::getMaterialDetailUniqueId));
|
.collect(Collectors.groupingBy(MaterialMoreDetailPO::getMaterialDetailUniqueId));
|
||||||
receiptMaterialDetailPOList.forEach(receiptMaterialDetailPO -> {
|
receiptMaterialDetailPOList.forEach(receiptMaterialDetailPO -> {
|
||||||
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOChildrenNowList = new ArrayList<>();
|
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOChildrenNowList = new ArrayList<>();
|
||||||
|
//子集(level 2 的真实子项)
|
||||||
|
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOChildrenList = receiptMaterialDetailPO.getChildren();
|
||||||
|
if (CollectionUtils.isEmpty(receiptMaterialDetailPOChildrenList)) {
|
||||||
|
//无 level 2 子项时,不添加父级拷贝,避免 PC 端显示重复
|
||||||
|
receiptMaterialDetailPO.setChildren(receiptMaterialDetailPOChildrenNowList);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//有 level 2 子项时,添加父级拷贝(level 1)供 PDA 收货使用
|
||||||
ReceiptMaterialDetailPO receiptMaterialDetailPOChildrenNow = new ReceiptMaterialDetailPO();
|
ReceiptMaterialDetailPO receiptMaterialDetailPOChildrenNow = new ReceiptMaterialDetailPO();
|
||||||
BeanUtils.copyProperties(receiptMaterialDetailPO, receiptMaterialDetailPOChildrenNow, "children");
|
BeanUtils.copyProperties(receiptMaterialDetailPO, receiptMaterialDetailPOChildrenNow, "children");
|
||||||
List<InMaterialDetailSerialNumberPO> materialDetailSerialNumberList = inMaterialDetailSerialNumberMap.get(receiptMaterialDetailPO.getUniqueId());
|
List<InMaterialDetailSerialNumberPO> materialDetailSerialNumberList = inMaterialDetailSerialNumberMap.get(receiptMaterialDetailPO.getUniqueId());
|
||||||
@@ -231,8 +239,6 @@ public class StockReceiptOrderDomainService {
|
|||||||
receiptMaterialDetailPOChildrenNow.setMaterialMoreDetailList(getMaterialMoreDetail(receiptMaterialDetailPO));
|
receiptMaterialDetailPOChildrenNow.setMaterialMoreDetailList(getMaterialMoreDetail(receiptMaterialDetailPO));
|
||||||
}
|
}
|
||||||
receiptMaterialDetailPOChildrenNowList.add(receiptMaterialDetailPOChildrenNow);
|
receiptMaterialDetailPOChildrenNowList.add(receiptMaterialDetailPOChildrenNow);
|
||||||
//子集
|
|
||||||
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOChildrenList = receiptMaterialDetailPO.getChildren();
|
|
||||||
receiptMaterialDetailPOChildrenList.forEach(receiptMaterialDetailPOChildren -> {
|
receiptMaterialDetailPOChildrenList.forEach(receiptMaterialDetailPOChildren -> {
|
||||||
List<InMaterialDetailSerialNumberPO> materialDetailSerialNumberChildrenList = inMaterialDetailSerialNumberMap.get(receiptMaterialDetailPOChildren.getUniqueId());
|
List<InMaterialDetailSerialNumberPO> materialDetailSerialNumberChildrenList = inMaterialDetailSerialNumberMap.get(receiptMaterialDetailPOChildren.getUniqueId());
|
||||||
if (!CollectionUtils.isEmpty(materialDetailSerialNumberChildrenList)) {
|
if (!CollectionUtils.isEmpty(materialDetailSerialNumberChildrenList)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user