mirror of
http://192.168.1.205:9980/cf_devdept2/cf_imes_server.git
synced 2026-08-13 21:32:07 +08:00
Merge remote-tracking branch 'origin/main'
This commit is contained in:
-8
@@ -64,14 +64,6 @@ public class PlanController {
|
|||||||
return success(planService.deletePlan(ids));
|
return success(planService.deletePlan(ids));
|
||||||
}
|
}
|
||||||
|
|
||||||
// @DeleteMapping("cancellation")
|
|
||||||
// @Operation(summary = "作废")
|
|
||||||
// @Parameter(name = "id", description = "排单id", required = true)
|
|
||||||
// @PreAuthorize("@ss.hasPermission('executor:plan:delete')")
|
|
||||||
public CommonResult<Boolean> cancellation(@RequestParam("id") Long id) {
|
|
||||||
return success(planService.cancellation(id));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/get")
|
@GetMapping("/get")
|
||||||
@Operation(summary = "获得排单")
|
@Operation(summary = "获得排单")
|
||||||
|
|||||||
+4
-2
@@ -4,6 +4,8 @@ package com.cf.imes.module.executor.controller.admin.plan.saveOptimize;
|
|||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Schema(description = "管理后台 - 生产单包裹信息")
|
@Schema(description = "管理后台 - 生产单包裹信息")
|
||||||
@Data
|
@Data
|
||||||
public class PrintOrderPackReqVO {
|
public class PrintOrderPackReqVO {
|
||||||
@@ -14,7 +16,7 @@ public class PrintOrderPackReqVO {
|
|||||||
|
|
||||||
|
|
||||||
@Schema(description = "板材ID")
|
@Schema(description = "板材ID")
|
||||||
private Long plateId;
|
private List<Long> plateId;
|
||||||
|
|
||||||
|
|
||||||
@Schema(description = "包裹编号")
|
@Schema(description = "包裹编号")
|
||||||
@@ -26,7 +28,7 @@ public class PrintOrderPackReqVO {
|
|||||||
|
|
||||||
|
|
||||||
@Schema(description = "包裹数量")
|
@Schema(description = "包裹数量")
|
||||||
private Long packNum;
|
private Integer packNum;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+5
@@ -182,4 +182,9 @@ public interface GoodsMapper extends BaseMapperX<GoodsDO> {
|
|||||||
|
|
||||||
|
|
||||||
IPage<PlateResList> selectPlanGoodsListByPlanId(@Param("page") IPage<PlateResList> page, @Param(Constants.WRAPPER) Wrapper<GoodsDO> wrapper);
|
IPage<PlateResList> selectPlanGoodsListByPlanId(@Param("page") IPage<PlateResList> page, @Param(Constants.WRAPPER) Wrapper<GoodsDO> wrapper);
|
||||||
|
|
||||||
|
List<GoodsReqVO> selectGoodsAndRemainPlate(@Param("ids") List<Long> ids,@Param("organId") Long organId);
|
||||||
|
|
||||||
|
|
||||||
|
IPage<OrderRespVOCopy> selectNoPlanOrderList(@Param("page") IPage page, @Param(Constants.WRAPPER) Wrapper<GoodsDO> wrapper);
|
||||||
}
|
}
|
||||||
+2
-11
@@ -60,7 +60,7 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
|
|||||||
void deleteByPlateId(@Param("deletePlateIds") List<Long> deletePlateIds);
|
void deleteByPlateId(@Param("deletePlateIds") List<Long> deletePlateIds);
|
||||||
|
|
||||||
|
|
||||||
List<PrintOrderPackReqVO> selectPackList(@Param("orderIds") List<Long> orderIds, @Param("organId") Long organId);
|
List<PrintOrderPackReqVO> selectPackList(@Param("ids") List<Long> ids, @Param("organId") Long organId);
|
||||||
|
|
||||||
|
|
||||||
default int deleteByBodyId(Long bodyId, Long organId) {
|
default int deleteByBodyId(Long bodyId, Long organId) {
|
||||||
@@ -108,15 +108,6 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
|
|||||||
IPage<OrderRespVOCopy> selectTestNum(@Param("page") IPage page,@Param("organId") Long organId);
|
IPage<OrderRespVOCopy> selectTestNum(@Param("page") IPage page,@Param("organId") Long organId);
|
||||||
|
|
||||||
|
|
||||||
|
List<PrintOrderPackReqVO> selectOrderPlateList(@Param("orderId") Long orderId,@Param("organId") Long organId);
|
||||||
default List<OrderItemDO> selectOrderPlateList(List<Long> plateIds, Long organId) {
|
|
||||||
return selectList(new LambdaQueryWrapperX<OrderItemDO>()
|
|
||||||
.eq(OrderItemDO::getOrganId,organId)
|
|
||||||
.inIfPresent(OrderItemDO::getPlateId, plateIds)
|
|
||||||
.select(OrderItemDO::getBodyId,OrderItemDO::getRoomId,OrderItemDO::getGroupId,OrderItemDO::getPlateId));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
+90
-95
@@ -468,13 +468,8 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
OrderSource orderSource = new OrderSource();
|
OrderSource orderSource = new OrderSource();
|
||||||
|
|
||||||
|
|
||||||
// List<GoodsDO> goodsDOS = goodsMapper.selectList(new LambdaQueryWrapperX<GoodsDO>()
|
|
||||||
// .eq(GoodsDO::getOrderId, orderId)
|
|
||||||
// );
|
|
||||||
|
|
||||||
List<GoodsReqVO> goodsDOS = goodsMapper.selectGoodsList(orderId,getUserOrganId());
|
List<GoodsReqVO> goodsDOS = goodsMapper.selectGoodsList(orderId,getUserOrganId());
|
||||||
|
|
||||||
// PlanDO planDO = planMapper.selectByOrderId(orderId);
|
|
||||||
|
|
||||||
List<PlateDetialRespVO> plateDOS = plateMapper.selectPlateDetialList(orderId,getUserOrganId());
|
List<PlateDetialRespVO> plateDOS = plateMapper.selectPlateDetialList(orderId,getUserOrganId());
|
||||||
|
|
||||||
@@ -493,14 +488,6 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// for (PlateDetialRespVO plateDetailsRespVO : plateDOS) {
|
|
||||||
// for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) {
|
|
||||||
// plateDetailsRespVO.setProcessGroupName(groupNameList.getGroupName());
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// 造型数据的尺寸长度
|
// 造型数据的尺寸长度
|
||||||
Integer orderModelSize = plateDOS.size();
|
Integer orderModelSize = plateDOS.size();
|
||||||
|
|
||||||
@@ -515,13 +502,29 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByOrderId(orderId, ORDER_REMAIN_PLATE_MODEL, boardSize);
|
List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByOrderId(orderId, ORDER_REMAIN_PLATE_MODEL, boardSize);
|
||||||
|
|
||||||
|
|
||||||
|
// 查询生产单对应的配件信息
|
||||||
|
List<PrintOrderPartsRespVO> printOrderPartsRespVOS = orderPartsMapper.selectPartList(Collections.singletonList(orderId), getUserOrganId());
|
||||||
|
|
||||||
|
|
||||||
|
// 查询生产单对应的包裹信息
|
||||||
|
List<PrintOrderPackReqVO> printOrderPackReqVOS = orderItemMapper.selectOrderPlateList(orderId, getUserOrganId());
|
||||||
|
|
||||||
|
|
||||||
|
// 统计每个订单的包装数量
|
||||||
|
printOrderPackReqVOS
|
||||||
|
.stream()
|
||||||
|
.filter(f->f
|
||||||
|
.getOrderId().equals(orderId))
|
||||||
|
.forEach(f->f.setPackNum(printOrderPackReqVOS.stream().filter(e -> e.getOrderId().equals(orderId)).map(PrintOrderPackReqVO::getPackId).toList().size()));
|
||||||
|
|
||||||
|
|
||||||
// orderSource.setPlan(planDO);
|
|
||||||
orderSource.setOrderList(Collections.singletonList(orderDO));
|
orderSource.setOrderList(Collections.singletonList(orderDO));
|
||||||
orderSource.setPlateList(plateDOS);
|
orderSource.setPlateList(plateDOS);
|
||||||
orderSource.setGoodsList(goodsDOS);
|
orderSource.setGoodsList(goodsDOS);
|
||||||
orderSource.setPlateModels(orderModelDOS);
|
orderSource.setPlateModels(orderModelDOS);
|
||||||
orderSource.setOptimizeBoardModelDOS(optimizeBoardModelDOS);
|
orderSource.setOptimizeBoardModelDOS(optimizeBoardModelDOS);
|
||||||
|
orderSource.setOrderPartsRespVOS(printOrderPartsRespVOS);
|
||||||
|
orderSource.setOrderPackReqVOS(printOrderPackReqVOS);
|
||||||
return orderSource;
|
return orderSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -547,27 +550,27 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
List<PlateDetialRespVO> plateDetialRespVOS = plateMapper.selectPlateListByGoodsIds(ids, getUserOrganId());
|
List<PlateDetialRespVO> plateDetialRespVOS = plateMapper.selectPlateListByGoodsIds(ids, getUserOrganId());
|
||||||
|
|
||||||
|
|
||||||
List<Long> bodyIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getBodyId).distinct().toList();
|
// List<Long> bodyIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getBodyId).distinct().toList();
|
||||||
|
//
|
||||||
|
//
|
||||||
List<OrderBodyDO> orderBodyDOS = orderBodyMapper.selectOrderBodyList(bodyIds, getUserOrganId());
|
// List<OrderBodyDO> orderBodyDOS = orderBodyMapper.selectOrderBodyList(bodyIds,orderIds, getUserOrganId());
|
||||||
|
//
|
||||||
|
//
|
||||||
List<PlateDetialRespVO> detialRespVOS = new ArrayList<>();
|
//// List<PlateDetialRespVO> detialRespVOS = new ArrayList<>();
|
||||||
|
//
|
||||||
|
//
|
||||||
for (OrderBodyDO orderBodyDO : orderBodyDOS) {
|
// for (OrderBodyDO orderBodyDO : orderBodyDOS) {
|
||||||
|
//
|
||||||
detialRespVOS.addAll(plateDetialRespVOS.stream().filter(f -> f.getBodyId().equals(orderBodyDO.getId())).peek(m -> {
|
// plateDetialRespVOS.stream().filter(f -> f.getBodyId().equals(orderBodyDO.getId())).forEach(m -> {
|
||||||
m.setBodyName(orderBodyDO.getName());
|
// m.setBodyName(orderBodyDO.getName());
|
||||||
m.setRoomName(orderBodyDO.getRoomName());
|
// m.setRoomName(orderBodyDO.getRoomName());
|
||||||
}).toList());
|
// });
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (PlateDetialRespVO plateDetailsRespVO : detialRespVOS) {
|
for (PlateDetialRespVO plateDetailsRespVO : plateDetialRespVOS) {
|
||||||
String name = "";
|
String name = "";
|
||||||
if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) {
|
if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) {
|
||||||
for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) {
|
for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) {
|
||||||
@@ -579,17 +582,17 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
}
|
}
|
||||||
plateDetailsRespVO.setProcessGroupName(name);
|
plateDetailsRespVO.setProcessGroupName(name);
|
||||||
|
|
||||||
plateDetailsRespVO.setGoodsId(goodsDOS
|
// plateDetailsRespVO.setGoodsId(goodsDOS
|
||||||
.stream()
|
// .stream()
|
||||||
.filter(f->f.getId().equals(plateDetailsRespVO.getId()))
|
// .filter(f->f.getId().equals(plateDetailsRespVO.getId()))
|
||||||
.map(GoodsReqVO::getGoodsId)
|
// .map(GoodsReqVO::getGoodsId)
|
||||||
.findAny().orElse(null));
|
// .findAny().orElse(null));
|
||||||
|
|
||||||
plateDetailsRespVO.setGoodsName(goodsDOS
|
// plateDetailsRespVO.setGoodsName(goodsDOS
|
||||||
.stream()
|
// .stream()
|
||||||
.filter(f->f.getId().equals(plateDetailsRespVO.getId()))
|
// .filter(f->f.getId().equals(plateDetailsRespVO.getId()))
|
||||||
.map(GoodsReqVO::getGoodsName)
|
// .map(GoodsReqVO::getGoodsName)
|
||||||
.findAny().orElse(null));
|
// .findAny().orElse(null));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -599,7 +602,10 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
// 造型数据的尺寸长度
|
// 造型数据的尺寸长度
|
||||||
Integer orderModelSize = plateDetialRespVOS.size();
|
Integer orderModelSize = plateDetialRespVOS.size();
|
||||||
|
|
||||||
List<OrderModelDO> orderModelDOS = buildRespByOrderIds(orderIds, ORDER_PLATE_MODEL, orderModelSize);
|
// 需要查询小板造型信息的板材ID
|
||||||
|
List<Long> plateIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getPlateId).toList();
|
||||||
|
|
||||||
|
List<OrderModelDO> orderModelDOS = buildRespByPlateIds(plateIds, orderModelSize);
|
||||||
|
|
||||||
|
|
||||||
// 大板数据的尺寸长度
|
// 大板数据的尺寸长度
|
||||||
@@ -617,7 +623,18 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
List<PrintOrderPartsRespVO> printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId());
|
List<PrintOrderPartsRespVO> printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId());
|
||||||
|
|
||||||
// 查询生产单对应的包裹信息
|
// 查询生产单对应的包裹信息
|
||||||
List<PrintOrderPackReqVO> printOrderPackReqVOS = orderItemMapper.selectPackList(orderIds, getUserOrganId());
|
List<PrintOrderPackReqVO> printOrderPackReqVOS = orderItemMapper.selectPackList(ids, getUserOrganId());
|
||||||
|
|
||||||
|
for (Long orderId : orderIds) {
|
||||||
|
|
||||||
|
// 统计每个订单的包装数量
|
||||||
|
printOrderPackReqVOS
|
||||||
|
.stream()
|
||||||
|
.filter(f->f.getOrderId().equals(orderId))
|
||||||
|
.forEach(f->f.setPackNum(printOrderPackReqVOS.stream().filter(e -> e.getOrderId().equals(orderId)).map(PrintOrderPackReqVO::getPackId).toList().size()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return OrderSource.builder()
|
return OrderSource.builder()
|
||||||
.orderList(orderDOS)
|
.orderList(orderDOS)
|
||||||
@@ -635,24 +652,8 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
|
|
||||||
public OrderSource getOrderSourceByGoodId(List<Long> ids) {
|
public OrderSource getOrderSourceByGoodId(List<Long> ids) {
|
||||||
|
|
||||||
// PlanDO planDO = planMapper.selectById(planId);
|
|
||||||
// if (Objects.isNull(planDO)) {
|
|
||||||
// throw exception(PLAN_NOT_EXISTS);
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// List<GoodsDO> goodsDOS = goodsMapper.selectBatchIds(goodIds);
|
|
||||||
|
|
||||||
List<GoodsReqVO> goodsReqVOS = goodsMapper.selectJoinList(GoodsReqVO.class, new MPJLambdaWrapperX<GoodsDO>()
|
|
||||||
|
|
||||||
.leftJoin(RemainPlateDO.class, RemainPlateDO::getGoodsId, GoodsDO::getId)
|
|
||||||
.selectAll(GoodsDO.class)
|
|
||||||
.selectAs(RemainPlateDO::getId,"remainId")
|
|
||||||
.isNotNull(PlanItemDO::getId)
|
|
||||||
.eq(GoodsDO::getOrganId, getUserOrganId())
|
|
||||||
.in(GoodsDO::getId, ids));
|
|
||||||
|
|
||||||
|
|
||||||
|
List<GoodsReqVO> goodsReqVOS = goodsMapper.selectGoodsAndRemainPlate(ids, getUserOrganId());
|
||||||
|
|
||||||
List<Long> orderIds = goodsReqVOS.stream().map(GoodsReqVO::getOrderId).distinct().toList();
|
List<Long> orderIds = goodsReqVOS.stream().map(GoodsReqVO::getOrderId).distinct().toList();
|
||||||
|
|
||||||
@@ -662,26 +663,23 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
List<PlateDetialRespVO> plateDetialRespVOS = plateMapper.selectPlateListByGoodsIds(ids, getUserOrganId());
|
List<PlateDetialRespVO> plateDetialRespVOS = plateMapper.selectPlateListByGoodsIds(ids, getUserOrganId());
|
||||||
|
|
||||||
|
|
||||||
List<Long> bodyIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getBodyId).distinct().toList();
|
// List<Long> bodyIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getBodyId).distinct().toList();
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// List<OrderBodyDO> orderBodyDOS = orderBodyMapper.selectOrderBodyList(bodyIds,orderIds, getUserOrganId());
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// for (OrderBodyDO orderBodyDO : orderBodyDOS) {
|
||||||
|
//
|
||||||
|
// plateDetialRespVOS.stream().filter(f -> f.getBodyId().equals(orderBodyDO.getId())).forEach(m -> {
|
||||||
|
// m.setBodyName(orderBodyDO.getName());
|
||||||
|
// m.setRoomName(orderBodyDO.getRoomName());
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
List<OrderBodyDO> orderBodyDOS = orderBodyMapper.selectOrderBodyList(bodyIds, getUserOrganId());
|
for (PlateDetialRespVO plateDetailsRespVO : plateDetialRespVOS) {
|
||||||
|
|
||||||
|
|
||||||
List<PlateDetialRespVO> detialRespVOS = new ArrayList<>();
|
|
||||||
|
|
||||||
|
|
||||||
for (OrderBodyDO orderBodyDO : orderBodyDOS) {
|
|
||||||
|
|
||||||
detialRespVOS.addAll(plateDetialRespVOS.stream().filter(f -> f.getBodyId().equals(orderBodyDO.getId())).peek(m -> {
|
|
||||||
m.setBodyName(orderBodyDO.getName());
|
|
||||||
m.setRoomName(orderBodyDO.getRoomName());
|
|
||||||
}).toList());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (PlateDetialRespVO plateDetailsRespVO : detialRespVOS) {
|
|
||||||
String name = "";
|
String name = "";
|
||||||
if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) {
|
if(!plateDetailsRespVO.getProcessGroupLists().isEmpty()) {
|
||||||
for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) {
|
for (ProcessGroupList groupNameList : plateDetailsRespVO.getProcessGroupLists()) {
|
||||||
@@ -694,25 +692,22 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
|
|
||||||
plateDetailsRespVO.setProcessGroupName(name);
|
plateDetailsRespVO.setProcessGroupName(name);
|
||||||
|
|
||||||
plateDetailsRespVO.setGoodsId(goodsReqVOS
|
// // todo 这样写混单时同样适用,后面加混单后这里不用修改
|
||||||
.stream()
|
// plateDetailsRespVO.setGoodsId(goodsReqVOS
|
||||||
.filter(f->f.getId().equals(plateDetailsRespVO.getId()))
|
// .stream()
|
||||||
.map(GoodsReqVO::getGoodsId)
|
// .filter(f->f.getId().equals(plateDetailsRespVO.getId()))
|
||||||
.findAny().orElse(null));
|
// .map(GoodsReqVO::getGoodsId)
|
||||||
|
// .findAny().orElse(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 造型数据的尺寸长度
|
// 造型数据的尺寸长度
|
||||||
Integer orderModelSize = plateDetialRespVOS.size();
|
Integer orderModelSize = plateDetialRespVOS.size();
|
||||||
|
|
||||||
List<OrderModelDO> orderModelDOS = buildRespByOrderIds(orderIds, ORDER_PLATE_MODEL, orderModelSize);
|
// 需要查询的小板造型信息的板材ID
|
||||||
|
List<Long> plateIds = plateDetialRespVOS.stream().map(PlateDetialRespVO::getPlateId).toList();
|
||||||
|
|
||||||
|
List<OrderModelDO> orderModelDOS = buildRespByPlateIds(plateIds, orderModelSize);
|
||||||
// // 查询生产单对应的配件信息
|
|
||||||
// List<PrintOrderPartsRespVO> printOrderPartsRespVOS = orderPartsMapper.selectPartList(orderIds, getUserOrganId());
|
|
||||||
//
|
|
||||||
// // 查询生产单对应的包裹信息
|
|
||||||
// List<PrintOrderPackReqVO> printOrderPackReqVOS = orderItemMapper.selectPackList(orderIds, getUserOrganId());
|
|
||||||
|
|
||||||
return OrderSource.builder()
|
return OrderSource.builder()
|
||||||
.orderList(orderDOS)
|
.orderList(orderDOS)
|
||||||
@@ -832,12 +827,12 @@ public class OptimizePlanServiceImpl implements OptimizePlanService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private List<OrderModelDO> buildRespByOrderIds(Collection<Long> orderIds, String index, Integer size) {
|
private List<OrderModelDO> buildRespByPlateIds(Collection<Long> plateIds, Integer size) {
|
||||||
List<FieldValue> fieldValues = orderIds.stream().map(FieldValue::of).toList();
|
List<FieldValue> fieldValues = plateIds.stream().map(FieldValue::of).toList();
|
||||||
SearchRequest.Builder builder = new SearchRequest.Builder();
|
SearchRequest.Builder builder = new SearchRequest.Builder();
|
||||||
builder.index(index);
|
builder.index(OptimizePlanService.ORDER_PLATE_MODEL);
|
||||||
builder.size(size);
|
builder.size(size);
|
||||||
builder.query(q -> q.terms(b -> b.field("orderId").terms(e -> e.value(fieldValues))));
|
builder.query(q -> q.terms(b -> b.field("plateId").terms(e -> e.value(fieldValues))));
|
||||||
try {
|
try {
|
||||||
SearchResponse<OrderModelDO> search = elasticsearchClient.search(builder.build(), OrderModelDO.class);
|
SearchResponse<OrderModelDO> search = elasticsearchClient.search(builder.build(), OrderModelDO.class);
|
||||||
List<Hit<OrderModelDO>> hits = search.hits().hits();
|
List<Hit<OrderModelDO>> hits = search.hits().hits();
|
||||||
|
|||||||
-1
@@ -65,7 +65,6 @@ public interface PlanService {
|
|||||||
|
|
||||||
Boolean addPlate(AddPlateReq req);
|
Boolean addPlate(AddPlateReq req);
|
||||||
|
|
||||||
Boolean cancellation(Long id);
|
|
||||||
|
|
||||||
PageResult<PlateResList> getPlateByPlanId(GetPlateByPlanIdVO vo);
|
PageResult<PlateResList> getPlateByPlanId(GetPlateByPlanIdVO vo);
|
||||||
|
|
||||||
|
|||||||
+6
-64
@@ -9,7 +9,6 @@ import co.elastic.clients.elasticsearch.core.SearchRequest;
|
|||||||
import co.elastic.clients.elasticsearch.core.SearchResponse;
|
import co.elastic.clients.elasticsearch.core.SearchResponse;
|
||||||
import co.elastic.clients.elasticsearch.core.search.Hit;
|
import co.elastic.clients.elasticsearch.core.search.Hit;
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
|
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
|
||||||
@@ -127,6 +126,7 @@ public class PlanServiceImpl implements PlanService {
|
|||||||
|
|
||||||
List<GoodsDO> goodsDOS = new ArrayList<>();
|
List<GoodsDO> goodsDOS = new ArrayList<>();
|
||||||
|
|
||||||
|
// <大板实际ID,排单ID>
|
||||||
Map<Long,Long> goodsPlanId = new HashMap<>();
|
Map<Long,Long> goodsPlanId = new HashMap<>();
|
||||||
|
|
||||||
Map<Long, List<PlanSaveReqVO.Item>> groupedItems = itemList.stream()
|
Map<Long, List<PlanSaveReqVO.Item>> groupedItems = itemList.stream()
|
||||||
@@ -149,24 +149,12 @@ public class PlanServiceImpl implements PlanService {
|
|||||||
|
|
||||||
goodsPlanId.put(entry.getKey(), plan.getId());
|
goodsPlanId.put(entry.getKey(), plan.getId());
|
||||||
|
|
||||||
// Set<Long> itemIds = plateMapper.selectBatchOrderIdsAndGoodsIds(items,getUserOrganId());
|
|
||||||
|
|
||||||
List<Long> goodsIds = items.stream().map(PlanSaveReqVO.Item::getId).toList();
|
List<Long> goodsIds = items.stream().map(PlanSaveReqVO.Item::getId).toList();
|
||||||
|
|
||||||
List<GoodsDO> goodsDOList = goodsMapper.selectPlanGoodsList(goodsIds, getUserOrganId()).stream().map(m -> m.setPlanId(plan.getId())).toList();
|
List<GoodsDO> goodsDOList = goodsMapper.selectPlanGoodsList(goodsIds, getUserOrganId()).stream().map(m -> m.setPlanId(plan.getId())).toList();
|
||||||
|
|
||||||
goodsDOS.addAll(goodsDOList);
|
goodsDOS.addAll(goodsDOList);
|
||||||
|
|
||||||
// if (CollectionUtil.isNotEmpty(itemIds)) {
|
|
||||||
//
|
|
||||||
// for (Long itemId : itemIds) {
|
|
||||||
// planItemDOS.add(PlanItemDO.builder()
|
|
||||||
// .planId(plan.getId())
|
|
||||||
// .itemId(itemId)
|
|
||||||
// .build());
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,29 +167,6 @@ public class PlanServiceImpl implements PlanService {
|
|||||||
|
|
||||||
return goodsPlanId;
|
return goodsPlanId;
|
||||||
|
|
||||||
//
|
|
||||||
// // 插入
|
|
||||||
// PlanDO plan = BeanUtils.toBean(createReqVO, PlanDO.class);
|
|
||||||
// plan.setSort(0L);
|
|
||||||
// String orderNos = itemList.stream().map(PlanSaveReqVO.Item::getOrderId).distinct().toList().toString();
|
|
||||||
// plan.setOrderNos(orderNos);
|
|
||||||
// plan.setProduceTime(null);
|
|
||||||
// planMapper.insert(plan);
|
|
||||||
//
|
|
||||||
// // 修改对应的生产单的状态为 已排单
|
|
||||||
// List<Long> orderIds = itemList.stream().map(PlanSaveReqVO.Item::getOrderId).toList();
|
|
||||||
//
|
|
||||||
// List<OrderDO> orderDOS = orderMapper.selectBatchIds(orderIds);
|
|
||||||
//
|
|
||||||
// List<OrderDO> orderDOList = orderDOS.stream().map(o -> o.setStatus(OrderStatusEnum.SORTED.getStatus())).toList();
|
|
||||||
//
|
|
||||||
// orderMapper.updateBatch(orderDOList);
|
|
||||||
//
|
|
||||||
// Long planId = plan.getId();
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// // 返回
|
|
||||||
// return plan.getId();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -224,7 +189,7 @@ public class PlanServiceImpl implements PlanService {
|
|||||||
// todo 目前只解决非混单的情况
|
// todo 目前只解决非混单的情况
|
||||||
Long goodsIds = BeanUtils.toBean(goodsMapper.selectPlanGoods(plan.getId(), getUserOrganId()).stream().map(GoodsDO::getGoodsId).toList(), Long.class).get(0);
|
Long goodsIds = BeanUtils.toBean(goodsMapper.selectPlanGoods(plan.getId(), getUserOrganId()).stream().map(GoodsDO::getGoodsId).toList(), Long.class).get(0);
|
||||||
|
|
||||||
if(goodsId.equals(goodsIds)){
|
if(!goodsId.equals(goodsIds)){
|
||||||
throw exception(PLATE_ERROR);
|
throw exception(PLATE_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,7 +203,7 @@ public class PlanServiceImpl implements PlanService {
|
|||||||
|
|
||||||
if (!updateReqVO.getDeleteIds().isEmpty()){
|
if (!updateReqVO.getDeleteIds().isEmpty()){
|
||||||
|
|
||||||
goodsDOS.addAll(goodsMapper.selectPlanGoodsList(ids, getUserOrganId()).stream().map(m -> m.setPlanId(null)).toList());
|
goodsDOS.addAll(goodsMapper.selectPlanGoodsList(updateReqVO.getDeleteIds(), getUserOrganId()).stream().map(m -> m.setPlanId(null)).toList());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,8 +217,8 @@ public class PlanServiceImpl implements PlanService {
|
|||||||
planMapper.updateById(plan);
|
planMapper.updateById(plan);
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// // todo 目前只解决非混单的情况,混单的情况待解决,这个逻辑目前应该不用,排单是否开料判断了,可保留,万一以后需求更改
|
// // todo 目前只解决非混单的情况,混单的情况待解决,这个逻辑目前应该不用(这个逻辑用于判断大板下的小板是否开料,后期应该可用于混单时增加的判断),排单是否开料判断了,可保留,万一以后需求更改
|
||||||
// if(!updateReqVO.getItemList().isEmpty()){
|
// if(!updateReqVO.getItemList().isEmpty()){
|
||||||
//
|
//
|
||||||
// List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByPlanId(plan.getId(), ORDER_REMAIN_PLATE_MODEL, 10);
|
// List<OptimizeBoardModelDO> optimizeBoardModelDOS = buildBoardByPlanId(plan.getId(), ORDER_REMAIN_PLATE_MODEL, 10);
|
||||||
@@ -354,11 +319,6 @@ public class PlanServiceImpl implements PlanService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 目前生产单的状态已经去除待排单,所以无需修改生产单的状态
|
|
||||||
// List<OrderDO> orderDOS = orderMapper.selectBatchIds(orderIds).stream().map(m -> m.setStatus(OrderStatusEnum.SORTED.getStatus())).collect(Collectors.toList());
|
|
||||||
// orderMapper.updateBatch(orderDOS);
|
|
||||||
|
|
||||||
|
|
||||||
// 删除排单对应的优化生产数据
|
// 删除排单对应的优化生产数据
|
||||||
deleteByPlanId(ids, ORDER_REMAIN_PLATE_MODEL);
|
deleteByPlanId(ids, ORDER_REMAIN_PLATE_MODEL);
|
||||||
|
|
||||||
@@ -402,7 +362,7 @@ public class PlanServiceImpl implements PlanService {
|
|||||||
throw exception(PLAN_NOT_EXISTS);
|
throw exception(PLAN_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) && planDO.getMachineId().equals(machineId)){
|
if(planDO.getStatus().equals(PlanStatusEnum.OPENING.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.OPENED.getStatus())){
|
||||||
throw exception(LIST_CHANGES_ARE_PROHIBITED);
|
throw exception(LIST_CHANGES_ARE_PROHIBITED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -972,24 +932,6 @@ public class PlanServiceImpl implements PlanService {
|
|||||||
return Boolean.TRUE;
|
return Boolean.TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public Boolean cancellation(Long id) {
|
|
||||||
PlanDO planDO = planMapper.selectById(id);
|
|
||||||
if (planDO == null) {
|
|
||||||
throw exception(PLAN_NOT_EXISTS);
|
|
||||||
}
|
|
||||||
// if (planDO.getStatus().equals(PlanStatusEnum.NEWORDER.getStatus()) || planDO.getStatus().equals(PlanStatusEnum.BOARDHASBEENAPPLIEDFOR.getStatus())) {
|
|
||||||
// throw exception(PLAN_NOT_ALLOW_CANCEL);
|
|
||||||
// }
|
|
||||||
Set<Long> itemIds = planItemMapper.selectList(new LambdaQueryWrapperX<PlanItemDO>()
|
|
||||||
.eq(PlanItemDO::getOrganId,getUserOrganId())
|
|
||||||
.eq(PlanItemDO::getPlanId, id))
|
|
||||||
.stream().map(PlanItemDO::getItemId)
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
plateMapper.update(new LambdaUpdateWrapper<PlateDO>().in(PlateDO::getId, itemIds).set(PlateDO::getIsCancel, Boolean.TRUE));
|
|
||||||
return Boolean.TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<PlateResList> getPlateByPlanId(GetPlateByPlanIdVO vo) {
|
public PageResult<PlateResList> getPlateByPlanId(GetPlateByPlanIdVO vo) {
|
||||||
|
|||||||
+34
@@ -297,4 +297,38 @@
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
<select id="selectGoodsAndRemainPlate"
|
||||||
|
resultType="com.cf.imes.module.executor.controller.admin.plan.vo.GoodsReqVO">
|
||||||
|
|
||||||
|
select
|
||||||
|
og.*,
|
||||||
|
orp.id as remainId
|
||||||
|
|
||||||
|
from order_goods og
|
||||||
|
left join order_remain_plate orp on og.organ_id = orp.organ_id and og.id = orp.goods_id
|
||||||
|
|
||||||
|
where og.organ_id = #{organId}
|
||||||
|
and og.deleted = false
|
||||||
|
and og.id in
|
||||||
|
<foreach collection="ids" item="ids" open="(" close=")" separator=",">
|
||||||
|
#{ids}
|
||||||
|
</foreach>
|
||||||
|
|
||||||
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
<select id="selectNoPlanOrderList"
|
||||||
|
resultType="com.cf.imes.module.executor.controller.admin.plan.vo.OrderRespVOCopy">
|
||||||
|
|
||||||
|
|
||||||
|
select distinct og.order_id as orderId,og.create_time as updateTime
|
||||||
|
|
||||||
|
from order_goods og
|
||||||
|
left join order_plate op on og.organ_id = op.organ_id and og.order_id = op.order_id and og.id = op.goods_id and og.deleted = op.deleted
|
||||||
|
|
||||||
|
${ew.customSqlSegment}
|
||||||
|
|
||||||
|
</select>
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
+44
-31
@@ -173,35 +173,42 @@
|
|||||||
<resultMap id="PackListMap" type="com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO">
|
<resultMap id="PackListMap" type="com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO">
|
||||||
|
|
||||||
<result property="orderId" column="orderId"/>
|
<result property="orderId" column="orderId"/>
|
||||||
<result property="plateId" column="plateId"/>
|
|
||||||
<result property="packId" column="packId"/>
|
<result property="packId" column="packId"/>
|
||||||
<result property="packNo" column="packNo"/>
|
<result property="packNo" column="packNo"/>
|
||||||
<result property="packNum" column="packNum"/>
|
<result property="packNum" column="packNum"/>
|
||||||
|
|
||||||
|
<collection property="plateId" ofType="java.lang.Long" column="plateId"/>
|
||||||
|
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
|
<!-- <resultMap id="TestMap" type="com.cf.imes.module.executor.controller.admin.plan.saveOptimize.PrintOrderPackReqVO">-->
|
||||||
|
|
||||||
|
<!-- <result property="plateId" column="plateId"/>-->
|
||||||
|
|
||||||
|
<!-- </resultMap>-->
|
||||||
|
|
||||||
|
|
||||||
<select id="selectPackList"
|
<select id="selectPackList"
|
||||||
parameterType="java.lang.Long"
|
parameterType="java.lang.Long"
|
||||||
resultMap="PackListMap">
|
resultMap="PackListMap">
|
||||||
|
|
||||||
|
|
||||||
select distinct oi.order_id as orderId,
|
select distinct op.id as plateId,
|
||||||
oi.plate_id as plateId,
|
op.order_id as orderId,
|
||||||
op.id as packId,
|
o.id as packId,
|
||||||
op.package_no as packNo,
|
o.package_no as packNo
|
||||||
(case when op.status !=0 then count(op.id) end) as packNum
|
from order_plate op
|
||||||
from order_item oi
|
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id
|
||||||
left join order_package op on oi.order_id = op.order_id and oi.organ_id = op.organ_id
|
left join order_package o on oi.organ_id = o.organ_id and oi.order_id = o.order_id and oi.package_id = o.id
|
||||||
|
|
||||||
where oi.parts_id = 0 and oi.organ_id = #{organId}
|
where op.organ_id = #{organId}
|
||||||
and oi.order_id in
|
and op.deleted = false
|
||||||
|
and op.goods_id in
|
||||||
<foreach item="orderIds" collection="orderIds" open="(" separator="," close=")">
|
<foreach item="ids" collection="ids" open="(" separator="," close=")">
|
||||||
#{orderIds}
|
#{ids}
|
||||||
</foreach>
|
</foreach>
|
||||||
group by oi.order_id,oi.plate_id,op.id,op.package_no,op.status;
|
and oi.parts_id = 0
|
||||||
|
and oi.package_id !=0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
@@ -258,20 +265,6 @@
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
<resultMap id="TestMap" type="com.cf.imes.module.executor.controller.admin.plan.vo.OrderRespVOCopy">
|
|
||||||
|
|
||||||
<result property="orderId" column="orderId"/>
|
|
||||||
|
|
||||||
<!-- <collection property="platePages" ofType="com.cf.imes.module.executor.controller.admin.plan.vo.PlatePage" resultMap="Test2Map"/>-->
|
|
||||||
|
|
||||||
</resultMap>
|
|
||||||
|
|
||||||
<resultMap id="Test2Map" type="com.cf.imes.module.executor.controller.admin.plan.vo.PlatePage">
|
|
||||||
|
|
||||||
<result property="plateId" column="plateId"/>
|
|
||||||
|
|
||||||
</resultMap>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<select id="selectTestNum"
|
<select id="selectTestNum"
|
||||||
@@ -288,5 +281,25 @@
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|
||||||
|
<select id="selectOrderPlateList" parameterType="java.lang.Long" resultMap="PackListMap">
|
||||||
|
|
||||||
|
|
||||||
|
select distinct op.id as plateId,
|
||||||
|
op.order_id as orderId,
|
||||||
|
o.id as packId,
|
||||||
|
o.package_no as packNo
|
||||||
|
from order_plate op
|
||||||
|
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id
|
||||||
|
left join order_package o on oi.organ_id = o.organ_id and oi.order_id = o.order_id and oi.package_id = o.id
|
||||||
|
|
||||||
|
where op.organ_id = #{organId}
|
||||||
|
and op.deleted = false
|
||||||
|
and op.order_id = #{orderId}
|
||||||
|
and oi.parts_id = 0
|
||||||
|
and oi.package_id !=0
|
||||||
|
|
||||||
|
|
||||||
|
</select>
|
||||||
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
+5
-4
@@ -101,11 +101,12 @@
|
|||||||
op.name,
|
op.name,
|
||||||
op.order_id
|
op.order_id
|
||||||
from order_parts op
|
from order_parts op
|
||||||
join order_item oi on op.id = oi.parts_id and op.organ_id = oi.organ_id
|
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.parts_id
|
||||||
join order_body ob on oi.body_id = ob.id and oi.organ_id = ob.organ_id
|
left join order_body ob on oi.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id
|
||||||
where op.organ_id = #{organId}
|
|
||||||
and op.order_id in
|
|
||||||
|
|
||||||
|
where op.organ_id = #{organId}
|
||||||
|
and op.deleted = false
|
||||||
|
and op.order_id in
|
||||||
<foreach item="orderIds" collection="orderIds" open="(" separator="," close=")">
|
<foreach item="orderIds" collection="orderIds" open="(" separator="," close=")">
|
||||||
#{orderIds}
|
#{orderIds}
|
||||||
</foreach>
|
</foreach>
|
||||||
|
|||||||
+14
-7
@@ -231,11 +231,12 @@
|
|||||||
op.is_row_hole as hasHole
|
op.is_row_hole as hasHole
|
||||||
|
|
||||||
from order_plate op
|
from order_plate op
|
||||||
join order_goods ogs on op.goods_id = ogs.id and op.organ_id = ogs.organ_id
|
left join order_goods ogs on op.organ_id = ogs.organ_id and op.order_id = ogs.order_id and op.goods_id = ogs.id
|
||||||
join order_item oi on op.id = oi.plate_id and op.organ_id = oi.organ_id
|
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id
|
||||||
join order_body ob on oi.body_id = ob.id and oi.organ_id = ob.organ_id
|
left join order_group og on oi.organ_id = og.organ_id and oi.order_id = og.order_id and oi.group_id = og.id
|
||||||
left join order_group og on oi.group_id = og.id and oi.organ_id = og.organ_id
|
left join order_body ob on oi.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id
|
||||||
where op.order_id =#{orderId} and op.organ_id = #{organId} and op.deleted = false
|
|
||||||
|
where op.organ_id = #{organId} and op.deleted = false and op.order_id = #{orderId}
|
||||||
|
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
@@ -822,6 +823,10 @@
|
|||||||
oi.group_id as groupId,
|
oi.group_id as groupId,
|
||||||
oi.room_id as roomId,
|
oi.room_id as roomId,
|
||||||
og.name as groupName,
|
og.name as groupName,
|
||||||
|
ob.name as bodyName,
|
||||||
|
ob.room_name as roomName,
|
||||||
|
ogs.goods_id as plateGoodsId,
|
||||||
|
ogs.goods_name as goodsName,
|
||||||
|
|
||||||
op.id as plateId,
|
op.id as plateId,
|
||||||
op.order_id as orderId,
|
op.order_id as orderId,
|
||||||
@@ -864,8 +869,10 @@
|
|||||||
op.is_row_hole as hasHole
|
op.is_row_hole as hasHole
|
||||||
|
|
||||||
from order_plate op
|
from order_plate op
|
||||||
left join order_item oi on op.organ_id = oi.organ_id and op.id = oi.plate_id
|
left join order_goods ogs on op.organ_id = ogs.organ_id and op.order_id = ogs.order_id and op.goods_id = ogs.id
|
||||||
left join order_group og on oi.organ_id = og.organ_id and oi.group_id = og.id
|
left join order_item oi on op.organ_id = oi.organ_id and op.order_id = oi.order_id and op.id = oi.plate_id
|
||||||
|
left join order_group og on oi.organ_id = og.organ_id and oi.order_id = og.order_id and oi.group_id = og.id
|
||||||
|
left join order_body ob on oi.organ_id = ob.organ_id and oi.order_id = ob.order_id and oi.body_id = ob.id
|
||||||
|
|
||||||
where op.organ_id = #{organId} and op.deleted = false and op.goods_id in
|
where op.organ_id = #{organId} and op.deleted = false and op.goods_id in
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user