add:添加生产下线入库回传,增加任务类

This commit is contained in:
zhangzq
2026-06-17 18:52:27 +08:00
parent 32e61053f9
commit c41633bf78
8 changed files with 298 additions and 13 deletions

View File

@@ -1,5 +1,7 @@
package org.nl.wms.basedata_manage.service.dao;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -182,6 +184,7 @@ public class Structattr implements Serializable {
/**
* 存储载具号
*/
@TableField(value = "storagevehicle_code", updateStrategy = FieldStrategy.IGNORED)
private String storagevehicle_code;
/**

View File

@@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.IdUtil;
@@ -191,7 +192,9 @@ public class StructattrServiceImpl extends ServiceImpl<StructattrMapper, Structa
dto.setStor_id(bsrealStorattr.getStor_id());
dto.setStor_code(bsrealStorattr.getStor_code());
dto.setStor_name(bsrealStorattr.getStor_name());
if (StringUtils.isEmpty(dto.getStoragevehicle_code())){
dto.setStoragevehicle_code(null);
}
structattrMapper.updateById(dto);
}

View File

@@ -5,7 +5,7 @@ import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.wms.ext_manage.service.dto.StructLineOfflineDTO;
import org.nl.wms.sch_manage.service.core.tasks.StructOfflineService;
import org.nl.wms.ext_manage.service.impl.StructOfflineService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

View File

@@ -1,13 +1,18 @@
package org.nl.wms.sch_manage.service.core.tasks;
package org.nl.wms.ext_manage.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.sun.javafx.binding.StringFormatter;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.SpringContextHolder;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService;
import org.nl.wms.basedata_manage.service.ISectattrService;
import org.nl.wms.basedata_manage.service.IStructattrService;
@@ -20,6 +25,8 @@ import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.core.AbstractTask;
import org.nl.wms.sch_manage.service.core.AcsTaskDto;
import org.nl.wms.sch_manage.service.core.tasks.BWIPInTask;
import org.nl.wms.sch_manage.service.core.tasks.StInTask;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
@@ -52,6 +59,8 @@ public class StructOfflineService{
private IMdMeMaterialbaseService iMdMeMaterialbaseService;
@Autowired
private IStructattrService iStructattrService;
@Autowired
private BWIPInTask bwipInTask;
@Resource
private IOStorInvDisMapper ioStorInvDisMapper;
@@ -135,15 +144,31 @@ public class StructOfflineService{
final IOStorInvDis ioStorInvDis = ioStorInvDisMapper.selectOne(new LambdaQueryWrapper<IOStorInvDis>()
.eq(IOStorInvDis::getIostorinv_id, iostorinv_id)
.select(IOStorInvDis::getIostorinvdis_id));
Map<String, Object> divPointParam = new HashMap<>();
divPointParam.put("point_code", offlineDTO.getUnloadPort());
ArrayList<HashMap<String, String>> tableMater = new ArrayList<>();
HashMap<String, String> materRow = new HashMap<>();
materRow.put("iostorinv_id", iostorinv_id); // 入库单明细ID
materRow.put("iostorinvdis_id", ioStorInvDis.getIostorinvdis_id()); // 分配明细ID如果有
materRow.put("storagevehicle_code", storagevehicleCode); // 载具编码
tableMater.add(materRow);
divPointParam.put("tableMater", tableMater);
iInBillService.divPoint(divPointParam);
//判断是否已经分配好货位
List<IOStorInvDis> disSet = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getIostorinv_id,iostorinv_id)
.eq(IOStorInvDis::getStoragevehicle_code, storagevehicleCode)
.and(wrapper -> wrapper.isNotNull(IOStorInvDis::getStruct_code).or().ne(IOStorInvDis::getStruct_code, "")));
if (CollectionUtils.isEmpty(disSet)) {
throw new BadRequestException("该明细还没分配货位,请先分配货位");
}
//创建任务
JSONObject task_form = new JSONObject();
task_form.put("task_type", "BWIPInTask");
task_form.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task_form.put("PickingLocation", schBasePoint.getPoint_code());
task_form.put("PlacedLocation", disSet.get(0).getStruct_code());
task_form.put("vehicle_code", storagevehicleCode);
BWIPInTask bwipInTask = SpringContextHolder.getBean("BWIPInTask");
String task_id = bwipInTask.create(task_form);
//更新详情数据
ioStorInvDisMapper.update(null, new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("生成"))
.set(IOStorInvDis::getTask_id, task_id)
.set(IOStorInvDis::getIs_issued, BaseDataEnum.IS_YES_NOT.code(""))
.set(IOStorInvDis::getPoint_code, schBasePoint.getPoint_code())
.eq(IOStorInvDis::getIostorinv_id, iostorinv_id)
.eq(IOStorInvDis::getStoragevehicle_code, storagevehicleCode)
.ne(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("完成")));
}
}

View File

@@ -13,6 +13,7 @@ import org.nl.common.exception.BadRequestException;
public enum SourceBillTypeEnum {
PM_DEMADN("pm_demand","出库需求单"),
PM_PURCHASE("pm_purchase","采购入库单"),
PM_RECEIVING("p_receiving","生产入库"),
UNDEFINE("","未定义"),
;
/**

View File

@@ -0,0 +1,34 @@
package org.nl.wms.pm_manage.preceiving.listenerHandler;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.nl.wms.pm_manage.demand.service.IPmDemandService;
import org.nl.wms.pm_manage.demand.service.dao.PmDemand;
import org.nl.wms.pm_manage.demand.service.enums.DemandStatus;
import org.nl.wms.pm_manage.listener.core.BaseFormListenerHandler;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.stockReturn.service.IPmStockReturnService;
import org.nl.wms.warehouse_manage.stockReturn.service.dao.PmStockReturn;
import org.nl.wms.warehouse_manage.stockReturn.service.enums.StockReturnStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("p_receiving")
public class PReceivingListenerHandler extends BaseFormListenerHandler<PReceivingParams> {
@Autowired
IPmDemandService iPmDemandService;
@Autowired
IPmStockReturnService iPmStockReturnService;
@Override
public void onApplicationEvent(PReceivingParams params) {
final PmStockReturn stockReturn = new PmStockReturn();
stockReturn.setCreate_time(DateUtil.now());
stockReturn.setRequest_type(IOSEnum.BILL_TYPE.code("生产入库"));
stockReturn.setStatus(StockReturnStatusEnum.TODO.getCode());
stockReturn.setRequest_data(JSON.toJSONString(params));
iPmStockReturnService.save(stockReturn);
//需求单昨晚,执行调拨流程
}
}

View File

@@ -0,0 +1,19 @@
package org.nl.wms.pm_manage.preceiving.listenerHandler;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Map;
@Data
public class PReceivingParams {
private String billCode;
private String sectCode;
private Map<String,BigDecimal> materialQty;
public PReceivingParams(String billCode, Map materialQty,String sectCode) {
this.billCode = billCode;
this.materialQty = materialQty;
this.sectCode = sectCode;
}
}

View File

@@ -0,0 +1,200 @@
package org.nl.wms.sch_manage.service.core.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.pm_manage.SourceBillTypeEnum;
import org.nl.wms.pm_manage.listener.PmManageEvent;
import org.nl.wms.pm_manage.preceiving.listenerHandler.PReceivingParams;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.core.AbstractTask;
import org.nl.wms.sch_manage.service.core.AcsTaskDto;
import org.nl.wms.sch_manage.service.core.TaskType;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
;import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author: Liuxy
* @Description: 入库任务类
* @Date: 2025/5/25
*/
@Component(value = "BWIPInTask")
@TaskType("BWIPInTask")
public class BWIPInTask extends AbstractTask {
@Autowired
private ISchBaseTaskService taskService;
@Resource
private IInBillService rawAssistIStorService;
@Resource
private IOStorInvDisMapper ioStorInvDisMapper;
@Autowired
private ApplicationEventPublisher eventPublisher;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(json.getString("TaskCode"));
task.setTask_status(TaskStatus.CREATE.getCode());
task.setConfig_code(json.getString("task_type"));
task.setPoint_code1(json.getString("PickingLocation"));
task.setPoint_code2(json.getString("PlacedLocation"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setGroup_id(json.getString("group_id"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
taskService.save(task);
return task.getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
// 组织下发给acs的数据
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_uuid(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
if (taskDao.getPoint_code2().contains("-")) {
acsTaskDto.setNext_device_code(taskDao.getPoint_code2().replace('-', '_'));
}
acsTaskDto.setPriority(taskDao.getPriority());
acsTaskDto.setTask_type("1");
return acsTaskDto;
}
@Override
protected void updateStatus(String task_code, TaskStatus status) {
// 校验任务
SchBaseTask taskObj = taskService.getByCode(task_code);
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) {
throw new BadRequestException("该任务已完成!");
}
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
throw new BadRequestException("该任务已取消!");
}
// 根据传来的类型去对任务进行操作
if (status.equals(TaskStatus.EXECUTING)) {
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setRemark("执行中");
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj);
}
}
@Override
@Transactional
public void forceFinish(String taskCode) {
SchBaseTask task = taskService.getByCode(taskCode);
// 任务完成
task.setTask_status(TaskStatus.FINISHED.getCode());
task.setRemark("已完成");
taskService.updateById(task);
rawAssistIStorService.taskFinish(task);
//推送入库单
List<IOStorInvDis> ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getTask_id, task.getTask_id())
);
Map<String, BigDecimal> materialQtyMap = new HashMap<>();
for (IOStorInvDis dis : ioStorInvDis) {
String materialCode = dis.getMaterial_code();
BigDecimal planQty = dis.getPlan_qty();
if (materialCode != null && planQty != null) {
materialQtyMap.merge(materialCode, planQty, BigDecimal::add);
}
}
eventPublisher.publishEvent(new PmManageEvent(SourceBillTypeEnum.PM_RECEIVING.getBillType(),new PReceivingParams(
ioStorInvDis.get(0).getIostorinvdis_id(),materialQtyMap,ioStorInvDis.get(0).getSect_code())));
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
if (!TaskStatus.CREATE.getCode().equals(taskObj.getTask_status())) {
throw new BadRequestException("任务状态必须为生成才能取消任务");
}
this.cancelTask(taskObj);
}
@Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask task) {
// 任务完成
task.setTask_status(TaskStatus.FINISHED.getCode());
task.setRemark("已完成");
taskService.updateById(task);
rawAssistIStorService.taskFinish(task);
//推送入库单
List<IOStorInvDis> ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getTask_id, task.getTask_id())
);
Map<String, BigDecimal> materialQtyMap = new HashMap<>();
for (IOStorInvDis dis : ioStorInvDis) {
String materialCode = dis.getMaterial_code();
BigDecimal planQty = dis.getPlan_qty();
if (materialCode != null && planQty != null) {
materialQtyMap.merge(materialCode, planQty, BigDecimal::add);
}
}
eventPublisher.publishEvent(new PmManageEvent(SourceBillTypeEnum.PM_RECEIVING.getBillType(),new PReceivingParams(
ioStorInvDis.get(0).getIostorinvdis_id(),materialQtyMap,ioStorInvDis.get(0).getSect_code())));
}
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj) {
// 取消任务
taskService.update(new LambdaUpdateWrapper<SchBaseTask>()
.set(SchBaseTask::getIs_delete, BaseDataEnum.IS_YES_NOT.code(""))
.set(SchBaseTask::getTask_status, TaskStatus.CANCELED.getCode())
.set(SchBaseTask::getRemark,"已取消")
.eq(SchBaseTask::getTask_id,taskObj.getTask_id())
);
//分配表清除任务
ioStorInvDisMapper.update(new IOStorInvDis(),new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getTask_id,null)
.set(IOStorInvDis::getPoint_code,null)
.set(IOStorInvDis::getIs_issued,0)
.set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("未生成"))
.eq(IOStorInvDis::getTask_id,taskObj.getTask_id())
);
// 更新任务状态
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark("已取消");
taskService.updateById(taskObj);
}
}