工作台页面增加出库锁定和入库锁定开关,任务管理页面增加置顶任务功能
8个文件已修改
210 ■■■■■ 已修改文件
Admin.NET/WCS.Application/Hub/PlcHub.cs 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCService.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Service/WcsPlc/WcsPlcService.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Service/WcsTask/WcsTaskService.cs 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Web/src/api/wcs/wcsTask.ts 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Web/src/views/device/deviceInfo/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Web/src/views/wcs/wcsTask/index.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Hub/PlcHub.cs
@@ -129,6 +129,8 @@
                           BoOffline = PLCTaskAction.boOffline,
                           BoDemo = PLCTaskAction.boDemo,
                           BoDrumReversal = PLCTaskAction.boDrumReversal,
                           BoOutLock=PLCTaskAction.boOutLock,
                           BoEnterLock=PLCTaskAction.boEnterLock,
                           Error = "与PCL交互失败,操作失败!"
                       });
                    return;
@@ -146,6 +148,8 @@
                       BoOffline = PLCTaskAction.boOffline,
                       BoDemo = PLCTaskAction.boDemo,
                       BoDrumReversal = PLCTaskAction.boDrumReversal,
                       BoOutLock = PLCTaskAction.boOutLock,
                       BoEnterLock = PLCTaskAction.boEnterLock,
                       Error = "PCL未连接,操作失败!"
                   });
                return;
@@ -178,6 +182,8 @@
                           BoOffline = PLCTaskAction.boOffline,
                           BoDemo = PLCTaskAction.boDemo,
                           BoDrumReversal = PLCTaskAction.boDrumReversal,
                           BoOutLock=PLCTaskAction.boOutLock,
                           BoEnterLock=PLCTaskAction.boEnterLock,
                           Error = "与PCL交互失败,操作失败!"
                       });
                    return;
@@ -195,27 +201,44 @@
                       BoOffline = PLCTaskAction.boOffline,
                       BoDemo = PLCTaskAction.boDemo,
                       BoDrumReversal = PLCTaskAction.boDrumReversal,
                       BoOutLock = PLCTaskAction.boOutLock,
                       BoEnterLock = PLCTaskAction.boEnterLock,
                       Error = "PCL未连接,操作失败!"
                   });
                return;
            }
        }
        await _plcHubContext.Clients.All.UpdateService(new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal });
        //出库锁定
        if (context.BoOutLock.HasValue)
        {
            PLCTaskAction.boOutLock = context.BoOutLock.Value;
            await _sysConfigService.UpdateConfigValue("sys_BoOutLock", context.BoOutLock.Value);
        }
        //入库锁定
        if (context.BoEnterLock.HasValue)
        {
            PLCTaskAction.boEnterLock = context.BoEnterLock.Value;
            await _sysConfigService.UpdateConfigValue("sys_BoEnterLock", context.BoEnterLock.Value);
        }
        await _plcHubContext.Clients.All.UpdateService(new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal, BoOutLock = PLCTaskAction.boOutLock, BoEnterLock = PLCTaskAction.boEnterLock });
    }
}
public class PLCServiceModel
{
    public bool? BoRunningState { get; set; }
    public bool? BoOffline { get; set; }
    public bool? BoRefresh { get; set; }
    public bool? BoDemo { get; set; }
    public bool? BoDrumReversal { get; set; }
    public bool? BoOutLock { get; set; }
    public bool? BoEnterLock { get; set; }
    /// <summary>
    /// 错误信息
    /// </summary>
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -64,12 +64,17 @@
                // 跺机空闲,获取出库任务、移库任务
                {
                    // 获取任务信息
                    var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.CreateTime).OrderBy(m => m.Levels, OrderByType.Desc)
                    var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.CreateTime).OrderBy(m => m.Levels, OrderByType.Asc)
                        .First(s => s.Status == TaskStatusEnum.Wait && (s.TaskType == TaskTypeEnum.Out || s.TaskType == TaskTypeEnum.Move)
                        && s.StartRoadway == modDevice.StationNum);
                    if (modTask == null)
                    {
                        break;
                    }
                    //判断出库锁定是否打开
                    if (PLCTaskAction.boOutLock)
                    {
                        break;//出库锁定打开则不执行出库任务
                    }
                    PlcTaskInfo taskInfo = new PlcTaskInfo();
@@ -529,6 +534,7 @@
                                    // 改变任务状态
                                    modTask.Status = TaskStatusEnum.Complete;
                                    modTask.FinishDate = DateTime.Now;
                                    modTask.Levels = 999;
                                    _db.Updateable(modTask).ExecuteCommand();
                                    //下发任务日志
                                    HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
