Browse Source

配送任务节点查询、自提

dev-pushdata-important
汤建军 1 year ago
parent
commit
a4415e659b
  1. 32
      blade-biz-common/src/main/java/org/springblade/common/node/BillLadingNode.java
  2. 36
      blade-biz-common/src/main/java/org/springblade/common/node/ReservationNode.java
  3. 8
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.java
  4. 4
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.xml
  5. 4
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.java
  6. 3
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.xml
  7. 15
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.java
  8. 10
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml
  9. 8
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionReservationService.java
  10. 14
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistrilbutionBillLadingService.java
  11. 17
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationServiceImpl.java
  12. 164
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java
  13. 23
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistrilbutionBillLadingServiceImpl.java

32
blade-biz-common/src/main/java/org/springblade/common/node/BillLadingNode.java

@ -0,0 +1,32 @@
package org.springblade.common.node;
public enum BillLadingNode {
chuangjianchenggong("创建成功","10"),
qianshouzhong("签收中","20"),
yiwancheng("已完成","30");
/**
* 状态
*/
private String name;
/**
*
*/
private String value;
BillLadingNode(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
}

36
blade-biz-common/src/main/java/org/springblade/common/node/ReservationNode.java

@ -0,0 +1,36 @@
package org.springblade.common.node;
public enum ReservationNode {
chuangjianchenggong("创建成功","10"),
peisongchuangjian("配送创建","20"),
zhuangchezhong("装车中","30"),
zhuangchewancheng("装车完成","40"),
qianshouzhong("签收中","50"),
qianshouwancheng("签收完成","60"),
fuhewancheng("复核完成","70");
/**
* 状态
*/
private String name;
/**
*
*/
private String value;
ReservationNode(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
}

8
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.java

@ -357,4 +357,12 @@ public interface DistributionReservationMapper extends BaseMapper<DistributionRe
IPage<DistributionReservationInventoryPackageVO> selectInvenToryPackageByReservationInfo(@Param("param") Map<String, Object> reservationPackageDTO,IPage<DistributionReservationInventoryPackageVO> page); IPage<DistributionReservationInventoryPackageVO> selectInvenToryPackageByReservationInfo(@Param("param") Map<String, Object> reservationPackageDTO,IPage<DistributionReservationInventoryPackageVO> page);
List<DistributionParcelListEntity> getReservationPackageNew(@Param("param")Map<String, Object> distributionDeliveryInfoDTO); List<DistributionParcelListEntity> getReservationPackageNew(@Param("param")Map<String, Object> distributionDeliveryInfoDTO);
/**
* 根据预约单号查询预约
* @param warehouseCode
* @param searchCode
* @return
*/
DistributionReservationEntity selectByReservationCode(@Param("warehouseId") Long warehouseId,@Param("reservationCode") String reservationCode);
} }

4
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionReservationMapper.xml

@ -1693,4 +1693,8 @@
</if> </if>
</select> </select>
<select id="selectByReservationCode"
resultType="com.logpm.distribution.entity.DistributionReservationEntity">
SELECT * FROM logpm_distribution_reservation WHERE reservation_code = #{reservationCode} AND warehouse_id = #{warehouseId}
</select>
</mapper> </mapper>

4
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.java

@ -319,5 +319,7 @@ public interface DistributionSignforMapper extends BaseMapper<DistributionSignfo
* 查询配送单关联预约 * 查询配送单关联预约
* @param deliveryId * @param deliveryId
*/ */
List<DistributionReservationEntity> selectReservationByDeliveryId(Long deliveryId); List<DistributionReservationEntity> selectReservationByDeliveryId(@Param("deliveryId") Long deliveryId);
DistributionSignforEntity selectByReservationId(@Param("reservationId") Long reservationId);
} }

3
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSignforMapper.xml

@ -1286,4 +1286,7 @@
AND ldr.is_deleted = 0 AND ldr.is_deleted = 0
AND lds.is_deleted = 0 AND lds.is_deleted = 0
</select> </select>
<select id="selectByReservationId" resultType="com.logpm.distribution.entity.DistributionSignforEntity">
SELECT * FROM logpm_distribution_signfor WHERE reservation_id = #{reservationId}
</select>
</mapper> </mapper>

15
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.java

