|
|
|
@ -1,14 +1,13 @@ |
|
|
|
package com.gaotao.modules.labelSplitMerge.service.impl; |
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|
|
|
import com.gaotao.modules.base.data.BuData; |
|
|
|
import com.gaotao.modules.labelSplitMerge.dao.LabelSplitMergeMapper; |
|
|
|
import com.gaotao.modules.labelSplitMerge.entity.LabelSplitMergeEntity; |
|
|
|
import com.gaotao.modules.labelSplitMerge.service.LabelSplitMergeService; |
|
|
|
import com.gaotao.modules.trans.entity.TransDetail; |
|
|
|
import com.gaotao.modules.trans.entity.TransDetailDto; |
|
|
|
import com.gaotao.modules.trans.entity.TransHeader; |
|
|
|
import com.gaotao.modules.trans.entity.TransNoControl; |
|
|
|
import com.gaotao.modules.trans.entity.*; |
|
|
|
import com.gaotao.modules.trans.service.TransDetailService; |
|
|
|
import com.gaotao.modules.trans.service.TransDetailSubService; |
|
|
|
import com.gaotao.modules.trans.service.TransHeaderService; |
|
|
|
import com.gaotao.modules.trans.service.TransNoControlService; |
|
|
|
import org.slf4j.Logger; |
|
|
|
@ -47,6 +46,9 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
@Autowired |
|
|
|
private TransNoControlService transNoControlService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private TransDetailSubService transDetailSubService; |
|
|
|
|
|
|
|
@Override |
|
|
|
public Map<String, Object> getStockInfoByLabelCode(String labelCode, String site, String warehouseId) { |
|
|
|
logger.info("根据标签条码获取库存信息,标签条码: {}, 站点: {}, 仓库: {}", labelCode, site, warehouseId); |
|
|
|
@ -114,7 +116,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
insertParams.put("site", site); |
|
|
|
insertParams.put("buNo", buNo); |
|
|
|
insertParams.put("rollNo", newLabelCode); |
|
|
|
insertParams.put("parentRollNo", originalLabelCode); |
|
|
|
insertParams.put("parentRollNo", newLabelCode); |
|
|
|
insertParams.put("partNo", partNo); |
|
|
|
insertParams.put("labelTypeTb", params.get("labelTypeTb")); |
|
|
|
insertParams.put("labelType", params.get("labelType")); |
|
|
|
@ -122,8 +124,8 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
insertParams.put("locationId", locationId); |
|
|
|
insertParams.put("batchNo", batchNo); |
|
|
|
insertParams.put("wdr", params.get("wdr")); |
|
|
|
insertParams.put("statusTb", "在库"); |
|
|
|
insertParams.put("status", "在库"); |
|
|
|
insertParams.put("statusTb", params.get("statusTb")); |
|
|
|
insertParams.put("status", params.get("status")); |
|
|
|
insertParams.put("firstInDate", new Date()); |
|
|
|
insertParams.put("latestInDate", new Date()); |
|
|
|
insertParams.put("activeDate", new Date()); |
|
|
|
@ -144,7 +146,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
} |
|
|
|
|
|
|
|
// 5. 生成标签变动事务记录 |
|
|
|
generateSplitTransaction(site, buNo, warehouseId, originalLabelCode, newLabelCode, partNo, batchNo, splitQuantity, remainingQuantity); |
|
|
|
generateSplitTransaction(site, buNo, warehouseId, originalLabelCode, newLabelCode, partNo, batchNo, splitQuantity, remainingQuantity, locationId); |
|
|
|
|
|
|
|
Map<String, Object> result = new HashMap<>(); |
|
|
|
result.put("newLabelCode", newLabelCode); |
|
|
|
@ -176,6 +178,8 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
String batchNo = (String) params.get("batchNo"); |
|
|
|
String locationId = (String) params.get("locationId"); |
|
|
|
String operator = (String) params.get("operator"); |
|
|
|
String status = (String) params.get("status"); |
|
|
|
String statusTb = (String) params.get("statusTb"); |
|
|
|
|
|
|
|
Float targetQuantity = Float.parseFloat(params.get("targetQuantity").toString()); |
|
|
|
Float sourceQuantity = Float.parseFloat(params.get("sourceQuantity").toString()); |
|
|
|
@ -199,8 +203,8 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
updateTargetParams.put("rollNo", targetLabelCode); |
|
|
|
updateTargetParams.put("site", site); |
|
|
|
updateTargetParams.put("warehouseId", warehouseId); |
|
|
|
updateTargetParams.put("status", "出库"); |
|
|
|
updateTargetParams.put("statusTb", "出库"); |
|
|
|
updateTargetParams.put("status", status); |
|
|
|
updateTargetParams.put("statusTb", statusTb); |
|
|
|
updateTargetParams.put("outQty", targetQuantity); // 记录目标标签的出库数量 |
|
|
|
|
|
|
|
int updateTargetCount = labelSplitMergeMapper.updateInventoryStatus(updateTargetParams); |
|
|
|
@ -209,7 +213,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
} |
|
|
|
|
|
|
|
// 4. 生成标签变动事务记录 |
|
|
|
generateMergeTransaction(site, buNo, warehouseId, sourceLabelCode, targetLabelCode, partNo, batchNo, sourceQuantity, targetQuantity, mergedQuantity); |
|
|
|
generateMergeTransaction(site, buNo, warehouseId, sourceLabelCode, targetLabelCode, partNo, batchNo, sourceQuantity, targetQuantity, mergedQuantity, locationId); |
|
|
|
|
|
|
|
logger.info("标签合并成功,源标签: {}, 目标标签: {}, 合并数量: {}", sourceLabelCode, targetLabelCode, sourceQuantity); |
|
|
|
return true; |
|
|
|
@ -224,7 +228,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
* 生成标签拆分事务记录 |
|
|
|
*/ |
|
|
|
private void generateSplitTransaction(String site, String buNo, String warehouseId, String originalLabelCode, |
|
|
|
String newLabelCode, String partNo, String batchNo, Float splitQuantity, Float remainingQuantity) { |
|
|
|
String newLabelCode, String partNo, String batchNo, Float splitQuantity, Float remainingQuantity, String locationCode) { |
|
|
|
logger.info("开始生成标签拆分事务记录,原标签: {}, 新标签: {}", originalLabelCode, newLabelCode); |
|
|
|
|
|
|
|
try { |
|
|
|
@ -233,24 +237,23 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
transDetailDto.setSite(site); |
|
|
|
transDetailDto.setRemark("标签拆分 - 原标签: " + originalLabelCode + ", 新标签: " + newLabelCode); |
|
|
|
transDetailDto.setOrderref1(originalLabelCode); // 原标签条码 |
|
|
|
transDetailDto.setOrderref2(newLabelCode); // 新标签条码 |
|
|
|
transDetailDto.setOrderref3(warehouseId); // 仓库ID |
|
|
|
|
|
|
|
// 使用TransHeaderService的genTrans方法生成事务头 |
|
|
|
// CF = 拆分 (Cha Fen) |
|
|
|
TransHeader transHeader = transHeaderService.genTrans(transDetailDto, "CF", warehouseId, buNo); |
|
|
|
|
|
|
|
if (transHeader == null) { |
|
|
|
throw new RuntimeException("生成标签拆分事务头记录失败"); |
|
|
|
} |
|
|
|
|
|
|
|
logger.info("标签拆分事务头记录生成成功,事务单号: {}", transHeader.getTransno()); |
|
|
|
|
|
|
|
// 生成事务明细记录 |
|
|
|
generateSplitTransactionDetails(transHeader.getTransno(), originalLabelCode, newLabelCode, partNo, batchNo, splitQuantity, remainingQuantity, site); |
|
|
|
generateSplitTransactionDetails(transHeader.getTransno(), originalLabelCode, newLabelCode, partNo, batchNo, splitQuantity, remainingQuantity, site, buNo); |
|
|
|
logger.info("标签拆分事务记录生成完成,事务单号: {}, 原标签: {}, 新标签: {}", transHeader.getTransno(), originalLabelCode, newLabelCode); |
|
|
|
|
|
|
|
logger.info("标签拆分事务记录生成完成,事务单号: {}, 原标签: {}, 新标签: {}", |
|
|
|
transHeader.getTransno(), originalLabelCode, newLabelCode); |
|
|
|
// 生成事务子明细记录 |
|
|
|
addSubTransactionDetails(transHeader.getTransno(), originalLabelCode, newLabelCode, batchNo, splitQuantity, remainingQuantity, site, buNo, warehouseId, locationCode); |
|
|
|
logger.info("标签拆分事务子记录生成完成,事务单号: {}", transHeader.getTransno()); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("生成标签拆分事务记录失败", e); |
|
|
|
@ -258,11 +261,12 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 生成标签合并事务记录 |
|
|
|
*/ |
|
|
|
private void generateMergeTransaction(String site, String buNo, String warehouseId, String sourceLabelCode, |
|
|
|
String targetLabelCode, String partNo, String batchNo, Float sourceQuantity, Float targetQuantity, Float mergedQuantity) { |
|
|
|
String targetLabelCode, String partNo, String batchNo, Float sourceQuantity, Float targetQuantity, Float mergedQuantity, String locationCode) { |
|
|
|
logger.info("开始生成标签合并事务记录,源标签: {}, 目标标签: {}", sourceLabelCode, targetLabelCode); |
|
|
|
|
|
|
|
try { |
|
|
|
@ -271,24 +275,23 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
transDetailDto.setSite(site); |
|
|
|
transDetailDto.setRemark("标签合并 - 源标签: " + sourceLabelCode + ", 目标标签: " + targetLabelCode); |
|
|
|
transDetailDto.setOrderref1(sourceLabelCode); // 源标签条码 |
|
|
|
transDetailDto.setOrderref2(targetLabelCode); // 目标标签条码 |
|
|
|
transDetailDto.setOrderref3(warehouseId); // 仓库ID |
|
|
|
|
|
|
|
// 使用TransHeaderService的genTrans方法生成事务头 |
|
|
|
// HB = 合并 (He Bing) |
|
|
|
TransHeader transHeader = transHeaderService.genTrans(transDetailDto, "HB", warehouseId, buNo); |
|
|
|
|
|
|
|
if (transHeader == null) { |
|
|
|
throw new RuntimeException("生成标签合并事务头记录失败"); |
|
|
|
} |
|
|
|
|
|
|
|
logger.info("标签合并事务头记录生成成功,事务单号: {}", transHeader.getTransno()); |
|
|
|
|
|
|
|
// 生成事务明细记录 |
|
|
|
generateMergeTransactionDetails(transHeader.getTransno(), sourceLabelCode, targetLabelCode, partNo, batchNo, sourceQuantity, targetQuantity, mergedQuantity, site); |
|
|
|
generateMergeTransactionDetails(transHeader.getTransno(), sourceLabelCode, targetLabelCode, partNo, batchNo, sourceQuantity, targetQuantity, mergedQuantity, site, buNo); |
|
|
|
logger.info("标签合并事务记录生成完成,事务单号: {}, 源标签: {}, 目标标签: {}", transHeader.getTransno(), sourceLabelCode, targetLabelCode); |
|
|
|
|
|
|
|
logger.info("标签合并事务记录生成完成,事务单号: {}, 源标签: {}, 目标标签: {}", |
|
|
|
transHeader.getTransno(), sourceLabelCode, targetLabelCode); |
|
|
|
// 生成事务子明细记录 |
|
|
|
addSubTransactionDetails2(transHeader.getTransno(), sourceLabelCode, targetLabelCode, batchNo, sourceQuantity, targetQuantity, mergedQuantity, site, buNo, warehouseId, locationCode); |
|
|
|
logger.info("标签拆分事务子记录生成完成,事务单号: {}", transHeader.getTransno()); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("生成标签合并事务记录失败", e); |
|
|
|
@ -299,10 +302,9 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
/** |
|
|
|
* 生成标签拆分事务明细记录 |
|
|
|
*/ |
|
|
|
private void generateSplitTransactionDetails(String transNo, String originalLabelCode, String newLabelCode, |
|
|
|
String partNo, String batchNo, Float splitQuantity, Float remainingQuantity, String site) { |
|
|
|
private void generateSplitTransactionDetails(String transNo, String originalLabelCode, String newLabelCode, |
|
|
|
String partNo, String batchNo, Float splitQuantity, Float remainingQuantity, String site, String buNo) { |
|
|
|
logger.info("开始生成标签拆分事务明细记录,事务单号: {}", transNo); |
|
|
|
|
|
|
|
List<TransDetail> transDetailList = new ArrayList<>(); |
|
|
|
|
|
|
|
// 原标签明细记录(减少数量) |
|
|
|
@ -315,7 +317,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
originalDetail.setBatchno(batchNo); |
|
|
|
originalDetail.setDirection("-"); // 减少方向 |
|
|
|
originalDetail.setOrderref1(originalLabelCode); // 原标签条码 |
|
|
|
originalDetail.setOrderref2(partNo); // 物料编码 |
|
|
|
originalDetail.setOrderref2(buNo); // bu |
|
|
|
originalDetail.setOrderref3(batchNo); // 批次号 |
|
|
|
originalDetail.setRemark("标签拆分 - 原标签减少数量: " + splitQuantity); |
|
|
|
transDetailList.add(originalDetail); |
|
|
|
@ -330,26 +332,65 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
newDetail.setBatchno(batchNo); |
|
|
|
newDetail.setDirection("+"); // 增加方向 |
|
|
|
newDetail.setOrderref1(newLabelCode); // 新标签条码 |
|
|
|
newDetail.setOrderref2(partNo); // 物料编码 |
|
|
|
newDetail.setOrderref2(buNo); // bu |
|
|
|
newDetail.setOrderref3(batchNo); // 批次号 |
|
|
|
newDetail.setRemark("标签拆分 - 新标签增加数量: " + splitQuantity); |
|
|
|
transDetailList.add(newDetail); |
|
|
|
|
|
|
|
// 批量保存事务明细记录 |
|
|
|
if (!transDetailList.isEmpty()) { |
|
|
|
boolean success = transDetailService.saveBatch(transDetailList); |
|
|
|
if (!success) { |
|
|
|
throw new RuntimeException("标签拆分事务明细记录保存失败"); |
|
|
|
} |
|
|
|
logger.info("标签拆分事务明细记录生成成功,共生成 {} 条明细记录", transDetailList.size()); |
|
|
|
boolean success = transDetailService.saveBatch(transDetailList); |
|
|
|
if (!success) { |
|
|
|
throw new RuntimeException("标签拆分事务明细记录保存失败"); |
|
|
|
} |
|
|
|
logger.info("标签拆分事务明细记录生成成功,共生成 {} 条明细记录", transDetailList.size()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 添加子明细数据 |
|
|
|
*/ |
|
|
|
private void addSubTransactionDetails(String transNo, String originalLabelCode, String newLabelCode, String batchNo, Float splitQuantity, |
|
|
|
Float remainingQuantity, String site, String buNo, String warehouseId, String locationCode) { |
|
|
|
logger.info("开始添加子明细数据,事务单号: {}", transNo); |
|
|
|
List<TransDetailSub> subDetailList = new ArrayList<>(); |
|
|
|
|
|
|
|
TransDetailSub originalSubDetail = new TransDetailSub(); |
|
|
|
originalSubDetail.setSite(site); |
|
|
|
originalSubDetail.setTransNo(transNo); |
|
|
|
originalSubDetail.setItemNo(1.0); |
|
|
|
originalSubDetail.setSubNo(originalLabelCode); |
|
|
|
originalSubDetail.setSubQty(Double.valueOf(splitQuantity)); |
|
|
|
originalSubDetail.setDirection("-"); |
|
|
|
originalSubDetail.setOrderRef2(buNo); |
|
|
|
originalSubDetail.setOrderRef3(batchNo); |
|
|
|
originalSubDetail.setOrderRef4(warehouseId); |
|
|
|
originalSubDetail.setOrderRef5(locationCode); |
|
|
|
subDetailList.add(originalSubDetail); |
|
|
|
|
|
|
|
TransDetailSub newSubDetail = new TransDetailSub(); |
|
|
|
newSubDetail.setSite(site); |
|
|
|
newSubDetail.setTransNo(transNo); |
|
|
|
newSubDetail.setItemNo(2.0); |
|
|
|
newSubDetail.setSubNo(newLabelCode); |
|
|
|
newSubDetail.setSubQty(Double.valueOf(splitQuantity)); |
|
|
|
newSubDetail.setDirection("+"); |
|
|
|
newSubDetail.setOrderRef2(buNo); |
|
|
|
newSubDetail.setOrderRef3(batchNo); |
|
|
|
newSubDetail.setOrderRef4(warehouseId); |
|
|
|
newSubDetail.setOrderRef5(locationCode); |
|
|
|
subDetailList.add(newSubDetail); |
|
|
|
|
|
|
|
boolean success = transDetailSubService.saveBatch(subDetailList); |
|
|
|
if (!success) { |
|
|
|
throw new RuntimeException("子明细记录保存失败"); |
|
|
|
} |
|
|
|
logger.info("子明细记录生成成功,共生成 {} 条子明细记录", subDetailList.size()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 生成标签合并事务明细记录 |
|
|
|
*/ |
|
|
|
private void generateMergeTransactionDetails(String transNo, String sourceLabelCode, String targetLabelCode, |
|
|
|
String partNo, String batchNo, Float sourceQuantity, Float targetQuantity, Float mergedQuantity, String site) { |
|
|
|
String partNo, String batchNo, Float sourceQuantity, Float targetQuantity, Float mergedQuantity, String site, String buNo) { |
|
|
|
logger.info("开始生成标签合并事务明细记录,事务单号: {}", transNo); |
|
|
|
|
|
|
|
List<TransDetail> transDetailList = new ArrayList<>(); |
|
|
|
@ -364,7 +405,7 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
targetDetail.setBatchno(batchNo); |
|
|
|
targetDetail.setDirection("-"); // 减少方向 |
|
|
|
targetDetail.setOrderref1(targetLabelCode); // 目标标签条码 |
|
|
|
targetDetail.setOrderref2(partNo); // 物料编码 |
|
|
|
targetDetail.setOrderref2(buNo); // bu |
|
|
|
targetDetail.setOrderref3(batchNo); // 批次号 |
|
|
|
targetDetail.setRemark("标签合并 - 目标标签被合并,数量: " + targetQuantity); |
|
|
|
transDetailList.add(targetDetail); |
|
|
|
@ -379,18 +420,56 @@ public class LabelSplitMergeServiceImpl extends ServiceImpl<LabelSplitMergeMappe |
|
|
|
sourceDetail.setBatchno(batchNo); |
|
|
|
sourceDetail.setDirection("+"); // 增加方向 |
|
|
|
sourceDetail.setOrderref1(sourceLabelCode); // 源标签条码 |
|
|
|
sourceDetail.setOrderref2(partNo); // 物料编码 |
|
|
|
sourceDetail.setOrderref2(buNo); // bu |
|
|
|
sourceDetail.setOrderref3(batchNo); // 批次号 |
|
|
|
sourceDetail.setRemark("标签合并 - 源标签获得合并后总数量: " + mergedQuantity); |
|
|
|
transDetailList.add(sourceDetail); |
|
|
|
|
|
|
|
// 批量保存事务明细记录 |
|
|
|
if (!transDetailList.isEmpty()) { |
|
|
|
boolean success = transDetailService.saveBatch(transDetailList); |
|
|
|
if (!success) { |
|
|
|
throw new RuntimeException("标签合并事务明细记录保存失败"); |
|
|
|
} |
|
|
|
logger.info("标签合并事务明细记录生成成功,共生成 {} 条明细记录", transDetailList.size()); |
|
|
|
boolean success = transDetailService.saveBatch(transDetailList); |
|
|
|
if (!success) { |
|
|
|
throw new RuntimeException("标签合并事务明细记录保存失败"); |
|
|
|
} |
|
|
|
logger.info("标签合并事务明细记录生成成功,共生成 {} 条明细记录", transDetailList.size()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 添加子明细数据 |
|
|
|
*/ |
|
|
|
private void addSubTransactionDetails2(String transNo, String sourceLabelCode, String targetLabelCode, String batchNo, Float sourceQuantity, |
|
|
|
Float targetQuantity, Float mergedQuantity, String site, String buNo, String warehouseId, String locationCode) { |
|
|
|
logger.info("开始添加子明细数据,事务单号: {}", transNo); |
|
|
|
List<TransDetailSub> subDetailList = new ArrayList<>(); |
|
|
|
|
|
|
|
TransDetailSub originalSubDetail = new TransDetailSub(); |
|
|
|
originalSubDetail.setSite(site); |
|
|
|
originalSubDetail.setTransNo(transNo); |
|
|
|
originalSubDetail.setItemNo(1.0); |
|
|
|
originalSubDetail.setSubNo(sourceLabelCode); |
|
|
|
originalSubDetail.setSubQty(Double.valueOf(targetQuantity)); |
|
|
|
originalSubDetail.setDirection("-"); |
|
|
|
originalSubDetail.setOrderRef2(buNo); |
|
|
|
originalSubDetail.setOrderRef3(batchNo); |
|
|
|
originalSubDetail.setOrderRef4(warehouseId); |
|
|
|
originalSubDetail.setOrderRef5(locationCode); |
|
|
|
subDetailList.add(originalSubDetail); |
|
|
|
|
|
|
|
TransDetailSub newSubDetail = new TransDetailSub(); |
|
|
|
newSubDetail.setSite(site); |
|
|
|
newSubDetail.setTransNo(transNo); |
|
|
|
newSubDetail.setItemNo(2.0); |
|
|
|
newSubDetail.setSubNo(targetLabelCode); |
|
|
|
newSubDetail.setSubQty(Double.valueOf(mergedQuantity)); |
|
|
|
newSubDetail.setDirection("+"); |
|
|
|
newSubDetail.setOrderRef2(buNo); |
|
|
|
newSubDetail.setOrderRef3(batchNo); |
|
|
|
newSubDetail.setOrderRef4(warehouseId); |
|
|
|
newSubDetail.setOrderRef5(locationCode); |
|
|
|
subDetailList.add(newSubDetail); |
|
|
|
|
|
|
|
boolean success = transDetailSubService.saveBatch(subDetailList); |
|
|
|
if (!success) { |
|
|
|
throw new RuntimeException("子明细记录保存失败"); |
|
|
|
} |
|
|
|
logger.info("子明细记录生成成功,共生成 {} 条子明细记录", subDetailList.size()); |
|
|
|
} |
|
|
|
} |