@@ -950,7 +956,6 @@
                break;
            case "330":
                {
                    // 写入任务 托盘移动 340
                    // 获取工位托盘码信息
@@ -967,6 +972,11 @@
                    {
                        // 此托盘没有对应的转移任务 led显示
                        break;
                    }
                    //判断入库锁定是否打开
                    if (PLCTaskAction.boEnterLock)
                    {
                        break;//入库锁定打开则不执行入库任务
                    }
                    // 获取巷道口入库工位
@@ -1317,6 +1327,7 @@
                        // 改变任务状态
                        modTask.Status = TaskStatusEnum.Complete;
                        modTask.FinishDate = DateTime.Now;
                        modTask.Levels = 999;
                        _db.Updateable(modTask).ExecuteCommand();
                        HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                        // 插入任务明细 
@@ -1419,6 +1430,7 @@
                            // 改变任务状态
                            modTask.Status = TaskStatusEnum.Complete;
                            modTask.FinishDate = DateTime.Now;
                            modTask.Levels = 999;
                            _db.Updateable(modTask).ExecuteCommand();
                            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
@@ -17,6 +17,10 @@
    public static bool boDemo = false;
    //滚筒反转
    public static bool boDrumReversal = false;
    //出库锁定
    public static bool boOutLock = false;
    //入库锁定
    public static bool boEnterLock = false;
    public static List<PlcPositionInfo> listPositionInfo = new List<PlcPositionInfo>();
@@ -55,6 +59,8 @@
        boRefresh = _sysConfigService.GetConfigValue<bool>("sys_Refresh").Result;
        boDemo = _sysConfigService.GetConfigValue<bool>("sys_demo").Result;
        boDrumReversal = _sysConfigService.GetConfigValue<bool>("sys_DrumReversal").Result;
        boOutLock = _sysConfigService.GetConfigValue<bool>("sys_BoOutLock").Result;
        boEnterLock = _sysConfigService.GetConfigValue<bool>("sys_BoEnterLock").Result;
    }
    /// <summary>
    /// 初始化PLC连接
Admin.NET/WCS.Application/Service/WcsPlc/WcsPlcService.cs
@@ -136,7 +136,7 @@
            }
        }
        //服务状态
        var modService = new { PLCTaskAction.boRunningState, PLCTaskAction.boOffline, PLCTaskAction.boRefresh, PLCTaskAction.boDemo, PLCTaskAction.boDrumReversal };
        var modService = new { PLCTaskAction.boRunningState, PLCTaskAction.boOffline, PLCTaskAction.boRefresh, PLCTaskAction.boDemo, PLCTaskAction.boDrumReversal, PLCTaskAction.boOutLock, PLCTaskAction.boEnterLock };
        return new { listPlc, modService };
    }
    /// <summary>
Admin.NET/WCS.Application/Service/WcsTask/WcsTaskService.cs
@@ -2,10 +2,12 @@
using AngleSharp.Dom;
using COSXML.Network;
using DocumentFormat.OpenXml.Drawing.Charts;
using DocumentFormat.OpenXml.Math;
using Elastic.Clients.Elasticsearch.Tasks;
using Furion.DatabaseAccessor;
using Furion.Logging;
using Microsoft.AspNetCore.SignalR;
using NewLife;
using WCS.Application.Entity;
using WCS.Application.Service.WcsTask.Dto;
@@ -53,7 +55,7 @@
            .WhereIF(!string.IsNullOrWhiteSpace(input.PalletNo), u => u.PalletNo.Contains(input.PalletNo.Trim()))
            .WhereIF(!string.IsNullOrWhiteSpace(input.Origin), u => u.Origin.Contains(input.Origin.Trim()))
            .Select<WcsTaskOutput>();
        return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
        return await query.OrderBy(o=>o.Levels).OrderByDescending(o=>o.CreateTime).ToPagedListAsync(input.Page, input.PageSize);
    }
    /// <summary>
@@ -196,6 +198,7 @@
                modTask.CancelDate = DateTime.Now;//取消时间
            }
            modTask.Status = input.Status;
            modTask.Levels = 999;
            await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Status, s.IsSuccess, s.FinishDate, s.CancelDate, s.UpdateTime, s.UpdateUserId, s.UpdateUserName }).ExecuteCommandAsync();
            //写入任务明细表
            WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor()