@ -112,4 +112,19 @@ public interface DistrilbutionBillLadingMapper extends BaseMapper<DistrilbutionB
List<DistributionParcelListEntity> selectBillLadingPackage(@Param("ids")List<Long> ids); List<DistributionParcelListEntity> selectBillLadingPackage(@Param("ids")List<Long> ids);
List<DistributionDeliveryDetailsEntity> selectBillLadingInventory(@Param("ids")List<Long> ids); List<DistributionDeliveryDetailsEntity> selectBillLadingInventory(@Param("ids")List<Long> ids);
/**
* 根据自提单号查询自提单
* @param id
* @param searchCode
* @return
*/
DistrilbutionBillLadingEntity selectByBillLadingCode(@Param("warehouseId") Long id,@Param("pickupBatch") String pickupBatch);
/**
* 查询自提单计划件数
* @param id
* @return
*/
Integer selectBillLadingPlanNum(@Param("billLadingId") Long billLadingId);
} }

10
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistrilbutionBillLadingMapper.xml

@ -470,6 +470,16 @@
#{id} #{id}
</foreach> </foreach>
</select> </select>
<select id="selectByBillLadingCode"
resultType="com.logpm.distribution.entity.DistrilbutionBillLadingEntity">
SELECT * FROM logpm_distribution_bill_lading WHERE warehouse_id = #{warehouseId} AND pickup_batch=#{pickupBatch} AND is_deleted = 0
</select>
<select id="selectBillLadingPlanNum" resultType="java.lang.Integer">
SELECT(
IF((SELECT sum(packet_number) FROM logpm_distrilbution_bill_package WHERE bill_lading_id = #{billLadingId} AND packet_bar_status != 3) IS NULL,0,(SELECT sum(packet_number) FROM logpm_distrilbution_bill_package WHERE bill_lading_id = #{billLadingId} AND packet_bar_status != 3))
+
IF((SELECT sum(quantity) FROM logpm_distribution_delivery_details WHERE bill_lading_id = #{billLadingId} AND inventory_status != 3) IS NULL ,0,(SELECT sum(quantity) FROM logpm_distribution_delivery_details WHERE bill_lading_id = #{billLadingId} AND inventory_status != 3) ) )
</select>
</mapper> </mapper>

8
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionReservationService.java

@ -220,8 +220,6 @@ public interface IDistributionReservationService extends BaseService<Distributio
/** /**
* 查询预约订单的包件信息 * 查询预约订单的包件信息
* @param orderId
* @param reservationId
* @return * @return
*/ */
R getReservationPackageListByOrderId(Map<String,Object> packageDTO,IPage<DistributionReservationOrderPackageVO> page); R getReservationPackageListByOrderId(Map<String,Object> packageDTO,IPage<DistributionReservationOrderPackageVO> page);
@ -271,4 +269,10 @@ public interface IDistributionReservationService extends BaseService<Distributio
*/ */
void maintenanceReservationNum(Long reservationId); void maintenanceReservationNum(Long reservationId);
/**
* 根据预约单号查询预约
* @param searchCode
* @return
*/
DistributionReservationEntity selectByReservationCode(String searchCode);
} }

14
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistrilbutionBillLadingService.java

@ -221,4 +221,18 @@ public interface IDistrilbutionBillLadingService extends BaseService<Distrilbuti
* @return * @return
*/ */
R cancelBillLoding(String billLodingIds); R cancelBillLoding(String billLodingIds);
/**
* 根据自提单号查询自提
* @param searchCode
* @return
*/
DistrilbutionBillLadingEntity selectByBillLadingCode(String searchCode);
/**
* 查询自提单计划件数
* @param id
* @return
*/
Integer selectBillLadingPlanNum(Long id);
} }

17
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionReservationServiceImpl.java

@ -3523,7 +3523,7 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl<Distribu
boolean signStatus = false; boolean signStatus = false;
if (Func.isNotEmpty(distributionParcelListEntities)){ if (Func.isNotEmpty(distributionParcelListEntities)){
loadStatus = distributionParcelListEntities.stream().allMatch(p -> p.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue())); loadStatus = distributionParcelListEntities.stream().allMatch(p -> p.getOrderPackageLoadingStatus().equals(OrderPackageLoadingStatusConstant.yizhuangche.getValue()));
signStatus = distributionParcelListEntities.stream().anyMatch(p->p.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue())); signStatus = distributionParcelListEntities.stream().allMatch(p->p.getOrderPackageStatus().equals(OrderPackageStatusConstant.yiqianshou.getValue()));
} }
if (Func.isNotEmpty(disStockListDetailEntities)){ if (Func.isNotEmpty(disStockListDetailEntities)){
@ -3663,4 +3663,19 @@ public class DistributionReservationServiceImpl extends BaseServiceImpl<Distribu
} }
/**
* @param searchCode
* @return
*/
@Override
public DistributionReservationEntity selectByReservationCode(String searchCode) {
String method = "#################类DistributionReservationServiceImpl执行方法selectByReservationCode,";
BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse();
if (Func.isEmpty(myCurrentWarehouse)){
log.error(method+"查询预约失败:{}",searchCode);
return null;
}
return baseMapper.selectByReservationCode(myCurrentWarehouse.getId(),searchCode);
}
} }

