package com.zy.asrs.task.handler;
|
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.core.common.Cools;
|
import com.core.common.DateUtils;
|
import com.core.common.SnowflakeIdWorker;
|
import com.core.exception.CoolException;
|
import com.zy.asrs.entity.*;
|
import com.zy.asrs.service.*;
|
import com.zy.asrs.task.AbstractHandler;
|
import com.zy.asrs.task.core.ReturnT;
|
import com.zy.asrs.utils.Utils;
|
import com.zy.common.model.enums.WorkNoType;
|
import com.zy.common.service.CommonService;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
@Service
|
public class AutoReplenishmentHandler extends AbstractHandler<String> {
|
|
@Autowired
|
private OrderDetlService orderDetlService;
|
@Autowired
|
private LocDetlService locDetlService;
|
@Autowired
|
private LocMastService locMastService;
|
|
@Autowired
|
private AgvLocMastService agvLocMastService;
|
@Autowired
|
private CommonService commonService;
|
@Autowired
|
private WrkMastService wrkMastService;
|
@Autowired
|
private WrkDetlService wrkDetlService;
|
@Autowired
|
private OrderService orderService;
|
@Autowired
|
private SnowflakeIdWorker snowflakeIdWorker;
|
|
|
@Transactional
|
public ReturnT<String> create(Mat mat, double anfme) {
|
//创建一个新的自动补货单据
|
Order order = createOrder();
|
orderService.insert(order);
|
OrderDetl orderDetl = createOrderDetl(order);
|
orderDetl.setMatnr(mat.getMatnr());
|
orderDetl.setMaktx(mat.getMaktx());
|
orderDetl.setSpecs(mat.getSpecs());
|
orderDetl.setAnfme(anfme);
|
orderDetl.setQty(0.0);
|
|
|
orderDetlService.insert(orderDetl);
|
|
return SUCCESS;
|
}
|
|
@Transactional
|
public ReturnT<String> start(Order order) {
|
Date now = new Date();
|
|
Set<String> locNos = pakoutLoc(order);
|
for (String locNo : locNos) {
|
LocMast locMast = locMastService.selectByLoc(locNo);
|
if (!"F".equals(locMast.getLocSts())) {
|
throw new CoolException("库位状态已变更");
|
}
|
//生成工作档
|
WrkMast wrkMast = createWrkMast(locNo, locMast.getBarcode(), now);
|
//生成工作档明细
|
List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo);
|
createWrkDetl(locDetls, wrkMast, order.getOrderNo(), now);
|
//修改库位状态
|
locMast.setLocSts("R");
|
locMastService.updateByLocNo(locMast);
|
}
|
order.setSettle(2L);
|
orderService.updateById(order);
|
|
return SUCCESS;
|
}
|
|
private Order createOrder() {
|
Date now = new Date();
|
return new Order(
|
String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空]
|
"AUTO" + snowflakeIdWorker.nextId(), // 订单编号
|
DateUtils.convert(now), // 单据日期
|
21L, // 单据类型 21.自动补货单
|
null, // 项目编号
|
null, //
|
null, // 调拨项目编号
|
null, // 初始票据号
|
null, // 票据号
|
null, // 客户编号
|
null, // 客户
|
null, // 联系方式
|
null, // 操作人员
|
null, // 合计金额
|
null, // 优惠率
|
null, // 优惠金额
|
null, // 销售或采购费用合计
|
null, // 实付金额
|
null, // 付款类型
|
null, // 业务员
|
null, // 结算天数
|
null, // 邮费支付类型
|
null, // 邮费
|
null, // 付款时间
|
null, // 发货时间
|
null, // 物流名称
|
null, // 物流单号
|
1L, // 订单状态
|
1, // 状态
|
9999L, // 添加人员
|
now, // 添加时间
|
9999L, // 修改人员
|
now, // 修改时间
|
null // 备注
|
);
|
|
}
|
|
private OrderDetl createOrderDetl(Order order) {
|
Date now = new Date();
|
OrderDetl orderDetl = new OrderDetl();
|
|
orderDetl.setOrderId(order.getId());
|
orderDetl.setOrderNo(order.getOrderNo());
|
orderDetl.setCreateBy(order.getCreateBy());
|
orderDetl.setCreateTime(now);
|
orderDetl.setUpdateBy(order.getCreateBy());
|
orderDetl.setUpdateTime(now);
|
orderDetl.setStatus(1);
|
orderDetl.setQty(0.0D);
|
|
return orderDetl;
|
}
|
|
private Set<String> pakoutLoc(Order order) {
|
//需要出库的库位
|
Set<String> locNos = new HashSet<>();
|
//根据订单生成四项库出库工作档
|
List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo()));
|
|
for (OrderDetl orderDetl : orderDetlList) {
|
if (orderDetl.getAnfme() - orderDetl.getQty() <= 0) {
|
continue;
|
}
|
|
String matnr = orderDetl.getMatnr();
|
|
double orderAnfme = orderDetl.getAnfme();
|
|
//List<String> locNosSearch = locDetlService.selectLocNo(matnr);
|
Set<String> locNosSearch = locDetlService.selectLocNos(matnr);
|
|
//过滤库位货物为高货物
|
locNosSearch = locNosSearch.stream().filter(locNo -> {
|
LocMast locMast = locMastService.selectByLoc(locNo);
|
if (locMast.getLocType1() == 3) {
|
return false;
|
} else {
|
//且检测该库位是否含没有货架码的物料,如有有则不允许出库
|
// LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locNo)
|
// .andNew().eq("supp_code", "").or().isNull("supp_code"));
|
|
if (Cools.isEmpty(locDetlService.selectByLocWithoutContainer(locNo))) {
|
return true;
|
} else {
|
return false;
|
}
|
}
|
}).collect(Collectors.toSet());
|
|
//重新排序
|
Set<String> resort = resort(locNosSearch);
|
|
for (String locNo : resort) {
|
List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo);
|
locNos.add(locNo);
|
for (LocDetl locDetl : locDetls) {
|
if (matnr.equals(locDetl.getMatnr())) {
|
orderAnfme -= locDetl.getAnfme();
|
} else {
|
OrderDetl odNew = createOrderDetl(order);
|
odNew.setMatnr(locDetl.getMatnr());
|
odNew.setMaktx(locDetl.getMaktx());
|
odNew.setBatch(locDetl.getBatch());
|
odNew.setThreeCode(locDetl.getThreeCode());
|
odNew.setDeadTime(locDetl.getDeadTime());
|
odNew.setSpecs(locDetl.getSpecs());
|
odNew.setAnfme(0.0);
|
odNew.setQty(locDetl.getAnfme());
|
orderDetlService.insert(odNew);
|
}
|
}
|
if (orderAnfme <= 0) {
|
orderDetl.setQty(orderDetl.getAnfme() - orderAnfme);
|
orderDetlService.updateById(orderDetl);
|
break;
|
}
|
}
|
if (orderAnfme > 0) {
|
orderDetl.setAnfme(orderDetl.getAnfme() - orderAnfme);
|
orderDetl.setQty(orderDetl.getAnfme());
|
orderDetlService.updateById(orderDetl);
|
}
|
}
|
|
return locNos;
|
}
|
|
//根据深浅库位进行重新排序
|
private Set<String> resort(Set<String> locNos) {
|
Set<String> locNosResort = new LinkedHashSet<>();
|
|
for (String locNoSearch : locNos) {
|
LocMast locMast = locMastService.selectById(locNoSearch);
|
if (!"F".equals(locMast.getLocSts())) {
|
continue;
|
}
|
|
List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNoSearch);
|
|
if (Cools.isEmpty(groupOuterLoc)) {
|
locNosResort.add(locNoSearch);
|
} else {
|
groupOuterLoc.add(locNoSearch);
|
//如果是深库位,则先找外侧的库位
|
for (String locNoOut : groupOuterLoc) {
|
LocMast locMastOuter = locMastService.selectById(locNoOut);
|
//外侧如果是拣料,则内测不允许出
|
if ("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())) {
|
break;
|
}
|
|
if (!"F".equals(locMastOuter.getLocSts())) {
|
continue;
|
}
|
locNosResort.add(locNoOut);
|
|
}
|
}
|
}
|
return locNosResort;
|
}
|
|
private WrkMast createWrkMast(String locNo, String barCode, Date now) {
|
int ioType = 101;
|
int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
|
WrkMast wrkMast = new WrkMast();
|
wrkMast.setWrkNo(workNo);
|
wrkMast.setIoTime(now);
|
wrkMast.setWrkSts(21L); // 工作状态:21.生成出库任务
|
wrkMast.setIoType(ioType); // 入出库状态
|
wrkMast.setIoPri(300D); // 优先级:13
|
//wrkMast.setOutMost(outMost?1:0);;
|
//wrkMast.setCrnNo(outMost?outCrnNo:locMast.getCrnNo());
|
//wrkMast.setSourceStaNo(loc); // 源站
|
wrkMast.setStaNo(300); // 目标站
|
wrkMast.setSourceLocNo(locNo); // 源库位
|
wrkMast.setFullPlt("Y"); // 满板:Y
|
wrkMast.setPicking("N"); // 拣料
|
wrkMast.setExitMk("N"); // 退出
|
wrkMast.setEmptyMk("N"); // 空板
|
wrkMast.setLinkMis("N");
|
wrkMast.setBarcode(barCode);
|
//wrkMast.setAppeUser(userId); // 操作人员数据
|
wrkMast.setAppeTime(now);
|
//wrkMast.setModiUser(userId);
|
wrkMast.setModiTime(now);
|
Integer pltType = null;
|
if (!Cools.isEmpty(locNo) && Cools.isEmpty(pltType)) {
|
AgvLocMast agvLocMast = agvLocMastService.selectById(locNo);
|
if (agvLocMast != null) {
|
pltType = agvLocMast.getPltType();
|
}
|
}
|
wrkMast.setPltType(pltType);
|
//补货标识
|
wrkMast.setMk("Y");
|
if (!wrkMastService.insert(wrkMast)) {
|
throw new CoolException("保存工作档失败,出库库位号:" + locNo);
|
}
|
return wrkMast;
|
}
|
|
private void createWrkDetl(List<LocDetl> locDetls, WrkMast wrkMast, String orderNo, Date now) {
|
locDetls.forEach(locDetl -> {
|
WrkDetl wrkDetl = new WrkDetl();
|
BeanUtils.copyProperties(locDetl, wrkDetl);
|
wrkDetl.setZpallet(wrkMast.getBarcode());
|
wrkDetl.setIoTime(now);
|
wrkDetl.setWrkNo(wrkMast.getWrkNo());
|
//wrkDetl.setBatch(locDetl.getBatch());
|
wrkDetl.setOrderNo(orderNo);
|
//wrkDetl.setAnfme(locDetl.getAnfme()); // 数量
|
wrkDetl.setAppeTime(now);
|
//wrkDetl.setAppeUser(userId);
|
wrkDetl.setModiTime(now);
|
//wrkDetl.setSuppCode(locDetl.getSuppCode());
|
//wrkDetl.setModiUser(userId);
|
if (!wrkDetlService.insert(wrkDetl)) {
|
throw new CoolException("保存工作档明细失败");
|
}
|
});
|
}
|
|
}
|