rev:工单一体机功能

This commit is contained in:
zhangzhiqiang
2023-05-27 09:42:51 +08:00
parent 1d2acd6d16
commit b0e0012939
31 changed files with 801 additions and 623 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

@@ -80,10 +80,12 @@ public class AgvInstService {
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);
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)){
@@ -93,7 +95,8 @@ public class AgvInstService {
throw new BadRequestException("当前任务下一道工序无可用设备");
}
nextPoint = getParamByXml(workprodure, currentFlow, nextPoint);
task.put("acs_task_type",AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_ENTRY_TASK.getCode());
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);
}
@@ -102,8 +105,8 @@ public class AgvInstService {
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.setBarcodeArr(cacheVehile);
@@ -168,7 +171,8 @@ public class AgvInstService {
SchBaseTask schBaseTask = task.toJavaObject(SchBaseTask.class);
schBaseTask.setBarcodeArr(cacheVehile);
schBaseTask.setPoint_code1(startPoint);
schBaseTask.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode());
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());

View File

@@ -34,6 +34,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService{
, "priority", task.getString("priority")
, "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")

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

@@ -50,11 +50,11 @@ public class PdmBiDeviceController {
return new ResponseEntity<>(TableDataInfo.build(result),HttpStatus.OK);
}
@GetMapping("/list")
@PostMapping("/list")
@Log("查询生产设备列表")
@ApiOperation("查询生产设备列表")
@SaIgnore
public ResponseEntity<Object> queryList(DeviceQuery query){
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);
}

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;
@@ -93,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,14 +144,18 @@ public class PdmProduceWorkorderController {
return new ResponseEntity<>(HttpStatus.OK);
}
@GetMapping("/reportQuery")
@Log("报工查询")
@ApiOperation("报工查询")
public ResponseEntity<Object> reportQuery(ReportQuery query) {
return new ResponseEntity<>(TableDataInfo.build(iPdmProduceWorkorderService.reportQuery(query)),HttpStatus.OK);
@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,5 +1,6 @@
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;
@@ -17,6 +18,7 @@ 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;
@@ -36,9 +38,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
* 专机任务
@@ -151,7 +152,7 @@ public class SpeEmpTask 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"));
@@ -227,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,7 +1,9 @@
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 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;
@@ -19,12 +21,12 @@ 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.point.ISchBasePointService;
import org.nl.wms.scheduler_manage.service.point.dao.SchBasePoint;
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;
@@ -32,9 +34,8 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
* 专机任务
@@ -47,7 +48,7 @@ public class SpeFullTask extends AbstractAcsTask {
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private ISchBasePointService pointService;
private IPdmBiDeviceService deviceService;
@Autowired
private ISchCachelineVehilematerialService cacheLineVechileService;
@Autowired
@@ -60,6 +61,7 @@ public class SpeFullTask extends AbstractAcsTask {
public SpeFullTask() {
SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_MAC.name() ,new Spe2Spe());
SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_CACHE.name() ,new Spe2Cache());
SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_WASH.name() ,new Spe2Wash());
}
@Override
@@ -69,7 +71,10 @@ public class SpeFullTask extends AbstractAcsTask {
// 指令执行中
SchBaseTask task = taskService.getById(param.getString("task_id"));
AcsTaskEnum taskType = AcsTaskEnum.getType(task.getTask_type(),"TASK_");
pointService.update(new UpdateWrapper<SchBasePoint>().set("lock_type","0").in("point_code",task.getPoint_code1(),task.getPoint_code2(),task.getPoint_code3()));
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){
@@ -83,7 +88,6 @@ public class SpeFullTask extends AbstractAcsTask {
public String createTask(JSONObject param) {
String point_code = param.getString("device_code");
String quantity = param.getString("quantity");
String type = param.getString("type");
PdmProduceWorkorder order = workorderService.getOne(new QueryWrapper<PdmProduceWorkorder>()
.eq("workorder_code", param.getString("workorder_code"))
.eq("is_delete", false)
@@ -98,7 +102,7 @@ public class SpeFullTask extends AbstractAcsTask {
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.getProduct_area(),"quantity", quantity,"type",type,"material_id", order.getMaterial_id()));
"","product_area",order.getProduct_area(),"quantity", quantity,"type",AcsTaskEnum.TASK_PRODUCT_MAC.getCode(),"material_id", order.getMaterial_id()));
String taskId = IdUtil.getStringId();
JSONObject task = packageParam(form, taskId);
@@ -117,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"));
@@ -145,15 +149,8 @@ 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,SchBaseTask task);
}
@@ -163,30 +160,22 @@ public class SpeFullTask extends AbstractAcsTask {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
switch (status){
case STATUS_START:
taskService.update(new UpdateWrapper<SchBaseTask>()
.set("task_status",StatusEnum.TASK_RUNNING.getCode())
.set("update_name","acs")
.set("update_time",DateUtil.now()).eq("task_id",task.getTask_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()));
}
// 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:
taskService.update(new UpdateWrapper<SchBaseTask>()
.set("task_status",StatusEnum.TASK_FINISH.getCode())
.set("update_name","acs")
.set("update_time",DateUtil.now()).eq("task_id",task.getTask_id()));
break;
case STATUS_CANNEL:
cancel(param.getString("task_id"));
@@ -203,15 +192,8 @@ public class SpeFullTask extends AbstractAcsTask {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
switch (status){
case STATUS_START:
Map<String, String> extParam = (Map)param.get("ext_param");
UpdateWrapper<SchBaseTask> wrapper = new UpdateWrapper<SchBaseTask>()
.set("task_status", StatusEnum.TASK_RUNNING.getCode())
.set("update_name", "acs")
.set("update_time", DateUtil.now()).eq("task_id", task.getTask_id());
if (extParam.get("outboxt")!= null){ wrapper.set("vehicle_code2",extParam.get("outboxt")); }
taskService.update(wrapper);
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());
@@ -222,13 +204,8 @@ public class SpeFullTask extends AbstractAcsTask {
vehilematerial.setQuantity(task.getMaterial_qty());
cacheLineVechileService.save(vehilematerial);
}
break;
case STATUS_FINISH:
taskService.update(new UpdateWrapper<SchBaseTask>()
.set("task_status",StatusEnum.TASK_FINISH.getCode())
.set("update_name","acs")
.set("update_time",DateUtil.now()).eq("task_id",task.getTask_id()));
break;
case STATUS_CANNEL:
cancel(param.getString("task_id"));
@@ -238,9 +215,138 @@ public class SpeFullTask extends AbstractAcsTask {
}
}
}
class Spe2Wash implements SpeStatusHandler{
@Override
public void handle(JSONObject param, String sta,SchBaseTask task) {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
switch (status){
case STATUS_START:
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:
break;
case STATUS_CANNEL:
break;
default:
throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta);
}
}
}
@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

