標籤: 軟體委外

產品成本計算系統(軟體開發、軟件開發、客製化軟體)

今年7月份由一家多年在越南設廠的文具用品的台商,委外我量身定做開發屬於他們的ERP系統,該廠商在未委外給我開發軟體時,也在其他知名的套裝軟體有多年的使用經驗,但因為市面上的套裝軟體事實上無法真正的負荷他們的流程以及產品與用料成本計價方式,所以透過 Skype 與我洽談很久(談了2個月),確定我們開發團隊可以了解他們目前工廠遇到的問題就正式放心交個我進行開發設計了。


  不過難度比我想象的還複雜,不是一般BOM表可以用來克服成本計算,所有要分析他們所有會產生成本的各種因素,如材料、人力、耗材、製程,下面系統畫面是一個部分使用者操作畫面,可以用來自動計算單一個產品的所有影響成本的統計計算,未來他們就只要填寫報價單,轉正式訂單,系統就會把複雜的成本計算自動算好,帶入報價與訂單系統。


aaa


一個好的軟體系統,可以有效提升企業與工廠內部管理,讓企業專注於客戶接單、產品研發、而流程整合與數據分析就交給好的軟體系統。




網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

透過 Delegate 委託支援的方法,撰寫非同步任務(軟體開發、客製化軟體、系統設計)

      此篇文章主要是延續之前的文章 【C#多工作業與平行處理技術講解】,講解與實作如何在利用強大的 透過 Delegate 委託支援的方法,撰寫非同步任務,這裡一樣我會透過簡單程式碼進行實作教學。

       在.Net 平台的委派類型(Delegate)自身就可以很容易地使用非同步作業,因為只要是委派(Delegate)類型都一點有 BeginInvoke 以及對應的 EndInvoke() 這 2 個非同步操作方法,所以我們就可以非常容易地透過 委派實體 直接 使用非同步任務。

      在這邊我一樣使用 Windows Form 來做示範(因為比較單純可以講解程式技巧,所以不要問我為何不用 ASP.NET MVC),整個實作範例畫面為如下圖:


繪圖


步驟1 :

在 Visual Studio 新增一個 Windows Form 專案,我們準備拖拉幾個控制箱來達成 主要結果畫面,分別有

Label 控制箱 (Text = 基數)、Button 按鈕控制箱(Text = 進行計算作業 , Name = btnDelegateInvoke)、ProgressBar控制箱(用於顯示非同步作業的進度)、TextBox 文字方塊(Name = txtResult , 用於顯示執行計算結果)。

步驟 2:

在 Button 控制箱 (name = btnDelegateInvoke)的 Click 事件,撰寫主要核心代碼:

private void btnDelegateInvoke_Click(object sender, EventArgs e)
{
     int baseNum = default(int);
     if (!int.TryParse(txtBaseNum.Text, out baseNum))
     {
         MessageBox.Show(“請輸入一個正整數哦!");
         return;
     }


    txtResult.Clear();


    // 顯示進度表的狀態
     IProgress<int> progressReporter = new Progress<int>((p) =>
     {
         this.progressBar1.Value = p;
     });


    //  計算階乘的委派實體
     Func<int, BigInteger> ComputeNumValueAction = (bsNum) =>
         {
             BigInteger bi = new BigInteger(1);
             for (int i = 1; i <= bsNum; i++)
             {
                 bi *= i; //相乘
                 // 用於計算目前進度
                 double ps = Convert.ToDouble(i) / Convert.ToDouble(bsNum) * 100d;
                 progressReporter.Report(Convert.ToInt32(ps));
             }
             return bi;
         };


    // 開始呼叫使用
     btnDelegateInvoke.Enabled = false;
     ComputeNumValueAction.BeginInvoke(baseNum, new AsyncCallback(FinishedCallback), ComputeNumValueAction);


}


2017-07-06_01-01-56


程式碼邏輯講解:

1.在 Progress<T> 是實現 IProgress<T> 介面,所以這裡可以透過它支援的 Report()方法來報告目前非同步的操作進度數據,該對象在進度更新後,是允許使用者直接繼續操作主畫面的,例如拖拉。


2.Func<int,BigInteger> 委派,代表自身帶有一個 int 類型的參數,而返回的值類型為 BigInteger,這邊我特別用 BigInteger 類型,因為在計算階乘的計算結果,可能數字會非常大,會超出 long 類型的最大值。


3.在開始進行使用 委派(Delegate)支援的BeginInvoke方法時,必須再使用一個 AsyncCallback 委派,該委派主要是用於綁定一個方法,在檔非同步任務完成時,可以呼叫的回調方法,並且再回調方法中,再次調用 Delegate.EndInvoke方法來捕捉計算結果。


我們直接看 AsyncCallback 綁定的 FinishedCallback 方法。


private void FinishedCallback(IAsyncResult ar)
{
     // 取出委派變數
     Func<int, BigInteger> action = (Func<int, BigInteger>)ar.AsyncState;
     // 求得計算結果
     BigInteger res = action.EndInvoke(ar);
     this.BeginInvoke(new Action(() =>
     {
         btnDelegateInvoke.Enabled = true;
         // 顯示計算結果
         txtResult.Text = string.Format(“計算結果:{0}", res);
     }));
}


ddd



上述程式碼撰寫完畢後,就可以編譯執行,在 基數欄位輸入一個正整數,就可以進行非同步的計算階乘作業。





參考文章

C#多工作業與平行處理技術講解

1.透過 Thread 類別撰寫多執行緒多工作業。

2.透過 Delegate 委託支援的方法,撰寫非同步任務。

3.透過 Parallel 類別操控多任務平行作業。

4.使用 Task 自行控制非同步任務作業。

5.在非同步作業時,如何取消非同步任務。

6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。

7.非同步存取變數的問題。

8.非同步資源鎖定解決方式。





網智數位-軟體開發(軟件開發)

針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna

黃先生 Allen

     

VR/AR 軟體開發 ,CES國際展覽

      今天下午客戶傳訊息給我,告知我們參與開發的 VR/AR 虛擬實境管理軟體,在國際的 CES(全球最大科技展消費性電子展(CES)) 進行展覽,事實上看到這段國際展覽影片還滿開心,公司團隊開發的產品能夠幫助客戶在CES展覽有幫助,也是一點點的小成就感,希望網智數位-開發團隊,在各開發領域能夠繼續一直不斷向前、研發能力也能夠繼續突破,用資訊技術幫客戶達到各種企業競爭力、整合能力。

 

article-586f03d485601

 

  下列的 VR / AR 互動控制,就是我司團隊參與軟體開發

https://www.youtube.com/watch?v=PWiRs86DuKk

 

 

 

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

 

庫存目標6大範疇(程式開發、程式設計、軟體開發、系統開發)

      這一個月去一家經營40幾年的代工廠,委託我們協助分析他們現行 ERP系統,很多庫存數量都一直無法精確,當然這邊所謂的精確,不完全是軟體系統庫存數字的正確,或進行盤盈盤虧進行調整數字動作,而是他們想要一個方式可以進行一個針對各種產品品項設定一個好的庫存量控制,我就詢問他們如何定義跟衡量一個產品、零件、材料的庫存數字(安全庫存、現有庫存量),我發現真的很多企業主管、工廠倉庫管理人員、採購人員大多數針對庫存量的控管都是只有幾個原則,一、庫存量越低現金流動率越高。二、針對常用物品、通用零材料設定安全庫存數字。

LINE_ALBUM_AI產生圖_240211_107LINE_ALBUM_AI產生圖_240211_287

    上述二大原則方向,一定正確無誤,但我會幾乎都會接著直接問客戶,那麼安全庫存您怎麼決定【數字 (QTY)】,我相信大多數都是說經驗法則,訂單銷售量、生產領料過程的用料量、耗損量等考慮因素,不過我幾乎都會根據實際情況、產業特性、企業流程各種因素給予調整建議,這也是很多客戶委託我們量身定做開發最具有價值的一環,絕對不是只有一個軟體使用,我們是整個進行流程討論,在討論過程我們會把相關產業的做法提出來,雙方共同腦力激蕩,因為客戶的流程與瓶頸客戶最知道,但往往發覺跟我們討論完,才發覺有許多創新變革的流程管理可以導入。

    在這篇分享文,我要特別提出一些對於庫存管理的實施做法(針對加工業、代工廠,單純的買賣業就不需要如此做法),在一個比較複雜的生產過程中,每個產品會經過一連串的製程(或稱工序),而庫存量不是只有針對最終完成品(產品)來控管,必須在各個環節都需進行設定控管基準線,在針對各個工序間我們也必須認真看待每一道工序完成後移交到下一個工序之前的轉移、未轉移的數量,也成為半成品,這些在一個好的管理軟體系統,必須有個工序對應的物料編碼(跟產品編碼是有所區隔),而針對工序角度思考的庫存控管,我們在此可以稱為【流動庫存(Flow)】, 其他的庫存控管稱之為【常備庫存(Stock)】,另外再針對這2種性質的庫存觀念又可以再次各自分類為 【計劃庫存】、【調整庫存】、【偶發庫存】。

    這樣解釋或許大家很難懂,我整理一下表格

計劃庫存 調整庫存 偶發庫存
常備庫存 (1)
以生產目標的庫存控制、季節性的庫存量控管、定期維修措施應變等
(3)
所有品項的安全庫存、JIT看板方式中的加工品
(5)
因疏忽導致過度生產的庫存量、或按生產訂單如期製作,但訂單忽然取消,造成的庫存量增加。
流動庫存 (2)
就是所謂的【帳齡庫存】
(4)
在工序之前進行緩衝調整庫存量、運輸過程的庫存量等。
(6)
工序之間生產速度不一致、或者調度部順利,造成某個工序的半成品特別異常。

(1)計劃常備庫存:

       它是一種依據“生產目標”為目的的庫存控制觀念,非常適合用於按照標準量劃分的產品,維持其庫存水平的情況,以及我們常發生的季節性庫存也是屬於這種類型,因為有些產業受到季節性等因素影響,月生產量非常不平均的行業我相信也是非常多,而這些行業的工廠設備普遍來說,都不具備可以在高峰季節(旺季)有相對應的生產能力,所以我們必須在這些行業中,積極主動地在需求量較少的淡季,生產較多的產品進行庫存,來因應旺季的到來。

      在該庫存量的制定方式,主要是根據一整年的宏觀需求預測為基礎來進行,這個軟體系統就必須根據多年來的歷史訂單、或者市場調查進行預測分析。

(2)計劃流動庫存

        存貨帳齡(帳齡庫存)就是典型屬於這一類,這也是產品工程設計中,都必須提前準備的庫存量。

(3)調整常備庫存

        這就是我們一直常聽到的JIT看板方式中的加工數量控制、或者大家最知道的【安全庫存量】設定,它是一種用於應對需求方的緊急變動,或為吸收生產作業線因為供應方問題導致供應數量的瓶頸,主動安全防範的庫存量。

(4)調整流動庫存

      這類型就是在工序與工序間,在加工製造過程中用於緩衝調整加工品的數量、或者運輸過程中的庫存量,都歸於這個類型。

     以及我要而外一提,常常因為原物料供應商和工廠製造商因為在“批量”的不一致,例如生產時採用件數為單位,而供應商發貨包裝是採用貨板單位,在這種狀況下,產品到了裝滿1貨板就需要臨時保管;相反來看就是,購買原物料時採用貨板單位,而供應商發貨是採用件數單位,這樣同樣都需要等到填補批量差異的調整庫存。

(5)偶發常備庫存

       就是因疏忽導致過度生產的庫存量、或按生產訂單如期製作,但訂單忽然取消,造成的庫存量增加。

(6)偶發流動庫存

     工序之間生產速度不一致、或者調度部順利,造成某個工序的半成品特別異常。

     也因為調度的不順暢、先前作業完成之後,需要接續的工序作業無法繼續進行生產,也是屬於這類性庫存定義。

而我特別整理上述這些庫存管理的範疇,在好的一個軟體管理系統(ERP、MRP、進銷存、POS系統、MES等),都應該在某個功能進行輔助,例如(1)計劃常備庫存和 (3)調整常備庫存,就是常看到的設定品項安全庫存量、根據訂單跑出生產計劃需求量,這個我建議可以參考我其他寫的文章,當然如果您有任何問題,也跟歡迎聯繫我們,任何問題我們都可以提出一些看法,也針對客戶產業流程特性進行專業的系統分析。

(其他參考文章)

MPS主生產計畫專文介紹(一)

MRPⅡ/ERP 能力需求計畫原理

庫存管理-概念與釐清

庫存管理探討-VMI

真正的庫存量形成探討

庫存管理的中樞控管法則(上)

庫存管理的中樞控管法則(下)

BOM表管理與設定﹣輔料是否需輸入BOM

何謂 進銷存、ERP、WMS?三者差異性【軟體開發、軟件開發、程式設計】

ERP 產品成本管理與計算

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
skype: netqna
line:netqna
微信:netqna
黃先生 Allen

繪圖程式-折線圖、區域圖 實作一(軟體設計、軟體開發、程式開發)

        這半年來一直不斷被客戶要求開發相關繪圖功能的程式,礙於現在很多程式開發人員,已經越來越多人只會資料庫的CRUD,對於繪圖程式撰寫掌握度不是很好,甚至基本觀念也沒有,所以大多數程式開發人員都是去找相關的Chart套件,也很少有人示範在 Windows 10 APP 如何開發相關繪圖程式功能(很抱歉目前Windows 10 似乎沒有提供相關繪圖控制箱可以直接使用,所以要真的自己寫繪圖功能),所以我這篇就來教導如何在 Windows Universal APP 開發一個 折線圖功能,折線圖在軟體應用上面常用於股票分析、統計分析、銷售分析、趨勢走向等圖表展現。

(折線圖)

r-data-exploration-and-visualization-line-plot-1

(區域圖)

886d1a27-3744-417b-a3e5-e9b9878e5760

 

折線圖原理其實就是在一個二維的空間(平面)中,利用多個 【X,Y】坐標點透過直線連結起來,所形成的趨勢圖形,通常 X 軸代表一個某種類別例如月份、年份、型別等,而Y軸代表某類別的實際值,例如業績、銷售量、收入、人數等。在折線圖中,X軸都呈現等量(距)的增加。

現在我們知道了簡單的折線圖原理後,在Windows 10 (UWP)平台開發上,是必須使用 Polyline 繪圖技術來進行開發,可以在界面直接選告 XAML 語法,例如底下Code:

<Polyline Stroke=“Blue” StrokThickness="3”Points=”5,10 20,30 25,40 100,120”/>

其中最重要的來自于 Points 屬性 ,5,10 =》代表一個點 [5,10] =>X=5,Y=10

但通常在開發繪圖功能時,都是動態繪圖產生,所以在這邊我也示範如何完全在背後使用程式開發一個折線圖功能,我在界面上我簡單的設計2個按鈕,分別作為繪製 折線圖跟區域圖,前端界面如下

 

image

 

//XAML Code

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="100″/>
            <RowDefinition Height="Auto"/>

        </Grid.RowDefinitions>
        <StackPanel  Grid.Row="0″ Orientation="Horizontal">
            <Button Content="折線圖繪製" Click="DrawChart_1″ Margin="12″ Background="AliceBlue"></Button>
            <Button Content="區域圖繪製" Click="DrawChart_2″ Margin="12″ Background="Wheat"></Button>
        </StackPanel>
        <Grid x:Name="gdChartCanvas" Grid.Row="1″ Height="auto" HorizontalAlignment="Center" VerticalAlignment="Center">

        </Grid>
</Grid>

 

 

在後端的程式碼,分別設計了 GetAllPoints()方法、與對應的 DrawChart_1 、DrawChart_2 事件方法

       /// <summary>
       /// 取得所有折線圖、區域圖的 Y值清單
       /// </summary>
       /// <param name="yValues">Y值清單</param>
       /// <param name="perWidth">X等距寬度</param>
       /// <param name="yStartValue">Y起始值</param>
       /// <returns></returns>
       private PointCollection GetAllPoints(List<double> yValues, double perWidth, double yStartValue)
       {
           PointCollection points = new PointCollection();
           double x = 0;

           foreach (double yVal in yValues)
           {
               double y;

               //判斷 Y 值是否小於 Y坐標起始值,因為畫布是從 100 開始
               if (yVal < yStartValue)
               {
                   y = 100;
               }
               else
               {
                   //可以套用自己的公式來設定Y值
                   //y = Math.Floor((500 – (yVal * 200) / 300));
                   y = yVal;
               }

               Point point = new Point(x, y);
               points.Add(point);
               x += perWidth;
           }

           return points;
       }

 

      /// <summary>
      /// 繪製折線圖
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="e"></param>
      private void DrawChart_1(object sender, RoutedEventArgs e)
      {
          //清除畫布
          this.gdChartCanvas.Children.Clear();

          //Y值清單
          List<double> datas = new List<double> { 185, 130, 230, 140, 200, 60, 170, 150, 190, 150, 110, 220, 130, 190, 150 };

          //取得套用公式的Y轉變值
          PointCollection pointCollection = GetAllPoints(datas, 45, 100);

          Polyline polyline = new Polyline { Points = pointCollection, Stroke = new SolidColorBrush(Colors.Red) };

          this.gdChartCanvas.Children.Add(polyline);
      }

 

上述程式撰寫完畢後,就可以直接點選【折線圖繪製】按鈕,畫面馬上呈現折線圖,如下執行結果

image

image

 

 

 

 

網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
skype: netqna
line:netqna
微信:netqna
黃先生 Allen