|
@@ -1,5 +1,6 @@
|
|
|
package com.sd.business.service.order.impl;
|
|
|
|
|
|
+import cn.hutool.core.convert.Convert;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
|
|
@@ -7,17 +8,27 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.fjhx.file.utils.ObsFileUtil;
|
|
|
+import com.fjhx.flow.enums.FlowStatusEnum;
|
|
|
import com.ruoyi.common.constant.StatusConstant;
|
|
|
import com.ruoyi.common.core.domain.BaseIdPo;
|
|
|
import com.ruoyi.common.exception.ServiceException;
|
|
|
import com.ruoyi.common.utils.SecurityUtils;
|
|
|
+import com.ruoyi.system.service.ISysRoleService;
|
|
|
+import com.ruoyi.system.service.ISysUserService;
|
|
|
import com.sd.business.entity.bom.bo.BomSpecBo;
|
|
|
+import com.sd.business.entity.bom.po.Bom;
|
|
|
+import com.sd.business.entity.bom.po.BomSpec;
|
|
|
+import com.sd.business.entity.department.po.Department;
|
|
|
import com.sd.business.entity.in.dto.InOutStorageDto;
|
|
|
import com.sd.business.entity.in.emums.InDetailTypeEnum;
|
|
|
import com.sd.business.entity.in.emums.InOutTypeEnum;
|
|
|
import com.sd.business.entity.in.po.InOutStorageBom;
|
|
|
import com.sd.business.entity.order.dto.OrderInfoDto;
|
|
|
import com.sd.business.entity.order.dto.OrderInfoSelectDto;
|
|
|
+import com.sd.business.entity.order.dto.OrderPackageBomDto;
|
|
|
+import com.sd.business.entity.order.dto.OrderSkuDto;
|
|
|
+import com.sd.business.entity.order.enums.OrderClassifyEnum;
|
|
|
+import com.sd.business.entity.order.enums.OrderExceptionTypeEnum;
|
|
|
import com.sd.business.entity.order.enums.OrderStatusEnum;
|
|
|
import com.sd.business.entity.order.po.OrderInfo;
|
|
|
import com.sd.business.entity.order.po.OrderPackageBom;
|
|
@@ -25,7 +36,11 @@ import com.sd.business.entity.order.po.OrderSku;
|
|
|
import com.sd.business.entity.order.po.OrderSkuBom;
|
|
|
import com.sd.business.entity.order.po.OrderSkuProductionCost;
|
|
|
import com.sd.business.entity.order.vo.OrderInfoVo;
|
|
|
+import com.sd.business.entity.order.vo.OrderPackageBomVo;
|
|
|
+import com.sd.business.entity.order.vo.OrderSkuBomVo;
|
|
|
+import com.sd.business.entity.order.vo.OrderSkuVo;
|
|
|
import com.sd.business.entity.production.po.ProductionWorkOrder;
|
|
|
+import com.sd.business.entity.sku.po.SkuSpec;
|
|
|
import com.sd.business.entity.warehouse.constant.WarehouseConstant;
|
|
|
import com.sd.business.mapper.order.OrderInfoMapper;
|
|
|
import com.sd.business.service.bom.BomSpecService;
|
|
@@ -40,12 +55,19 @@ import com.sd.business.service.order.OrderSkuService;
|
|
|
import com.sd.business.service.production.ProductionWorkOrderService;
|
|
|
import com.sd.framework.util.Assert;
|
|
|
import com.sd.framework.util.sql.Sql;
|
|
|
+import com.sd.framework.util.sql.Where;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.Set;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -88,14 +110,73 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
@Autowired
|
|
|
private InventoryFinishedService inventoryFinishedService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ISysUserService sysUserService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ISysRoleService roleService;
|
|
|
+
|
|
|
@Override
|
|
|
public Page<OrderInfoVo> getPage(OrderInfoSelectDto dto) {
|
|
|
|
|
|
- Page<OrderInfoVo> page = Sql.create(OrderInfoVo.class)
|
|
|
+ Where<OrderInfoVo> sql = Sql.create(OrderInfoVo.class)
|
|
|
.selectAll(OrderInfo.class)
|
|
|
+ .selectAs(Department::getName, OrderInfoVo::getDepartmentName)
|
|
|
.from(OrderInfo.class)
|
|
|
+ .leftJoin(Department.class, OrderInfo::getDepartmentId)
|
|
|
+
|
|
|
+ .orderByDesc("if(t1.status = 60, 1, 0)")
|
|
|
.orderByDesc(OrderInfo::getId)
|
|
|
- .page(dto);
|
|
|
+ .eq(OrderInfo::getStatus, dto.getStatus())
|
|
|
+ .eq(OrderInfo::getSettlementStatus, dto.getSettlementStatus())
|
|
|
+ .eq(OrderInfo::getFlowStatus, dto.getFlowStatus())
|
|
|
+ .like(OrderInfo::getCode, dto.getCode())
|
|
|
+ .like(OrderInfo::getWlnCode, dto.getWlnCode())
|
|
|
+ .ge(OrderInfo::getWlnCreateTime, dto.getBeginTime())
|
|
|
+ .le(OrderInfo::getWlnCreateTime, dto.getEndTime())
|
|
|
+ .findInSet(OrderInfo::getExceptionType, dto.getExceptionType())
|
|
|
+ .eq(Department::getId, dto.getDepartmentId())
|
|
|
+ .like(Department::getName, dto.getDepartmentName());
|
|
|
+
|
|
|
+ List<Long> detpIdList = sysUserService.getDetpIdListByUserId(SecurityUtils.getUserId());
|
|
|
+ if (!detpIdList.isEmpty()) {
|
|
|
+ sql.in(OrderInfo::getDepartmentId, detpIdList);
|
|
|
+ sql.eq(OrderInfo::getCreateUser, SecurityUtils.getUserId());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StatusConstant.YES.equals(dto.getLinkedStatementOfAccount())) {
|
|
|
+ sql.isNotNull(OrderInfo::getStatementOfAccountId);
|
|
|
+ sql.in(OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey(), OrderStatusEnum.HAVE_BEEN_SHIPPED.getKey());
|
|
|
+ } else if (StatusConstant.NO.equals(dto.getLinkedStatementOfAccount())) {
|
|
|
+ sql.isNull(OrderInfo::getStatementOfAccountId);
|
|
|
+ sql.in(OrderInfo::getStatus, OrderStatusEnum.COMPLETION_PRODUCTION.getKey(), OrderStatusEnum.HAVE_BEEN_SHIPPED.getKey());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StatusConstant.YES.equals(dto.getException())) {
|
|
|
+ sql.ne(OrderInfo::getExceptionType, StatusConstant.NO);
|
|
|
+ } else if (StatusConstant.NO.equals(dto.getException())) {
|
|
|
+ sql.eq(OrderInfo::getExceptionType, StatusConstant.NO);
|
|
|
+ }
|
|
|
+
|
|
|
+ Page<OrderInfoVo> page = sql.page(dto);
|
|
|
+ List<OrderInfoVo> records = page.getRecords();
|
|
|
+
|
|
|
+ if (records.isEmpty()) {
|
|
|
+ return page;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (OrderInfoVo record : records) {
|
|
|
+ // 设置异常提示
|
|
|
+ String exceptionType = record.getExceptionType();
|
|
|
+ if (exceptionType.equals("0")) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String exceptionTypeDetail = Arrays.stream(exceptionType.split(","))
|
|
|
+ .map(Convert::toInt)
|
|
|
+ .map(OrderExceptionTypeEnum::getEnumValue)
|
|
|
+ .collect(Collectors.joining(","));
|
|
|
+ record.setExceptionTypeDetail(exceptionTypeDetail);
|
|
|
+ }
|
|
|
|
|
|
return page;
|
|
|
}
|
|
@@ -105,18 +186,195 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
|
|
|
OrderInfoVo vo = Sql.create(OrderInfoVo.class)
|
|
|
.selectAll(OrderInfo.class)
|
|
|
+ .selectAs(Department::getName, OrderInfoVo::getDepartmentName)
|
|
|
.from(OrderInfo.class)
|
|
|
+ .leftJoin(Department.class, OrderInfo::getDepartmentId)
|
|
|
.eq(OrderInfo::getId, id)
|
|
|
.one();
|
|
|
|
|
|
- Assert.notNull(vo, "未知数据");
|
|
|
+ Assert.notNull(vo, "未知订单");
|
|
|
+
|
|
|
+ // 订单sku列表
|
|
|
+ List<OrderSkuVo> orderSkuList = Sql.create(OrderSkuVo.class)
|
|
|
+ .selectAll(OrderSku.class)
|
|
|
+ .selectAs(SkuSpec::getCode, OrderSkuVo::getSkuSpecCode)
|
|
|
+ .selectAs(SkuSpec::getName, OrderSkuVo::getSkuSpecName)
|
|
|
+ .selectAs(BomSpec::getCode, OrderSkuVo::getBomSpecCode)
|
|
|
+ .selectAs(BomSpec::getName, OrderSkuVo::getBomSpecName)
|
|
|
+ .from(OrderSku.class)
|
|
|
+ .leftJoin(SkuSpec.class, OrderSku::getSkuSpecId)
|
|
|
+ .leftJoin(BomSpec.class, OrderSku::getBomSpecId)
|
|
|
+ .eq(OrderSku::getOrderId, id)
|
|
|
+ .list();
|
|
|
+
|
|
|
+ // 包材配件/单品
|
|
|
+ List<OrderSkuBomVo> orderSkuBomList = Sql.create(OrderSkuBomVo.class)
|
|
|
+ .selectAll(OrderSkuBom.class)
|
|
|
+ .selectAs(BomSpec::getCode, OrderSkuBomVo::getBomSpecCode)
|
|
|
+ .selectAs(BomSpec::getName, OrderSkuBomVo::getBomSpecName)
|
|
|
+ .selectAs(Bom::getBomClassifyId, OrderSkuBomVo::getBomClassifyId)
|
|
|
+ .from(OrderSkuBom.class)
|
|
|
+ .leftJoin(BomSpec.class, OrderSkuBom::getBomSpecId)
|
|
|
+ .leftJoin(Bom.class, BomSpec::getBomId)
|
|
|
+ .eq(OrderSkuBom::getOrderId, id)
|
|
|
+ .list();
|
|
|
+
|
|
|
+ // 包装明细
|
|
|
+ List<OrderPackageBomVo> orderPackageBomList = Sql.create(OrderPackageBomVo.class)
|
|
|
+ .selectAll(OrderPackageBom.class)
|
|
|
+ .selectAs(BomSpec::getCode, OrderPackageBomVo::getBomSpecCode)
|
|
|
+ .selectAs(BomSpec::getName, OrderPackageBomVo::getBomSpecName)
|
|
|
+ .from(OrderPackageBom.class)
|
|
|
+ .leftJoin(BomSpec.class, OrderPackageBom::getBomSpecId)
|
|
|
+ .eq(OrderPackageBom::getOrderId, id)
|
|
|
+ .list();
|
|
|
+
|
|
|
+ // 赋值
|
|
|
+ Map<Long, List<OrderSkuBomVo>> map = orderSkuBomList.stream().collect(Collectors.groupingBy(OrderSkuBomVo::getOrderSkuId));
|
|
|
+ orderSkuList.forEach(item -> item.setOrderSkuBomList(map.getOrDefault(item.getId(), Collections.emptyList())));
|
|
|
+ vo.setOrderSkuList(orderSkuList);
|
|
|
+ vo.setOrderPackageBomList(orderPackageBomList);
|
|
|
|
|
|
return vo;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void add(OrderInfoDto dto) {
|
|
|
- save(dto);
|
|
|
+ List<OrderSkuDto> orderSkuList = dto.getOrderSkuList();
|
|
|
+ if (ObjectUtil.equal(dto.getStatus(), OrderStatusEnum.STOCK_PREPARATION.getKey())
|
|
|
+ && ObjectUtil.notEqual(dto.getType(), 2)) {
|
|
|
+ // 先判断成品是否能锁定
|
|
|
+ if (inventoryFinishedService.lockNoSourceStorage(orderSkuList)) {
|
|
|
+ dto.setStockType(StatusConstant.YES);
|
|
|
+ } else {
|
|
|
+ lockStorage(orderSkuList);
|
|
|
+ dto.setStockType(StatusConstant.NO);
|
|
|
+ }
|
|
|
+ dto.setLockStorage(StatusConstant.YES);
|
|
|
+ } else {
|
|
|
+ dto.setLockStorage(StatusConstant.NO);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新增订单
|
|
|
+ dto.setSource(1);
|
|
|
+ dto.setCode("PI" + new Date().getTime());
|
|
|
+ dto.setSettlementStatus(1);
|
|
|
+ dto.setTaxRate(new BigDecimal("10.00"));
|
|
|
+ dto.setTag("0");
|
|
|
+ dto.setExceptionType(OrderExceptionTypeEnum.NORMAL.getKey().toString());
|
|
|
+ if (Objects.equals(dto.getType(), 2)) {
|
|
|
+ dto.setClassify(OrderClassifyEnum.OUTSOURCE_ORDER.getKey());
|
|
|
+ } else if (Objects.equals(dto.getType(), 1)) {
|
|
|
+ // 拥有采购角色的账号创建的自主订单为采购订单
|
|
|
+ Long userId = SecurityUtils.getUserId();
|
|
|
+ Set<String> roleKeys = roleService.selectRolePermissionByUserId(userId);
|
|
|
+ if (!Collections.disjoint(roleKeys, Arrays.asList("sypurchasing", "purchasingOfficer", "bzpurchasing"))) {
|
|
|
+ dto.setClassify(OrderClassifyEnum.PURCHASE_ORDER.getKey());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 委外订单修改金额
|
|
|
+ if (ObjectUtil.equals(dto.getType(), 2)) {
|
|
|
+ dto.setProductTotalAmount(BigDecimal.ZERO);
|
|
|
+ dto.setDeliveryMaterialsFee(BigDecimal.ZERO);
|
|
|
+ dto.setManagementFee(BigDecimal.ZERO);
|
|
|
+ dto.setPackingLabor(dto.getPackingLabor().multiply(new BigDecimal(2)));
|
|
|
+ dto.setTotalAmount(dto.getProductTotalAmount()
|
|
|
+ .add(dto.getCustomProcessingFee())
|
|
|
+ .add(dto.getLssueFee())
|
|
|
+ .add(dto.getDeliveryMaterialsFee())
|
|
|
+ .add(dto.getPackingLabor())
|
|
|
+ .add(dto.getPackagingMaterialCost())
|
|
|
+ .add(dto.getManagementFee()));
|
|
|
+ }
|
|
|
+ this.save(dto);
|
|
|
+
|
|
|
+ // 新增订单产品包材配件
|
|
|
+ List<OrderSku> tempOrderSkuList = orderSkuList.stream()
|
|
|
+ .peek(item -> item.setOrderId(dto.getId()))
|
|
|
+ .peek(item -> item.setStockPreparationStatus(StatusConstant.NO))
|
|
|
+ .peek(item -> {
|
|
|
+ // 委外订单修改金额
|
|
|
+ if (ObjectUtil.equals(dto.getType(), 2)) {
|
|
|
+ item.setUnitPrice(BigDecimal.ZERO);
|
|
|
+ item.setLssueFee(BigDecimal.ZERO);
|
|
|
+ item.setDeliveryMaterialsFee(BigDecimal.ZERO);
|
|
|
+ item.setManagementFee(BigDecimal.ZERO);
|
|
|
+ item.setPackingLabor(item.getPackingLabor().multiply(new BigDecimal(2)));
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .map(item -> (OrderSku) item)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ orderSkuService.saveBatch(tempOrderSkuList);
|
|
|
+
|
|
|
+ // 新增订单产品包装信息
|
|
|
+ List<OrderSkuBom> orderSkuBomList = orderSkuList.stream()
|
|
|
+ .flatMap(orderSku -> orderSku.getOrderSkuBomList().stream()
|
|
|
+ .peek(orderSkuBom -> orderSkuBom.setOrderId(dto.getId()))
|
|
|
+ .peek(orderSkuBom -> orderSkuBom.setOrderSkuId(orderSku.getId())))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ orderSkuBomService.saveBatch(orderSkuBomList);
|
|
|
+
|
|
|
+ // 新增订单产品生产成本
|
|
|
+ Map<Long, List<OrderSkuBom>> orderSkuBomMap = orderSkuBomList.stream().collect(Collectors.groupingBy(OrderSkuBom::getOrderSkuId));
|
|
|
+ List<OrderSkuProductionCost> orderSkuProductionCostList = tempOrderSkuList.stream().map(item -> {
|
|
|
+ OrderSkuProductionCost orderSkuProductionCost = new OrderSkuProductionCost();
|
|
|
+ orderSkuProductionCost.setOrderId(item.getOrderId());
|
|
|
+ orderSkuProductionCost.setOrderSkuId(item.getId());
|
|
|
+ // 材料成本
|
|
|
+ orderSkuProductionCost.setMaterialCost(item.getUnitPrice().multiply(item.getQuantity()));
|
|
|
+ // 辅料成本暂时没有默认为零
|
|
|
+ orderSkuProductionCost.setAuxiliaryMaterialCost(BigDecimal.ZERO);
|
|
|
+ // 产品包材成本
|
|
|
+ List<OrderSkuBom> bomList = orderSkuBomMap.get(item.getId());
|
|
|
+ if (bomList == null) {
|
|
|
+ bomList = new ArrayList<>();
|
|
|
+ }
|
|
|
+ BigDecimal productPackagingMaterialCost = bomList.stream()
|
|
|
+ .map(orderSkuBom -> orderSkuBom.getQuantity()
|
|
|
+ .multiply(orderSkuBom.getUnitPrice())
|
|
|
+ .multiply(item.getQuantity()))
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ orderSkuProductionCost.setProductPackagingMaterialCost(productPackagingMaterialCost);
|
|
|
+ // 物流包材成本
|
|
|
+ orderSkuProductionCost.setLogisticsPackagingMaterialCost(item.getDeliveryMaterialsFee()
|
|
|
+ .multiply(item.getQuantity()));
|
|
|
+ orderSkuProductionCost.setTotalAmount(
|
|
|
+ orderSkuProductionCost.getMaterialCost()
|
|
|
+ .add(orderSkuProductionCost.getAuxiliaryMaterialCost())
|
|
|
+ .add(orderSkuProductionCost.getProductPackagingMaterialCost())
|
|
|
+ .add(orderSkuProductionCost.getLogisticsPackagingMaterialCost()));
|
|
|
+ return orderSkuProductionCost;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ orderSkuProductionCostService.saveBatch(orderSkuProductionCostList);
|
|
|
+
|
|
|
+ // 是委外订单并且没有包材时,修改订单状态为生产中,并生成生产任务和工单
|
|
|
+ if (ObjectUtil.notEqual(dto.getStatus(), OrderStatusEnum.DRAFT.getKey())
|
|
|
+ && ObjectUtil.equal(dto.getFlowStatus(), FlowStatusEnum.PASS.getKey())
|
|
|
+ && ObjectUtil.equals(dto.getType(), 2)
|
|
|
+ && ObjectUtil.isEmpty(orderSkuBomList)) {
|
|
|
+ dto.setStatus(OrderStatusEnum.IN_PRODUCTION.getKey());
|
|
|
+ // 生成工单
|
|
|
+ productionWorkOrderService.addByOrderId(dto.getId());
|
|
|
+ this.update(q -> q.set(OrderInfo::getStatus, OrderStatusEnum.IN_PRODUCTION.getKey()).eq(BaseIdPo::getId, dto.getId()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存订单包装信息
|
|
|
+ if (ObjectUtil.isNotEmpty(dto.getOrderPackageBomList())) {
|
|
|
+ List<OrderPackageBomDto> tempOrderPackageBomList = dto.getOrderPackageBomList();
|
|
|
+ List<OrderPackageBom> orderPackageBomList = tempOrderPackageBomList.stream()
|
|
|
+ .peek(item -> item.setOrderId(dto.getId()))
|
|
|
+ .map(item -> (OrderPackageBom) item)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ orderPackageBomService.saveBatch(orderPackageBomList);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存产品不干胶图稿
|
|
|
+ for (OrderSkuDto item : orderSkuList) {
|
|
|
+ ObsFileUtil.saveFile(item.getSelfAdhesiveStickerFile(), item.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存附件
|
|
|
+ ObsFileUtil.saveFile(dto.getFileList(), dto.getId());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -126,7 +384,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
|
|
|
@Override
|
|
|
public void delete(Long id) {
|
|
|
- this.removeById(id);
|
|
|
+ removeById(id);
|
|
|
orderSkuService.remove(q -> q.eq(OrderSku::getOrderId, id));
|
|
|
orderSkuBomService.remove(q -> q.eq(OrderSkuBom::getOrderId, id));
|
|
|
orderPackageBomService.remove(q -> q.eq(OrderPackageBom::getOrderId, id));
|
|
@@ -282,4 +540,22 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
inOutStorageService.add(packagingMaterialInOutStorageDto);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 锁定库存
|
|
|
+ */
|
|
|
+ private void lockStorage(List<? extends OrderSku> orderSkuList) {
|
|
|
+ List<Long> bomSpecIdList = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toList());
|
|
|
+ Map<Long, BomSpecBo> bomSpecBoMap = bomSpecService.getBomSpecBo(bomSpecIdList);
|
|
|
+
|
|
|
+ boolean result = inventoryService.lockStorage(orderSkuList.stream()
|
|
|
+ .filter(item -> bomSpecBoMap.get(item.getBomSpecId()).getClassifyParentId().equals(1L))
|
|
|
+ .collect(Collectors.toList())
|
|
|
+ );
|
|
|
+
|
|
|
+ if (!result) {
|
|
|
+ throw new ServiceException("主材库存不足,无法确认订单");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|