diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml index de91a1cb5..245623123 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml @@ -320,6 +320,7 @@ ( SELECT aaa.id, + aaa.warehouse_name AS warehouseName, group_concat( DISTINCT dsa.service_number ) AS serviceNumber, group_concat( DISTINCT dsa.waybill_number ) AS waybillNumber, group_concat( DISTINCT dsa.consignee_unit ) AS consigneeUnit, @@ -342,6 +343,7 @@ LEFT JOIN ( SELECT bbb.id, + bbb.warehouse_name AS warehouseName, group_concat( DISTINCT ldsl.service_number ) AS serviceNumber, group_concat( ldsl.incoming_batch ) AS incomingBatch, group_concat( DISTINCT ldsl.market_name ) AS consigneeUnit, @@ -351,7 +353,7 @@ group_concat( DISTINCT ldsl.brand_name ) AS brand FROM logpm_distrilbution_bill_lading bbb - LEFT JOIN logpm_distribution_delivery_details lddd ON lddd.bill_lading_id = bbb.id + LEFT JOIN logpm_distribution_delivery_d etails lddd ON lddd.bill_lading_id = bbb.id AND lddd.is_deleted = 0 LEFT JOIN logpm_distribution_stock_list ldsl ON lddd.stock_list_id = ldsl.id LEFT JOIN logpm_basicdata_client lbc ON ldsl.market_id = lbc.id diff --git a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryListServiceImpl.java b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryListServiceImpl.java index 334331723..e9804593b 100644 --- a/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryListServiceImpl.java +++ b/blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionDeliveryListServiceImpl.java @@ -595,10 +595,10 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl reservationIds = Collections.singletonList(Long.valueOf(Arrays.toString(reservationId.split(",")))); //查询客户信息,装车情况 - // List distributionDeliveryInfoEntities = distributionDeliveryInfoMapper.selectList(new QueryWrapper().lambda() - // .eq(DistributionDeliveryInfoEntity::getLoadedState, "2") - // .in(null != reservationIds && reservationIds.size() > 0, DistributionDeliveryInfoEntity::getReservationId, reservationIds) - // ); + // List distributionDeliveryInfoEntities = distributionDeliveryInfoMapper.selectList(new QueryWrapper().lambda() + // .eq(DistributionDeliveryInfoEntity::getLoadedState, "2") + // .in(null != reservationIds && reservationIds.size() > 0, DistributionDeliveryInfoEntity::getReservationId, reservationIds) + // ); //统计客户的配送数量,加入签收表(通过预约单查询总数量) List distributionReservationEntities = distributionReservationMapper.selectBatchIds(reservationIds); ArrayList distributionSignforEntities = new ArrayList(); @@ -619,10 +619,10 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl[" + newList.stream().map(DistributionReservationEntity::getReservationCode).collect(Collectors.joining(",")) + "]"+"当前总件数:"+(newList.stream().mapToInt(DistributionReservationEntity::getReservationNum).sum()+newList.stream().mapToInt(DistributionReservationEntity::getReservationStockListNum).sum()); + + "预约编号:[" + oldList.stream().map(DistributionReservationEntity::getReservationCode).collect(Collectors.joining(",")) + "]变更为-->[" + newList.stream().map(DistributionReservationEntity::getReservationCode).collect(Collectors.joining(",")) + "]" + "当前总件数:" + (newList.stream().mapToInt(DistributionReservationEntity::getReservationNum).sum() + newList.stream().mapToInt(DistributionReservationEntity::getReservationStockListNum).sum()); DistributionPlanLogEntity distributionPlanLogEntity = new DistributionPlanLogEntity(); distributionPlanLogEntity.setContent(distributionContent); distributionPlanLogEntity.setRefId(deliveryListEntity.getId()); @@ -8770,6 +8770,10 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl packageLogs = new ArrayList<>(); //查询司机信息 + //回传数据修改 + List pushNodeList = new ArrayList<>(); + //回传数据修改 + List ts = new ArrayList<>(); DistributionDeliverySelfEntity distributionDeliverySelfEntity = getDriver(deliveryListEntity, user, distrilbutionloadingscanDTO.getVehicleNub(), isDriverFlag); if (Objects.isNull(distributionDeliverySelfEntity)) { return Resp.fail("当前操作人不合法"); @@ -8838,6 +8842,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl>>>>>>>>>>>>>>>>>>装车修改库存品包件>装车包件码:{},", disStockListDetailEntity.getStockPackageCode()); DistributionLoadscaninvnEntity distributionLoadscaninvnEntity = getDistributionLoadscaninvnEntity(distrilbutionloadingscanDTO, distributionDeliverySelfEntity, disStockListDetailEntity, deliveryListEntity, myCurrentWarehouse); packageLockIds.add(distributionLoadscaninvnEntity.getInventoryPackageId()); + ts.add(distributionLoadscaninvnEntity); distributionLoadscaninvnService.save(distributionLoadscaninvnEntity); //对装车异常进行关闭 distributionLoadscanAbnormalService.completeLoadingAbnormal(distributionLoadscaninvnEntity.getOrderPackageCode(), distributionLoadscaninvnEntity.getWarehouseId(), distributionLoadscaninvnEntity.getReservationId(), distributionLoadscaninvnEntity.getScanUser()); @@ -9122,6 +9130,10 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl nodeFanoutMsg = buildNodeFanoutMsgByStock(deliveryListEntity, reservationEntity2, ts); + distributionNodeWorkService.nodeLoading(nodeFanoutMsg, AuthUtil.getUser()); + } break; case 4: if (Objects.isNull(distrilbutionloadingscanDTO.getBarcode())) { @@ -9206,6 +9218,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl nodeFanoutMsg = buildNodeFanoutMsgByPackage(deliveryListEntity, pushNodeList); + distributionNodeWorkService.nodeLoading(nodeFanoutMsg, AuthUtil.getUser()); + } //维护订单数量 if (!orderCodes.isEmpty()) { String s = orderCodes.stream().collect(Collectors.joining(",")); @@ -9949,7 +9967,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl zeroPackageMap) { + private void updateZeroLoadingEntity(DistributionLoadscanEntity loadscanEntity, DistributionParcelNumberDTO parcelListDTO, BasicdataWarehouseEntity myCurrentWarehouse, Map zeroPackageMap, List pushNodeList) { //维护零担出库数量 DistributionParcelNumberEntity parcelNumberEntity = zeroPackageMap.get(parcelListDTO.getParcelListId()); BigDecimal deliveryQuantity = new BigDecimal(parcelNumberEntity.getDeliveryQuantity()); @@ -9975,6 +9993,7 @@ public class DistributionDeliveryListServiceImpl extends BaseServiceImpl zeroPackageMap) { + Map zeroPackageMap, + List pushNodeList) { DistributionLoadscanEntity zeroLoadscanEntity = createdDistributionZeroLoadscanEntity(distributionDeliverySelfEntity, deliveryListEntity, distrilbutionloadingscanDTO.getReservationId(), parcelNumberDTO, myCurrentWarehouse, user); zeroLoadscanEntity.setIsZero(Integer.parseInt(IsOrNoConstant.yes.getValue())); + pushNodeList.add(zeroLoadscanEntity); distributionLoadscanService.save(zeroLoadscanEntity); //更新装车时间 Integer i = distributionDeliveryListMapper.updateloadingTimeById(distrilbutionloadingscanDTO.getDeliveryId()); diff --git a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderServiceImpl.java b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderServiceImpl.java index eb242133f..2df4f7434 100644 --- a/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderServiceImpl.java +++ b/blade-service/logpm-trunkline/src/main/java/com/logpm/trunkline/service/impl/OpenOrderServiceImpl.java @@ -2910,6 +2910,10 @@ public class OpenOrderServiceImpl implements IOpenOrderService { List importOrderNoPackageExcelDTOS = EasyExcel.read(inputStream).head(ImportOrderNoPackageExcelDTO.class).sheet(0).headRowNumber(2).doReadSync(); + //过滤掉importOrderNoPackageExcelDTOS中orderCode为空的数据 + importOrderNoPackageExcelDTOS = importOrderNoPackageExcelDTOS.stream().filter(item -> StringUtil.isNotBlank(item.getOrderCode())).collect(Collectors.toList()); + + //把importOrderNoPackageExcelDTOS中所有brand放入一个Set Set brands = importOrderNoPackageExcelDTOS.parallelStream().map(ImportOrderNoPackageExcelDTO::getBrand).collect(Collectors.toSet()); @@ -3151,6 +3155,10 @@ public class OpenOrderServiceImpl implements IOpenOrderService { List importOrderNoPackageExcelDTOS = EasyExcel.read(inputStream).head(ImportOrderNoPackageExcelDTO.class).sheet(0).headRowNumber(2).doReadSync(); + //过滤掉importOrderNoPackageExcelDTOS中orderCode为空的数据 + importOrderNoPackageExcelDTOS = importOrderNoPackageExcelDTOS.stream().filter(item -> StringUtil.isNotBlank(item.getOrderCode())).collect(Collectors.toList()); + + //把importOrderNoPackageExcelDTOS中所有brand放入一个Set Set brands = importOrderNoPackageExcelDTOS.parallelStream().map(ImportOrderNoPackageExcelDTO::getBrand).collect(Collectors.toSet()); List brandEntities = basicdataBrandClient.findListByNames(brands); diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWarehousingEntryController.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWarehousingEntryController.java index 463c23486..7e7fed206 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWarehousingEntryController.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/controller/WarehouseWarehousingEntryController.java @@ -238,13 +238,13 @@ public class WarehouseWarehousingEntryController extends BladeController { warehousingEntryDetailExcel.setTrainNumber("SF098876456 选添"); warehousingEntryDetailExcel.setLicensePlate("川S5346347 选添"); warehousingEntryDetailExcel.setServiceType("自提 商配 市配 选择其一"); - warehousingEntryDetailExcel.setSku("G21191547"); +// warehousingEntryDetailExcel.setSku("G21191547"); warehousingEntryDetailExcel.setProductName("OP-CD309-1.8慕思如梦时光床垫/1800*2000*260"); - warehousingEntryDetailExcel.setProductCode("G21191547"); - warehousingEntryDetailExcel.setProductUnit("张"); +// warehousingEntryDetailExcel.setProductCode("G21191547"); +// warehousingEntryDetailExcel.setProductUnit("张"); warehousingEntryDetailExcel.setLogisticsCompany("物流公司 选填"); - warehousingEntryDetailExcel.setPackagingNumber("1"); - warehousingEntryDetailExcel.setPackagingSpecifications("1"); +// warehousingEntryDetailExcel.setPackagingNumber("1"); +// warehousingEntryDetailExcel.setPackagingSpecifications("1"); warehousingEntryDetailExcel.setCreateInventory(100); warehousingEntryDetailExcel.setPositions("存放位置 选填"); warehousingEntryDetailExcel.setLoadingType("存放类型 1-库位 2-托盘 "); diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehousingEntryDetailExcel.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehousingEntryDetailExcel.java index 5c64bbcbf..afa1793d7 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehousingEntryDetailExcel.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/excel/WarehousingEntryDetailExcel.java @@ -123,42 +123,42 @@ public class WarehousingEntryDetailExcel implements Serializable { // @ExcelProperty("入库总件数") // private Integer totalInput; - /** - * SKU - */ - @ColumnWidth(20) - @ExcelProperty("SKU") - private String sku; +// /** +// * SKU +// */ +// @ColumnWidth(20) +// @ExcelProperty("SKU") +// private String sku; /** * 物品名称 */ @ColumnWidth(20) @ExcelProperty("物品名称") private String productName; - /** - * 物品编码 - */ - @ColumnWidth(20) - @ExcelProperty("物品编码") - private String productCode; - /** - * 物品单位 - */ - @ColumnWidth(20) - @ExcelProperty("物品单位") - private String productUnit; - /** - * 包装数量 - */ - @ColumnWidth(20) - @ExcelProperty("包装数量") - private String packagingNumber; - /** - * 包装规格 - */ - @ColumnWidth(20) - @ExcelProperty("包装规格") - private String packagingSpecifications; +// /** +// * 物品编码 +// */ +// @ColumnWidth(20) +// @ExcelProperty("物品编码") +// private String productCode; +// /** +// * 物品单位 +// */ +// @ColumnWidth(20) +// @ExcelProperty("物品单位") +// private String productUnit; +// /** +// * 包装数量 +// */ +// @ColumnWidth(20) +// @ExcelProperty("包装数量") +// private String packagingNumber; +// /** +// * 包装规格 +// */ +// @ColumnWidth(20) +// @ExcelProperty("包装规格") +// private String packagingSpecifications; /** * 创建入库数量 */ diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/service/impl/WarehouseWarehousingEntryServiceImpl.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/service/impl/WarehouseWarehousingEntryServiceImpl.java index d677706be..df77db2fa 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/service/impl/WarehouseWarehousingEntryServiceImpl.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/service/impl/WarehouseWarehousingEntryServiceImpl.java @@ -593,13 +593,20 @@ public class WarehouseWarehousingEntryServiceImpl extends BaseServiceImpl { WarehouseWarehousingDetailEntity detail = new WarehouseWarehousingDetailEntity(); detail.setConditions("1"); - detail.setSku(i.getSku()); - detail.setProductCode(i.getProductCode().trim()); - detail.setProductName(i.getProductName().trim()); - detail.setProductCode(i.getProductCode().trim()); - detail.setProductUnit(i.getProductUnit().trim()); - detail.setPackagingNumber(i.getPackagingNumber().trim()); - detail.setPackagingSpecifications(i.getPackagingSpecifications()); + String materialName = i.getProductName().trim(); + BasicMaterialEntity entityByName = basicMaterialClient.findEntityByName(materialName); + if (!Objects.isNull(entityByName)){ + detail.setSku(entityByName.getSku()); + detail.setProductCode(entityByName.getProductCode()); + detail.setProductName(entityByName.getName()); + detail.setProductUnit(entityByName.getLogpmUnit()); + detail.setPackagingSpecifications(entityByName.getPackingSpecification()); + } +// detail.setProductCode(i.getProductCode().trim()); +// detail.setProductName(i.getProductName().trim()); +// detail.setProductUnit(i.getProductUnit().trim()); +// detail.setPackagingNumber(i.getPackagingNumber().trim()); +// detail.setPackagingSpecifications(i.getPackagingSpecifications()); detail.setCreateInventory(i.getCreateInventory()); detail.setWarehousingEntryId(entryEntity.getId()); detail.setActualReceipt(0); @@ -641,14 +648,14 @@ public class WarehouseWarehousingEntryServiceImpl extends BaseServiceImpl a.getProductCode().equals(detail.getProductCode()) && a.getProductName().equals(detail.getProductName()) && a.getSku().equals(detail.getSku())); diff --git a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/service/impl/WarehouseWaybillServiceImpl.java b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/service/impl/WarehouseWaybillServiceImpl.java index d7e0d35e0..0a3d9d9e2 100644 --- a/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/service/impl/WarehouseWaybillServiceImpl.java +++ b/blade-service/logpm-warehouse/src/main/java/com/logpm/warehouse/service/impl/WarehouseWaybillServiceImpl.java @@ -266,7 +266,7 @@ public class WarehouseWaybillServiceImpl extends BaseServiceImpl details = warehouseWayBillDetailService.findByWaybillId(waybillId); StringBuilder sb = new StringBuilder(); @@ -392,7 +392,7 @@ public class WarehouseWaybillServiceImpl extends BaseServiceImpl parcelListEntityList = distributionParcelListClient.findEntityListByOrderCode(orderCode, warehouseId); //把parcelListEntityList转化为firsts为key的Map Map parcelListEntityMap = parcelListEntityList.stream() - .collect(Collectors.toMap(DistributionParcelListEntity::getFirsts, parcelListEntity -> parcelListEntity)); + .collect(Collectors.toMap(DistributionParcelListEntity::getFirsts, parcelListEntity -> parcelListEntity)); Integer subNum = 0; @@ -463,7 +463,7 @@ public class WarehouseWaybillServiceImpl extends BaseServiceImpl pageList = baseMapper.pageList(page, waybillDTO); List records = pageList.getRecords(); - if(!records.isEmpty()){ + if (!records.isEmpty()) { //把records中的id取出作为一个集合 List ids = records.stream().map(WarehouseWaybillVO::getId).collect(Collectors.toList()); List wayBillDetailList = warehouseWayBillDetailService.findByWaybillIds(ids); @@ -776,10 +776,10 @@ public class WarehouseWaybillServiceImpl extends BaseServiceImpl> printBatch(String ids, String tempId) throws Exception { + public Map> printBatch(String ids, String tempId) throws Exception { - Map> stringListMap = new HashMap<>(); + Map> stringListMap = new HashMap<>(); BasicPrintTemplateEntity template = basicPrintTemplateClient.getPrintTemplate(tempId); String[] idArray = ids.split(","); @@ -814,13 +814,13 @@ public class WarehouseWaybillServiceImpl extends BaseServiceImpl list = baseMapper.exportWaybillList(waybillDTO); list.forEach(item -> { - item.setPayType(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_PAY_TYPE,item.getPayType())); - item.setPayWay(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_PAY_WAY,item.getPayWay())); - item.setDeliveryWay(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_DELIVERY_WAY,item.getDeliveryWay())); - item.setUrgency(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_URGENCY,item.getUrgency())); - item.setTransportType(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_TRANSPORT_TYPE,item.getTransportType())); - item.setPickupCompleteOrNotStr(item.getPickupCompleteOrNot() == 1?"是":"否"); - item.setTrunklineCompleteOrNotStr(item.getTrunklineCompleteOrNot() == 1?"是":"否"); + item.setPayType(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_PAY_TYPE, item.getPayType())); + item.setPayWay(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_PAY_WAY, item.getPayWay())); + item.setDeliveryWay(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_DELIVERY_WAY, item.getDeliveryWay())); + item.setUrgency(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_URGENCY, item.getUrgency())); + item.setTransportType(DictBizCache.getValue(DictBizConstant.OPEN_ORDER_TRANSPORT_TYPE, item.getTransportType())); + item.setPickupCompleteOrNotStr(item.getPickupCompleteOrNot() == 1 ? "是" : "否"); + item.setTrunklineCompleteOrNotStr(item.getTrunklineCompleteOrNot() == 1 ? "是" : "否"); item.setWaybillStatus(WaybillStatusEnum.getValue(item.getWaybillStatus())); - item.setFreezeStatusStr(item.getFreezeStatus() == 1?"是":"否"); - item.setAbolishStatusStr(item.getAbolishStatus() == 1?"是":"否"); + item.setFreezeStatusStr(item.getFreezeStatus() == 1 ? "是" : "否"); + item.setAbolishStatusStr(item.getAbolishStatus() == 1 ? "是" : "否"); }); return list; } - private PrintPreviewVO buildPrintWallet(WarehouseWaybillEntity warehouseWaybillEntity, List warehouseWayBillDetails, BasicPrintTemplateEntity template) throws Exception { + private PrintPreviewVO buildPrintWallet(WarehouseWaybillEntity warehouseWaybillEntity, List warehouseWayBillDetails, BasicPrintTemplateEntity template,int total,int num) throws Exception { PrintPreviewVO printPreviewVO = new PrintPreviewVO(); String html = TemplateUtil.getTemplateByUrl(template.getTemplateUrl()); @@ -920,14 +920,21 @@ public class WarehouseWaybillServiceImpl extends BaseServiceImpl> ls = new ArrayList<>(); - Integer sumNumber=0; + List> ls = new ArrayList<>(); + Integer sumNumber = 0; BigDecimal sumWEIGHT = new BigDecimal("0.00"); BigDecimal sumVOLUME = new BigDecimal("0.00"); for (WarehouseWayBillDetail warehouseWayBillDetail : warehouseWayBillDetails) { - Map t = new HashMap<>(); - t.put("货物名称",warehouseWayBillDetail.getProductName()); - t.put("件数",warehouseWayBillDetail.getNum()); + Map t = new HashMap<>(); + t.put("货物名称", warehouseWayBillDetail.getProductName()); + t.put("件数", warehouseWayBillDetail.getNum()); sumNumber = sumNumber + warehouseWayBillDetail.getNum(); - t.put("包装",""); - t.put("重量",warehouseWayBillDetail.getWeight()); + t.put("包装", ""); + t.put("重量", warehouseWayBillDetail.getWeight()); sumWEIGHT = sumWEIGHT.add(warehouseWayBillDetail.getWeight()); - t.put("体积",warehouseWayBillDetail.getVolume()); + t.put("体积", warehouseWayBillDetail.getVolume()); sumVOLUME = sumVOLUME.add(warehouseWayBillDetail.getVolume()); ls.add(t); } map.put("货物明细", ls); // 增加合计 - map.put("合计件数",sumNumber); - map.put("合计重量",formatToTwoDecimalPlaces(sumWEIGHT)); - map.put("合计体积",formatToTwoDecimalPlaces(sumVOLUME)); - + map.put("合计件数", sumNumber); + map.put("合计重量", formatToTwoDecimalPlaces(sumWEIGHT)); + map.put("合计体积", formatToTwoDecimalPlaces(sumVOLUME)); + map.put("t", total+1); + map.put("n", num+1); String popHtml = TemplateUtil.popTemplate("运单", map, html); @@ -990,7 +998,7 @@ public class WarehouseWaybillServiceImpl extends BaseServiceImpl