# Conflicts:
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AgvInstService.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/controller/device/PdmBiDeviceController.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/controller/workorder/PdmProduceWorkorderController.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/sch/tasks/SpeMachinery/SpeEmpTask.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/sch/tasks/SpeMachinery/SpeFullTask.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/sch/tasks/TaskScheduleService.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/service/workorder/IPdmProduceWorkorderService.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/service/workorder/IPdmProduceWorkorderrecordService.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/service/workorder/dao/mapper/PdmProduceWorkorderrecordMapper.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/service/workorder/dao/mapper/xml/PdmProduceWorkorderrecordMapper.xml
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/service/workorder/dto/ReportQuery.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/service/workorder/impl/IPdmProduceWorkorderServiceImpl.java
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/product_manage/service/workorder/impl/PdmProduceWorkorderrecordServiceImpl.java
#	mes/qd/src/views/wms/storage_manage/semiproduct/semiProductIn/AddDialog.vue
This commit is contained in:
2023-05-29 08:58:58 +08:00
32 changed files with 1199 additions and 1053 deletions

View File

@@ -35,8 +35,6 @@ import org.springframework.web.bind.annotation.RestController;
})
@ServletComponentScan
@EnableTransactionManagement
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
@EnableMethodCache(basePackages = "org.nl")
@EnableCreateCacheAnnotation
@MapperScan("org.nl.**.mapper")

View File

