opt: 压片前段业务
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package org.nl.wms.basedata_manage.service.dao;
|
package org.nl.wms.basedata_manage.service.dao;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.FieldStrategy;
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
@@ -239,6 +240,7 @@ public class Structattr implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 存储载具号
|
* 存储载具号
|
||||||
*/
|
*/
|
||||||
|
@TableField(updateStrategy = FieldStrategy.IGNORED)
|
||||||
private String storagevehicle_code;
|
private String storagevehicle_code;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -48,12 +48,10 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static org.nl.common.utils.ValidationUtil.*;
|
import static org.nl.common.utils.ValidationUtil.*;
|
||||||
|
|
||||||
@@ -113,7 +111,7 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
if (ObjectUtil.isEmpty(search)) {
|
if (ObjectUtil.isEmpty(search)) {
|
||||||
throw new BadRequestException("载具不存在!");
|
throw new BadRequestException("载具不存在!");
|
||||||
}
|
}
|
||||||
List<JSONObject> res = groupplateService.getPalletViewByVehicleCode(search);
|
List<JSONObject> res = groupplateService.getPalletViewByVehicleCode(search, Arrays.asList("1"));
|
||||||
return PdaResponse.requestParamOk(res);
|
return PdaResponse.requestParamOk(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,7 +156,7 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
if (ObjectUtil.isEmpty(search)) {
|
if (ObjectUtil.isEmpty(search)) {
|
||||||
throw new BadRequestException("请输入袋号编码!");
|
throw new BadRequestException("请输入袋号编码!");
|
||||||
}
|
}
|
||||||
List<JSONObject> groups = groupplateService.getPalletView(search, "2");
|
List<JSONObject> groups = groupplateService.getPalletView(search, Arrays.asList("1", "2"));
|
||||||
if (groups.size() != 1) {
|
if (groups.size() != 1) {
|
||||||
throw new BadRequestException(groups.size() == 0 ? "组袋记录不存在,请先组袋!" : "组袋记录信息有误,请查询并清理后重试!");
|
throw new BadRequestException(groups.size() == 0 ? "组袋记录不存在,请先组袋!" : "组袋记录信息有误,请查询并清理后重试!");
|
||||||
}
|
}
|
||||||
@@ -195,7 +193,6 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
throw new BadRequestException("未找到当前托盘的原始库位信息!");
|
throw new BadRequestException("未找到当前托盘的原始库位信息!");
|
||||||
}
|
}
|
||||||
Structattr structattr = startPoints.get(0);
|
Structattr structattr = startPoints.get(0);
|
||||||
Sectattr sectattr = sectattrService.findByCode(structattr.getSect_code(), false);
|
|
||||||
// 手动更新库存信息
|
// 手动更新库存信息
|
||||||
// 1、创建出库单、明细、分配明细
|
// 1、创建出库单、明细、分配明细
|
||||||
// 1.1 单据表
|
// 1.1 单据表
|
||||||
@@ -247,7 +244,7 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
dtl.setIostorinvdtl_id(IdUtil.getStringId());
|
dtl.setIostorinvdtl_id(IdUtil.getStringId());
|
||||||
dtl.setIostorinv_id(invId);
|
dtl.setIostorinv_id(invId);
|
||||||
dtl.setSeq_no("1");
|
dtl.setSeq_no("1");
|
||||||
dtl.setMaterial_id(row.getString("material_code"));
|
dtl.setMaterial_id(row.getString("material_id"));
|
||||||
dtl.setPcsn(groupPlate.getPcsn());
|
dtl.setPcsn(groupPlate.getPcsn());
|
||||||
dtl.setBill_status(IOSEnum.BILL_STATUS.code("完成"));
|
dtl.setBill_status(IOSEnum.BILL_STATUS.code("完成"));
|
||||||
dtl.setQty_unit_id(groupPlate.getQty_unit_id());
|
dtl.setQty_unit_id(groupPlate.getQty_unit_id());
|
||||||
@@ -305,6 +302,13 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
if (zeroQtyVehicles.size() > 0) {
|
if (zeroQtyVehicles.size() > 0) {
|
||||||
storagevehicleextService.removeByIds(zeroQtyVehicles.stream().map(MdPbStoragevehicleext::getStoragevehicleext_id).collect(Collectors.toList()));
|
storagevehicleextService.removeByIds(zeroQtyVehicles.stream().map(MdPbStoragevehicleext::getStoragevehicleext_id).collect(Collectors.toList()));
|
||||||
}
|
}
|
||||||
|
if (nonZeroQtyVehicles.size() == 0) {
|
||||||
|
// 说明托盘没东西了,点位释放
|
||||||
|
structattr.setLock_type(IOSEnum.LOCK_TYPE.code("未锁定"));
|
||||||
|
structattr.setStoragevehicle_code(null);
|
||||||
|
structattr.setIs_emptyvehicle("0");
|
||||||
|
structattrService.updateById(structattr);
|
||||||
|
}
|
||||||
return PdaResponse.requestOk("取料成功!");
|
return PdaResponse.requestOk("取料成功!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,6 +330,7 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public PdaResponse leftoverMaterialBack(JSONObject param) {
|
public PdaResponse leftoverMaterialBack(JSONObject param) {
|
||||||
// search, rows 按照托盘号原来的库区回去
|
// search, rows 按照托盘号原来的库区回去
|
||||||
String search = param.getString("search");
|
String search = param.getString("search");
|
||||||
@@ -336,21 +341,33 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
if (ObjectUtil.isEmpty(startPoint.getVehicle_code())) {
|
if (ObjectUtil.isEmpty(startPoint.getVehicle_code())) {
|
||||||
throw new BadRequestException("该点位没有载具信息!");
|
throw new BadRequestException("该点位没有载具信息!");
|
||||||
}
|
}
|
||||||
// List<GroupPlate> list = groupplateService.list(new LambdaQueryWrapper<GroupPlate>()
|
List<Structattr> points = structattrService.getByVehicleCode(startPoint.getVehicle_code()
|
||||||
// .eq(GroupPlate::getVehicle_code, search)
|
, IOSEnum.LOCK_TYPE.code("其他锁"), false);
|
||||||
// .ne(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("出库")));
|
if (points.size() != 1) {
|
||||||
List<JSONObject> res = groupplateService.getPalletViewByVehicleCode(search);
|
throw new BadRequestException(points.size() > 1
|
||||||
|
? "该托盘号绑定在多个点位" + points.stream().map(Structattr::getStruct_code).collect(Collectors.toList()) + ",请检查!"
|
||||||
|
: "该托盘号未绑定到点位或者点位被禁用或者点位以上锁,请检查!");
|
||||||
|
}
|
||||||
|
List<JSONObject> res = groupplateService.getPalletViewByVehicleCode(startPoint.getVehicle_code()
|
||||||
|
, Arrays.asList("2"));
|
||||||
if (res.size() > 0) {
|
if (res.size() > 0) {
|
||||||
log.info("剩料回库");
|
log.info("剩料回库");
|
||||||
// 剩料回库
|
// 剩料回库
|
||||||
param.put("rows", res);
|
param.put("rows", res);
|
||||||
Sectattr sectattr = sectattrService.findByCode(startPoint.getOut_sect(), false);
|
Structattr structattr = points.get(0);
|
||||||
|
Sectattr sectattr = sectattrService.findByCode(structattr.getSect_code(), false);
|
||||||
param.put("bill_type", IOSEnum.IN_BILL_TYPE.code("剩料回库"));
|
param.put("bill_type", IOSEnum.IN_BILL_TYPE.code("剩料回库"));
|
||||||
// 1 创建入库单、明细、分配明细
|
// 1 创建入库单、明细、分配明细
|
||||||
Map<String, Object> invObj = defaultPdaBuildParam.doBuildInvObj(param, startPoint, sectattr);
|
Map<String, Object> invObj = defaultPdaBuildParam.doBuildInvObj(param, startPoint, sectattr);
|
||||||
|
invObj.put("nonChecked", "1");
|
||||||
String invId = rawAssistIStorService.insertDtl(invObj);
|
String invId = rawAssistIStorService.insertDtl(invObj);
|
||||||
// 2 调用分配
|
// 2 调用手动分配
|
||||||
Map<String, Object> divObj = defaultPdaBuildParam.buildDivStructData(param, sectattr, invId, true);
|
param.put("sect_code", structattr.getSect_code());
|
||||||
|
param.put("sect_name", structattr.getSect_name());
|
||||||
|
param.put("struct_id", structattr.getStruct_id());
|
||||||
|
param.put("struct_name", structattr.getStruct_name());
|
||||||
|
param.put("struct_code", structattr.getStruct_code());
|
||||||
|
Map<String, Object> divObj = defaultPdaBuildParam.buildDivStructData(param, sectattr, invId, false);
|
||||||
rawAssistIStorService.divStruct(divObj);
|
rawAssistIStorService.divStruct(divObj);
|
||||||
// 3 创建任务
|
// 3 创建任务
|
||||||
Map<String, Object> jsonMst = defaultPdaBuildParam.buildTaskData(startPoint, invId);
|
Map<String, Object> jsonMst = defaultPdaBuildParam.buildTaskData(startPoint, invId);
|
||||||
@@ -359,7 +376,7 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
log.info("空载具回库");
|
log.info("空载具回库");
|
||||||
// 空载具回库
|
// 空载具回库
|
||||||
JSONObject vin = new JSONObject();
|
JSONObject vin = new JSONObject();
|
||||||
vin.put("storagevehicle_code", search);
|
vin.put("storagevehicle_code", startPoint.getVehicle_code());
|
||||||
vin.put("sect_code", startPoint.getOut_sect());
|
vin.put("sect_code", startPoint.getOut_sect());
|
||||||
vin.put("point_code", startPoint.getPoint_code());
|
vin.put("point_code", startPoint.getPoint_code());
|
||||||
vehicleInService.create(vin);
|
vehicleInService.create(vin);
|
||||||
@@ -370,7 +387,7 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
@Override
|
@Override
|
||||||
public PdaResponse preProcessingDown(JSONObject param) {
|
public PdaResponse preProcessingDown(JSONObject param) {
|
||||||
log.info("加工下料:{}", param);
|
log.info("加工下料:{}", param);
|
||||||
// vehicle_code、 point_code, region_code, 。。。rows
|
// vehicle_code、 point_code, sect_code, 。。。rows
|
||||||
assertNotBlankJson(param, "请求参数不能为空!", "vehicle_code", "point_code", "sect_code");
|
assertNotBlankJson(param, "请求参数不能为空!", "vehicle_code", "point_code", "sect_code");
|
||||||
String pointCode = param.getString("point_code");
|
String pointCode = param.getString("point_code");
|
||||||
SchBasePoint startPoint = pointService.getByPointCode(pointCode, false);
|
SchBasePoint startPoint = pointService.getByPointCode(pointCode, false);
|
||||||
@@ -384,7 +401,7 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
throw new BadRequestException("该点位已创建过任务!");
|
throw new BadRequestException("该点位已创建过任务!");
|
||||||
}
|
}
|
||||||
String vehicleCode = param.getString("vehicle_code");
|
String vehicleCode = param.getString("vehicle_code");
|
||||||
List<JSONObject> res = groupplateService.getPalletViewByVehicleCode(vehicleCode);
|
List<JSONObject> res = groupplateService.getPalletViewByVehicleCode(vehicleCode, Arrays.asList("1"));
|
||||||
if (res.size() == 0) {
|
if (res.size() == 0) {
|
||||||
throw new BadRequestException("当前托盘号不存在物料信息,请检查!");
|
throw new BadRequestException("当前托盘号不存在物料信息,请检查!");
|
||||||
}
|
}
|
||||||
@@ -480,7 +497,7 @@ public class PdaProductionServiceImpl implements PdaProductionService {
|
|||||||
if (ObjectUtil.isEmpty(search)) {
|
if (ObjectUtil.isEmpty(search)) {
|
||||||
throw new BadRequestException("载具不存在!");
|
throw new BadRequestException("载具不存在!");
|
||||||
}
|
}
|
||||||
List<JSONObject> res = groupplateService.getPalletViewByVehicleCode(search);
|
List<JSONObject> res = groupplateService.getPalletViewByVehicleCode(search, Arrays.asList("1"));
|
||||||
return PdaResponse.requestParamOk(res);
|
return PdaResponse.requestParamOk(res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import org.redisson.api.RedissonClient;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -63,7 +64,7 @@ public class PdaWarehouseServiceImpl implements PdaWarehouseService {
|
|||||||
if (ObjectUtil.isEmpty(search)) {
|
if (ObjectUtil.isEmpty(search)) {
|
||||||
throw new BadRequestException("请输入袋号编码!");
|
throw new BadRequestException("请输入袋号编码!");
|
||||||
}
|
}
|
||||||
List<JSONObject> groups = groupplateService.getPalletView(search, "0");
|
List<JSONObject> groups = groupplateService.getPalletView(search, Arrays.asList("0"));
|
||||||
if (groups.size() != 1) {
|
if (groups.size() != 1) {
|
||||||
throw new BadRequestException(groups.size() == 0 ? "组袋记录不存在,请先组袋!" : "组袋记录信息有误,请查询并清理后重试!");
|
throw new BadRequestException(groups.size() == 0 ? "组袋记录不存在,请先组袋!" : "组袋记录信息有误,请查询并清理后重试!");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public class PreProcessingInTask extends AbstractTask {
|
|||||||
@Override
|
@Override
|
||||||
public String create(JSONObject json) {
|
public String create(JSONObject json) {
|
||||||
// 获取终点
|
// 获取终点
|
||||||
List<SchBasePoint> points = pointService.getCanUsePointByRegion(json.getString("region_code"));
|
List<SchBasePoint> points = pointService.getCanUsePointByRegion(json.getString("sect_code"));
|
||||||
if (ObjectUtil.isEmpty(points)) {
|
if (ObjectUtil.isEmpty(points)) {
|
||||||
throw new BadRequestException("暂无可用点位!");
|
throw new BadRequestException("暂无可用点位!");
|
||||||
}
|
}
|
||||||
@@ -55,7 +55,7 @@ public class PreProcessingInTask extends AbstractTask {
|
|||||||
SchBaseTask task = new SchBaseTask();
|
SchBaseTask task = new SchBaseTask();
|
||||||
task.setTask_id(IdUtil.getStringId());
|
task.setTask_id(IdUtil.getStringId());
|
||||||
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
|
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
|
||||||
task.setTask_status(TaskStatus.CREATE.getCode());
|
task.setTask_status(TaskStatus.CREATED.getCode());
|
||||||
task.setConfig_code(PreProcessingInTask.class.getSimpleName());
|
task.setConfig_code(PreProcessingInTask.class.getSimpleName());
|
||||||
task.setPoint_code1(json.getString("point_code"));
|
task.setPoint_code1(json.getString("point_code"));
|
||||||
task.setPoint_code2(point.getPoint_code());
|
task.setPoint_code2(point.getPoint_code());
|
||||||
|
|||||||
@@ -95,9 +95,15 @@ public interface IMdPbGroupplateService extends IService<GroupPlate> {
|
|||||||
*/
|
*/
|
||||||
List<GroupPlate> getByBagNo(String bagNo, String status);
|
List<GroupPlate> getByBagNo(String bagNo, String status);
|
||||||
|
|
||||||
List<JSONObject> getPalletView(String search, String status);
|
/**
|
||||||
|
*
|
||||||
|
* @param search 袋号
|
||||||
|
* @param status
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<JSONObject> getPalletView(String search, List<String> status);
|
||||||
|
|
||||||
List<JSONObject> getPalletViewByVehicleCode(String search);
|
List<JSONObject> getPalletViewByVehicleCode(String search, List<String> status);
|
||||||
|
|
||||||
List<JSONObject> getStockGroupInfo(JSONObject param);
|
List<JSONObject> getStockGroupInfo(JSONObject param);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,9 +64,9 @@ public interface MdPbGroupplateMapper extends BaseMapper<GroupPlate> {
|
|||||||
*/
|
*/
|
||||||
List<JSONObject> pdaGetPointDtl(@Param("param") JSONObject whereJson);
|
List<JSONObject> pdaGetPointDtl(@Param("param") JSONObject whereJson);
|
||||||
|
|
||||||
List<JSONObject> getPalletView(String search, String status);
|
List<JSONObject> getPalletView(String search, List<String> status);
|
||||||
|
|
||||||
List<JSONObject> getPalletViewByVehicleCode(String search);
|
List<JSONObject> getPalletViewByVehicleCode(String search, List<String> status);
|
||||||
|
|
||||||
List<JSONObject> getStockGroupInfo(JSONObject param);
|
List<JSONObject> getStockGroupInfo(JSONObject param);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,7 +149,10 @@
|
|||||||
`md_pb_groupplate` g
|
`md_pb_groupplate` g
|
||||||
LEFT JOIN md_me_materialbase m ON m.material_id = g.material_id
|
LEFT JOIN md_me_materialbase m ON m.material_id = g.material_id
|
||||||
LEFT JOIN md_cs_supplierbase s ON s.supp_code = g.supp_code
|
LEFT JOIN md_cs_supplierbase s ON s.supp_code = g.supp_code
|
||||||
WHERE g.bag_code = #{search} AND g.`status` = #{status}
|
WHERE g.bag_code = #{search} AND g.`status` IN
|
||||||
|
<foreach collection="status" item="code" separator="," open="(" close=")">
|
||||||
|
#{code}
|
||||||
|
</foreach>
|
||||||
</select>
|
</select>
|
||||||
<select id="getPalletViewByVehicleCode" resultType="com.alibaba.fastjson.JSONObject">
|
<select id="getPalletViewByVehicleCode" resultType="com.alibaba.fastjson.JSONObject">
|
||||||
SELECT
|
SELECT
|
||||||
@@ -164,7 +167,10 @@
|
|||||||
`md_pb_groupplate` g
|
`md_pb_groupplate` g
|
||||||
LEFT JOIN md_me_materialbase m ON m.material_id = g.material_id
|
LEFT JOIN md_me_materialbase m ON m.material_id = g.material_id
|
||||||
LEFT JOIN md_cs_supplierbase s ON s.supp_code = g.supp_code
|
LEFT JOIN md_cs_supplierbase s ON s.supp_code = g.supp_code
|
||||||
WHERE g.vehicle_code = #{search} AND g.`status` = '1'
|
WHERE g.vehicle_code = #{search} AND g.`status` IN
|
||||||
|
<foreach collection="status" item="code" separator="," open="(" close=")">
|
||||||
|
#{code}
|
||||||
|
</foreach>
|
||||||
</select>
|
</select>
|
||||||
<select id="getStockGroupInfo" resultType="com.alibaba.fastjson.JSONObject">
|
<select id="getStockGroupInfo" resultType="com.alibaba.fastjson.JSONObject">
|
||||||
SELECT
|
SELECT
|
||||||
|
|||||||
@@ -190,13 +190,13 @@ public class MdPbGroupplateServiceImpl extends ServiceImpl<MdPbGroupplateMapper,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<JSONObject> getPalletView(String search, String status) {
|
public List<JSONObject> getPalletView(String search, List<String> status) {
|
||||||
return this.baseMapper.getPalletView(search, status);
|
return this.baseMapper.getPalletView(search, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<JSONObject> getPalletViewByVehicleCode(String search) {
|
public List<JSONObject> getPalletViewByVehicleCode(String search, List<String> status) {
|
||||||
return this.baseMapper.getPalletViewByVehicleCode(search);
|
return this.baseMapper.getPalletViewByVehicleCode(search, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -239,8 +239,10 @@ public class RawAssistIStorServiceImpl extends ServiceImpl<IOStorInvMapper, IOSt
|
|||||||
|
|
||||||
//判断该载具编号是否已经存在库内
|
//判断该载具编号是否已经存在库内
|
||||||
Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<>(Structattr.class).eq(Structattr::getStoragevehicle_code, row.get("storagevehicle_code")));
|
Structattr structattr = iStructattrService.getOne(new LambdaQueryWrapper<>(Structattr.class).eq(Structattr::getStoragevehicle_code, row.get("storagevehicle_code")));
|
||||||
if (ObjectUtil.isNotEmpty(structattr)) {
|
if (ObjectUtil.isEmpty(whereJson.get("nonChecked"))) {
|
||||||
throw new BadRequestException("载具编码:" + row.get("storagevehicle_code") + "已存在库内,请对数据进行核实!");
|
if (ObjectUtil.isNotEmpty(structattr)) {
|
||||||
|
throw new BadRequestException("载具编码:" + row.get("storagevehicle_code") + "已存在库内,请对数据进行核实!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ioStorInvDtlMapper.insert(ioStorInvDtl.toJavaObject(IOStorInvDtl.class));
|
ioStorInvDtlMapper.insert(ioStorInvDtl.toJavaObject(IOStorInvDtl.class));
|
||||||
|
|||||||
Reference in New Issue
Block a user