@@ -293,6 +296,105 @@
        //下发任务日志
        HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
    }
    /// <summary>
    /// 任务置顶
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "TopUpTask")]
    [DisplayName("任务置顶")]
    public async Task TopUpTask(UpdateWcsTaskInput input)
    {
        var modTask = await _wcsTaskRep.GetByIdAsync(input.Id);
        if (modTask.Status != TaskStatusEnum.Wait)
        {
            throw Oops.Oh("只有等待执行的任务才能置顶!");
        }
        int editNum = 1;
        List<string> _editTaskNoList = new List<string>();
        //储位深度
        string locatDepth = "";
        if (modTask.TaskType == TaskTypeEnum.Out || modTask.TaskType == TaskTypeEnum.Move)//出库任务或入库任务
        {
            locatDepth = modTask.StartLocate.Substring(modTask.StartLocate.Length - 1, 1);//起始储位深度
            if (locatDepth == "2")//判断当前储位是否深度为2,内侧储位
            {
                string locatString = modTask.StartLocate.Substring(0, modTask.StartLocate.Length - 1) + "1";//获取外侧储位地址
                //判断外侧储位是否有等待执行的任务,有就优先执行
                var modTask2 = _db.Queryable<WcsTask>().First(w => w.IsDelete == false && w.Status == TaskStatusEnum.Wait && w.StartLocate == locatString);
                if (modTask2 != null)
                {
                    modTask2.Levels = 1;
                    await _wcsTaskRep.Context.Updateable(modTask2).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
                    _editTaskNoList.Add(modTask2.TaskNo);
                    modTask.Levels = 2;
                    await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
                    _editTaskNoList.Add(modTask.TaskNo);
                    editNum = 2;
                }
                else
                {
                    modTask.Levels = 1;
                    await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
                    _editTaskNoList.Add(modTask.TaskNo);
                }
            }
            else
            {
                modTask.Levels = 1;
                await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
                _editTaskNoList.Add(modTask.TaskNo);
            }
        }
        if (modTask.TaskType == TaskTypeEnum.In)//入库任务
        {
            if (string.IsNullOrEmpty(modTask.EndLocate))
            {
                throw Oops.Oh("该入库任务还未分配储位,置顶失败!");
            }
            locatDepth = modTask.EndLocate.Substring(modTask.EndLocate.Length - 1, 1);//目标储位深度
            if (locatDepth == "1")//判断当前储位是否深度为1,外侧储位
            {
                string locatString = modTask.EndLocate.Substring(0, modTask.EndLocate.Length - 1) + "2";//获取内侧储位地址
                //判断内侧储位是否有等待执行的任务,有就优先执行
                var modTask2 = _db.Queryable<WcsTask>().First(w => w.IsDelete == false && w.Status == TaskStatusEnum.Wait && (w.StartLocate == locatString || w.EndLocate == locatString));
                if (modTask2 != null)
                {
                    modTask2.Levels = 1;
                    await _wcsTaskRep.Context.Updateable(modTask2).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
                    _editTaskNoList.Add(modTask2.TaskNo);
                    modTask.Levels = 2;
                    await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
                    _editTaskNoList.Add(modTask.TaskNo);
                    editNum = 2;
                }
                else
                {
                    modTask.Levels = 1;
                    await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
                    _editTaskNoList.Add(modTask.TaskNo);
                }
            }
            else
            {
                modTask.Levels = 1;
                await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
                _editTaskNoList.Add(modTask.TaskNo);
            }
        }
        //顺延其他置顶任务
        var modTaskList = _db.Queryable<WcsTask>().Where(w => w.IsDelete == false && w.Status == TaskStatusEnum.Wait && w.Levels != 999 && !_editTaskNoList.Contains(w.TaskNo)).ToList();
        foreach (var item in modTaskList)
        {
            item.Levels += editNum;
        }
        await _wcsTaskRep.Context.Updateable(modTaskList).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
    }
    /// <summary>
    /// 自动生成任务号
Web/src/api/wcs/wcsTask.ts
@@ -7,6 +7,7 @@
  DetailWcsTask = '/api/wcsTask/detail',
  FinshWcsTask = '/api/wcsTask/Finsh',
  UploadWcsTask = '/api/wcsTask/UploadTask',
  TopUpWcsTask = '/api/wcsTask/TopUpTask',
}
// 增加任务表
@@ -65,3 +66,11 @@
            method: 'post',
            data: params,
        });
// 置顶任务
export const topUpWcsTask = (params?: any) =>
    request({
            url: Api.TopUpWcsTask,
            method: 'post',
            data: params,
        });
Web/src/views/device/deviceInfo/index.vue
@@ -1,5 +1,5 @@
<template>
    <div class="sys-user-container" style="overflow: hidden;">
    <div class="sys-user-container">
        <el-row>
            <el-col :span="3">
                <el-collapse v-model="activeName">
