C# Oracle 倉儲批拆解

倉儲批拆解Oracle版

聯繫我[email protected]

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());
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章