@@ -24,10 +24,10 @@ public enum AcsTaskEnum {
TASK_PRODUCT_MAC("1","专机-专机满料任务"),
//3个点任务编号缓存线空载具列表
TASK_PRODUCT_CACHE("2","专机-缓存线满料任务"),
//3个点任务编号缓存线满料载具列表
TASK_CACHELINE_OUT("3","缓存线-专机出库任务"),
//专机到深坑任务:深坑业务单独处理
TASK_PRODUCT_WASH("4","专机-深坑任务"),
TASK_PRODUCT_WASH("3","专机-深坑任务"),
//3个点任务编号缓存线满料载具列表
TASK_CACHELINE_OUT("4","缓存线-专机出库任务"),
TASK_PLOTTER_MAC("5","刻字机-满料入库"),
TASK_PLOTTER_EMPTY("6","刻字机-呼叫空框"),
TASK_WARP_MAC("7","包装机-叫料出库"),
@@ -56,8 +56,8 @@ public enum AcsTaskEnum {
ACS_TASK_TYPE_NOBLE_DOUBLE_TASK("1","诺宝双工任务"),
ACS_TASK_TYPE_NOBLE_SINGLE_TASK("2","诺宝单工任务"),
ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK("3","诺宝入-任务"),
ACS_TASK_TYPE_NOBLE_DOUBLE_ENTRY_TASK("4","诺宝入-任务"),
ACS_TASK_TYPE_NOBLE_DOUBLE_ENTRY_TASK("3","诺宝入-任务"),
ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK("4","诺宝入-任务"),
ACS_TASK_TYPE_NOBLE_POINT_POINT_TASK("5","诺宝点对点任务"),
ACS_TASK_TYPE_WEIGHING_TASK_OF_PS20("6","PS20称重任务刻字-包装)"),
ACS_TASK_TYPE_NON_WEIGHING_TASK_OF_PS20("7","PS20不称重任务刻字-包装)"),

View File

@@ -15,65 +15,66 @@ import java.util.Arrays;
@AllArgsConstructor
public enum StatusEnum {
//枚举状态
STATUS_TRUE("1","",""),
STATUS_FLASE("0","",""),
STATUS_TRUE("1","","",null),
STATUS_FLASE("0","","",null),
//锁状态
LOCK_OFF("0","",""),
LOCK_ON("1","",""),
LOCK_OFF("0","","",null),
LOCK_ON("1","","",null),
//缓存线点位异常情况
CACHE_POINT_NORMAL("0","正常",""),
CACHE_POINT_ERROR("1","异常盘点",""),
CACHE_POINT_SCAN_ERROR("2","异常扫码",""),
CACHE_POINT_NORMAL("0","正常","",null),
CACHE_POINT_ERROR("1","异常盘点","",null),
CACHE_POINT_SCAN_ERROR("2","异常扫码","",null),
//缓存线载具状态 1-空位、2-绿色空箱、3-黄色满箱、4-红色异常、5不显示
CACHE_VEL_NORMAL("0","正常",""),
CACHE_VEL_NULL("1","空位",""),
CACHE_VEL_EMT("2","绿色空箱",""),
CACHE_VEL_FULL("3","黄色满箱",""),
CACHE_VEL_ERR("4","红色异常",""),
CACHE_VEL_DIS("5","不显示",""),
CACHE_VEL_NORMAL("0","正常","",null),
CACHE_VEL_NULL("1","空位","",null),
CACHE_VEL_EMT("2","绿色空箱","",null),
CACHE_VEL_FULL("3","黄色满箱","",null),
CACHE_VEL_ERR("4","红色异常","",null),
CACHE_VEL_DIS("5","不显示","",null),
//任务状态
TASK_CREATE("1","生成",""),
TASK_START_ERROR("2","点位确认异常",""),
TASK_CREATE("1","生成","",1),
TASK_START_ERROR("2","点位确认异常","",1<<2),
//TASK_END_P("3","确定终点",""),
TASK_START_END_P("4","起点和终点确认",""),
TASK_PUBLISH("5","下发",""),
TASK_RUNNING("6","运行",""),
TASK_FINISH("7","完成",""),
TASK_CANNEL("8","取消",""),
TASK_START_END_P("4","起点和终点确认","",1<<3),
TASK_PUBLISH("5","下发","",1<<4),
TASK_RUNNING("6","运行","",1<<5),
TASK_FINISH("7","完成","",1<<6),
TASK_CANNEL("8","取消","",1<<7),
//点位表位置状态
POINT_LOCATION_EMP("1","空料位",""),
POINT_LOCATION_REC("2","接料位",""),
POINT_LOCATION_FULL("3","满料位",""),
POINT_LOCATION_IN("4","上料位",""),
POINT_LOCATION_EMP("1","空料位","",null),
POINT_LOCATION_REC("2","接料位","",null),
POINT_LOCATION_FULL("3","满料位","",null),
POINT_LOCATION_IN("4","上料位","",null),
//出入料箱
IN_VEHICLE("1","入箱",""),
OUT_VEHICLE("2","出箱",""),
IN_VEHICLE("1","入箱","",null),
OUT_VEHICLE("2","出箱","",null),
//出入料箱
PAUSE_CACHELINE("1","暂停",""),
START_CACHELINE("2","启动",""),
PAUSE_CACHELINE("1","暂停","",null),
START_CACHELINE("2","启动","",null),
//设备状态枚举1-关机、2-开机、3-生产中、4-待机、5-故障
DEVICE_STATUS_OFF("1","关机",""),
DEVICE_STATUS_ON("2","开机",""),
DEVICE_STATUS_RUNING("3","生产中",""),
DEVICE_STATUS_WAITING("4","待机",""),
DEVICE_STATUS_ERROR("5","故障",""),
DEVICE_STATUS_OFF("1","关机","",null),
DEVICE_STATUS_ON("2","开机","",null),
DEVICE_STATUS_RUNING("3","生产中","",null),
DEVICE_STATUS_WAITING("4","待机","",null),
DEVICE_STATUS_ERROR("5","故障","",null),
// 点位表点位状态
POINT_STATUS_EMPTY("1", "空位", ""),
POINT_STATUS_FULL("2", "有料", ""),
POINT_STATUS_EMPTY_VEHICLE("3", "空载具", ""),
POINT_STATUS_EMPTY("1", "空位", "",null),
POINT_STATUS_FULL("2", "有料", "",null),
POINT_STATUS_EMPTY_VEHICLE("3", "空载具", "",null),
// 出入库分配明细状态
IOS_NOCREATE("00","未生成",""),
IOS_CREATE("01","生成",""),
IOS_RUNNING("02","执行中",""),
IOS_FINISH("99","完成",""),
IOS_NOCREATE("00","未生成","",null),
IOS_CREATE("01","生成","",null),
IOS_RUNNING("02","执行中","",null),
IOS_FINISH("99","完成","",null),
;
private String code;
private String desc;
private String ext;
private Integer bit;
}

View File

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.enums.AcsTaskEnum;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.MapOf;
import org.nl.modules.common.exception.BadRequestException;
@@ -51,8 +52,14 @@ public class AgvInstService {
private ISchBaseTaskService taskService;
@Autowired
private ISchCachelineVehicleService cachelineVehicleService;
@Autowired
private ISchCachelineVehicleService cachelineVe3hicleService;
public static void main(String[] args) {
String a= "A1_DC_15_6";
int i = a.lastIndexOf("_");
System.out.println(a.substring(0, i));
}
//满料请求点位确认
//1.判断当前设备路由表是否配置下一道路由设备,如果不是则说明直接到清洗
@@ -63,40 +70,64 @@ public class AgvInstService {
public void fullMaster(JSONObject task){
String quantity = task.getString("material_qty");
//获取当前生产工序下一道工序
Map<String,String> workprodure = basePointService.findDeviceWorkprodure(task.getString("point_code"));
FlowElement next = getFlowElement(task,workprodure).next();
String nextPoint = null;
//判断缓存线是不是去深坑清洗深坑区域15个点判断空的物料坑位
String cacheVehile = "";
Map query = MapOf.of("workprocedure_id", workprodure.get("workprocedure_id")
Map<String,String> workprodure = basePointService.findDeviceWorkprodure(task.getString("point_code1"));
FlowElement currentFlow = getFlowElement(task, workprodure);
FlowElement next = currentFlow.next();
Map query = MapOf.of("workprocedure_id", basePointService.getWorkprodureByCode(next.getId()).get("workprocedure_id")
, "qty", quantity);
//判断缓存线是不是去深坑清洗深坑区域15个点判断空的物料坑位
if (next.getName().equals("深坑清洗")){
query.put("material_id",task.getString("material_id"));
// query.put("qty",quantity) 深坑物料需要转重量
task.put("task_type",AcsTaskEnum.TASK_PRODUCT_WASH.getCode());
}
List<Map<String,String>> list = deviceService.workproceduceDevices(query);
List<Map<String,String>> list = deviceService.workproceduceDevices(query);
task.put("acs_task_type",AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode());
task.put("is_send","1");
String nextPoint = null;
String cacheVehile = "";
if (!CollectionUtils.isEmpty(list)){
nextPoint = list.get(0).get("point_code");
}else {
if (next.getParams().get("cacheLine") == null){
if (currentFlow.getParams().get("cacheLine") == null){
throw new BadRequestException("当前任务下一道工序无可用设备");
}
nextPoint = next.getParams().get("cacheLine");
nextPoint = getParamByXml(workprodure, currentFlow, nextPoint);
task.put("task_type",AcsTaskEnum.TASK_PRODUCT_CACHE.getCode());
task.put("acs_task_type",AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK.getCode());
cacheVehile = getCacheVehile(nextPoint, null);
}
if (StringUtils.isBlank(nextPoint)){
throw new BadRequestException("逻辑非配错误,请检查代码");
结果校验:{
if (StringUtils.isBlank(nextPoint)) {
throw new BadRequestException("逻辑非配错误,请检查代码");
}
}
basePointService.update(new UpdateWrapper<SchBasePoint>()
.set("lock_type",StatusEnum.LOCK_ON.getCode()).set("task_id",task.getString("task_id")).eq("point_code",nextPoint));
// basePointService.update(new UpdateWrapper<SchBasePoint>()
// .set("lock_type",StatusEnum.LOCK_ON.getCode()).set("task_id",task.getString("task_id")).eq("point_code",nextPoint));
SchBaseTask schBaseTask = task.toJavaObject(SchBaseTask.class);
schBaseTask.setVehicle_code(cacheVehile);
schBaseTask.setBarcodeArr(cacheVehile);
schBaseTask.setPoint_code2(nextPoint);
schBaseTask.setTask_status(StatusEnum.TASK_START_END_P.getCode());
schBaseTask.setUpdate_time(new Date());
taskService.updateById(schBaseTask);
};
}
private String getParamByXml(Map<String, String> workprodure, FlowElement next, String nextPoint) {
Object cacheLine = next.getParams().get("cacheLine");
if (cacheLine instanceof String){
nextPoint = (String) cacheLine;
}
if (cacheLine instanceof Map){
nextPoint = ((Map<String, String>) cacheLine).get(workprodure.get("device_code").substring(0, workprodure.get("device_code").lastIndexOf("_")));
}
return nextPoint;
}
;
public FlowElement getFlowElement(JSONObject task,Map<String,String> workprodure){
if (CollectionUtils.isEmpty(workprodure)){
@@ -109,7 +140,7 @@ public class AgvInstService {
.eq("is_delete", "0")
.eq("is_used", "1")
);
SchProcessRoute processRoute = schProcessRouteService.findByMaterialId(material_id,devicePoint.getRegion_code());
SchProcessRoute processRoute = schProcessRouteService.findByMaterialId(devicePoint.getRegion_code());
if (processRoute == null){
throw new BadRequestException("当前没有配置对应工序调度线路:"+material_id+"/"+devicePoint.getRegion_code());
}
@@ -126,29 +157,22 @@ public class AgvInstService {
//3.agv根据对应载具列表行进扫码匹配匹配到对应物料则创建点对点任务
public void empMatter(JSONObject task){
//参数
String targetDevice = task.getString("next_point_code");
String material_id = task.getString("material_id");
SchBasePoint devicePoint = basePointService.getOne(new QueryWrapper<SchBasePoint>()
.eq("point_code", targetDevice)
.eq("is_delete", "0")
.eq("is_used", "1"));
JSONObject cacheLine = WQLObject.getWQLObject("SCH_cacheLine_region_relation").query("region_code = '"+devicePoint.getRegion_code()+"' and is_active = '"+StatusEnum.STATUS_TRUE.getCode()+"'").uniqueResult(0);
Assert.notNull(cacheLine, String.format("区域%s对应缓存线信息不存在", devicePoint.getRegion_code()));
//缓存线位置编码 :缺料请求获取缓存线满载具列表
String startPoint = cacheLine.getString("cacheline_code");
String cacheVehile = getCacheVehile(startPoint, material_id);
String startPoint = task.getString("cacheLine");
String cacheVehile = getCacheVehile(startPoint, task.getString("material_id"));
if (StringUtils.isBlank(cacheVehile)) {
throw new BadRequestException("缓存线:"+startPoint+"没有物料"+material_id+"对应可用载具");
throw new BadRequestException("缓存线:"+startPoint+"没有物料"+task.getString("material_id")+"对应可用载具");
}
//判断当前物料载具已经任务分配数量:如果>物料已经分配任务。说明满了,不允许再分配
List<SchBaseTask> allocateTask = taskService.list(new QueryWrapper<SchBaseTask>().eq("point_code1", startPoint).eq("material_id", material_id).lt("task_status", StatusEnum.TASK_FINISH.getCode()));
List<SchBaseTask> allocateTask = taskService.list(new QueryWrapper<SchBaseTask>().eq("point_code1", startPoint).eq("material_id", task.getString("material_id")).lt("task_status", StatusEnum.TASK_FINISH.getCode()));
if (allocateTask.size()>=cacheVehile.split(",").length){
log.error("callMatter 缓存线:{}上含有物料:{}的载具分配完任务id:{}",startPoint,material_id,allocateTask.stream().map(SchBaseTask::getTask_id).collect(Collectors.joining(",")));
throw new BadRequestException(String.format("缓存线%s上含物料%s的载具已分配完",startPoint,material_id));
log.error("callMatter 缓存线:{}上含有物料:{}的载具分配完任务id:{}",startPoint,task.getString("material_id"),allocateTask.stream().map(SchBaseTask::getTask_id).collect(Collectors.joining(",")));
throw new BadRequestException(String.format("缓存线%s上含物料%s的载具已分配完",startPoint,task.getString("material_id")));
}
SchBaseTask schBaseTask = task.toJavaObject(SchBaseTask.class);
schBaseTask.setVehicle_code(cacheVehile);
schBaseTask.setBarcodeArr(cacheVehile);
schBaseTask.setPoint_code1(startPoint);
schBaseTask.setIs_send(true);
schBaseTask.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK.getCode());
schBaseTask.setPoint_code3(startPoint);
schBaseTask.setTask_status(StatusEnum.TASK_START_END_P.getCode());
schBaseTask.setUpdate_time(new Date());
@@ -157,12 +181,14 @@ public class AgvInstService {
}
public String getCacheVehile(String cacheLine,String materialId){
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));
if (vehicle.size()>0){
if (vehicle.size()>count){
return vehicle.stream().map(SchCachelineVehicle::getVehicle_code).collect(Collectors.joining(","));
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));
if (vehicle.size()>0){
if (vehicle.size()>count){
return vehicle.stream().map(SchCachelineVehicle::getVehicle_code).collect(Collectors.joining(","));
}
}
}
return "";

View File

@@ -32,8 +32,11 @@ public class WmsToAcsServiceImpl implements WmsToAcsService{
, "next_point_code", task.getString("point_code3")//空盘返回点
, "task_group_id", StringUtils.isBlank(task.getString("task_group_id"))? IdUtil.getStringId():task.getString("task_group_id")
, "priority", task.getString("priority")
, "is_send", task.getString("is_send")
, "is_send", task.getBoolean("is_send")?"1":"0"
, "vehicle_code", task.getString("vehicle_code")
, "quantity", task.getString("material_qty")
, "barcodeArr", task.getString("barcodeArr")
, "proprity_floor", "2"
, "agv_system_type", task.getString("agv_system_type")
));
form.add(param);

View File

@@ -0,0 +1,39 @@
package org.nl.wms.product_manage;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.utils.MapOf;
import org.nl.modules.common.exception.BadRequestException;
import java.util.Map;
/*
* @author ZZQ
* @Date 2023/5/4 20:11
*/
@AllArgsConstructor
@Getter
public enum ReportEnum {
//出入库类型
REPORT_STATUS(MapOf.of("生成", "1", "报工", "2","报工审核","3")),
;
private Map<String, String> code;
public String code(String desc) {
String code = this.getCode().get(desc);
if (StringUtils.isNotEmpty(code)) {
return code;
}
throw new BadRequestException(this.name() + "对应类型" + desc + "未定义");
}
public String check(String code) {
for (Map.Entry<String, String> entry : this.getCode().entrySet()) {
if (entry.getValue().equals("code")) {
return entry.getValue();
}
}
throw new BadRequestException(this.name() + "对应类型" + code + "未定义");
}
}

View File

@@ -1,15 +1,20 @@
package org.nl.wms.product_manage.controller.device;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.utils.SecurityUtils;
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.service.device.dto.DeviceQuery;
import org.nl.wms.product_manage.备份pdm.service.DeviceService;
import org.nl.wms.product_manage.备份pdm.service.dto.DeviceDto;
import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +24,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
@@ -38,9 +44,19 @@ public class PdmBiDeviceController {
@GetMapping
@Log("查询生产设备")
@ApiOperation("查询生产设备")
//@PreAuthorize("@el.check('device:list')")
public ResponseEntity<Object> query(@RequestParam Map whereJson, Pageable page){
return new ResponseEntity<>(deviceService.queryAll(whereJson,page),HttpStatus.OK);
@SaIgnore
public ResponseEntity<Object> query(DeviceQuery query, PageQuery page){
Page<PdmBiDevice> result = iDeviceService.page(page.build(PdmBiDevice.class), query.build());
return new ResponseEntity<>(TableDataInfo.build(result),HttpStatus.OK);
}
@PostMapping("/list")
@Log("查询生产设备列表")
@ApiOperation("查询生产设备列表")
@SaIgnore
public ResponseEntity<Object> queryList(@RequestBody DeviceQuery query){
List<Map<String, Object>> list = iDeviceService.listMaps(query.build().select("device_code", "device_name"));
return new ResponseEntity<>(TableDataInfo.build(list),HttpStatus.OK);
}
@PostMapping

View File

@@ -1,6 +1,7 @@
package org.nl.wms.product_manage.controller.workorder;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -15,6 +16,7 @@ import org.nl.common.utils.SecurityUtils;
import org.nl.wms.product_manage.service.device.IPdmBiDeviceService;
import org.nl.wms.product_manage.service.workorder.IPdmProduceWorkorderService;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder;
import org.nl.wms.product_manage.service.workorder.dto.ReportQuery;
import org.nl.wms.product_manage.service.workorder.dto.WorkorderQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@@ -92,9 +94,6 @@ public class PdmProduceWorkorderController {
if (ids != null && ids.length > 0){
iPdmProduceWorkorderService.update(new UpdateWrapper<PdmProduceWorkorder>()
.set("is_delete",true)
.set("update_id", SecurityUtils.getCurrentUserId())
.set("update_name",SecurityUtils.getCurrentNickName())
.set("update_time",new Date())
.in("workorder_id", Arrays.asList(ids)));
}
return new ResponseEntity<>(HttpStatus.OK);
@@ -146,5 +145,17 @@ public class PdmProduceWorkorderController {
}
@PostMapping("/reportQuery")
@Log("报工数修改")
@ApiOperation("报工数修改")
@SaIgnore
public ResponseEntity<Object> reportQuery(@RequestBody ReportQuery param) {
return new ResponseEntity<>(TableDataInfo.build(iPdmProduceWorkorderService.reportQuery(param)),HttpStatus.OK);
}
}

View File

@@ -2,9 +2,11 @@ package org.nl.wms.product_manage.controller.workorder;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.utils.api.ResultCode;
@@ -13,6 +15,9 @@ import org.nl.wms.mps.service.ProduceshiftorderService;
import org.nl.wms.mps.service.dto.DeviceDto;
import org.nl.wms.product_manage.service.device.IPdmBiDeviceService;
import org.nl.wms.product_manage.service.workorder.IPdmProduceWorkorderService;
import org.nl.wms.product_manage.service.workorder.IPdmProduceWorkorderrecordService;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorderrecord;
import org.nl.wms.product_manage.service.workorder.impl.PdmProduceWorkorderrecordServiceImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -33,8 +38,10 @@ import java.util.Map;
@Slf4j
public class ProduceshiftorderController{
private final ProduceshiftorderService produceshiftorderService;
private final IPdmProduceWorkorderService iPdmProduceWorkorderService;
private final IPdmBiDeviceService pdmBiDeviceService;
private final IPdmProduceWorkorderrecordService workorderrecordService;
@PostMapping("/getDevice")
@@ -69,7 +76,8 @@ public class ProduceshiftorderController{
if(null == param) {
throw new BizCoreException(ResultCode.VALIDATE_FAILED);
}
return new ResponseEntity<>(produceshiftorderService.getOrderList(param, page), HttpStatus.OK);
List<Map> list = iPdmProduceWorkorderService.getOrderList(param, page);
return new ResponseEntity<>(TableDataInfo.build(list), HttpStatus.OK);
}
@PostMapping("/openStart")
@@ -93,6 +101,23 @@ public class ProduceshiftorderController{
iPdmProduceWorkorderService.finish(param);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/deleteReport")
@Log("deleteReport")
@ApiOperation("deleteReport")
public ResponseEntity<Object> deleteReport(@RequestBody JSONObject param) {
workorderrecordService.removeById(param.getString("macoperate_id"));
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/updateReport")
@Log("报工数修改")
@ApiOperation("报工数修改")
public ResponseEntity<Object> updateReport(@RequestBody JSONObject param) {
iPdmProduceWorkorderService.updateReport(param);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/getReportWork")
@Log("获取当前报工记录")
@@ -118,6 +143,7 @@ public class ProduceshiftorderController{
return new ResponseEntity<>(HttpStatus.OK);
}
@GetMapping("/getUser")
@Log("查询操作人员")
@ApiOperation("查询操作人员")

View File

@@ -4,6 +4,10 @@ package org.nl.wms.product_manage.sch.manage;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask;
import java.util.ArrayList;
import java.util.List;
/**
@@ -25,14 +29,16 @@ public abstract class AbstractAcsTask {
public abstract String createTask(JSONObject param);
public abstract void cancel(String task_id);
public abstract void pointConfirm(JSONObject param);
public void notifyAcs(JSONArray param){};
public List<SchBaseTask> schedulerTask(List<SchBaseTask> tasks){
return new ArrayList<>();
};

View File

@@ -1,114 +0,0 @@
package org.nl.wms.product_manage.sch.rest;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.anno.Log;
import org.nl.wms.product_manage.sch.service.PointService;
import org.nl.wms.product_manage.sch.service.dto.PointDto;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* @author ldjun
* @date 2021-08-19
**/
//@RestController
@RequiredArgsConstructor
//@Api(tags = "点位管理")
//@RequestMapping("/api/point")
//@Slf4j
public class PointController {
private final PointService pointService;
@GetMapping
@Log("查询点位")
@ApiOperation("查询点位")
//@SaCheckPermission("point:list")
public ResponseEntity<Object> query(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(pointService.queryAll(whereJson, page), HttpStatus.OK);
}
@PostMapping
@Log("新增点位")
@ApiOperation("新增点位")
//@SaCheckPermission("point:add")
public ResponseEntity<Object> create(@Validated @RequestBody PointDto dto) {
pointService.create(dto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改点位")
@ApiOperation("修改点位")
//@SaCheckPermission("point:edit")
public ResponseEntity<Object> update(@Validated @RequestBody PointDto dto) {
pointService.update(dto);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除点位")
@ApiOperation("删除点位")
//@SaCheckPermission("point:del")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody Long[] ids) {
pointService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@PutMapping("/changeActive")
@Log("修改点位启用状态")
@ApiOperation("修改点位启用状态")
//@SaCheckPermission("store:edit")
public ResponseEntity<Object> update(@RequestBody JSONObject json) {
pointService.changeActive(json);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/getPoint")
@Log("查询点位下拉框")
@ApiOperation("查询点位下拉框")
//@SaCheckPermission("materialtype:list")
public ResponseEntity<Object> queryPoint(@RequestBody Map whereJson) {
return new ResponseEntity<>(pointService.getPoint(whereJson), HttpStatus.OK);
}
@GetMapping("/selectPoint")
@Log("查询点位管理")
@ApiOperation("查询点位管理")
//@SaCheckPermission("Point:list")
public ResponseEntity<Object> selectPoint(@RequestParam Map whereJson, Pageable page){
return new ResponseEntity<>(pointService.selectPoint(whereJson,page),HttpStatus.OK);
}
@GetMapping("/getRegion")
@Log("获取区域")
@ApiOperation("获取区域")
public ResponseEntity<Object> getRegion(){
return new ResponseEntity<>(pointService.getRegion(),HttpStatus.OK);
}
@Log("启动与禁用")
@PostMapping("/changeUsed")
@ApiOperation("启动与禁用")
public ResponseEntity<Object> changeUsedOn(@RequestBody JSONObject jsonObject) {
pointService.changeUsed(jsonObject);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("锁定与解锁")
@PostMapping("/changeLock")
@ApiOperation("锁定与解锁")
public ResponseEntity<Object> changeLock(@RequestBody JSONObject jsonObject) {
pointService.changeLock(jsonObject);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}

View File

@@ -1,99 +0,0 @@
package org.nl.wms.product_manage.sch.rest;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.anno.Log;
import org.nl.wms.product_manage.sch.service.RegionService;
import org.nl.wms.product_manage.sch.service.dto.RegionDto;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* @author lyd
* @date 2023-03-17
**/
//@RestController
@RequiredArgsConstructor
//@Api(tags = "区域管理管理")
//@RequestMapping("/api/region")
//@Slf4j
public class RegionController {
private final RegionService regionService;
@GetMapping
@Log("查询区域管理")
@ApiOperation("查询区域管理")
//@SaCheckPermission("region:list")
public ResponseEntity<Object> query(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(regionService.queryAll(whereJson, page), HttpStatus.OK);
}
@GetMapping("/getPointQuery")
@Log("获取可用点位")
@ApiOperation("获取可用点位")
//@SaCheckPermission("region:list")
public ResponseEntity<Object> getPointQuery(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(regionService.getPointQuery(whereJson, page), HttpStatus.OK);
}
@PostMapping
@Log("新增区域管理")
@ApiOperation("新增区域管理")
//@SaCheckPermission("region:add")
public ResponseEntity<Object> create(@Validated @RequestBody RegionDto dto) {
regionService.create(dto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改区域管理")
@ApiOperation("修改区域管理")
//@SaCheckPermission("region:edit")
public ResponseEntity<Object> update(@Validated @RequestBody RegionDto dto) {
regionService.update(dto);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除区域管理")
@ApiOperation("删除区域管理")
//@SaCheckPermission("region:del")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody String[] codes) {
regionService.deleteAll(codes);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/getPointStatusSelectByCode")
@Log("获取点位状态下拉框")
@ApiOperation("获取点位状态下拉框")
//@SaCheckPermission("region:add")
public ResponseEntity<Object> getPointStatusSelectByCode(@RequestBody String region_code) {
return new ResponseEntity<>(regionService.getPointStatusSelectByCode(region_code), HttpStatus.CREATED);
}
@PostMapping("/getPointTypeSelectByCode")
@Log("获取点位类型下拉框")
@ApiOperation("获取点位类型下拉框")
//@SaCheckPermission("region:add")
public ResponseEntity<Object> getPointTypeSelectByCode(@RequestBody String region_code) {
return new ResponseEntity<>(regionService.getPointTypeSelectByCode(region_code), HttpStatus.CREATED);
}
@PostMapping("/getRegionSelect")
@Log("获取区域下拉框")
@ApiOperation("获取区域下拉框")
public ResponseEntity<Object> getRegionSelect(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(regionService.getRegionSelect(whereJson), HttpStatus.CREATED);
}
}

View File

@@ -1,119 +0,0 @@
package org.nl.wms.product_manage.sch.rest;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.nl.common.anno.Log;
import lombok.extern.slf4j.Slf4j;
import org.nl.wms.system_manage.service.dict.ISysDictService;
import org.nl.wms.system_manage.service.dict.dao.Dict;
import org.nl.wms.product_manage.sch.manage.FinishTypeEnum;
import org.nl.wms.product_manage.sch.service.TaskService;
import org.nl.wms.product_manage.sch.service.dto.TaskDto;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* @author ldjun
* @date 2021-08-19
**/
@RestController
@RequiredArgsConstructor
@Api(tags = "任务管理")
@RequestMapping("/api/task")
@Slf4j
public class TaskController {
private final TaskService taskService;
private final ISysDictService dictService;
@GetMapping
@Log("查询任务")
@ApiOperation("查询任务")
//@PreAuthorize("@el.check('task:list')")
public ResponseEntity<Object> query(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(taskService.queryAll(whereJson, page), HttpStatus.OK);
}
@PostMapping
@Log("新增任务")
@ApiOperation("新增任务")
//@PreAuthorize("@el.check('task:add')")
public ResponseEntity<Object> create(@Validated @RequestBody TaskDto dto) {
taskService.create(dto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改任务")
@ApiOperation("修改任务")
//@PreAuthorize("@el.check('task:edit')")
public ResponseEntity<Object> update(@Validated @RequestBody TaskDto dto) {
taskService.update(dto);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除任务")
@ApiOperation("删除任务")
//@PreAuthorize("@el.check('task:del')")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody String[] ids) {
taskService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@GetMapping("/taskStatus")
@Log("获取任务状态列表")
@ApiOperation("获取任务状态列表")
public ResponseEntity<Object> getTaskStatus() {
return new ResponseEntity<>(dictService.list(new LambdaQueryWrapper<Dict>()
.eq(Dict::getCode, "task_status")), HttpStatus.OK);
}
@PostMapping("/taskType")
@Log("获取任务类型列表")
@ApiOperation("获取任务类型列表")
public ResponseEntity<Object> getTaskType() {
return new ResponseEntity<>(taskService.getTaskTypes(), HttpStatus.OK);
}
@GetMapping("/acsTaskType")
@Log("获取acs任务类型列表")
@ApiOperation("获取acs任务类型列表")
public ResponseEntity<Object> getAcsTaskType() {
return new ResponseEntity<>(taskService.getAcsTaskType(), HttpStatus.OK);
}
@GetMapping("/finishType")
@Log("获取任务类型列表")
@ApiOperation("获取任务类型列表")
public ResponseEntity<Object> getFinishType() {
FinishTypeEnum[] values = FinishTypeEnum.values();
JSONArray arr = new JSONArray();
for (FinishTypeEnum value : values) {
JSONObject json = new JSONObject();
json.put("code", value.getCode());
json.put("name", value.getName());
arr.add(json);
}
return new ResponseEntity<>(arr, HttpStatus.OK);
}
@PutMapping("/operation")
@Log("任务操作")
@ApiOperation("任务操作")
//@PreAuthorize("@el.check('task:edit')")
public ResponseEntity<Object> update(@RequestBody Map<String, Object> map) {
taskService.operation(map);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}

View File

@@ -207,6 +207,14 @@ public class TaskServiceImpl implements TaskService {
cancel.add(res2);
acsToWmsService.receiveTaskStatusAcs(JSON.toJSONString(cancel));
break;
case "delete":
JSONArray delete = new JSONArray();
JSONObject res3 = new JSONObject();
res3.put("task_id", task_id);
res3.put("status", AcsTaskEnum.STATUS_CANNEL.getCode());
delete.add(res3);
acsToWmsService.receiveTaskStatusAcs(JSON.toJSONString(delete));
break;
default: break;
}
}

View File

@@ -1,12 +1,16 @@
package org.nl.wms.product_manage.sch.tasks.SpeMachinery;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.Nullable;
import org.nl.common.enums.AcsTaskEnum;
import org.nl.common.enums.InterfaceLogType;
import org.nl.common.enums.StatusEnum;
@@ -14,16 +18,28 @@ import org.nl.common.utils.MapOf;
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.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.ext.acs.service.impl.AgvInstService;
import org.nl.wms.product_manage.sch.manage.AbstractAcsTask;
import org.nl.wms.product_manage.sch.manage.TaskStatusEnum;
import org.nl.wms.product_manage.service.workorder.IPdmProduceWorkorderService;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder;
import org.nl.wms.scheduler_manage.service.cacheline.ISchCachelineVehilematerialService;
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;
import org.nl.wms.scheduler_manage.service.scheduler.labelConverter.impl.FlowElement;
import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService;
import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask;
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.util.HashMap;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
* 专机任务
@@ -31,16 +47,25 @@ import java.util.Map;
@Slf4j
@Service
public class SpeEmpTask extends AbstractAcsTask {
@Autowired
private IPdmProduceWorkorderService workorderService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private AgvInstService agvInstService;
@Autowired
private ISchBasePointService basePointService;
@Autowired
private ISchCachelineVehilematerialService cacheLineVechileService;
@Autowired
AgvInstService agvInstService;
private ISchProcessRouteService schProcessRouteService;
private final Map<String,SpeStatusHandler > SpeHandles= new HashMap<>();
private static String OPT_NAME = "ACS回调# ";
public SpeEmpTask() {
SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_MAC.name() ,new Spe2Spe());
SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_CACHE.name() ,new Spe2Cache());
SpeHandles.put(AcsTaskEnum.TASK_CACHELINE_OUT.name() ,new Cache2Spe());
}
@@ -62,28 +87,32 @@ public class SpeEmpTask extends AbstractAcsTask {
@Override
@Transactional
public String createTask(JSONObject param) {
String point_code = param.getString("device_code");
String quantity = param.getString("quantity");
String type = param.getString("type");
JSONObject order = WQLObject.getWQLObject("PDM_produce_workOrder").query("workorder_code = '" + param.getString("workorder_code") + "' and is_delete = 0 and workorder_status != "+StatusEnum.TASK_FINISH.getCode()).uniqueResult(0);
Assert.notNull(order, String.format("下发工单%s不存在未完成工单", param.getString("workorder_code")));
JSONArray chectIndDatabase = WQLObject.getWQLObject("SCH_BASE_Task").query((AcsTaskEnum.REQUEST_CALLTYPE_FULL.getCode().equals(type) ? "point_code1" : "point_code2") + "= '" + point_code + "' and task_status < " + StatusEnum.TASK_FINISH.getCode()).getResultJSONArray(0);
if (ObjectUtil.isNotEmpty(chectIndDatabase)){
Assert.notNull(order, String.format("设备%s存在未完成任务", param.getString("point_code")));
//{"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>()
.eq("workorder_code", param.getString("workorder_code"))
.lt("workorder_status", StatusEnum.TASK_FINISH.getCode()));
Assert.notNull(one, String.format("下发工单%s不存在未完成工单", param.getString("workorder_code")));
List<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>()
.eq("point_code2", param.getString("device_code")).lt("task_status", StatusEnum.TASK_FINISH.getCode())
);
if (!CollectionUtils.isEmpty(list)){
throw new BadRequestException(String.format("设备%s存在未完成任务", param.getString("device_code")));
}
JSONObject form = new JSONObject(MapOf.of("start_point_code","",
"next_point_code",point_code,"return_point_code", "","vehicle_code",
"","product_area",order.getString("product_area"),"quantity", quantity,"type",type,"material_id", order.getString("material_id")));
String taskId = IdUtil.getSnowflake(1, 1).nextId() + "";
JSONObject form = new JSONObject(MapOf.of("start_point_code","",
"next_point_code",param.getString("device_code"),"return_point_code", "","vehicle_code",
"","product_area",one.getProduct_area(),"quantity", param.getString("quantity"),"type",param.getString("type"),"material_id", one.getMaterial_id()));
String taskId = IdUtil.getSnowflake(1, 1).nextId() + "";
JSONObject task = packageParam(form, taskId);
WQLObject.getWQLObject("SCH_BASE_Task").insert(task);
taskService.save(task.toJavaObject(SchBaseTask.class));
task.put("cacheLine",cahceLine);
try {
pointConfirm(task);
//下发
}catch (Exception ex){
log.error("SpeEmpTask#点位确认异常:{}",ex.getMessage());
task.put("task_status", TaskStatusEnum.SURE_START_ERROR.getCode());
task.put("remark",ex.getMessage());
WQLObject.getWQLObject("sch_base_task").update(task);
@@ -91,10 +120,39 @@ public class SpeEmpTask extends AbstractAcsTask {
return taskId;
}
@Nullable
private String getRouteXmlFlowByWorkprodure(JSONObject param) {
Map<String,String> workprodure = basePointService.findDeviceWorkprodure(param.getString("device_code"));
SchBasePoint devicePoint = basePointService.getOne(new QueryWrapper<SchBasePoint>()
.eq("point_code", param.getString("device_code"))
.eq("is_delete", "0")
.eq("is_used", "1")
);
FlowElement flowElement = schProcessRouteService.checkWorkprodure(workprodure.get("workprocedure_code"), devicePoint.getRegion_code());
if (flowElement == null){
log.error("SpeEmpTask#createTask 没有对应路由线路{},{}",workprodure.get("workprocedure_code"),devicePoint.getRegion_code());
throw new BadRequestException("缺料请求没有配置对应路由线路"+workprodure.get("workprocedure_code")+"——"+devicePoint.getRegion_code());
}
FlowElement pre = flowElement.pre();
if (pre == null || ObjectUtil.isEmpty(pre.getParams().get("cacheLine"))){
log.error("SpeEmpTask#createTask 没有配置缓存线{},{}",workprodure.get("workprocedure_code"),devicePoint.getRegion_code());
return null;
}
Object tmp_cahceLine = pre.getParams().get("cacheLine");
String cahceLine = null;
if (tmp_cahceLine instanceof String){
cahceLine = (String) tmp_cahceLine;
}
if (tmp_cahceLine instanceof Map){
cahceLine = ((Map<String, String>) tmp_cahceLine).get(workprodure.get("spec"));
}
return cahceLine;
}
private JSONObject packageParam(JSONObject form, String task_id) {
JSONObject task = new JSONObject();
参数封装:{
AcsTaskEnum taskEnum = AcsTaskEnum.getType(form.getString("type"), "REQUEST_");
AcsTaskEnum taskEnum = AcsTaskEnum.getType(form.getString("type"), "TASK_");
task.put("task_id", task_id);
task.put("task_name", taskEnum.getDesc());
task.put("task_code", CodeUtil.getNewCode("TASK_CODE"));
@@ -134,72 +192,6 @@ public class SpeEmpTask extends AbstractAcsTask {
interface SpeStatusHandler{
void handle(JSONObject param,String status,JSONObject task);
}
class Spe2Spe implements SpeStatusHandler{
@Override
public void handle(JSONObject param, String sta,JSONObject task) {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point");
WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device");
switch (status){
case STATUS_START:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
break;
case STATUS_FINISH:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
//到专机:更新设备上料位物料数量
String point_code2 = task.getString("point_code2");
JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0);
JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0);
task.getDouble("material_qty");
double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty");
deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'");
break;
case STATUS_CANNEL:
cancel(param.getString("task_id"));
break;
default:
log.error(OPT_NAME+"未定义任务状态:{}",sta);
throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta);
}
}
}
class Spe2Cache implements SpeStatusHandler{
@Override
public void handle(JSONObject param, String sta,JSONObject task) {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
String workprocedureCode = param.getString("workorder_code");
String inboxtxm = param.getString("inboxtxm");
String outboxtxm = param.getString("outboxtxm");
switch (status){
case STATUS_START:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'");
break;
case STATUS_FINISH:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
cacheVehTable.insert(MapOf.of("quantity", task.getString("material_qty"),
"material_id", task.getString("material_id"),
"vehicle_code", inboxtxm,
"vehicle_status", StatusEnum.CACHE_VEL_FULL.getCode(),
//工单,工序?
"workorder_code", workprocedureCode,
"create_time", DateUtil.now(),
"update_time", DateUtil.now()
//物料规格,物料名称 从物料信息表关联查询
));
break;
case STATUS_CANNEL:
cancel(param.getString("task_id"));
break;
default:
throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta);
}
}
}
class Cache2Spe implements SpeStatusHandler{
@Override
public void handle(JSONObject param, String sta,JSONObject task) {
@@ -208,12 +200,10 @@ public class SpeEmpTask extends AbstractAcsTask {
WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point");
WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device");
String outboxtxm = param.getString("outboxtxm");
switch (status){
case STATUS_START:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'");
break;
case STATUS_FINISH:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
@@ -238,4 +228,114 @@ public class SpeEmpTask extends AbstractAcsTask {
public void pointConfirm(JSONObject param) {
agvInstService.empMatter(param);
}
@Override
public List<SchBaseTask> schedulerTask(List<SchBaseTask> array) {
ArrayList<SchBaseTask> Merge = new ArrayList<>();
if (!CollectionUtils.isEmpty(array)){
String pointCollect = array.stream().map(a->a.getPoint_code1() + "','" + a.getPoint_code2()).collect(Collectors.joining("','"));
JSONArray needMergeCollect = WQL.getWO("sch_point").addParamMap(MapOf.of("flag", "5", "point_codes", "'" + pointCollect + "'")).process().getResultJSONArray(0);
//区域编号对应point_code
Map<String, List<Object>> pointRegionCollent = needMergeCollect.stream().collect(Collectors.groupingBy(o -> ((JSONObject) o).getString("point_code")));
Set<String> mergePointCollent = needMergeCollect.stream().map(item -> ((JSONObject) item).getString("point_code")).collect(Collectors.toSet());
//合并下发的任务
List<SchBaseTask> notMerge = new ArrayList<>();//单独下发的任务
List<SchBaseTask> waitingTask = new ArrayList<>();//可合并,但是只有单条任务
Map<String, String> taskGroupMap = new HashMap<>();
for (SchBaseTask task : array) {
String taskGroupId = org.nl.common.utils.IdUtil.getStringId();
String taskId = task.getTask_id();
task.setIs_send(true);
if (taskGroupMap.get(taskId) != null){
task.setTask_group_id(taskGroupMap.get(taskId));
task.setIs_send(false);
Merge.add(task);
continue;
}
String start = task.getPoint_code1();
String end = task.getPoint_code2();
taskGroupMap.put(taskId,taskGroupId);
task.setTask_group_id(taskGroupId);
//如果点位不属于查询出来可以合并点位集合:则单独下发集合
if (!mergePointCollent.contains(start) && !mergePointCollent.contains(end)){
notMerge.add(task);
continue;
}
//起点点位是否有多个合并任务点,如果没有则判断终点是否有多个合并任务点;都没有则说明当前起点终点对应区域只有一个任务:放入等待下发集合中
List<String> collect = taskGroupMap.keySet().stream().collect(Collectors.toList());
collect.add(taskId);
String mergeTargetId = getMergePoint(pointRegionCollent, start,end,array,collect);
if (mergeTargetId == null){
waitingTask.add(task);
continue;
}
//查询到相同区域可以合并的点位集合
taskGroupMap.put(mergeTargetId,taskGroupId);
Merge.add(task);
}
//开始下发处理waitingTask如果创建时间>2分钟则改单独下发
if (waitingTask.size()>0){
List<SchBaseTask> needPublish = waitingTask.stream().filter(a -> DateUtil.between(new Date(),a.getCreate_time(), DateUnit.MINUTE) >1 ).collect(Collectors.toList());
notMerge.addAll(needPublish);
}
String notMergeID = notMerge.stream().map(a -> a.getTask_id()).collect(Collectors.joining(","));
String waitingTaskId = waitingTask.stream().map(a -> a.getTask_id()).collect(Collectors.joining(","));
String MergeId = Merge.stream().map(a -> a.getTask_id()).collect(Collectors.joining(","));
log.info("TaskScheduleService#taskPublish notMerge:{},waitingTask:{},merge:{}",notMergeID,waitingTaskId,MergeId);
notMerge.forEach(a->{
a.setIs_send(true);
});
Merge.addAll(notMerge);
}
Map<String, List<SchBaseTask>> collect = Merge.stream().collect(Collectors.groupingBy(SchBaseTask::getTask_group_id));
ArrayList<SchBaseTask> result = new ArrayList<>();
for (List<SchBaseTask> value : collect.values()) {
updateAcsTaskType(value);
result.addAll(value);
}
return result;
}
private void updateAcsTaskType(List<SchBaseTask> value) {
if (value.size() > 1){
boolean tag = true;
for (SchBaseTask task : value) {
if (task.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK.getCode())){
task.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_ENTRY_TASK.getCode());
}
if (task.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode())){
task.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_TASK.getCode());
}
if (tag){task.setIs_send(true);tag = false;}else {task.setIs_send(false); }
}
}
}
private String getMergePoint(Map<String, List<Object>> pointRegionCollent, String start,String end,List<SchBaseTask> tasks,List<String> taskIds) {
String findpoint = findpoint(pointRegionCollent, start, tasks, taskIds);
if (findpoint == null){
findpoint = findpoint(pointRegionCollent, end, tasks, taskIds);
}
return findpoint;
}
private String findpoint(Map<String, List<Object>> pointRegionCollent, String start, List<SchBaseTask> tasks, List<String> taskIds) {
List<Object> objects = pointRegionCollent.get(start);
if (CollectionUtils.isEmpty(objects)){
return null;
}
JSONObject startPointInfo = (JSONObject) objects.get(0);
String startPointCollent = startPointInfo.getString("pointcollent");
String[] split = startPointCollent.split(",");
for (String s : split) {
Optional<SchBaseTask> any = tasks.stream().filter(a -> a.getPoint_code1().equals(s) && !taskIds.contains((a.getTask_id()))).findAny();
if (any.isPresent()){
return any.get().getTask_id();
}
}
return null;
}
}

View File

@@ -1,15 +1,17 @@
package org.nl.wms.product_manage.sch.tasks.SpeMachinery;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.enums.AcsTaskEnum;
import org.nl.common.enums.InterfaceLogType;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException;
@@ -19,12 +21,21 @@ import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.ext.acs.service.impl.AgvInstService;
import org.nl.wms.product_manage.sch.manage.AbstractAcsTask;
import org.nl.wms.product_manage.sch.manage.TaskStatusEnum;
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.service.workorder.IPdmProduceWorkorderService;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder;
import org.nl.wms.scheduler_manage.service.cacheline.ISchCachelineVehilematerialService;
import org.nl.wms.scheduler_manage.service.cacheline.dao.SchCachelineVehilematerial;
import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService;
import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask;
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.util.HashMap;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
* 专机任务
@@ -32,26 +43,38 @@ import java.util.Map;
@Slf4j
@Service
public class SpeFullTask extends AbstractAcsTask {
@Autowired
AgvInstService agvInstService;
private IPdmProduceWorkorderService workorderService;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private IPdmBiDeviceService deviceService;
@Autowired
private ISchCachelineVehilematerialService cacheLineVechileService;
@Autowired
private AgvInstService agvInstService;
private final Map<String,SpeStatusHandler > SpeHandles= new HashMap<>();
private static String OPT_NAME = "ACS回调# ";
private static String OPT_NAME = "ACS回调# ";
public SpeFullTask() {
SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_MAC.name() ,new Spe2Spe());
SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_CACHE.name() ,new Spe2Cache());
SpeHandles.put(AcsTaskEnum.TASK_CACHELINE_OUT.name() ,new Cache2Spe());
SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_WASH.name() ,new Spe2Wash());
}
@Override
@Transactional
public void updateTaskStatus(JSONObject param,String status) {
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
log.info(InterfaceLogType.ACS_TO_LMS.getDesc());
// 指令执行中
JSONObject task = taskTable.query("task_id = '" + param.getString("task_id") + "'").uniqueResult(0);
AcsTaskEnum taskType = AcsTaskEnum.getType(task.getString("task_type"),"TASK_");
SchBaseTask task = taskService.getById(param.getString("task_id"));
AcsTaskEnum taskType = AcsTaskEnum.getType(task.getTask_type(),"TASK_");
taskService.update(new UpdateWrapper<SchBaseTask>()
.set("task_status",status)
.set("update_name","acs")
.set("update_time",DateUtil.now()).eq("task_id",task.getTask_id()));
try {
SpeHandles.get(taskType.name()).handle(param,status,task);
}catch (Exception ex){
@@ -63,25 +86,27 @@ public class SpeFullTask extends AbstractAcsTask {
@Override
@Transactional
public String createTask(JSONObject param) {
String point_code = param.getString("device_code");
String quantity = param.getString("quantity");
String type = param.getString("type");
JSONObject order = WQLObject.getWQLObject("PDM_produce_workOrder").query("workorder_code = '" + param.getString("workorder_code") + "' and is_delete = 0 and workorder_status != "+StatusEnum.TASK_FINISH.getCode()).uniqueResult(0);
PdmProduceWorkorder order = workorderService.getOne(new QueryWrapper<PdmProduceWorkorder>()
.eq("workorder_code", param.getString("workorder_code"))
.eq("is_delete", false)
.lt("workorder_status", StatusEnum.TASK_FINISH.getCode()));
Assert.notNull(order, String.format("下发工单%s不存在未完成工单", param.getString("workorder_code")));
JSONArray chectIndDatabase = WQLObject.getWQLObject("SCH_BASE_Task").query((AcsTaskEnum.REQUEST_CALLTYPE_FULL.getCode().equals(type) ? "point_code1" : "point_code2") + "= '" + point_code + "' and task_status < " + StatusEnum.TASK_FINISH.getCode()).getResultJSONArray(0);
if (ObjectUtil.isNotEmpty(chectIndDatabase)){
Assert.notNull(order, String.format("设备%s存在未完成任务", param.getString("point_code")));
List<SchBaseTask> list = taskService.list(new QueryWrapper<SchBaseTask>()
.eq("point_code1", point_code).lt("task_status", StatusEnum.TASK_FINISH.getCode())
);
if (!CollectionUtils.isEmpty(list)){
throw new BadRequestException(String.format("设备%s存在未完成任务", param.getString("device_code")));
}
JSONObject empPoint = WQL.getWO("sch_point").addParamMap(MapOf.of("flag", "2", "point_code", point_code, "point_type", StatusEnum.POINT_LOCATION_EMP.getCode())).process().uniqueResult(0);
JSONObject form = new JSONObject(MapOf.of("start_point_code",point_code,
"next_point_code","","return_point_code", empPoint.getString("point_code"),"vehicle_code",
"","product_area",order.getString("product_area"),"quantity", quantity,"type",type,"material_id", order.getString("material_id")));
"","product_area",order.getProduct_area(),"quantity", quantity,"type",AcsTaskEnum.TASK_PRODUCT_MAC.getCode(),"material_id", order.getMaterial_id()));
String taskId = IdUtil.getSnowflake(1, 1).nextId() + "";
String taskId = IdUtil.getStringId();
JSONObject task = packageParam(form, taskId);
WQLObject.getWQLObject("SCH_BASE_Task").insert(task);
taskService.save(task.toJavaObject(SchBaseTask.class));
try {
pointConfirm(task);
//下发
@@ -96,7 +121,7 @@ public class SpeFullTask extends AbstractAcsTask {
private JSONObject packageParam(JSONObject form, String task_id) {
JSONObject task = new JSONObject();
参数封装:{
AcsTaskEnum taskEnum = AcsTaskEnum.getType(form.getString("type"), "REQUEST_");
AcsTaskEnum taskEnum = AcsTaskEnum.getType(form.getString("type"), "TASK_");
task.put("task_id", task_id);
task.put("task_name", taskEnum.getDesc());
task.put("task_code", CodeUtil.getNewCode("TASK_CODE"));
@@ -124,39 +149,33 @@ public class SpeFullTask extends AbstractAcsTask {
}
@Override
public void cancel(String taskId) {
log.info(OPT_NAME+"cancel taskID:{}",taskId);
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
//专机-专机
//专机-缓存线
//缓存线出库
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_CANNEL.getCode()),"task_id = '"+taskId+"'");
public void cancel(String taskId) { }
}
interface SpeStatusHandler{
void handle(JSONObject param,String status,JSONObject task);
void handle(JSONObject param,String status,SchBaseTask task);
}
class Spe2Spe implements SpeStatusHandler{
@Override
public void handle(JSONObject param, String sta,JSONObject task) {
public void handle(JSONObject param, String sta,SchBaseTask task) {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point");
WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device");
switch (status){
case STATUS_START:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
Map<String, String> extParam = (Map)param.get("ext_param");
// if (extParam.get("put_finish") != null){
// pointService.update(new UpdateWrapper<SchBasePoint>()
// .set("vehicle_code",task.getVehicle_code2())
// .eq("point_code",task.getPoint_code3()));
// }
// if (extParam.get("take_finish") != null){
// pointService.update(new UpdateWrapper<SchBasePoint>()
// .set("vehicle_code","")
// .eq("point_code",task.getPoint_code3()));
// pointService.update(new UpdateWrapper<SchBasePoint>()
// .set("vehicle_code",task.getVehicle_code2())
// .eq("point_code",task.getPoint_code1()));
// }
break;
case STATUS_FINISH:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
//到专机:更新设备上料位物料数量
String point_code2 = task.getString("point_code2");
JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0);
JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0);
task.getDouble("material_qty");
double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty");
deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'");
break;
case STATUS_CANNEL:
cancel(param.getString("task_id"));
@@ -169,30 +188,24 @@ public class SpeFullTask extends AbstractAcsTask {
}
class Spe2Cache implements SpeStatusHandler{
@Override
public void handle(JSONObject param, String sta,JSONObject task) {
public void handle(JSONObject param, String sta,SchBaseTask task) {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
String workprocedureCode = param.getString("workorder_code");
String inboxtxm = param.getString("inboxtxm");
String outboxtxm = param.getString("outboxtxm");
switch (status){
case STATUS_START:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'");
Map<String, String> extParam = (Map)param.get("ext_param");//outboxt inboxt
//outboxt箱子更新到任务表vechile_code2?
if (extParam.get("inboxt") != null){
SchCachelineVehilematerial vehilematerial = new SchCachelineVehilematerial();
vehilematerial.setVehmaterial_id(IdUtil.getStringId());
vehilematerial.setVehicle_code(extParam.get("inboxt"));
vehilematerial.setMaterial_id(task.getMaterial_id());
vehilematerial.setErr_type("0");
vehilematerial.setCreate_time(DateUtil.now());
vehilematerial.setQuantity(task.getMaterial_qty());
cacheLineVechileService.save(vehilematerial);
}
break;
case STATUS_FINISH:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
cacheVehTable.insert(MapOf.of("quantity", task.getString("material_qty"),
"material_id", task.getString("material_id"),
"vehicle_code", inboxtxm,
"vehicle_status", StatusEnum.CACHE_VEL_FULL.getCode(),
//工单,工序?
"workorder_code", workprocedureCode,
"create_time", DateUtil.now(),
"update_time", DateUtil.now()
//物料规格,物料名称 从物料信息表关联查询
));
break;
case STATUS_CANNEL:
cancel(param.getString("task_id"));
@@ -202,33 +215,25 @@ public class SpeFullTask extends AbstractAcsTask {
}
}
}
class Cache2Spe implements SpeStatusHandler{
class Spe2Wash implements SpeStatusHandler{
@Override
public void handle(JSONObject param, String sta,JSONObject task) {
public void handle(JSONObject param, String sta,SchBaseTask task) {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point");
WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device");
String outboxtxm = param.getString("outboxtxm");
switch (status){
case STATUS_START:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'");
Map<String, String> extParam = (Map)param.get("ext_param");
log.info("生坑到料完成:"+param.toString());
if (extParam.get("fall_finish") != null){
PdmBiDevice one = deviceService.getOne(new QueryWrapper<PdmBiDevice>().eq("device_code", task.getPoint_code2()));
deviceService.update(new UpdateWrapper<PdmBiDevice>()
.set("material_id", task.getMaterial_id())
.set("deviceinstor_qty",one.getDeviceinstor_qty().add(task.getMaterial_qty()))
.eq("device_code", task.getPoint_code2()));
}
break;
case STATUS_FINISH:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
String point_code2 = task.getString("point_code2");
JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0);
JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0);
task.getDouble("material_qty");
double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty");
deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'");
break;
case STATUS_CANNEL:
cancel(param.getString("task_id"));
break;
default:
throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta);
@@ -239,6 +244,109 @@ public class SpeFullTask extends AbstractAcsTask {
@Override
public void pointConfirm(JSONObject param) {
agvInstService.fullMaster(param);
}
@Override
public List<SchBaseTask> schedulerTask(List<SchBaseTask> array) {
ArrayList<SchBaseTask> Merge = new ArrayList<>();
if (!CollectionUtils.isEmpty(array)){
String pointCollect = array.stream().map(a->a.getPoint_code1() + "','" + a.getPoint_code2()).collect(Collectors.joining("','"));
JSONArray needMergeCollect = WQL.getWO("sch_point").addParamMap(MapOf.of("flag", "5", "point_codes", "'" + pointCollect + "'")).process().getResultJSONArray(0);
//区域编号对应point_code
Map<String, List<Object>> pointRegionCollent = needMergeCollect.stream().collect(Collectors.groupingBy(o -> ((JSONObject) o).getString("point_code")));
Set<String> mergePointCollent = needMergeCollect.stream().map(item -> ((JSONObject) item).getString("point_code")).collect(Collectors.toSet());
//合并下发的任务
List<SchBaseTask> notMerge = new ArrayList<>();//单独下发的任务
List<SchBaseTask> waitingTask = new ArrayList<>();//可合并,但是只有单条任务
Map<String, String> taskGroupMap = new HashMap<>();
for (SchBaseTask task : array) {
String taskGroupId = IdUtil.getStringId();
String taskId = task.getTask_id();
if (taskGroupMap.get(taskId) != null){
task.setTask_group_id(taskGroupMap.get(taskId));
Merge.add(task);
continue;
}
String start = task.getPoint_code1();
String end = task.getPoint_code2();
taskGroupMap.put(taskId,taskGroupId);
task.setTask_group_id(taskGroupId);
//如果点位不属于查询出来可以合并点位集合:则单独下发集合
if (!mergePointCollent.contains(start) && !mergePointCollent.contains(end)){
notMerge.add(task);
continue;
}
//起点点位是否有多个合并任务点,如果没有则判断终点是否有多个合并任务点;都没有则说明当前起点终点对应区域只有一个任务:放入等待下发集合中
List<String> collect = taskGroupMap.keySet().stream().collect(Collectors.toList());
collect.add(taskId);
String mergeTargetId = getMergePoint(pointRegionCollent, start,end,array,collect);
if (mergeTargetId == null){
waitingTask.add(task);
continue;
}
//查询到相同区域可以合并的点位集合
taskGroupMap.put(mergeTargetId,taskGroupId);
Merge.add(task);
}
//开始下发处理waitingTask如果创建时间>2分钟则改单独下发
if (waitingTask.size()>0){
List<SchBaseTask> needPublish = waitingTask.stream().filter(a -> DateUtil.between(new Date(),a.getCreate_time(), DateUnit.MINUTE) >1 ).collect(Collectors.toList());
notMerge.addAll(needPublish);
}
String notMergeID = notMerge.stream().map(a -> a.getTask_id()).collect(Collectors.joining(","));
String waitingTaskId = waitingTask.stream().map(a -> a.getTask_id()).collect(Collectors.joining(","));
String MergeId = Merge.stream().map(a -> a.getTask_id()).collect(Collectors.joining(","));
log.info("TaskScheduleService#taskPublish notMerge:{},waitingTask:{},merge:{}",notMergeID,waitingTaskId,MergeId);
Merge.addAll(notMerge);
}
Map<String, List<SchBaseTask>> collect = Merge.stream().collect(Collectors.groupingBy(SchBaseTask::getTask_group_id));
ArrayList<SchBaseTask> result = new ArrayList<>();
for (List<SchBaseTask> value : collect.values()) {
updateAcsTaskType(value);
result.addAll(value);
}
return result;
}
private void updateAcsTaskType(List<SchBaseTask> value) {
if (value.size() > 1){
boolean tag = true;
for (SchBaseTask task : value) {
if (task.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK.getCode())){
task.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_ENTRY_TASK.getCode());
}
if (task.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode())){
task.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_TASK.getCode());
}
if (tag){task.setIs_send(true);tag = false;}else {task.setIs_send(false); }
}
}
}
private String getMergePoint(Map<String, List<Object>> pointRegionCollent, String start,String end,List<SchBaseTask> tasks,List<String> taskIds) {
String findpoint = findpoint(pointRegionCollent, start, tasks, taskIds);
if (findpoint == null){
findpoint = findpoint(pointRegionCollent, end, tasks, taskIds);
}
return findpoint;
}
private String findpoint(Map<String, List<Object>> pointRegionCollent, String start, List<SchBaseTask> tasks, List<String> taskIds) {
List<Object> objects = pointRegionCollent.get(start);
if (CollectionUtils.isEmpty(objects)){
return null;
}
JSONObject startPointInfo = (JSONObject) objects.get(0);
String startPointCollent = startPointInfo.getString("pointcollent");
String[] split = startPointCollent.split(",");
for (String s : split) {
Optional<SchBaseTask> any = tasks.stream().filter(a -> a.getPoint_code1().equals(s) && !taskIds.contains((a.getTask_id()))).findAny();
if (any.isPresent()){
return any.get().getTask_id();
}
}
return null;
}
}

View File

@@ -4,7 +4,9 @@ import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.enums.AcsTaskEnum;
@@ -14,10 +16,15 @@ import org.nl.common.utils.MapOf;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.ext.acs.service.WmsToAcsService;
import org.nl.wms.product_manage.sch.manage.AbstractAcsTask;
import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService;
import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask;
import org.springframework.http.HttpStatus;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Method;
import java.util.*;
@@ -34,118 +41,56 @@ import java.util.stream.Collectors;
public class TaskScheduleService {
private ReentrantLock lock = new ReentrantLock();
private final WmsToAcsService wmsToAcsService;
private final WmsToAcsService wmsToAcsService;
private final ISchBaseTaskService taskService;
@SneakyThrows
@Scheduled(cron = "0/30 * * * * ?")
public void taskPublish(){
boolean islock = lock.tryLock();
try {
if (islock){
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
//查询所有自动下发的任务
JSONArray all = taskTable.query("is_auto_issue = '1' and task_status < '" + StatusEnum.TASK_PUBLISH.getCode() + "'").getResultJSONArray(0);
List<SchBaseTask> pointConfirmList = taskService.list(new QueryWrapper<SchBaseTask>().eq("is_auto_issue", "1").eq("is_delete",false).lt("task_status", StatusEnum.TASK_START_END_P.getCode()));
//进行起点终点确认:
if (all.size() == 0){
return;
}
log.info("TaskScheduleService#taskPublish all_task:{}",all.size());
Iterator<Object> iterator = all.iterator();
while (iterator.hasNext()){
JSONObject task = (JSONObject)iterator.next();
if (task.getString("task_status").equals(StatusEnum.TASK_START_END_P.getCode())){
continue;
}
try {
Class<?> clz = Class.forName(task.getString("handle_class"));
Object obj = clz.newInstance();
// 调用每个任务类的forceFinishInst()强制结束方法
Method m = obj.getClass().getDeclaredMethod("pointConfirm", JSONObject.class, String.class);
m.invoke(obj,task);
task.put("task_type", StatusEnum.TASK_START_END_P.getCode());
}catch (Exception ex){
task.put("task_type", StatusEnum.TASK_START_ERROR.getCode());
task.put("remark",ex.getMessage());
task.put("update_time",DateUtil.now());
taskTable.update(task);
iterator.remove();
if (pointConfirmList.size() > 0){
Iterator<SchBaseTask> iterator = pointConfirmList.iterator();
while (iterator.hasNext()){
SchBaseTask task =iterator.next();
try {
Object obj = SpringContextHolder.getBean(Class.forName(task.getHandle_class()));
// 调用每个任务类的forceFinishInst()强制结束方法
Method m = obj.getClass().getDeclaredMethod("pointConfirm", JSONObject.class);
m.invoke(obj,JSONObject.toJSON(task));
task.setTask_type(StatusEnum.TASK_START_END_P.getCode());
}catch (Exception ex){
task.setTask_type(StatusEnum.TASK_START_ERROR.getCode());
task.setRemark(ex.getMessage());
task.setUpdate_time(new Date());
taskService.updateById(task);
}
}
}
List<SchBaseTask> all = taskService.list(new QueryWrapper<SchBaseTask>().eq("is_auto_issue", "1").eq("is_delete",false).eq("task_status", StatusEnum.TASK_START_END_P.getCode()));
//分区域不同区域调用不同acs接口
Map<String, List<Object>> areaCollent = all.stream().collect(Collectors.groupingBy(o -> ((JSONObject) o).getString("product_area")));
Map<String, List<SchBaseTask>> areaCollent = all.stream().collect(Collectors.groupingBy(SchBaseTask::getProduct_area));
for (String area : areaCollent.keySet()) {
List<Object> array = areaCollent.get(area);
if (array.size()>0){
String pointCollect = array.stream().map(o -> ((JSONObject) o).getString("point_code1") + "','" + ((JSONObject) o).getString("point_code2")).collect(Collectors.joining("','"));
JSONArray needMergeCollect = WQL.getWO("sch_point").addParamMap(MapOf.of("flag", "5", "point_codes", "'" + pointCollect + "'")).process().getResultJSONArray(0);
//区域编号对应point_code
Map<String, List<Object>> pointRegionCollent = needMergeCollect.stream().collect(Collectors.groupingBy(o -> ((JSONObject) o).getString("point_code")));
Set<String> mergePointCollent = needMergeCollect.stream().map(item -> ((JSONObject) item).getString("point_code")).collect(Collectors.toSet());
//合并下发的任务
List<Object> notMerge = new ArrayList<>();//单独下发的任务
List<Object> Merge = new ArrayList<>();//单独下发的任务
List<Object> waitingTask = new ArrayList<>();//可合并,但是只有单条任务
Map<String, String> taskGroupMap = array.stream().filter(a-> StringUtils.isNotEmpty(((JSONObject)a).getString("task_group_id"))).collect(HashMap::new, (k, v) -> k.put(((JSONObject)v).getString("task_id"), ((JSONObject)v).getString("task_group_id")), HashMap::putAll);
for (Object o : array) {
String taskGroupId = IdUtil.getStringId();
JSONObject task = (JSONObject) o;
String taskId = task.getString("task_id");
task.put("is_send","1");
if (taskGroupMap.get(taskId) != null){
task.put("task_group_id",taskGroupMap.get(taskId));
task.put("is_send","0");
Merge.add(task);
continue;
}
String start = task.getString("point_code1");
String end = task.getString("point_code2");
taskGroupMap.put(taskId,taskGroupId);
task.put("task_group_id",taskGroupId);
//如果点位不属于查询出来可以合并点位集合:则单独下发集合
if (!mergePointCollent.contains(start) && !mergePointCollent.contains(end)){
notMerge.add(task);
continue;
}
//起点点位是否有多个合并任务点,如果没有则判断终点是否有多个合并任务点;都没有则说明当前起点终点对应区域只有一个任务:放入等待下发集合中
List<String> collect = taskGroupMap.keySet().stream().collect(Collectors.toList());
collect.add(taskId);
String mergeTargetId = getMergePoint(pointRegionCollent, start,end,array,collect);
if (mergeTargetId == null){
waitingTask.add(task);
continue;
}
//查询到相同区域可以合并的点位集合
taskGroupMap.put(mergeTargetId,taskGroupId);
Merge.add(task);
}
//开始下发处理waitingTask如果创建时间>2分钟则改单独下发
if (waitingTask.size()>0){
List<Object> needPublish = waitingTask.stream().filter(a -> DateUtil.between(new Date(),DateUtil.parseDateTime(((JSONObject)a).getString("create_time") ), DateUnit.MINUTE) >2 ).collect(Collectors.toList());
notMerge.addAll(needPublish);
}
String notMergeID = notMerge.stream().map(a -> ((JSONObject) a).getString("task_id")).collect(Collectors.joining(","));
String waitingTaskId = waitingTask.stream().map(a -> ((JSONObject) a).getString("task_id")).collect(Collectors.joining(","));
String MergeId = Merge.stream().map(a -> ((JSONObject) a).getString("task_id")).collect(Collectors.joining(","));
log.info("TaskScheduleService#taskPublish notMerge:{},waitingTask:{},merge:{}",notMergeID,waitingTaskId,MergeId);
notMerge.forEach(a->{
((JSONObject)a).put("acs_task_type", AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode());
});
Merge.addAll(notMerge);
JSONArray jsonArray = new JSONArray(Merge);
//批量更新任务状态is_send,task_group_id
for (Object task : Merge) {
JSONObject task1 = (JSONObject) task;
task1.put("update_name","schedule");
task1.put("update_time",DateUtil.now());
taskTable.update(task1,"task_id = '"+task1.getString("task_id")+"'");
}
//缓存线任务待确认是否生成多个
Map<String, Object> resp = wmsToAcsService.issueTaskToAcs(jsonArray);
// if (((int)resp.get("status")) == (HttpStatus.BAD_REQUEST.value())){
// Object errArr = resp.get("errArr");
// throw new BadRequestException(String.valueOf(resp.get("message")));
// }
Map<String, List<SchBaseTask>> listMap = areaCollent.get(area).stream().collect(Collectors.groupingBy(SchBaseTask::getHandle_class));
List<SchBaseTask> Merge = new ArrayList<>();
for (Map.Entry<String, List<SchBaseTask>> array : listMap.entrySet()) {
//调用不同实现
AbstractAcsTask taskHandler = (AbstractAcsTask)SpringContextHolder.getBean(Class.forName(array.getKey()));
Merge.addAll(taskHandler.schedulerTask(array.getValue()));
}
JSONArray arr = new JSONArray();
for (SchBaseTask task : Merge) {
task.setUpdate_name("schedule");
task.setUpdate_time(new Date());
taskService.updateById(task);
arr.add(JSONObject.toJSON(task));
}
Map<String, Object> resp = wmsToAcsService.issueTaskToAcs(arr);
}
}
}finally {
@@ -156,27 +101,4 @@ public class TaskScheduleService {
}
private String getMergePoint(Map<String, List<Object>> pointRegionCollent, String start,String end,List<Object> tasks,List<String> taskIds) {
String findpoint = findpoint(pointRegionCollent, start, tasks, taskIds);
if (findpoint == null){
findpoint = findpoint(pointRegionCollent, end, tasks, taskIds);
}
return findpoint;
}
private String findpoint(Map<String, List<Object>> pointRegionCollent, String start, List<Object> tasks, List<String> taskIds) {
List<Object> objects = pointRegionCollent.get(start);
JSONObject startPointInfo = (JSONObject) objects.get(0);
String startPointCollent = startPointInfo.getString("pointcollent");
String[] split = startPointCollent.split(",");
for (String s : split) {
Optional<Object> any = tasks.stream().filter(a -> ((JSONObject) a).getString("point_code1").equals(s) && !taskIds.contains(((JSONObject) a).getString("task_id"))).findAny();
if (any.isPresent()){
return ((JSONObject)any.get()).getString("task_id");
}
}
return null;
}
}

View File

@@ -4,13 +4,13 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.utils.OptionRecord;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder;
import org.nl.wms.product_manage.service.workorder.dto.ReportQuery;
import org.nl.wms.product_manage.service.workorder.dto.WorkorderQuery;
import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -90,6 +90,15 @@ public interface IPdmProduceWorkorderService extends IService<PdmProduceWorkorde
void excelImport(MultipartFile file, HttpServletRequest request);
/*----一体及接口---*/
/**
* 一体机工单列表
* @param param
* @param page
* @return
*/
List<Map> getOrderList(Map<String,String> param, Pageable page);
/**
* 开工操作
*
@@ -107,6 +116,9 @@ public interface IPdmProduceWorkorderService extends IService<PdmProduceWorkorde
Object report(JSONObject param);
void reportApprove(JSONArray param);
void updateReport(JSONObject param);
/**
* 工单更换设备
@@ -115,4 +127,7 @@ public interface IPdmProduceWorkorderService extends IService<PdmProduceWorkorde
*/
void replaceDevice(JSONObject param);
List<Map> reportQuery(ReportQuery query);
}

View File

@@ -2,6 +2,10 @@ package org.nl.wms.product_manage.service.workorder;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorderrecord;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.product_manage.service.workorder.dto.ReportQuery;
import java.util.List;
import java.util.Map;
/**
* <p>
@@ -13,4 +17,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IPdmProduceWorkorderrecordService extends IService<PdmProduceWorkorderrecord> {
List<Map> reportQuery(ReportQuery query);
}

View File

@@ -25,4 +25,6 @@ public interface PdmProduceWorkorderMapper extends BaseMapper<PdmProduceWorkorde
int batchUpdateByParam(@Param("event") List<Map> event, @Param("workorder_id")String workorder_id);
List<Map> orderList(Map qeury);
}

View File

@@ -71,6 +71,37 @@
</where>
order by record.seq_number
</select>
<select id="orderList" resultType="java.util.Map">
SELECT
mater.material_name,
mater.material_code,
mater.material_spec,
workorder.*,
workprocedure.workprocedure_name
FROM
pdm_produce_workorder workorder
LEFT JOIN md_me_materialbase mater ON workorder.material_id = mater.material_id
LEFT JOIN pdm_bi_workprocedure workprocedure ON workorder.workprocedure_id = workprocedure.workprocedure_id
WHERE
workorder.is_delete = false and workorder.workorder_status > 1
<if test="device_code != null and device_code != ''">
and workorder.device_code = #{device_code}
</if>
<if test="key_value != null and key_value != ''">
and (
workorder.workorder_code like %${key_value}% or
mater.material_name like%${key_value}% or
mater.material_code like %${key_value}%
)
</if>
<if test="realproducestart_date != null and realproducestart_date != ''">
and workorder.realproducestart_date >= #{realproducestart_date}
</if>
<if test="realproduceend_date != null and realproduceend_date != ''">
and #{realproduceend_date} >= workorder.realproducestart_date
</if>
order by workorder_code desc
</select>
<update id="batchUpdateByParam">
update PDM_produce_workOrder set

View File

@@ -1,7 +1,12 @@
package org.nl.wms.product_manage.service.workorder.dao.mapper;
import org.apache.ibatis.annotations.Param;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorderrecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.nl.wms.product_manage.service.workorder.dto.ReportQuery;
import java.util.List;
import java.util.Map;
/**
* <p>
@@ -13,4 +18,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface PdmProduceWorkorderrecordMapper extends BaseMapper<PdmProduceWorkorderrecord> {
List<Map> reportQuery(@Param("query")ReportQuery query);
}

View File

@@ -2,4 +2,32 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.product_manage.service.workorder.dao.mapper.PdmProduceWorkorderrecordMapper">
<select id="reportQuery" resultType="java.util.Map">
SELECT
wr.workorder_code,
sys_user.username as produce_person_name,
wr.device_code,
mb.material_name,
mb.material_spec,
mb.material_id,
re.*
FROM pdm_produce_workorderrecord re
INNER JOIN pdm_produce_workorder wr on re.workorder_id = wr.workorder_id
LEFT JOIN md_me_materialbase mb on mb.material_id = wr.material_id
LEFT JOIN sys_user on re.produce_person_id = sys_user.user_id
where wr.is_delete = false
<if test="query.device_code != null and query.device_code != ''">
and wr.device_code = #{query.device_code}
</if>
<if test="query.workorder_code != null and query.workorder_code != ''">
and wr.workorder_code = #{query.workorder_code}
</if>
<if test="query.start_time != null and query.start_time != ''">
and wr.realproducestart_date >= #{query.start_time}
</if>
<if test="query.end_time != null and query.end_time != ''">
and #{query.end_time} >= wr.realproducestart_date
</if>
order by workorder_code desc,seq_number asc
</select>
</mapper>

View File

@@ -0,0 +1,25 @@
package org.nl.wms.product_manage.service.workorder.dto;
import lombok.Data;
import org.nl.common.domain.query.BaseQuery;
import org.nl.common.domain.query.QParam;
import org.nl.common.enums.QueryTEnum;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorderrecord;
import java.util.Date;
/*
* @author ZZQ
* @Date 2023/4/26 11:05
*/
@Data
public class ReportQuery {
private String device_code;
private String workorder_code;
private String report;
private String start_time;
private String end_time;
}

View File

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.jsonwebtoken.lang.Assert;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.nl.common.TableDataInfo;
@@ -29,6 +30,7 @@ import org.nl.wms.masterdata_manage.service.material.IMdMeMaterialbaseService;
import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase;
import org.nl.wms.mps.service.WorkOrderImportEnum;
import org.nl.wms.mps.service.dto.ProduceshiftorderDto;
import org.nl.wms.product_manage.ReportEnum;
import org.nl.wms.product_manage.ReportRecordStatus;
import org.nl.wms.product_manage.service.device.IPdmBiDeviceService;
import org.nl.wms.product_manage.service.device.dao.PdmBiDevice;
@@ -38,10 +40,13 @@ import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorderrecord;
import org.nl.wms.product_manage.service.workorder.dao.WorkorderRecord;
import org.nl.wms.product_manage.service.workorder.dao.mapper.PdmProduceWorkorderMapper;
import org.nl.wms.product_manage.service.workorder.dto.ReportQuery;
import org.nl.wms.product_manage.service.workorder.dto.WorkorderQuery;
import org.nl.wms.system_manage.service.user.ISysUserService;
import org.nl.wms.system_manage.service.user.dao.SysUser;
import org.redisson.misc.Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -63,6 +68,7 @@ import java.util.stream.Collectors;
* @since 2023-04-26
*/
@Service
@Slf4j
public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorkorderMapper, PdmProduceWorkorder> implements IPdmProduceWorkorderService {
@Autowired
private IMdPbClassstandardService classstandardService;
@@ -179,9 +185,9 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
String workorder_id = param.getJSONObject("row").getString("workorder_id");
this.update(new UpdateWrapper<PdmProduceWorkorder>()
.set("workorder_status", WorkerOrderEnum.FORCE_COMPLETE.getCode())
.set("update_id", SecurityUtils.getCurrentUserId())
.set("update_name", SecurityUtils.getCurrentNickName())
.set("update_time", new Date())
.set("confirm_id", SecurityUtils.getCurrentUserId())
.set("confirm_name", SecurityUtils.getCurrentNickName())
.set("confirm_time", new Date())
.in("workorder_id", workorder_id));
JSONArray array = new JSONArray();
JSONObject map = new JSONObject();
@@ -190,7 +196,7 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
array.add(map);
Map<String, Object> result = wmsToAcsService.orderStatusUpdate(array);
if (!HttpStatus.OK.equals(result.get("status"))) {
throw new BadRequestException((String) result.get("message"));
log.error((String) result.get("message"));
}
this.recordWorkOrder(OptionRecord.OptionEnum.UPDATE, workorder_id);
}
@@ -509,7 +515,7 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
//判断该工单状态
PdmProduceWorkorder result = this.getOne(new QueryWrapper<PdmProduceWorkorder>()
.eq("device_code", param.getString("device_code"))
.in("workorder_status", "2", "3", "4")
.in("workorder_status", "3", "4")
.ne("workorder_id", param.getString("workorder_id")));
if (ObjectUtil.isNotEmpty(result)) {
throw new BadRequestException("已有工单选择该设备开工,请更换开工设备!");
@@ -519,18 +525,38 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
JSONObject order = packageForm(param);
array.add(order);
//下发acs
Map<String, Object> resp = wmsToAcsService.order(array);
PdmProduceWorkorder workOrder = this.getOne(new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_id")));
workOrder.setWorkorder_status(WorkerOrderEnum.PRODUCTING.getCode());
if (((int) resp.get("status")) == (HttpStatus.BAD_REQUEST.value())) {
throw new BadRequestException(String.valueOf(resp.get("message")));
}
workOrder.setRealproducestart_date(DateUtil.now());
workOrder.setReal_qty(null);
this.update(workOrder, new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_id")));
this.recordWorkOrder(OptionRecord.OptionEnum.UPDATE, result.getWorkorder_id());
PdmProduceWorkorderrecord workorderrecord = packageRecordForm(workOrder);
reportRecordService.save(workorderrecord);
Map<String, Object> resp = wmsToAcsService.order(array);
if (HttpStatus.BAD_REQUEST.equals(resp.get("status"))) {
throw new BadRequestException(resp.get("message")!=null?String.valueOf(resp.get("message")):"acs反馈异常");
}
return RestBusinessTemplate.execute(() -> resp);
}
@NotNull
private PdmProduceWorkorderrecord packageRecordForm(PdmProduceWorkorder workOrder) {
PdmProduceWorkorderrecord workorderrecord = new PdmProduceWorkorderrecord();
workorderrecord.setMacoperate_id(IdUtil.getStringId());
workorderrecord.setWorkorder_id(workOrder.getWorkorder_id());
workorderrecord.setWorkprocedure_id(workOrder.getWorkprocedure_id());
workorderrecord.setDevice_code(workOrder.getDevice_code());
workorderrecord.setProduct_area(workOrder.getProduct_area());
workorderrecord.setReport_status(ReportEnum.REPORT_STATUS.code("生成"));
workorderrecord.setProduce_person_id(SecurityUtils.getCurrentUserId());
workorderrecord.setOperatetime_start(DateUtil.now());
workorderrecord.setShift_type_scode(workOrder.getShift_type_scode());
return workorderrecord;
}
@NotNull
private JSONObject packageForm(JSONObject param) {
PdmProduceWorkorder workOrder = this.getOne(new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_id")));
@@ -573,13 +599,14 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
if (workorder.getPlan_qty().doubleValue() <= workorder.getReport_qty().doubleValue()) {
workorder.setWorkorder_status(WorkerOrderEnum.COMPLETE.getCode());
}
workorder.setReal_qty(null);
this.updateById(workorder);
reportRecordService.update(new UpdateWrapper<PdmProduceWorkorderrecord>()
.set("report_qty", param.getBigDecimal("report_qty"))
.set("nok_qty", param.getBigDecimal("nok_qty"))
.set("repare_qty", param.getBigDecimal("repare_qty"))
.set("needproduct_qty", workorder.getPlan_qty().doubleValue() - workorder.getReport_qty().doubleValue())
.set("needproduct_qty", Math.max(0,workorder.getPlan_qty().intValue() - workorder.getReport_qty().intValue()))
.eq("macoperate_id", one.getMacoperate_id()));
return one.getMacoperate_id();
}
@@ -637,7 +664,7 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
list.add(report_qty);
return list;
}
//TODO:切换设备
@Override
public void replaceDevice(JSONObject param) {
String produceorder_code = param.getString("produceorder_code");
@@ -667,4 +694,43 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
//this.update(produceshiftorderDto);
}
@Override
public List<Map> reportQuery(ReportQuery query) {
List<Map> list = reportRecordService.reportQuery(query);
Map<String, String> hashMap = new HashMap<>();
int i =0;
for (Map map : list) {
String code = (String)map.get("workorder_code");
if (hashMap.get(code)==null){
hashMap.put(code,code);
i =0;
}
i++;
map.put("seq_number",i);
}
return list;
}
@Override
public List<Map> getOrderList(Map<String, String> param, Pageable page) {
return this.baseMapper.orderList(param);
}
@Override
public void updateReport(JSONObject param) {
Assert.notNull(param,"参数不能为空");
PdmProduceWorkorderrecord record = reportRecordService.getOne(new QueryWrapper<PdmProduceWorkorderrecord>()
.eq("macoperate_id", param.getString("macoperate_id")));
PdmProduceWorkorder workorder = this.getOne(new QueryWrapper<PdmProduceWorkorder>()
.eq("workorder_id", record.getWorkorder_id()));
if (!workorder.getIs_canupdate_update()){
throw new BadRequestException("当前工单设置为不允许修改报工记录");
}
reportRecordService.update(new UpdateWrapper<PdmProduceWorkorderrecord>()
.set("nok_qty",param.getBigDecimal("nok_qty"))
.set("repare_qty",param.getBigDecimal("repare_qty"))
.set("report_qty",param.getBigDecimal("report_qty"))
.eq("macoperate_id", param.getString("macoperate_id")));
}
}

View File

@@ -1,11 +1,17 @@
package org.nl.wms.product_manage.service.workorder.impl;
import com.alibaba.fastjson.JSON;
import lombok.var;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorderrecord;
import org.nl.wms.product_manage.service.workorder.dao.mapper.PdmProduceWorkorderrecordMapper;
import org.nl.wms.product_manage.service.workorder.IPdmProduceWorkorderrecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.product_manage.service.workorder.dto.ReportQuery;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* <p>
* 生产设备报工记录表 服务实现类
@@ -17,4 +23,8 @@ import org.springframework.stereotype.Service;
@Service
public class PdmProduceWorkorderrecordServiceImpl extends ServiceImpl<PdmProduceWorkorderrecordMapper, PdmProduceWorkorderrecord> implements IPdmProduceWorkorderrecordService {
@Override
public List<Map> reportQuery(ReportQuery query) {
return this.baseMapper.reportQuery(query);
}
}

View File

@@ -1,21 +1,121 @@
package org.nl.wms.scheduler_manage.controller.task;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.nl.common.anno.Log;
import lombok.extern.slf4j.Slf4j;
import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService;
import org.nl.wms.system_manage.service.dict.ISysDictService;
import org.nl.wms.system_manage.service.dict.dao.Dict;
import org.nl.wms.product_manage.sch.manage.FinishTypeEnum;
import org.nl.wms.product_manage.sch.service.TaskService;
import org.nl.wms.product_manage.sch.service.dto.TaskDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* <p>
* 任务表 前端控制器
* </p>
*
* @author generator
* @since 2023-05-11
*/
* @author ldjun
* @date 2021-08-19
**/
@RestController
@RequestMapping("/schBaseTask")
@RequiredArgsConstructor
@Api(tags = "任务管理")
@RequestMapping("/api/task")
@Slf4j
public class SchBaseTaskController {
private final TaskService taskService;
private final ISysDictService dictService;
@Autowired
private ISchBaseTaskService baseTaskService;
@GetMapping
@Log("查询任务")
@ApiOperation("查询任务")
//@PreAuthorize("@el.check('task:list')")
public ResponseEntity<Object> query(@RequestParam Map whereJson, Pageable page) {
return new ResponseEntity<>(taskService.queryAll(whereJson, page), HttpStatus.OK);
}
@PostMapping
@Log("新增任务")
@ApiOperation("新增任务")
//@PreAuthorize("@el.check('task:add')")
public ResponseEntity<Object> create(@Validated @RequestBody TaskDto dto) {
taskService.create(dto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改任务")
@ApiOperation("修改任务")
//@PreAuthorize("@el.check('task:edit')")
public ResponseEntity<Object> update(@Validated @RequestBody TaskDto dto) {
taskService.update(dto);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除任务")
@ApiOperation("删除任务")
//@PreAuthorize("@el.check('task:del')")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody String[] ids) {
taskService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@GetMapping("/taskStatus")
@Log("获取任务状态列表")
@ApiOperation("获取任务状态列表")
public ResponseEntity<Object> getTaskStatus() {
return new ResponseEntity<>(dictService.list(new LambdaQueryWrapper<Dict>()
.eq(Dict::getCode, "task_status")), HttpStatus.OK);
}
@PostMapping("/taskType")
@Log("获取任务类型列表")
@ApiOperation("获取任务类型列表")
public ResponseEntity<Object> getTaskType() {
return new ResponseEntity<>(taskService.getTaskTypes(), HttpStatus.OK);
}
@GetMapping("/acsTaskType")
@Log("获取acs任务类型列表")
@ApiOperation("获取acs任务类型列表")
public ResponseEntity<Object> getAcsTaskType() {
return new ResponseEntity<>(taskService.getAcsTaskType(), HttpStatus.OK);
}
@GetMapping("/finishType")
@Log("获取任务类型列表")
@ApiOperation("获取任务类型列表")
public ResponseEntity<Object> getFinishType() {
FinishTypeEnum[] values = FinishTypeEnum.values();
JSONArray arr = new JSONArray();
for (FinishTypeEnum value : values) {
JSONObject json = new JSONObject();
json.put("code", value.getCode());
json.put("name", value.getName());
arr.add(json);
}
return new ResponseEntity<>(arr, HttpStatus.OK);
}
@PutMapping("/operation")
@Log("任务操作")
@ApiOperation("任务操作")
//@PreAuthorize("@el.check('task:edit')")
public ResponseEntity<Object> update(@RequestBody Map<String, Object> map) {
baseTaskService.operation(map);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}

View File

@@ -3,6 +3,8 @@ package org.nl.wms.scheduler_manage.service.task;
import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Map;
/**
* <p>
* 任务表 服务类
@@ -13,4 +15,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ISchBaseTaskService extends IService<SchBaseTask> {
/**
* 任务操作
*
* @param param
*/
void operation(Map<String, Object> param);
}

View File

@@ -1,11 +1,29 @@
package org.nl.wms.scheduler_manage.service.task.impl;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
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.enums.AcsTaskEnum;
import org.nl.common.enums.StatusEnum;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.ext.acs.service.AcsToWmsService;
import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl;
import org.nl.wms.product_manage.sch.manage.TaskStatusEnum;
import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask;
import org.nl.wms.scheduler_manage.service.task.dao.mapper.SchBaseTaskMapper;
import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.storage_manage.CHANGE_BILL_TYPE_ENUM;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* <p>
* 任务表 服务实现类
@@ -17,4 +35,58 @@ import org.springframework.stereotype.Service;
@Service
public class SchBaseTaskServiceImpl extends ServiceImpl<SchBaseTaskMapper, SchBaseTask> implements ISchBaseTaskService {
@Autowired
@Lazy
private AcsToWmsService acsToWmsService;
@Override
public void operation(Map<String, Object> map) {
WmsToAcsServiceImpl wms = new WmsToAcsServiceImpl();
String task_id = MapUtil.getStr(map, "task_id");
String method_name = MapUtil.getStr(map, "method_name");
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
if (taskObj.getString("task_status").equals(TaskStatusEnum.FINISHED.getCode())) throw new BadRequestException("任务已完成!");
switch (method_name) { // forceFinish, cancel
case "immediateNotifyAcs":
JSONArray array = new JSONArray();
array.add(taskObj);
wms.issueTaskToAcs(array);
break;
case "forceFinish":
JSONArray finish = new JSONArray();
JSONObject res = new JSONObject();
res.put("task_id", task_id);
res.put("status", AcsTaskEnum.STATUS_FINISH.getCode());
res.put("finished_type", AcsTaskEnum.MANUAL_TASK_FINISHED_TYPE.getCode()); // 手动完成
finish.add(res);
acsToWmsService.receiveTaskStatusAcs(JSON.toJSONString(finish));
break;
case "cancel":
JSONArray cancel = new JSONArray();
JSONObject res2 = new JSONObject();
res2.put("task_id", task_id);
res2.put("status", AcsTaskEnum.STATUS_CANNEL.getCode());
cancel.add(res2);
acsToWmsService.receiveTaskStatusAcs(JSON.toJSONString(cancel));
break;
case "delete":
SchBaseTask one = getOne(new QueryWrapper<SchBaseTask>().eq("task_id", task_id));
int status = Integer.valueOf(one.getTask_status());
//判断如果在3个状态之内更新操作
int tag = 1 << StatusEnum.TASK_CANNEL.getBit()
| 1 << StatusEnum.TASK_CREATE.getBit()
| 1 << StatusEnum.TASK_START_ERROR.getBit()
| 1 << StatusEnum.TASK_START_END_P.getBit();
if ((tag &~ 1 << status) != tag){
this.update(new UpdateWrapper<SchBaseTask>()
.set("is_delete",true)
.eq("task_id", task_id));
}else {
throw new BadRequestException("任务已经下发不允许直接删除");
}
break;
default: break;
}
}
}

View File

@@ -9,26 +9,24 @@ spring:
client:
reactive:
#endpoints: 172.31.185.110:8200,172.31.154.9:8200 #内网
# endpoints: 47.96.133.1785:8200 #外网
endpoints: http://47.96.133.1785:8200 #外网
# endpoints: 192.168.46.225:9200 #外网
endpoints: http://192.168.46.225:9200 #外网
elasticsearch:
rest:
#uris: 172.31.185.110:8200,172.31.154.9:8200 #内网
# uris: 47.96.133.1785:8200 #外网
uris: http://47.96.133.1785:8200 #外网
username: elastic
password: 123456
# uris: 192.168.46.225:9200 #外网
uris: http://192.168.46.225:9200 #外网
# username: elastic
# password: 123456
datasource:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${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.81.252}:${DB_PORT:3306}/${DB_NAME:hl_one_mes}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
username: ${DB_USER:shenhua}
#password: ${DB_PWD:P@ssw0rd}
#password: ${DB_PWD:root}
#password: ${DB_PWD:Root.123456}
password: ${DB_PWD:123456789}
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.81.252}:${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:942464Yy}
# 初始连接数
initial-size: 5
# 最小连接数
@@ -173,6 +171,7 @@ sa-token:
cookie:
# 配置 Cookie 作用域:根据二级域名实现sso登入如lms.sso.com;acs.sso.com
domain:
is-read-cookie: false
#jetcache:
# defaultCacheType: LOCAL