账务处理业务区分优化
This commit is contained in:
@@ -64,7 +64,7 @@ public interface IApiWcsService {
|
|||||||
* @param param
|
* @param param
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public AjaxResult sendReturnMydoJob(Map<String, Object> param);
|
public AjaxResult sendBackMydoJob(Map<String, Object> param);
|
||||||
|
|
||||||
public AjaxResult sendOutMydoJob(Map<String, Object> param);
|
public AjaxResult sendOutMydoJob(Map<String, Object> param);
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import cn.hutool.json.JSONUtil;
|
|||||||
import com.ruoyi.api.domain.wcsJobHandle.WmsJobHandler;
|
import com.ruoyi.api.domain.wcsJobHandle.WmsJobHandler;
|
||||||
import com.ruoyi.api.domain.wcsStockin.WcsStockinReceive;
|
import com.ruoyi.api.domain.wcsStockin.WcsStockinReceive;
|
||||||
import com.ruoyi.api.domain.wcsStockin.WcsStockinResponse;
|
import com.ruoyi.api.domain.wcsStockin.WcsStockinResponse;
|
||||||
import com.ruoyi.api.domain.wcsStockout.WcsStockoutParam;
|
|
||||||
import com.ruoyi.api.service.IApiWcsService;
|
import com.ruoyi.api.service.IApiWcsService;
|
||||||
import com.ruoyi.bas.cargospace.domain.BasCargoSpace;
|
import com.ruoyi.bas.cargospace.domain.BasCargoSpace;
|
||||||
import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService;
|
import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService;
|
||||||
@@ -22,14 +21,12 @@ import com.ruoyi.bas.stock.service.IBasStockService;
|
|||||||
import com.ruoyi.common.*;
|
import com.ruoyi.common.*;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.core.text.Convert;
|
import com.ruoyi.common.core.text.Convert;
|
||||||
import com.ruoyi.common.utils.MessageUtils;
|
|
||||||
import com.ruoyi.in.bind.domain.InTrayMsg;
|
import com.ruoyi.in.bind.domain.InTrayMsg;
|
||||||
import com.ruoyi.in.bind.service.IInTrayMsgService;
|
import com.ruoyi.in.bind.service.IInTrayMsgService;
|
||||||
import com.ruoyi.in.job.domain.MydoJob;
|
import com.ruoyi.in.job.domain.MydoJob;
|
||||||
import com.ruoyi.in.job.service.IMydoJobService;
|
import com.ruoyi.in.job.service.IMydoJobService;
|
||||||
import com.ruoyi.in.jobdetail.domain.MydoJobDetail;
|
import com.ruoyi.in.jobdetail.domain.MydoJobDetail;
|
||||||
import com.ruoyi.in.jobdetail.service.IMydoJobDetailService;
|
import com.ruoyi.in.jobdetail.service.IMydoJobDetailService;
|
||||||
import com.ruoyi.kpi.domain.BasCargoSpaceStatus;
|
|
||||||
import com.ruoyi.log.domain.RequestLog;
|
import com.ruoyi.log.domain.RequestLog;
|
||||||
import com.ruoyi.log.service.IRequestLogService;
|
import com.ruoyi.log.service.IRequestLogService;
|
||||||
import com.ruoyi.out.stockout.service.IOutStockoutService;
|
import com.ruoyi.out.stockout.service.IOutStockoutService;
|
||||||
@@ -39,11 +36,9 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static com.ruoyi.common.core.domain.AjaxResult.error;
|
import static com.ruoyi.common.core.domain.AjaxResult.error;
|
||||||
import static com.ruoyi.common.core.domain.AjaxResult.success;
|
import static com.ruoyi.common.core.domain.AjaxResult.success;
|
||||||
@@ -283,7 +278,7 @@ public class ApiWcsService implements IApiWcsService {
|
|||||||
//回流入库
|
//回流入库
|
||||||
jobId = basJobIdService.getId(JobIdType.MYDOJOB_PICK_RETURN);
|
jobId = basJobIdService.getId(JobIdType.MYDOJOB_PICK_RETURN);
|
||||||
taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN_BACK);
|
taskNo = basTaskNoService.getTaskNo(TaskIdType.TASK_STOCKIN_BACK);
|
||||||
taskType = TaskType.TASKTYPE_PICK_RETURN;
|
taskType = TaskType.TASKTYPE_PICK_BACK;
|
||||||
}else{
|
}else{
|
||||||
//货物入库
|
//货物入库
|
||||||
jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN);
|
jobId = basJobIdService.getId(JobIdType.MYDOJOB_STOCKIN);
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ public class TaskType {
|
|||||||
/**
|
/**
|
||||||
* 拣选回流
|
* 拣选回流
|
||||||
*/
|
*/
|
||||||
public static final int TASKTYPE_PICK_RETURN = 3;
|
public static final int TASKTYPE_PICK_BACK = 3;
|
||||||
public static final String TASKTYPE_PICK_RETURN_STR = "3";
|
public static final String TASKTYPE_PICK_BACK_STR = "3";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 移库
|
* 移库
|
||||||
|
|||||||
@@ -5,9 +5,7 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.core.lang.UUID;
|
|
||||||
import cn.hutool.core.util.ObjUtil;
|
import cn.hutool.core.util.ObjUtil;
|
||||||
import com.alibaba.fastjson2.JSON;
|
|
||||||
import com.ruoyi.api.service.IApiWcsService;
|
import com.ruoyi.api.service.IApiWcsService;
|
||||||
import com.ruoyi.bas.cargospace.domain.BasCargoSpace;
|
import com.ruoyi.bas.cargospace.domain.BasCargoSpace;
|
||||||
import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService;
|
import com.ruoyi.bas.cargospace.service.IBasCargoSpaceService;
|
||||||
@@ -26,7 +24,6 @@ import com.ruoyi.in.bind.domain.InTrayMsg;
|
|||||||
import com.ruoyi.in.bind.service.IInTrayMsgService;
|
import com.ruoyi.in.bind.service.IInTrayMsgService;
|
||||||
import com.ruoyi.in.jobdetail.domain.MydoJobDetail;
|
import com.ruoyi.in.jobdetail.domain.MydoJobDetail;
|
||||||
import com.ruoyi.in.jobdetail.service.IMydoJobDetailService;
|
import com.ruoyi.in.jobdetail.service.IMydoJobDetailService;
|
||||||
import com.ruoyi.in.stockin.domain.InStockin;
|
|
||||||
import com.ruoyi.in.stockindetail.domain.InStockinDetail;
|
import com.ruoyi.in.stockindetail.domain.InStockinDetail;
|
||||||
import com.ruoyi.in.stockindetail.service.IInStockinDetailService;
|
import com.ruoyi.in.stockindetail.service.IInStockinDetailService;
|
||||||
import com.ruoyi.in.stockin.service.IInStockinService;
|
import com.ruoyi.in.stockin.service.IInStockinService;
|
||||||
@@ -259,10 +256,9 @@ public class MydoJobServiceImpl implements IMydoJobService
|
|||||||
//任务状态标记为【作废】
|
//任务状态标记为【作废】
|
||||||
mydoJob.setStatus(TaskStatusEnum.CANCEL.getCode());
|
mydoJob.setStatus(TaskStatusEnum.CANCEL.getCode());
|
||||||
updateMydoJob(mydoJob);
|
updateMydoJob(mydoJob);
|
||||||
|
log.warn("【手动作废】执行成功,当前作业已标记为<手动作废>,作业号:{}", jobId);
|
||||||
}
|
}
|
||||||
|
|
||||||
log.warn("【手动操作】执行成功,当前作业已标记为<手动作废>,作业号:{}", jobId);
|
|
||||||
|
|
||||||
return AjaxResult.success();
|
return AjaxResult.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,7 +354,7 @@ public class MydoJobServiceImpl implements IMydoJobService
|
|||||||
//>>>>>>>>>>>>>>>>>>>>>>>常规入库<<<<<<<<<<<<<<<<<<<<<<<<
|
//>>>>>>>>>>>>>>>>>>>>>>>常规入库<<<<<<<<<<<<<<<<<<<<<<<<
|
||||||
//>>>>>>>>>>>>>>>>>>>>>>>常规入库<<<<<<<<<<<<<<<<<<<<<<<<
|
//>>>>>>>>>>>>>>>>>>>>>>>常规入库<<<<<<<<<<<<<<<<<<<<<<<<
|
||||||
//>>>>>>>>>>>>>>>>>>>>>>>常规入库<<<<<<<<<<<<<<<<<<<<<<<<
|
//>>>>>>>>>>>>>>>>>>>>>>>常规入库<<<<<<<<<<<<<<<<<<<<<<<<
|
||||||
if (type == TaskType.TASKTYPE_STOCKIN || type == TaskType.TASKTYPE_PICK_RETURN){
|
if (type == TaskType.TASKTYPE_STOCKIN || type == TaskType.TASKTYPE_PICK_BACK){
|
||||||
|
|
||||||
//获取当前托盘绑定信息
|
//获取当前托盘绑定信息
|
||||||
List<InTrayMsg> inTrayMsgs = inTrayMsgService.selectInTrayMsgList(
|
List<InTrayMsg> inTrayMsgs = inTrayMsgService.selectInTrayMsgList(
|
||||||
@@ -505,7 +501,7 @@ public class MydoJobServiceImpl implements IMydoJobService
|
|||||||
log.info("【账务处理】更新货位状态,作业号:{},货位编号:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode());
|
log.info("【账务处理】更新货位状态,作业号:{},货位编号:{},托盘号:{}", jobId, cargoSpace.getCargoSpaceId(), mydoJob.getTrayCode());
|
||||||
|
|
||||||
//--------------------处理任务表和子任务表--------------------
|
//--------------------处理任务表和子任务表--------------------
|
||||||
//1.更新任务主表状态并移除作业
|
//1.更新任务主表状态
|
||||||
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
|
mydoJob.setStatus(TaskStatusEnum.AUTO_FINISHED.getCode());
|
||||||
|
|
||||||
log.info("【账务处理】出库完成,等待确认,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
|
log.info("【账务处理】出库完成,等待确认,作业号:{},托盘号:{}", jobId, mydoJob.getTrayCode());
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ public interface IPdaService {
|
|||||||
* @param request 绑盘请求体,包含托盘号和物料明细列表
|
* @param request 绑盘请求体,包含托盘号和物料明细列表
|
||||||
* @return 成功插入条数
|
* @return 成功插入条数
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
String bindTray(BindTrayRequest request);
|
String bindTray(BindTrayRequest request);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ public class PdaServiceImpl implements IPdaService {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 绑定托盘信息(多托盘)
|
* 绑定托盘信息(多物料)
|
||||||
* @param bindTrayMsg 绑盘请求体,包含托盘号和物料明细列表
|
* @param bindTrayMsg 绑盘请求体,包含托盘号和物料明细列表
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -334,7 +334,7 @@ public class PdaServiceImpl implements IPdaService {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 作废托盘绑定信息(多托盘)
|
* 作废托盘绑定信息(多物料)
|
||||||
* @param rollerNumber
|
* @param rollerNumber
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -496,7 +496,7 @@ public class PdaServiceImpl implements IPdaService {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 版辊出库确认
|
* 单个版辊出库确认
|
||||||
* @param params
|
* @param params
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -534,7 +534,7 @@ public class PdaServiceImpl implements IPdaService {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 托盘出库确认
|
* 托盘整体出库确认
|
||||||
* @param trayCode
|
* @param trayCode
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ public class MydoJobHandler {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 手动作废作业账务处理
|
* 账务处理 - 手动作废作业
|
||||||
*/
|
*/
|
||||||
@Scheduled(fixedRate = TIMEINTERVAL_2000)
|
// @Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||||
public void cancelMydoJobHandler(){
|
public void cancelMydoJobHandler(){
|
||||||
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
||||||
new MydoJob().builder()
|
new MydoJob().builder()
|
||||||
@@ -176,9 +176,200 @@ public class MydoJobHandler {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 手动完成作业账务处理
|
* 账务处理 - 手动作废作业 - 入库
|
||||||
*/
|
*/
|
||||||
@Scheduled(fixedRate = TIMEINTERVAL_2000)
|
@Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||||
|
public void cancelMydoJobHandler_in(){
|
||||||
|
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
||||||
|
new MydoJob().builder()
|
||||||
|
.status(TaskStatusEnum.CANCEL.getCode())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mydoJobs.isEmpty()) return;
|
||||||
|
|
||||||
|
for (MydoJob mydoJob : mydoJobs) {
|
||||||
|
//任务子表
|
||||||
|
List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(mydoJob.getJobId());
|
||||||
|
if (!details.isEmpty()){
|
||||||
|
//移除任务子表
|
||||||
|
mydoJobDetailService.insertMydoJobDetailsForJobFinish(mydoJob.getJobId());
|
||||||
|
mydoJobDetailService.deleteMydoJobDetailsByJobId(mydoJob.getJobId());
|
||||||
|
log.info("【手动作废任务】移除任务明细,作业号:{}", mydoJob.getJobId());
|
||||||
|
}
|
||||||
|
//库存子表
|
||||||
|
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (!stocks.isEmpty()){
|
||||||
|
for (BasStock stock : stocks){
|
||||||
|
stock.setCargoSpaceId(mydoJob.getTargetCargoSpaceId());
|
||||||
|
stock.setStockStatus(BasStockCode.STOCK_STATUS_AVAILABLE);
|
||||||
|
basStockService.updateBasStock(stock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//恢复货位状态
|
||||||
|
//入库
|
||||||
|
if (mydoJob.getInOrOut() < 20 && mydoJob.getInOrOut() != TaskType.TASKTYPE_PICK_STOCK_MOVE){
|
||||||
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
|
||||||
|
BasStockInfo stockInfo = basStockInfoService.selectBasStockInfoByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (ObjUtil.isNotNull(stockInfo)){
|
||||||
|
basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode());
|
||||||
|
}
|
||||||
|
for (MydoJobDetail mydoJobDetail : details){
|
||||||
|
//还原子单数量
|
||||||
|
InStockinDetail inStockinDetail = inStockinDetailService.selectInStockinDetailByRollerNumber(mydoJobDetail.getRollerNumber());
|
||||||
|
if (ObjUtil.isNotNull(inStockinDetail)){
|
||||||
|
inStockinDetail.setScanNum(BigDecimal.ZERO);
|
||||||
|
inStockinDetail.setAssignNum(BigDecimal.ZERO);
|
||||||
|
inStockinDetail.setStatus(0);
|
||||||
|
inStockinDetailService.updateInStockinDetail(inStockinDetail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
|
||||||
|
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
|
||||||
|
|
||||||
|
// apiWcsService.cancelWcsMydojob()
|
||||||
|
|
||||||
|
log.info("【账务处理-入库】任务作废,更新货位信息,作业号:{}", mydoJob.getJobId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 账务处理 - 手动作废作业 - 出库
|
||||||
|
*/
|
||||||
|
@Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||||
|
public void cancelMydoJobHandler_out(){
|
||||||
|
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
||||||
|
new MydoJob().builder()
|
||||||
|
.status(TaskStatusEnum.CANCEL.getCode())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mydoJobs.isEmpty()) return;
|
||||||
|
|
||||||
|
for (MydoJob mydoJob : mydoJobs) {
|
||||||
|
//任务子表
|
||||||
|
List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(mydoJob.getJobId());
|
||||||
|
if (!details.isEmpty()){
|
||||||
|
//移除任务子表
|
||||||
|
mydoJobDetailService.insertMydoJobDetailsForJobFinish(mydoJob.getJobId());
|
||||||
|
mydoJobDetailService.deleteMydoJobDetailsByJobId(mydoJob.getJobId());
|
||||||
|
log.info("【手动作废任务】移除任务明细,作业号:{}", mydoJob.getJobId());
|
||||||
|
}
|
||||||
|
//库存子表
|
||||||
|
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (!stocks.isEmpty()){
|
||||||
|
for (BasStock stock : stocks){
|
||||||
|
stock.setCargoSpaceId(mydoJob.getTargetCargoSpaceId());
|
||||||
|
stock.setStockStatus(BasStockCode.STOCK_STATUS_AVAILABLE);
|
||||||
|
basStockService.updateBasStock(stock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//恢复货位状态
|
||||||
|
//出库
|
||||||
|
if (mydoJob.getInOrOut() >= 20){
|
||||||
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED);
|
||||||
|
|
||||||
|
BasStockInfo stockInfo = basStockInfoService.selectBasStockInfoByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (ObjUtil.isNotNull(stockInfo)){
|
||||||
|
stockInfo.setCargoSpaceId(mydoJob.getCargoSpaceId());
|
||||||
|
basStockInfoService.updateBasStockInfo(stockInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (MydoJobDetail mydoJobDetail : details){
|
||||||
|
//还原子单数量
|
||||||
|
OutStockoutDetail outStockoutDetail = outStockoutDetailService.selectOutStockoutDetailByRollerNumber(mydoJobDetail.getRollerNumber());
|
||||||
|
if(ObjUtil.isNotNull(outStockoutDetail)){
|
||||||
|
outStockoutDetail.setAllotNum(BigDecimal.ZERO);
|
||||||
|
outStockoutDetail.setAssignNum(BigDecimal.ZERO);
|
||||||
|
outStockoutDetail.setStatus(0);
|
||||||
|
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
|
||||||
|
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
|
||||||
|
|
||||||
|
log.info("【账务处理-出库】任务作废,更新货位和库存信息,作业号:{}", mydoJob.getJobId());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 账务处理 - 手动作废作业 - 移库
|
||||||
|
*/
|
||||||
|
@Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||||
|
public void cancelMydoJobHandler_move(){
|
||||||
|
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
||||||
|
new MydoJob().builder()
|
||||||
|
.status(TaskStatusEnum.CANCEL.getCode())
|
||||||
|
.inOrOut(TaskType.TASKTYPE_PICK_STOCK_MOVE)
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mydoJobs.isEmpty()) return;
|
||||||
|
|
||||||
|
for (MydoJob mydoJob : mydoJobs) {
|
||||||
|
//任务子表
|
||||||
|
List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(mydoJob.getJobId());
|
||||||
|
if (!details.isEmpty()){
|
||||||
|
//移除任务子表
|
||||||
|
mydoJobDetailService.insertMydoJobDetailsForJobFinish(mydoJob.getJobId());
|
||||||
|
mydoJobDetailService.deleteMydoJobDetailsByJobId(mydoJob.getJobId());
|
||||||
|
log.info("【手动作废任务】移除任务明细,作业号:{}", mydoJob.getJobId());
|
||||||
|
}
|
||||||
|
//库存子表
|
||||||
|
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (!stocks.isEmpty()){
|
||||||
|
for (BasStock stock : stocks){
|
||||||
|
stock.setCargoSpaceId(mydoJob.getTargetCargoSpaceId());
|
||||||
|
stock.setStockStatus(BasStockCode.STOCK_STATUS_AVAILABLE);
|
||||||
|
basStockService.updateBasStock(stock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//恢复货位状态
|
||||||
|
//源位置
|
||||||
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED);
|
||||||
|
//目标位置
|
||||||
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getTargetCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
|
||||||
|
BasStockInfo stockInfo = basStockInfoService.selectBasStockInfoByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (ObjUtil.isNotNull(stockInfo)){
|
||||||
|
stockInfo.setCargoSpaceId(mydoJob.getCargoSpaceId());
|
||||||
|
basStockInfoService.updateBasStockInfo(stockInfo);
|
||||||
|
}
|
||||||
|
mydoJobService.insertMydoJobFinish(mydoJob.getJobId());
|
||||||
|
mydoJobService.deleteMydoJobByJobId(mydoJob.getJobId());
|
||||||
|
log.info(
|
||||||
|
"【账务处理-移库】任务作废,更新库存和货位信息,作业号:{},托盘号:{},源位置:{},目标位置:{}", mydoJob.getJobId(), mydoJob.getTrayCode(), mydoJob.getCargoSpaceId(), mydoJob.getTargetCargoSpaceId()
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//====================================================================================================
|
||||||
|
//====================================================================================================
|
||||||
|
//====================================================================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 账务处理 - 手动完成作业
|
||||||
|
*/
|
||||||
|
// @Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||||
public void manualCompleteMydoJobHandler(){
|
public void manualCompleteMydoJobHandler(){
|
||||||
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
||||||
new MydoJob().builder()
|
new MydoJob().builder()
|
||||||
@@ -317,6 +508,245 @@ public class MydoJobHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 账务处理 - 手动完成作业 - 入库
|
||||||
|
*/
|
||||||
|
@Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||||
|
public void manualCompleteMydoJobHandler_in(){
|
||||||
|
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
||||||
|
new MydoJob().builder()
|
||||||
|
.status(TaskStatusEnum.MANUAL_FINISHED.getCode())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mydoJobs.isEmpty()) return;
|
||||||
|
|
||||||
|
for (MydoJob mydoJob : mydoJobs) {
|
||||||
|
//任务子表
|
||||||
|
List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(mydoJob.getJobId());
|
||||||
|
if (!details.isEmpty()){
|
||||||
|
//移除任务子表
|
||||||
|
mydoJobDetailService.insertMydoJobDetailsForJobFinish(mydoJob.getJobId());
|
||||||
|
mydoJobDetailService.deleteMydoJobDetailsByJobId(mydoJob.getJobId());
|
||||||
|
log.info("【手动完成任务】移除任务明细,作业号:{}", mydoJob.getJobId());
|
||||||
|
}
|
||||||
|
//库存子表
|
||||||
|
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (!stocks.isEmpty()){
|
||||||
|
for (BasStock stock : stocks){
|
||||||
|
stock.setCargoSpaceId(mydoJob.getTargetCargoSpaceId());
|
||||||
|
stock.setStockStatus(BasStockCode.STOCK_STATUS_AVAILABLE);
|
||||||
|
basStockService.updateBasStock(stock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//恢复货位状态
|
||||||
|
//入库
|
||||||
|
if (mydoJob.getInOrOut() < 20){
|
||||||
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED);
|
||||||
|
|
||||||
|
//生成库存编号
|
||||||
|
String stockId = basJobIdService.getId(JobIdType.STOCK);
|
||||||
|
|
||||||
|
//插入库存主表
|
||||||
|
BasStockInfo info = basStockInfoService.selectBasStockInfoByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (ObjUtil.isNull(info)){
|
||||||
|
basStockInfoService.insertBasStockInfo(
|
||||||
|
new BasStockInfo().builder()
|
||||||
|
.stockId(stockId)
|
||||||
|
.cargoSpaceId(mydoJob.getCargoSpaceId())
|
||||||
|
.trayCode(mydoJob.getTrayCode())
|
||||||
|
.warehouseId(mydoJob.getWarehouseId())
|
||||||
|
.trayType(mydoJob.getTrayType())
|
||||||
|
.emptyStatus(details.size())//版辊数量
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
log.info("【账务处理-入库】新增库存主表信息,库存编号:{},货位:{},托盘号:{},入库数量:{}", stockId, mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), details.size());
|
||||||
|
}else{
|
||||||
|
info.setStockId(stockId);
|
||||||
|
info.setCargoSpaceId(mydoJob.getCargoSpaceId());
|
||||||
|
info.setEmptyStatus(details.size());
|
||||||
|
basStockInfoService.updateBasStockInfo(info);
|
||||||
|
log.info("【账务处理-入库】更新库存主表信息,库存编号:{},货位:{},托盘号:{},入库数量:{}", stockId, mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), details.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
int num = 1;
|
||||||
|
|
||||||
|
//每条子任务生成一条库存信息
|
||||||
|
for (MydoJobDetail detail : details){
|
||||||
|
|
||||||
|
//物料数量固定为1,辊号唯一
|
||||||
|
//插入库存明细信息
|
||||||
|
BasStock stockInit = new BasStock().builder()
|
||||||
|
.stockId(stockId)
|
||||||
|
.stockDetailId(stockId + "-" + num)
|
||||||
|
.stockStatus(BasStockCode.STOCK_STATUS_AVAILABLE)
|
||||||
|
.jobId(mydoJob.getJobId())
|
||||||
|
.jobDetailId(mydoJob.getJobId() + "-" + num++)
|
||||||
|
.rollerNumber(detail.getRollerNumber())
|
||||||
|
.quantity(detail.getInQuantity())
|
||||||
|
.cargoSpaceId(mydoJob.getCargoSpaceId())
|
||||||
|
.productId(detail.getProductId())
|
||||||
|
.productName(detail.getProductName())
|
||||||
|
.inDate(DateUtil.date().now())
|
||||||
|
.build();
|
||||||
|
basStockService.insertBasStock(stockInit);
|
||||||
|
|
||||||
|
//更新子单数量
|
||||||
|
InStockinDetail inStockinDetail = inStockinDetailService.selectInStockinDetailByRollerNumber(detail.getRollerNumber());
|
||||||
|
if (ObjUtil.isNotNull(inStockinDetail)){
|
||||||
|
inStockinDetail.setScanNum(BigDecimal.ONE);
|
||||||
|
inStockinDetail.setAssignNum(BigDecimal.ONE);
|
||||||
|
inStockinDetail.setStatus(1);
|
||||||
|
inStockinDetailService.updateInStockinDetail(inStockinDetail);
|
||||||
|
|
||||||
|
stockInit.setStockinId(inStockinDetail.getStockinId());
|
||||||
|
stockInit.setStockDetailId(inStockinDetail.getStockinDetailId());
|
||||||
|
}
|
||||||
|
|
||||||
|
intrayMsgService.deleteInTrayMsgByRollerNumber(detail.getRollerNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("【账务处理-入库】任务完成,移除绑定信息,更新货位信息,作业号:{}", mydoJob.getJobId());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 账务处理 - 手动完成作业 - 出库
|
||||||
|
*/
|
||||||
|
@Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||||
|
public void manualCompleteMydoJobHandler_out(){
|
||||||
|
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
||||||
|
new MydoJob().builder()
|
||||||
|
.status(TaskStatusEnum.MANUAL_FINISHED.getCode())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mydoJobs.isEmpty()) return;
|
||||||
|
|
||||||
|
for (MydoJob mydoJob : mydoJobs) {
|
||||||
|
//任务子表
|
||||||
|
List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(mydoJob.getJobId());
|
||||||
|
if (!details.isEmpty()){
|
||||||
|
//移除任务子表
|
||||||
|
mydoJobDetailService.insertMydoJobDetailsForJobFinish(mydoJob.getJobId());
|
||||||
|
mydoJobDetailService.deleteMydoJobDetailsByJobId(mydoJob.getJobId());
|
||||||
|
log.info("【手动完成任务】移除任务明细,作业号:{}", mydoJob.getJobId());
|
||||||
|
}
|
||||||
|
//库存子表
|
||||||
|
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (!stocks.isEmpty()){
|
||||||
|
for (BasStock stock : stocks){
|
||||||
|
stock.setCargoSpaceId(mydoJob.getTargetCargoSpaceId());
|
||||||
|
stock.setStockStatus(BasStockCode.STOCK_STATUS_AVAILABLE);
|
||||||
|
basStockService.updateBasStock(stock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//恢复货位状态
|
||||||
|
//整托出库
|
||||||
|
if (mydoJob.getInOrOut() >= TaskType.TASKTYPE_STOCKOUT ||
|
||||||
|
mydoJob.getInOrOut() == TaskType.TASKTYPE_STOCKOUT_EMPTY_TRAY ||
|
||||||
|
mydoJob.getInOrOut() == TaskType.TASKTYPE_STOCKOUT_MANUAL){
|
||||||
|
for (MydoJobDetail mydoJobDetail : details){
|
||||||
|
//还原子单数量
|
||||||
|
OutStockoutDetail outStockoutDetail = outStockoutDetailService.selectOutStockoutDetailByRollerNumber(mydoJobDetail.getRollerNumber());
|
||||||
|
if (ObjUtil.isNotNull(outStockoutDetail)){
|
||||||
|
outStockoutDetail.setAllotNum(BigDecimal.ONE);
|
||||||
|
outStockoutDetail.setAssignNum(BigDecimal.ONE);
|
||||||
|
outStockoutDetail.setStatus(1);
|
||||||
|
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
basStockService.deleteBasStockByTrayCode(mydoJob.getTrayCode());
|
||||||
|
basStockInfoService.deleteBasStockInfoByTrayCode(mydoJob.getTrayCode());
|
||||||
|
|
||||||
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
|
||||||
|
log.info("【账务处理-整托出库】任务完成,移除托盘库存,更新货位和库存信息,作业号:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getTrayCode());
|
||||||
|
}else{
|
||||||
|
log.info("【账务处理-操作失败】当前任务类型<{}>不支持手动完成操作,作业号:{},托盘号:{}", mydoJob.getInOrOut(), mydoJob.getJobId(), mydoJob.getTrayCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 账务处理 - 手动完成作业 - 移库
|
||||||
|
*/
|
||||||
|
@Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||||
|
public void manualCompleteMydoJobHandler_move(){
|
||||||
|
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
||||||
|
new MydoJob().builder()
|
||||||
|
.status(TaskStatusEnum.MANUAL_FINISHED.getCode())
|
||||||
|
.inOrOut(TaskType.TASKTYPE_PICK_STOCK_MOVE)
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mydoJobs.isEmpty()) return;
|
||||||
|
|
||||||
|
for (MydoJob mydoJob : mydoJobs) {
|
||||||
|
//任务子表
|
||||||
|
List<MydoJobDetail> details = mydoJobDetailService.selectMydoJobDetailByJobId(mydoJob.getJobId());
|
||||||
|
if (!details.isEmpty()){
|
||||||
|
//移除任务子表
|
||||||
|
mydoJobDetailService.insertMydoJobDetailsForJobFinish(mydoJob.getJobId());
|
||||||
|
mydoJobDetailService.deleteMydoJobDetailsByJobId(mydoJob.getJobId());
|
||||||
|
log.info("【手动完成任务】移除任务明细,作业号:{}", mydoJob.getJobId());
|
||||||
|
}
|
||||||
|
//库存子表
|
||||||
|
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (!stocks.isEmpty()){
|
||||||
|
for (BasStock stock : stocks){
|
||||||
|
stock.setCargoSpaceId(mydoJob.getTargetCargoSpaceId());
|
||||||
|
stock.setStockStatus(BasStockCode.STOCK_STATUS_AVAILABLE);
|
||||||
|
basStockService.updateBasStock(stock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//恢复货位状态
|
||||||
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_AVAILABLE);
|
||||||
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getTargetCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_OCCUPIED);
|
||||||
|
BasStockInfo stockInfo = basStockInfoService.selectBasStockInfoByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (ObjUtil.isNotNull(stockInfo)){
|
||||||
|
stockInfo.setCargoSpaceId(mydoJob.getTargetCargoSpaceId());
|
||||||
|
basStockInfoService.updateBasStockInfo(stockInfo);
|
||||||
|
}
|
||||||
|
log.info(
|
||||||
|
"【账务处理-移库】任务作废,更新库存和货位信息,作业号:{},托盘号:{},源位置:{},目标位置:{}", mydoJob.getJobId(), mydoJob.getTrayCode(), mydoJob.getCargoSpaceId(), mydoJob.getTargetCargoSpaceId()
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//====================================================================================================
|
||||||
|
//====================================================================================================
|
||||||
|
//====================================================================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 账务处理 - 自动完成作业
|
||||||
|
*/
|
||||||
|
// @Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||||
|
public void autoCompleteMydoJobHandler(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,10 +74,12 @@ public class RequestWcsHandler {
|
|||||||
|
|
||||||
//更新库存状态【占用中】
|
//更新库存状态【占用中】
|
||||||
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (!stocks.isEmpty()){
|
||||||
for (BasStock stock : stocks) {
|
for (BasStock stock : stocks) {
|
||||||
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
|
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
|
||||||
basStockService.updateBasStock(stock);
|
basStockService.updateBasStock(stock);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//更新货位状态【出库预占用】
|
//更新货位状态【出库预占用】
|
||||||
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
|
||||||
@@ -122,10 +124,12 @@ public class RequestWcsHandler {
|
|||||||
|
|
||||||
//更新库存状态【占用中】
|
//更新库存状态【占用中】
|
||||||
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (!stocks.isEmpty()){
|
||||||
for (BasStock stock : stocks) {
|
for (BasStock stock : stocks) {
|
||||||
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
|
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
|
||||||
basStockService.updateBasStock(stock);
|
basStockService.updateBasStock(stock);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//更新货位状态【出库预占用】
|
//更新货位状态【出库预占用】
|
||||||
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), mydoJob.getTrayCode(), CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKOUT);
|
||||||
@@ -185,7 +189,57 @@ public class RequestWcsHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 出库确认完成 - 推送wcs回流任务
|
||||||
|
*/
|
||||||
|
@Scheduled(fixedRate = TIMEINTERVAL_2000)
|
||||||
|
public void sendWcsBackTask(){
|
||||||
|
List<MydoJob> mydoJobs = mydoJobService.selectOutMydoJobList(
|
||||||
|
new MydoJob().builder()
|
||||||
|
.status(TaskStatusEnum.READY.getCode())
|
||||||
|
.inOrOut(TaskType.TASKTYPE_PICK_BACK)
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mydoJobs.isEmpty()) return;
|
||||||
|
|
||||||
|
for (MydoJob mydoJob : mydoJobs){
|
||||||
|
|
||||||
|
//初始化参数
|
||||||
|
HashMap<String, Object> paramMap = new HashMap<>();
|
||||||
|
paramMap.put("reqCode", UUID.randomUUID().toString());//请求码
|
||||||
|
paramMap.put("trayCode", mydoJob.getTrayCode());//容器编号
|
||||||
|
paramMap.put("taskNo", mydoJob.getTaskNo());//容器编号
|
||||||
|
paramMap.put("jobId", mydoJob.getJobId());
|
||||||
|
paramMap.put("inOrOut", mydoJob.getInOrOut());
|
||||||
|
paramMap.put("cargoSpaceId", mydoJob.getCargoSpaceId());
|
||||||
|
|
||||||
|
AjaxResult ajaxResult = apiWcsService.sendBackMydoJob(paramMap);
|
||||||
|
|
||||||
|
if (ajaxResult.isSuccess()){
|
||||||
|
log.info("【推送回流入库】<托盘回流>入库,更新货位和库存预占用状态,wms作业号:{},货位:{},托盘号:{}", mydoJob.getJobId(), mydoJob.getCargoSpaceId(), mydoJob.getTrayCode());
|
||||||
|
mydoJob.setStatus(TaskStatusEnum.RUNNING.getCode());
|
||||||
|
mydoJobService.updateMydoJob(mydoJob);
|
||||||
|
|
||||||
|
//更新库存状态【占用中】
|
||||||
|
List<BasStock> stocks = basStockService.selectBasStockListByTrayCode(mydoJob.getTrayCode());
|
||||||
|
if (!stocks.isEmpty()){
|
||||||
|
for (BasStock stock : stocks) {
|
||||||
|
stock.setStockStatus(BasStockCode.STOCK_STATUS_OCCUPIED);
|
||||||
|
stock.setCargoSpaceId(mydoJob.getCargoSpaceId());
|
||||||
|
basStockService.updateBasStock(stock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//更新货位状态【入库预占用】
|
||||||
|
basCargoSpaceService.updateBasCargoSpaceStatus(mydoJob.getCargoSpaceId(), "", CargoSpaceCode.CARGOSPACE_STATUS_PRE_STOCKIN);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user