SendWmsTaskAction.cs 25.2 KB
using System;
using System.Collections.Generic;
using System.Data;
using Infrastructure;
using Quartz;
using WebApp;
using WebRepository;

namespace WebMvc
{
    /// <summary>
    /// 任务预警
    /// </summary>
    [PersistJobDataAfterExecution]
    [DisallowConcurrentExecution]
    public class SendWmsTaskAction
    {
        private string ConnString { set; get; }
        IJobExecutionContext Context { set; get; }

        public SendWmsTaskAction(string _ConnString, IJobExecutionContext _Context)
        {
            ConnString = _ConnString;
            Context = _Context;
        }

        public void Execute(JobContainer jobContainer)
        {
            DbHelp dbHelp = new DbHelp(ConnString);
            string str = "";
            try
            {
                string sql = "";
                string sqlins = "";
                sql = string.Format(@"SELECT B.station,A.sourceCode,A.shipmentCode, A.materialCode, A.batch, A.lot,A.qty,A.status,A.createTime,B.priority
                                      FROM dbo.shipment_detail A
                                      JOIN shipment_header B ON A.shipmentCode = B.code AND A.status = {0} 
                                      ORDER BY A.createTime, A.sourceCode",
                                    ShipmentHeaderStatus.新建);
                DataSet ds = dbHelp.SelectGet(sql);

                int Priority = 0;
                string Station = "";
                ShipmentDetail sd = new ShipmentDetail();
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    sd.SourceCode = dr["sourceCode"].ToString();
                    sd.ShipmentCode = dr["shipmentCode"].ToString();
                    sd.MaterialCode = dr["materialCode"].ToString();
                    sd.Batch = dr["batch"].ToString();
                    sd.Lot = dr["lot"].ToString();
                    sd.Qty = decimal.Parse(dr["qty"].ToString());
                    Station = dr["station"].ToString();
                    sd.Status = short.Parse(dr["status"].ToString());
                    Priority = int.Parse(dr["priority"].ToString());
                    str = AddTaskInfo(sd, Station, Priority);
                    if (str == "")
                    {
                        sql = string.Format(@"SELECT ISNULL(SUM(hadQty),0) qty FROM dbo.task_detail
                                            WHERE orderCode = '{0}' AND sourceCode = '{1}' AND materialCode = '{2}'
                                            GROUP BY  orderCode",
                                            sd.ShipmentCode,sd.SourceCode,sd.MaterialCode);
                         ds = dbHelp.SelectGet(sql);
                        if (decimal.Parse(ds.Tables[0].Rows[0]["qty"].ToString()) > 0)
                        {
                            if ((sd.Qty - decimal.Parse(ds.Tables[0].Rows[0]["qty"].ToString())) <= 0)
                            {
                                sqlins = string.Format(@"UPDATE dbo.shipment_detail
                                                    SET qtyDivided = {0},status = {1}
                                                    WHERE sourceCode = '{2}' AND shipmentCode = '{3}' AND materialCode = '{4}'",
                                                        decimal.Parse(ds.Tables[0].Rows[0]["qty"].ToString()), ShipmentHeaderStatus.分配完成, sd.SourceCode, sd.ShipmentCode, sd.MaterialCode);
                                dbHelp.DataOperator(sqlins);
                            }
                            else
                            {
                                sqlins = string.Format(@"UPDATE dbo.shipment_detail
                                                    SET qtyDivided = {0}
                                                    WHERE sourceCode = '{1}' AND shipmentCode = '{2}' AND materialCode = '{3}'",
                            decimal.Parse(ds.Tables[0].Rows[0]["qty"].ToString()), sd.SourceCode, sd.ShipmentCode, sd.MaterialCode);
                                dbHelp.DataOperator(sqlins);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string AddTaskInfo(ShipmentDetail shipmentDetail, string Station, int Priority)
        {
            string strError = "";
            string sqlsh = "";
            string sqltask = "";
            string sqlinv = "";
            string sqlShDeil = "";
            string sqlInsDeil = "";
            string sqldeil = "";
            string sqlType = "";
            string sqlStation = "";
            DbHelp dbHelp = new DbHelp(ConnString);
            try
            {
                //建立单据主任务和明细任务
                Task task = new Task();
                var tno = "";
                sqlsh = string.Format(@"SELECT A.taskNo,B.type,B.totalQty,B.totalLines FROM dbo.task A
                                            JOIN dbo.shipment_header B ON A.orderCode = B.code AND A.orderCode = '{0}'",
                                shipmentDetail.ShipmentCode);
                DataSet ds = dbHelp.SelectGet(sqlsh);
                if (ds.Tables[0].Rows.Count > 0)
                {
                    tno = ds.Tables[0].Rows[0]["taskNo"].ToString();
                }
                else
                {
                    tno = GetTaskNo(TaskNo.出库自动分配);
                    sqltask = string.Format(@"INSERT INTO dbo.task (taskNo, sourceCode, orderCode, firstStatus, lastStatus, createTime, createBy)
                                            VALUES ('{0}','{1}','{2}',{3},{4},'{5}','{6}')",
                                            tno, shipmentDetail.SourceCode, shipmentDetail.ShipmentCode, TaskStatus.待下发任务, TaskStatus.待下发任务, DateTime.Now.ToString("yyyyMMdd HH:mm:ss"), "System");
                    dbHelp.DataOperator(sqltask);
                }

                sqlinv = string.Format(@"SELECT A.materialCode,A.containerCode,ISNULL(A.qty,0) qty,A.locationCode,ISNULL(C.roadway,0) roadway FROM dbo.inventory A
                                            JOIN container B ON A.containerCode = B.code 
                                            AND A.taskStatus = 'idle' AND B.IsLock != 2 AND A.materialCode = '{0}'
                                            JOIN dbo.location C ON C.code = A.locationCode
                                            ORDER BY A.batch",
                                        shipmentDetail.MaterialCode);
                DataSet dinv = dbHelp.SelectGet(sqlinv);
                var sqty = shipmentDetail.Qty;
                decimal invQty;
                foreach (DataRow dr in dinv.Tables[0].Rows)
                {
                    sqlShDeil = string.Format(@"SELECT taskNo FROM dbo.task_detail
                                                WHERE station <> '{0}' AND containerCode = '{1}' AND taskType <> '{2}'",
                                        Station, dr["containerCode"].ToString() , TaskType.容器出库);
                    DataSet dShDeil = dbHelp.SelectGet(sqlShDeil);
                    if (dShDeil.Tables[0].Rows.Count == 0)
                    {
                        invQty = decimal.Parse(dr["qty"].ToString());
                        sqlShDeil = string.Format(@"SELECT ISNULL(SUM(hadQty),0) hadQty FROM dbo.task_detail
                                                WHERE materialCode = '{0}' AND status >= {1} AND status < {2} AND containerCode = '{3}' AND taskNo NOT LIKE 'I%'",
                                            shipmentDetail.MaterialCode, TaskStatus.新建任务, TaskStatus.已经完成, dr["containerCode"].ToString());
                        dShDeil = dbHelp.SelectGet(sqlShDeil);
                    }
                    else
                    {
                        continue;
                    }

                    if (decimal.Parse(dShDeil.Tables[0].Rows[0]["hadQty"].ToString()) != 0)
                    {
                        decimal taskhadqty = decimal.Parse(dShDeil.Tables[0].Rows[0]["hadQty"].ToString());
                        invQty = invQty - taskhadqty;
                    }

                    if (invQty == 0)
                    {
                        continue;
                    }

                    ////暂存站台判断
                    ///////////////
                    //sqlType = string.Format(@"SELECT code
                    //                        FROM dbo.station
                    //                        WHERE type = 6 AND code = '{0}'",
                    //                        Station);
                    //DataSet dType = dbHelp.SelectGet(sqlType);
                    //if (dType.Tables[0].Rows.Count > 0)
                    //{
                    //    DataSet dStation = new DataSet();
                    //    if (int.Parse(dr["roadway"].ToString()) == 4)
                    //    {
                    //        sqlStation = string.Format(@"SELECT TOP 1 A.code FROM dbo.station A
                    //                                    JOIN station_roadway B ON A.code = B.stationCode AND A.type = 6 AND B.roadWay = {0} AND A.containercode = '' 
                    //                                    ORDER BY A.code DESC",
                    //    int.Parse(dr["roadway"].ToString()));
                    //        dStation = dbHelp.SelectGet(sqlStation);
                    //    }
                    //    else
                    //    {
                    //        sqlStation = string.Format(@"SELECT TOP 1 A.code FROM dbo.station A
                    //                                    JOIN station_roadway B ON A.code = B.stationCode AND A.type = 6 AND B.roadWay = {0} AND A.containercode = '' 
                    //                                    ORDER BY A.code",
                    //    int.Parse(dr["roadway"].ToString()));
                    //        dStation = dbHelp.SelectGet(sqlStation);
                    //    }
                    //    //占用暂存台
                    //    if (dStation.Tables[0].Rows.Count == 0)
                    //    {
                    //        sqlStation = string.Format(@"SELECT A.code,ISNULL(COUNT(C.station),0) num FROM dbo.station A
                    //                                    JOIN station_roadway B ON A.code = B.stationCode AND A.type = 6 AND B.roadWay = {0}
                    //                                    LEFT JOIN task_detail C ON A.code = C.station AND C.taskType = 'POUT'
                    //                                    GROUP BY A.code
                    //                                    ORDER BY num, A.code DESC",
                    //                                int.Parse(dr["roadway"].ToString()));
                    //        dStation = dbHelp.SelectGet(sqlStation);
                    //    }
                    //    areaStation = dStation.Tables[0].Rows[0]["code"].ToString();
                    //}
                    //////////////////////////////

                    if (invQty >= sqty)
                    {
                        //出库主表任务明细
                        TaskDetail taskDetail = new TaskDetail();
                        sqlInsDeil = string.Format(@"INSERT INTO dbo.task_detail (taskNo, taskType, sourceCode, containerCode, orderCode, materialCode, batch, lot, oderQty, containerQty, hadQty, sourceLocation, destinationLocation, roadway, station, status, priority, createTime)
                                                VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}',{8},{9},{10},'{11}','{12}',{13},'{14}',{15},'{16}','{17}')",
                                                    tno, TaskType.分拣出库, shipmentDetail.SourceCode, dr["containerCode"].ToString(), shipmentDetail.ShipmentCode, shipmentDetail.MaterialCode, shipmentDetail.Batch,
                                                    shipmentDetail.Lot, shipmentDetail.Qty, invQty, sqty, dr["locationCode"].ToString(), Station, dr["roadway"].ToString(),
                                                    Station, TaskStatus.待下发任务, Priority, DateTime.Now.ToString("yyyyMMdd HH:mm:ss"));
                        dbHelp.DataOperator(sqlInsDeil);
                        //建立容器出库任务
                        sqldeil = string.Format(@"SELECT taskNo FROM dbo.task_detail
                                            WHERE  status >= {0} AND status < {1} AND taskType = '{2}' AND containerCode = '{3}'",
                                             TaskStatus.新建任务, TaskStatus.已经完成, TaskType.容器出库, dr["containerCode"].ToString());
                        DataSet dDeil = dbHelp.SelectGet(sqldeil);
                        if (dDeil.Tables[0].Rows.Count == 0)
                        {
                            //容器出库主任务
                            var taskNo = GetTaskNo(TaskNo.容器出库);
                            sqltask = string.Format(@"INSERT INTO dbo.task (taskNo, sourceCode, orderCode, businessType, firstStatus, lastStatus, createTime, createBy)
                                            VALUES ('{0}','{1}','{2}','{3}',{4},{5},'{6}','{7}')",
                                                taskNo, shipmentDetail.SourceCode, shipmentDetail.ShipmentCode, BusinessType.出库_其他出库单
                                                , TaskStatus.待下发任务, TaskStatus.待下发任务, DateTime.Now.ToString("yyyyMMdd HH:mm:ss"), "System");
                            dbHelp.DataOperator(sqltask);
                            //容器出库子任务
                            sqlInsDeil = string.Format(@"INSERT INTO dbo.task_detail (taskNo, taskType, sourceCode, containerCode, orderCode, materialCode, batch, lot, oderQty, containerQty, hadQty, sourceLocation, destinationLocation, roadway, station, status, priority, createTime)
                                                VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}',{8},{9},{10},'{11}','{12}',{13},'{14}',{15},'{16}','{17}')",
                                taskNo, TaskType.容器出库, shipmentDetail.SourceCode, dr["containerCode"].ToString(), shipmentDetail.ShipmentCode, shipmentDetail.MaterialCode, shipmentDetail.Batch,
                                shipmentDetail.Lot, 0, 0, 0, dr["locationCode"].ToString(), Station, dr["roadway"].ToString(),
                                Station, TaskStatus.待下发任务, Priority, DateTime.Now.ToString("yyyyMMdd HH:mm:ss"));
                            dbHelp.DataOperator(sqlInsDeil);
                            break;
                        }
                        else
                        {
                            //更新单据出入库主任务头尾状态和明细任务状态
                            string sqld = string.Format("UPDATE dbo.task_detail SET status = {0} WHERE containerCode = '{1}' AND status >= {2} AND status < {3} AND taskType NOT IN('{4}');",
                                TaskStatus.下达任务, dr["containerCode"].ToString(), TaskStatus.新建任务, TaskStatus.已经完成, TaskType.站台到站台);
                            dbHelp.DataOperator(sqld);

                            string tasksql = string.Format("select * from [dbo].[task] where taskNo in (select taskNo from dbo.task_detail WHERE containerCode = '{0}' AND status >= {1} AND status < {2}); ",
                                dr["containerCode"].ToString(), TaskStatus.新建任务, TaskStatus.已经完成);
                            DataSet taskds = dbHelp.SelectGet(tasksql);
                            for (int i = 0; i < taskds.Tables[0].Rows.Count; i++)
                            {
                                string taskdetailsql = string.Format("select top 1 status from dbo.task_detail WHERE taskNo = '{0}' AND status >= {1} AND status < {2} ORDER BY status; ",
                                    taskds.Tables[0].Rows[i]["taskNo"].ToString(), TaskStatus.新建任务, TaskStatus.已经完成);
                                DataSet taskdetailds = dbHelp.SelectGet(taskdetailsql);
                                int minstatus = int.Parse(taskdetailds.Tables[0].Rows[0]["status"].ToString());
                                //更新单据任务的头状态
                                if (int.Parse(taskds.Tables[0].Rows[i]["firstStatus"].ToString()) < TaskStatus.下达任务)
                                {
                                    string uptaskdjf = string.Format("update [dbo].[task] set firstStatus={0} WHERE  taskNo= '{1}';", TaskStatus.下达任务, taskds.Tables[0].Rows[i]["taskNo"].ToString());
                                    dbHelp.DataOperator(uptaskdjf);
                                }
                                //更新单据任务的尾状态
                                if (int.Parse(taskds.Tables[0].Rows[i]["lastStatus"].ToString()) < minstatus)
                                {
                                    string uptaskdjl = string.Format("update [dbo].[task] set lastStatus='{0}' WHERE  taskNo= '{1}';", minstatus, taskds.Tables[0].Rows[i]["taskNo"].ToString());
                                    dbHelp.DataOperator(uptaskdjl);
                                }
                            }
                        }
                    }
                    else
                    {
                        //出库主表任务明细
                        TaskDetail taskDetail = new TaskDetail();
                        sqlInsDeil = string.Format(@"INSERT INTO dbo.task_detail (taskNo, taskType, sourceCode, containerCode, orderCode, materialCode, batch, lot, oderQty, containerQty, hadQty, sourceLocation, destinationLocation, roadway, station, status, priority, createTime)
                                                VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}',{8},{9},{10},'{11}','{12}',{13},'{14}',{15},'{16}','{17}')",
                                                    tno, TaskType.整盘出库, shipmentDetail.SourceCode, dr["containerCode"].ToString(), shipmentDetail.ShipmentCode, shipmentDetail.MaterialCode, shipmentDetail.Batch,
                                                    shipmentDetail.Lot, shipmentDetail.Qty, invQty, invQty, dr["locationCode"].ToString(), Station,int.Parse(dr["roadway"].ToString()),
                                                    Station, TaskStatus.待下发任务, Priority, DateTime.Now.ToString("yyyyMMdd HH:mm:ss"));
                        dbHelp.DataOperator(sqlInsDeil);
                        sqty = sqty - invQty;
                        //建立容器出库任务
                        sqldeil = string.Format(@"SELECT taskNo FROM dbo.task_detail
                                            WHERE  status >= {0} AND status < {1} AND taskType = '{2}' AND containerCode = '{3}'",
                                             TaskStatus.新建任务, TaskStatus.已经完成, TaskType.容器出库, dr["containerCode"].ToString());
                        DataSet dDeil = dbHelp.SelectGet(sqldeil);

                        if (dDeil.Tables[0].Rows.Count == 0)
                        {
                            //容器出库主任务
                            var taskNo = GetTaskNo(TaskNo.容器出库);
                            sqltask = string.Format(@"INSERT INTO dbo.task (taskNo, sourceCode, orderCode, businessType, firstStatus, lastStatus, createTime, createBy)
                                            VALUES ('{0}','{1}','{2}','{3}',{4},{5},'{6}','{7}')",
                                                taskNo, shipmentDetail.SourceCode, shipmentDetail.ShipmentCode, BusinessType.出库_其他出库单
                                                , TaskStatus.待下发任务, TaskStatus.待下发任务, DateTime.Now.ToString("yyyyMMdd HH:mm:ss"), "System");
                            dbHelp.DataOperator(sqltask);
                            //容器出库子任务
                            sqlInsDeil = string.Format(@"INSERT INTO dbo.task_detail (taskNo, taskType, sourceCode, containerCode, orderCode, materialCode, batch, lot, oderQty, containerQty, hadQty, sourceLocation, destinationLocation, roadway, station, status, priority, createTime)
                                                VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}',{8},{9},{10},'{11}','{12}',{13},'{14}',{15},'{16}','{17}')",
                                taskNo, TaskType.容器出库, shipmentDetail.SourceCode, dr["containerCode"].ToString(), shipmentDetail.ShipmentCode, shipmentDetail.MaterialCode, shipmentDetail.Batch,
                                shipmentDetail.Lot, 0, 0, 0, dr["locationCode"].ToString(), Station, dr["roadway"].ToString(),
                                Station, TaskStatus.待下发任务, Priority, DateTime.Now.ToString("yyyyMMdd HH:mm:ss"));
                            dbHelp.DataOperator(sqlInsDeil);
                        }
                        else
                        {
                            //更新单据出入库主任务头尾状态和明细任务状态
                            string sqld = string.Format("UPDATE dbo.task_detail SET status = {0} WHERE containerCode = '{1}' AND status >= {2} AND status < {3} AND taskType NOT IN('{4}');",
                                TaskStatus.下达任务, dr["containerCode"].ToString(), TaskStatus.新建任务, TaskStatus.已经完成, TaskType.站台到站台);
                            dbHelp.DataOperator(sqld);

                            string tasksql = string.Format("select * from [dbo].[task] where taskNo in (select taskNo from dbo.task_detail WHERE containerCode = '{0}' AND status >= {1} AND status < {2}); ",
                                dr["containerCode"].ToString(), TaskStatus.新建任务, TaskStatus.已经完成);
                            DataSet taskds = dbHelp.SelectGet(tasksql);
                            for (int i = 0; i < taskds.Tables[0].Rows.Count; i++)
                            {
                                string taskdetailsql = string.Format("select top 1 status from dbo.task_detail WHERE taskNo = '{0}' AND status >= {1} AND status < {2} ORDER BY status; ",
                                    taskds.Tables[0].Rows[i]["taskNo"].ToString(), TaskStatus.新建任务, TaskStatus.已经完成);
                                DataSet taskdetailds = dbHelp.SelectGet(taskdetailsql);
                                int minstatus = int.Parse(taskdetailds.Tables[0].Rows[0]["status"].ToString());
                                //更新单据任务的头状态
                                if (int.Parse(taskds.Tables[0].Rows[i]["firstStatus"].ToString()) < TaskStatus.下达任务)
                                {
                                    string uptaskdjf = string.Format("update [dbo].[task] set firstStatus={0} WHERE  taskNo= '{1}';", TaskStatus.下达任务, taskds.Tables[0].Rows[i]["taskNo"].ToString());
                                    dbHelp.DataOperator(uptaskdjf);
                                }
                                //更新单据任务的尾状态
                                if (int.Parse(taskds.Tables[0].Rows[i]["lastStatus"].ToString()) < minstatus)
                                {
                                    string uptaskdjl = string.Format("update [dbo].[task] set lastStatus='{0}' WHERE  taskNo= '{1}';", minstatus, taskds.Tables[0].Rows[i]["taskNo"].ToString());
                                    dbHelp.DataOperator(uptaskdjl);
                                }
                            }
                        }
                    }
                    }
                }
            catch (Exception ex)
            {
                strError = ex.Message;
                return strError;
            }
            return strError;
        }

        public string GetTaskNo(string TaskType, int SeqLength = 4)
        {
            string Value = "1";
            string sql = "";
            string sqlup = "";
            DbHelp dbHelp = new DbHelp(ConnString);
            sql = string.Format(@"SELECT Type, Value
                            FROM dbo.sys_count
                            WHERE Type = '{0}'",
                            TaskType);
            DataSet ds = dbHelp.SelectGet(sql);
            string sysValue = ds.Tables[0].Rows[0]["Value"].ToString();
            if (sysValue == null)
            {
                Value = TaskType + DateTime.Now.ToString("yyyyMMdd") + Value.PadLeft(SeqLength, '0');
                sqlup = string.Format(@"UPDATE dbo.sys_count
                        SET Value = '{0}'
                        WHERE Type = '{1}'",
                        Value, TaskType);
                dbHelp.DataOperator(sqlup);
            }
            else
            {
                string Date = sysValue.Substring(TaskType.Length, 8);

                if (Date == DateTime.Now.ToString("yyyyMMdd"))
                {
                    Value = Date + (int.Parse(sysValue.Substring(sysValue.Length - 4, 4)) + 1).ToString().PadLeft(SeqLength, '0');
                }
                else
                {
                    Value = DateTime.Now.ToString("yyyyMMdd") + Value.PadLeft(SeqLength, '0');
                }
                Value = TaskType + Value;
                sqlup = string.Format(@"UPDATE dbo.sys_count
                        SET Value = '{0}'
                        WHERE Type = '{1}'",
                        Value, TaskType);
                dbHelp.DataOperator(sqlup);
            }
            return Value;
        }
    }
}