项目初始化

This commit is contained in:
liuhanqing
2025-09-11 11:19:00 +08:00
parent 13df9e0355
commit d53f41223b
1194 changed files with 245831 additions and 34 deletions

View File

@@ -0,0 +1,875 @@
package com.ruoyi.pda.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.api.domain.AgvMoveParam;
import com.ruoyi.api.service.IToWcsService;
import com.ruoyi.bas.cargoSpace.domain.BasCargoSpace;
import com.ruoyi.bas.cargoSpace.service.IBasCargoSpaceService;
import com.ruoyi.bas.container.domain.BasContainer;
import com.ruoyi.bas.container.service.IBasContainerService;
import com.ruoyi.bas.containerDetails.domain.BasContainerDetails;
import com.ruoyi.bas.containerDetails.service.IBasContainerDetailsService;
import com.ruoyi.bas.port.domain.BasProductPort;
import com.ruoyi.bas.port.mapper.BasProductPortMapper;
import com.ruoyi.bas.tag.domain.BasTag;
import com.ruoyi.bas.tag.service.IBasTagService;
import com.ruoyi.bas.warehouse.domain.BasWarehouse;
import com.ruoyi.bas.warehouse.service.IBasWarehouseService;
import com.ruoyi.check.commit.domain.CheckCommitRecord;
import com.ruoyi.check.commit.service.ICheckCommitRecordService;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.device.agv.domain.AgvContainerTask;
import com.ruoyi.device.agv.service.IAgvContainerTaskService;
import com.ruoyi.in.stockindetail.domain.InStockinDetail;
import com.ruoyi.in.stockindetail.service.IInStockinDetailService;
import com.ruoyi.job.mydojob.domain.MydoJob;
import com.ruoyi.job.mydojob.service.IMydoJobService;
import com.ruoyi.job.mydojobdetail.domain.MydoJobDetail;
import com.ruoyi.job.mydojobdetail.service.IMydoJobDetailService;
import com.ruoyi.job.mydojobfinish.mapper.MydoJobFinishMapper;
import com.ruoyi.out.outStockout.domain.OutStockout;
import com.ruoyi.out.outStockout.service.IOutStockoutService;
import com.ruoyi.out.outStockoutDetail.domain.OutStockoutDetail;
import com.ruoyi.out.outStockoutDetail.service.IOutStockoutDetailService;
import com.ruoyi.out.submit.domain.OutPickSubmit;
import com.ruoyi.out.submit.service.IOutPickSubmitService;
import com.ruoyi.out.tagTask.domain.TagTask;
import com.ruoyi.out.tagTask.service.ITagTaskService;
import com.ruoyi.pda.domain.TrayCodeMakeSure;
import com.ruoyi.pda.domain.TrayCodeMsg;
import com.ruoyi.pda.mapper.PdaMapper;
import com.ruoyi.pda.trayMsg.domain.TrayMsg;
import com.ruoyi.pda.trayMsg.service.ITrayMsgService;
import com.ruoyi.stock.stock.domain.BasStock;
import com.ruoyi.stock.stock.service.IBasStockService;
import com.ruoyi.system.service.ISysRoleService;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
@Service
@Slf4j
public class PdaServiceImp implements PdaService {
@Autowired
private PdaMapper pdaMapper;
@Autowired
private IBasCargoSpaceService basCargoSpaceService;
@Autowired
private IMydoJobDetailService mydoJobDetailService;
;
@Autowired
private IMydoJobService mydoJobService;
;
@Autowired
ISysRoleService sysRoleService;
@Autowired
IInStockinDetailService inStockinDetailService;
@Autowired
ITrayMsgService trayMsgService;
@Autowired
private IBasContainerDetailsService basContainerDetailsService;
@Autowired
private ICheckCommitRecordService checkCommitRecordService;
@Autowired
private IOutStockoutService outStockoutService;
@Autowired
private IOutStockoutDetailService outStockoutDetailService;
@Resource
private BasProductPortMapper basProductPortMapper;
@Autowired
private IBasStockService basStockService;
@Resource
private MydoJobFinishMapper mydoJobFinishMapper;
@Autowired
private IOutPickSubmitService outPickSubmitService;
@Autowired
private ITagTaskService tagTaskService;
@Autowired
private IBasTagService basTagService;
@Autowired
private IBasWarehouseService basWarehouseService;
@Autowired
private IBasContainerService basContainerService;
@Autowired
private IToWcsService iToWcsService;
@Autowired
private IAgvContainerTaskService agvContainerTaskService;
/**
* 空托盘入库
*
* @param trayCodeMsg
* @return
*/
@Override
public AjaxResult emptyTrayIn(TrayCodeMsg trayCodeMsg) {
HashMap<String, Object> map = new HashMap<>();
map.put("v_tray_code", trayCodeMsg.getTrayCode());
map.put("v_warehouse_id", trayCodeMsg.getWarehouseId());
map.put("v_quantity", "1");
map.put("v_cargo_space_id", trayCodeMsg.getCargoSpaceId());
pdaMapper.emptyTrayIn(map);
String result = map.get("v_result").toString();
if ("10".equals(result)) {
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
}
/**
* 空料箱入库
*
* @param trayCodeMsg
* @return
*/
@Override
public AjaxResult emptyBoxIn(TrayCodeMsg trayCodeMsg) {
HashMap<String, Object> map = new HashMap<>();
map.put("v_tray_code", trayCodeMsg.getTrayCode());
map.put("v_warehouse_id", trayCodeMsg.getWarehouseId());
map.put("v_entrance_id", trayCodeMsg.getEntranceId());
pdaMapper.emptyBoxIn(map);
String result = map.get("v_result").toString();
if ("10".equals(result)) {
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
}
@Override
public AjaxResult emptyTrayOut(TrayCodeMsg trayCodeMsg) {
HashMap<String, Object> map = new HashMap<>();
map.put("v_warehouse_id", trayCodeMsg.getWarehouseId());
map.put("v_cargo_space_id", trayCodeMsg.getCargoSpaceId());
map.put("v_exit_id", trayCodeMsg.getExitId());
pdaMapper.emptyTrayOut(map);
String result = map.get("v_result").toString();
if ("10".equals(result)) {
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
}
@Override
public AjaxResult emptyBoxOut(TrayCodeMsg trayCodeMsg) {
HashMap<String, Object> map = new HashMap<>();
map.put("v_warehouse_id", trayCodeMsg.getWarehouseId());
map.put("v_exit_id", trayCodeMsg.getExitId());
pdaMapper.emptyBoxOut(map);
String result = map.get("v_result").toString();
if ("10".equals(result)) {
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
}
@Override
public AjaxResult bindTrayMsg(TrayCodeMsg trayCodeMsg) {
//判断用户的仓库权限
InStockinDetail inStockinDetail1 = new InStockinDetail();
inStockinDetail1.setStockinDetailId(trayCodeMsg.getStockinDetailId());
InStockinDetail inStockinDetail = inStockinDetailService.selectStockinByDetailById(inStockinDetail1);
if (inStockinDetail == null) {
return AjaxResult.warn(MessageUtils.message("warn.message6"));
}
//判断与已绑定物料是否为同一仓库
TrayMsg trayMsg = new TrayMsg();
trayMsg.setTrayCode(trayCodeMsg.getTrayCode());
List<TrayMsg> trayMsgs = trayMsgService.selectTrayMsgList(trayMsg);
if (trayMsgs.size() > 0) {
// InStockinDetail inStockinDetail = inStockinDetailService.selectStockinByDetailById(trayCodeMsg.getStockinDetailId());
if (!trayMsgs.get(0).getWarehouseId().equals(inStockinDetail.getWarehouseId())) {
return AjaxResult.warn(MessageUtils.message("warn.message7"));
}
}
HashMap<String, Object> map = new HashMap<>();
map.put("v_tray_code", trayCodeMsg.getTrayCode());
map.put("v_stockin_detail_id", trayCodeMsg.getStockinDetailId());
map.put("v_quantity", Integer.parseInt(trayCodeMsg.getInQuantity()));
pdaMapper.bindTrayMsg(map);
String result = map.get("v_result").toString();
if ("10".equals(result)) {
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
}
@Override
public AjaxResult addInJob(TrayCodeMsg trayCodeMsg) {
HashMap<String, Object> map = new HashMap<>();
map.put("v_tray_code", trayCodeMsg.getTrayCode());
// map.put("v_warehouse_id", trayCodeMsg.getWarehouseId());
map.put("v_cargo_space_id", trayCodeMsg.getCargoSpaceId());
pdaMapper.addInJob(map);
String result = map.get("v_result").toString();
if ("10".equals(result)) {
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult outMakeSure(TrayCodeMakeSure trayCodeMakeSure) {
//判断任务是否存在
MydoJob mydoJobParam = new MydoJob();
mydoJobParam.setTrayCode(trayCodeMakeSure.getTrayCode());
// mydoJobParam.setStatus("3");
List<MydoJob> mydoJobList = mydoJobService.selectMydoJobListApi(mydoJobParam);
if (CollUtil.isEmpty(mydoJobList)) {
return AjaxResult.warn(MessageUtils.message("warn.message1"));
}
MydoJobDetail mydoJobDetailParam = new MydoJobDetail();
mydoJobDetailParam.setJobId(mydoJobList.get(0).getJobId());
List<MydoJobDetail> mydoJobDetails = mydoJobDetailService.selectMydoJobDetailList(mydoJobDetailParam);
if (CollUtil.isEmpty(mydoJobDetails)) {
return AjaxResult.warn(MessageUtils.message("warn.message2"));
}
//空托盘空料箱
if ("21".equals(mydoJobList.get(0).getInOrOut()) || "22".equals(mydoJobList.get(0).getInOrOut())) {
return handleOutType2(trayCodeMakeSure, mydoJobDetails, mydoJobList.get(0));
}
//获取单据类型
OutStockout outStockoutParam = new OutStockout();
outStockoutParam.setStockoutId(mydoJobDetails.get(0).getInOrOutId());
List<OutStockout> outStockouts = outStockoutService.selectOutStockoutListApi(outStockoutParam);
if (CollUtil.isEmpty(outStockouts)) {
return AjaxResult.warn(MessageUtils.message("warn.message4"));
}
String billType = outStockouts.get(0).getOutType();
switch (billType) {
case "1":
//拣选单据
return handleOutType1(trayCodeMakeSure, mydoJobDetails, mydoJobList.get(0));
case "2":
//退货单据 不绑定容器
return handleOutType2(trayCodeMakeSure, mydoJobDetails, mydoJobList.get(0));
default:
return AjaxResult.warn(MessageUtils.message("warn.message3"));
}
}
/**
* 处理退货出库
*
* @param trayCodeMakeSure
* @param mydoJobDetailList
* @param mydoJob
* @return
*/
private AjaxResult handleOutType2(TrayCodeMakeSure trayCodeMakeSure, List<MydoJobDetail> mydoJobDetailList, MydoJob mydoJob) {
BasWarehouse basWarehouse = basWarehouseService.selectBasWarehouseByWarehouseId(mydoJob.getWarehouseId());
//修改拣选数量
for (MydoJobDetail mydoJobDetail : mydoJobDetailList) {
//修改拣选数量
mydoJobDetail.setPickQuantity(mydoJobDetail.getOutQuantity());
mydoJobDetailService.updateMydoJobDetail(mydoJobDetail);
//修改单据实际数量
String inOrOutDId = mydoJobDetail.getInOrOutDId();
OutStockoutDetail outStockoutDetail = outStockoutDetailService.selectOutStockoutDetailByStockoutDetailId(inOrOutDId);
if (ObjUtil.isNotNull(outStockoutDetail)) {
outStockoutDetail.setAssignNum(outStockoutDetail.getAssignNum().add(Convert.toBigDecimal(mydoJobDetail.getPickQuantity())));
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
}
//修改电子标签
if ("2".equals(basWarehouse.getWarehouseType())){
updateTagTaskStatus(mydoJobDetail);
}
}
//判断拣选数量是否等于出库数量
MydoJobDetail mydoJobDetailParam = new MydoJobDetail();
mydoJobDetailParam.setJobId(mydoJob.getJobId());
List<MydoJobDetail> currentMydoJobDetails = mydoJobDetailService.selectMydoJobDetailList(mydoJobDetailParam);
boolean flag = currentMydoJobDetails.stream().allMatch(mydoJobDetail -> mydoJobDetail.getPickQuantity().equals(mydoJobDetail.getOutQuantity()));
if (flag) {
HashMap<String, Object> map = new HashMap<>();
map.put("v_tray_code", trayCodeMakeSure.getTrayCode());
map.put("v_type", "1");
pdaMapper.outMakeSure(map);
iToWcsService.pushInMydoJob();
String result = map.get("v_result").toString();
if ("10".equals(result)) {
//通知wcs 出库确认
deleteTagTask(trayCodeMakeSure, basWarehouse, mydoJob);
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
} else {
return AjaxResult.success();
}
}
/**
* 处理正常出库
*
* @param trayCodeMakeSure
* @param mydoJobDetailList
* @param mydoJob
* @return
*/
private AjaxResult handleOutType1(TrayCodeMakeSure trayCodeMakeSure, List<MydoJobDetail> mydoJobDetailList, MydoJob mydoJob) {
BasWarehouse basWarehouse = basWarehouseService.selectBasWarehouseByWarehouseId(mydoJob.getWarehouseId());
for (MydoJobDetail mydoJobDetail : mydoJobDetailList) {
//修改拣选数量
//MydoJobDetail mydoJobDetailOld = mydoJobDetailService.selectMydoJobDetailByJobDetailId(mydoJobDetail.getJobDetailId());
/*BigDecimal oldPickQuantity = Convert.toBigDecimal(mydoJobDetailOld.getPickQuantity());
BigDecimal newPickQuantity = Convert.toBigDecimal(mydoJobDetail.getOutQuantity());*/
mydoJobDetail.setPickQuantity(mydoJobDetail.getOutQuantity());
mydoJobDetailService.updateMydoJobDetail(mydoJobDetail);
//修改单据实际数量
String inOrOutDId = mydoJobDetail.getInOrOutDId();
OutStockoutDetail outStockoutDetail = outStockoutDetailService.selectOutStockoutDetailByStockoutDetailId(inOrOutDId);
if (ObjUtil.isNotNull(outStockoutDetail)) {
outStockoutDetail.setAssignNum(outStockoutDetail.getAssignNum().add(Convert.toBigDecimal(mydoJobDetail.getPickQuantity())));
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
}
//修改电子标签
if ("2".equals(basWarehouse.getWarehouseType())){
updateTagTaskStatus(mydoJobDetail);
}
//插入中间表
insertPickSubmitData(mydoJob, mydoJobDetail);
}
//判断拣选数量是否等于出库数量
MydoJobDetail mydoJobDetailParam = new MydoJobDetail();
mydoJobDetailParam.setJobId(mydoJob.getJobId());
List<MydoJobDetail> currentMydoJobDetails = mydoJobDetailService.selectMydoJobDetailList(mydoJobDetailParam);
boolean flag = currentMydoJobDetails.stream().allMatch(mydoJobDetail -> mydoJobDetail.getPickQuantity().equals(mydoJobDetail.getOutQuantity()));
if (flag) {
HashMap<String, Object> map = new HashMap<>();
map.put("v_tray_code", trayCodeMakeSure.getTrayCode());
map.put("v_type", "1");
pdaMapper.outMakeSure(map);
iToWcsService.pushInMydoJob();
String result = map.get("v_result").toString();
if ("10".equals(result)) {
deleteTagTask(trayCodeMakeSure, basWarehouse, mydoJob);
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
} else {
return AjaxResult.success();
}
}
/**
* 插入中间表
* @param mydoJob
* @param mydoJobDetail
*/
private void insertPickSubmitData(MydoJob mydoJob, MydoJobDetail mydoJobDetail) {
OutPickSubmit outPickSubmitParam = new OutPickSubmit();
outPickSubmitParam.setWarehouseId(mydoJob.getWarehouseId());
outPickSubmitParam.setExitId(mydoJob.getExitId());
outPickSubmitParam.setProductId(mydoJobDetail.getProductId());
List<OutPickSubmit> outPickSubmits = outPickSubmitService.selectOutPickSubmitList(outPickSubmitParam);
if (outPickSubmits.isEmpty()) {
if (Convert.toInt(mydoJobDetail.getPickQuantity())>0){
//存入中间表
OutPickSubmit outPickSubmit = new OutPickSubmit();
outPickSubmit.setJobId(mydoJob.getJobId());
outPickSubmit.setJobDetailId(mydoJobDetail.getJobDetailId());
outPickSubmit.setProductId(mydoJobDetail.getProductId());
outPickSubmit.setQuantity(mydoJobDetail.getPickQuantity());
outPickSubmit.setTrayCode(mydoJob.getTrayCode());
outPickSubmit.setWarehouseId(mydoJob.getWarehouseId());
outPickSubmit.setExitId(mydoJob.getExitId());
outPickSubmitService.insertOutPickSubmit(outPickSubmit);
}
} else {
OutPickSubmit oldOutPickSubmit = outPickSubmits.get(0);
oldOutPickSubmit.setQuantity(Convert.toBigDecimal(oldOutPickSubmit.getQuantity()).add(Convert.toBigDecimal(mydoJobDetail.getPickQuantity())).toString());
outPickSubmitService.updateOutPickSubmit(oldOutPickSubmit);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult checkMakeSure(TrayCodeMakeSure trayCodeMakeSure) {
MydoJob mydoJob = mydoJobService.selectMydoJobByTrayCode(trayCodeMakeSure.getTrayCode());
if (mydoJob == null) {
return AjaxResult.warn(MessageUtils.message("warn.message"));
}
BasWarehouse basWarehouse = basWarehouseService.selectBasWarehouseByWarehouseId(mydoJob.getWarehouseId());
List<MydoJobDetail> mydoJobDetailList = trayCodeMakeSure.getMaterials();
if (CollUtil.isNotEmpty(mydoJobDetailList)) {
boolean flag = mydoJobDetailList.stream().anyMatch(x -> StrUtil.isEmpty(x.getStockId()) && "0".equals(x.getInQuantity()));
if (flag) {
return AjaxResult.warn(MessageUtils.message("warn.message8"));
}
for (MydoJobDetail mydoJobDetail : mydoJobDetailList) {
//插入盘点提交表
CheckCommitRecord checkCommitRecord = new CheckCommitRecord();
checkCommitRecord.setQuantity(mydoJobDetail.getInQuantity());
checkCommitRecord.setTrayCode(trayCodeMakeSure.getTrayCode());
checkCommitRecord.setStockId(mydoJobDetail.getStockId());
checkCommitRecord.setSpare1(mydoJobDetail.getInOrOutDId());
checkCommitRecord.setSpare2(mydoJobDetail.getProductId());
checkCommitRecord.setSpare3(mydoJobDetail.getOutQuantity());
checkCommitRecordService.insertCheckCommitRecord(checkCommitRecord);
mydoJobDetail.setSpare3("1");
mydoJobDetailService.updateMydoJobDetail(mydoJobDetail);
if ("2".equals(basWarehouse.getWarehouseType())){
updateTagTaskStatus(mydoJobDetail);
}
}
}
List<MydoJobDetail> mydoJobDetails = mydoJobDetailService.selectMydoJobDetailListByJobId(mydoJob.getJobId());
if (mydoJobDetails.stream().allMatch(x -> "1".equals(x.getSpare3()))) {
HashMap<String, Object> map = new HashMap<>();
map.put("v_tray_code", trayCodeMakeSure.getTrayCode());
pdaMapper.checkMakeSure(map);
iToWcsService.pushInMydoJob();
String result = map.get("v_result").toString();
if ("10".equals(result)) {
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
}
return AjaxResult.success();
}
/**
* 修改电子标签数量
*
* @param mydoJobDetail
*/
private void updateTagTaskStatus(MydoJobDetail mydoJobDetail) {
//修改电子标签任务
TagTask param = new TagTask();
param.setJobDetailId(mydoJobDetail.getJobDetailId());
List<TagTask> tagTasks = tagTaskService.selectTagTaskList(param);
if (CollUtil.isNotEmpty(tagTasks)) {
TagTask tagTask = tagTasks.get(0);
tagTask.setStatus("2");
tagTaskService.updateTagTask(tagTask);
}
}
/**
* 删除电子标签
*
* @param trayCodeMakeSure
* @param basWarehouse
*/
private void deleteTagTask(TrayCodeMakeSure trayCodeMakeSure, BasWarehouse basWarehouse, MydoJob mydoJob) {
if ("2".equals(basWarehouse.getWarehouseType()) && "23".equals(mydoJob.getInOrOut())) {
BasTag basTag = basTagService.selectBasTagByTrayCode(trayCodeMakeSure.getTrayCode());
basTag.setTrayCode("");
basTagService.updateBasTag(basTag);
//删除电子标签
TagTask param = new TagTask();
param.setTagId(basTag.getId());
List<TagTask> tagTasks = tagTaskService.selectTagTaskList(param);
if (CollUtil.isNotEmpty(tagTasks)) {
tagTaskService.deleteTagTaskByIds(tagTasks.stream()
.map(TagTask::getId)
.toArray(Long[]::new));
}
if (mydoJob.getExitId().startsWith("fluent")) {
//通知wcs出库确认成功
HashMap<String, String> outMydojobMakeSureParam = new HashMap<>();
outMydojobMakeSureParam.put("trayCode", trayCodeMakeSure.getTrayCode());
AjaxResult ajaxResult = iToWcsService.outMydojobMakeSure(outMydojobMakeSureParam);
if (!ajaxResult.isSuccess()) {
throw new RuntimeException(ajaxResult.toString());
}
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult outException(TrayCodeMakeSure trayCodeMakeSure) {
//判断任务是否存在
MydoJob mydoJobParam = new MydoJob();
mydoJobParam.setTrayCode(trayCodeMakeSure.getTrayCode());
List<MydoJob> mydoJobList = mydoJobService.selectMydoJobList(mydoJobParam);
if (CollUtil.isEmpty(mydoJobList)) {
return AjaxResult.warn(MessageUtils.message("warn.message"));
}
List<MydoJobDetail> pickInfoList = trayCodeMakeSure.getMaterialDetails();
MydoJob mydoJob = mydoJobList.get(0);
//判断拣选数量
MydoJobDetail param = new MydoJobDetail();
param.setJobId(mydoJob.getJobId());
List<MydoJobDetail> mydoJobDetails = mydoJobDetailService.selectMydoJobDetailList(param);
BasWarehouse basWarehouse = basWarehouseService.selectBasWarehouseByWarehouseId(mydoJob.getWarehouseId());
String stockOutId = "";
for (MydoJobDetail mydoJobDetail : mydoJobDetails) {
//修改拣选数量
Optional<MydoJobDetail> first = pickInfoList.stream().filter(x -> x.getJobDetailId().equals(mydoJobDetail.getJobDetailId())).findFirst();
if (first.isPresent()) {
mydoJobDetail.setPickQuantity(first.get().getPickQuantity());
mydoJobDetailService.updateMydoJobDetail(mydoJobDetail);
}
//修改单据实际分配数量
BigDecimal pickQuantity = Convert.toBigDecimal(mydoJobDetail.getPickQuantity());
BigDecimal outQuantity = Convert.toBigDecimal(mydoJobDetail.getOutQuantity());
BigDecimal subQuantity = outQuantity.subtract(pickQuantity);
//修改分配数量为 当前分配数量-缺失数量
OutStockoutDetail outStockoutDetail = outStockoutDetailService.selectOutStockoutDetailByStockoutDetailId(mydoJobDetail.getInOrOutDId());
outStockoutDetail.setAllotQuantity(outStockoutDetail.getAllotQuantity().subtract(subQuantity));
stockOutId = outStockoutDetail.getStockoutId();
outStockoutDetailService.updateOutStockoutDetail(outStockoutDetail);
//修改库存的实际出库数量
BasStock basStock = basStockService.selectBasStockByStockId(mydoJobDetail.getStockId());
basStock.setOutQuantity(String.valueOf(pickQuantity));
basStockService.updateBasStock(basStock);
//修改电子标签
if ("2".equals(basWarehouse.getWarehouseType())){
updateTagTaskStatus(mydoJobDetail);
}
//将数据存入中间表
insertPickSubmitData(mydoJob, mydoJobDetail);
}
//生成回流任务,标记productStatus为异常状态
HashMap<String, Object> map = new HashMap<>();
map.put("v_tray_code", trayCodeMakeSure.getTrayCode());
map.put("v_type", "1");
pdaMapper.outMakeSureException(map);
iToWcsService.pushInMydoJob();
String result = map.get("v_result").toString();
if ("10".equals(result)) {
//删除电子标签信息
deleteTagTask(trayCodeMakeSure, basWarehouse, mydoJob);
//自动分配
return outStockoutService.autoAllot(stockOutId);
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
}
@Override
public AjaxResult pkIn(TrayCodeMsg trayCodeMsg) {
HashMap<String, Object> map = new HashMap<>();
map.put("v_stockin_detail_id", trayCodeMsg.getStockinDetailId());
map.put("v_in_quantity", Integer.parseInt(trayCodeMsg.getInQuantity()));
pdaMapper.pkIn(map);
String result = map.get("v_result").toString();
if ("10".equals(result)) {
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
//return AjaxResult.warn(map.get("v_resultmsg").toString());
throw new RuntimeException(map.get("v_resultmsg").toString());
}
}
@Override
public AjaxResult pkout(TrayCodeMsg trayCodeMsg) {
HashMap<String, Object> map = new HashMap<>();
map.put("v_stockout_detail_id", trayCodeMsg.getStockinDetailId());
pdaMapper.pkOut(map);
String result = map.get("v_result").toString();
if ("10".equals(result)) {
return AjaxResult.success(map.get("v_resultmsg").toString());
} else {
throw new RuntimeException(map.get("v_resultmsg").toString());
}
}
@Override
public AjaxResult agvRequest(BasContainer basContainer) {
//缓存站点
String endPoint = "456";
//判断details中的数量是否都为0
if (CollUtil.isNotEmpty(basContainer.getDetails())) {
for (BasContainerDetails detail : basContainer.getDetails()) {
//如果存在数量不为0的
if (detail.getQuantity() != 0) {
if (StrUtil.isEmpty(basContainer.getSpare1())) {
return AjaxResult.warn(MessageUtils.message("warn.message9"));
}
//去ctu库站点
BasProductPort basProductPort = new BasProductPort();
basProductPort.setWarehouseId(basContainer.getSpare1());
List<BasProductPort> basProductPorts = basProductPortMapper.selectBasProductPortList(basProductPort);
endPoint = basProductPorts.get(0).getId();
}
}
}
//通过料架查找站点
BasContainer basContainer1 = basContainerService.selectBasContainerByContainerId(basContainer.getContainerId());
String startPoint = basContainer1.getPortName();
//todo 调用agv搬运接口
//使用HttpUtil post请求,参数为startPoint,endPoint,和containerCode
return agvRequest(basContainer.getContainerId(), startPoint, endPoint);
}
private @NotNull AjaxResult agvRequest(String containerId, String startPoint, String endPoint) {
String taskNo = IdUtil.fastSimpleUUID();
AgvMoveParam agvMoveParam =new AgvMoveParam();
agvMoveParam.setStartPoint(startPoint);
agvMoveParam.setEndPoint(endPoint);
agvMoveParam.setContainerCode(containerId);
agvMoveParam.setTaskNo(taskNo);
String result = HttpUtil.post("http://192.168.1.100:8080/agv/api/receiveAgvMoveJob", JSONUtil.toJsonStr( agvMoveParam));
//接口的返回结果为AjaxResult,从result中获取code
//获取code
int code = JSONObject.parseObject(result).getIntValue("code");
if (code == 200) {
AgvContainerTask agvContainerTask = new AgvContainerTask();
agvContainerTask.setContainer(containerId);
agvContainerTask.setStartPoint(startPoint);
agvContainerTask.setEndPoint(endPoint);
agvContainerTask.setStatus("0");
agvContainerTask.setTaskNo(taskNo);
agvContainerTask.setCreateTime(new Date());
agvContainerTaskService.insertAgvContainerTask(agvContainerTask);
return AjaxResult.success(result);
} else {
return AjaxResult.warn(JSONObject.parseObject(result).getString("msg"));
}
}
@Override
public Map<String, Object> cargoSpaceAnalysis(String warehouseId) {
BasCargoSpace queryParams = new BasCargoSpace();
queryParams.setWarehouseId(warehouseId);
List<BasCargoSpace> list = basCargoSpaceService.selectBasCargoSpaceList(queryParams);
// 初始化所有可能的状态,默认值为0
Map<String, Integer> statusCount = new LinkedHashMap<>();
statusCount.put("空货位", 0);
statusCount.put("满货位", 0);
statusCount.put("入库分配", 0);
statusCount.put("出库分配", 0);
statusCount.put("入库需盘点", 0);
statusCount.put("出库需盘点", 0);
// 统计实际存在的状态数量
for (BasCargoSpace space : list) {
if (space.getStatus() != null) {
String statusName;
switch (Integer.parseInt(space.getStatus())) {
case 1:
statusName = "空货位";
break;
case 2:
statusName = "满货位";
break;
case 3:
statusName = "入库分配";
break;
case 4:
statusName = "出库分配";
break;
case 5:
statusName = "入库需盘点";
break;
case 6:
statusName = "出库需盘点";
break;
default:
continue;
}
statusCount.put(statusName, statusCount.getOrDefault(statusName, 0) + 1);
}
}
// 转换为要求的格式
List<Map<String, Object>> result = new ArrayList<>();
for (Map.Entry<String, Integer> entry : statusCount.entrySet()) {
Map<String, Object> item = new HashMap<>();
item.put("name", entry.getKey());
item.put("value", entry.getValue());
result.add(item);
}
Map<String, Object> response = new HashMap<>();
response.put("data", result);
return response;
}
@Override
public Map<String, Object> getAisleStatisticsData(String warehouseId) {
Map<String, Object> map = new HashMap<>();
MydoJob mydoJob = new MydoJob();
mydoJob.setWarehouseId(warehouseId);
mydoJob.setInOut("1");
List<MydoJob> mydoJobs = mydoJobFinishMapper.selectMydoJobFinishListByMydoJob(mydoJob);
MydoJob mydoJob1 = new MydoJob();
mydoJob1.setWarehouseId(warehouseId);
mydoJob1.setInOut("2");
List<MydoJob> mydoJobs1 = mydoJobFinishMapper.selectMydoJobFinishListByMydoJob(mydoJob1);
map.put("in", mydoJobs.size());
map.put("out", mydoJobs1.size());
return map;
}
@Override
public AjaxResult bindContainer(TrayCodeMakeSure trayCodeMakeSure) {
if (CollUtil.isEmpty(trayCodeMakeSure.getMydoJobDetailList())) {
return AjaxResult.warn(MessageUtils.message("warn.message10"));
}
if (StrUtil.isEmpty(trayCodeMakeSure.getContainerCode())) {
return AjaxResult.warn(MessageUtils.message("warn.message11"));
}
for (MydoJobDetail mydoJobDetail : trayCodeMakeSure.getMydoJobDetailList()) {
//绑定容器
BasContainerDetails basContainerDetailsParam = new BasContainerDetails();
basContainerDetailsParam.setContainerId(trayCodeMakeSure.getContainerCode());
basContainerDetailsParam.setProductId(mydoJobDetail.getProductId());
List<BasContainerDetails> basContainerDetails = basContainerDetailsService.selectBasContainerDetailsList(basContainerDetailsParam);
if (CollUtil.isNotEmpty(basContainerDetails)) {
BasContainerDetails oldBasContainerDetails = basContainerDetails.get(0);
oldBasContainerDetails.setQuantity(oldBasContainerDetails.getQuantity() + Convert.toLong(mydoJobDetail.getPickBindQuantity()));
basContainerDetailsService.updateBasContainerDetails(oldBasContainerDetails);
} else {
BasContainerDetails newBasContainerDetails = new BasContainerDetails();
newBasContainerDetails.setContainerId(trayCodeMakeSure.getContainerCode());
newBasContainerDetails.setProductId(mydoJobDetail.getProductId());
newBasContainerDetails.setQuantity(Convert.toLong(mydoJobDetail.getPickBindQuantity()));
basContainerDetailsService.insertBasContainerDetails(newBasContainerDetails);
}
//减少中间表数量
OutPickSubmit outPickSubmitParam = new OutPickSubmit();
outPickSubmitParam.setWarehouseId(trayCodeMakeSure.getWarehouseId());
outPickSubmitParam.setExitId(trayCodeMakeSure.getExitId());
outPickSubmitParam.setProductId(mydoJobDetail.getProductId());
List<OutPickSubmit> outPickSubmits = outPickSubmitService.selectOutPickSubmitList(outPickSubmitParam);
for (OutPickSubmit outPickSubmit : outPickSubmits) {
BigDecimal subtract = Convert.toBigDecimal(outPickSubmit.getQuantity()).subtract(Convert.toBigDecimal(mydoJobDetail.getPickBindQuantity()));
if (subtract.compareTo(BigDecimal.ZERO) == 0) {
//删除缓存信息
outPickSubmitService.deleteOutPickSubmitById(outPickSubmit.getId());
} else if (subtract.compareTo(BigDecimal.ZERO) < 0) {
return AjaxResult.warn(MessageUtils.message("warn.message12"));
} else {
outPickSubmit.setQuantity(subtract.toString());
outPickSubmitService.updateOutPickSubmit(outPickSubmit);
}
}
}
return AjaxResult.success();
}
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult bindShelf(TrayCodeMakeSure trayCodeMakeSure) {
BasContainerDetails basContainerDetails = new BasContainerDetails();
basContainerDetails.setContainerId(trayCodeMakeSure.getContainerCode());
for (MydoJobDetail mydoJobDetail : trayCodeMakeSure.getMydoJobDetailList()) {
basContainerDetails.setProductId(mydoJobDetail.getProductId());
List<BasContainerDetails> basContainerDetailsList = basContainerDetailsService.selectBasContainerDetailsList(basContainerDetails);
if (basContainerDetailsList.isEmpty()) {
basContainerDetails.setProductName(mydoJobDetail.getExtraField().getMaterialDesc());
basContainerDetails.setQuantity(Convert.toLong(mydoJobDetail.getPickBindQuantity()));
basContainerDetailsService.insertBasContainerDetails(basContainerDetails);
} else {
basContainerDetails.setId(basContainerDetailsList.get(0).getId());
basContainerDetails.setQuantity(basContainerDetailsList.get(0).getQuantity() + Convert.toLong(mydoJobDetail.getPickBindQuantity()));
basContainerDetailsService.updateBasContainerDetails(basContainerDetails);
}
OutPickSubmit outPickSubmitParam = new OutPickSubmit();
outPickSubmitParam.setWarehouseId(trayCodeMakeSure.getWarehouseId());
outPickSubmitParam.setExitId(trayCodeMakeSure.getExitId());
outPickSubmitParam.setProductId(mydoJobDetail.getProductId());
List<OutPickSubmit> outPickSubmits = outPickSubmitService.selectOutPickSubmitList(outPickSubmitParam);
if (Integer.parseInt(outPickSubmits.get(0).getQuantity()) > Integer.parseInt(mydoJobDetail.getPickBindQuantity())) {
outPickSubmitParam.setQuantity(String.valueOf(Integer.parseInt(outPickSubmits.get(0).getQuantity()) - Integer.parseInt(mydoJobDetail.getPickBindQuantity())));
outPickSubmitParam.setId(outPickSubmits.get(0).getId());
outPickSubmitService.updateOutPickSubmit(outPickSubmitParam);
} else {
outPickSubmitService.deleteOutPickSubmitById(outPickSubmits.get(0).getId());
}
}
return AjaxResult.success();
}
@Override
public AjaxResult movePoint(String startPoint, String endPoint) {
BasContainerDetails basContainerDetails = new BasContainerDetails();
basContainerDetails.setContainerId(startPoint);
List<BasContainerDetails> basContainerDetails1 = basContainerDetailsService.selectBasContainerDetailsList(basContainerDetails);
if (basContainerDetails1.isEmpty()) {
return AjaxResult.error(MessageUtils.message("error.message31"));
}
BasContainerDetails basContainer = basContainerDetails1.get(0);
return agvRequest(basContainer.getContainerId(), startPoint, endPoint);
}
}