@@ -24,6 +24,14 @@
                            <el-switch v-model="state.boDrumReversal" active-text="" inactive-text="滚动反转"
                                @change="handleSwitchChange('boDrumReversal', $event)"></el-switch>
                        </el-card>
                        <el-card class="box-card" shadow="hover" style="margin-top: 3px;">
                            <el-switch v-model="state.boOutLock" active-text="" inactive-text="出库锁定"
                                @change="handleSwitchChange('boOutLock', $event)"></el-switch>
                        </el-card>
                        <el-card class="box-card" shadow="hover" style="margin-top: 3px;">
                            <el-switch v-model="state.boEnterLock" active-text="" inactive-text="入库锁定"
                                @change="handleSwitchChange('boEnterLock', $event)"></el-switch>
                        </el-card>
                    </el-collapse-item>
                    <el-collapse-item title="堆垛机" name="2">
Web/src/views/wcs/wcsTask/index.vue
@@ -68,6 +68,7 @@
            @cell-click="handleClick" @sort-change="sortChange" border="">
            <el-table-column type="index" label="序号" width="55" align="center" />
            <el-table-column prop="taskNo" label="任务号" width="130" show-overflow-tooltip="" />
            <el-table-column prop="levels" label="优先级" width="55" show-overflow-tooltip="" />
            <el-table-column prop="taskType" width="85" label="任务类型" show-overflow-tooltip="">
              <template #default="scope">
                <el-tag :type="dv('TaskTypeEnum', scope.row.taskType)?.tagType"> {{ dv('TaskTypeEnum',
@@ -114,7 +115,7 @@
                <ModifyRecord :data="scope.row" />
              </template>
            </el-table-column> -->
            <el-table-column prop="操作" label="操作" width="150" align="center" fixed="right" show-overflow-tooltip=""
            <el-table-column prop="操作" label="操作" width="200" align="center" fixed="right" show-overflow-tooltip=""
              v-if="auth('wcsTask:complete') || auth('wcsTask:cancell')">
              <template #default="scope">
                <template v-if="scope.row.status <= 1">
@@ -126,6 +127,10 @@
                <template v-if="scope.row.status == 2 && scope.row.origin == 'WMS'">
                  <el-button icon="ele-Upload" size="small" text="" type="primary" @click="uploadTask(scope.row)"
                    v-auth="'wcsTask:cancell'"> 上传 </el-button>
                </template>
                <template v-if="scope.row.status == 0">
                  <el-button icon="ele-Top" size="small" text="" type="primary" @click="topUpTask(scope.row)"
                    v-auth="'wcsTask:cancell'"> 置顶 </el-button>
                </template>
              </template>
            </el-table-column>
@@ -148,10 +153,10 @@
            <el-row>
              <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
                <el-form-item label="任务号">
                  <el-input v-model="queryParams2.taskNo" clearable="" placeholder="请输入任务号" />
                  <el-input v-model="queryParams2.taskNo" clearable="" placeholder="请输入任务号"style="width: 130px;" />
                </el-form-item>
              </el-col>
              <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
              <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" style="margin-left: 20px;">
                <el-form-item>
                  <el-button type="primary" icon="ele-Search" @click="handleQuery2"> 查询
                  </el-button>
@@ -195,7 +200,7 @@
import printDialog from '/@/views/system/print/component/hiprint/preview.vue'
import editDialog from '/@/views/wcs/wcsTask/component/editDialog.vue'
import { pageWcsTask, finshWcsTask, uploadWcsTask } from '/@/api/wcs/wcsTask';
import { pageWcsTask, finshWcsTask, uploadWcsTask,topUpWcsTask } from '/@/api/wcs/wcsTask';
import { pageWcsMonitorTask } from '/@/api/wcs/wcsTaskMonitor';
import { signalR } from './signalR';
@@ -333,10 +338,27 @@
  })
    .then(async () => {
      var param = Object.assign(row);
      await uploadWcsTask(param);
      await topUpTask(param);
      handleQuery();
      handleQuery2();
      ElMessage.success("上传任务成功");
      ElMessage.success("置顶任务成功");
    })
    .catch(() => { });
}
//置顶任务
const topUpTask = async (row: any) => {
  ElMessageBox.confirm(`确定要置顶任务吗?`, "提示", {
    confirmButtonText: "确定",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(async () => {
      var param = Object.assign(row);
      await topUpWcsTask(param);
      handleQuery();
      handleQuery2();
      ElMessage.success("置顶任务成功");
    })
    .catch(() => { });