using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using CommonLib;
using System.Data;
namespace WcfControlMonitorLib
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    /// <summary>
    /// 调度wcf接口
    /// </summary>
    [ServiceContract]

    public interface IBasicControlMonitor
    {
        /// <summary>
        /// 根据安装条码扫描器的输送机设备索引查询【在PLC读到的条码】和【已经给管理上报的条码】20140218
        /// </summary>
        /// <param name="bindDeviceOfBarcode">安装条码扫描器的输送机</param>
        /// <param name="readedBarcode">在PLC读到的条码</param>
        /// <param name="reportedBarcode">已经给管理上报的条码</param>
        /// <returns></returns>
        [OperationContract]
        bool GetReadedAndReportedBarcode(int bindDeviceOfBarcode, out string readedBarcode, out string reportedBarcode, out string errorText);

        /// <summary>
        /// 获得指定设备类型的故障描述信息
        /// </summary>
        /// <param name="deviceKindIndex">设备类型</param>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        Model.MError GetDeviceAllErrors(int deviceKindIndex, out string errorText);
        /// <summary>
        /// 获得所有路径信息
        /// </summary>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        List<Model.MRoute> GetAllRouteinfo(out string errorText);
        /// <summary>
        /// 获得指定设备参与的路径信息
        /// </summary>
        /// <param name="deviceIndex">设备索引</param>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        List<Model.MRoute> GetDeviceJoinRouteinfo(int deviceIndex, out string errorText);
        /// <summary>
        /// 获得符合指定列作为查询项的调度任务信息
        /// </summary>
        /// <param name="FieldName">T_Manage_Task的表列名</param>
        /// <param name="content">值</param>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        ManageTask[] GetManageTasks(string FieldName, string content, out string errorText);
        /// <summary>
        /// 获得符合指定列作为查询项的设备指令队列信息
        /// </summary>
        /// <param name="FieldName">T_Monitor_Task的表列名</param>
        /// <param name="content">值</param>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        MonitorTask[] GetMonitorTasks(string FieldName, string content, out string errorText);
        /// <summary>
        /// 获得设备状态
        /// </summary>
        /// <param name="deviceIndex">设备索引</param>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        DeviceStateType GetDeviceStateInfo(int deviceIndex, out string errorText);
        /// <summary>
        /// 设置设备状态
        /// </summary>
        /// <param name="devstate">设备状态类</param>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetDeviceStateInfo(DeviceStateType devstate, out string errorText);
        /// <summary>
        /// 设置某一条路径的状态
        /// </summary>
        /// <param name="routeID">路径编号</param>
        /// <param name="isEnabled">true可用;false不可用</param>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetRouteStateInfo(int routeID, bool isEnabled, out string errorText);
        /// <summary>
        /// 设置设备参与的路径状态
        /// </summary>
        /// <param name="deviceIndex">设备索引</param>
        /// <param name="isEnabled">true可用;false不可用</param>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetDeviceJoinRouteStateInfo(int deviceIndex, bool isEnabled, out string errorText);
        /// <summary>
        /// 获得所有货位信息
        /// </summary>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        ST_Cell[] GetAllCellInfos(out string errorText);
        /// <summary>
        /// 获得多语言表中的所有语言对应的字段(列)名称
        /// </summary>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        string[] GetLanguageFields(out string errorText);
        /// <summary>
        /// 获得多语言表中的指定语言的所有描述信息
        /// </summary>
        /// <param name="language">多语言表中的语言字段(列)名称</param>
        /// <param name="errorText"></param>
        /// <returns></returns>
        [OperationContract]
        LanguageContent[] GetLanguageContent(string language, out string errorText);
        [OperationContract]
        [ServiceKnownType(typeof(Model.MDevice))]
        DevicesDic GetDevicesDic(out string errorText);

        /// <summary>
        /// 通过设置订阅的监控模式,刷新订阅
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        bool RefreshMonitoringMode();//20150103增加断网恢复
        /// <summary>
        /// 客户端登陆
        /// </summary>
        /// <param name="userID">客户端标识:机器名+用户名</param>
        /// <param name="errText"></param>
        /// <returns></returns>
        [OperationContract]
        bool RegisterClient(string userID, string userDescription, out string errText);

        /// <summary>
        /// 客户端注销登陆
        /// </summary>
        /// <param name="userID">客户端标识:机器名+用户名</param>
        /// <param name="errText"></param>
        /// <returns></returns>
        [OperationContract]
        bool LogoutClient(string userID, out string errText);
        /// <summary>
        /// 获取任务
        /// </summary>
        /// <param name="laneway">巷道限制</param>
        /// <param name="Order">更新"UPDATE",追加"APPEND",替换"REPLACE"</param>
        /// <returns></returns>
        [OperationContract]
        bool ObtainTask(string laneway, string Order);
        /// <summary>
        /// 停止获取任务
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        bool StopObtainTask();
        /// <summary>
        /// 打开命令开关
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        bool OrderTurnOn();
        /// <summary>
        /// 关闭命令开关
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        bool OrderTurnOff();
        /// <summary>
        /// 设备通讯初始化
        /// </summary>
        /// <param name="CommunicationType">通讯类型:OPCClient,SocketsTCPIP,SimensSerialPort</param>
        /// <param name="ErrText"></param>
        /// <returns></returns>
        [OperationContract]
        bool DeviceCommunicationInit(string CommunicationType, out string ErrText);
        /// <summary>
        /// 获得用户信息
        /// </summary>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        DataTable GetUsers(out string Errtext);
        /// <summary>
        /// 生成手工任务
        /// </summary>
        /// <param name="Handtask">手工任务结构</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool BuildHandTask(Model.HandTask Handtask, out string Errtext);
        /// <summary>
        /// 生成关联设备任务
        /// </summary>
        /// <param name="ConveyorIndex">输送机</param>
        /// <param name="ConveyorOrder">输送机命令</param>
        /// <param name="RgvIndex">穿梭车</param>
        /// <param name="RgvOrder">穿梭车命令</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool BuildHandAssociateTask(int ConveyorIndex, int ConveyorOrder, int RgvIndex, int RgvOrder, string RgvOrderName, out string Errtext);
        /// <summary>
        /// 生成自动任务
        /// </summary>
        /// <param name="Autotask">自动任务结构</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool BuildAutoTask(Model.AutoTask Autotask, out string Errtext);
        /// <summary>
        /// 调度任务调整
        /// </summary>
        /// <param name="ManKind">调度任务类型</param>
        /// <param name="ManagetaskID">调度任务索引</param>
        /// <param name="ActionID">管理任务调整代码:900删除,999完成</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool ModifyManageTask(int ManKind, int ManagetaskID, int ActionID, out string Errtext);
        /// <summary>
        /// 设备指令调整
        /// </summary>
        /// <param name="MonitortaskID">设备指令索引</param>
        /// <param name="ActionID">动作指令调整代码:800指令重发,900指令删除,999指令完成</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool ModifyMonitorTask(int DeviceIndex, int MonitortaskID, int ActionID, out string Errtext);
        /// <summary>
        /// 设置设备状态
        /// </summary>
        /// <param name="Devinfo"></param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetDeviceState(Model.MDevice Devinfo, out string Errtext);

        /// <summary>
        /// 获得设备信息
        /// </summary>
        /// <param name="Deviceindex"></param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        Model.MDevice GetDeviceInfo(int Deviceindex, out string Errtext);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="erroecode">“F_ErrorCode>=30”显示所有故障设备,“F_ErrorCode>=0”显示所有设备,“F_LockedState=-1”显示所有被停用设备 </param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        DataTable GetDeviceInfos(string erroecode, out string Errtext);

        /// <summary>
        /// 设置路径状态
        /// </summary>
        /// <param name="Routeinfo"></param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetRouteState(Model.MRoute Routeinfo, out string Errtext);
        /// <summary>
        /// 获得路径信息
        /// </summary>
        /// <param name="RouteID"></param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        Model.MRoute GetRouteInfo(decimal RouteID, out string Errtext);
        /// <summary>
        /// 获取多个路径信息
        /// </summary>
        /// <param name="RouteState"></param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        Model.MRoute[] GetRouteInfos(int RouteState, out string Errtext);
        /// <summary>
        /// 设置货叉关联等待时间
        /// </summary>
        /// <param name="WaitTime"></param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetForkCombinWaitTime(int WaitTime, out string Errtext);
        /// <summary>
        /// 获取货叉关联等待时间
        /// </summary>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        int GetForkCombinWaitTime(out string Errtext);
        /// <summary>
        /// 设置输送机输送超时时间
        /// </summary>
        /// <param name="Timeout"></param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetConveyorTimeOutTime(int Timeout, out string Errtext);

        /// <summary>
        /// 获得输送机输送超时时间
        /// </summary>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        int GetConveyorTimeOutTime(out string Errtext);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="MonitorOrManageDB">Manage/Monitor</param>
        /// <param name="ServerHostName">服务主机名称</param>
        /// <param name="DBServiceName">数据库服务名称</param>
        /// <param name="Username">用户名</param>
        /// <param name="Password">密码</param>
        /// <param name="Errtext">输出错误信息</param>
        /// <returns></returns>
        [OperationContract]
        bool SetDBConnection(string MonitorOrManageDB, string ServerHostName, string DBServiceName, string Username, string Password, out string Errtext);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="MonitorOrManageDB">Manage/Monitor</param>
        /// <param name="ServerHostName">服务主机名称</param>
        /// <param name="DBServiceName">数据库服务名称</param>
        /// <param name="Username">用户名</param>
        /// <param name="Password">密码</param>
        /// <param name="Errtext">输出错误信息</param>
        /// <returns></returns>
        [OperationContract]
        bool GetDBConnection(string MonitorOrManageDB, out string ServerHostName, out string DBServiceName, out string Username, out string Password, out string Errtext);
        /// <summary>
        /// 设置出入库站台属性
        /// </summary>
        /// <param name="deviceIndex"></param>
        /// <param name="IOStationProperty">1入库站台,2出库站台,0拣选站台</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetIOStationProperty(int deviceIndex, int IOStationProperty, out string Errtext);
        //[OperationContract]
        //DataView GetIOStationProperty(int deviceIndex, out string Errtext);
        /// <summary>
        /// 设置黑匣子参数
        /// </summary>
        /// <param name="FileCount">文件个数</param>
        /// <param name="FileSize">文件大小</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetBlackBoxParameter(int FileCount, int FileSize, out string Errtext);
        /// <summary>
        /// 查询黑匣子
        /// </summary>
        /// <param name="deviceIndex">设备索引</param>
        /// <param name="BeginTime">开始时间</param>
        /// <param name="EndTime">截止时间</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        string GetBlackBoxInfo(string deviceIndex, DateTime BeginTime, DateTime EndTime, out string Errtext);
        /// <summary>
        /// 获得自动任务历史
        /// </summary>
        /// <param name="BeginTime">开始时间</param>
        /// <param name="EndTime">截止时间</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        DataTable GetAutoTaskHistory(DateTime BeginTime, DateTime EndTime, out string Errtext);
        /// <summary>
        /// 删除某一时间段的自动任务的备份
        /// </summary>
        /// <param name="BeginTime"></param>
        /// <param name="EndTime"></param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool DeleteAutoTaskHistory(DateTime BeginTime, DateTime EndTime, out string Errtext);
        /// <summary>
        /// 设置用户信息及权限
        /// </summary>
        /// <param name="UserID">用户编号</param>
        /// <param name="UserName">用户名</param>
        /// <param name="Password">密码</param>
        /// <param name="Purview">权限</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetUserAndPurview(string UserID, string UserName, string Password, string Purview, out string Errtext);
        /// <summary>
        /// 获得用户信息及权限
        /// </summary>
        /// <param name="UserID">用户编号</param>
        /// <param name="UserName">用户名</param>
        /// <param name="Password">密码</param>
        /// <param name="Purview">权限</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool GetUserAndPurview(string UserID, out string UserName, out string Password, out string Purview, out string Errtext);
        /// <summary>
        /// 设置用户密码
        /// </summary>
        /// <param name="UserID">用户编号</param>
        /// <param name="Password">密码</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool SetUserPassword(string UserID, string Password, out string Errtext);
        /// <summary>
        /// 获得用户密码
        /// </summary>
        /// <param name="UserID">用户编号</param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        string GetUserPassword(string UserID, out string Errtext);
        /// <summary>
        /// 关闭调度系统
        /// </summary>
        /// <param name="ErrText"></param>
        /// <returns></returns>
        [OperationContract]
        bool ShutDownControlSystem(out string ErrText);
        /// <summary>
        /// 获得所有设备状态
        /// </summary>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool StartGetALLDeviceState(out string Errtext);
        /// <summary>
        /// 发送等待设备命令
        /// </summary>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool StartSendDeviceOrder(out string Errtext);
        /// <summary>
        /// 监听PLC请求
        /// </summary>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        //[OperationContract]
        //bool ListenPLCAsk(out string Errtext);
        /// <summary>
        /// 调度数据清理
        /// </summary>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        [OperationContract]
        bool DataClear(out string Errtext);
        /// <summary>
        /// 获得管理任务种类
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="monitorIndex">设备指令索引</param>
        /// <returns></returns>
        [OperationContract]
        int GetManageTaskKindFromMonitor(out string errtext, int monitorIndex);
        /// <summary>
        /// 获得管理任务索引
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="monitorIndex">设备指令索引</param>
        /// <returns></returns>
        [OperationContract]
        int GetManageTaskIndexFromMonitor(out string errtext, int monitorIndex);
        /// <summary>
        /// 获得设备种类索引
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="deviceIndex">设备索引</param>
        /// <returns></returns>
        [OperationContract]
        int GetDeviceKindIndex(out string errtext, int deviceIndex);
        /// <summary>
        /// 发送设备置位清零
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="deviceIndex"></param>
        /// <returns></returns>
        [OperationContract]
        bool SendDeviceReset(out string errtext, int deviceIndex, int ResetOrder);
        /// <summary>
        /// 心跳诊断
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        bool Heartbeat(out Model.MonitorInfo monitorinfo);//20130817richard
        /// <summary>
        /// 获得指定SQL语句返回的DataView
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="SQL"></param>
        /// <returns></returns>
        [OperationContract]
        DataTable GetDataView(out string errtext, string SQL);
        /// <summary>
        /// 只执行SQL,不反悔数据集的,例如insert,update,delete等
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="SQL"></param>
        /// <returns></returns>
        [OperationContract]
        int ExeSQLNoneQuery(out string errtext, string SQL);
        /// <summary>
        /// 获得指定SQL语句返回的DataView
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="SQL"></param>
        /// <returns></returns>
        [OperationContract]
        DataTable GetManDataView(out string errtext, string SQL);
        /// <summary>
        /// 只执行SQL,不反悔数据集的,例如insert,update,delete等
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="SQL"></param>
        /// <returns></returns>
        [OperationContract]
        int ExeManSQLNoneQuery(out string errtext, string SQL);
        [OperationContract]
        bool GetAllManageTask(out string errtext);
        [OperationContract]
        bool DisassembleTask(out string errtext);
        [OperationContract]
        bool SetLogicHaveGoods(out string errtext, bool ifHaveGoods, int deviceindex);
        [OperationContract]
        bool DealWithDeviceState(out string errtext, int deviceindex, byte[] splitbyteValue, byte[] devicestates);
        [OperationContract]
        Model.MDevice SendAllDeviceStates(int device);
        [OperationContract]
        bool WriteDBData(int deviceIndex, string DBBlock, string Wdata, out string errtext);
        [OperationContract]
        bool ReConnectOPCServer();//20130817richard
        void ActionError(int DeviceIdx, int TaskIdx, int ErrId);
        /// <summary>
        /// 获得所有设备信息 精简版(能够返回所有的数据)
        /// </summary>
        [OperationContract]
        byte[] GetAllDevicesString(out string errorText);
        /// <summary>
        /// 获得所有货位的信息
        /// </summary>
        [OperationContract]
        byte[] GetAllCellString(out string errorText);
        /// <summary>
        /// 获得某一设备上或货位上的物料信息
        /// </summary>
        [OperationContract]
        byte[] GetOneDeviceOrCellString(int DeviceIdx,int ForkIdx,string CellCode,out string errorText);
    }
    
}