add:MES产线功能
This commit is contained in:
@@ -3,6 +3,7 @@ package org.nl.wms.ext_manage.controller;
|
||||
import cn.dev33.satoken.annotation.SaIgnore;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.common.logging.annotation.Log;
|
||||
import org.nl.wms.ext_manage.dto.mes.MesBackMaterialRequestDto;
|
||||
import org.nl.wms.ext_manage.dto.mes.MesCallMaterialRequestDto;
|
||||
import org.nl.wms.ext_manage.service.MesToWmsService;
|
||||
import org.springframework.http.HttpStatus;
|
||||
@@ -36,7 +37,7 @@ public class MesToWmsController {
|
||||
@PostMapping("/backMaterial")
|
||||
@SaIgnore
|
||||
@Log("MES请求退料/空桶")
|
||||
public ResponseEntity<Object> backMaterial(@RequestBody @Validated MesCallMaterialRequestDto param) {
|
||||
public ResponseEntity<Object> backMaterial(@RequestBody @Validated MesBackMaterialRequestDto param) {
|
||||
return new ResponseEntity<>(mesToWmsService.backMaterial(param), HttpStatus.OK);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package org.nl.wms.ext_manage.dto.mes;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
|
||||
@Data
|
||||
public class MesBackMaterialRequestDto {
|
||||
@NotBlank(message = "设备号不可为空")
|
||||
private String device_code;
|
||||
|
||||
@NotBlank(message = "料桶号不可为空")
|
||||
private String vehicle_code;
|
||||
|
||||
@NotBlank(message = "物料编码不可为空")
|
||||
private String material_code;
|
||||
|
||||
@NotBlank(message = "批次")
|
||||
private String pcsn;
|
||||
|
||||
private String qty_unit_name;
|
||||
|
||||
@NotBlank(message = "数量不可为空")
|
||||
private String qty;
|
||||
|
||||
@NotBlank(message = "供应商编码不可为空")
|
||||
private String supp_code;
|
||||
|
||||
@NotBlank(message = "供应商名称不可为空")
|
||||
private String supp_name;
|
||||
|
||||
private String remark;
|
||||
|
||||
@NotBlank(message = "任务号不可为空")
|
||||
private String task_code;
|
||||
|
||||
@NotBlank(message = "任务类型不可为空")
|
||||
private String task_type;
|
||||
|
||||
/**
|
||||
* 是否是人工发起,如果是,则不需要反馈给MES
|
||||
*
|
||||
*/
|
||||
private Boolean isManual;
|
||||
|
||||
}
|
||||
@@ -4,22 +4,22 @@ import lombok.Data;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
@Data
|
||||
public class MesCallMaterialRequestDto {
|
||||
@NotBlank(message = "设备号不为空")
|
||||
@NotBlank(message = "设备号不可为空")
|
||||
private String device_code;
|
||||
|
||||
@NotBlank(message = "货位号不为空")
|
||||
@NotBlank(message = "货位号不可为空")
|
||||
private String struct_code;
|
||||
|
||||
@NotBlank(message = "物料编码不为空")
|
||||
@NotBlank(message = "物料编码不可为空")
|
||||
private String material_code;
|
||||
|
||||
@NotBlank(message = "料桶号不为空")
|
||||
@NotBlank(message = "料桶号不可为空")
|
||||
private String vehicle_code;
|
||||
|
||||
@NotBlank(message = "组盘标识不为空")
|
||||
@NotBlank(message = "组盘标识不可为空")
|
||||
private String storagevehicleext_id;
|
||||
|
||||
@NotBlank(message = "物料编码不为空")
|
||||
@NotBlank(message = "物料编码不可为空")
|
||||
private String pcsn;
|
||||
|
||||
private String qty_unit_name;
|
||||
@@ -28,12 +28,21 @@ public class MesCallMaterialRequestDto {
|
||||
|
||||
private String remark;
|
||||
|
||||
@NotBlank(message = "任务号不为空")
|
||||
@NotBlank(message = "任务号不可为空")
|
||||
private String task_code;
|
||||
@NotBlank(message = "任务类型不为空")
|
||||
|
||||
@NotBlank(message = "任务类型不可为空")
|
||||
private String task_type;
|
||||
|
||||
@NotBlank(message = "供应商编码不可为空")
|
||||
private String supp_code;
|
||||
|
||||
@NotBlank(message = "供应商名称不可为空")
|
||||
private String supp_name;
|
||||
|
||||
/**
|
||||
* 是否是人工发起,如果是,则不需要反馈给MES
|
||||
*
|
||||
*/
|
||||
private Boolean isManual;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public class MesResponse<T> {
|
||||
public static MesResponse requestOk() {
|
||||
return MesResponse.builder()
|
||||
.message("操作成功!")
|
||||
.status(0)
|
||||
.status(200)
|
||||
.build();
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ public class MesResponse<T> {
|
||||
return MesResponse.builder()
|
||||
.message("操作成功!")
|
||||
.data(data)
|
||||
.status(0)
|
||||
.status(200)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
@@ -21,4 +21,9 @@ public class EXTConstant {
|
||||
* ACS下发任务接口地址
|
||||
*/
|
||||
public final static String SEND_TASK_ACS_API = "api/wms/task";
|
||||
|
||||
/**
|
||||
* 回传MES接口地址
|
||||
*/
|
||||
public final static String UPLOAD_MES_API = "";
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.nl.wms.ext_manage.service;
|
||||
|
||||
import org.nl.wms.ext_manage.dto.mes.MesBackMaterialRequestDto;
|
||||
import org.nl.wms.ext_manage.dto.mes.MesCallMaterialRequestDto;
|
||||
import org.nl.wms.ext_manage.dto.mes.MesResponse;
|
||||
|
||||
@@ -24,5 +25,5 @@ public interface MesToWmsService {
|
||||
* @param
|
||||
* @return MesResponse
|
||||
*/
|
||||
MesResponse backMaterial(MesCallMaterialRequestDto dto);
|
||||
MesResponse backMaterial(MesBackMaterialRequestDto dto);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package org.nl.wms.ext_manage.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* WMS调用MES 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author zhengxuming
|
||||
* @since 2025年7月31日20:27:58
|
||||
*/
|
||||
public interface WmsToMesService {
|
||||
|
||||
|
||||
JSONObject uploadMes(JSONObject whereJson);
|
||||
|
||||
}
|
||||
@@ -1,36 +1,60 @@
|
||||
package org.nl.wms.ext_manage.service.impl;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.nl.common.exception.BadRequestException;
|
||||
import org.nl.common.utils.SecurityUtils;
|
||||
import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService;
|
||||
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
|
||||
import org.nl.wms.basedata_manage.service.ISectattrService;
|
||||
import org.nl.wms.basedata_manage.service.IStructattrService;
|
||||
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
|
||||
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
|
||||
import org.nl.wms.basedata_manage.service.dao.Sectattr;
|
||||
import org.nl.wms.basedata_manage.service.dao.Structattr;
|
||||
import org.nl.wms.ext_manage.dto.mes.MesBackMaterialRequestDto;
|
||||
import org.nl.wms.ext_manage.dto.mes.MesCallMaterialRequestDto;
|
||||
import org.nl.wms.ext_manage.dto.mes.MesResponse;
|
||||
import org.nl.wms.ext_manage.enums.ResultAcsStatus;
|
||||
import org.nl.wms.ext_manage.service.AcsToWmsService;
|
||||
import org.nl.wms.ext_manage.service.MesToWmsService;
|
||||
import org.nl.wms.ext_manage.service.util.AcsResponse;
|
||||
import org.nl.wms.pda_manage.ios_manage.service.PdaIosInService;
|
||||
import org.nl.wms.sch_manage.enums.StatusEnum;
|
||||
import org.nl.wms.sch_manage.enums.TaskStatus;
|
||||
import org.nl.wms.sch_manage.service.ISchBasePointService;
|
||||
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
||||
import org.nl.wms.sch_manage.service.util.AbstractTask;
|
||||
import org.nl.wms.sch_manage.service.util.TaskFactory;
|
||||
import org.nl.wms.system_manage.service.dict.ISysDictService;
|
||||
import org.nl.wms.system_manage.service.dict.dao.Dict;
|
||||
import org.nl.wms.warehouse_manage.enums.IOSConstant;
|
||||
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.IOutBillService;
|
||||
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDtl;
|
||||
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDtlMapper;
|
||||
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
|
||||
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
|
||||
import org.redisson.api.RLock;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
import javax.annotation.Resource;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static org.nl.common.utils.ValidationUtil.assertNotBlankJson;
|
||||
import static org.nl.wms.warehouse_manage.enums.IOSEnum.GROUP_PLATE_STATUS;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* MES调用WMS 实现类
|
||||
@@ -49,6 +73,23 @@ public class MesToWmsServiceImpl implements MesToWmsService {
|
||||
@Autowired
|
||||
private RedissonClient redissonClient;
|
||||
|
||||
@Autowired
|
||||
private IStructattrService structattrService;
|
||||
|
||||
@Autowired
|
||||
private ISectattrService sectattrService;
|
||||
|
||||
@Autowired
|
||||
private IMdMeMaterialbaseService materialbaseService;
|
||||
|
||||
@Autowired
|
||||
private IMdPbGroupplateService iMdPbGroupplateService;
|
||||
|
||||
@Resource
|
||||
private IOutBillService outBillService;
|
||||
|
||||
@Autowired
|
||||
private IOStorInvDtlMapper ioStorInvDtlMapper;
|
||||
/*
|
||||
* 任务服务
|
||||
*/
|
||||
@@ -57,6 +98,27 @@ public class MesToWmsServiceImpl implements MesToWmsService {
|
||||
@Autowired
|
||||
private ISchBasePointService pointService;
|
||||
|
||||
@Autowired
|
||||
private PdaIosInService pdaIosInService;
|
||||
|
||||
@Autowired
|
||||
private ISectattrService iSectattrService;
|
||||
|
||||
@Autowired
|
||||
private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService;
|
||||
|
||||
/**
|
||||
* 入库服务
|
||||
*/
|
||||
@Autowired
|
||||
private IInBillService iRawAssistIStorService;
|
||||
|
||||
/**
|
||||
* 字典服务
|
||||
*/
|
||||
@Autowired
|
||||
private ISysDictService dictService;
|
||||
|
||||
/**
|
||||
* 任务工厂服务
|
||||
*/
|
||||
@@ -65,18 +127,250 @@ public class MesToWmsServiceImpl implements MesToWmsService {
|
||||
|
||||
@Override
|
||||
@SneakyThrows
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public MesResponse callMaterial(MesCallMaterialRequestDto dto) {
|
||||
log.info("MES下发设备叫料信息输入参数:-------------------: {}", dto);
|
||||
RLock lock = redissonClient.getLock(dto.getTask_code());
|
||||
boolean tryLock = lock.tryLock(1, TimeUnit.SECONDS);
|
||||
try {
|
||||
if (tryLock) {
|
||||
log.info("MES下发设备叫料信息输入参数:--------------------------------------" + MesResponse.requestOk());
|
||||
//1、判断当前节点的左右子节点是否存在执行中的任务,如果有则报错
|
||||
//
|
||||
//2、
|
||||
String pointCode = dto.getDevice_code();
|
||||
SchBasePoint outPoint = pointService.getById(pointCode);
|
||||
if (null == outPoint) {
|
||||
throw new BadRequestException("设备【" + pointCode + "】不存在!");
|
||||
}
|
||||
|
||||
if(!"1".equals(outPoint.getPoint_type())){
|
||||
throw new BadRequestException("设备【" + dto.getStruct_code() + "】有误,请传入作业区设备!");
|
||||
}
|
||||
|
||||
// 出库的仓位
|
||||
Structattr outStructAttr = structattrService.getByCode(dto.getStruct_code());
|
||||
if (ObjectUtil.isEmpty(outStructAttr)) {
|
||||
throw new BadRequestException("仓位【" + dto.getStruct_code() + "】不存在!");
|
||||
}
|
||||
|
||||
//1、单独上料,2、下空桶上满料
|
||||
if("1".equals(dto.getTask_type())){
|
||||
log.info("单独上料叫料,请求参数:【{}】", JSONObject.toJSONString(dto));
|
||||
//判断点位和仓位是否有正在执行的任务
|
||||
List<SchBaseTask> schBaseTaskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>()
|
||||
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
|
||||
.and(wp -> wp
|
||||
.eq(SchBaseTask::getPoint_code2, pointCode)
|
||||
.or()
|
||||
.eq(SchBaseTask::getPoint_code1, dto.getStruct_code())
|
||||
)
|
||||
.le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode()));
|
||||
if(CollectionUtils.isNotEmpty(schBaseTaskList)){
|
||||
throw new BadRequestException("存在正在执行的点位,请核对!");
|
||||
}
|
||||
|
||||
MdMeMaterialbase materialbase = materialbaseService.getByCode(dto.getMaterial_code(),false);
|
||||
if (ObjectUtil.isEmpty(materialbase)) {
|
||||
throw new BadRequestException("物料【" + dto.getMaterial_code() + "】不存在!");
|
||||
}
|
||||
GroupPlate groupPlate = iMdPbGroupplateService.getOne(new LambdaQueryWrapper<GroupPlate>()
|
||||
.eq(GroupPlate::getStoragevehicle_code, outStructAttr.getStoragevehicle_code())
|
||||
.eq(GroupPlate::getStatus, "01"));
|
||||
if (ObjectUtil.isEmpty(groupPlate)) {
|
||||
throw new BadRequestException("托盘[" + outStructAttr.getStoragevehicle_code() + "]组盘信息不存在!");
|
||||
}
|
||||
// 1、创建出库单、明细、分配明细
|
||||
JSONObject insertInvObj = new JSONObject();
|
||||
JSONArray tableData = new JSONArray();
|
||||
JSONObject table = new JSONObject();
|
||||
tableData.add(table);
|
||||
insertInvObj.put("stor_id", outStructAttr.getStor_id());
|
||||
insertInvObj.put("stor_code", outStructAttr.getStor_code());
|
||||
insertInvObj.put("bill_status", "10");
|
||||
insertInvObj.put("total_qty", groupPlate.getQty());
|
||||
insertInvObj.put("detail_count", 1);
|
||||
insertInvObj.put("bill_type", StatusEnum.IOBILL_TYPE_OUT.code("单独上料出库"));
|
||||
insertInvObj.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd"));
|
||||
insertInvObj.put("tableData", tableData);
|
||||
table.put("turnout_struct_code", outStructAttr.getStruct_code());
|
||||
table.put("turnout_sect_code", outStructAttr.getSect_code());
|
||||
table.put("turnout_sect_name", outStructAttr.getSect_name());
|
||||
table.put("sect_id", outStructAttr.getSect_id());
|
||||
table.put("struct_id", outStructAttr.getStruct_id());
|
||||
table.put("group_id", groupPlate.getGroup_id());
|
||||
table.put("storagevehicle_code", outStructAttr.getStoragevehicle_code());
|
||||
table.put("storagevehicle_type", outStructAttr.getStoragevehicle_type());
|
||||
table.put("material_id", materialbase.getMaterial_id());
|
||||
table.put("pcsn", groupPlate.getPcsn());
|
||||
table.put("qty", groupPlate.getQty());
|
||||
table.put("qty_unit_id", groupPlate.getQty_unit_id());
|
||||
table.put("qty_unit_name", groupPlate.getQty_unit_name());
|
||||
table.put("fronzen_qty", 0);
|
||||
table.put("status", "01");
|
||||
table.put("material_code", materialbase.getMaterial_code());
|
||||
table.put("material_name", materialbase.getMaterial_name());
|
||||
table.put("material_spec", materialbase.getMaterial_spec());
|
||||
String invId = outBillService.insertDtl(insertInvObj);
|
||||
// 调用手工分配
|
||||
JSONObject param = new JSONObject();
|
||||
JSONObject row = new JSONObject();
|
||||
JSONArray rows = new JSONArray();
|
||||
rows.add(row);
|
||||
param.put("rows", rows);
|
||||
IOStorInvDtl dtl = ioStorInvDtlMapper.selectOne(new LambdaQueryWrapper<IOStorInvDtl>()
|
||||
.eq(IOStorInvDtl::getIostorinv_id, invId));
|
||||
param.put("row", dtl);
|
||||
row.put("storagevehicle_code", outStructAttr.getStoragevehicle_code());
|
||||
row.put("pcsn", groupPlate.getPcsn());
|
||||
row.put("qty", groupPlate.getQty());
|
||||
row.put("qty_unit_name", groupPlate.getQty_unit_name());
|
||||
row.put("frozen_qty", groupPlate.getFrozen_qty());
|
||||
row.put("struct_id", outStructAttr.getStruct_id());
|
||||
row.put("struct_code", outStructAttr.getStruct_code());
|
||||
row.put("struct_name", outStructAttr.getStruct_name());
|
||||
row.put("sect_id", outStructAttr.getSect_id());
|
||||
row.put("sect_code", outStructAttr.getSect_code());
|
||||
row.put("sect_name", outStructAttr.getSect_name());
|
||||
row.put("material_code", groupPlate.getMaterial_code());
|
||||
row.put("material_name", groupPlate.getMaterial_name());
|
||||
row.put("edit", true);
|
||||
outBillService.manualDiv(param);
|
||||
|
||||
// 创建任务
|
||||
JSONObject taskParam = new JSONObject();
|
||||
taskParam.put("iostorinv_id", invId);
|
||||
taskParam.put("point_code", dto.getStruct_code());
|
||||
taskParam.put("point_code2", pointCode );
|
||||
taskParam.put("group_id", groupPlate.getGroup_id() );
|
||||
taskParam.put("task_code", dto.getTask_code() );
|
||||
if(dto.getIsManual()){
|
||||
taskParam.put("create_mode", "手动" );
|
||||
} else{
|
||||
taskParam.put("create_mode", "自动" );
|
||||
}
|
||||
outBillService.allSetPoint(taskParam);
|
||||
return MesResponse.requestOk();
|
||||
} else if("2".equals(dto.getTask_type())){
|
||||
//下空桶上满料 4个点 需要拆成2个任务,组装成一组
|
||||
log.info("下空桶上满料叫料,请求参数:【{}】", JSONObject.toJSONString(dto));
|
||||
|
||||
//点位作业位生产完后,满料状态->空料状态
|
||||
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
|
||||
.set(SchBasePoint::getPoint_status, "2")
|
||||
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
|
||||
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
|
||||
.set(SchBasePoint::getUpdate_time, DateUtil.now())
|
||||
.eq(SchBasePoint::getPoint_code, outPoint.getPoint_code()));
|
||||
|
||||
SchBasePoint queryPoint = new SchBasePoint();
|
||||
queryPoint.setPoint_type("2");
|
||||
queryPoint.setParent_point_code(outPoint.getPoint_code());
|
||||
|
||||
//得到作业区下面的两个
|
||||
List<SchBasePoint> sonSchBasePointList = pointService.getSonPointList(queryPoint);
|
||||
if(!(sonSchBasePointList!=null&&sonSchBasePointList.size()==2)){
|
||||
throw new BadRequestException("作业位"+ outPoint.getPoint_code()+"的周转位不为2个,请核对!");
|
||||
}
|
||||
|
||||
//判断点位和仓位是否有正在执行的任务
|
||||
List<SchBaseTask> schBaseTaskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>()
|
||||
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
|
||||
.and(wp -> wp
|
||||
.eq(SchBaseTask::getPoint_code1, dto.getStruct_code())
|
||||
.or()
|
||||
.eq(SchBaseTask::getPoint_code2, dto.getDevice_code())
|
||||
.or()
|
||||
.eq(SchBaseTask::getPoint_code3, sonSchBasePointList.get(0).getPoint_code())
|
||||
.or()
|
||||
.eq(SchBaseTask::getPoint_code4, sonSchBasePointList.get(1).getPoint_code())
|
||||
)
|
||||
.le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode()));
|
||||
if (CollectionUtils.isNotEmpty(schBaseTaskList)) {
|
||||
throw new BadRequestException("存在正在执行的点位,请核对!");
|
||||
}
|
||||
|
||||
MdMeMaterialbase materialbase = materialbaseService.getByCode(dto.getMaterial_code(),false);
|
||||
if (ObjectUtil.isEmpty(materialbase)) {
|
||||
throw new BadRequestException("物料【" + dto.getMaterial_code() + "】不存在!");
|
||||
}
|
||||
GroupPlate groupPlate = iMdPbGroupplateService.getOne(new LambdaQueryWrapper<GroupPlate>()
|
||||
.eq(GroupPlate::getStoragevehicle_code, outStructAttr.getStoragevehicle_code())
|
||||
.eq(GroupPlate::getStatus, "01"));
|
||||
if (ObjectUtil.isEmpty(groupPlate)) {
|
||||
throw new BadRequestException("托盘[" + outStructAttr.getStoragevehicle_code() + "]组盘信息不存在!");
|
||||
}
|
||||
// 1、创建出库单、明细、分配明细
|
||||
JSONObject insertInvObj = new JSONObject();
|
||||
JSONArray tableData = new JSONArray();
|
||||
JSONObject table = new JSONObject();
|
||||
tableData.add(table);
|
||||
insertInvObj.put("stor_id", outStructAttr.getStor_id());
|
||||
insertInvObj.put("stor_code", outStructAttr.getStor_code());
|
||||
insertInvObj.put("bill_status", "10");
|
||||
insertInvObj.put("total_qty", groupPlate.getQty());
|
||||
insertInvObj.put("detail_count", 1);
|
||||
insertInvObj.put("bill_type", StatusEnum.IOBILL_TYPE_OUT.code("下空桶上满料出库"));
|
||||
insertInvObj.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd"));
|
||||
insertInvObj.put("tableData", tableData);
|
||||
table.put("turnout_struct_code", outStructAttr.getStruct_code());
|
||||
table.put("turnout_sect_code", outStructAttr.getSect_code());
|
||||
table.put("turnout_sect_name", outStructAttr.getSect_name());
|
||||
table.put("sect_id", outStructAttr.getSect_id());
|
||||
table.put("struct_id", outStructAttr.getStruct_id());
|
||||
table.put("group_id", groupPlate.getGroup_id());
|
||||
table.put("storagevehicle_code", outStructAttr.getStoragevehicle_code());
|
||||
table.put("storagevehicle_type", outStructAttr.getStoragevehicle_type());
|
||||
table.put("material_id", materialbase.getMaterial_id());
|
||||
table.put("pcsn", groupPlate.getPcsn());
|
||||
table.put("qty", groupPlate.getQty());
|
||||
table.put("qty_unit_id", groupPlate.getQty_unit_id());
|
||||
table.put("qty_unit_name", groupPlate.getQty_unit_name());
|
||||
table.put("fronzen_qty", 0);
|
||||
table.put("status", "01");
|
||||
table.put("material_code", materialbase.getMaterial_code());
|
||||
table.put("material_name", materialbase.getMaterial_name());
|
||||
table.put("material_spec", materialbase.getMaterial_spec());
|
||||
String invId = outBillService.insertDtl(insertInvObj);
|
||||
// 调用手工分配
|
||||
JSONObject param = new JSONObject();
|
||||
JSONObject row = new JSONObject();
|
||||
JSONArray rows = new JSONArray();
|
||||
rows.add(row);
|
||||
param.put("rows", rows);
|
||||
IOStorInvDtl dtl = ioStorInvDtlMapper.selectOne(new LambdaQueryWrapper<IOStorInvDtl>()
|
||||
.eq(IOStorInvDtl::getIostorinv_id, invId));
|
||||
param.put("row", dtl);
|
||||
row.put("storagevehicle_code", outStructAttr.getStoragevehicle_code());
|
||||
row.put("pcsn", groupPlate.getPcsn());
|
||||
row.put("qty", groupPlate.getQty());
|
||||
row.put("qty_unit_name", groupPlate.getQty_unit_name());
|
||||
row.put("frozen_qty", groupPlate.getFrozen_qty());
|
||||
row.put("struct_id", outStructAttr.getStruct_id());
|
||||
row.put("struct_code", outStructAttr.getStruct_code());
|
||||
row.put("struct_name", outStructAttr.getStruct_name());
|
||||
row.put("sect_id", outStructAttr.getSect_id());
|
||||
row.put("sect_code", outStructAttr.getSect_code());
|
||||
row.put("sect_name", outStructAttr.getSect_name());
|
||||
row.put("material_code", groupPlate.getMaterial_code());
|
||||
row.put("material_name", groupPlate.getMaterial_name());
|
||||
row.put("edit", true);
|
||||
outBillService.manualDiv(param);
|
||||
|
||||
// 创建任务
|
||||
|
||||
JSONObject taskParam = new JSONObject();
|
||||
taskParam.put("iostorinv_id", invId);
|
||||
taskParam.put("point_code", dto.getStruct_code());
|
||||
taskParam.put("point_code2", sonSchBasePointList.get(0).getPoint_code() );
|
||||
taskParam.put("point_code3", dto.getDevice_code() );
|
||||
taskParam.put("point_code4", sonSchBasePointList.get(1).getPoint_code() );
|
||||
taskParam.put("group_id", groupPlate.getGroup_id() );
|
||||
taskParam.put("task_code", dto.getTask_code() );
|
||||
if(dto.getIsManual()){
|
||||
taskParam.put("create_mode", "手动" );
|
||||
} else{
|
||||
taskParam.put("create_mode", "自动" );
|
||||
}
|
||||
outBillService.allSetPoint(taskParam);
|
||||
return MesResponse.requestOk();
|
||||
}
|
||||
return MesResponse.requestOk();
|
||||
} else {
|
||||
throw new BadRequestException("任务标识为:" + dto.getTask_code() + "的任务正在操作中!");
|
||||
@@ -90,13 +384,34 @@ public class MesToWmsServiceImpl implements MesToWmsService {
|
||||
|
||||
@Override
|
||||
@SneakyThrows
|
||||
public MesResponse backMaterial(MesCallMaterialRequestDto dto) {
|
||||
log.info("MES下发设备叫料信息输入参数:-------------------: {}", dto);
|
||||
public MesResponse backMaterial(MesBackMaterialRequestDto dto) {
|
||||
log.info("MES下发设备退料信息输入参数:-------------------: {}", dto);
|
||||
RLock lock = redissonClient.getLock(dto.getTask_code());
|
||||
boolean tryLock = lock.tryLock(1, TimeUnit.SECONDS);
|
||||
try {
|
||||
if (tryLock) {
|
||||
log.info("MES下发设备叫料信息输入参数:--------------------------------------" + MesResponse.requestOk());
|
||||
log.info("MES下发设备退料信息输入参数:--------------------------------------" + MesResponse.requestOk());
|
||||
|
||||
//根据料桶号去载具表匹配料桶类型
|
||||
MdPbStoragevehicleinfo mdPbStoragevehicleinfo = iMdPbStoragevehicleinfoService.getByCode(dto.getVehicle_code());
|
||||
|
||||
if(mdPbStoragevehicleinfo == null){
|
||||
throw new BadRequestException("未找到载具编码为:" + dto.getVehicle_code() + "的载具!");
|
||||
}
|
||||
|
||||
//通过料桶号的料桶类型,匹配确认入库库区
|
||||
Dict dict= dictService.getDictByCodeAndValue("storagevehicle_type",mdPbStoragevehicleinfo.getStoragevehicle_type());
|
||||
if(dict==null){
|
||||
throw new BadRequestException("未找到载具编码为" + dto.getVehicle_code() + "的载具入库库区,请检查字典中是否维护!");
|
||||
}
|
||||
|
||||
Sectattr sectattr = sectattrService.findByCode(dict.getPara1());
|
||||
//通过
|
||||
JSONObject param = new JSONObject();
|
||||
param.put("vehicle_code",dto.getVehicle_code());
|
||||
param.put("site_code",dto.getDevice_code());
|
||||
param.put("sect_id",sectattr.getSect_id());
|
||||
pdaIosInService.confirmIn(param);
|
||||
return MesResponse.requestOk();
|
||||
} else {
|
||||
throw new BadRequestException("任务标识为:" + dto.getTask_code() + "的任务正在操作中!");
|
||||
@@ -107,4 +422,60 @@ public class MesToWmsServiceImpl implements MesToWmsService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 组织入库插入数据
|
||||
* @param whereJson {
|
||||
* storagevehicle_code:载具编码
|
||||
* point_code:点位编码
|
||||
* sect_code:库区
|
||||
* }
|
||||
* @return Map<String, Object>
|
||||
*/
|
||||
private Map<String, Object> organizeInsertData(JSONObject whereJson) {
|
||||
// 查询组盘明细
|
||||
List<GroupPlate> plateDaoList = iMdPbGroupplateService.list(
|
||||
new QueryWrapper<GroupPlate>().lambda()
|
||||
.eq(GroupPlate::getStoragevehicle_code, whereJson.getString("vehicle_code"))
|
||||
.eq(GroupPlate::getStatus, GROUP_PLATE_STATUS.code("组盘"))
|
||||
);
|
||||
if (ObjectUtil.isEmpty(plateDaoList)) {
|
||||
throw new BadRequestException("当前没有可入库的物料!");
|
||||
}
|
||||
// 总数量
|
||||
Double total_qty = plateDaoList.stream()
|
||||
.map(row -> row.getQty().doubleValue())
|
||||
.reduce(Double::sum).orElse(0.0);
|
||||
|
||||
// 查询库区
|
||||
Sectattr sectDao = iSectattrService.getById(whereJson.getString("sect_id"));
|
||||
// 组织主表数据
|
||||
Map<String, Object> jsonMst = new HashMap<>();
|
||||
jsonMst.put("stor_id", sectDao.getStor_id());
|
||||
jsonMst.put("bill_status", IOSEnum.BILL_STATUS.code("生成"));
|
||||
jsonMst.put("total_qty", total_qty);
|
||||
jsonMst.put("detail_count", 1);
|
||||
if(!jsonMst.containsKey("bill_type")) {
|
||||
jsonMst.put("bill_type", StatusEnum.IOBILL_TYPE_IN.code("来料入库"));
|
||||
}
|
||||
jsonMst.put("biz_date", DateUtil.now());
|
||||
// 组织明细数据
|
||||
ArrayList<HashMap> tableData = new ArrayList<>();
|
||||
HashMap<String, String> dtl = new HashMap<>();
|
||||
GroupPlate plateDao = plateDaoList.get(0);
|
||||
MdMeMaterialbase materDao = materialbaseService.getByCode(plateDao.getMaterial_id(), true);
|
||||
dtl.put("storagevehicle_code", plateDao.getStoragevehicle_code());
|
||||
dtl.put("material_id", materDao.getMaterial_id());
|
||||
dtl.put("material_code", materDao.getMaterial_code());
|
||||
dtl.put("material_name", materDao.getMaterial_name());
|
||||
dtl.put("pcsn", plateDao.getPcsn());
|
||||
dtl.put("qty_unit_id", plateDao.getQty_unit_id());
|
||||
dtl.put("qty_unit_name", plateDao.getQty_unit_name());
|
||||
dtl.put("qty", String.valueOf(total_qty));
|
||||
dtl.put("plan_qty", String.valueOf(total_qty));
|
||||
// 调用新增
|
||||
tableData.add(dtl);
|
||||
jsonMst.put("tableData",tableData);
|
||||
return jsonMst;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
package org.nl.wms.ext_manage.service.impl;
|
||||
|
||||
import cn.hutool.http.HttpRequest;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.common.exception.BadRequestException;
|
||||
import org.nl.config.SpringContextHolder;
|
||||
import org.nl.wms.ext_manage.enums.EXTConstant;
|
||||
import org.nl.wms.ext_manage.service.WmsToMesService;
|
||||
import org.nl.wms.ext_manage.service.util.AcsResponse;
|
||||
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
|
||||
import org.nl.wms.system_manage.enums.SysParamConstant;
|
||||
import org.nl.wms.system_manage.service.param.impl.SysParamServiceImpl;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* WMS调用Mes 实现类
|
||||
* </p>
|
||||
*
|
||||
* @author zhengxuming
|
||||
* @since 2025年7月31日20:28:16
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class WmsToMesServiceImpl implements WmsToMesService {
|
||||
|
||||
@Override
|
||||
public JSONObject uploadMes(JSONObject whereJson) {
|
||||
log.info("uploadMes回传接口输入参数为:-------------------" + whereJson.toString());
|
||||
JSONObject result = new JSONObject();
|
||||
|
||||
String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode(SysParamConstant.ERP_URL).getValue();
|
||||
url = url + EXTConstant.UPLOAD_MES_API;
|
||||
|
||||
try {
|
||||
String resultMsg = HttpRequest.post(url)
|
||||
.body(String.valueOf(whereJson))
|
||||
.execute().body();
|
||||
result = JSONObject.parseObject(resultMsg);
|
||||
log.info("uploadMes回传接口输出参数为:-------------------" + result.toString());
|
||||
|
||||
|
||||
Integer status = result.getInteger("status");
|
||||
if (status != HttpStatus.OK.value()) {
|
||||
throw new BadRequestException(result.getString("message"));
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new BadRequestException("MES提示错误:" + e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -47,6 +47,18 @@ public class PdaIosInController {
|
||||
return new ResponseEntity<>(pdaIosInService.groupPlate(whereJson),HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* 原料入库组盘查询
|
||||
* @param whereJson
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/getPlate")
|
||||
@Log("查询组盘明细")
|
||||
public ResponseEntity<Object> getPlate(@RequestBody JSONObject whereJson) {
|
||||
return new ResponseEntity<>(pdaIosInService.getPlate(whereJson), HttpStatus.OK);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/getPlateDtl")
|
||||
@Log("查询明细")
|
||||
public ResponseEntity<Object> getPlateDtl(@RequestBody JSONObject whereJson) {
|
||||
@@ -115,7 +127,7 @@ public class PdaIosInController {
|
||||
throw new IllegalArgumentException("请传入参数!");
|
||||
}
|
||||
for(ZwConfirmInParamDto paramDto : dto.getParamList()){
|
||||
if(StringUtils.isBlank(paramDto.getVehicle_code())||StringUtils.isBlank(paramDto.getSite_code()))
|
||||
if(StringUtils.isBlank(paramDto.getVehicle_code()) || StringUtils.isBlank(paramDto.getSite_code()))
|
||||
throw new IllegalArgumentException("载具且卸货区点位不能为空!");
|
||||
}
|
||||
|
||||
|
||||
@@ -40,6 +40,15 @@ public interface PdaIosInService {
|
||||
*/
|
||||
PdaResponse getPlateDtl(JSONObject whereJson);
|
||||
|
||||
/**
|
||||
* 原料入库组盘查询明细
|
||||
* @param whereJson {
|
||||
* storagevehicle_code : 载具编码
|
||||
* }
|
||||
* @return PdaResponse
|
||||
*/
|
||||
PdaResponse getPlate(JSONObject whereJson);
|
||||
|
||||
/**
|
||||
* 删除明细
|
||||
* @param whereJson {
|
||||
|
||||
@@ -34,10 +34,13 @@ import org.nl.wms.pda_manage.ios_manage.service.PdaIosOutService;
|
||||
import org.nl.wms.pda_manage.util.PdaResponse;
|
||||
import org.nl.wms.sch_manage.enums.StatusEnum;
|
||||
import org.nl.wms.sch_manage.enums.TaskEnum;
|
||||
import org.nl.wms.sch_manage.enums.TaskStatus;
|
||||
import org.nl.wms.sch_manage.service.ISchBasePointService;
|
||||
import org.nl.wms.sch_manage.service.ISchBaseRegionService;
|
||||
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBaseRegion;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
||||
import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper;
|
||||
import org.nl.wms.sch_manage.service.util.AbstractTask;
|
||||
import org.nl.wms.sch_manage.service.util.tasks.BackInTask;
|
||||
@@ -173,6 +176,9 @@ public class PdaIosInServiceImpl implements PdaIosInService {
|
||||
@Autowired
|
||||
private SysDictMapper sysDictMapper;
|
||||
|
||||
@Autowired
|
||||
private ISchBaseTaskService iSchBaseTaskService;
|
||||
|
||||
|
||||
/**
|
||||
* 区域服务
|
||||
@@ -237,6 +243,17 @@ public class PdaIosInServiceImpl implements PdaIosInService {
|
||||
return PdaResponse.requestParamOk(mdPbGroupplateMapper.getDtl(whereJson));
|
||||
}
|
||||
|
||||
@Override
|
||||
public PdaResponse getPlate(JSONObject whereJson) {
|
||||
//如果未组盘,则报错
|
||||
List<JSONObject> jsonObjectList = mdPbGroupplateMapper.getDtl(whereJson);
|
||||
if(CollectionUtils.isEmpty(jsonObjectList)){
|
||||
throw new BadRequestException("未找到该载具的组盘信息,请核对!");
|
||||
}
|
||||
|
||||
return PdaResponse.requestParamOk(jsonObjectList);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public PdaResponse deleteDtl(JSONObject whereJson) {
|
||||
@@ -458,10 +475,26 @@ public class PdaIosInServiceImpl implements PdaIosInService {
|
||||
|
||||
//循环判断每个 如果有问题,则抛出异常
|
||||
String lastSchBasePoint = null;
|
||||
Integer priority = 0 ;
|
||||
Integer taskGroupSeq = 0 ;
|
||||
String taskGroupId = IdUtil.getStringId();
|
||||
List<JSONObject> jsonObjectList = new ArrayList<>();
|
||||
for (ZwConfirmInParamDto paramDto : dto.getParamList()) {
|
||||
priority++;
|
||||
|
||||
//判断点位和仓位是否有正在执行的任务
|
||||
List<SchBaseTask> schBaseTaskList = iSchBaseTaskService.list(new LambdaQueryWrapper<SchBaseTask>()
|
||||
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
|
||||
.and(wp -> wp
|
||||
.eq(SchBaseTask::getPoint_code2, paramDto.getSite_code())
|
||||
.or()
|
||||
.eq(SchBaseTask::getPoint_code3, paramDto.getSite_code())
|
||||
)
|
||||
.le(SchBaseTask::getTask_status, TaskStatus.EXECUTING.getCode()));
|
||||
|
||||
if(CollectionUtils.isNotEmpty(schBaseTaskList)){
|
||||
throw new BadRequestException("存在正在执行任务的点位"+paramDto.getSite_code());
|
||||
}
|
||||
|
||||
taskGroupSeq++;
|
||||
//当前点位
|
||||
String schBasePointString = lastSchBasePoint;
|
||||
JSONObject whereJson = new JSONObject();
|
||||
@@ -529,7 +562,10 @@ public class PdaIosInServiceImpl implements PdaIosInService {
|
||||
whereJson.put("sch_base_point", schBasePointString);
|
||||
whereJson.put("bill_type",StatusEnum.IOBILL_TYPE_IN.code("来料入库"));
|
||||
|
||||
whereJson.put("priority",priority);
|
||||
whereJson.put("priority","1");
|
||||
|
||||
whereJson.put("task_group_seq",taskGroupSeq);
|
||||
whereJson.put("task_group_id",taskGroupId);
|
||||
|
||||
jsonObjectList.add(whereJson);
|
||||
//下一个的托盘放置点为本次的起点
|
||||
@@ -882,6 +918,8 @@ public class PdaIosInServiceImpl implements PdaIosInService {
|
||||
jsonMst.put("point_code2", whereJson.getString("sch_base_point"));
|
||||
jsonMst.put("point_code3", whereJson.getString("point_code"));
|
||||
jsonMst.put("priority", whereJson.getString("priority"));
|
||||
jsonMst.put("task_group_seq", whereJson.getString("task_group_seq"));
|
||||
jsonMst.put("task_group_id", whereJson.getString("task_group_id"));
|
||||
jsonMst.put("vehicle_code", whereJson.getString("vehicle_code"));
|
||||
// 组织明细数据
|
||||
IOStorInvDtl dtlDao = ioStorInvDtlMapper.selectOne(
|
||||
|
||||
@@ -32,7 +32,7 @@ public enum StatusEnum {
|
||||
IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20", "outStorageTask", "生产出库", "21", "outStorageTask", "调拨出库", "22", "outStorageTask",
|
||||
"拣选出库", "23", "conveyorOutStorageTask", "盘点出库", "24", "outStorageTask", "出库拣选", "25", "toPickPlatformTask",
|
||||
"退货出库", "26", "outStorageTask", "托盘出库", "40", "outStorageTask", "二楼CTU出库", "81", "inStorageTask", "二楼出库AGV搬运",
|
||||
"82", "inStorageTask", "二楼空架AGV搬运", "83", "inStorageTask")),
|
||||
"82", "inStorageTask", "二楼空架AGV搬运", "83", "inStorageTask", "单独上料出库", "1013", "inStorageTask", "下空桶上满料出库", "1014", "inStorageTask")),
|
||||
|
||||
|
||||
IOBILL_TYPE_MOVE(ForkMap.of("移库", "50", "moveStorageTask", "异常位移库", "51", "moveStorageTask")),
|
||||
|
||||
@@ -69,6 +69,15 @@ public interface ISchBasePointService extends IService<SchBasePoint> {
|
||||
*/
|
||||
List<SchBasePoint> getPointList(SchBasePoint region);
|
||||
|
||||
/**
|
||||
* 获取子点位
|
||||
*
|
||||
* @param parentPoint 父节点
|
||||
* @return List<SchBasePoint>
|
||||
*/
|
||||
List<SchBasePoint> getSonPointList(SchBasePoint parentPoint);
|
||||
|
||||
|
||||
/**
|
||||
* 解锁/上锁
|
||||
*
|
||||
|
||||
@@ -31,10 +31,7 @@ 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.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@@ -194,6 +191,16 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
|
||||
.eq(SchBasePoint::getIs_has_workder, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SchBasePoint> getSonPointList(SchBasePoint parentPoint) {
|
||||
return pointMapper.selectList(new LambdaQueryWrapper<SchBasePoint>()
|
||||
.like(SchBasePoint::getParent_point_code, parentPoint.getParent_point_code())
|
||||
//点位类型,根据传入的值是否为空增加判断
|
||||
.eq(StringUtils.isNotBlank(parentPoint.getPoint_type()), SchBasePoint::getPoint_type, parentPoint.getPoint_type())
|
||||
.eq(SchBasePoint::getIs_has_workder, true)
|
||||
.orderByAsc(SchBasePoint::getPoint_code));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void changeLock(JSONObject points) {
|
||||
|
||||
@@ -0,0 +1,311 @@
|
||||
package org.nl.wms.sch_manage.service.util.tasks.zw;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
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.basedata_manage.service.IStructattrService;
|
||||
import org.nl.wms.basedata_manage.service.dao.Structattr;
|
||||
import org.nl.wms.ext_manage.service.WmsToMesService;
|
||||
import org.nl.wms.sch_manage.enums.TaskStatus;
|
||||
import org.nl.wms.sch_manage.service.ISchBasePointService;
|
||||
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
||||
import org.nl.wms.sch_manage.service.util.AbstractTask;
|
||||
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
|
||||
import org.nl.wms.sch_manage.service.util.TaskType;
|
||||
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.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
|
||||
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* @Author: zhengxuming
|
||||
* @Description: 下空桶上满料
|
||||
* @Date: 2025年7月31日16:07:59
|
||||
*/
|
||||
@Component(value = "DownEmptyUpFullTask")
|
||||
@TaskType("DownEmptyUpFullTask")
|
||||
public class DownEmptyUpFullTask extends AbstractTask {
|
||||
|
||||
/**
|
||||
* 任务服务类
|
||||
*/
|
||||
@Resource
|
||||
private ISchBaseTaskService taskService;
|
||||
|
||||
|
||||
@Resource
|
||||
private IInBillService rawAssistIStorService;
|
||||
|
||||
|
||||
@Resource
|
||||
private IOStorInvDisMapper ioStorInvDisMapper;
|
||||
|
||||
@Resource
|
||||
private IMdPbGroupplateService iMdPbGroupplateService;
|
||||
|
||||
@Resource
|
||||
private ISchBasePointService pointService;
|
||||
|
||||
@Resource
|
||||
private WmsToMesService wmsToMesService;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 仓位服务
|
||||
*/
|
||||
@Resource
|
||||
private IStructattrService iStructattrService;
|
||||
|
||||
|
||||
@Override
|
||||
public String create(JSONObject json) {
|
||||
SchBaseTask task = new SchBaseTask();
|
||||
task.setTask_id(IdUtil.getStringId());
|
||||
task.setTask_code(json.getString("task_code"));
|
||||
task.setTask_status(TaskStatus.CREATE.getCode());
|
||||
task.setConfig_code(json.getString("task_type"));
|
||||
task.setPoint_code1(json.getString("point_code1"));
|
||||
task.setPoint_code2(json.getString("point_code2"));
|
||||
task.setPoint_code3(json.getString("point_code3"));
|
||||
task.setPoint_code4(json.getString("point_code4"));
|
||||
task.setVehicle_code(json.getString("vehicle_code"));
|
||||
task.setVehicle_code2(json.getString("vehicle_code2"));
|
||||
task.setTask_group_id(json.getString("task_group_id"));
|
||||
task.setTask_group_seq(json.getBigDecimal("task_group_seq"));
|
||||
task.setGroup_id(json.getString("group_id"));
|
||||
task.setRequest_param(json.toString());
|
||||
task.setPriority("1");
|
||||
task.setCreate_id(SecurityUtils.getCurrentUserId());
|
||||
task.setCreate_name(SecurityUtils.getCurrentNickName());
|
||||
task.setCreate_time(DateUtil.now());
|
||||
task.setCreate_mode(json.getString("create_mode"));
|
||||
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());
|
||||
acsTaskDto.setStart_device_code2(taskDao.getPoint_code3());
|
||||
acsTaskDto.setNext_device_code2(taskDao.getPoint_code4());
|
||||
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
|
||||
public void forceFinish(String task_code) {
|
||||
SchBaseTask taskObj = taskService.getByCode(task_code);
|
||||
if (ObjectUtil.isEmpty(taskObj)) {
|
||||
throw new BadRequestException("该任务不存在");
|
||||
}
|
||||
this.finishTask(taskObj);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void backMes(String task_code) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void finishTask(SchBaseTask taskObj) {
|
||||
// 任务完成
|
||||
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
|
||||
taskObj.setRemark("已完成");
|
||||
taskService.updateById(taskObj);
|
||||
|
||||
//如果是序列1
|
||||
if(taskObj.getTask_group_seq().compareTo(new BigDecimal(1))==0){
|
||||
//点位2
|
||||
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
|
||||
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code())
|
||||
.set(SchBasePoint::getPoint_status, "3")
|
||||
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
|
||||
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
|
||||
.set(SchBasePoint::getUpdate_time, DateUtil.now())
|
||||
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()));
|
||||
//点位3
|
||||
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
|
||||
.set(SchBasePoint::getVehicle_code, null)
|
||||
.set(SchBasePoint::getPoint_status, "1")
|
||||
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
|
||||
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
|
||||
.set(SchBasePoint::getUpdate_time, DateUtil.now())
|
||||
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code3()));
|
||||
//点位4
|
||||
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
|
||||
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code2())
|
||||
.set(SchBasePoint::getPoint_status, "2")
|
||||
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
|
||||
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
|
||||
.set(SchBasePoint::getUpdate_time, DateUtil.now())
|
||||
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code4()));
|
||||
|
||||
}
|
||||
//如果是序列2
|
||||
else{
|
||||
//点位2
|
||||
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
|
||||
.set(SchBasePoint::getVehicle_code, null)
|
||||
.set(SchBasePoint::getPoint_status, "1")
|
||||
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
|
||||
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
|
||||
.set(SchBasePoint::getUpdate_time, DateUtil.now())
|
||||
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()));
|
||||
//点位3
|
||||
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
|
||||
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code())
|
||||
.set(SchBasePoint::getPoint_status, "3")
|
||||
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
|
||||
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
|
||||
.set(SchBasePoint::getUpdate_time, DateUtil.now())
|
||||
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()));
|
||||
//点位4
|
||||
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
|
||||
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code2())
|
||||
.set(SchBasePoint::getPoint_status, "1")
|
||||
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
|
||||
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
|
||||
.set(SchBasePoint::getUpdate_time, DateUtil.now())
|
||||
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code3()));
|
||||
|
||||
//点位1
|
||||
iStructattrService.update(new LambdaUpdateWrapper<Structattr>()
|
||||
.set(Structattr::getStoragevehicle_code, taskObj.getVehicle_code2())
|
||||
.set(Structattr::getOccupancy_state, "2")
|
||||
.set(Structattr::getUpdate_id, SecurityUtils.getCurrentUserId())
|
||||
.set(Structattr::getUpdate_name, SecurityUtils.getCurrentNickName())
|
||||
.set(Structattr::getUpdate_time, DateUtil.now())
|
||||
.eq(Structattr::getStruct_code, taskObj.getPoint_code4()));
|
||||
|
||||
rawAssistIStorService.taskFinish(taskObj);
|
||||
|
||||
//反馈到MES系统
|
||||
if("自动".equals(taskObj.getCreate_mode())){
|
||||
JSONObject jsonObject=new JSONObject();
|
||||
jsonObject.put("status","200");
|
||||
jsonObject.put("message","成功");
|
||||
wmsToMesService.uploadMes(jsonObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@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())
|
||||
);
|
||||
|
||||
|
||||
List<IOStorInvDis> ioStorInvDisList = ioStorInvDisMapper.selectList(new LambdaUpdateWrapper<>(IOStorInvDis.class)
|
||||
.eq(IOStorInvDis::getTask_id, taskObj.getTask_id()));
|
||||
|
||||
for(IOStorInvDis ioStorInvDis:ioStorInvDisList){
|
||||
//库存表解锁 lock_type inv_type inv_id inv_code
|
||||
//解锁库位
|
||||
JSONObject finish_map = new JSONObject();
|
||||
finish_map.put("struct_code", ioStorInvDis.getStruct_code());
|
||||
finish_map.put("inv_type", null);
|
||||
finish_map.put("inv_id", null);
|
||||
finish_map.put("inv_code", null);
|
||||
|
||||
//解绑库位
|
||||
iStructattrService.updateStatusByCode("2", finish_map);
|
||||
|
||||
|
||||
//更新组盘表 status 20->10
|
||||
iMdPbGroupplateService.update(new LambdaUpdateWrapper<>(GroupPlate.class)
|
||||
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘"))
|
||||
.eq(GroupPlate::getStoragevehicle_code,ioStorInvDis.getStoragevehicle_code()));
|
||||
}
|
||||
|
||||
//分配表清除任务
|
||||
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);
|
||||
|
||||
//反馈到MES系统
|
||||
if("自动".equals(taskObj.getCreate_mode())){
|
||||
JSONObject jsonObject=new JSONObject();
|
||||
jsonObject.put("status","400");
|
||||
jsonObject.put("message","任务被取消");
|
||||
wmsToMesService.uploadMes(jsonObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -85,6 +85,8 @@ public class InBillTask extends AbstractTask {
|
||||
task.setVehicle_code(json.getString("vehicle_code"));
|
||||
task.setVehicle_code2(json.getString("vehicle_code2"));
|
||||
task.setGroup_id(json.getString("group_id"));
|
||||
task.setTask_group_id(json.getString("task_group_id"));
|
||||
task.setTask_group_seq(json.getBigDecimal("task_group_seq"));
|
||||
task.setRequest_param(json.toString());
|
||||
task.setPriority(json.getString("priority"));
|
||||
task.setCreate_id(SecurityUtils.getCurrentUserId());
|
||||
|
||||
@@ -0,0 +1,246 @@
|
||||
package org.nl.wms.sch_manage.service.util.tasks.zw;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
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.basedata_manage.service.IStructattrService;
|
||||
import org.nl.wms.ext_manage.service.WmsToMesService;
|
||||
import org.nl.wms.sch_manage.enums.TaskStatus;
|
||||
import org.nl.wms.sch_manage.service.ISchBasePointService;
|
||||
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
|
||||
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
||||
import org.nl.wms.sch_manage.service.util.AbstractTask;
|
||||
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
|
||||
import org.nl.wms.sch_manage.service.util.TaskType;
|
||||
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.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
|
||||
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
;
|
||||
|
||||
/**
|
||||
* @Author: zhengxuming
|
||||
* @Description: 单独上料出库
|
||||
* @Date: 2025年7月30日17:55:11
|
||||
*/
|
||||
@Component(value = "SeparateMaterial")
|
||||
@TaskType("SeparateMaterial")
|
||||
public class SeparateMaterialTask extends AbstractTask {
|
||||
|
||||
/**
|
||||
* 任务服务类
|
||||
*/
|
||||
@Resource
|
||||
private ISchBaseTaskService taskService;
|
||||
|
||||
|
||||
@Resource
|
||||
private IInBillService rawAssistIStorService;
|
||||
|
||||
|
||||
@Resource
|
||||
private IOStorInvDisMapper ioStorInvDisMapper;
|
||||
|
||||
@Resource
|
||||
private IMdPbGroupplateService iMdPbGroupplateService;
|
||||
|
||||
@Resource
|
||||
private ISchBasePointService pointService;
|
||||
|
||||
@Resource
|
||||
private WmsToMesService wmsToMesService;
|
||||
|
||||
|
||||
/**
|
||||
* 仓位服务
|
||||
*/
|
||||
@Resource
|
||||
private IStructattrService iStructattrService;
|
||||
|
||||
|
||||
@Override
|
||||
public String create(JSONObject json) {
|
||||
SchBaseTask task = new SchBaseTask();
|
||||
task.setTask_id(IdUtil.getStringId());
|
||||
task.setTask_code(json.getString("task_code"));
|
||||
task.setTask_status(TaskStatus.CREATE.getCode());
|
||||
task.setConfig_code(json.getString("task_type"));
|
||||
task.setPoint_code1(json.getString("point_code1"));
|
||||
task.setPoint_code2(json.getString("point_code2"));
|
||||
task.setVehicle_code(json.getString("vehicle_code"));
|
||||
task.setGroup_id(json.getString("group_id"));
|
||||
task.setCreate_mode(json.getString("create_mode"));
|
||||
task.setRequest_param(json.toString());
|
||||
task.setPriority("1");
|
||||
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());
|
||||
acsTaskDto.setStart_device_code2(taskDao.getPoint_code3());
|
||||
acsTaskDto.setNext_device_code2(taskDao.getPoint_code4());
|
||||
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
|
||||
public void forceFinish(String task_code) {
|
||||
SchBaseTask taskObj = taskService.getByCode(task_code);
|
||||
if (ObjectUtil.isEmpty(taskObj)) {
|
||||
throw new BadRequestException("该任务不存在");
|
||||
}
|
||||
this.finishTask(taskObj);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void backMes(String task_code) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void finishTask(SchBaseTask taskObj) {
|
||||
// 任务完成
|
||||
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
|
||||
taskObj.setRemark("已完成");
|
||||
taskService.updateById(taskObj);
|
||||
|
||||
//更改点位的托盘信息,空托盘的点位 2为空托盘放置点位
|
||||
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
|
||||
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code())
|
||||
.set(SchBasePoint::getPoint_status, "2")
|
||||
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
|
||||
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())
|
||||
.set(SchBasePoint::getUpdate_time, DateUtil.now())
|
||||
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()));
|
||||
|
||||
rawAssistIStorService.taskFinish(taskObj);
|
||||
|
||||
//反馈到MES系统
|
||||
if("自动".equals(taskObj.getCreate_mode())){
|
||||
JSONObject jsonObject=new JSONObject();
|
||||
jsonObject.put("status","200");
|
||||
jsonObject.put("message","成功");
|
||||
wmsToMesService.uploadMes(jsonObject);
|
||||
}
|
||||
}
|
||||
|
||||
@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())
|
||||
);
|
||||
|
||||
|
||||
List<IOStorInvDis> ioStorInvDisList = ioStorInvDisMapper.selectList(new LambdaUpdateWrapper<>(IOStorInvDis.class)
|
||||
.eq(IOStorInvDis::getTask_id, taskObj.getTask_id()));
|
||||
|
||||
for(IOStorInvDis ioStorInvDis:ioStorInvDisList){
|
||||
//库存表解锁 lock_type inv_type inv_id inv_code
|
||||
//解锁库位
|
||||
JSONObject finish_map = new JSONObject();
|
||||
finish_map.put("struct_code", ioStorInvDis.getStruct_code());
|
||||
finish_map.put("inv_type", null);
|
||||
finish_map.put("inv_id", null);
|
||||
finish_map.put("inv_code", null);
|
||||
|
||||
//解绑库位
|
||||
iStructattrService.updateStatusByCode("2", finish_map);
|
||||
|
||||
|
||||
//更新组盘表 status 20->10
|
||||
iMdPbGroupplateService.update(new LambdaUpdateWrapper<>(GroupPlate.class)
|
||||
.set(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("组盘"))
|
||||
.eq(GroupPlate::getStoragevehicle_code,ioStorInvDis.getStoragevehicle_code()));
|
||||
}
|
||||
|
||||
//分配表清除任务
|
||||
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);
|
||||
|
||||
//反馈到MES系统
|
||||
if("自动".equals(taskObj.getCreate_mode())){
|
||||
JSONObject jsonObject=new JSONObject();
|
||||
jsonObject.put("status","400");
|
||||
jsonObject.put("message","任务被取消");
|
||||
wmsToMesService.uploadMes(jsonObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,4 +22,9 @@ public class SysParamConstant {
|
||||
*/
|
||||
public final static String ERP_URL = "erp_url";
|
||||
|
||||
/**
|
||||
* MES系统IP
|
||||
*/
|
||||
public final static String MES_URL = "mes_url";
|
||||
|
||||
}
|
||||
|
||||
@@ -5,9 +5,16 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.common.base.TableDataInfo;
|
||||
import org.nl.common.domain.query.PageQuery;
|
||||
import org.nl.common.logging.annotation.Log;
|
||||
import org.nl.wms.ext_manage.dto.mes.MesBackMaterialRequestDto;
|
||||
import org.nl.wms.ext_manage.dto.mes.MesCallMaterialRequestDto;
|
||||
import org.nl.wms.ext_manage.service.MesToWmsService;
|
||||
import org.nl.wms.warehouse_manage.inAndOut.service.IOutBillService;
|
||||
import org.nl.wms.warehouse_manage.inAndOut.service.dto.MesManualBackMaterialRequestDto;
|
||||
import org.nl.wms.warehouse_manage.inAndOut.service.dto.MesManualCallMaterialRequestDto;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@@ -25,6 +32,9 @@ public class OutBillController {
|
||||
@Resource
|
||||
private IOutBillService iOutBillService;
|
||||
|
||||
@Resource
|
||||
private MesToWmsService mesToWmsService;
|
||||
|
||||
@GetMapping
|
||||
@Log("查询出库单")
|
||||
public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page, String[] stor_id, String[] bill_status, String[] bill_type) {
|
||||
@@ -138,4 +148,25 @@ public class OutBillController {
|
||||
return new ResponseEntity<>(iOutBillService.getOutBillTask(whereJson), HttpStatus.OK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@PostMapping("/callMaterial")
|
||||
@Log("人工叫料")
|
||||
public ResponseEntity<Object> callMaterial(@RequestBody @Validated MesManualCallMaterialRequestDto manualDto) {
|
||||
MesCallMaterialRequestDto dto = new MesCallMaterialRequestDto();
|
||||
BeanUtils.copyProperties(manualDto, dto);
|
||||
dto.setIsManual(true);
|
||||
return new ResponseEntity<>(mesToWmsService.callMaterial(dto), HttpStatus.OK);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/backMaterial")
|
||||
@Log("人工退料")
|
||||
public ResponseEntity<Object> backMaterial(@RequestBody @Validated MesManualBackMaterialRequestDto manualDto) {
|
||||
MesBackMaterialRequestDto dto = new MesBackMaterialRequestDto();
|
||||
BeanUtils.copyProperties(manualDto, dto);
|
||||
dto.setIsManual(true);
|
||||
return new ResponseEntity<>(mesToWmsService.backMaterial(dto), HttpStatus.OK);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package org.nl.wms.warehouse_manage.inAndOut.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
|
||||
@Data
|
||||
public class MesManualBackMaterialRequestDto {
|
||||
@NotBlank(message = "设备号不可为空")
|
||||
private String device_code;
|
||||
|
||||
@NotBlank(message = "料桶号不可为空")
|
||||
private String vehicle_code;
|
||||
|
||||
|
||||
private String material_code;
|
||||
|
||||
|
||||
private String pcsn;
|
||||
|
||||
private String qty_unit_name;
|
||||
|
||||
|
||||
private String qty;
|
||||
|
||||
|
||||
private String supp_code;
|
||||
|
||||
|
||||
private String supp_name;
|
||||
|
||||
private String remark;
|
||||
|
||||
@NotBlank(message = "任务号不可为空")
|
||||
private String task_code;
|
||||
|
||||
@NotBlank(message = "任务类型不可为空")
|
||||
private String task_type;
|
||||
|
||||
/**
|
||||
* 是否是人工发起,如果是,则不需要反馈给MES
|
||||
*
|
||||
*/
|
||||
private Boolean isManual;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package org.nl.wms.warehouse_manage.inAndOut.service.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
|
||||
@Data
|
||||
public class MesManualCallMaterialRequestDto {
|
||||
@NotBlank(message = "设备号不可为空")
|
||||
private String device_code;
|
||||
|
||||
@NotBlank(message = "货位号不可为空")
|
||||
private String struct_code;
|
||||
|
||||
@NotBlank(message = "物料编码不可为空")
|
||||
private String material_code;
|
||||
|
||||
private String vehicle_code;
|
||||
|
||||
private String storagevehicleext_id;
|
||||
|
||||
private String pcsn;
|
||||
|
||||
private String qty_unit_name;
|
||||
|
||||
private String qty;
|
||||
|
||||
private String remark;
|
||||
|
||||
@NotBlank(message = "任务号不可为空")
|
||||
private String task_code;
|
||||
|
||||
@NotBlank(message = "任务类型不可为空")
|
||||
private String task_type;
|
||||
|
||||
private String supp_code;
|
||||
|
||||
private String supp_name;
|
||||
|
||||
/**
|
||||
* 是否是人工发起,如果是,则不需要反馈给MES
|
||||
*
|
||||
*/
|
||||
private Boolean isManual;
|
||||
}
|
||||
@@ -779,6 +779,8 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
|
||||
task.put("config_code", IOSConstant.IN_BILL_TASK);
|
||||
task.put("group_id", groupPlate.getGroup_id());
|
||||
task.put("priority",whereJson.get("priority"));
|
||||
task.put("task_group_seq",whereJson.get("task_group_seq"));
|
||||
task.put("task_group_id",whereJson.get("task_group_id"));
|
||||
task.put("task_code", CodeUtil.getNewCode("TASK_CODE"));
|
||||
task.put("point_code1",ioStorInvDis.getStruct_code());
|
||||
task.put("point_code2", whereJson.get("point_code2"));
|
||||
|
||||
@@ -27,6 +27,7 @@ import org.nl.wms.basedata_manage.service.dto.MdPbStoragevehicleextDto;
|
||||
import org.nl.wms.basedata_manage.service.dto.StrategyStructMaterialVO;
|
||||
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
|
||||
import org.nl.wms.basedata_manage.service.dto.StructattrChangeDto;
|
||||
import org.nl.wms.sch_manage.enums.StatusEnum;
|
||||
import org.nl.wms.sch_manage.enums.TaskStatus;
|
||||
import org.nl.wms.sch_manage.service.ISchBasePointService;
|
||||
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
|
||||
@@ -35,6 +36,8 @@ import org.nl.wms.sch_manage.service.dao.SchBaseTask;
|
||||
import org.nl.wms.sch_manage.service.dao.mapper.SchBasePointMapper;
|
||||
import org.nl.wms.sch_manage.service.util.tasks.StOutTask;
|
||||
import org.nl.wms.sch_manage.service.util.tasks.jb.JbUpAgvTask;
|
||||
import org.nl.wms.sch_manage.service.util.tasks.zw.DownEmptyUpFullTask;
|
||||
import org.nl.wms.sch_manage.service.util.tasks.zw.SeparateMaterialTask;
|
||||
import org.nl.wms.warehouse_manage.enums.IOSConstant;
|
||||
import org.nl.wms.warehouse_manage.enums.IOSEnum;
|
||||
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
|
||||
@@ -102,6 +105,12 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
|
||||
@Autowired
|
||||
private JbUpAgvTask jbUpAgvTask;
|
||||
|
||||
@Autowired
|
||||
private SeparateMaterialTask separateMaterialTask;
|
||||
|
||||
@Autowired
|
||||
private DownEmptyUpFullTask downEmptyUpFullTask;
|
||||
|
||||
|
||||
@Override
|
||||
public IPage<IOStorInv> pageQuery(Map whereJson, PageQuery page, String[] stor_id, String[] bill_status, String[] bill_type) {
|
||||
@@ -990,6 +999,82 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
|
||||
outPoint.setIng_task_code(task_id);
|
||||
}
|
||||
pointService.updateBatchById(Arrays.asList(inPoint, outPoint));
|
||||
} else if (StatusEnum.IOBILL_TYPE_OUT.code("单独上料出库").equals(ioStorInv.getBill_type())) {
|
||||
// 单独上料出库
|
||||
SchBasePoint rkPoint = pointService.getById(whereJson.getString("point_code2"));
|
||||
if (ObjectUtil.isEmpty(rkPoint)) {
|
||||
throw new BadRequestException("点位不存在");
|
||||
}
|
||||
JSONObject task_form = new JSONObject();
|
||||
task_form.put("task_type", "SeparateMaterial");
|
||||
task_form.put("order_id", whereJson.getString("order_id"));
|
||||
task_form.put("task_code", whereJson.getString("task_code"));
|
||||
task_form.put("point_code1", ioStorInvDis.getStruct_code());
|
||||
task_form.put("point_code2", rkPoint.getPoint_code());
|
||||
task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code());
|
||||
task_form.put("group_id", whereJson.getString("group_id"));
|
||||
task_form.put("create_mode", whereJson.getString("create_mode"));
|
||||
task_id = separateMaterialTask.create(task_form);
|
||||
rkPoint.setIng_task_code(task_id);
|
||||
rkPoint.setPoint_status("3");
|
||||
pointService.updateById(rkPoint);
|
||||
} else if (StatusEnum.IOBILL_TYPE_OUT.code("下空桶上满料出库").equals(ioStorInv.getBill_type())) {
|
||||
//需要建设2个任务,2个任务组成一个组,增加序号
|
||||
//第三个点位,获取载具号用
|
||||
String taskGroupId = IdUtil.getStringId();
|
||||
|
||||
SchBasePoint point2 = pointService.getById(whereJson.getString("point_code2"));
|
||||
SchBasePoint point3 = pointService.getById(whereJson.getString("point_code3"));
|
||||
SchBasePoint point4 = pointService.getById(whereJson.getString("point_code4"));
|
||||
|
||||
if (ObjectUtil.isEmpty(point3)) {
|
||||
throw new BadRequestException("点位不存在");
|
||||
}
|
||||
JSONObject task_form = new JSONObject();
|
||||
task_form.put("task_type", "DownEmptyUpFullTask");
|
||||
task_form.put("order_id", whereJson.getString("order_id"));
|
||||
task_form.put("task_code", whereJson.getString("task_code"));
|
||||
task_form.put("point_code1", whereJson.getString("point_code1"));
|
||||
task_form.put("point_code2", whereJson.getString("point_code2"));
|
||||
task_form.put("point_code3", whereJson.getString("point_code3"));
|
||||
task_form.put("point_code4", whereJson.getString("point_code4"));
|
||||
task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code());
|
||||
//查看第三个点位的托盘信息
|
||||
task_form.put("vehicle_code2",point3.getVehicle_code());
|
||||
task_form.put("group_id", whereJson.getString("group_id"));
|
||||
task_form.put("task_group_id", taskGroupId);
|
||||
task_form.put("task_group_seq", "1");
|
||||
task_form.put("create_mode", whereJson.getString("create_mode"));
|
||||
task_id = downEmptyUpFullTask.create(task_form);
|
||||
|
||||
JSONObject task_form2 = new JSONObject();
|
||||
task_form2.put("task_type", "DownEmptyUpFullTask");
|
||||
task_form2.put("order_id", whereJson.getString("order_id"));
|
||||
task_form2.put("task_code", whereJson.getString("task_code"));
|
||||
task_form2.put("point_code1", whereJson.getString("point_code2"));
|
||||
task_form2.put("point_code2", whereJson.getString("point_code3"));
|
||||
task_form2.put("point_code3", whereJson.getString("point_code4"));
|
||||
task_form2.put("point_code4", whereJson.getString("point_code1"));
|
||||
task_form.put("vehicle_code", ioStorInvDis.getStoragevehicle_code());
|
||||
task_form.put("vehicle_code2",point3.getVehicle_code());
|
||||
task_form2.put("group_id", whereJson.getString("group_id"));
|
||||
task_form2.put("task_group_id", taskGroupId);
|
||||
task_form2.put("task_group_seq", "2");
|
||||
task_form.put("create_mode", whereJson.getString("create_mode"));
|
||||
downEmptyUpFullTask.create(task_form2);
|
||||
|
||||
point2.setIng_task_code(task_id);
|
||||
point2.setPoint_status("3");
|
||||
pointService.updateById(point2);
|
||||
|
||||
point3.setIng_task_code(task_id);
|
||||
point3.setPoint_status("1");
|
||||
pointService.updateById(point3);
|
||||
|
||||
point4.setIng_task_code(task_id);
|
||||
point4.setPoint_status("2");
|
||||
pointService.updateById(point4);
|
||||
|
||||
} else {
|
||||
//创建任务
|
||||
JSONObject task_form = new JSONObject();
|
||||
|
||||
Reference in New Issue
Block a user