|
|
@@ -0,0 +1,346 @@
|
|
|
+package com.sckw.product.service.operation;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.sckw.core.common.enums.enums.DictEnum;
|
|
|
+import com.sckw.core.common.enums.enums.DictTypeEnum;
|
|
|
+import com.sckw.core.exception.BusinessException;
|
|
|
+import com.sckw.core.model.constant.Global;
|
|
|
+import com.sckw.core.model.page.PageResult;
|
|
|
+import com.sckw.core.model.vo.TableBottom;
|
|
|
+import com.sckw.core.model.vo.TableStatisticRes;
|
|
|
+import com.sckw.core.model.vo.TableTop;
|
|
|
+import com.sckw.core.utils.*;
|
|
|
+import com.sckw.excel.utils.DateUtil;
|
|
|
+import com.sckw.payment.api.dubbo.PayCenterDubboService;
|
|
|
+import com.sckw.product.dao.KwpGoodsMapper;
|
|
|
+import com.sckw.product.enums.GoodsStatusEnum;
|
|
|
+import com.sckw.product.model.*;
|
|
|
+import com.sckw.product.model.vo.req.*;
|
|
|
+import com.sckw.product.model.vo.res.*;
|
|
|
+import com.sckw.product.service.*;
|
|
|
+import com.sckw.system.api.RemoteSystemService;
|
|
|
+import com.sckw.system.api.RemoteUserService;
|
|
|
+import com.sckw.system.api.model.dto.res.EntCacheResDto;
|
|
|
+import com.sckw.system.api.model.dto.res.KwsUserResDto;
|
|
|
+import com.sckw.system.api.model.dto.res.SysDictResDto;
|
|
|
+import com.sckw.system.api.model.dto.res.UserCacheResDto;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.cloud.stream.function.StreamBridge;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @desc: 商品service
|
|
|
+ * @author: yzc
|
|
|
+ * @date: 2023-06-25 14:47
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class GoodsManagerService {
|
|
|
+
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false)
|
|
|
+ private RemoteSystemService remoteSystemService;
|
|
|
+
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false)
|
|
|
+ private RemoteUserService remoteUserService;
|
|
|
+
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false)
|
|
|
+ private PayCenterDubboService payCenterDubboService;
|
|
|
+
|
|
|
+ private final KwpGoodsMapper kwpGoodsMapper;
|
|
|
+ private final KwpGoodsAddressService kwpGoodsAddressService;
|
|
|
+ private final KwpGoodsAttributeService kwpGoodsAttributeService;
|
|
|
+ private final KwpGoodsImageService kwpGoodsImageService;
|
|
|
+ private final KwpGoodsPriceRangeService kwpGoodsPriceRangeService;
|
|
|
+ private final StreamBridge streamBridge;
|
|
|
+
|
|
|
+ @Value("${goods.url.list}")
|
|
|
+ private String goodsListUrl;
|
|
|
+
|
|
|
+
|
|
|
+ public PageResult select(SelectOperationGoodsListParam params) {
|
|
|
+ LambdaQueryWrapper<KwpGoods> wrapper = buildWrapper(BeanUtils.copyProperties(params, ExportStatisticGoodsListParam.class));
|
|
|
+ Page<KwpGoods> page = new Page<>(params.getPage(), params.getPageSize());
|
|
|
+ IPage<KwpGoods> goodsIpage = kwpGoodsMapper.selectPage(page, wrapper);
|
|
|
+ List<KwpGoods> list = goodsIpage.getRecords();
|
|
|
+ if (CollectionUtils.isEmpty(list)) {
|
|
|
+ return PageResult.build(params.getPage(), params.getPageSize(), goodsIpage.getTotal(), Collections.emptyList());
|
|
|
+ }
|
|
|
+ List<GoodsList> result = buildGoodLists(list);
|
|
|
+ return PageResult.build(params.getPage(), params.getPageSize(), goodsIpage.getTotal(), result);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @desc: 构建查询条件
|
|
|
+ * @author: lt
|
|
|
+ * @date: 2023-09-14 10:14
|
|
|
+ * @Param list:
|
|
|
+ * @return: java.util.List<com.sckw.product.model.vo.res.GoodsList>
|
|
|
+ */
|
|
|
+ private LambdaQueryWrapper<KwpGoods> buildWrapper(ExportStatisticGoodsListParam params) {
|
|
|
+ LambdaQueryWrapper<KwpGoods> wrapper = new LambdaQueryWrapper<>();
|
|
|
+ if (StringUtils.isNotBlank(params.getIds())) {
|
|
|
+ List<Long> ids = StringUtils.splitStrToList(params.getIds(), ",", Long.class);
|
|
|
+ wrapper.in(KwpGoods::getId, ids);
|
|
|
+ } else {
|
|
|
+ if (Objects.nonNull(params.getEndCreateTime())) {
|
|
|
+ wrapper.ge(KwpGoods::getCreateTime, params.getStartCreateTime());
|
|
|
+ }
|
|
|
+ if (Objects.nonNull(params.getEndCreateTime())) {
|
|
|
+ wrapper.le(KwpGoods::getCreateTime, params.getEndCreateTime());
|
|
|
+ }
|
|
|
+ wrapper.eq(Objects.nonNull(params.getSupplyEntId()), KwpGoods::getSupplyEntId, params.getSupplyEntId())
|
|
|
+ .eq(Objects.nonNull(params.getPrepaidLimit()), KwpGoods::getPrepaidLimit, params.getPrepaidLimit())
|
|
|
+ .eq(Objects.nonNull(params.getStatus()), KwpGoods::getStatus, params.getStatus());
|
|
|
+ if (StringUtils.isNotBlank(params.getGoodsType()) && StringUtils.isNotBlank(params.getGoodsTypeValue())) {
|
|
|
+ List<SysDictResDto> goodsTypeList = remoteSystemService.queryDictBottom(params.getGoodsType(), params.getGoodsTypeValue());
|
|
|
+ if (CollectionUtils.isNotEmpty(goodsTypeList)) {
|
|
|
+ List<String> goodsTypes = goodsTypeList.stream().map(SysDictResDto::getValue).toList();
|
|
|
+ wrapper.in(KwpGoods::getGoodsType, goodsTypes);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String keywords = params.getKeywords();
|
|
|
+ if (StringUtils.isNotBlank(keywords)) {
|
|
|
+ //模糊匹配商品名称、仓储地址、客户经理
|
|
|
+ List<KwsUserResDto> managers = remoteUserService.getUserByName(keywords);
|
|
|
+ if (CollectionUtils.isEmpty(managers)) {
|
|
|
+ wrapper.and(e -> e.like(KwpGoods::getName, keywords).or().like(KwpGoods::getAddressName, keywords));
|
|
|
+ } else {
|
|
|
+ List<Long> managerIds = managers.stream().map(KwsUserResDto::getId).toList();
|
|
|
+ wrapper.and(e -> e.like(KwpGoods::getName, keywords).or().like(KwpGoods::getAddressName, keywords)
|
|
|
+ .or().in(KwpGoods::getManager, managerIds));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ wrapper.eq(KwpGoods::getDelFlag, Global.NO).orderByDesc(KwpGoods::getCreateTime);
|
|
|
+ return wrapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @desc: 构建商品列表
|
|
|
+ * @author: lt
|
|
|
+ * @date: 2023-09-14 10:14
|
|
|
+ * @Param list:
|
|
|
+ * @return: java.util.List<com.sckw.product.model.vo.res.GoodsList>
|
|
|
+ */
|
|
|
+ private List<GoodsList> buildGoodLists(List<KwpGoods> list) {
|
|
|
+ List<GoodsList> result = new ArrayList<>(list.size());
|
|
|
+ List<Long> goodsIds = new ArrayList<>(list.size());
|
|
|
+ List<Long> supplyEntIds = new ArrayList<>(list.size());
|
|
|
+ List<Long> userIds = new ArrayList<>();
|
|
|
+ list.forEach(e -> {
|
|
|
+ goodsIds.add(e.getId());
|
|
|
+ if (Objects.nonNull(e.getSupplyEntId())) {
|
|
|
+ supplyEntIds.add(e.getSupplyEntId());
|
|
|
+ }
|
|
|
+ if (Objects.nonNull(e.getManager())) {
|
|
|
+ userIds.add(e.getManager());
|
|
|
+ }
|
|
|
+ if (Objects.nonNull(e.getCreateBy())) {
|
|
|
+ userIds.add(e.getCreateBy());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ //地址信息
|
|
|
+ Map<Long, String> addressMap = kwpGoodsAddressService.getByGoodsIds(goodsIds).stream()
|
|
|
+ .collect(Collectors.toMap(KwpGoodsAddress::getGoodsId, KwpGoodsAddress::getName, (k1, k2) -> k1));
|
|
|
+ //价格梯度信息
|
|
|
+ Map<Long, List<KwpGoodsPriceRange>> priceRangeMap = kwpGoodsPriceRangeService.getByGoodsIds(goodsIds).stream()
|
|
|
+ .collect(Collectors.groupingBy(KwpGoodsPriceRange::getGoodsId));
|
|
|
+ //用户信息
|
|
|
+ Map<Long, UserCacheResDto> userMap = remoteSystemService.queryUserCacheMapByIds(userIds);
|
|
|
+ //供应企业信息
|
|
|
+ List<EntCacheResDto> entList = new ArrayList<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(supplyEntIds)) {
|
|
|
+ entList = remoteSystemService.queryEntCacheByIds(supplyEntIds);
|
|
|
+ }
|
|
|
+ Map<Long, String> entMap = entList.stream().collect(Collectors.toMap(EntCacheResDto::getId, EntCacheResDto::getFirmName, (k1, k2) -> k1));
|
|
|
+ list.forEach(e -> {
|
|
|
+ Long id = e.getId();
|
|
|
+ GoodsList goodsList = BeanUtils.copyProperties(e, GoodsList.class);
|
|
|
+ UserCacheResDto manager = userMap.get(e.getManager());
|
|
|
+ UserCacheResDto createUser = userMap.get(e.getCreateBy());
|
|
|
+ goodsList.setStatusLabel(DictEnum.getLabel(DictTypeEnum.GOODS_STATUS.getType(), String.valueOf(goodsList.getStatus())))
|
|
|
+ .setGoodsTypeLabel(DictEnum.getLabel(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), goodsList.getGoodsType()))
|
|
|
+ .setUnitLabel(DictEnum.getLabel(DictTypeEnum.UNIT_TYPE.getType(), goodsList.getUnit()))
|
|
|
+ .setTaxRateLabel(DictEnum.getLabel(DictTypeEnum.TAX_RATE.getType(), goodsList.getTaxRate()))
|
|
|
+ .setPrepaidLimitLabel(Objects.equals(e.getPrepaidLimit(), 1) ? "是" : "否")
|
|
|
+ .setAddress(addressMap.get(id)).setSupplyEnt(entMap.get(e.getSupplyEntId()))
|
|
|
+ .setManageName(Objects.nonNull(manager) ? manager.getName() : null)
|
|
|
+ .setPhone(Objects.nonNull(manager) ? manager.getPhone() : null)
|
|
|
+ .setCreateByName(Objects.nonNull(createUser) ? createUser.getName() : null);
|
|
|
+ List<KwpGoodsPriceRange> priceRanges = priceRangeMap.get(id);
|
|
|
+ if (CollectionUtils.isNotEmpty(priceRanges)) {
|
|
|
+ goodsList.setHighestPrice(priceRanges.get(priceRanges.size() - 1).getPrice()).setLowestPrice(priceRanges.get(0).getPrice());
|
|
|
+ }
|
|
|
+ result.add(goodsList);
|
|
|
+ });
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @desc: 获取商品详情
|
|
|
+ * @author: lt
|
|
|
+ * @date: 2023-09-14 14:28
|
|
|
+ * @Param id:
|
|
|
+ * @return: com.sckw.product.model.vo.res.GoodsDetail
|
|
|
+ */
|
|
|
+ public OperationGoodsDetail getDetail(Long id) {
|
|
|
+ OperationGoodsDetail detail = detail(id);
|
|
|
+ LambdaQueryWrapper<KwpGoods> wrapper = new LambdaQueryWrapper<>();
|
|
|
+ wrapper.eq(KwpGoods::getGoodsType, detail.getGoodsType()).eq(KwpGoods::getStatus, GoodsStatusEnum.PUT_ON_SHELVES.getCode())
|
|
|
+ .eq(KwpGoods::getDelFlag, Global.NO).ne(KwpGoods::getId, id).last("LIMIT 4");
|
|
|
+ List<KwpGoods> list = kwpGoodsMapper.selectList(wrapper);
|
|
|
+ if (CollectionUtils.isEmpty(list)) {
|
|
|
+ return detail;
|
|
|
+ }
|
|
|
+ List<Long> goodsIds = list.stream().map(KwpGoods::getId).toList();
|
|
|
+ Map<Long, List<KwpGoodsPriceRange>> map = kwpGoodsPriceRangeService.getByGoodsIds(goodsIds).stream()
|
|
|
+ .collect(Collectors.groupingBy(KwpGoodsPriceRange::getGoodsId));
|
|
|
+ List<RecommendGoods> recommendGoodsList = new ArrayList<>();
|
|
|
+ list.forEach(e -> {
|
|
|
+ RecommendGoods recommendGoods = BeanUtils.copyProperties(e, RecommendGoods.class);
|
|
|
+ List<KwpGoodsPriceRange> prices = map.get(recommendGoods.getId());
|
|
|
+ recommendGoods.setUnitLabel(DictEnum.getLabel(DictTypeEnum.UNIT_TYPE.getType(), recommendGoods.getUnit()))
|
|
|
+ .setPrice(CollectionUtils.isNotEmpty(prices) ? prices.get(0).getPrice() : null);
|
|
|
+ recommendGoodsList.add(recommendGoods);
|
|
|
+ });
|
|
|
+ detail.setRecommendGoodsList(recommendGoodsList);
|
|
|
+ return detail;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @desc: 获取商品详情
|
|
|
+ * @author: lt
|
|
|
+ * @date: 2023-09-14 14:20
|
|
|
+ * @Param id:
|
|
|
+ * @return: com.sckw.product.model.vo.res.GoodsDetail
|
|
|
+ */
|
|
|
+ public OperationGoodsDetail detail(Long id) {
|
|
|
+ KwpGoods goods = kwpGoodsMapper.selectById(id);
|
|
|
+ if (Objects.isNull(goods)) {
|
|
|
+ throw new BusinessException("当前商品不存在!");
|
|
|
+ }
|
|
|
+ OperationGoodsDetail detail = BeanUtils.copyProperties(goods, OperationGoodsDetail.class);
|
|
|
+ Map<Long, EntCacheResDto> entMap = remoteSystemService.queryEntCacheMapByIds(Arrays.asList(detail.getEntId(), detail.getSupplyEntId()));
|
|
|
+ EntCacheResDto ent = entMap.get(detail.getEntId());
|
|
|
+ if (Objects.nonNull(ent)) {
|
|
|
+ detail.setEnt(ent.getFirmName()).setEntHead(ent.getHead())
|
|
|
+ .setEntBusiness(ent.getBusiness()).setEntAddress(ent.getCityName());
|
|
|
+ }
|
|
|
+ EntCacheResDto supplyEnt = entMap.get(detail.getSupplyEntId());
|
|
|
+ if (Objects.nonNull(supplyEnt)) {
|
|
|
+ detail.setSupplyEnt(supplyEnt.getFirmName());
|
|
|
+ }
|
|
|
+ UserCacheResDto managerInfo = remoteSystemService.queryUserCacheById(detail.getManager());
|
|
|
+ if (Objects.nonNull(managerInfo)) {
|
|
|
+ detail.setManagerName(managerInfo.getName()).setManagerPhone(managerInfo.getPhone());
|
|
|
+ }
|
|
|
+ detail.setGoodsTypeLabel(DictEnum.getLabel(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), detail.getGoodsType()))
|
|
|
+ .setUnitLabel(DictEnum.getLabel(DictTypeEnum.UNIT_TYPE.getType(), detail.getUnit()))
|
|
|
+ .setTaxRateLabel(DictEnum.getLabel(DictTypeEnum.TAX_RATE.getType(), detail.getTaxRate()))
|
|
|
+ .setStatusLabel(DictEnum.getLabel(DictTypeEnum.GOODS_STATUS.getType(), String.valueOf(detail.getStatus())))
|
|
|
+ .setPrepaidLimitLabel(Objects.equals(detail.getPrepaidLimit(), 1) ? "是" : "否");
|
|
|
+ //商品图片信息
|
|
|
+ List<KwpGoodsImage> goodsImages = kwpGoodsImageService.getByGoodsId(id);
|
|
|
+ List<GoodsImagesDetail> images = BeanUtils.copyToList(goodsImages, GoodsImagesDetail.class);
|
|
|
+ //商品价格段信息
|
|
|
+ List<KwpGoodsPriceRange> priceRanges = kwpGoodsPriceRangeService.getByGoodsId(id);
|
|
|
+ List<GoodsPriceRangesDetail> ranges = BeanUtils.copyToList(priceRanges, GoodsPriceRangesDetail.class);
|
|
|
+ ranges.stream().filter(r -> r.getEndAmount().compareTo(new BigDecimal("-1.00")) == 0)
|
|
|
+ .forEach(r -> {
|
|
|
+ r.setEndAmountLabel("不限");
|
|
|
+ });
|
|
|
+ //商品属性信息
|
|
|
+ List<KwpGoodsAttribute> attributesList = kwpGoodsAttributeService.getByGoodsId(id);
|
|
|
+ List<GoodsAttributesDetail> attributes = BeanUtils.copyToList(attributesList, GoodsAttributesDetail.class);
|
|
|
+ //商品地址信息
|
|
|
+ KwpGoodsAddress goodsAddress = kwpGoodsAddressService.getByGoodsId(id);
|
|
|
+ AddressInfoDetail addressInfo = BeanUtils.copyProperties(goodsAddress, AddressInfoDetail.class);
|
|
|
+ if (Objects.nonNull(addressInfo)) {
|
|
|
+ addressInfo.setTypeName(DictEnum.getLabel(DictTypeEnum.ADDRESS_TYPE.getType(), addressInfo.getType()));
|
|
|
+ }
|
|
|
+ detail.setImages(images).setPriceRanges(ranges).setAttributes(attributes).setAddressInfo(addressInfo);
|
|
|
+
|
|
|
+ return detail;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @desc: 统计查询
|
|
|
+ * @author: lt
|
|
|
+ * @date: 2023-09-14 14:44
|
|
|
+ * @Param params:
|
|
|
+ * @return: com.sckw.core.model.vo.TableStatisticRes
|
|
|
+ */
|
|
|
+ public TableStatisticRes statistic(SelectOperationGoodsListParam params) {
|
|
|
+ TableStatisticRes res = new TableStatisticRes();
|
|
|
+ LambdaQueryWrapper<KwpGoods> wrapper = buildWrapper(BeanUtils.copyProperties(params, ExportStatisticGoodsListParam.class));
|
|
|
+ List<KwpGoods> goodsList = kwpGoodsMapper.selectList(wrapper);
|
|
|
+ Map<Integer, List<KwpGoods>> map = goodsList.stream().collect(Collectors.groupingBy(KwpGoods::getStatus));
|
|
|
+ List<TableTop> tableTops = new ArrayList<>();
|
|
|
+ TableTop all = new TableTop();
|
|
|
+ all.setName("全部").setTotal(CollectionUtils.isEmpty(goodsList) ? 0 : goodsList.size());
|
|
|
+ tableTops.add(all);
|
|
|
+ GoodsStatusEnum.getSortList().forEach(e -> {
|
|
|
+ List<KwpGoods> list = map.get(e.getCode());
|
|
|
+ int total = CollectionUtils.isEmpty(list) ? 0 : list.size();
|
|
|
+ TableTop tableTop = new TableTop();
|
|
|
+ tableTop.setName(e.getMsg()).setValue(e.getCode()).setTotal(total);
|
|
|
+ tableTops.add(tableTop);
|
|
|
+ });
|
|
|
+ TableBottom tableBottom = new TableBottom();
|
|
|
+ tableBottom.setTotal(CollectionUtils.isEmpty(goodsList) ? 0 : goodsList.size());
|
|
|
+ res.setTableTops(tableTops).setTableBottom(tableBottom);
|
|
|
+ return res;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @desc: 导出
|
|
|
+ * @author: yzc
|
|
|
+ * @date: 2023-07-06 9:07
|
|
|
+ * @Param params:
|
|
|
+ * @return: void
|
|
|
+ */
|
|
|
+ public List<GoodsListExport> export(ExportStatisticGoodsListParam params) {
|
|
|
+ LambdaQueryWrapper<KwpGoods> wrapper = buildWrapper(params);
|
|
|
+ List<KwpGoods> list = kwpGoodsMapper.selectList(wrapper);
|
|
|
+ List<GoodsList> goodsLists = buildGoodLists(list);
|
|
|
+ if (CollectionUtils.isEmpty(goodsLists)) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ List<GoodsListExport> result = new ArrayList<>();
|
|
|
+ AtomicInteger i = new AtomicInteger(1);
|
|
|
+ goodsLists.forEach(e -> {
|
|
|
+ GoodsListExport export = BeanUtils.copyProperties(e, GoodsListExport.class);
|
|
|
+ export.setSerialNumber(String.valueOf(i.getAndIncrement()))
|
|
|
+ .setAmount(Objects.isNull(e.getAmount()) ? null : String.valueOf(e.getAmount()))
|
|
|
+ .setHighestPrice(Objects.isNull(e.getHighestPrice()) ? null : String.valueOf(e.getHighestPrice()))
|
|
|
+ .setLowestPrice(Objects.isNull(e.getLowestPrice()) ? null : String.valueOf(e.getLowestPrice()))
|
|
|
+ .setAddedTime(Objects.isNull(e.getAddedTime()) ? null : DateUtil.getDateTime(e.getAddedTime()))
|
|
|
+ .setShelfTime(Objects.isNull(e.getShelfTime()) ? null : DateUtil.getDateTime(e.getShelfTime()))
|
|
|
+ .setCreateTime(Objects.isNull(e.getCreateTime()) ? null : DateUtil.getDateTime(e.getCreateTime()));
|
|
|
+ result.add(export);
|
|
|
+ });
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|