Commit e9e210c8 LN

看板修改。工单增加补料出库,线别修改,定时自动出库

1 个父辈 533db9b4
......@@ -41,13 +41,11 @@ public class DataInitManager {
IRoleManager roleManager;
@Autowired
IMenuManager menuManager;
// @Autowired
// IGroupManager groupManager;
@Autowired
TaskService taskService;
@Autowired
IDataLogManager dataLogManager;
MainTimer mainTimer;
@Autowired
PermissionInitUtil annotationUtil;
......@@ -101,7 +99,7 @@ public class DataInitManager {
}
}
initTask();
mainTimer.init();
allPermissionSet= annotationUtil.initPermission();
} catch (Exception exception) {
......@@ -109,20 +107,7 @@ public class DataInitManager {
}
}
private void initTask() {
log.info("开始加载未完成的任务...");
List<DataLog> unExecuteTasks = dataLogManager.findUnFinishedTasks();
for (DataLog unExecuteTask : unExecuteTasks) {
if (unExecuteTask.isExecuting() || unExecuteTask.isWait()) {
try {
taskService.addTaskToExecute(unExecuteTask);
}catch (Exception e){
log.error("初始化任务["+unExecuteTask+"]出错:"+e);
}
}
}
log.info("加载未完成的任务完成,共[" + unExecuteTasks.size() + "]条数据...");
}
private int sortValue=0;
......
package com.neotel.smfcore.common.init;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Service
public class MainTimer {
protected final transient Logger log = LogManager.getLogger(getClass());
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
@Autowired
TaskService taskService;
@Autowired
IDataLogManager dataLogManager;
@Autowired
LiteOrderCache liteOrderCache;
public void init(){
initTask();
liteOrderCache.loadUnEndOrderInfos();
log.info("主定时器开启,60秒后开始执行, 每10s执行一次");
//1 分钟之后执行,每秒钟执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
timerTask();
}
}, 60, 10, TimeUnit.SECONDS);
}
private void initTask() {
log.info("开始加载未完成的任务...");
List<DataLog> unExecuteTasks = dataLogManager.findUnFinishedTasks();
for (DataLog unExecuteTask : unExecuteTasks) {
if (unExecuteTask.isExecuting() || unExecuteTask.isWait()) {
try {
taskService.addTaskToExecute(unExecuteTask);
}catch (Exception e){
log.error("初始化任务["+unExecuteTask+"]出错:"+e);
}
}
}
log.info("加载未完成的任务完成,共[" + unExecuteTasks.size() + "]条数据...");
}
private void timerTask(){
try{
liteOrderCache.runTimer();
}catch (Exception e){
log.error("定时器执行出错",e);
}finally {
}
}
}
......@@ -527,4 +527,17 @@ public class DataCache {
}
return cidList;
}
public List<String> getAvailableStorageIds(){
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) {
//默认所有料仓可用
// StatusBean statusBean =dataCache. getStatus(storage.getCid());
// if (statusBean.isAvailable())
{
availableStorageIds.add(storage.getId());
}
}
return availableStorageIds;
}
}
......@@ -177,17 +177,26 @@ public class BoxKanbanController {
String[] blurrys = blurry.split(",");
String[] valueArray = new String[]{datalog.getPosName(), datalog.getStorageName(), datalog.getCid(), datalog.getPartNumber(), datalog.getBarcode(), datalog.getSourceName()};
for (String s : blurrys) {
for (String v :
valueArray) {
Pattern pattern = Pattern.compile(QueryHelp.escapeExprSpecialWord(s), Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(v);
while (m.find()) {
blurryOk = true;
break;
if(ObjectUtil.isNotEmpty(s)){
for (String v :
valueArray) {
try {
Pattern pattern = Pattern.compile(QueryHelp.escapeExprSpecialWord(s), Pattern.CASE_INSENSITIVE);
Matcher m = pattern.matcher(v);
while (m.find()) {
blurryOk = true;
break;
}
if (blurryOk) break;
}catch (Exception ex){
log.error(ex.toString());
}
}
if (blurryOk) break;
}
if (blurryOk) break;
else{
blurryOk=true;
}
}
......@@ -236,9 +245,9 @@ public class BoxKanbanController {
@ApiOperation("料仓详情")
@GetMapping("/boxView")
@PreAuthorize("@el.check('boxkanban:boxView')")
public BoxStatusDto boxView(String storageId) {
public BoxStatusDto boxView(String id) {
List<DataLog> allTasks=taskService.getAllTasks();
Storage storage=dataCache.getStorageById(storageId);
Storage storage=dataCache.getStorageById(id);
BoxStatusDto dto=getBoxDto(storage,allTasks);
return dto;
}
......
......@@ -29,13 +29,6 @@ public class BoxStatusDto {
@ApiModelProperty("是否在线")
private boolean onLine=false;
/// <summary>
/// 单台BOX状态
///1=正常运行中
/// 2=急停,3=故障,4=警告,5=调试中
/// 6入库执行中,7入仓位完成,8入库失败
/// 9出库执行中,10出仓位完成,11出库失败
/// </summary>
@ApiModelProperty("单台BOX状态,0=离线,1=正常运行中, 2=急停,3=故障,4=警告,5=调试中,6入库执行中,7入仓位完成,8入库失败, 9出库执行中,10出仓位完成,11出库失败")
private int status=0;
@ApiModelProperty("温度")
......@@ -56,10 +49,6 @@ public class BoxStatusDto {
@ApiModelProperty("当前执行任务的,0=无,1=入库,2=出库")
private int currTaskType=0;
/**
* 当前执行任务的 任务状态:OP_STATUS:NONE,WAIT=等待,EXECUTING=正在执行,PAUSE=已暂停,FINISHED=已完成,CANCEL=已取消,END=已结束
*/
@ApiModelProperty("当前执行任务的 任务状态:OP_STATUS:NONE,WAIT=等待,EXECUTING=正在执行,PAUSE=已暂停,FINISHED=已完成,CANCEL=已取消,END=已结束")
private String currTaskStatus;
......
......@@ -17,6 +17,10 @@ import java.util.Locale;
@Slf4j
public class MessageUtils {
public static Locale getDefaultLocal(){
return new Locale("zh-CH");
}
private static MessageSource messageSource;
public MessageUtils(MessageSource messageSource) {
......
package com.neotel.smfcore.core.order;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
......@@ -10,6 +11,7 @@ import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.enums.ORDER_COLOR;
import com.neotel.smfcore.core.order.service.dao.ILiteOrderDao;
......@@ -27,6 +29,7 @@ import com.neotel.smfcore.core.system.util.TaskService;
import javafx.concurrent.Task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
import java.util.*;
......@@ -61,6 +64,52 @@ public class LiteOrderCache implements ITaskListener {
*/
public static Map<String, LiteOrder> liteOrderMap = new ConcurrentHashMap<>();
public void loadUnEndOrderInfos() {
log.info("开始加载未完成的需求单");
List<LiteOrder> unEndOutInfoList = liteOrderManager.findUnEndOrdersList();
long now = System.currentTimeMillis();
for (LiteOrder order : unEndOutInfoList) {
if (now - order.getCreateDate().getTime() > 7 * 24 * 60 * 60 * 1000) {
//7天前的需求单,关闭,并解绑
log.info("需求单 =[" + order.getOrderNo() + "]为7天前,关闭并解绑工单");
closeOrder(order.getOrderNo());
} else {
addOrderToMap(order);
}
}
}
public void addOrderToMap(LiteOrder order ){
if(order==null|| order.getOrderNo()==null){
return;
}
if(liteOrderMap.containsKey(order.getOrderNo())){
liteOrderMap.remove(order.getOrderNo());
}
liteOrderMap.put(order.getOrderNo(), order);
}
private boolean isProcessTimer = false;
public void runTimer(){
if(!isProcessTimer){
isProcessTimer = true;
try {
boolean stopJob = dataCache.getCache(Constants.CACHE_StopJob);
if(!stopJob){
//定时执行工单任务
executeOrderTask();
}
}catch (Exception e){
log.error("需求单定时器执行出错:",e);
}finally {
isProcessTimer = false;
}
}
}
@Override
public void onTaskStatusChange(DataLog task) {
try {
......@@ -74,13 +123,32 @@ public class LiteOrderCache implements ITaskListener {
}
}
public ResultBean checkOutOrder(LiteOrder liteOrder) throws ValidateException {
//设置颜色
Set<String> currentColors = new HashSet<>();
for (DataLog dataLog : taskService.getQueueTasks()) {
currentColors.add(dataLog.getLightColor());
public void executeOrderTask(){
for (LiteOrder order :
liteOrderMap.values()) {
if(order.isNew()||order.isTaskFinished()){
//判断是否到达时间
Date curr=new Date();
if(order.getSDate().before(curr)){
//开始自动出库
String result= checkOutLiteOrder(order.getOrderNo(),false);
if(!ObjectUtil.isEmpty(result)){
String msg= MessageUtils.getText(result,MessageUtils.getDefaultLocal(),"");
log.info("自动执行工单 【"+order.getOrderNo()+"】 失败:"+msg);
}else{
log.info("自动执行工单 【"+order.getOrderNo()+"】 成功");
}
break;
}
}
}
ORDER_COLOR nextColor = ORDER_COLOR.nextColor(currentColors);
}
public ResultBean checkOutOrder(LiteOrder liteOrder) throws ValidateException {
ORDER_COLOR nextColor = getNextColor();
if (nextColor == null) {
log.info("执行工单[" + liteOrder.getOrderNo() + "] 时,已达最大可执行工单数");
throw new ValidateException("order.out.maxOrder","已达最大可执行工单数");
......@@ -212,6 +280,15 @@ public class LiteOrderCache implements ITaskListener {
}
}
public ORDER_COLOR getNextColor() {
//设置颜色
Set<String> currentColors = new HashSet<>();
for (DataLog dataLog :taskService. getQueueTasks()) {
currentColors.add(dataLog.getLightColor());
}
ORDER_COLOR nextColor = ORDER_COLOR.nextColor(currentColors);
return nextColor;
}
/**
* 锁定物料
*/
......@@ -230,13 +307,7 @@ public class LiteOrderCache implements ITaskListener {
}
//设置颜色
Set<String> currentColors = new HashSet<>();
for (DataLog dataLog : taskService.getQueueTasks()) {
currentColors.add(dataLog.getLightColor());
}
ORDER_COLOR nextColor = ORDER_COLOR.nextColor(currentColors);
ORDER_COLOR nextColor = getNextColor();
if (nextColor == null) {
log.info("执行工单[" + orderNo + "] outBom=" + outBom + "时,已达最大可执行工单数");
return "smfcode.order.out.maxOrder";
......@@ -254,15 +325,7 @@ public class LiteOrderCache implements ITaskListener {
//liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
int taskReelCount = 0;
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
//默认所有料仓可用
// StatusBean statusBean =dataCache. getStatus(storage.getCid());
// if (statusBean.isAvailable())
{
availableStorageIds.add(storage.getId());
}
}
List<String> availableStorageIds = dataCache.getAvailableStorageIds();
//其他出库模式一次性全部生成任务
......@@ -400,4 +463,54 @@ public class LiteOrderCache implements ITaskListener {
liteOrderManager.save(liteOrder);
return "smfcode.order.close.success";
}
/**
* 工单详情补料出库
* @param orderNo
* @param orderItemId
* @return
*/
public String orderItemSupplementOut(String orderNo, String orderItemId) {
LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) {
cacheOrder=liteOrderManager.findByOrderNo(orderNo);
if(cacheOrder==null){
return "smfcode.order.out.notFound";
}
}
if(cacheOrder.isClosed()){
return "smfcode.order.hasClose";
}
for (LiteOrderItem orderItem:cacheOrder.getOrderItems()
) {
if(orderItem.getId().equals(orderItemId)){
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> availableStorageIds = dataCache.getAvailableStorageIds();
Collection<String> excludePosIds = excludePosIds();
String partNumber = orderItem.getPn();
StoragePos pos = storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType);
if (pos == null) {
return "smfcode.order.supplementOutFail";
} else {
log.info("工单[" + orderNo + "]["+partNumber+"]补料出库:仓位[" + pos.getPosName() + "]RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + partNumber + "] num:" + pos.getBarcode().getAmount());
DataLog task = newTask(pos) ;
task.setSourceId(cacheOrder.getId());
task.setSourceName(cacheOrder.getOrderNo());
task.setSubSourceId(orderItem.getId());
task.setSubSourceInfo(orderItem.getFeederInfo());
task.setType(OP.CHECKOUT);
// task.setLightColor(nextColor.getRgb());
task.setStatus(OP_STATUS.WAIT.name());
// task = dataLogDao.save(task);
taskService.addTaskToExecute(task);
return "";
}
}
}
return "smfcode.order.supplementOutFail";
}
}
......@@ -22,6 +22,7 @@ import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.rest.bean.dto.TaskDto;
import com.neotel.smfcore.core.system.rest.bean.mapstruct.TaskMapper;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
......@@ -55,6 +56,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
......@@ -134,21 +136,25 @@ public class OrderController {
liteOrder.setSource(localFile.getName());
liteOrder.setStatus(LITEORDER_STATUS.NEW);
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
if (dbOrder == null) {
log.info("新增加订单:" + liteOrder.getOrderNo() + ",共" + liteOrderItems.size() + "条工单详情");
liteOrder = liteOrderManager.createWithItems(liteOrder);
// TaskService.liteOrderMap.put(liteOrder.getOrderNo(), liteOrder);
} else {
log.info("数据库中已存在工单号为[" + liteOrder.getOrderNo() + "],忽略文件:" + localFile.getAbsolutePath());
// throw new ValidateException("smfcode.valueAlreadyExist", "{0}[{1}]已存在", new String[]{"orderNo", liteOrder.getOrderNo()});
// throw new ValidateException("工单号[" + liteOrder.getOrderNo() + "]已存在");
if (dbOrder != null) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
//把名字改为带时间的
String newOrderNo = liteOrder.getOrderNo() + "-" + format.format(new Date());
dbOrder = liteOrderManager.findByOrderNo(newOrderNo);
if (dbOrder == null) {
liteOrder.setOrderNo(newOrderNo);
} else {
log.info("数据库中已存在工单号为[" + liteOrder.getOrderNo() + "],忽略文件:" + localFile.getAbsolutePath());
return ResultBean.newErrorResult(-1, "smfcode.order.ameExists", "工单名称[{0}]已存在", new String[]{liteOrder.getOrderNo()});
}
}
log.info("新增加订单:" + liteOrder.getOrderNo() + ",共" + liteOrderItems.size() + "条工单详情");
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
return ResultBean.newOkResult("工单上传成功");
return ResultBean.newOkResult("smfcode.order.uploadOK","工单上传成功","");
}
@ApiOperation("工单出库")
......@@ -206,6 +212,23 @@ public class OrderController {
}
}
@ApiOperation("补料出库")
@PostMapping(value = "/supplementOut")
@PreAuthorize("@el.check('workOrder')")
public ResultBean supplementOut(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo");
String orderItemId = mapValues.get("orderItemId");
if (orderNo == null) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
String result= liteOrderCache.orderItemSupplementOut(orderNo,orderItemId);
if(ObjectUtil.isEmpty(result)){
return ResultBean.newOkResult(result);
}else{
return ResultBean.newErrorResult(-1,result,result);
}
}
@ApiOperation("查询工单")
@GetMapping
@PreAuthorize("@el.check('workOrder')")
......@@ -248,6 +271,7 @@ public class OrderController {
protected Map<String ,List<LiteOrderItem>> handleOrderCsv(String fileName,String fileURL) {
try {
fileName=fileName.replace(".csv","");
log.info("开始更解析上传的工单");
Map<String ,List<LiteOrderItem>> itemMap=new HashMap<>();
List<LiteOrderItem> items = Lists.newArrayList();
......@@ -293,6 +317,9 @@ public class OrderController {
if(soIndex!=-1){
so=lineValues[soIndex];
}
if(!ObjectUtil.isNotEmpty(so)){
so=fileName;
}
LiteOrderItem item = new LiteOrderItem();
item.setPn(partNumber);
item.setNeedNum(num);
......@@ -362,6 +389,7 @@ public class OrderController {
}
liteOrder.setOrderTimes(orderTimes);
liteOrderManager.save(liteOrder );
liteOrderCache.addOrderToMap(liteOrder);
return ResultBean.newOkResult(orderMapper.toDto(liteOrder) );
}
......@@ -382,4 +410,30 @@ public class OrderController {
}
}
@ApiOperation("修改工单线别")
@PostMapping(value = "/updateLine")
@PreAuthorize("@el.check('workOrder')")
public ResultBean updateLine(@RequestBody OrderDto param) {
if (param.getId() == null) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
if (param.getLine() == null) {
throw new ValidateException("smfcode.order.lineCanotNull", "线别不能为空");
}
LiteOrder order = liteOrderManager.get(param.getId());
if (order == null) {
throw new ValidateException("smfcode.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
if (!order.isNew()) {
throw new ValidateException("smfcode.order.cannotUpdateLine", "工单已出库,不能修改线别");
}
order.setLine(param.getLine());
liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
return ResultBean.newOkResult(orderMapper.toDto(order));
}
}
......@@ -79,4 +79,8 @@ public class OrderDto implements Serializable {
@ApiModelProperty("创建时间")
private Date createDate = new Date();
@ApiModelProperty("工单线别")
private String line = "";
}
......@@ -5,7 +5,11 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import java.util.List;
public interface ILiteOrderManager extends IBaseManager<LiteOrder> {
LiteOrder findByOrderNo(String orderNo);
LiteOrder createWithItems(LiteOrder liteOrder) throws ValidateException;
List<LiteOrder> findUnEndOrdersList();
}
......@@ -6,6 +6,7 @@ import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.dao.IBarcodeDao;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.service.dao.ILiteOrderDao;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
......@@ -15,6 +16,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
......@@ -76,6 +78,22 @@ public class LiteOrderManagerImpl implements ILiteOrderManager {
}
@Override
public List<LiteOrder> findUnEndOrdersList() {
Criteria c = new Criteria();
c.and("status").nin(LITEORDER_STATUS.CLOSED);
Query query = new Query(c);
List<LiteOrder> orders = findByQuery(query);
for (LiteOrder order : orders
) {
if (order != null && order.getOrderItems() == null) {
List<LiteOrderItem> items = liteOrderItemManager.findOrderItems(order.getOrderNo());
order.setOrderItems(items);
}
}
return orders;
}
@Override
public PageData<LiteOrder> findByPage(Query query, Pageable pageable) {
int totalCount = liteOrderDao.countByQuery(query);
List<LiteOrder> list = liteOrderDao.findByQuery(query, pageable);
......
......@@ -112,11 +112,13 @@ public class LiteOrder extends BasePo implements Serializable {
*/
public void finishedTasks(){
if(isOutOne()){
setStatus(LITEORDER_STATUS.ONE_FINISHED);
// setStatus(LITEORDER_STATUS.ONE_FINISHED);
setClosed(true);
}else if(isOutBom()){
setStatus(LITEORDER_STATUS.BOM_FINISHED);
}else if(isOutTails()){
setStatus(LITEORDER_STATUS.TAILS_FINISHED);
// setStatus(LITEORDER_STATUS.TAILS_FINISHED);
setClosed(true);
}
setTaskFinishedTime(System.currentTimeMillis());
......
......@@ -377,6 +377,7 @@ public class HellaServiceHandler extends IoHandlerAdapter implements ITaskListen
liteOrder.setSource(groupName);
log.info("新增加订单:" + liteOrder.getOrderNo());
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
//对工单进行锁定
List<String> storageIdList = new ArrayList<>();
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!