@@ -6,6 +6,7 @@ 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;
@@ -17,6 +18,7 @@ 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;
@@ -43,120 +45,52 @@ public class TaskScheduleService {
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");
//查询所有自动下发的任务
List<SchBaseTask> all = taskService.list(new QueryWrapper<SchBaseTask>().eq("is_auto_issue", "1").lt("task_status", StatusEnum.TASK_PUBLISH.getCode()));
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<SchBaseTask> iterator = all.iterator();
while (iterator.hasNext()){
SchBaseTask task =iterator.next();
if (task.getTask_status().equals(StatusEnum.TASK_START_END_P.getCode())){
continue;
}
try {
Object obj = SpringContextHolder.getBean(Class.forName(task.getHandle_class()));
// 调用每个任务类的forceFinishInst()强制结束方法
Method m = obj.getClass().getDeclaredMethod("pointConfirm", JSONObject.class, String.class);
m.invoke(obj,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);
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<SchBaseTask>> areaCollent = all.stream().collect(Collectors.groupingBy(SchBaseTask::getProduct_area));
for (String area : areaCollent.keySet()) {
List<SchBaseTask> array = areaCollent.get(area);
if (array.size()>0){
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> Merge = new ArrayList<>();//单独下发的任务
List<SchBaseTask> waitingTask = new ArrayList<>();//可合并,但是只有单条任务
//Map<String, String> taskGroupMap = array.stream().filter(a-> StringUtils.isNotEmpty(a.getTask_group_id())).collect(HashMap::new, (k, v) -> k.put(v.getTask_id(), v.getTask_group_id()), HashMap::putAll);
Map<String, String> taskGroupMap = new HashMap<>();
for (SchBaseTask task : array) {
String taskGroupId = 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) >2 ).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);
if (a.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_TASK.getCode())){
a.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_TASK.getCode());
}
if (a.getAcs_task_type().equals(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_DOUBLE_ENTRY_TASK.getCode())){
a.setAcs_task_type(AcsTaskEnum.ACS_TASK_TYPE_NOBLE_SINGLE_ENTRY_TASK.getCode());
}
});
Merge.addAll(notMerge);
//批量更新任务状态is_send,task_group_id
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);
// 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 {
@@ -167,30 +101,4 @@ public class TaskScheduleService {
}
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

