add:增加托盘倒库手持批量组盘;
生产入库托盘混托入库回传;
发货通知单,销售出库单回传。
This commit is contained in:
@@ -22,7 +22,7 @@ public enum StatusEnum {
|
|||||||
/**
|
/**
|
||||||
* 单据状态
|
* 单据状态
|
||||||
*/
|
*/
|
||||||
FORM_STATUS(ForkMap.of("生成", "10", null, "已分配", "13", null, "下发", "15", null, "执行中", "20", null, "暂停", "30", null, "完成", "80", null, "强制完成", "82", null, "取消", "90", null)),
|
FORM_STATUS(ForkMap.of("生成", "10", null, "已分配", "13", null, "下发", "15", null, "执行中", "20", null, "暂停", "30", null, "待回传", "40", null, "完成", "80", null, "强制完成", "82", null, "取消", "90", null)),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 出入库单据类型退货出库
|
* 出入库单据类型退货出库
|
||||||
@@ -45,7 +45,7 @@ public enum StatusEnum {
|
|||||||
*/
|
*/
|
||||||
ERP_TYPE(ForkMap.of("PRD_MO", "10", "生产订单", "PUR_ReceiveBill", "11", "收料通知单",
|
ERP_TYPE(ForkMap.of("PRD_MO", "10", "生产订单", "PUR_ReceiveBill", "11", "收料通知单",
|
||||||
"SAL_SaleOrder", "12", "销售订单", "PRD_INSTOCK", "13", "生产入库单", "STK_InStock", "14", "采购入库单",
|
"SAL_SaleOrder", "12", "销售订单", "PRD_INSTOCK", "13", "生产入库单", "STK_InStock", "14", "采购入库单",
|
||||||
"SAL_RETURNSTOCK", "15", "销售退货入库单", "PUR_MRB", "18", "采购退料出库单",
|
"SAL_RETURNSTOCK", "15", "销售退货入库单", "SAL_OUTSTOCK", "16", "销售出库单", "PUR_MRB", "18", "采购退料出库单",
|
||||||
"SUB_PickMtrl", "19", "委外用料清单", "PRD_PPBOM", "20", "生产用料清单", "PRD_PickMtrl", "21", "生产领料单",
|
"SUB_PickMtrl", "19", "委外用料清单", "PRD_PPBOM", "20", "生产用料清单", "PRD_PickMtrl", "21", "生产领料单",
|
||||||
"SP_PickMtrl", "22", "简单生产领料单", "STK_TransferDirect", "23", "调拨出库单", "STK_MisDelivery", "26", "其他出库单", "PRD_ReturnMtrl", "27", "生产退料单", "PRD_FeedMtrl", "28", "生产补料单", "SUB_RETURNMTRL", "29", "委外退料单")),
|
"SP_PickMtrl", "22", "简单生产领料单", "STK_TransferDirect", "23", "调拨出库单", "STK_MisDelivery", "26", "其他出库单", "PRD_ReturnMtrl", "27", "生产退料单", "PRD_FeedMtrl", "28", "生产补料单", "SUB_RETURNMTRL", "29", "委外退料单")),
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package org.nl.wms.decision_manage.handler.chainer.impl;
|
package org.nl.wms.decision_manage.handler.chainer.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.github.javaparser.utils.Log;
|
import com.github.javaparser.utils.Log;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -11,6 +13,8 @@ import org.nl.common.enums.StatusEnum;
|
|||||||
import org.nl.common.utils.SecurityUtils;
|
import org.nl.common.utils.SecurityUtils;
|
||||||
import org.nl.common.utils.SpringContextHolder;
|
import org.nl.common.utils.SpringContextHolder;
|
||||||
import org.nl.wms.decision_manage.handler.chainer.DecisionerChain;
|
import org.nl.wms.decision_manage.handler.chainer.DecisionerChain;
|
||||||
|
import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService;
|
||||||
|
import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask;
|
||||||
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
|
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
|
||||||
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
|
import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater;
|
||||||
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
|
import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
|
||||||
@@ -55,9 +59,20 @@ public class EndDecisionChainer extends DecisionerChain<List> {
|
|||||||
boolean in_storage = StatusEnum.STRATEGY_TYPE.code("入库").equals(strategy_type);
|
boolean in_storage = StatusEnum.STRATEGY_TYPE.code("入库").equals(strategy_type);
|
||||||
IStIvtStructattrService iStIvtStructattrService = SpringContextHolder.getBean(IStIvtStructattrService.class);
|
IStIvtStructattrService iStIvtStructattrService = SpringContextHolder.getBean(IStIvtStructattrService.class);
|
||||||
IMdPbVehicleMaterService iMdPbVehicleMaterService = SpringContextHolder.getBean(IMdPbVehicleMaterService.class);
|
IMdPbVehicleMaterService iMdPbVehicleMaterService = SpringContextHolder.getBean(IMdPbVehicleMaterService.class);
|
||||||
|
ISchBaseTaskService iSchBaseTaskService = SpringContextHolder.getBean(ISchBaseTaskService.class);
|
||||||
List<String> structs = new ArrayList<>();
|
List<String> structs = new ArrayList<>();
|
||||||
//入库分配
|
//入库分配
|
||||||
if (in_storage) {
|
if (in_storage) {
|
||||||
|
//混托任务判断
|
||||||
|
if (startParam.getString("vehicle_code").contains("T")) {
|
||||||
|
List<SchBaseTask> schBaseTaskList = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>()
|
||||||
|
.eq("vehicle_code", startParam.getString("vehicle_code")).select("point_code2")
|
||||||
|
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
|
||||||
|
if (CollectionUtil.isNotEmpty(schBaseTaskList)) {
|
||||||
|
structs.add(schBaseTaskList.get(0).getPoint_code2());
|
||||||
|
return structs;
|
||||||
|
}
|
||||||
|
}
|
||||||
StIvtStructattr struct = (StIvtStructattr) transfers.get(0);
|
StIvtStructattr struct = (StIvtStructattr) transfers.get(0);
|
||||||
UpdateWrapper<StIvtStructattr> updateWrapper = new UpdateWrapper<>();
|
UpdateWrapper<StIvtStructattr> updateWrapper = new UpdateWrapper<>();
|
||||||
updateWrapper.set("lock_type", StatusEnum.LOCK.code("入库锁"))
|
updateWrapper.set("lock_type", StatusEnum.LOCK.code("入库锁"))
|
||||||
|
|||||||
@@ -70,11 +70,12 @@ public class GroupDickInStorageTask extends AbstractTask {
|
|||||||
}
|
}
|
||||||
String groupId = item.get(0).getGroup_id();
|
String groupId = item.get(0).getGroup_id();
|
||||||
MdGruopDick mst = iMdGruopDickService.getById(groupId);
|
MdGruopDick mst = iMdGruopDickService.getById(groupId);
|
||||||
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>()
|
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
|
||||||
.eq("vehicle_code", vehicle_code).select("task_code")
|
.lt("status", StatusEnum.FORM_STATUS.code("完成")).select("vehicle_code"));
|
||||||
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
|
if (!CollectionUtils.isEmpty(list)){
|
||||||
if (schBaseTask != null) {
|
if (!list.get(0).getVehicle_code().contains("T")) {
|
||||||
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "已经存任务" + schBaseTask.getTask_code());
|
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "已经存任务" + list.get(0).getTask_code());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
JSONObject mstJ = (JSONObject) JSONObject.toJSON(mst);
|
JSONObject mstJ = (JSONObject) JSONObject.toJSON(mst);
|
||||||
MdPbVehicleMaterVo vehicleMater = item.get(0);
|
MdPbVehicleMaterVo vehicleMater = item.get(0);
|
||||||
|
|||||||
@@ -53,16 +53,20 @@ public class InStorageTask extends AbstractTask {
|
|||||||
if (StringUtils.isEmpty(vehicle_code) ||StringUtils.isEmpty(start_point)||StringUtils.isEmpty(struct_code)){
|
if (StringUtils.isEmpty(vehicle_code) ||StringUtils.isEmpty(start_point)||StringUtils.isEmpty(struct_code)){
|
||||||
throw new BadRequestException("创建任务失败:方法请求参数不能为空");
|
throw new BadRequestException("创建任务失败:方法请求参数不能为空");
|
||||||
}
|
}
|
||||||
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
|
|
||||||
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
|
|
||||||
if (!CollectionUtils.isEmpty(list)){
|
|
||||||
throw new BadRequestException("当前载具存在任务:"+list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(",")));
|
|
||||||
}
|
|
||||||
SchBaseTask task = new SchBaseTask();
|
SchBaseTask task = new SchBaseTask();
|
||||||
|
task.setStatus(StatusEnum.FORM_STATUS.code("生成"));
|
||||||
|
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
|
||||||
|
.lt("status", StatusEnum.FORM_STATUS.code("完成")).select("vehicle_code"));
|
||||||
|
if (!CollectionUtils.isEmpty(list)){
|
||||||
|
if (!list.get(0).getVehicle_code().contains("T")) {
|
||||||
|
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "已经存任务" + list.get(0).getTask_code());
|
||||||
|
}else {
|
||||||
|
task.setStatus(StatusEnum.FORM_STATUS.code("待回传"));
|
||||||
|
}
|
||||||
|
}
|
||||||
task.setId(IdUtil.getStringId());
|
task.setId(IdUtil.getStringId());
|
||||||
task.setSource_form_id(from.getString("id"));
|
task.setSource_form_id(from.getString("id"));
|
||||||
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
|
task.setTask_code(CodeUtil.getNewCode("TASK_CODE"));
|
||||||
task.setStatus(StatusEnum.FORM_STATUS.code("生成"));
|
|
||||||
task.setHandle_class(this.getClass().getName());
|
task.setHandle_class(this.getClass().getName());
|
||||||
task.setAcs_type(StatusEnum.ACS_TYPE.code("立库"));
|
task.setAcs_type(StatusEnum.ACS_TYPE.code("立库"));
|
||||||
task.setCreate_time(DateUtil.now());
|
task.setCreate_time(DateUtil.now());
|
||||||
|
|||||||
@@ -29,7 +29,9 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -82,58 +84,80 @@ public class PalletInStorageTask extends AbstractTask {
|
|||||||
if (CollectionUtils.isEmpty(item)) {
|
if (CollectionUtils.isEmpty(item)) {
|
||||||
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "载具物料信息信息不存在");
|
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "载具物料信息信息不存在");
|
||||||
}
|
}
|
||||||
MdPbVehicleMaterVo vehicleMaterVo = item.get(0);
|
List<MdPbVehicleMaterVo> newVehicleMater =new ArrayList<>();
|
||||||
String remark = vehicleMaterVo.getRemark();
|
//混托任务判断
|
||||||
String isCheck = StringUtils.isNotBlank(vehicleMaterVo.getIs_check()) ? "1" : vehicleMaterVo.getIs_check();
|
if (item.get(0).getVehicle_code().contains("T")&&item.size() > 1) {
|
||||||
if ("空托盘入库".equals(remark)) {
|
newVehicleMater= item.stream().filter(r -> r.getNeed_pick() == null || !r.getNeed_pick()).collect(Collectors.toList());
|
||||||
iBmVehicleInfoService.update(new UpdateWrapper<BmVehicleInfo>()
|
if (newVehicleMater.size() ==item.size()) {
|
||||||
.set("h", Integer.valueOf(h))
|
newVehicleMater.get(0).setNeed_pick(true);
|
||||||
.set("update_time", DateUtil.now())
|
}else{
|
||||||
.set("update_name", "ACS托盘入库申请")
|
item.stream().filter(r -> r.getNeed_pick() != null && r.getNeed_pick()).findFirst().ifPresent(newVehicleMater::add);
|
||||||
.eq("vehicle_code", vehicle_code));
|
|
||||||
MdPbVehicleMaterVo vehicleMater = item.get(0);
|
|
||||||
//拣选回库流程
|
|
||||||
BussEventMulticaster.Publish(
|
|
||||||
new FlowStartEvent("pallet_in",
|
|
||||||
(proc_inst_id,empPlace) -> iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
|
|
||||||
.set("proc_inst_id",proc_inst_id)
|
|
||||||
.eq("vehicle_code",vehicle_code)
|
|
||||||
.eq("is_delete",false))
|
|
||||||
,new JSONObject(MapOf.of("start_point", point_code1)))
|
|
||||||
.build("md_pb_vehicleMater",vehicleMater.getId(),null,null, (JSONObject) JSONObject.toJSON(vehicleMater))
|
|
||||||
);
|
|
||||||
}else {
|
|
||||||
String groupId = vehicleMaterVo.getGroup_id();
|
|
||||||
MdGruopDick mst = iMdGruopDickService.getById(groupId);
|
|
||||||
if (mst == null) {
|
|
||||||
throw new BadRequestException("申请任务失败,载具没有组盘信息!");
|
|
||||||
}
|
}
|
||||||
SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>()
|
} else {
|
||||||
.eq("vehicle_code", vehicle_code).select("task_code")
|
newVehicleMater = item;
|
||||||
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
|
|
||||||
if (schBaseTask != null) {
|
|
||||||
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "已经存任务" + schBaseTask.getTask_code());
|
|
||||||
}
|
|
||||||
iBmVehicleInfoService.update(new UpdateWrapper<BmVehicleInfo>()
|
|
||||||
.set("h", Integer.valueOf(h))
|
|
||||||
.set("update_time", DateUtil.now())
|
|
||||||
.set("update_name", "ACS托盘入库申请")
|
|
||||||
.eq("vehicle_code",vehicle_code));
|
|
||||||
|
|
||||||
JSONObject mstJ = (JSONObject) JSONObject.toJSON(mst);
|
|
||||||
MdPbVehicleMaterVo vehicleMater = vehicleMaterVo;
|
|
||||||
mstJ.put("stor_code", vehicleMater.getStor_code());
|
|
||||||
BussEventMulticaster.Publish(
|
|
||||||
new FlowStartEvent("md_group",
|
|
||||||
(proc_inst_id, empPlace) -> iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
|
|
||||||
.set("proc_inst_id", proc_inst_id)
|
|
||||||
.eq("vehicle_code", vehicle_code)
|
|
||||||
.eq("is_delete", false))
|
|
||||||
, new JSONObject(MapOf.of("start_point", point_code1, "isCheck", isCheck)))
|
|
||||||
.build("md_group_dick", mst.getId(), mst.getSource_form_type(), mst.getSource_form_id(), mstJ)
|
|
||||||
.build("md_pb_vehicleMater", item)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
newVehicleMater.forEach(r -> {
|
||||||
|
String remark = r.getRemark();
|
||||||
|
String isCheck = StringUtils.isNotBlank(r.getIs_check()) ? "1" : r.getIs_check();
|
||||||
|
if ("空托盘入库".equals(remark)) {
|
||||||
|
iBmVehicleInfoService.update(new UpdateWrapper<BmVehicleInfo>()
|
||||||
|
.set("h", Integer.valueOf(h))
|
||||||
|
.set("update_time", DateUtil.now())
|
||||||
|
.set("update_name", "ACS托盘入库申请")
|
||||||
|
.eq("vehicle_code", vehicle_code));
|
||||||
|
MdPbVehicleMaterVo vehicleMater = item.get(0);
|
||||||
|
//拣选回库流程
|
||||||
|
BussEventMulticaster.Publish(
|
||||||
|
new FlowStartEvent("pallet_in",
|
||||||
|
(proc_inst_id, empPlace) -> iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
|
||||||
|
.set("proc_inst_id", proc_inst_id)
|
||||||
|
.eq("vehicle_code", vehicle_code)
|
||||||
|
.eq("is_delete", false))
|
||||||
|
, new JSONObject(MapOf.of("start_point", point_code1)))
|
||||||
|
.build("md_pb_vehicleMater", vehicleMater.getId(), null, null, (JSONObject) JSONObject.toJSON(vehicleMater))
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
String groupId = r.getGroup_id();
|
||||||
|
MdGruopDick mst = iMdGruopDickService.getById(groupId);
|
||||||
|
if (mst == null) {
|
||||||
|
throw new BadRequestException("申请任务失败,载具没有组盘信息!");
|
||||||
|
}
|
||||||
|
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
|
||||||
|
.lt("status", StatusEnum.FORM_STATUS.code("完成")).select("vehicle_code"));
|
||||||
|
if (!CollectionUtils.isEmpty(list)) {
|
||||||
|
if (!list.get(0).getVehicle_code().contains("T")) {
|
||||||
|
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "已经存任务" + list.get(0).getTask_code());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>()
|
||||||
|
// .eq("vehicle_code", vehicle_code).select("task_code","vehicle_code")
|
||||||
|
// .lt("status", StatusEnum.FORM_STATUS.code("完成")));
|
||||||
|
// if (schBaseTask != null) {
|
||||||
|
// if (!schBaseTask.getVehicle_code().contains("T")) {
|
||||||
|
// throw new BadRequestException("申请任务失败:载具" + vehicle_code + "已经存任务" + schBaseTask.getTask_code());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
iBmVehicleInfoService.update(new UpdateWrapper<BmVehicleInfo>()
|
||||||
|
.set("h", Integer.valueOf(h))
|
||||||
|
.set("update_time", DateUtil.now())
|
||||||
|
.set("update_name", "ACS托盘入库申请")
|
||||||
|
.eq("vehicle_code", vehicle_code));
|
||||||
|
|
||||||
|
JSONObject mstJ = (JSONObject) JSONObject.toJSON(mst);
|
||||||
|
MdPbVehicleMaterVo vehicleMater = r;
|
||||||
|
mstJ.put("stor_code", vehicleMater.getStor_code());
|
||||||
|
BussEventMulticaster.Publish(
|
||||||
|
new FlowStartEvent("md_group",
|
||||||
|
(proc_inst_id, empPlace) -> iMdPbVehicleMaterService.update(new UpdateWrapper<MdPbVehicleMater>()
|
||||||
|
.set("proc_inst_id", proc_inst_id)
|
||||||
|
.eq("vehicle_code", vehicle_code)
|
||||||
|
.eq("is_delete", false))
|
||||||
|
, new JSONObject(MapOf.of("start_point", point_code1, "isCheck", isCheck)))
|
||||||
|
.build("md_group_dick", mst.getId(), mst.getSource_form_type(), mst.getSource_form_id(), mstJ)
|
||||||
|
.build("md_pb_vehicleMater", item)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
|
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
|
||||||
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
|
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
|
||||||
if (ObjectUtils.isNotEmpty(list)) {
|
if (ObjectUtils.isNotEmpty(list)) {
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ public class FormActivityBehavior extends FlowNodeActivityBehavior<JSONObject> {
|
|||||||
mst_json.put("source_form_type",handler.getString("source_form_type"));
|
mst_json.put("source_form_type",handler.getString("source_form_type"));
|
||||||
StIvtIostorinv mst = mst_json.toJavaObject(StIvtIostorinv.class);
|
StIvtIostorinv mst = mst_json.toJavaObject(StIvtIostorinv.class);
|
||||||
handler.put("form_id",mst.getId());
|
handler.put("form_id",mst.getId());
|
||||||
|
|
||||||
JSONArray itemArr = handler.getJSONArray("item");
|
JSONArray itemArr = handler.getJSONArray("item");
|
||||||
if(itemArr !=null){
|
if(itemArr !=null){
|
||||||
for (int i = 0; i < itemArr.size(); i++) {
|
for (int i = 0; i < itemArr.size(); i++) {
|
||||||
|
|||||||
@@ -79,6 +79,19 @@ public class MdGruopDickController {
|
|||||||
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
|
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping("/mixingGroupDick")
|
||||||
|
@Log("托盘混料组盘")
|
||||||
|
@SaIgnore
|
||||||
|
public ResponseEntity<Object> mixingGroupDick(@RequestBody MaterGroupDto dicks) {
|
||||||
|
RedissonUtils.lock(() -> {
|
||||||
|
iMdGruopDickService.mixingGroupDick((JSONObject) JSONObject.toJSON(dicks));
|
||||||
|
}, "托盘混料组盘", null);
|
||||||
|
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@PostMapping
|
@PostMapping
|
||||||
@Log("人工组盘入库")
|
@Log("人工组盘入库")
|
||||||
@SaIgnore
|
@SaIgnore
|
||||||
|
|||||||
@@ -27,6 +27,10 @@ public interface IMdGruopDickService extends IService<MdGruopDick> {
|
|||||||
Object queryAll(GroupDickQuery query, PageQuery page);
|
Object queryAll(GroupDickQuery query, PageQuery page);
|
||||||
|
|
||||||
void groupDick(JSONObject form);
|
void groupDick(JSONObject form);
|
||||||
|
void mixingGroupDick(JSONObject form);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void delete(@RequestBody String[] ids);
|
void delete(@RequestBody String[] ids);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ import java.util.stream.Collectors;
|
|||||||
@Service
|
@Service
|
||||||
public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGruopDick> implements IMdGruopDickService {
|
public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGruopDick> implements IMdGruopDickService {
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
|
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
|
||||||
@Autowired
|
@Autowired
|
||||||
@@ -121,6 +122,118 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
|
|||||||
return build;
|
return build;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void mixingGroupDick(JSONObject forms) {
|
||||||
|
List<Map> tableData = (List) forms.remove("item");
|
||||||
|
String vehicleCode = forms.getString("vehicle_code");
|
||||||
|
if (CollectionUtils.isEmpty(forms)) {
|
||||||
|
throw new BadRequestException("组盘失败:入库明细数据不能为空");
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(vehicleCode)) {
|
||||||
|
throw new BadRequestException("组盘失败:载具" + vehicleCode + "信息不能为空!");
|
||||||
|
}
|
||||||
|
if (!vehicleCode.contains("T")) {
|
||||||
|
throw new BadRequestException("组盘失败:载具" + vehicleCode + "不是托盘,不能进行混料组盘!");
|
||||||
|
}
|
||||||
|
BmVehicleInfo vehicleInfo = iBmVehicleInfoService.vehileInfo(vehicleCode);
|
||||||
|
if (vehicleInfo == null) {
|
||||||
|
throw new BadRequestException("组盘失败:载具" + vehicleCode + "信息不存在请在载具信息中维护");
|
||||||
|
}
|
||||||
|
Integer h = vehicleInfo.getH();
|
||||||
|
RedissonUtils.lock(() -> {
|
||||||
|
//组盘前库存校验
|
||||||
|
QueryWrapper<StIvtStructattr> ivtList = new QueryWrapper<StIvtStructattr>()
|
||||||
|
.eq("vehicle_code", vehicleInfo.getVehicle_code());
|
||||||
|
List<StIvtStructattr> existList = iStIvtStructattrService.list(ivtList);
|
||||||
|
if (ObjectUtils.isNotEmpty(existList)) {
|
||||||
|
throw new BadRequestException(String.format("组盘失败:当前载具号在立库的库位中未出库:%s中,请核查库存记录!", existList.get(0).getStruct_code()));
|
||||||
|
}
|
||||||
|
if (!vehicleInfo.getVehicle_code().contains("T")) {
|
||||||
|
//组盘前符合条件库位数量校验
|
||||||
|
QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>()
|
||||||
|
.eq("is_used", true)
|
||||||
|
.eq("lock_type", StatusEnum.LOCK.code("无锁"))
|
||||||
|
.eq("stor_code", forms.getString("stor_code"))
|
||||||
|
.isNull("vehicle_code");
|
||||||
|
if (h != null) {
|
||||||
|
query.ge("h", h);
|
||||||
|
}
|
||||||
|
int structCount = iStIvtStructattrService.count(query);
|
||||||
|
if (structCount < DictConstantPool.STRUCT_COUNT) {
|
||||||
|
throw new BadRequestException("入库失败:当前仓库可用库位小于" + DictConstantPool.STRUCT_COUNT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, StatusEnum.STRATEGY_TYPE.code("入库") + forms.getString("stor_code"), 5);
|
||||||
|
String now = DateUtil.now();
|
||||||
|
forms.put("create_name", SecurityUtils.getCurrentNickName());
|
||||||
|
forms.put("create_time", now);
|
||||||
|
forms.put("status", StatusEnum.FORM_STATUS.code("生成"));
|
||||||
|
List<MdPbVehicleMater> vehicleMaters = new ArrayList<>();
|
||||||
|
Map<String, MdGruopDick> map = new HashMap<>();
|
||||||
|
if (!CollectionUtils.isEmpty(forms)) {
|
||||||
|
//父级组盘
|
||||||
|
MdGruopDick mdGruopDick = new MdGruopDick();
|
||||||
|
String groupDick = null;
|
||||||
|
List<MdPbVehicleMater> tmpCount = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
|
||||||
|
.eq("is_delete", false)
|
||||||
|
.in("vehicle_code", forms.getString("vehicle_code")));
|
||||||
|
if (tmpCount.size() > 0) {
|
||||||
|
groupDick = tmpCount.get(0).getGroup_id();
|
||||||
|
mdGruopDick.setStatus(StatusEnum.FORM_STATUS.code("完成"));
|
||||||
|
mdGruopDick.setUpdate_name(SecurityUtils.getCurrentNickName());
|
||||||
|
mdGruopDick.setUpdate_time(now);
|
||||||
|
mdGruopDick.setForm_data(forms.getJSONObject("form_data"));
|
||||||
|
} else {
|
||||||
|
MdGruopDick dick = forms.toJavaObject(MdGruopDick.class);
|
||||||
|
dick.setVehicle_code(vehicleCode);
|
||||||
|
dick.setCode(CodeUtil.getNewCode("md_group_dick"));
|
||||||
|
dick.setId(IdUtil.getStringId());
|
||||||
|
groupDick = dick.getId();
|
||||||
|
dick.setStatus(StatusEnum.FORM_STATUS.code("完成"));
|
||||||
|
dick.setCreate_name(SecurityUtils.getCurrentNickName());
|
||||||
|
dick.setCreate_time(now);
|
||||||
|
dick.setForm_data(forms.getJSONObject("form_data"));
|
||||||
|
map.put(vehicleCode, dick);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < tableData.size(); i++) {
|
||||||
|
Map itemMap = tableData.get(i);
|
||||||
|
JSONObject item = new JSONObject(itemMap);
|
||||||
|
//子级组盘
|
||||||
|
MdPbVehicleMater vehicleMater = item.toJavaObject(MdPbVehicleMater.class);
|
||||||
|
vehicleMater.setGroup_id(groupDick);
|
||||||
|
vehicleMater.setVehicle_code(vehicleCode);
|
||||||
|
vehicleMater.setUnit_id("100438");//个
|
||||||
|
vehicleMater.setStor_code(vehicleCode.toUpperCase().contains("T") ? "FStockPallet" : "FStockId");
|
||||||
|
vehicleMater.setId(IdUtil.getStringId());
|
||||||
|
vehicleMater.setCreate_time(now);
|
||||||
|
vehicleMater.setCreate_name(SecurityUtils.getCurrentNickName());
|
||||||
|
vehicleMaters.add(vehicleMater);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
boolean count = vehicleMaters.stream()
|
||||||
|
.filter(vm -> vm.getVehicle_code() != null && vm.getVehicle_code().contains("T"))
|
||||||
|
//按载具和物料分组
|
||||||
|
.collect(Collectors.groupingBy(
|
||||||
|
vm -> vm.getVehicle_code() + "_" + vm.getMaterial_id(),
|
||||||
|
Collectors.mapping(MdPbVehicleMater::getPcsn, Collectors.toSet())
|
||||||
|
))
|
||||||
|
.values().stream()
|
||||||
|
.anyMatch(pcsnSet -> pcsnSet.size() > 1);
|
||||||
|
if (count) {
|
||||||
|
throw new BadRequestException("组盘失败,原因:同一个载具存在相同物料不同批次的数据,相同物料不同批次不符合混料组盘,请检查或分开组盘!");
|
||||||
|
}
|
||||||
|
//参数校验
|
||||||
|
// List<MdGruopDick> tmpCount2 = this.list(new QueryWrapper<MdGruopDick>().in("vehicle_code", map.keySet()).lt("status", StatusEnum.FORM_STATUS.code("完成")));
|
||||||
|
// if (tmpCount2.size() > 0) {
|
||||||
|
// throw new BadRequestException("组盘失败:当前载具存在未完成的组盘信息" + tmpCount2.stream().map(MdGruopDick::getVehicle_code).collect(Collectors.joining(",")));
|
||||||
|
// }
|
||||||
|
this.saveBatch(map.values());
|
||||||
|
iMdPbVehicleMaterService.saveBatch(vehicleMaters);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void groupDick(JSONObject forms) {
|
public void groupDick(JSONObject forms) {
|
||||||
@@ -172,8 +285,11 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
|
|||||||
String vehicle_code = item.getString("vehicle_code");
|
String vehicle_code = item.getString("vehicle_code");
|
||||||
MdPbVehicleMater vehicleMater = item.toJavaObject(MdPbVehicleMater.class);
|
MdPbVehicleMater vehicleMater = item.toJavaObject(MdPbVehicleMater.class);
|
||||||
MdGruopDick mdGruopDick = map.get(vehicle_code);
|
MdGruopDick mdGruopDick = map.get(vehicle_code);
|
||||||
if (mdGruopDick ==null){
|
if (mdGruopDick == null) {
|
||||||
MdGruopDick dick = forms.toJavaObject(MdGruopDick.class);
|
MdGruopDick dick = forms.toJavaObject(MdGruopDick.class);
|
||||||
|
if (dick == null) {
|
||||||
|
dick = new MdGruopDick();
|
||||||
|
}
|
||||||
dick.setVehicle_code(vehicle_code);
|
dick.setVehicle_code(vehicle_code);
|
||||||
dick.setCode(CodeUtil.getNewCode("md_group_dick"));
|
dick.setCode(CodeUtil.getNewCode("md_group_dick"));
|
||||||
dick.setId(IdUtil.getStringId());
|
dick.setId(IdUtil.getStringId());
|
||||||
@@ -181,7 +297,7 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
|
|||||||
dick.setCreate_name(SecurityUtils.getCurrentNickName());
|
dick.setCreate_name(SecurityUtils.getCurrentNickName());
|
||||||
dick.setCreate_time(now);
|
dick.setCreate_time(now);
|
||||||
dick.setForm_data(forms.getJSONObject("form_data"));
|
dick.setForm_data(forms.getJSONObject("form_data"));
|
||||||
map.put(vehicle_code,dick);
|
map.put(vehicle_code, dick);
|
||||||
vehicleMater.setGroup_id(dick.getId());
|
vehicleMater.setGroup_id(dick.getId());
|
||||||
}else {
|
}else {
|
||||||
vehicleMater.setGroup_id(mdGruopDick.getId());
|
vehicleMater.setGroup_id(mdGruopDick.getId());
|
||||||
@@ -196,27 +312,50 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
|
|||||||
vehicleMaters.add(vehicleMater);
|
vehicleMaters.add(vehicleMater);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//参数校验
|
//混托不校验
|
||||||
List<MdGruopDick> tmpCount2= this.list(new QueryWrapper<MdGruopDick>().in("vehicle_code", map.keySet()).lt("status", StatusEnum.FORM_STATUS.code("完成")));
|
if (!vehicle0.contains("T")) {
|
||||||
if (tmpCount2.size()>0){
|
List<MdGruopDick> tmpCount2 = this.list(new QueryWrapper<MdGruopDick>().in("vehicle_code", map.keySet()).lt("status", StatusEnum.FORM_STATUS.code("完成")));
|
||||||
throw new BadRequestException("组盘失败:当前载具存在未完成的组盘信息"+tmpCount2.stream().map(MdGruopDick::getVehicle_code).collect(Collectors.joining(",")));
|
if (tmpCount2.size() > 0) {
|
||||||
}
|
throw new BadRequestException("组盘失败:当前载具存在未完成的组盘信息" + tmpCount2.stream().map(MdGruopDick::getVehicle_code).collect(Collectors.joining(",")));
|
||||||
int tmpCount = iBmVehicleInfoService.count(new QueryWrapper<BmVehicleInfo>().in("vehicle_code", map.keySet()));
|
}
|
||||||
if (tmpCount<map.size()){
|
} else {
|
||||||
throw new BadRequestException("组盘失败:载具编号不存在");
|
//参数校验
|
||||||
}
|
int tmpCount = iBmVehicleInfoService.count(new QueryWrapper<BmVehicleInfo>().in("vehicle_code", map.keySet()));
|
||||||
List<MdPbVehicleMater> tmpCount1 = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
|
if (tmpCount < map.size()) {
|
||||||
.eq("is_delete",false)
|
throw new BadRequestException("组盘失败:载具编号不存在");
|
||||||
.in("vehicle_code", map.keySet()));
|
}
|
||||||
if (tmpCount1.size()>0){
|
List<MdPbVehicleMater> checkMaterList = new ArrayList<>(vehicleMaters);
|
||||||
//托盘组盘校验
|
List<MdPbVehicleMater> vehicleMaterList = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
|
||||||
List<MdPbVehicleMater> collect = tmpCount1.stream().filter(mdPbVehicleMater -> mdPbVehicleMater.getNeed_pick()&&mdPbVehicleMater.getVehicle_code().contains("T")).collect(Collectors.toList());
|
.eq("is_delete", false)
|
||||||
if (!CollectionUtils.isEmpty(collect)) {
|
.eq("vehicle_code", vehicle0));
|
||||||
String vehicles = collect.stream().map(MdPbVehicleMater::getVehicle_code).collect(Collectors.joining(","));
|
if (ObjectUtils.isNotEmpty(vehicleMaterList)) {
|
||||||
throw new BadRequestException("载具" + vehicles + "为拣选回库无需组盘");
|
checkMaterList.addAll(vehicleMaterList);
|
||||||
|
}
|
||||||
|
boolean count = checkMaterList.stream()
|
||||||
|
.filter(vm -> vm.getVehicle_code() != null && vm.getVehicle_code().contains("T"))
|
||||||
|
//按载具和物料分组
|
||||||
|
.collect(Collectors.groupingBy(
|
||||||
|
vm -> vm.getVehicle_code() + "_" + vm.getMaterial_id(),
|
||||||
|
Collectors.mapping(MdPbVehicleMater::getPcsn, Collectors.toSet())
|
||||||
|
))
|
||||||
|
.values().stream()
|
||||||
|
.anyMatch(pcsnSet -> pcsnSet.size() > 1);
|
||||||
|
if (count) {
|
||||||
|
throw new BadRequestException("组盘失败!原因:该托盘存在物料编码相同但批次不同的数据,相同物料不同批次不符合混料组盘,请检查或分开组盘!");
|
||||||
}
|
}
|
||||||
throw new BadRequestException("组盘失败:载具已经存在组盘信息" + tmpCount1.stream().map(MdPbVehicleMater::getVehicle_code).collect(Collectors.joining(",")));
|
|
||||||
}
|
}
|
||||||
|
// List<MdPbVehicleMater> tmpCount1 = iMdPbVehicleMaterService.list(new QueryWrapper<MdPbVehicleMater>()
|
||||||
|
// .eq("is_delete",false)
|
||||||
|
// .in("vehicle_code", map.keySet()));
|
||||||
|
// if (tmpCount1.size()>0){
|
||||||
|
// //托盘组盘校验
|
||||||
|
// List<MdPbVehicleMater> collect = tmpCount1.stream().filter(mdPbVehicleMater -> mdPbVehicleMater.getNeed_pick()&&mdPbVehicleMater.getVehicle_code().contains("T")).collect(Collectors.toList());
|
||||||
|
// if (!CollectionUtils.isEmpty(collect)) {
|
||||||
|
// String vehicles = collect.stream().map(MdPbVehicleMater::getVehicle_code).collect(Collectors.joining(","));
|
||||||
|
// throw new BadRequestException("载具" + vehicles + "为拣选回库无需组盘");
|
||||||
|
// }
|
||||||
|
// throw new BadRequestException("组盘失败:载具已经存在组盘信息" + tmpCount1.stream().map(MdPbVehicleMater::getVehicle_code).collect(Collectors.joining(",")));
|
||||||
|
// }
|
||||||
this.saveBatch(map.values());
|
this.saveBatch(map.values());
|
||||||
iMdPbVehicleMaterService.saveBatch(vehicleMaters);
|
iMdPbVehicleMaterService.saveBatch(vehicleMaters);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,10 @@ import java.util.List;
|
|||||||
@Data
|
@Data
|
||||||
public class MaterGroupDto {
|
public class MaterGroupDto {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 载具编号
|
||||||
|
*/
|
||||||
|
private String vehicle_code;
|
||||||
/**
|
/**
|
||||||
* 仓库编码
|
* 仓库编码
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ public class PdaInController {
|
|||||||
public ResponseEntity<TableDataInfo> confirm(@RequestBody PdaFormInMst pdaFormInMst) {
|
public ResponseEntity<TableDataInfo> confirm(@RequestBody PdaFormInMst pdaFormInMst) {
|
||||||
RedissonUtils.lock(() -> {
|
RedissonUtils.lock(() -> {
|
||||||
pdaInIOService.pdaInIostorUseCode(pdaFormInMst);
|
pdaInIOService.pdaInIostorUseCode(pdaFormInMst);
|
||||||
}, pdaFormInMst.getBillNo(), null);
|
}, "合格证入库", null);
|
||||||
return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK);
|
return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,40 @@ public class PdaInIOService {
|
|||||||
* 回传代码
|
* 回传代码
|
||||||
*/
|
*/
|
||||||
public void pdaInIostorUseCode(PdaFormInMst mst) {
|
public void pdaInIostorUseCode(PdaFormInMst mst) {
|
||||||
|
// if (CollectionUtils.isEmpty(mstList)) {
|
||||||
|
// throw new BadRequestException("组盘信息为空,请检查!");
|
||||||
|
// }
|
||||||
|
// if (mstList.get(0).getVehicle_code().contains("T")) {
|
||||||
|
// boolean count = mstList.stream()
|
||||||
|
// .filter(vm -> vm.getVehicle_code() != null && vm.getVehicle_code().contains("T"))
|
||||||
|
// .collect(Collectors.groupingBy(
|
||||||
|
// vm -> vm.getVehicle_code() + "_" + vm.getMaterial_id(),
|
||||||
|
// Collectors.mapping(PdaFormInMst::getPcsn, Collectors.toSet())
|
||||||
|
// ))
|
||||||
|
// .values().stream()
|
||||||
|
// .anyMatch(pcsnSet -> pcsnSet.size() > 1);
|
||||||
|
// if (count) {
|
||||||
|
// throw new BadRequestException("组盘失败,原因:同一个载具存在相同物料不同批次的数据,相同物料不同批次不符合混料组盘,请检查或分开组盘!");
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// if (mstList.size() > 1) {
|
||||||
|
// throw new BadRequestException("组盘失败,原因:料箱组盘只能放入一种物料!");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// mstList.forEach(mst -> {
|
||||||
|
if (mst.getVehicle_code().contains("T")) {
|
||||||
|
// boolean count = mstList.stream()
|
||||||
|
// .filter(vm -> vm.getVehicle_code() != null && vm.getVehicle_code().contains("T"))
|
||||||
|
// .collect(Collectors.groupingBy(
|
||||||
|
// vm -> vm.getVehicle_code() + "_" + vm.getMaterial_id(),
|
||||||
|
// Collectors.mapping(PdaFormInMst::getPcsn, Collectors.toSet())
|
||||||
|
// ))
|
||||||
|
// .values().stream()
|
||||||
|
// .anyMatch(pcsnSet -> pcsnSet.size() > 1);
|
||||||
|
// if (count) {
|
||||||
|
// throw new BadRequestException("组盘失败,原因:同一个载具存在相同物料不同批次的数据,相同物料不同批次不符合混料组盘,请检查或分开组盘!");
|
||||||
|
// }
|
||||||
|
}
|
||||||
String materialId = mst.getMaterial_id();
|
String materialId = mst.getMaterial_id();
|
||||||
String vehicleCode = mst.getVehicle_code();
|
String vehicleCode = mst.getVehicle_code();
|
||||||
String unitId = mst.getUnit_id();
|
String unitId = mst.getUnit_id();
|
||||||
@@ -79,7 +113,7 @@ public class PdaInIOService {
|
|||||||
throw new BadRequestException("入库失败,物料单位ID在系统中不存在");
|
throw new BadRequestException("入库失败,物料单位ID在系统中不存在");
|
||||||
}
|
}
|
||||||
BmVehicleInfo vehicleInfo = iBmVehicleInfoService.vehileInfo(vehicleCode);
|
BmVehicleInfo vehicleInfo = iBmVehicleInfoService.vehileInfo(vehicleCode);
|
||||||
if (vehicleInfo==null){
|
if (vehicleInfo == null) {
|
||||||
throw new BadRequestException("入库失败,载具编码在基础信息中不存在");
|
throw new BadRequestException("入库失败,载具编码在基础信息中不存在");
|
||||||
}
|
}
|
||||||
groupDto.setSource_form_type(mst.getForm_type());
|
groupDto.setSource_form_type(mst.getForm_type());
|
||||||
@@ -102,6 +136,7 @@ public class PdaInIOService {
|
|||||||
materItem.setForm_data(groupItemData);
|
materItem.setForm_data(groupItemData);
|
||||||
groupDto.setItem(ListOf.of(materItem));
|
groupDto.setItem(ListOf.of(materItem));
|
||||||
iMdGruopDickService.groupDick((JSONObject) JSONObject.toJSON(groupDto));
|
iMdGruopDickService.groupDick((JSONObject) JSONObject.toJSON(groupDto));
|
||||||
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user