SendWcsTaskAction.cs
10.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
using System;
using System.Collections.Generic;
using System.Data;
using Infrastructure;
using Quartz;
using WebApp;
using WebRepository;
namespace WebMvc
{
/// <summary>
/// 单据结果回传
/// </summary>
/// <summary>
/// 入库单结果回传
/// </summary>
[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class SendWcsTaskAction
{
private string ConnString { set; get; }
IJobExecutionContext Context { set; get; }
public SendWcsTaskAction(string _ConnString, IJobExecutionContext _Context)
{
ConnString = _ConnString;
Context = _Context;
}
public void Execute(JobContainer jobContainer)
{
string sql = "";
string upsql = "";
string sqls = "";
string sqld = "";
string uptask = "";
DbHelp dbHelp = new DbHelp(ConnString);
#region 执行任务语句
try
{
sql = string.Format(@"SELECT * FROM [dbo].[task_detail] WHERE status = {0}
AND taskNo IN(SELECT taskNo FROM[dbo].[task] WHERE lastStatus = {0})
AND
(
(
taskType IN('{2}')
AND containerCode NOT IN(SELECT code FROM dbo.container WHERE IsLock = 1)
)
OR taskType in ('{1}', '{3}')
)
ORDER BY priority DESC; ",
TaskStatus.待下发任务, TaskType.空容器入库, TaskType.容器出库, TaskType.容器回库
);
DataSet ds = dbHelp.SelectGet(sql);
List<TaskDetail> tdlist = new List<TaskDetail>();
foreach (DataRow dr in ds.Tables[0].Rows)
{
//foreach (DataColumn dc in ds.Tables[0].Columns)
//{
TaskDetail tdel = new TaskDetail();
tdel.TaskNo = dr["taskNo"].ToString();
tdel.TaskType = dr["taskType"].ToString();
tdel.ContainerCode = dr["containerCode"].ToString();
tdel.SourceLocation = dr["sourceLocation"].ToString();
tdel.DestinationLocation = dr["destinationLocation"].ToString();
tdel.Roadway = int.Parse(dr["roadway"].ToString());
tdel.Station = dr["station"].ToString();
tdel.Status = int.Parse(dr["status"].ToString());
tdel.Priority = int.Parse(dr["priority"].ToString());
// }
tdlist.Add(tdel);
}
foreach (TaskDetail td in tdlist)
{
string containerFilter = "";
if (td.TaskType == TaskType.容器出库)
{
containerFilter = " AND (containercode IS NULL OR containercode='')";
}
if (!string.IsNullOrEmpty(td.Station))
{
sqls = string.Format("SELECT top 1 id,code,name,containercode,isIn,isOut,isEmpty,isStop,type FROM dbo.station WHERE code = '{0}' {1}; ", td.Station, containerFilter);
}
else
{
sqls = string.Format("SELECT top 1 id,code,name,containercode,isIn,isOut,isEmpty,isStop,type FROM dbo.station WHERE code in (SELECT stationCode FROM dbo.station_roadway WHERE roadWay = '{0}' ) {1}; ", td.Roadway, containerFilter);
}
DataSet sds = dbHelp.SelectGet(sqls);
if (sds.Tables[0].Rows.Count > 0)
{
if (td.TaskType == TaskType.容器出库)
{
sqls = string.Format("SELECT top 1 locationCode FROM dbo.inventory WHERE containerCode = '{0}'; ", td.ContainerCode);
DataSet dsi = dbHelp.SelectGet(sqls);
if (dsi.Tables[0].Rows.Count > 0)
{
if (td.SourceLocation != dsi.Tables[0].Rows[0]["locationCode"].ToString())
{
throw new Exception("容器出库任务中起始仓位 与 目前实际仓位不符!");
//td.SourceLocation = dsi.Tables[0].Rows[0]["locationCode"].ToString();
}
}
}
td.Station = sds.Tables[0].Rows[0]["code"].ToString();
ApiRequest apiRequest = new ApiRequest("WCS");
WCSResponse<WcsTask> _WCSResponse = apiRequest.Post<WCSResponse<WcsTask>>(JsonHelper.Instance.Serialize(td), "IWcsTaskTest/CreateWcsTask", "任务下发");
if (_WCSResponse.Code == 200)
{
//锁定仓位和占用站台及锁定容器
if (td.TaskType == TaskType.容器出库)//托盘出库任务
{
upsql = string.Format("update [dbo].[task_detail] set status={2},station= '{1}',destinationLocation= '{1}' WHERE taskNo= '{0}';", td.TaskNo, sds.Tables[0].Rows[0]["code"].ToString(), TaskStatus.下达任务);
string outloc = string.Format("update [dbo].[location] set status='{1}' WHERE code= '{0}';", td.SourceLocation, LocationStatus.任务锁定中);
dbHelp.DataOperator(outloc);
string upstation = string.Format("update [dbo].[station] set containercode= '{1}' WHERE code= '{0}';", sds.Tables[0].Rows[0]["code"].ToString(), td.ContainerCode);
dbHelp.DataOperator(upstation);
string lockcontainer = string.Format("update [dbo].[container] set IsLock=1 WHERE code= '{0}';", td.ContainerCode);
dbHelp.DataOperator(lockcontainer);
}
else//托盘入库任务
{
//如果站台类型为多通道类型,下发成功后立即释放站台占用
if (int.Parse(sds.Tables[0].Rows[0]["type"].ToString()) == StationType.多通道)
{
string disstation = string.Format("update [dbo].[station] set containercode= '' WHERE code= '{0}';", sds.Tables[0].Rows[0]["code"].ToString());
dbHelp.DataOperator(disstation);
}
else
{
if (td.TaskType==TaskType.空容器入库)
{
string upssql = string.Format("update [dbo].[station] set containercode= '{1}' WHERE code= '{0}';", sds.Tables[0].Rows[0]["code"].ToString(), td.ContainerCode);
dbHelp.DataOperator(upssql);
}
}
upsql = string.Format("update [dbo].[task_detail] set status={1} WHERE taskNo= '{0}';", td.TaskNo, TaskStatus.下达任务);
string inloc = string.Format("update [dbo].[location] set status= '{0}' WHERE code= '{1}';", LocationStatus.任务锁定中, td.DestinationLocation);
dbHelp.DataOperator(inloc);
}
//更新托盘出入库任务状态
dbHelp.DataOperator(upsql);
uptask = string.Format("update [dbo].[task] set firstStatus={1},lastStatus={1} WHERE taskNo= '{0}';", td.TaskNo, TaskStatus.下达任务);
dbHelp.DataOperator(uptask);
//更新单据出入库主任务头尾状态和明细任务状态
sqld = string.Format("UPDATE dbo.task_detail SET status = {0},station='{1}' WHERE containerCode = '{2}' AND status >= {3} AND status < {4};",
TaskStatus.下达任务, sds.Tables[0].Rows[0]["code"].ToString(), td.ContainerCode, TaskStatus.新建任务, TaskStatus.已经完成);
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}); ",
td.ContainerCode, 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)
{
throw ex;
}
#endregion
}
}
}