@@ -7,10 +7,10 @@ import org.nl.common.domain.query.PageQuery;
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);
/**
* 工单更换设备
@@ -117,4 +129,5 @@ public interface IPdmProduceWorkorderService extends IService<PdmProduceWorkorde
List<Map> reportQuery(ReportQuery query);
}

View File

@@ -17,5 +17,5 @@ import java.util.Map;
*/
public interface IPdmProduceWorkorderrecordService extends IService<PdmProduceWorkorderrecord> {
List<Map> getWorkorderRecordDtl(ReportQuery query);
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

@@ -18,5 +18,5 @@ import java.util.Map;
*/
public interface PdmProduceWorkorderrecordMapper extends BaseMapper<PdmProduceWorkorderrecord> {
List<Map> getWorkorderRecordDtl(@Param("query")ReportQuery query);
List<Map> reportQuery(@Param("query")ReportQuery query);
}

View File

@@ -2,9 +2,10 @@
<!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="getWorkorderRecordDtl" resultType="java.util.Map">
<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,
@@ -13,12 +14,13 @@
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
where wr.is_delete = true
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 = #{device_code}
and wr.device_code = #{query.device_code}
</if>
<if test="query.workorder_code != null and query.workorder_code != ''">
and wr.workorder_code = #{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}
@@ -26,5 +28,6 @@
<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

@@ -7,15 +7,19 @@ 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 extends BaseQuery<PdmProduceWorkorderrecord> {
public class ReportQuery {
private String device_code;
private String workorder_code;
private String report;
private String start_time;
private String end_time;
}

View File

@@ -30,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;
@@ -43,7 +44,9 @@ 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;
@@ -522,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(resp.get("message")!=null?String.valueOf(resp.get("message")):"acs反馈异常");
}
workOrder.setRealproducestart_date(DateUtil.now());
workOrder.setReal_qty(null);
this.update(workOrder, new QueryWrapper<PdmProduceWorkorder>().eq("workorder_id", param.getString("workorder_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")));
@@ -576,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();
}
@@ -672,6 +696,41 @@ public class IPdmProduceWorkorderServiceImpl extends ServiceImpl<PdmProduceWorko
@Override
public List<Map> reportQuery(ReportQuery query) {
return reportRecordService.getWorkorderRecordDtl(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,5 +1,6 @@
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;
@@ -23,7 +24,7 @@ import java.util.Map;
public class PdmProduceWorkorderrecordServiceImpl extends ServiceImpl<PdmProduceWorkorderrecordMapper, PdmProduceWorkorderrecord> implements IPdmProduceWorkorderrecordService {
@Override
public List<Map> getWorkorderRecordDtl(ReportQuery query) {
return this.baseMapper.getWorkorderRecordDtl(query);
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