add:刻字机叫料功能
This commit is contained in:
@@ -30,6 +30,7 @@ public enum AcsTaskEnum {
|
||||
TASK_CACHELINE_OUT("4","缓存线-专机缺料任务"),
|
||||
TASK_PLOTTER_MAC("5","刻字机-满料入库"),
|
||||
TASK_PLOTTER_EMPTY("6","刻字机-呼叫空框"),
|
||||
TASK_PLOTTER_CALL_MATERIAL("14","刻字机-叫料请求"),
|
||||
TASK_WARP_MAC("7","包装机-叫料出库"),
|
||||
TASK_WARP_EMPTY("8","包装机-送空框"),
|
||||
TASK_STRUCT_IN("9","入库-生产入库"),
|
||||
@@ -49,10 +50,11 @@ public enum AcsTaskEnum {
|
||||
REQUEST_CALLTYPE_EMP("1","专机缺料请求"),
|
||||
REQUEST_PLOTTER_SEND_FULL("3","刻字满料请求"),
|
||||
REQUEST_PLOTTER_CALL_EMP("4","刻字缺空框请求"),
|
||||
REQUEST_PLOTTER_CALL_MATERIAL("9","刻字叫料请求"),
|
||||
REQUEST_WARP_CALL_FULL("5","包装缺料请求"),
|
||||
REQUEST_WARP_SEND_EMP("6","包装送空框请求"),
|
||||
REQUEST_WASH_EMP("7","清洗机器缺料请求"),
|
||||
REQUEST_WASH_FULL("8","清洗机器满料请求"),
|
||||
REQUEST_WASH_EMP("7","清洗机器上料请求"),
|
||||
REQUEST_WASH_FULL("8","清洗机器下料请求"),
|
||||
|
||||
|
||||
//
|
||||
|
||||
@@ -10,6 +10,7 @@ import org.nl.wms.product_manage.sch.tasks.SpeMachinery.SpeFullTask;
|
||||
import org.nl.wms.product_manage.sch.tasks.WashMachineryTask;
|
||||
import org.nl.wms.product_manage.sch.tasks.callMaterial.WrapCallMaterialTask;
|
||||
import org.nl.wms.product_manage.sch.tasks.sendEmpty.WrapSendEmptyTask;
|
||||
import org.nl.wms.product_manage.sch.tasks.sendMaterial.PlotterCallMaterialTask;
|
||||
import org.nl.wms.product_manage.sch.tasks.sendMaterial.PlotterSendMaterialTask;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.SmartLifecycle;
|
||||
@@ -26,6 +27,7 @@ public class ConventConfig implements SmartLifecycle {
|
||||
AcsToWmsServiceImpl.Task_Collent.put(AcsTaskEnum.REQUEST_CALLTYPE_EMP, SpringContextHolder.getBean(SpeEmpTask.class));
|
||||
AcsToWmsServiceImpl.Task_Collent.put(AcsTaskEnum.REQUEST_WASH_EMP, SpringContextHolder.getBean(WashMachineryTask.class));
|
||||
AcsToWmsServiceImpl.Task_Collent.put(AcsTaskEnum.REQUEST_PLOTTER_SEND_FULL, SpringContextHolder.getBean(PlotterSendMaterialTask.class));
|
||||
AcsToWmsServiceImpl.Task_Collent.put(AcsTaskEnum.REQUEST_PLOTTER_CALL_MATERIAL, SpringContextHolder.getBean(PlotterCallMaterialTask.class));
|
||||
AcsToWmsServiceImpl.Task_Collent.put(AcsTaskEnum.REQUEST_WARP_CALL_FULL, SpringContextHolder.getBean(WrapCallMaterialTask.class));
|
||||
AcsToWmsServiceImpl.Task_Collent.put(AcsTaskEnum.REQUEST_WARP_SEND_EMP, SpringContextHolder.getBean(WrapSendEmptyTask.class));
|
||||
System.out.println("初始化Task_Collent完成777"+AcsToWmsServiceImpl.Task_Collent.size());
|
||||
|
||||
@@ -14,7 +14,9 @@ import org.nl.modules.common.exception.BadRequestException;
|
||||
import org.nl.modules.wql.core.bean.WQLObject;
|
||||
import org.nl.wms.product_manage.service.device.IPdmBiDeviceService;
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.ISchCachelineVehicleService;
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.ISchCachelineVehilematerialService;
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehicle;
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehilematerial;
|
||||
import org.nl.wms.scheduler_manage.service.point.ISchBasePointService;
|
||||
import org.nl.wms.scheduler_manage.service.point.dao.SchBasePoint;
|
||||
import org.nl.wms.scheduler_manage.service.scheduler.ISchProcessRouteService;
|
||||
@@ -54,9 +56,7 @@ public class AgvInstService {
|
||||
@Autowired
|
||||
private ISchBaseTaskService taskService;
|
||||
@Autowired
|
||||
private ISchCachelineVehicleService cachelineVehicleService;
|
||||
@Autowired
|
||||
private ISchCachelineVehicleService cachelineVe3hicleService;
|
||||
private ISchCachelineVehilematerialService cachelineVehicleService;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String a= "A1_DC_15_6";
|
||||
@@ -198,10 +198,10 @@ public class AgvInstService {
|
||||
if (StringUtils.isNotEmpty(cacheLine)){
|
||||
int count = taskService.count(new QueryWrapper<SchBaseTask>().eq("point_code2", cacheLine).lt("task_status", StatusEnum.TASK_FINISH.getCode()));
|
||||
String status = StringUtils.isBlank(materialId) ? StatusEnum.CACHE_VEL_EMT.getCode() : StatusEnum.CACHE_VEL_FULL.getCode();
|
||||
List<SchCachelineVehicle> vehicle = cachelineVehicleService.getCachelineVehicle(MapOf.of("vehicle_status", status, "material_id", materialId, "cacheLine",cacheLine));
|
||||
List<SchCachelineVehilematerial> vehicle = cachelineVehicleService.getCachelineVehicle(MapOf.of("vehicle_status", status, "material_id", materialId, "cacheLine", cacheLine));
|
||||
if (vehicle.size()>0){
|
||||
if (vehicle.size()>count){
|
||||
return vehicle.stream().map(SchCachelineVehicle::getVehicle_code).collect(Collectors.joining(","));
|
||||
return vehicle.stream().map(SchCachelineVehilematerial::getVehicle_code).collect(Collectors.joining(","));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,7 +97,6 @@ public class SpeEmpTask extends AbstractAcsTask {
|
||||
if (speemp !=null){
|
||||
return "speemp";
|
||||
}
|
||||
//{"workorder_code":230523019,"device_code":"A1_TW_15_6_D","type":"1"}
|
||||
String cahceLine = getRouteXmlFlowByWorkprodure(param);
|
||||
if (cahceLine == null) { return null; }
|
||||
PdmProduceWorkorder one = workorderService.getOne(new QueryWrapper<PdmProduceWorkorder>()
|
||||
@@ -110,7 +109,6 @@ public class SpeEmpTask extends AbstractAcsTask {
|
||||
if (!CollectionUtils.isEmpty(list)){
|
||||
throw new BadRequestException(String.format("设备%s存在未完成任务:"+list.stream().map(SchBaseTask::getTask_id).collect(Collectors.toList()).toString(), param.getString("device_code")));
|
||||
}
|
||||
|
||||
JSONObject form = new JSONObject(MapOf.of("start_point_code",cahceLine,
|
||||
"next_point_code",param.getString("device_code"),"return_point_code", cahceLine,"vehicle_code",
|
||||
"","product_area",one.getProduct_area(),"quantity", param.getString("quantity"),"type",AcsTaskEnum.TASK_CACHELINE_OUT.getCode(),"material_id", one.getMaterial_id()));
|
||||
@@ -118,7 +116,6 @@ public class SpeEmpTask extends AbstractAcsTask {
|
||||
JSONObject task = packageParam(form, taskId);
|
||||
task.put("table_fk_id",param.getString("workorder_code"));
|
||||
taskService.save(task.toJavaObject(SchBaseTask.class));
|
||||
|
||||
return taskId;
|
||||
}
|
||||
|
||||
@@ -146,8 +143,7 @@ public class SpeEmpTask extends AbstractAcsTask {
|
||||
cahceLine = (String) tmp_cahceLine;
|
||||
}
|
||||
if (tmp_cahceLine instanceof Map){
|
||||
cahceLine = ((Map<String, String>) tmp_cahceLine).get(workprodure.get("spec"));
|
||||
}
|
||||
cahceLine = ((Map<String, String>) tmp_cahceLine).get(workprodure.get("spec")); }
|
||||
return cahceLine;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,11 +12,16 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.nl.common.domain.ConstantParam;
|
||||
import org.nl.common.enums.StatusEnum;
|
||||
import org.nl.common.enums.WorkerOrderEnum;
|
||||
import org.nl.common.utils.IdUtil;
|
||||
import org.nl.common.utils.MapOf;
|
||||
import org.nl.modules.wql.WQL;
|
||||
import org.nl.modules.wql.core.bean.WQLObject;
|
||||
import org.nl.wms.ext.acs.service.WmsToAcsService;
|
||||
import org.nl.wms.masterdata_manage.service.material.IMdMeMaterialbaseService;
|
||||
import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase;
|
||||
import org.nl.wms.product_manage.service.device.IPdmBiDeviceService;
|
||||
import org.nl.wms.product_manage.service.device.dao.PdmBiDevice;
|
||||
import org.nl.wms.product_manage.备份pdm.IPdmProduceWashorderService;
|
||||
import org.nl.wms.product_manage.备份pdm.dao.PdmProduceWashorder;
|
||||
import org.nl.wms.product_manage.sch.manage.AbstractAcsTask;
|
||||
@@ -38,12 +43,16 @@ import java.util.stream.Collectors;
|
||||
@Slf4j
|
||||
@Service
|
||||
public class WashMachineryTask extends AbstractAcsTask {
|
||||
|
||||
private static final String SK_WORKPRODURE_ID = "1535144552481034240";
|
||||
@Autowired
|
||||
private IPdmProduceWashorderService iPdmProduceWashorderService;
|
||||
|
||||
@Autowired
|
||||
private WmsToAcsService wmsToAcsService;
|
||||
@Autowired
|
||||
private IMdMeMaterialbaseService materialbaseService;
|
||||
@Autowired
|
||||
private IPdmBiDeviceService deviceService;
|
||||
|
||||
FileSystemResourceLoader loader = new FileSystemResourceLoader();
|
||||
GroovyShell groovyShell = new GroovyShell();
|
||||
@@ -64,11 +73,10 @@ public class WashMachineryTask extends AbstractAcsTask {
|
||||
pointTab.update(MapOf.of("material_id","","point_status","1"),"point_code in ('"+sql+"')");
|
||||
QueryWrapper<PdmProduceWashorder> query = new QueryWrapper<>();
|
||||
PdmProduceWashorder update = new PdmProduceWashorder();
|
||||
update.setIsError("0");
|
||||
update.setErrorInfo("");
|
||||
update.setUpdateId("1");
|
||||
update.setUpdateTime(DateUtil.now());
|
||||
update.setCreateName("acs");
|
||||
update.setIs_error(false);
|
||||
update.setError_info("");
|
||||
update.setUpdate_time(DateUtil.now());
|
||||
update.setCreate_name("acs");
|
||||
update.setStatus(StatusEnum.TASK_FINISH.getCode());
|
||||
iPdmProduceWashorderService.update(update,new QueryWrapper<PdmProduceWashorder>().eq("workorder_id",workorderId));
|
||||
}
|
||||
@@ -77,56 +85,65 @@ public class WashMachineryTask extends AbstractAcsTask {
|
||||
@Override
|
||||
@SneakyThrows
|
||||
public String createTask(JSONObject param) {
|
||||
WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point");
|
||||
WQLObject materialTab = WQLObject.getWQLObject("md_me_materialbase");
|
||||
String pointCode = param.getString("device_code");
|
||||
JSONObject device = WQL.getWO("sch_point").addParamMap(MapOf.of("flag", "8", "point_code", pointCode)).process().uniqueResult(0);
|
||||
//is_used = '0'人工下料:入料仓上线inupperlimit_qty;is_artificial人工
|
||||
Double inupperlimitQty = device.getDouble("inupperlimit_qty");
|
||||
String deviceCode = device.getString("device_code");
|
||||
String artificial = device.getString("is_artificial").equals("1")?"0":"1";
|
||||
JSONArray points = pointTab.query("region_code = 'SKQX' and material_id is not null and point_status = '2' and is_used = '"+artificial+"' order by vehicle_qty desc").getResultJSONArray(0);
|
||||
//清洗机是否有物料重量上线?{"device_code":"A1_CPQXJ_01_S","type":"7"}
|
||||
PdmProduceWashorder status = iPdmProduceWashorderService.getOne(new QueryWrapper<PdmProduceWashorder>().lt("status", WorkerOrderEnum.COMPLETE.getCode()));
|
||||
if (status!=null){
|
||||
return "";
|
||||
}
|
||||
//TODO:判断是否人工仓优先:人工仓一台一台爬,机械仓根据物料爬
|
||||
QueryWrapper<PdmBiDevice> query = new QueryWrapper<PdmBiDevice>()
|
||||
.gt("deviceinstor_qty", 0)
|
||||
.eq("is_used", true)
|
||||
.eq("workprocedure_id", SK_WORKPRODURE_ID)
|
||||
.isNotNull("material_id")
|
||||
.orderByDesc("deviceinstor_qty");
|
||||
|
||||
List<PdmBiDevice> SKQX = deviceService.list(query);
|
||||
|
||||
//查询深坑相同物料类型的点位:深坑单位:重量
|
||||
if (points.size()>0){
|
||||
Map<String, List<Object>> materialCollent = points.stream().collect(Collectors.groupingBy(o -> ((JSONObject) o).getString("material_id")));
|
||||
if (SKQX.size()>0){
|
||||
|
||||
Map<String, List<PdmBiDevice>> collect = SKQX.stream().collect(Collectors.groupingBy(PdmBiDevice::getMaterial_id));
|
||||
//查询清洗设备最大重量
|
||||
Resource resource = loader.getResource("classpath:/groovyFile.groovy");
|
||||
Script script = groovyShell.parse(resource.getFile());
|
||||
ArrayList<JSONObject> result = (ArrayList)script.invokeMethod("getPoints", new Object[]{points, materialCollent, inupperlimitQty});
|
||||
ArrayList<JSONObject> result = (ArrayList)script.invokeMethod("getPoints", new Object[]{SKQX, collect, 9999999d});
|
||||
//确认acs参数 创建工单下发acs
|
||||
if (!CollectionUtils.isEmpty(result)){
|
||||
String material_id = result.get(0).getString("material_id");
|
||||
JSONObject material = materialTab.query("material_id = '" + material_id + "' and is_delete = 0").uniqueResult(0);
|
||||
Double qty = result.stream().mapToDouble(value -> value.getDouble("qty")).sum();
|
||||
MdMeMaterialbase material = materialbaseService.getOne(new QueryWrapper<MdMeMaterialbase>().eq("material_id", material_id).eq("is_delete", false));
|
||||
PdmProduceWashorder washorder = new PdmProduceWashorder();
|
||||
washorder.setWorkorderId(IdUtil.getStringId());
|
||||
washorder.setWorkorderCode(IdUtil.getStringId());
|
||||
washorder.setIsNeedmove("0");
|
||||
washorder.setDeviceCode(deviceCode);
|
||||
washorder.setMaterialWeight(new BigDecimal(qty));
|
||||
washorder.setMaterialCode(material.getString("material_code"));
|
||||
washorder.setCreateTime(DateUtil.now());
|
||||
washorder.setInDevices(result.stream().map(a->a.getString("point_code")).collect(Collectors.joining(",")));
|
||||
washorder.setProductArea(device.getString("product_area"));
|
||||
washorder.setCreateId("1");
|
||||
washorder.setCreateName("acs");
|
||||
washorder.setWorkorder_id(IdUtil.getStringId());
|
||||
washorder.setWorkorder_code(IdUtil.getStringId());
|
||||
washorder.setDevice_code(param.getString("device_code"));
|
||||
washorder.setWeight(new BigDecimal(result.stream().mapToDouble(value -> value.getDouble("weight")).sum()));
|
||||
washorder.setQty(new BigDecimal(result.stream().mapToDouble(value -> value.getDouble("qty")).sum()));
|
||||
washorder.setMaterial_code(material.getMaterial_code());
|
||||
washorder.setMaterial_spec(material.getMaterial_spec());
|
||||
washorder.setMaterial_id(material.getMaterial_id());
|
||||
washorder.setCreate_time(DateUtil.now());
|
||||
washorder.setIn_devices(result.stream().map(a->a.getString("device_code")).collect(Collectors.joining(",")));
|
||||
washorder.setProduct_area("A1");
|
||||
washorder.setCreate_id("1");
|
||||
washorder.setCreate_name("acs");
|
||||
washorder.setStatus(StatusEnum.TASK_CREATE.getCode());
|
||||
//下发"
|
||||
//下发:"人工框:一个一个爬坡:是人工仓优先还是自动仓优先
|
||||
JSONArray request = new JSONArray();
|
||||
JSONObject jsonObject = new JSONObject(MapOf.of("workorder_id", washorder.getWorkorderId()
|
||||
, "workorder_code", washorder.getWorkorderCode()
|
||||
, "qty", washorder.getMaterialWeight()
|
||||
, "material_code", washorder.getMaterialCode()
|
||||
, "device_code", pointCode
|
||||
, "is_needmove", "0"
|
||||
, "in_devices", washorder.getInDevices()
|
||||
JSONObject jsonObject = new JSONObject(MapOf.of("workorder_id", washorder.getWorkorder_id()
|
||||
, "workorder_code", washorder.getWorkorder_code()
|
||||
, "qty", washorder.getQty()
|
||||
,"weight",washorder.getWeight()
|
||||
, "material_code", washorder.getMaterial_code()
|
||||
, "material_spec", washorder.getMaterial_spec()
|
||||
, "device_code", washorder.getDevice_code()
|
||||
, "in_devices", washorder.getIn_devices()
|
||||
));
|
||||
request.add(jsonObject);
|
||||
Map<String, Object> response = wmsToAcsService.order(request);
|
||||
if (response.get("status").equals(HttpStatus.BAD_REQUEST)){
|
||||
washorder.setErrorInfo((String) response.get("message"));
|
||||
washorder.setError_info((String) response.get("message"));
|
||||
washorder.setStatus(StatusEnum.TASK_START_ERROR.getCode());
|
||||
washorder.setIsError("1");
|
||||
washorder.setIs_error(true);
|
||||
}
|
||||
iPdmProduceWashorderService.save(washorder);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package org.nl.wms.product_manage.sch.tasks.callMaterial;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.nl.wms.product_manage.sch.manage.AbstractAcsTask;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/*
|
||||
* @author ZZQ
|
||||
* @Date 2023/6/16 08:40
|
||||
*/
|
||||
@Service
|
||||
public class EngraveCallMaterialTask extends AbstractAcsTask {
|
||||
@Override
|
||||
public void updateTaskStatus(JSONObject taskObj, String status) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String createTask(JSONObject param) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel(String task_id) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pointConfirm(JSONObject param) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
package org.nl.wms.product_manage.sch.tasks.sendMaterial;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.nl.common.enums.AcsTaskEnum;
|
||||
import org.nl.common.enums.StatusEnum;
|
||||
import org.nl.common.utils.SecurityUtils;
|
||||
import org.nl.modules.common.exception.BadRequestException;
|
||||
import org.nl.modules.system.util.CodeUtil;
|
||||
import org.nl.modules.wql.core.bean.WQLObject;
|
||||
import org.nl.wms.ext.acs.service.WmsToAcsService;
|
||||
import org.nl.wms.product_manage.sch.manage.AbstractAcsTask;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
/**
|
||||
* @Author: lyd
|
||||
* @Description: 刻字机送料
|
||||
* @Date: 2023/4/3
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
public class PlotterCallMaterialTask extends AbstractAcsTask {
|
||||
private static final String OPT_NAME = "刻字机#";
|
||||
@Autowired
|
||||
private WmsToAcsService wms;
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateTaskStatus(JSONObject task, String status) {
|
||||
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
|
||||
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
|
||||
JSONObject taskObj = taskTab.query("task_id = '" + task.getString("task_id") + "' " +
|
||||
"AND task_status <> '" + StatusEnum.TASK_FINISH.getCode() + "' " +
|
||||
"AND task_status <> '" + StatusEnum.TASK_CANNEL.getCode() + "'").uniqueResult(0);
|
||||
if (ObjectUtil.isEmpty(taskObj)) {
|
||||
throw new BadRequestException("任务已完成,不可取消!");
|
||||
}
|
||||
String pointCode2 = taskObj.getString("point_code2");
|
||||
JSONObject pointObj = null;
|
||||
if (ObjectUtil.isNotEmpty(pointCode2)) {
|
||||
pointObj = pointTab.query("point_code = '" + pointCode2 + "'").uniqueResult(0);
|
||||
}
|
||||
if (status.equals(AcsTaskEnum.STATUS_START.getCode())) {
|
||||
// 执行中
|
||||
// 任务执行中
|
||||
taskObj.put("task_status", StatusEnum.TASK_RUNNING.getCode());
|
||||
taskObj.put("update_time", DateUtil.now());
|
||||
taskTab.update(taskObj);
|
||||
} else if (status.equals(AcsTaskEnum.STATUS_FINISH.getCode())) {
|
||||
// 完成
|
||||
if (ObjectUtil.isNotEmpty(pointObj)) {
|
||||
// 释放点位并赋值
|
||||
pointObj.put("lock_type", StatusEnum.LOCK_OFF.getCode());
|
||||
pointObj.put("point_status", StatusEnum.POINT_STATUS_FULL.getCode());
|
||||
pointObj.put("material_id", taskObj.getString("material_id"));
|
||||
pointObj.put("update_time", DateUtil.now());
|
||||
pointTab.update(pointObj);
|
||||
// todo: 是否需要记录库存
|
||||
}
|
||||
// 2任务完成
|
||||
taskObj.put("task_status", StatusEnum.TASK_FINISH.getCode());
|
||||
taskObj.put("update_time", DateUtil.now());
|
||||
taskObj.put("finished_type", ObjectUtil.isNotEmpty(task.getString("finished_type"))?
|
||||
task.getString("finished_type"):AcsTaskEnum.AUTO_TASK_FINISHED_TYPE.getCode());
|
||||
taskTab.update(taskObj);
|
||||
} else {
|
||||
/**
|
||||
* 取消任务
|
||||
* 1、点位恢复
|
||||
* 2、任务状态修改
|
||||
*/
|
||||
// 2点位恢复
|
||||
if (ObjectUtil.isNotEmpty(pointObj)) {
|
||||
// 释放点位
|
||||
pointObj.put("lock_type", StatusEnum.LOCK_OFF.getCode());
|
||||
pointObj.put("update_time", DateUtil.now());
|
||||
pointTab.update(pointObj);
|
||||
}
|
||||
// 2任务取消
|
||||
taskObj.put("task_status", StatusEnum.TASK_CANNEL.getCode());
|
||||
taskObj.put("update_time", DateUtil.now());
|
||||
taskObj.put("finished_type", ObjectUtil.isNotEmpty(task.getString("finished_type"))?
|
||||
task.getString("finished_type"):AcsTaskEnum.AUTO_TASK_FINISHED_TYPE.getCode());
|
||||
taskTab.update(taskObj);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public String createTask(JSONObject param) {
|
||||
/**
|
||||
* 1.刻字机缺料请求 or 定时任务查询刻字机工单
|
||||
* 2.生成刻字机任务
|
||||
* 3.根据工单物料生成半成品出库任务:自动下发叫料
|
||||
* 4.半成品出库任务完成之后:
|
||||
* 触发刻字机任务:
|
||||
* 1.查看当前所有刻字机工单:获取当前刻字机Math.min(缺料数,倒料可倒数量)
|
||||
* 2.待确认:类似深坑那样一次给多台设备,还是一个设备一个设备的给
|
||||
*/
|
||||
WQLObject workOrderTab = WQLObject.getWQLObject("PDM_produce_workOrder");
|
||||
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
|
||||
String start_point_code = param.getString("device_code");
|
||||
String workorder = param.getString("workorder_code");
|
||||
if(StrUtil.isEmpty(start_point_code)) {
|
||||
throw new BadRequestException("起点不能为空!");
|
||||
}
|
||||
// 判断当前点是否有未完成的任务
|
||||
JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + start_point_code + "' " +
|
||||
"and task_status <> '" + StatusEnum.TASK_FINISH.getCode() + "' " +
|
||||
"and task_status <> '" + StatusEnum.TASK_CANNEL.getCode() + "'").uniqueResult(0);
|
||||
if (ObjectUtil.isNotEmpty(taskObj)) {
|
||||
throw new BadRequestException("当前点位" + start_point_code + "存在未完成的任务");
|
||||
}
|
||||
if(StrUtil.isEmpty(workorder)) {
|
||||
throw new BadRequestException("工单不能为空!");
|
||||
}
|
||||
// 判断工单
|
||||
JSONObject workOrderObj = workOrderTab.query("workorder_code = '" + workorder + "' and workorder_status <> '" + StatusEnum.TASK_FINISH.getCode() + "' and is_delete ='0'").uniqueResult(0);
|
||||
if (ObjectUtil.isEmpty(workOrderObj)){
|
||||
throw new BadRequestException("下发工单不存在未完成工单:"+workorder);
|
||||
}
|
||||
// 查找任务状态
|
||||
String taskdtl_id = IdUtil.getSnowflake(1, 1).nextId() + "";
|
||||
JSONObject task = new JSONObject();
|
||||
task.put("task_id", taskdtl_id);
|
||||
task.put("task_name", AcsTaskEnum.TASK_PLOTTER_MAC.getDesc());
|
||||
task.put("task_type", AcsTaskEnum.TASK_PLOTTER_MAC.getCode());
|
||||
task.put("task_code", CodeUtil.getNewCode("TASK_CODE"));
|
||||
task.put("acs_task_type", AcsTaskEnum.ACS_TASK_TYPE_WEIGHING_TASK_OF_PS20.getCode());
|
||||
task.put("material_id", workOrderObj.getString("material_id"));
|
||||
task.put("task_status", StatusEnum.TASK_CREATE.getCode());
|
||||
task.put("point_code1", start_point_code);
|
||||
task.put("handle_class", this.getClass().getName());
|
||||
task.put("is_delete", StatusEnum.STATUS_FLASE.getCode());
|
||||
String currentUserId = SecurityUtils.getCurrentUserId();
|
||||
task.put("create_id", currentUserId);
|
||||
task.put("create_name", SecurityUtils.getCurrentNickName());
|
||||
task.put("update_id", currentUserId);
|
||||
task.put("update_name", SecurityUtils.getCurrentNickName());
|
||||
task.put("create_time", DateUtil.now());
|
||||
task.put("update_time", DateUtil.now());
|
||||
task.put("priority", "1");
|
||||
task.put("agv_system_type", AcsTaskEnum.AGV_SYSTEM_XC.getCode());
|
||||
WQLObject.getWQLObject("SCH_BASE_Task").insert(task);
|
||||
// 找终点
|
||||
try {
|
||||
pointConfirm(task);
|
||||
JSONArray data = new JSONArray();
|
||||
JSONObject result = taskTab.query("task_id = '" + taskdtl_id + "'").uniqueResult(0);
|
||||
data.add(result);
|
||||
// 下发
|
||||
wms.issueTaskToAcs2(data);
|
||||
} catch (Exception ex) {
|
||||
// 未找到
|
||||
task.put("remark", ex.getMessage());
|
||||
task.put("update_time", DateUtil.now());
|
||||
task.put("task_status", StatusEnum.TASK_START_ERROR.getCode());
|
||||
taskTab.update(task);
|
||||
}
|
||||
return taskdtl_id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel(String task_id) {
|
||||
}
|
||||
|
||||
/**
|
||||
* 满料请求
|
||||
* 从刻字机满料缓存区中获取空位放入就行
|
||||
* @param taskObj: 任务对象
|
||||
*/
|
||||
@Override
|
||||
public void pointConfirm(JSONObject taskObj) {
|
||||
log.info(OPT_NAME+"fullMaterial param:{}",JSONObject.toJSONString(taskObj));
|
||||
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
|
||||
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
|
||||
// 去刻字缓存区寻找空位
|
||||
JSONObject point = pointTab.query("region_code = 'A1_KZHC' AND point_status = '" +
|
||||
StatusEnum.POINT_STATUS_EMPTY.getCode() + "' AND lock_type = '" + StatusEnum.LOCK_OFF.getCode() +
|
||||
"' AND is_used = '" + StatusEnum.STATUS_TRUE.getCode() + "' AND is_delete = '" +
|
||||
StatusEnum.STATUS_FLASE.getCode() + "'").uniqueResult(0);
|
||||
if (ObjectUtil.isNotEmpty(point)) {
|
||||
// 找到位置
|
||||
// 点位上锁
|
||||
point.put("lock_type", StatusEnum.LOCK_ON.getCode());
|
||||
pointTab.update(point);
|
||||
// 设置点位
|
||||
taskObj.put("point_code2", point.getString("point_code"));
|
||||
taskObj.put("task_status", StatusEnum.TASK_START_END_P.getCode());
|
||||
taskObj.put("update_time", DateUtil.now());
|
||||
taskTab.update(taskObj);
|
||||
} else {
|
||||
throw new BadRequestException("刻字缓存区没有可用货位.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -169,12 +169,10 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
|
||||
if (ids == null || ids.size() == 0) {
|
||||
return;
|
||||
}
|
||||
this.update(new UpdateWrapper<PdmProduceWorkorder>()
|
||||
.set("workorder_status", WorkerOrderEnum.SEND.getCode())
|
||||
.set("down_id", SecurityUtils.getCurrentUserId())
|
||||
.set("down_name", SecurityUtils.getCurrentNickName())
|
||||
.set("down_time", new Date())
|
||||
.in("workorder_id", ids));
|
||||
List<PdmProduceWorkorder> workorders = this.list(new QueryWrapper<PdmProduceWorkorder>().in("workorder_id", ids).lt("workorder_status",WorkerOrderEnum.AUTO_COMPLETE.getCode()));
|
||||
if (workorders.size()!= ids.size()){
|
||||
throw new BadRequestException("完成的工单不允许再次下发");
|
||||
}
|
||||
this.recordWorkOrder(OptionRecord.OptionEnum.UPDATE, ids.toArray(new String[0]));
|
||||
|
||||
}
|
||||
@@ -421,7 +419,7 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
|
||||
throw new BadRequestException("当前工单存在未报工的报工记录,请先进行报工");
|
||||
}
|
||||
Map<String, Object> resp = wmsToAcsService.order(array);
|
||||
if (HttpStatus.BAD_REQUEST.equals(resp.get("status"))) {
|
||||
if (HttpStatus.BAD_REQUEST.value() == (int)resp.get("status")) {
|
||||
throw new BadRequestException(resp.get("message") != null ? String.valueOf(resp.get("message")) : "acs反馈异常");
|
||||
}
|
||||
return RestBusinessTemplate.execute(() -> resp);
|
||||
|
||||
@@ -24,58 +24,62 @@ public class PdmProduceWashorder implements Serializable {
|
||||
/**
|
||||
* 工单编号
|
||||
*/
|
||||
private String workorderId;
|
||||
private String workorder_id;
|
||||
|
||||
/**
|
||||
* 工单编号
|
||||
*/
|
||||
private String workorderCode;
|
||||
private String workorder_code;
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 生产区域
|
||||
*/
|
||||
private String productArea;
|
||||
private String product_area;
|
||||
|
||||
/**
|
||||
* 实际数量
|
||||
*/
|
||||
private String qty;
|
||||
private BigDecimal qty;
|
||||
/**
|
||||
* 实际单重
|
||||
*/
|
||||
private BigDecimal weight;
|
||||
|
||||
/**
|
||||
* 物料编号
|
||||
*/
|
||||
private String materialCode;
|
||||
private String material_code;
|
||||
|
||||
/**
|
||||
* 物料标识
|
||||
*/
|
||||
private String isNeedmove;
|
||||
|
||||
private String material_spec;
|
||||
/**
|
||||
* 实际单重
|
||||
* 物料标识
|
||||
*/
|
||||
private BigDecimal materialWeight;
|
||||
private String material_id;
|
||||
|
||||
|
||||
/**
|
||||
* 当前生产设备编码
|
||||
*/
|
||||
private String deviceCode;
|
||||
private String device_code;
|
||||
|
||||
/**
|
||||
* 工单是否异常
|
||||
*/
|
||||
private String isError;
|
||||
private Boolean is_error;
|
||||
|
||||
/**
|
||||
* 设备集合
|
||||
*/
|
||||
private String inDevices;
|
||||
private String in_devices;
|
||||
|
||||
/**
|
||||
* 异常信息
|
||||
*/
|
||||
private String errorInfo;
|
||||
private String error_info;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
@@ -85,32 +89,21 @@ public class PdmProduceWashorder implements Serializable {
|
||||
/**
|
||||
* 创建人
|
||||
*/
|
||||
private String createId;
|
||||
private String create_id;
|
||||
|
||||
/**
|
||||
* 创建人
|
||||
*/
|
||||
private String createName;
|
||||
private String create_name;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private String createTime;
|
||||
|
||||
/**
|
||||
* 修改人
|
||||
*/
|
||||
private String updateId;
|
||||
|
||||
/**
|
||||
* 修改人
|
||||
*/
|
||||
private String updateName;
|
||||
|
||||
private String create_time;
|
||||
/**
|
||||
* 修改时间
|
||||
*/
|
||||
private String updateTime;
|
||||
private String update_time;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -78,6 +78,7 @@ public class SchedulerController {
|
||||
throw new BadRequestException("当前工序路由id"+route.getProcess_id()+"没有对应xml配置文件配置");
|
||||
}
|
||||
route.setProcess_name(process.getName());
|
||||
route.setRule_code(form.getString("material_spec"));
|
||||
processRouteService.save(route);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
|
||||
@@ -16,5 +16,4 @@ import java.util.Map;
|
||||
*/
|
||||
public interface ISchCachelineVehicleService extends IService<SchCachelineVehicle> {
|
||||
|
||||
List<SchCachelineVehicle> getCachelineVehicle(Map query);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
package org.nl.wms.scheduler_manage.service.cacheline;
|
||||
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehicle;
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehilematerial;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 缓存线载具物料表 服务类
|
||||
@@ -12,5 +16,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
||||
* @since 2023-05-06
|
||||
*/
|
||||
public interface ISchCachelineVehilematerialService extends IService<SchCachelineVehilematerial> {
|
||||
List<SchCachelineVehilematerial> getCachelineVehicle(Map query);
|
||||
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ import java.util.Map;
|
||||
*/
|
||||
public interface SchCachelineVehicleMapper extends BaseMapper<SchCachelineVehicle> {
|
||||
|
||||
List<SchCachelineVehicle> getCachelineVehicle(Map<String,String> query);
|
||||
// List<SchCachelineVehicle> getCachelineVehicle(Map<String,String> query);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.nl.wms.scheduler_manage.service.cacheline.dao.mapper;
|
||||
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehicle;
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehilematerial;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
@@ -18,4 +19,7 @@ import java.util.Map;
|
||||
public interface SchCachelineVehilematerialMapper extends BaseMapper<SchCachelineVehilematerial> {
|
||||
|
||||
List<Map> getErrorVeh(@Param("cacheline_code") String cacheline_code);
|
||||
|
||||
List<SchCachelineVehilematerial> getCachelineVehicle(Map<String,String> query);
|
||||
|
||||
}
|
||||
|
||||
@@ -24,4 +24,18 @@
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
<select id="getCachelineVehicle"
|
||||
resultType="org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehilematerial">
|
||||
SELECT
|
||||
v.vehicle_code,v.vehicle_status,v.material_id,v.quantity
|
||||
FROM
|
||||
sch_cacheline_vehilematerial v
|
||||
LEFT JOIN sch_cacheline_position p ON p.vehicle_code = v.vehicle_code
|
||||
WHERE p.vehicle_code <![CDATA[<>]]> '' and
|
||||
v.vehicle_status = #{vehicle_status} and
|
||||
p.cacheLine_code = #{cacheLine}
|
||||
<if test="material_id != null and material_id != ''">
|
||||
and v.material_id = #{material_id}
|
||||
</if>
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
@@ -20,8 +20,4 @@ import java.util.Map;
|
||||
@Service
|
||||
public class SchCachelineVehicleServiceImpl extends ServiceImpl<SchCachelineVehicleMapper, SchCachelineVehicle> implements ISchCachelineVehicleService {
|
||||
|
||||
@Override
|
||||
public List<SchCachelineVehicle> getCachelineVehicle(Map query) {
|
||||
return this.baseMapper.getCachelineVehicle(query);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
package org.nl.wms.scheduler_manage.service.cacheline.impl;
|
||||
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehicle;
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehilematerial;
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.dao.mapper.SchCachelineVehilematerialMapper;
|
||||
import org.nl.wms.scheduler_manage.service.cacheline.ISchCachelineVehilematerialService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 缓存线载具物料表 服务实现类
|
||||
@@ -17,4 +21,8 @@ import org.springframework.stereotype.Service;
|
||||
@Service
|
||||
public class SchCachelineVehilematerialServiceImpl extends ServiceImpl<SchCachelineVehilematerialMapper, SchCachelineVehilematerial> implements ISchCachelineVehilematerialService {
|
||||
|
||||
@Override
|
||||
public List<SchCachelineVehilematerial> getCachelineVehicle(Map query) {
|
||||
return this.baseMapper.getCachelineVehicle(query);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ public class SchBasePointServiceImpl extends ServiceImpl<SchBasePointMapper, Sch
|
||||
@Override
|
||||
public Object queryAll(Map whereJson, PageQuery pageQuery) {
|
||||
Page<Object> page = PageHelper.startPage(pageQuery.getPage()+1, pageQuery.getSize());
|
||||
page.setOrderBy("point_code asc");
|
||||
List<Map> list = schBasePointMapper.queryAll(whereJson);
|
||||
Set<Object> regionCodes = list.stream().map(a -> a.get("region_code")).collect(Collectors.toSet());
|
||||
List<SchBaseRegion> regions = schBaseRegionService.list(new QueryWrapper<SchBaseRegion>().in("region_code", regionCodes));
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
package org.nl.wms.scheduler_manage.service.scheduler;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.nl.common.enums.WorkerOrderEnum;
|
||||
import org.nl.common.utils.BaseCode;
|
||||
import org.nl.common.utils.IdUtil;
|
||||
import org.nl.wms.masterdata_manage.service.material.IMdMeMaterialbaseService;
|
||||
import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase;
|
||||
import org.nl.wms.product_manage.sch.tasks.callMaterial.EngraveCallMaterialTask;
|
||||
import org.nl.wms.product_manage.service.workorder.IPdmProduceWorkorderService;
|
||||
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder;
|
||||
import org.nl.wms.storage_manage.productmanage.service.structIvt.dao.StIvtStructivtCp;
|
||||
import org.nl.wms.storage_manage.semimanage.service.iostorInv.IStIvtIostorinvBcpOutService;
|
||||
import org.nl.wms.storage_manage.semimanage.service.structIvt.dao.StIvtStructivtBcp;
|
||||
import org.slf4j.MDC;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/*
|
||||
* @author ZZQ
|
||||
* @Date 2023/6/16 09:21
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class EngraveScheduleService {
|
||||
|
||||
private static final String ENGRAVE_WORKPRODURE = "1535144682756116480";
|
||||
|
||||
@Autowired
|
||||
private IPdmProduceWorkorderService workorderService;
|
||||
@Autowired
|
||||
private IStIvtIostorinvBcpOutService stIvtIostorinvBcpOutService;
|
||||
@Autowired
|
||||
private EngraveCallMaterialTask engraveCallMaterialTask;
|
||||
@Autowired
|
||||
private IMdMeMaterialbaseService materialbaseService;
|
||||
|
||||
public void run(){
|
||||
MDC.put("requestMethod","EngraveScheduleService#EngravePublish");
|
||||
MDC.put("requestIp", "127.0.0.1");
|
||||
MDC.put("traceId", BaseCode.intToChars(IdUtil.getLongId()));
|
||||
MDC.put("requestTime", DateUtil.now());
|
||||
this.EngravePublish();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void EngravePublish(){
|
||||
/**
|
||||
* 1.查询当前正在执行的刻字工单数组
|
||||
* 2.获取相同物料的工单:查询半成品库存物料:有的话则进行半成品出库:出到对接位
|
||||
* 3.半成品出库完成后:触发刻字机叫料任务:
|
||||
* 4。根据物料获取工单对应设备:生成刻字机叫料任务
|
||||
*/
|
||||
List<PdmProduceWorkorder> list = workorderService.list(new QueryWrapper<PdmProduceWorkorder>()
|
||||
.eq("workprocedure_id", ENGRAVE_WORKPRODURE)
|
||||
.eq("workorder_status", WorkerOrderEnum.PRODUCTING.getCode())
|
||||
.apply("plan_qty > dq_real_qty"));
|
||||
if (CollectionUtils.isEmpty(list)){
|
||||
return;
|
||||
}
|
||||
Map<String, List<PdmProduceWorkorder>> collect = list.stream().collect(Collectors.groupingBy(PdmProduceWorkorder::getMaterial_id));
|
||||
//工单开工规则
|
||||
for (Map.Entry<String, List<PdmProduceWorkorder>> entry : collect.entrySet()) {
|
||||
JSONObject form = new JSONObject();
|
||||
form.put("stor_id","528627995269533696");//st_ivt_sectattr紫铜车间-半成品库区
|
||||
form.put("sect_id","1528631044482404352");
|
||||
form.put("material_id",entry.getKey());
|
||||
form.put("product_code","A1");//车间
|
||||
form.put("point_code","A1_KZPP_D");
|
||||
StIvtStructivtCp structivtCp = stIvtIostorinvBcpOutService.autoConfirm(form);
|
||||
if (structivtCp == null){ continue; }
|
||||
//生成输送线到刻字机任务
|
||||
//工单物料分配规则
|
||||
MdMeMaterialbase material = materialbaseService.getOne(new QueryWrapper<MdMeMaterialbase>().eq("material_id", entry.getKey()).eq("is_delete", false));
|
||||
List<PdmProduceWorkorder> current_workorders = entry.getValue();
|
||||
BigDecimal canuse_qty = structivtCp.getCanuse_qty();
|
||||
String grop_id = IdUtil.getStringId();
|
||||
|
||||
for (PdmProduceWorkorder current_workorder : current_workorders) {
|
||||
BigDecimal need = current_workorder.getPlan_qty().subtract(current_workorder.getDq_real_qty());
|
||||
if (need.intValue() <= 0){ continue; }
|
||||
int min = Math.min(canuse_qty.intValue(), need.intValue());
|
||||
|
||||
JSONObject taskForm = new JSONObject();
|
||||
taskForm.put("workorder_code",current_workorder.getWorkorder_code());
|
||||
taskForm.put("device_code",current_workorder.getDevice_code());
|
||||
taskForm.put("qty",min);
|
||||
taskForm.put("weight",material.getNet_weight().doubleValue()*min);
|
||||
taskForm.put("material_id",material.getMaterial_id());
|
||||
taskForm.put("material_code",material.getMaterial_code());
|
||||
taskForm.put("material_spec",material.getMaterial_spec());
|
||||
taskForm.put("task_grop_id", grop_id);
|
||||
engraveCallMaterialTask.createTask(taskForm);
|
||||
canuse_qty = canuse_qty.subtract(need);
|
||||
if (canuse_qty.intValue()<=0){return;}
|
||||
}
|
||||
if (canuse_qty.intValue() > 0){
|
||||
JSONObject taskForm = new JSONObject();
|
||||
taskForm.put("workorder_code"," ");
|
||||
taskForm.put("device_code","");
|
||||
taskForm.put("qty",canuse_qty);
|
||||
taskForm.put("weight",material.getNet_weight().multiply(canuse_qty));
|
||||
taskForm.put("material_id",material.getMaterial_id());
|
||||
taskForm.put("material_code",material.getMaterial_code());
|
||||
taskForm.put("material_spec",material.getMaterial_spec());
|
||||
taskForm.put("task_grop_id", grop_id);
|
||||
engraveCallMaterialTask.createTask(taskForm);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -568,9 +568,7 @@ public class StIvtIostorinvCpOutServiceImpl extends ServiceImpl<StIvtIostorinvCp
|
||||
Map<String, List<StIvtIostorinvdisCp>> collect = iostorinvdisCpService.list(
|
||||
new QueryWrapper<StIvtIostorinvdisCp>().lambda()
|
||||
.eq(StIvtIostorinvdisCp::getTask_id, task_id)
|
||||
)
|
||||
.stream()
|
||||
.collect(Collectors.groupingBy(StIvtIostorinvdisCp::getIostorinvdtl_id));
|
||||
).stream().collect(Collectors.groupingBy(StIvtIostorinvdisCp::getIostorinvdtl_id));
|
||||
|
||||
for(List<StIvtIostorinvdisCp> list : collect.values()) {
|
||||
StIvtIostorinvdisCp disDao_2 = list.get(0);
|
||||
@@ -709,7 +707,7 @@ public class StIvtIostorinvCpOutServiceImpl extends ServiceImpl<StIvtIostorinvCp
|
||||
stIvtIostorinvCp.setSysdeptid("111");
|
||||
stIvtIostorinvCp.setSyscompanyid("111");
|
||||
}else {
|
||||
|
||||
|
||||
// 修改
|
||||
stIvtIostorinvCp.setUpdate_id(SecurityUtils.getCurrentUserId());
|
||||
stIvtIostorinvCp.setUpdate_name(SecurityUtils.getCurrentNickName());
|
||||
|
||||
@@ -11,7 +11,7 @@ import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 仓位库存表
|
||||
* 仓位库存表:半成品/成品公用
|
||||
* </p>
|
||||
*
|
||||
* @author generator
|
||||
|
||||
@@ -105,6 +105,8 @@ public class StIvtStructivtCpServiceImpl extends ServiceImpl<StIvtStructivtCpMap
|
||||
|
||||
@Override
|
||||
public StIvtStructivtCp queryIvtOutOne(JSONObject json) {
|
||||
if (ObjectUtil.isEmpty(json.getString("material_id")))
|
||||
throw new BadRequestException("物料不能为空");
|
||||
return baseMapper.queryIvtOutOne(json);
|
||||
}
|
||||
|
||||
|
||||
@@ -39,4 +39,5 @@ public interface DivRuleCpService {
|
||||
* @return StIvtStructattr /
|
||||
*/
|
||||
StIvtStructivtCp divRuleOut(JSONObject whereJson);
|
||||
StIvtStructivtCp divRuleOutAndLock(JSONObject whereJson);
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ import cn.hutool.core.util.ObjectUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import org.nl.common.utils.RedissonUtils;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import org.nl.modules.common.exception.BadRequestException;
|
||||
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtStructattrService;
|
||||
import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtStructattr;
|
||||
@@ -100,4 +102,25 @@ public class DivRuleCpServiceImpl implements DivRuleCpService {
|
||||
return ivtDao;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StIvtStructivtCp divRuleOutAndLock(JSONObject whereJson) {
|
||||
RedissonUtils.lock(()->{
|
||||
switch (whereJson.getString("rule_type")) {
|
||||
case RuleUtil.PRODUCTION_OUT_1 :
|
||||
if (ObjectUtil.isEmpty(whereJson.getString("sale_id"))) throw new BadRequestException("销售单不能为空");
|
||||
ivtDao = iStIvtStructivtCpService.queryIvtOutOne(whereJson);
|
||||
break;
|
||||
case RuleUtil.PRODUCTION_OUT_2 :
|
||||
ivtDao = iStIvtStructivtCpService.queryIvtOutOne(whereJson);
|
||||
break;
|
||||
}
|
||||
//锁定
|
||||
iStIvtStructattrService.update(new UpdateWrapper<StIvtStructattr>().lambda()
|
||||
.eq(StIvtStructattr::getStruct_code, ivtDao.getStruct_code())
|
||||
.set(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("出库锁"))
|
||||
.set(StIvtStructattr::getInv_code,""));
|
||||
},whereJson.getString("material_id"),1);
|
||||
return ivtDao;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package org.nl.wms.storage_manage.semimanage.service.iostorInv;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.nl.common.domain.query.PageQuery;
|
||||
import org.nl.wms.storage_manage.productmanage.service.structIvt.dao.StIvtStructivtCp;
|
||||
import org.nl.wms.storage_manage.semimanage.service.iostorInv.dao.StIvtIostorinvBcp;
|
||||
import org.nl.wms.storage_manage.semimanage.service.iostorInv.dto.BcpIostorInvQuery;
|
||||
|
||||
@@ -43,6 +44,16 @@ public interface IStIvtIostorinvBcpOutService extends IService<StIvtIostorinvBcp
|
||||
* @return
|
||||
*/
|
||||
String confirm(JSONObject form);
|
||||
|
||||
/**
|
||||
* 自动出库
|
||||
* @param param
|
||||
* param.put("stor_id", form.getString("stor_id"));
|
||||
* param.put("sect_id", form.getString("sect_id"));
|
||||
* param.put("material_id", form.getString("material_id"));
|
||||
* @return
|
||||
*/
|
||||
StIvtStructivtCp autoConfirm(JSONObject param);
|
||||
/**
|
||||
* 下发单据
|
||||
* @param form
|
||||
|
||||
@@ -24,6 +24,8 @@ import org.nl.modules.common.exception.BadRequestException;
|
||||
import org.nl.modules.system.util.CodeUtil;
|
||||
import org.nl.modules.wql.util.SpringContextHolder;
|
||||
import org.nl.wms.ext.acs.service.WmsToAcsService;
|
||||
import org.nl.wms.masterdata_manage.service.material.IMdMeMaterialbaseService;
|
||||
import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase;
|
||||
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtBsrealstorattrService;
|
||||
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtSectattrService;
|
||||
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtStructattrService;
|
||||
@@ -36,10 +38,9 @@ import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask;
|
||||
import org.nl.wms.storage_manage.CHANGE_BILL_TYPE_ENUM;
|
||||
import org.nl.wms.storage_manage.IOSEnum;
|
||||
import org.nl.wms.storage_manage.basedata.service.record.service.IStIvtStructivtflowService;
|
||||
import org.nl.wms.storage_manage.productmanage.service.structIvt.dao.StIvtStructivtCp;
|
||||
import org.nl.wms.storage_manage.productmanage.util.DivRuleCpService;
|
||||
import org.nl.wms.storage_manage.productmanage.util.RuleUtil;
|
||||
import org.nl.wms.storage_manage.semimanage.service.check.dao.StIvtCheckdtlBcp;
|
||||
import org.nl.wms.storage_manage.semimanage.service.check.dao.StIvtCheckmstBcp;
|
||||
import org.nl.wms.storage_manage.semimanage.service.iostorInv.IStIvtIostorinvBcpOutService;
|
||||
import org.nl.wms.storage_manage.semimanage.service.iostorInv.dao.StIvtIostorinvBcp;
|
||||
import org.nl.wms.storage_manage.semimanage.service.iostorInv.dao.mapper.StIvtIostorinvBcpMapper;
|
||||
@@ -79,6 +80,8 @@ public class StIvtIostorinvBcpOutServiceImpl extends ServiceImpl<StIvtIostorinvB
|
||||
private IStIvtSectattrService sectattrService;
|
||||
@Autowired
|
||||
private ISchBaseTaskService iSchBaseTaskService; // 任务表服务
|
||||
@Autowired
|
||||
private IMdMeMaterialbaseService materialbaseService;
|
||||
|
||||
|
||||
@Override
|
||||
@@ -207,6 +210,72 @@ public class StIvtIostorinvBcpOutServiceImpl extends ServiceImpl<StIvtIostorinvB
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public StIvtStructivtCp autoConfirm(JSONObject form) {
|
||||
MdMeMaterialbase material = materialbaseService.getOne(new QueryWrapper<MdMeMaterialbase>().eq("material_id", form.getString("material_id")));
|
||||
JSONObject param = new JSONObject();
|
||||
param.put("stor_id", form.getString("stor_id"));
|
||||
param.put("sect_id", form.getString("sect_id"));
|
||||
param.put("material_id", form.getString("material_id"));
|
||||
param.put("rule_type", RuleUtil.PRODUCTION_OUT_2);
|
||||
// 2.锁定仓位
|
||||
StIvtStructivtCp structivtBcp = divRuleCpService.divRuleOutAndLock(param);
|
||||
if (structivtBcp == null){
|
||||
return null;
|
||||
}
|
||||
StIvtIostorinvBcp mst = new StIvtIostorinvBcp();
|
||||
mst.setIostorinv_id(IdUtil.getStringId());
|
||||
mst.setBill_code(CodeUtil.getNewCode("IO_CODE"));
|
||||
mst.setBiz_date(form.getString("biz_date"));
|
||||
mst.setBill_type(form.getString("bill_type"));
|
||||
mst.setIo_type(IOSEnum.IO_TYPE.code("出库"));
|
||||
mst.setBill_status(IOSEnum.BILL_STATUS.code("生成"));
|
||||
mst.setRemark(form.getString("remark"));
|
||||
mst.setWorkshop_id(form.getString("product_code"));
|
||||
mst.setPoint_code(form.getString("point_code"));
|
||||
mst.setMaterial_id(material.getMaterial_id());
|
||||
mst.setPcsn(StringUtils.isNotEmpty(form.getString("pcsn")) ? form.getString("pcsn") : DateUtil.today());
|
||||
mst.setPlan_qty(structivtBcp.getCanuse_qty());
|
||||
mst.setQuality_scode(structivtBcp.getQuality_scode());
|
||||
mst.setQty_unit_id(structivtBcp.getQty_unit_id());
|
||||
mst.setBase_bill_code("");
|
||||
mst.setQty_unit_name(" ");
|
||||
mst.setUnit_weight(material.getNet_weight());
|
||||
mst.setStoragevehicle_code(" ");
|
||||
mst.setStoragevehicle_id(" ");
|
||||
仓库数据:
|
||||
{
|
||||
StIvtBsrealstorattr stor = storattrService.getOne(new QueryWrapper<StIvtBsrealstorattr>().eq("stor_id", form.getString("stor_id")));
|
||||
mst.setStor_id(stor.getStor_id());
|
||||
mst.setStor_code(stor.getStor_code());
|
||||
mst.setStor_name(stor.getStor_name());
|
||||
StIvtSectattr sect = sectattrService.getById(form.getString("sect_id"));
|
||||
mst.setSect_code(sect.getSect_code());
|
||||
mst.setSect_id(sect.getSect_id());
|
||||
mst.setSect_name(sect.getSect_name());
|
||||
mst.setStruct_id(structivtBcp.getStruct_id());
|
||||
mst.setStruct_code(structivtBcp.getStruct_code());
|
||||
mst.setStruct_name(structivtBcp.getStruct_name());
|
||||
}
|
||||
mst.setCreate_id("1");
|
||||
mst.setCreate_name("acs");
|
||||
mst.setCreate_time(DateUtil.now());
|
||||
PointEvent event = PointEvent.builder()
|
||||
.type(AcsTaskEnum.TASK_STRUCT_OUT.getCode())
|
||||
.point_code1(mst.getPoint_code())
|
||||
.point_code2(structivtBcp.getStruct_code())
|
||||
.vehicle_code(mst.getStoragevehicle_code())
|
||||
.product_area(mst.getWorkshop_id())
|
||||
.callback((Consumer<String>) mst::setTask_id)
|
||||
.build();
|
||||
BussEventMulticaster.Publish(event);
|
||||
mst.setWork_status(IOSEnum.WORK_STATUS.code("生成"));
|
||||
mst.setBill_status(IOSEnum.BILL_STATUS.code("分配完"));
|
||||
this.save(mst);
|
||||
return structivtBcp;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public String confirmTask(JSONObject form) {
|
||||
|
||||
@@ -23,11 +23,11 @@ spring:
|
||||
db-type: com.alibaba.druid.pool.DruidDataSource
|
||||
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
|
||||
# url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.46.5}:${DB_PORT:3306}/${DB_NAME:hl_one_mes_test}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
|
||||
# url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.46.5}:${DB_PORT:3306}/${DB_NAME:hl_one_mes_test}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
|
||||
url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:hl_one_mes}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
|
||||
url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.46.5}:${DB_PORT:3306}/${DB_NAME:hl_one_mes}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
|
||||
# url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:hl_one_mes}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
|
||||
username: ${DB_USER:root}
|
||||
# password: ${DB_PWD:123456}
|
||||
password: ${DB_PWD:942464Yy}
|
||||
password: ${DB_PWD:123456}
|
||||
|
||||
# 初始连接数
|
||||
initial-size: 5
|
||||
|
||||
@@ -1,24 +1,27 @@
|
||||
import com.alibaba.fastjson.JSONArray
|
||||
import com.alibaba.fastjson.JSONObject
|
||||
import org.nl.wms.product_manage.service.device.dao.PdmBiDevice
|
||||
|
||||
def getPoints(JSONArray points,Map<String, List<Object>> materialCollent,Double inupperlimitQty){
|
||||
def getPoints(List<PdmBiDevice> devices, Map<String, List<PdmBiDevice>> materialCollent, Double inupperlimitQty){
|
||||
|
||||
def list = new ArrayList<>();
|
||||
JSONObject point = points.getJSONObject(0)
|
||||
String materialId = point.getString("material_id");
|
||||
List<Object> collect = materialCollent.get(materialId);
|
||||
collect.sort(Comparator.comparingDouble({ item -> ((JSONObject) item).getDouble("vehicle_qty") }).reversed());
|
||||
PdmBiDevice device = devices.get(0)
|
||||
String materialId = device.getMaterial_id();
|
||||
List<PdmBiDevice> collect = materialCollent.get(materialId);
|
||||
Double qty = 0.0;
|
||||
for (Object o1 : collect) {
|
||||
def list = new ArrayList<>();
|
||||
for (PdmBiDevice o1 : collect) {
|
||||
if (qty>inupperlimitQty){
|
||||
return list;
|
||||
}
|
||||
def item = new JSONObject()
|
||||
item.put("point_code",((JSONObject) o1).getString("point_code"))
|
||||
item.put("qty",((JSONObject) o1).getDouble("vehicle_qty"));
|
||||
item.put("device_code",o1.getDevice_code())
|
||||
item.put("qty",o1.getDeviceinstor_qty());
|
||||
item.put("weight",o1.getDeviceinstor_weight().doubleValue());
|
||||
item.put("material_id",materialId);
|
||||
list.add(item);
|
||||
qty = qty+((JSONObject) o1).getDouble("vehicle_qty");
|
||||
if (o1.getIs_artificial()){
|
||||
return list;
|
||||
}
|
||||
qty = qty+o1.getDeviceinstor_qty();
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,12 @@
|
||||
<flow id="A1_SKQX" name="深坑清洗" sourceRef="A1_STLS" targetRef="end"></flow>
|
||||
<end id="end" name="Junior Reject End" sourceRef="A1_SKQX"></end>
|
||||
</process>
|
||||
<process id="XYXL" name="旋压下料">
|
||||
<start id="start" name="Starter" targetRef="A1_XYXL"></start>
|
||||
<flow id="A1_XYXL" name="无屑下料工序" has="1" sourceRef="starter" targetRef="A1_SKQX">
|
||||
<param id="cacheLine" value="A1_HCX_03"/>
|
||||
</flow>
|
||||
<flow id="A1_SKQX" name="深坑清洗" sourceRef="A1_XYXL" targetRef="end"></flow>
|
||||
<end id="end" name="Junior Reject End" sourceRef="A1_SKQX"></end>
|
||||
</process>
|
||||
</definitions>
|
||||
|
||||
Reference in New Issue
Block a user