164
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSignforServiceImpl.java

@ -64,7 +64,9 @@ import org.springblade.common.constant.reservation.*;
import org.springblade.common.constant.signing.SignforDriverSigningStatusConstant; import org.springblade.common.constant.signing.SignforDriverSigningStatusConstant;
import org.springblade.common.constant.signing.SignforStatusConstant; import org.springblade.common.constant.signing.SignforStatusConstant;
import org.springblade.common.exception.CustomerException; import org.springblade.common.exception.CustomerException;
import org.springblade.common.node.BillLadingNode;
import org.springblade.common.node.DeliveryNode; import org.springblade.common.node.DeliveryNode;
import org.springblade.common.node.ReservationNode;
import org.springblade.common.serviceConstant.ServiceConstant; import org.springblade.common.serviceConstant.ServiceConstant;
import org.springblade.common.utils.CommonUtil; import org.springblade.common.utils.CommonUtil;
import org.springblade.common.utils.FileUtil; import org.springblade.common.utils.FileUtil;
@ -181,6 +183,9 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
@Lazy @Lazy
private IDistributionReservationService distributionReservationService; private IDistributionReservationService distributionReservationService;
@Autowired @Autowired
@Lazy
private IDistrilbutionBillLadingService distrilbutionBillLadingService;
@Autowired
private RabbitTemplate rabbitTemplate; private RabbitTemplate rabbitTemplate;
@Autowired @Autowired
@ -786,10 +791,22 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
//进行数据组装 //进行数据组装
break; break;
case 2: case 2:
DistributionReservationEntity reservationEntity = distributionReservationService.selectByReservationCode(searchCode);
if (Func.isEmpty(reservationEntity)){
return R.fail("未查询到预约单信息,请查看搜索类型是否匹配");
}
//解析配送节点
nodeVos = handleReservationNode(reservationEntity);
//预约单查询 //预约单查询
break; break;
case 3: case 3:
//订单自编号查询 //自提单号
DistrilbutionBillLadingEntity distrilbutionBillLadingEntity = distrilbutionBillLadingService.selectByBillLadingCode(searchCode);
if (Func.isEmpty(distrilbutionBillLadingEntity)){
return R.fail("未查询到自提单信息,请查看搜索类型是否匹配");
}
//解析配送节点
nodeVos = handleBillLading(distrilbutionBillLadingEntity);
break; break;
case 4: case 4:
//包条码查询 //包条码查询
@ -798,6 +815,151 @@ public class DistributionSignforServiceImpl extends BaseServiceImpl<Distribution
return R.data(nodeVos); return R.data(nodeVos);
} }
private List<DeliveryNodeVo> handleBillLading(DistrilbutionBillLadingEntity distrilbutionBillLadingEntity) {
List<DeliveryNodeVo> nodeVos = new ArrayList<>();
try {
DeliveryNodeVo billLadingNodeVo = new DeliveryNodeVo();
billLadingNodeVo.setTime(distrilbutionBillLadingEntity.getCreateTime());
billLadingNodeVo.setNodeName(BillLadingNode.chuangjianchenggong.getName());
String name = userClient.userInfoById(distrilbutionBillLadingEntity.getCreateUser()).getData().getName();
billLadingNodeVo.setNodeUserName(name);
//查询自提的自提数量
Integer billLadingNum = distrilbutionBillLadingService.selectBillLadingPlanNum(distrilbutionBillLadingEntity.getId());
billLadingNodeVo.setNodeInfo("计划自提"+billLadingNum+"件");
nodeVos.add(billLadingNodeVo);
//查询自提扫描数量
}catch (Exception e){
}
return nodeVos;
}
private List<DeliveryNodeVo> handleReservationNode(DistributionReservationEntity reservationEntity) {
List<DeliveryNodeVo> nodeVos = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
DeliveryNodeVo reservationNodeVo = new DeliveryNodeVo();
int projectNum = reservationEntity.getReservationNum() + reservationEntity.getReservationStockListNum();
reservationNodeVo.setTime(reservationEntity.getCreateTime());
String name = userClient.userInfoById(reservationEntity.getCreateUser()).getData().getName();
reservationNodeVo.setNodeUserName(name);
reservationNodeVo.setNodeName(ReservationNode.chuangjianchenggong.getName());
reservationNodeVo.setNodeInfo("计划配送"+projectNum+"件");
nodeVos.add(reservationNodeVo);
//查询装车
Integer loadingNum = distributionLoadscanMapper.selectLoadingNumByReservationId(reservationEntity.getId());
if (loadingNum > 0){
DeliveryNodeVo middleReservationNodeVo = new DeliveryNodeVo();
middleReservationNodeVo.setNodeName(ReservationNode.zhuangchezhong.getName());
//查询预约装车操作人有那些
List<DistributionLoadscanEntity> loadscanEntityList = distributionLoadscanMapper.selectList(Wrappers.<DistributionLoadscanEntity>query().lambda()
.eq(DistributionLoadscanEntity::getReservationId, reservationEntity.getId())
.ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())
);
List<String> scanUser = new ArrayList<>();
List<String> loadingTime = new ArrayList<>();
if (Func.isNotEmpty(loadscanEntityList)){
List<String> packageScanUser = loadscanEntityList.stream().map(DistributionLoadscanEntity::getScanUser).collect(Collectors.toList());
scanUser.addAll(packageScanUser);
List<String> packagheLoadingTime = loadscanEntityList.stream().map(DistributionLoadscanEntity::getScanTime).collect(Collectors.toList());
loadingTime.addAll(packagheLoadingTime);
}
List<DistributionLoadscaninvnEntity> inventoryLoading = distributionLoadscaninvnMapper.selectList(Wrappers.<DistributionLoadscaninvnEntity>query().lambda()
.eq(DistributionLoadscaninvnEntity::getReservationId, reservationEntity.getId())
.ne(DistributionLoadscaninvnEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())
);
if (Func.isNotEmpty(inventoryLoading)){
List<String> InventoryScanUser = inventoryLoading.stream().map(DistributionLoadscaninvnEntity::getScanUser).collect(Collectors.toList());
scanUser.addAll(InventoryScanUser);
List<String> inventoryLoadingTime = inventoryLoading.stream().map(DistributionLoadscaninvnEntity::getScanTime).collect(Collectors.toList());
loadingTime.addAll(inventoryLoadingTime);
}
if (Func.isNotEmpty(scanUser)){
String scanUsers = scanUser.stream().distinct().collect(Collectors.joining(","));
middleReservationNodeVo.setNodeUserName(scanUsers);
}
if (Func.isNotEmpty(loadingTime)){
String max = Collections.max(loadingTime);
middleReservationNodeVo.setTime(sdf.parse(max));
}
if (reservationEntity.getLoadingStatus().equals(ReservationLoadingStatusConstant.yizhuangche.getValue())){
middleReservationNodeVo.setNodeName(ReservationNode.zhuangchewancheng.getName());
}
middleReservationNodeVo.setNodeInfo("计划配送"+projectNum+"件"+"装车"+loadingNum+"件");
nodeVos.add(middleReservationNodeVo);
}
Integer signingNum = distributionLoadscanMapper.selectSigningNumByReservationId(reservationEntity.getId());
if (signingNum>0){
DeliveryNodeVo endReservationNodeVo = new DeliveryNodeVo();
endReservationNodeVo.setNodeName(ReservationNode.qianshouzhong.getName());
//查询预约装车操作人有那些
List<DistributionLoadscanEntity> loadscanEntityList = distributionLoadscanMapper.selectList(Wrappers.<DistributionLoadscanEntity>query().lambda()
.eq(DistributionLoadscanEntity::getReservationId, reservationEntity.getId())
.eq(DistributionLoadscanEntity::getSignforState, LoadScanSigningStatusConstant.yiqianshou.getValue())
.ne(DistributionLoadscanEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())
);
List<String> scanUser = new ArrayList<>();
List<String> signTime = new ArrayList<>();
if (Func.isNotEmpty(loadscanEntityList)){
List<String> packageScanUser = loadscanEntityList.stream().map(DistributionLoadscanEntity::getScanUser).collect(Collectors.toList());
scanUser.addAll(packageScanUser);
List<String> packagheSignTimeTime = loadscanEntityList.stream().map(DistributionLoadscanEntity::getSigningTime).collect(Collectors.toList());
signTime.addAll(packagheSignTimeTime);
}
List<DistributionLoadscaninvnEntity> inventoryLoading = distributionLoadscaninvnMapper.selectList(Wrappers.<DistributionLoadscaninvnEntity>query().lambda()
.eq(DistributionLoadscaninvnEntity::getReservationId, reservationEntity.getId())
.eq(DistributionLoadscaninvnEntity::getSignforState, LoadScanSigningStatusConstant.yiqianshou.getValue())
.ne(DistributionLoadscaninvnEntity::getScanStatus, LoadingStatusConstant.quxiao.getValue())
);
if (Func.isNotEmpty(inventoryLoading)){
List<String> inventoryScanUser = inventoryLoading.stream().map(DistributionLoadscaninvnEntity::getScanUser).collect(Collectors.toList());
scanUser.addAll(inventoryScanUser);
List<String> inventorySignTimeTime = inventoryLoading.stream().map(DistributionLoadscaninvnEntity::getSigningTime).collect(Collectors.toList());
signTime.addAll(inventorySignTimeTime);
}
if (Func.isNotEmpty(scanUser)){
String scanUsers = scanUser.stream().distinct().collect(Collectors.joining(","));
endReservationNodeVo.setNodeUserName(scanUsers);
}
if (Func.isNotEmpty(signTime)){
String max = Collections.max(signTime);
endReservationNodeVo.setTime(sdf.parse(max));
}
if (reservationEntity.getSigningStatus().equals(ReservationSigningStatusConstant.yiqianshou.getValue())){
endReservationNodeVo.setNodeName(ReservationNode.qianshouwancheng.getName());
}
endReservationNodeVo.setNodeInfo("计划配送"+projectNum+"件;"+"装车"+loadingNum+"件;"+"签收"+signingNum+"件");
nodeVos.add(endReservationNodeVo);
}
//查询此预约是否完成复核
DistributionSignforEntity signforEntity = distributionSignforMapper.selectByReservationId(reservationEntity.getId());
if (Func.isNotEmpty(signforEntity)){
if (signforEntity.getSigningStatus().equals(SignforStatusConstant.yiqianshou.getValue())){
DeliveryNodeVo signReservationNodeVo = new DeliveryNodeVo();
signReservationNodeVo.setTime(sdf.parse(signforEntity.getSigningTime()));
signReservationNodeVo.setNodeUserName(signforEntity.getExamineUserName());
signReservationNodeVo.setNodeName(ReservationNode.fuhewancheng.getName());
signReservationNodeVo.setNodeInfo("计划配送"+projectNum+"件;"+"装车"+loadingNum+"件;"+"签收"+signingNum+"件");
nodeVos.add(signReservationNodeVo);
}
}
}catch (Exception e){
throw new RuntimeException(e);
}
return nodeVos;
}
private List<DeliveryNodeVo> handleDeliveryNode(DistributionDeliveryListEntity deliveryListEntity) { private List<DeliveryNodeVo> handleDeliveryNode(DistributionDeliveryListEntity deliveryListEntity) {
List<DeliveryNodeVo> nodeVos = new ArrayList<>(); List<DeliveryNodeVo> nodeVos = new ArrayList<>();
try { try {

23
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistrilbutionBillLadingServiceImpl.java

@ -685,6 +685,29 @@ public class DistrilbutionBillLadingServiceImpl extends BaseServiceImpl<Distrilb
return R.status(false); return R.status(false);
} }
/**
* @param searchCode
* @return
*/
@Override
public DistrilbutionBillLadingEntity selectByBillLadingCode(String searchCode) {
String method = "##########类DistrilbutionBi().selectByBillLadingCode,";
BasicdataWarehouseEntity myCurrentWarehouse = basicdataWarehouseClient.getMyCurrentWarehouse();
if (Func.isEmpty(myCurrentWarehouse)){
return null;
}
return baseMapper.selectByBillLadingCode( myCurrentWarehouse.getId(),searchCode);
}
/**
* @param id
* @return
*/
@Override
public Integer selectBillLadingPlanNum(Long id) {
return baseMapper.selectBillLadingPlanNum(id);
}
@Transactional @Transactional
private Integer cancelBillLodingPackage(List<Long> ids) { private Integer cancelBillLodingPackage(List<Long> ids) {
String method = "##########类DistrilbutionBillLadingServiceImpl执行方法cancelBillLoding,"; String method = "##########类DistrilbutionBillLadingServiceImpl执行方法cancelBillLoding,";

Loading…
Cancel
Save