package com.zy.asrs.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.core.common.Cools;
|
import com.core.exception.CoolException;
|
import com.zy.asrs.entity.*;
|
import com.zy.asrs.entity.param.LocDetlAdjustParam;
|
import com.zy.asrs.entity.param.StockOutParam;
|
import com.zy.asrs.service.*;
|
import com.zy.asrs.utils.Utils;
|
import com.zy.common.model.LocDto;
|
import com.zy.common.model.OrderDto;
|
import com.zy.common.model.StartupDto;
|
import com.zy.common.model.TaskDto;
|
import com.zy.common.service.AgvCommonService;
|
import com.zy.common.web.BaseController;
|
import lombok.Synchronized;
|
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.util.ArrayList;
|
import java.util.Date;
|
import java.util.Iterator;
|
import java.util.List;
|
|
/**
|
* Created by vincent on 2020/6/11
|
*/
|
@Slf4j
|
@Service
|
@Transactional
|
public class AgvWorkServiceImpl implements AgvWorkService {
|
|
// 工作号生成规则默认类型
|
private static final int DEFAULT_WORK_NO_TYPE = 0;
|
// 库位排号分配默认类别
|
private static final int DEFAULT_ROW_NO_TYPE = 1;
|
@Autowired
|
private AgvWaitPakinService agvWaitPakinService;
|
@Autowired
|
private AgvBasDevpService agvBasDevpService;
|
@Autowired
|
private AgvLocMastService agvLocMastService;
|
@Autowired
|
private AgvLocDetlService agvLocDetlService;
|
@Autowired
|
private AgvCommonService agvCommonService;
|
@Autowired
|
private AgvWrkMastService agvWrkMastService;
|
@Autowired
|
private AgvWrkDetlService agvWrkDetlService;
|
@Autowired
|
private MatService matService;
|
@Autowired
|
private OrderService orderService;
|
@Autowired
|
private OrderDetlService orderDetlService;
|
@Autowired
|
private AdjDetlService adjDetlService;
|
@Autowired
|
private AgvWrkMastLogService agvWrkMastLogService;
|
@Autowired
|
private AgvWrkDetlLogService agvWrkDetlLogService;
|
|
|
/*
|
入库
|
*/
|
@Transactional
|
@Synchronized
|
public StartupDto createWaitPainWrkMastStart(List<AgvBasDevp> agvBasDevpList, Long userId, boolean isConveyor) {
|
|
Date now = new Date();
|
|
agvBasDevpList.forEach(agvBasDevp -> {
|
if(Cools.isEmpty(agvBasDevp.getBarcode())){
|
throw new CoolException("选中的站点中含有未绑定托盘的站点,请重新选择");
|
}
|
|
if(!"F".equals(agvBasDevp.getLocSts())){
|
throw new CoolException("选中的站点中含有货位状态不为F.在库的站点,请重新选择");
|
}
|
|
List<AgvWaitPakin> agvWaitPakinList = agvWaitPakinService.selectList(new EntityWrapper<AgvWaitPakin>().eq("supp_code", agvBasDevp.getBarcode()));
|
|
//检索库位,选择合适的库位
|
AgvLocMast agvLocMast = agvCommonService.getLocNo(agvBasDevp.getLocType1(),agvBasDevp.getFloor());
|
//生成工作档
|
AgvWrkMast wrkMast = createWrkMast(1,201L,agvBasDevp.getDevNo(),agvLocMast.getLocNo(),agvBasDevp.getBarcode(),now,userId, agvBasDevp.getLocType2());
|
//标记是否为输送线入库
|
wrkMast.setMk(isConveyor ? "Y" : "N");
|
//生成工作档明细
|
agvWaitPakinList.forEach(wp -> {
|
createWrkDetlReWrite(wp.getMatnr(),wrkMast.getWrkNo(),wp.getOrderNo(),wp.getBatch(),wp.getAnfme(),wp.getSuppCode(),now,userId,wp.getThreeCode(),wp.getDeadTime());
|
});
|
//更新源站点信息
|
updateAgvBasDevp(agvBasDevp,"R");
|
//更新目标库位状态
|
updateAgvLocMast(agvLocMast,"S");
|
|
});
|
|
//TODO
|
return null;
|
}
|
|
/*
|
订单出库
|
*/
|
@Transactional
|
public void stockOutWrkMast(List<TaskDto> agvTaskDtos, Long userId) {
|
Date now = new Date();
|
|
agvTaskDtos.forEach(taskDto -> {
|
|
List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectByTaskDto(taskDto);
|
|
//AgvLocDetl agvLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no", taskDto.getLocNo()));
|
|
//工作档所需参数
|
|
long wrkSts = 21L;
|
String sourceLocNo = taskDto.getLocNo();
|
String targetLocNo = taskDto.getAgvStaNo();
|
//String barcode = agvLocDetls.get(0).getSuppCode();
|
String containerCode = taskDto.getLocDtos().get(0).getContainerCode();
|
|
|
//判断是否全板出库
|
int ioType = isPakOut(sourceLocNo,taskDto) ? 101 : 103;
|
//生成工作档
|
AgvWrkMast wrkMast = createWrkMast(ioType,wrkSts,sourceLocNo,targetLocNo,containerCode,now,userId,Short.valueOf(containerCode.substring(0,2)));
|
//生成工作档明细
|
taskDto.getLocDtos().forEach(locDto -> {
|
if (!BaseController.isJSON(locDto.getOrderNo())) {
|
//明细档所需参数
|
createWrkDetlReWrite(locDto.getMatnr(),
|
wrkMast.getWrkNo(),
|
locDto.getOrderNo(),
|
locDto.getBatch(),
|
locDto.getAnfme(),
|
locDto.getContainerCode(),
|
now,
|
userId,
|
locDto.getCsocode(),
|
locDto.getIsoseq());
|
}else {
|
List<OrderDto> orderDtoList = JSON.parseArray(locDto.getOrderNo(), OrderDto.class);
|
orderDtoList.forEach(orderDto -> {
|
//明细档所需参数
|
createWrkDetlReWrite(locDto.getMatnr(),
|
wrkMast.getWrkNo(),
|
orderDto.getOrderNo(),
|
locDto.getBatch(),
|
orderDto.getAnfme(),
|
locDto.getContainerCode(),
|
now,
|
userId,
|
locDto.getCsocode(),
|
locDto.getIsoseq());
|
});
|
}
|
|
//修改订单信息
|
modifyOrderDetl(locDto, userId);
|
});
|
// //修改订单信息
|
// modifyOrderDetl(taskDto.getLocDtos().get(0), userId);
|
//更新源站点信息
|
String locSts = ioType == 101 ? "R" : "P";
|
updateAgvLocMast(agvLocMastService.selectById(sourceLocNo),locSts);
|
//更新目标站点状态
|
//locSts = ioType == 101 ? "S" : "Q";
|
updateAgvBasDevp(agvBasDevpService.selectById(targetLocNo),"S");
|
|
});
|
}
|
|
//拣料入库
|
@Transactional
|
public void pickIn(List<AgvWrkMast> agvWrkMastList){
|
Date now = new Date();
|
agvWrkMastList.forEach(agvWrkMast -> {
|
|
//保存拣料出库的工作档和明细
|
agvWrkMastLogService.save(agvWrkMast);
|
agvWrkDetlLogService.save(agvWrkMast.getWrkNo());
|
|
//修改工作党
|
agvWrkMast.setWrkSts(201L);
|
|
//根据出库类型 设置入库类型 53拣料入库 57盘点入库
|
int ioType = agvWrkMast.getIoType() == 103 ? 53 : 57;
|
|
agvWrkMast.setIoType(ioType);
|
String locNo = agvWrkMast.getLocNo();
|
agvWrkMast.setLocNo(agvWrkMast.getSourceLocNo());
|
agvWrkMast.setSourceLocNo(locNo);
|
agvWrkMast.setIoTime(now);
|
agvWrkMastService.updateById(agvWrkMast);
|
|
List<AgvWrkDetl> agvWrkDetlList = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
|
AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMast.getLocNo());
|
//List<AgvLocDetl> agvLocDetlList = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvLocMast.getLocNo()));
|
AgvBasDevp agvBasDevp = agvBasDevpService.selectById(agvWrkMast.getSourceLocNo());
|
|
//拣料入库
|
if(ioType == 53){
|
//修改工作党明细
|
//agvWrkDetl.setAnfme(agvLocDetl.getAnfme() - agvWrkDetl.getAnfme());
|
//agvWrkDetlService.update(agvWrkDetl,new EntityWrapper<AgvWrkDetl>().eq("wrk_no",agvWrkDetl.getWrkNo()));
|
//修改库存信息
|
agvWrkDetlList.forEach(agvWrkDetl -> {
|
AgvLocDetl agvLocDetl = agvLocDetlService.selectByMatnrAndBatchAndCsocodeAndisoCode(agvWrkMast.getLocNo(), agvWrkDetl.getMatnr(), agvWrkDetl.getBatch(), agvWrkDetl.getThreeCode(), agvWrkDetl.getDeadTime());
|
|
//AgvLocDetl agvLocDetl = agvLocDetlService.selectLocdetl(agvWrkMast.getLocNo(),agvWrkDetl.getMatnr(),agvWrkDetl.getBatch(),agvWrkDetl.getThreeCode(),agvWrkDetl.getDeadTime());
|
double updateAnfme = agvLocDetl.getAnfme() - agvWrkDetl.getAnfme();
|
agvLocDetlService.updateAnfme(updateAnfme,agvLocDetl.getLocNo(),agvLocDetl.getMatnr(),agvLocDetl.getBatch(),agvLocDetl.getThreeCode(),agvLocDetl.getDeadTime());
|
});
|
}
|
//修改库位信息
|
updateAgvLocMast(agvLocMast,"Q");
|
//修改站点信息
|
updateAgvBasDevp(agvBasDevp,"R");
|
|
});
|
}
|
|
/*
|
盘点出库
|
*/
|
@Transactional
|
public void locCheckOut(StockOutParam param, Long userId) {
|
String station = param.getStation();
|
|
List<TaskDto> taskDtos = new ArrayList<>();
|
param.getLocDetls().forEach(locDetl -> {
|
LocDto locDto = new LocDto(locDetl.getLocNo(),locDetl.getCount(),locDetl.getMatnr(),locDetl.getBatch(),locDetl.getThreeCode(),locDetl.getDeadTime(),locDetl.getSuppCode());
|
TaskDto taskDto = new TaskDto(locDetl.getLocNo(),station,locDto);
|
if(TaskDto.has(taskDtos,taskDto)){
|
TaskDto.find(taskDtos,taskDto).getLocDtos().add(locDto);
|
}else {
|
taskDtos.add(taskDto);
|
}
|
});
|
|
Date now = new Date();
|
taskDtos.forEach(taskDto -> {
|
|
//判断是否有重复料想的工作当
|
AgvWrkMast agvWrkMastList = agvWrkMastService.selectByContainerCode(taskDto.getLocDtos().get(0).getContainerCode());
|
if(!Cools.isEmpty(agvWrkMastList)){
|
return;
|
}
|
|
int containerType = getContainerTypeByloc(taskDto.getLocNo());
|
|
//生成工作档
|
AgvWrkMast wrkMast = createWrkMast(107, 21L,taskDto.getLocNo(),taskDto.getAgvStaNo(),taskDto.getLocDtos().get(0).getContainerCode(),now,userId,containerType);
|
//生成工作档明细
|
taskDto.getLocDtos().forEach(locDto -> {
|
//明细档所需参数
|
createWrkDetlReWrite(locDto.getMatnr(),
|
wrkMast.getWrkNo(),
|
locDto.getOrderNo(),
|
locDto.getBatch(),
|
locDto.getAnfme(),
|
locDto.getContainerCode(),
|
now,
|
userId,
|
locDto.getCsocode(),
|
locDto.getIsoseq());
|
});
|
updateAgvLocMast(agvLocMastService.selectById(wrkMast.getSourceLocNo()),"P");
|
//更新目标站点状态
|
//locSts = ioType == 101 ? "S" : "Q";
|
updateAgvBasDevp(agvBasDevpService.selectById(wrkMast.getLocNo()),"S");
|
});
|
|
}
|
|
/*
|
库位移转
|
*/
|
@Transactional
|
public void locMove(String sourceLocNo, String targetLocNo, Long userId) {
|
AgvLocMast sourceLocMast = agvLocMastService.selectById(sourceLocNo);
|
AgvLocMast targetLocMast = agvLocMastService.selectById(targetLocNo);
|
AgvLocDetl sourceLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no", sourceLocMast.getLocNo()));
|
|
if(!sourceLocMast.getLocSts().equals("F")){
|
throw new CoolException(sourceLocMast.getLocNo() + "源库位出库失败,状态:"+sourceLocMast.getLocSts$());
|
}
|
if(!targetLocMast.getLocSts().equals("O")){
|
throw new CoolException("移转失败,目标库位状态:"+targetLocMast.getLocSts$());
|
}
|
|
Date now = new Date();
|
|
//生成移库工作档
|
AgvWrkMast wrkMast = createWrkMast(11, 21L, sourceLocNo, targetLocNo, sourceLocDetl.getSuppCode(), now, userId,getContainerTypeByloc(sourceLocNo));
|
//生成工作党明细
|
createWrkDetlReWrite(sourceLocDetl.getMatnr(),wrkMast.getWrkNo(),null,sourceLocDetl.getBatch(),sourceLocDetl.getAnfme(),sourceLocDetl.getZpallet(),now,userId,sourceLocDetl.getThreeCode(),sourceLocDetl.getDeadTime());
|
//修改目标库位状态
|
updateAgvLocMast(targetLocMast,"S");
|
//修改原库位状态
|
updateAgvLocMast(sourceLocMast,"R");
|
}
|
|
/*
|
入库
|
*/
|
@Transactional
|
public String emptyPlateIn(String station,String containerCode,Short containerType, Long userId, boolean emptyAutoIn) {
|
|
Date now = new Date();
|
|
Short locType = 0;
|
|
AgvBasDevp agvBasDevp = agvBasDevpService.selectById(station);
|
if (Cools.isEmpty(agvBasDevp)) {
|
throw new CoolException("暂无"+ station + "站点");
|
}
|
if (containerType == 40 && agvBasDevp.getFloor() == 3) {
|
locType = 5;
|
} else if (containerType == 21 && agvBasDevp.getFloor() == 3) {
|
locType = 4;
|
} else if (containerType == 20 && agvBasDevp.getFloor() == 3) {
|
locType = 2;
|
} else {
|
locType = agvBasDevp.getLocType1();
|
}
|
|
if(!Cools.eq(agvBasDevp.getBarcode(),containerCode) && !agvBasDevp.getLocSts().equals("O") && !emptyAutoIn){
|
throw new CoolException("当前工作位状态为" + agvBasDevp.getLocSts()+",无法进行空板入库");
|
}
|
|
//查询工作档
|
AgvWrkMast agvWrkMast = agvWrkMastService.selectByContainerCode(containerCode);
|
if(!Cools.isEmpty(agvWrkMast) && !emptyAutoIn){
|
throw new CoolException("当前容器已有入库任务,无法进行入库");
|
}
|
|
//检索库位,选择合适的库位
|
AgvLocMast agvLocMast = agvCommonService.getLocNo(locType,agvBasDevp.getFloor());
|
|
//查询入库通知档
|
List<AgvWaitPakin> agvWaitPakinList = agvWaitPakinService.selectByContainerCode(containerCode);
|
if(!Cools.isEmpty(agvWaitPakinList)){
|
|
|
String devNo = agvBasDevp.getDevNo();
|
String locNo = agvLocMast.getLocNo();
|
|
//生成工作档
|
AgvWrkMast wrkMast = createWrkMast(1,201L,devNo,locNo,containerCode,now,userId, containerType);
|
//生成工作档明细
|
agvWaitPakinList.forEach(wp -> {
|
createWrkDetlReWrite(wp.getMatnr(),wrkMast.getWrkNo(),wp.getOrderNo(),wp.getBatch(),wp.getAnfme(),wp.getSuppCode(),now,userId,wp.getThreeCode(),wp.getDeadTime());
|
});
|
//修改入库通知档状态
|
agvWaitPakinService.updateIoStatus(containerCode,"Y");
|
//更新源站点状态
|
updateAgvBasDevp(agvBasDevp,"R",containerType);
|
}else {
|
// 生成工作档 10.空板入库
|
createWrkMast(10,201L,agvBasDevp.getDevNo(),agvLocMast.getLocNo(),containerCode,now,userId,containerType);
|
//更新源站点状态
|
updateAgvBasDevp(agvBasDevp,"R",containerType,containerCode);
|
}
|
|
//更新目标库位状态和信息
|
updateAgvLocMast(agvLocMast,"S");
|
return agvLocMast.getLocNo();
|
}
|
|
/*
|
空板出库
|
*/
|
@Transactional
|
public void emptyPlateOut(String station, int containerType, Long userId) {
|
Date now = new Date();
|
|
// 站点检测
|
AgvBasDevp agvBasDevp = agvBasDevpService.selectById(station);
|
if(!agvBasDevp.getLocSts().equals("O")){
|
throw new CoolException("当前工作位状态为" + agvBasDevp.getLocSts()+",无法进行空板出库");
|
}
|
|
//寻找相应类型的空托盘
|
AgvLocMast agvLocMast = agvLocMastService.selectEmptyZpallet(containerType,agvBasDevp.getFloor());
|
if(containerType == 0){
|
//空板自动出库,根据站点类型选择
|
agvLocMastService.selectEmptyZpalletByLocType1(agvBasDevp.getLocType1());
|
|
}
|
|
if (Cools.isEmpty(agvLocMast)) {
|
throw new CoolException("暂无当前出库站点类型的空托盘!");
|
}
|
//生成工作档
|
createWrkMast(110,21L,agvLocMast.getLocNo(),agvBasDevp.getDevNo(),agvLocMast.getBarcode(),now,userId,containerType);
|
|
//修改源库位状态
|
updateAgvLocMast(agvLocMast,"R");
|
|
//修改站点状态
|
updateAgvBasDevp(agvBasDevp,"S",(short)containerType,agvLocMast.getBarcode());
|
|
}
|
|
@Transactional
|
public void adjustLocDetl(LocDetlAdjustParam param, Long userId) {
|
param.integrate();
|
AgvLocMast locMast = agvLocMastService.selectById(param.getLocNo());
|
if (Cools.isEmpty(locMast)) {
|
throw new CoolException("库位不存在");
|
}
|
if (!(locMast.getLocSts().equals("F") || locMast.getLocSts().equals("D") || locMast.getLocSts().equals("O"))) {
|
throw new CoolException("当前库位不可调整!库位状态:" + locMast.getLocSts$());
|
}
|
|
Date now = new Date();
|
List<AgvLocDetl> locDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", param.getLocNo()));
|
|
List<LocDetlAdjustParam.LocDetlAdjust> list = param.getList();
|
|
// 修改数量
|
Iterator<AgvLocDetl> iterator = locDetls.iterator();
|
while (iterator.hasNext()) {
|
AgvLocDetl locDetl = iterator.next();
|
|
Iterator<LocDetlAdjustParam.LocDetlAdjust> iterator1 = list.iterator();
|
while (iterator1.hasNext()) {
|
LocDetlAdjustParam.LocDetlAdjust adjust = iterator1.next();
|
if (adjust.getCount() == 0) { continue; }
|
if (locDetl.getMatnr().equals(adjust.getMatnr()) && Cools.eq(locDetl.getBatch(), adjust.getBatch()) && Cools.eq(locDetl.getSuppCode(),adjust.getSuppCode()) && Cools.eq(locDetl.getThreeCode(),adjust.getThreeCode()) && Cools.eq(locDetl.getDeadTime(),adjust.getDeadTime())) {
|
if (!locDetl.getAnfme().equals(adjust.getCount())) {
|
// todo 盘点记录
|
// 修改库存
|
if (!agvLocDetlService.updateAnfme(adjust.getCount(), locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(),locDetl.getThreeCode(),locDetl.getDeadTime())) {
|
throw new CoolException(locDetl.getLocNo() + "库位," + locDetl.getMatnr() + "商品," + locDetl.getBatch() + "序列码修改数量失败");
|
}
|
// 保存调整记录
|
AdjDetl adjDetl = new AdjDetl();
|
adjDetl.setLocNo(locDetl.getLocNo());
|
adjDetl.setMatnr(locDetl.getMatnr());
|
adjDetl.setBatch(locDetl.getBatch());
|
adjDetl.setOriQty(locDetl.getAnfme());
|
adjDetl.setAdjQty(adjust.getCount());
|
adjDetl.setModiTime(now);
|
adjDetl.setModiUser(userId);
|
adjDetl.setAppeTime(now);
|
adjDetl.setAppeUser(userId);
|
|
adjDetl.setOrderNo(Utils.generateAdjustOrderNo());
|
|
adjDetl.setCsocode(locDetl.getThreeCode());
|
adjDetl.setIsoseq(locDetl.getDeadTime());
|
|
adjDetlService.save(adjDetl, userId);
|
}
|
iterator.remove();
|
iterator1.remove();
|
}
|
}
|
}
|
|
// 删除库存
|
for (AgvLocDetl locDetl : locDetls) {
|
// todo 盘点记录
|
if (!agvLocDetlService.updateAnfme(-1.0D, locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(),locDetl.getThreeCode(),locDetl.getDeadTime())) {
|
throw new CoolException("删除" + locDetl.getLocNo() + "库位," + locDetl.getMatnr() + "商品," + locDetl.getBatch() + "序列码库存明细失败");
|
}
|
// 保存调整记录
|
AdjDetl adjDetl = new AdjDetl();
|
adjDetl.setLocNo(locDetl.getLocNo());
|
adjDetl.setMatnr(locDetl.getMatnr());
|
adjDetl.setBatch(locDetl.getBatch());
|
adjDetl.setOriQty(locDetl.getAnfme());
|
adjDetl.setAdjQty(0.0D);
|
adjDetl.setModiTime(now);
|
adjDetl.setModiUser(userId);
|
adjDetl.setAppeTime(now);
|
adjDetl.setAppeUser(userId);
|
adjDetl.setOrderNo(Utils.generateAdjustOrderNo());
|
|
adjDetlService.save(adjDetl, userId);
|
}
|
|
// 添加库存
|
for (LocDetlAdjustParam.LocDetlAdjust adjust : list) {
|
if (adjust.getCount() == 0.0D) { continue; }
|
Mat mat = matService.selectByMatnr(adjust.getMatnr());
|
AgvLocDetl locDetl = new AgvLocDetl();
|
locDetl.sync(mat);
|
locDetl.setBatch(adjust.getBatch());
|
locDetl.setLocNo(locMast.getLocNo());
|
locDetl.setAnfme(adjust.getCount()); // 数量
|
locDetl.setModiUser(userId); // 操作人员信息
|
locDetl.setModiTime(now);
|
locDetl.setAppeUser(userId);
|
locDetl.setAppeTime(now);
|
locDetl.setOrderNo(adjust.getOrderNo());
|
locDetl.setThreeCode(adjust.getThreeCode());
|
locDetl.setDeadTime(adjust.getDeadTime());
|
locDetl.setSuppCode(adjust.getSuppCode());
|
if (!agvLocDetlService.insert(locDetl)) {
|
throw new CoolException("添加" + locDetl.getLocNo() + "库位," + locDetl.getMatnr() + "商品," + locDetl.getBatch() + "序列码库存明细失败");
|
}
|
// 保存调整记录
|
AdjDetl adjDetl = new AdjDetl();
|
adjDetl.setLocNo(locMast.getLocNo());
|
adjDetl.setMatnr(adjust.getMatnr());
|
adjDetl.setBatch(adjust.getBatch());
|
adjDetl.setOriQty(0.0D);
|
adjDetl.setAdjQty(adjust.getCount());
|
adjDetl.setModiTime(now);
|
adjDetl.setModiUser(userId);
|
adjDetl.setAppeTime(now);
|
adjDetl.setAppeUser(userId);
|
|
adjDetl.setOrderNo(Utils.generateAdjustOrderNo());
|
adjDetl.setCsocode(locDetl.getThreeCode());
|
adjDetl.setIsoseq(locDetl.getDeadTime());
|
|
adjDetlService.save(adjDetl, userId);
|
}
|
// 修改库位状态
|
int count = agvLocDetlService.selectCount(new EntityWrapper<AgvLocDetl>().eq("loc_no", locMast.getLocNo()));
|
if (locMast.getLocSts().equals("F")) {
|
if (count == 0) {
|
locMast.setLocSts("D");
|
}
|
}
|
if (locMast.getLocSts().equals("D") || locMast.getLocSts().equals("O")) {
|
if (count > 0) {
|
locMast.setLocSts("F");
|
}
|
}
|
locMast.setModiUser(userId);
|
locMast.setModiTime(new Date());
|
if (!agvLocMastService.updateById(locMast)) {
|
throw new CoolException("更新库位状态失败");
|
}
|
}
|
|
@Override
|
@Transactional
|
public void completeWrkMast(String workNo, Long userId) {
|
AgvWrkMast wrkMast = agvWrkMastService.selectById(workNo);
|
if (Cools.isEmpty(wrkMast)){
|
throw new CoolException(workNo+"工作档不存在");
|
}
|
// if(!wrkMast.getLocNo().contains("@") || !wrkMast.getSourceLocNo().contains("@")){
|
// throw new CoolException("目标库位或者源库位暂未分配,无法取消");
|
// }
|
//修改AGV工作档的工作状态为205.工作完成
|
agvWrkMastService.updateWrkStsByWrkNo(wrkMast.getWrkNo(),205);
|
|
//出库任务 101.出库 || 103.拣料出库 || 107.盘点出库
|
if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107){
|
//修改出库站点状态
|
agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getLocNo(),"F",wrkMast.getBarcode(),wrkMast.getWhsType().shortValue());
|
}
|
if(wrkMast.getIoType() == 1 || wrkMast.getIoType() == 53 ){
|
//修改出库站点状态
|
agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getSourceLocNo(),"O","",wrkMast.getWhsType().shortValue());
|
}
|
//出库任务 110.空板出库
|
if(wrkMast.getIoType() == 110){
|
agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getLocNo(),"F",wrkMast.getBarcode(),wrkMast.getWhsType().shortValue());
|
}
|
|
}
|
|
@Transactional
|
public void cancelWrkMast(String workNo, Long userId,Integer type) {
|
AgvWrkMast wrkMast = agvWrkMastService.selectById(workNo);
|
if (Cools.isEmpty(wrkMast)){
|
throw new CoolException(workNo+"工作档不存在");
|
}
|
//拣料入库 盘点入库不可取消
|
if(wrkMast.getIoType() == 53 || wrkMast.getIoType() == 57){
|
throw new CoolException("当前任务不可取消");
|
}
|
|
//入库取消
|
if(wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10){
|
//源站点
|
String devNo = wrkMast.getSourceLocNo();
|
//目标库位
|
String locNo = wrkMast.getLocNo();
|
agvLocMastService.updateLocStsByLocNo(locNo,"O","",null);
|
agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"F",wrkMast.getBarcode(),wrkMast.getWhsType().shortValue());
|
|
// 移库取消
|
}else if(wrkMast.getIoType() == 108 || wrkMast.getIoType() == 11 || wrkMast.getIoType() == 12) {
|
//源库位
|
String locNo = wrkMast.getSourceLocNo();
|
|
// 目标库位
|
String targetLocNo = wrkMast.getLocNo();
|
agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode(),(short)getContainerTypeByloc(locNo));
|
agvLocMastService.updateLocStsByLocNo(targetLocNo,"O","",null);
|
//出库取消
|
} else {
|
//源库位
|
String locNo = wrkMast.getSourceLocNo();
|
//目标站点
|
String devNo = wrkMast.getLocNo();
|
agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode(),(short)getContainerTypeByloc(locNo));
|
agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"O","",null);
|
}
|
|
if(wrkMast.getIoType() != 1 && wrkMast.getIoType() != 10){
|
//订单回滚
|
//List<AgvWrkDetl> agvWrkDetlList = agvWrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
|
List<AgvWrkDetl> agvWrkDetlList1 = agvWrkDetlService.selectList(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
|
agvWrkDetlList1.forEach(agvWrkDetl -> {
|
|
if(!Cools.isEmpty(agvWrkDetl.getOrderNo())){
|
String orderNo = agvWrkDetl.getOrderNo();
|
if(orderNo.contains("{")){
|
JSONArray orderArray = JSON.parseArray(orderNo);
|
for (Object o : orderArray){
|
JSONObject jsonobject = (JSONObject) o;
|
OrderDetl orderDetl = orderDetlService.selectByOrderNoAndMatnr(jsonobject.get("orderNo").toString(),agvWrkDetl.getMatnr(),agvWrkDetl.getThreeCode(),agvWrkDetl.getDeadTime());
|
orderDetl.setQty(orderDetl.getQty() - agvWrkDetl.getAnfme());
|
orderDetlService.updateById(orderDetl);
|
}
|
|
}else {
|
OrderDetl orderDetl = orderDetlService.selectByOrderNoAndMatnr(agvWrkDetl.getOrderNo(),agvWrkDetl.getMatnr(),agvWrkDetl.getThreeCode(),agvWrkDetl.getDeadTime());
|
orderDetl.setQty(orderDetl.getQty() - agvWrkDetl.getAnfme());
|
orderDetlService.updateById(orderDetl);
|
}
|
}
|
});
|
}
|
|
//保存工作档以及明细
|
agvWrkMastLogService.save(wrkMast);
|
agvWrkDetlLogService.save(wrkMast.getWrkNo());
|
|
//删除工作档以及明细
|
if(!agvWrkMastService.deleteByWrkNo(wrkMast.getWrkNo()) || !agvWrkDetlService.deleteByWrkNo(wrkMast.getWrkNo())){
|
throw new CoolException("删除失败,请联系管理员");
|
}
|
if (type == 2) {
|
//调用agv取消任务接口
|
agvWrkMastService.callCancelTask(wrkMast.getWrkNo());
|
}
|
|
|
}
|
|
/*
|
更新目标库位信息
|
*/
|
private void updateAgvLocMast(AgvLocMast locMast, String locSts){
|
locMast.setLocSts(locSts);
|
agvLocMastService.updateById(locMast);
|
}
|
|
/*
|
更新目标库位信息和库位托盘类型
|
*/
|
private void updateAgvLocMast(AgvLocMast locMast, String locSts, short type){
|
locMast.setLocSts(locSts);
|
locMast.setLocType2(type);
|
agvLocMastService.updateById(locMast);
|
}
|
|
/*
|
更新源站点信息
|
*/
|
private void updateAgvBasDevp(AgvBasDevp agvBasDevp, String locSts){
|
if(!Cools.isEmpty(agvBasDevp)){
|
agvBasDevp.setLocSts(locSts);
|
agvBasDevpService.updateById(agvBasDevp);
|
}
|
}
|
|
/*
|
更新源站点信息和库位托盘类型
|
*/
|
private void updateAgvBasDevp(AgvBasDevp agvBasDevp, String locSts, Short continerType){
|
if(!Cools.isEmpty(agvBasDevp)){
|
agvBasDevp.setLocSts(locSts);
|
agvBasDevp.setLocType2(continerType);
|
agvBasDevpService.updateById(agvBasDevp);
|
}
|
}
|
|
private void updateAgvBasDevp(AgvBasDevp agvBasDevp, String locSts, Short continerType, String containerCode){
|
if(!Cools.isEmpty(agvBasDevp)){
|
agvBasDevp.setLocSts(locSts);
|
agvBasDevp.setLocType2(continerType);
|
agvBasDevp.setBarcode(containerCode);
|
agvBasDevpService.updateById(agvBasDevp);
|
}
|
}
|
|
/*
|
生成工作档明细
|
*/
|
private void createWrkDetlReWrite(String matnr, int wrkNo, String orderNo,String batch, double anfme, String zpallet, Date now, Long userId, String csocode, String isoseq){
|
Mat mat = matService.selectByMatnr(matnr);
|
if (Cools.isEmpty(mat)) {
|
throw new CoolException(matnr + "商品维护失败");
|
}
|
AgvWrkDetl wrkDetl = new AgvWrkDetl();
|
wrkDetl.sync(mat);
|
wrkDetl.setWrkNo(wrkNo);
|
wrkDetl.setOrderNo(orderNo);
|
wrkDetl.setIoTime(now);
|
wrkDetl.setBatch(batch);
|
wrkDetl.setAnfme(anfme); // 数量
|
wrkDetl.setSuppCode(zpallet); // 托盘条码
|
wrkDetl.setAppeUser(userId);
|
wrkDetl.setAppeTime(now);
|
wrkDetl.setModiUser(userId);
|
wrkDetl.setModiTime(now);
|
|
wrkDetl.setThreeCode(csocode);
|
wrkDetl.setDeadTime(isoseq);
|
if (!agvWrkDetlService.insert(wrkDetl)) {
|
throw new CoolException("保存工作明细失败");
|
}
|
}
|
|
/*
|
生成工作档明细
|
*/
|
@Deprecated
|
private void createWrkDetlReWrite(List<AgvWaitPakin> agvWaitPakinList, AgvWrkMast wrkMast, Long userId){
|
Date now = new Date();
|
agvWaitPakinList.stream().forEach(agvWaitPakin -> {
|
Mat mat = matService.selectByMatnr(agvWaitPakin.getMatnr());
|
if (Cools.isEmpty(mat)) {
|
throw new CoolException(agvWaitPakin.getMatnr() + "商品维护失败");
|
}
|
AgvWrkDetl wrkDetl = new AgvWrkDetl();
|
wrkDetl.sync(mat);
|
wrkDetl.setWrkNo(wrkMast.getWrkNo());
|
wrkDetl.setOrderNo(agvWaitPakin.getOrderNo());
|
wrkDetl.setIoTime(now);
|
wrkDetl.setBatch(agvWaitPakin.getBatch());
|
wrkDetl.setAnfme(agvWaitPakin.getAnfme()); // 数量
|
wrkDetl.setZpallet(agvWaitPakin.getZpallet()); // 托盘条码
|
wrkDetl.setAppeUser(userId);
|
wrkDetl.setAppeTime(now);
|
wrkDetl.setModiUser(userId);
|
wrkDetl.setModiTime(now);
|
if (!agvWrkDetlService.insert(wrkDetl)) {
|
throw new CoolException("保存工作明细失败");
|
}
|
});
|
}
|
|
/*
|
生成工作档
|
*/
|
private AgvWrkMast createWrkMast(int ioType, long wrkSts, String sourceLocNo, String locNo, String barcode, Date now, Long userId, int containerType){
|
AgvWrkMast wrkMast = new AgvWrkMast();
|
//工作状态
|
wrkMast.setWrkSts(wrkSts);
|
//入出库类型
|
wrkMast.setIoType(ioType);
|
wrkMast.setIoTime(now);
|
//优先级
|
wrkMast.setIoPri(300.0);
|
//源站点
|
wrkMast.setSourceLocNo(sourceLocNo);
|
//目标站点
|
wrkMast.setLocNo(locNo);
|
//容器编码
|
wrkMast.setBarcode(barcode);
|
//容器类型
|
wrkMast.setWhsType(containerType);
|
|
wrkMast.setAppeUser(userId);
|
wrkMast.setAppeTime(now);
|
wrkMast.setModiUser(userId);
|
wrkMast.setModiTime(now);
|
|
if (!agvWrkMastService.insertByIncrease(wrkMast)) {
|
throw new CoolException("保存工作档失败");
|
}
|
|
//暂存位任务+1
|
addInQty(locNo);
|
|
wrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", locNo).eq("source_loc_no",sourceLocNo));
|
|
return wrkMast;
|
}
|
|
private boolean isPakOut(String locNo, TaskDto taskDto){
|
Double allAnfme = agvLocDetlService.selectSumAnfmeByLocNo(locNo);
|
Double pakOutAnfme = 0.0;
|
for (LocDto locDto : taskDto.getLocDtos()){
|
pakOutAnfme += locDto.getAnfme();
|
}
|
|
if(allAnfme > pakOutAnfme){
|
return false;
|
}
|
return true;
|
}
|
|
/*
|
AGV生成出库工作档后修改订单信息
|
TODO 与四项库生成出库工作档后修改订单信息整合到一起
|
*/
|
private void modifyOrderDetl(LocDto locDto, Long userId){
|
|
if (!BaseController.isJSON(locDto.getOrderNo())) {
|
//非合并出库
|
OrderDetl orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch(),locDto.getCsocode(),locDto.getIsoseq());
|
if (orderDetl == null) {
|
orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null,locDto.getCsocode(),locDto.getIsoseq());
|
}
|
if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme(),locDto.getCsocode(),locDto.getIsoseq())) {
|
throw new CoolException("修改订单明细数量失败");
|
}
|
orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
|
}else {
|
//合并出库
|
List<OrderDto> orderDtoList = JSON.parseArray(locDto.getOrderNo(), OrderDto.class);
|
|
//实际出库数量
|
Double locAnfme = locDto.getAnfme();
|
//订单实际出库数量
|
Double orderAnfme;
|
|
for (OrderDto orderDto : orderDtoList) {
|
OrderDetl orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch(),locDto.getCsocode(),locDto.getIsoseq());
|
if (orderDetl == null) {
|
orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), null,locDto.getCsocode(),locDto.getIsoseq());
|
}
|
|
orderAnfme = orderDetl.getAnfme() - orderDetl.getQty();
|
|
if(locAnfme > orderAnfme){
|
locAnfme -= orderAnfme;
|
}else {
|
orderAnfme = locAnfme;
|
}
|
|
if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), orderAnfme,orderDetl.getThreeCode(),orderDetl.getDeadTime())) {
|
throw new CoolException("修改订单明细数量失败");
|
}
|
orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
|
}
|
}
|
}
|
|
private void addInQty(String devno){
|
AgvBasDevp agvBasDevp = agvBasDevpService.selectById(devno);
|
if(!Cools.isEmpty(agvBasDevp)){
|
if(Cools.isEmpty(agvBasDevp.getInQty())){
|
agvBasDevp.setInQty(1);
|
}else {
|
agvBasDevp.setInQty(agvBasDevp.getInQty() + 1);
|
}
|
}
|
}
|
|
private int getContainerTypeByloc(String locNo){
|
|
return agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("loc_no",locNo)).getLocType2();
|
|
}
|
|
}
|