倉儲批拆解Oracle版
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TiptopAutoShip
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Task t1 = Task.Run(() => SplitStock());
}
private void SplitStock()
{
Stopwatch sw = new Stopwatch();
sw.Start();
string sql = "truncate table output_stock";
OracleHelper.ExecuteNonQuery(sql);
sql = $@"insert into output_stock SELECT row_number() OVER (ORDER BY img01,img04) ID,
img01,img02,img04,img10,0 use_qty,img10 balance
FROM img_file WHERE img01 IN (
SELECT DISTINCT oeb04
FROM oeb_file
LEFT JOIN oea_file ON OEB01=oea01
LEFT JOIN (SELECT img01,sum(img10) img10 FROM img_file WHERE img10>0 GROUP BY img01) t1 ON oeb04=t1.img01
WHERE oeb24<oeb12 AND oea03 IN ('XXXX','XXXXX') AND img10>0
AND oeaconf='Y' AND oea49<>'2'
) AND img02 NOT IN('HV9','DV9') AND IMG10>0 ";
OracleHelper.ExecuteNonQuery(sql);
sql = "truncate table need_ship";
OracleHelper.ExecuteNonQuery(sql);
sql = $@"insert into need_ship SELECT ROW_number() OVER (ORDER BY oeb04,oeb15) ID
,ROW_number() OVER (PARTITION BY oeb04 ORDER BY oeb04,oeb15) part_id,
oeb01,oeb03,oeb04,oeb12-oeb24 oeb12,oeb15 FROM oeb_file
LEFT JOIN oea_file ON OEB01=oea01
LEFT JOIN (SELECT img01,sum(img10) img10 FROM img_file WHERE img10>0 GROUP BY img01) t1 ON oeb04=t1.img01
WHERE oeb24<oeb12 AND oea03 IN ('HKKW','CDGYR') AND img10>0
AND oeaconf='Y' AND oea49<>'2'
AND img10>0
ORDER BY oeb04,oeb15 ";
OracleHelper.ExecuteNonQuery(sql);
sql = "truncate table ship_reslut";
OracleHelper.ExecuteNonQuery(sql);
DataTable ReqDt = new DataTable();
ReqDt.Clear();
DataTable SupplyDt = new DataTable();
SupplyDt.Clear();
DataTable StockRowDt = new DataTable();
StockRowDt.Clear();
sql = $@"begin update output_stock set use_qty=0; ";
//OracleHelper.ExecuteNonQuery(sql);
sql = sql + $@"update output_stock set balance=IMG10-USE_QTY;end;";
OracleHelper.ExecuteNonQuery(sql);
int n, RowID = 0;
sql = "select count(*) from need_ship";
n = int.Parse(OracleHelper.ExecuteScalar(sql));
int StockRow;
sql = "SELECT COUNT(*) FROM output_stock";
StockRow = int.Parse(OracleHelper.ExecuteScalar(sql));
decimal SupplyQty, RequestQty;
label2.BeginInvoke(new Action(() => { label2.Text = sw.Elapsed.ToString(); }));
//bool SplitFlag = false;
int MinJ = 0, MaxJ = 0;
for (int i = 1; i <= n; i++)
{
//SplitFlag = false;
RowID = RowID + 1;//這裡不+1,沒有庫存,進不去的時候,換下一個料號,會亂
sql = $@"select * from need_ship where id={i}";
ReqDt.Clear();
ReqDt = OracleHelper.ExecuteDataTable(sql);
//一個料如果沒了庫存,就不要拆解這行了。不加下面這段,可以清楚的看到哪些沒有庫存,加上速度會慢。
//拆5000條,多20秒
sql = $@"select nvl(sum(BALANCE),0) from output_stock where img01='{ReqDt.Rows[0]["oeb04"]}' ";
if (decimal.Parse(OracleHelper.ExecuteScalar(sql)) == 0)
{
continue;
}
////////////////////////////////////////////////////////////
sql = $@"insert into ship_reslut(ID,part_id,oeb01,oeb03,oeb04,oeb12)
values ({RowID},{ReqDt.Rows[0]["part_id"]},'{ReqDt.Rows[0]["oeb01"]}'
,{ReqDt.Rows[0]["oeb03"]},'{ReqDt.Rows[0]["oeb04"]}',{ReqDt.Rows[0]["oeb12"]})";
OracleHelper.ExecuteNonQuery(sql);
RequestQty = decimal.Parse(ReqDt.Rows[0]["oeb12"].ToString());
label1.BeginInvoke(new Action(() => { label1.Text = ReqDt.Rows[0]["oeb04"].ToString(); }));
label2.BeginInvoke(new Action(() => { label2.Text = sw.Elapsed.ToString(); }));
//找一下庫存的這個料的序號是從多少開始的,減少循環次數
sql = $@"select nvl(min(id),0),nvl(max(id),0) from output_stock where img01='{ReqDt.Rows[0]["oeb04"]}' and balance>0 ";
StockRowDt.Clear();
StockRowDt = OracleHelper.ExecuteDataTable(sql);
//MinJ = int.Parse(OracleHelper.ExecuteScalar(sql));
MinJ = int.Parse(StockRowDt.Rows[0][0].ToString());
MaxJ = int.Parse(StockRowDt.Rows[0][1].ToString());
if (MinJ == 0)
{
break;
}
if (MaxJ == 0)
{
break;
}
for (int j = MinJ; j <= MaxJ; j++)
{
//判斷一下,沒有庫存,就直接退出了
sql = $@"select nvl(sum(BALANCE),0) from output_stock where img01='{ReqDt.Rows[0]["oeb04"]}' ";
if (decimal.Parse(OracleHelper.ExecuteScalar(sql)) == 0)
{
break;
}
sql = $@"select * from output_stock where id={j} and img01='{ReqDt.Rows[0]["oeb04"]}' ";
SupplyDt = OracleHelper.ExecuteDataTable(sql);
//庫存一個料的序號都是挨著的,如果一個料已經拆過,並且序號走到下一個了,還查不到記錄,說明庫存已經用完了
//可以直接跳出來了
//if (SupplyDt.Rows.Count == 0 && SplitFlag == true)
//{
// break;
//}
if (SupplyDt.Rows.Count == 0)
{
continue;
}
else if (decimal.Parse(SupplyDt.Rows[0]["balance"].ToString()) == 0)
{
continue;
}
//SplitFlag = true;
SupplyQty = decimal.Parse(SupplyDt.Rows[0]["BALANCE"].ToString());
if (SupplyQty >= RequestQty)//供應大於需求,出貨等於需求,
{
sql = $@"begin update ship_reslut set supply_qty={RequestQty},img02='{SupplyDt.Rows[0]["img02"]}'
,img04='{SupplyDt.Rows[0]["img04"]}' WHERE ID={RowID};";
//OracleHelper.ExecuteNonQuery(sql);
//計算倉庫剩餘
sql = sql + $@"update output_stock set use_qty=use_qty+{RequestQty} where id={j};";
//OracleHelper.ExecuteNonQuery(sql);
sql = sql + $@"update output_stock set balance=IMG10-USE_QTY where id={j};";
//OracleHelper.ExecuteNonQuery(sql);
sql = sql + $@"update ship_reslut set BALANCE_QTY=OEB12-supply_qty where id={RowID};end;";
OracleHelper.ExecuteNonQuery(sql);
RowID = RowID + 1;
break;
}
else if (SupplyQty < RequestQty)
{
//更新出貨表的用量
sql = $@"begin update ship_reslut set supply_qty={SupplyQty},img02='{SupplyDt.Rows[0]["img02"]}'
,img04='{SupplyDt.Rows[0]["img04"]}' WHERE ID={RowID};";
//OracleHelper.ExecuteNonQuery(sql);
//更新出貨表結餘數量
sql = sql + $@"update ship_reslut set BALANCE_QTY=OEB12-supply_qty where id={RowID};";
//OracleHelper.ExecuteNonQuery(sql);
//更新庫存表
sql = sql + $@"update output_stock set use_qty=use_qty+{SupplyQty} where id={j};";
//OracleHelper.ExecuteNonQuery(sql);
sql = sql + $@"update output_stock set balance=IMG10-USE_QTY where id={j};";
//OracleHelper.ExecuteNonQuery(sql);
//新增一行
RowID = RowID + 1;
sql = sql + $@"insert into ship_reslut(ID,part_id,oeb01,oeb03,oeb04,oeb12,supply_qty)
values ({RowID},{ReqDt.Rows[0]["part_id"]},'{ReqDt.Rows[0]["oeb01"]}'
,{ReqDt.Rows[0]["oeb03"]},'{ReqDt.Rows[0]["oeb04"]}',{RequestQty - SupplyQty},0);";
//OracleHelper.ExecuteNonQuery(sql);
sql = sql + $@"update ship_reslut set BALANCE_QTY=OEB12-supply_qty where id={RowID};end; ";
OracleHelper.ExecuteNonQuery(sql);
//sql = $@"select BALANCE_QTY from ship_reslut where id={RowID}";
//BalanceQty = decimal.Parse(OracleHelper.ExecuteScalar(sql));
//更新RequestQty
RequestQty = RequestQty - SupplyQty;
//if (BalanceQty<=0)
//{
// break;
//}
}
}
}
sw.Stop();
label2.BeginInvoke(new Action(() => { label2.Text = "拆解完成:" + sw.Elapsed; }));
label2.BeginInvoke(new Action(() => { this.Close(); }));
}
private void Form1_Load(object sender, EventArgs e)
{
ShowInTaskbar = false;
Task t1 = Task.Run(() => SplitStock());
}
}
}