吉特倉儲管系統(開源WMS)--分享兩月如何作到10W+的項目

 

  在此文開篇之處先特別申明,此文在有些人的眼中會有廣告的嫌疑,可是本人不想將其做爲一個廣告宣傳的文章,在此提到軟件內容部分請你們予以諒解和包含,做爲時間不算短的程序員給你們分享一些本身開發吉特倉儲管理軟件相關的經驗和坑,固然還有一些本身從中獲利的方式,不能說給你們指條明路吧,算是做爲程序開發人的相互經驗交流。javascript

  此文原本想寫在國慶假期以前的,可是那段時間公司事情恰好很忙,因此沒有來得及寫此文。當時要搞Solr搜索引擎,由於本身不熟悉java程序因此在弄得過程當中有些費力,並且本身自己也不是一心苦心專研程序技術的人,但我絕對是一位苦心專研程序的人,雖然最終也沒有什麼大的成果。去年公司沒有幹以後,一直到今年如今我一直在想爲什麼咱們公司會作不下去,就連一個小公司都作不下去,其實咱們也很努力,咱們也很拼命,創業之初一週基本上四天會睡在辦公室,每日每夜的作項目,那個時候是有客戶的,可是到了最後發現每一個項目都不賺錢,爲何時間太長了,不能快速解決客戶問題[這只是其中一個很小的緣由],當時肯定了公司的方向就是要作倉儲物流製造方面的軟件產品。雖然我知道這個行業競爭很大,不少人說如今的市場有不少成熟的產品,這個不說我也天然明白,每一個人都有本身的想法,也有本身針對的市場方向,咱們在此很少說。css

 

  一. 深刻一個行業html

    最開始作開發的時候涉及到過好多行業,汽車零配件,金融單位,遊戲行業,房地產行業,一直作着感受最終除了會寫代碼好像啥也不會,一個行業的套路你都尚未弄清楚感受你就落伍了(主要是幹個幾年感受工資跟不上了,只能跳槽增長工資咯,其實我跳槽沒有一次是加過工資的,由於我膽小,只要認爲本身過得去就好了,最重要的是以爲本身乾的值)。不是每一個技術員均可以開公司的,可是不少技術員都給別人作過私活,感受工做之餘賺點小錢仍是很不錯的,在此以前我也幹過感受挺牛逼的.其實後來我也作的少,我也去問過不少人他們基本一致的答案:私活真的是賺的辛苦錢,天天沒日沒夜的,真不如上班。 這個的確是如此的,我已人格保證, 因此如今剛出道的程序員們若是手上沒有什麼貨的話,真的不要輕易去接什麼私活。java

    1. 你跳槽那麼屢次,多少年以後你發現你比別人強在哪裏?git

    這個問題好容易戳人的心窩子,特別是作過外包的同窗感觸確定很深,今天這個項目須要我那我不顧一切撲上去,下一個項目須要我被迫撲上去。國慶回家的時候,火車上三個湖南小夥,聽聊天得知是幹程序的,其中一人說我作過某某軍工企業的什麼軟件,我作過某某銀行的什麼軟件,我還作了某個***企業什麼的軟件, 其實我只是聽聽,我基本知道這個小夥是幹外包項目的,而後還有一個攜程的小夥,他們聊了不少我一直不說話,可是他們都談到了一個問題就是這些年下來感受除了會寫代碼,好像就幹不了其餘的,若是換了一個行業或者一個項目組又好像從頭開始了。程序員

    其實這就是問題的所在,由於你在短時間內不斷的在切換你不熟知的領域,你尚未足夠的時間來深刻了解這個行業的特性,也就使得你不可以在這個行業成爲專家,因此你最終的結果就是可替代性很強,程序員如今大把大把的,上海地鐵上隨便抓一大把,替換你分分鐘的事情,就說攜程招人和離職的速度來看就足以說明這個問題。在此以前我也有過相似的感覺,感受到頭來啥啥都不是,我等天之愚鈍之人不可能作到技術牛逼之人,發揮不了本身的智商。那就只能在某個小的領域專心作事,作精作強。github

    以前我特別羨慕一個朋友,他是作銷售的,其實他所作的事情遠不是一個銷售人員可以達到的了,他以前是作貨架,自動門等銷售的,一直作了十來年吧,後面我常常跟着他一塊兒去跑客戶,我說讓他帶我我見世面,到客戶那邊以後他所作的事情遠不是銷售給客戶介紹產品,推薦價格。到了客戶倉庫他會給客戶作專業的倉庫規劃測量,他隨身帶着捲尺,測距儀,黃膠帶等等一系列東西,儼然就是一個工程師的範,事情作得很是的專業到位,可是我見他不多直接給客戶推薦某個產品,而後還會給客戶給出規劃的圖紙設計圖。當時我非常驚呆,這個銷售的確作的到位,後面我問他是否是學這個行業的,他說他歷來沒有學過這些,只是在這個行業一直作就慢慢的專業了。再後來我有認識了另一個作一樣銷售的銷售員,他也就是一個普通的銷售員了,我跟他去看客戶現場他也就只知道拿着產品說明書給客戶介紹產品了,差距天然不說,後面這位就沒有幹這一行了,我問他爲何,他說這個行業賺不到錢。那個朋友如今上海兒女雙全,有車有房,相信比通常的程序員要好不少的。後面他說本身作貨架銷售,在他們公司作了一個業績全國第一,好像是這樣的。總之給個人感受他作這個事"專業",他也給過我一個建議:「好好的幹一行」 數據庫

 

    2. 你爲何成爲不了專家?json

    前不久上海嘉定那邊一個工廠的客戶老闆打電話我,說你好像好久沒有到咱們公司來坐坐了,你啥時候有空到咱們公司來坐坐啊,咱們聊聊人生。其實這位老闆年長我不少,爲人很精明。我問他是否是軟件出問題了,他說不是的,他說像找你聊聊倉庫生產方面的事情。當他電話個人時候我第一個反應就是軟件出問題了,後面聊下來他以爲流程比軟件更重要吧,他是想讓我幫他們想一想如何優化生產流程以及倉庫做業。其實我不太想搭理這個客戶,具體緣由不說了.可是客戶可以給我打電話我仍是挺高興的,其實他大能夠去找別人或者其餘的供應商來處理這個事情。他說事情我一點就通,他們說的生產倉庫問題我很快就可以知道他們說的什麼問題,而且給出合理的建議,他們以爲我很專業。 其實我不能自誇本身是專業,當時決定作了這個方面的事情以後,個人確花了很大的精力來了解這個行業的知識,包括現場實地考察。後端

    什麼是專家, 我我的以爲就是在這個行業有資深經驗, 專 就是專業, 家 很差怎麼解釋,反正畫家,書法家等比較有威望吧,最關鍵的是可以在關鍵時刻關鍵點起到關鍵做用, 固然不能說咱們國家某某部門某某專家了,這種話不要多說。專家可以刻畫到點子上,戳中要點一針見血,找出良方,這就是專家。專家除了苦學那就是經驗積累,遇到的問題越多後面你可以解決問題的概率就越大,長此以往你就是專家了。其實如今不少作技術的今天學.NET,明天又是Java,再來講PHP(拍黃片)是世界上最好的語言, 長此以往其實他也就是一個普通寫代碼的,幹了10年仍是隻能寫淺顯的代碼。

 

  二. 項目開發你爲什麼這麼慢

    我本身一句有一句調侃本身的話:"每一個人都說時間就是金錢,你的時間真的值錢麼,若是在特定的時間內你沒有創造價值那麼你的時間就不值錢" 。 好像有點過度,但對於我本身來講是有道理的

    1. 爲什麼一個簡單的進銷存你都要作三個月

    這是我當年遇到的很現實的問題,先不說價錢問題。別人一個月就能夠上線運行,爲什麼你一個簡單的進銷存要作三個月,咱們仔細羅列這些功能:(1) 系統設置 (2) 用戶管理 (3) 部門管理 (4) 角色管理 (4)產品管理 (6) 價格管理 (7) 客戶管理 (8) 供應商管理 .....我實在不想說下去了,簡單的進銷存確實不止這些功能,在怎麼簡單你得讓客戶流程可以跑起來才行啊。

    再從技術方面考慮: 這得有多少張表啊,數據庫操做好多代碼啊,還要設計前段UI,作的交互性好還要大量的JS,想一想這些工做量3個月真的一點很少。唉,爲何我就沒有一套能夠複用的東西呢?

    對的,由於你沒有能夠複用的東西,因此你慢,你項目進度不能快也就在情理之中了

    

    2.怎麼就沒有公共組件

    等你肯定好作一個行業軟件的開發以後,技術體系基本肯定以後,開發仍是慢啊。我要彈出框,系統規劃中沒有這個組件,我要從網上找。  好多個頁面要選擇用戶信息,彈出頁面,第一個頁面湊合着作吧,忍了,又來一個這樣的頁面需求,又忍了, 愈來愈多,忍無可忍,這種業務組件你爲什麼不封裝成公共的呢。

; (function ($) {
    $.fn.ProductDialog = function (options) {
        var defaultOption = {
            data: {},
            Mult: true,
            EventName: "dblclick",
            callBack: undefined
        };
        defaultOption = $.extend(defaultOption, options);

        var DataServer={
            Server: function () {
                var config = (function () {
                    var URL_GetList = "/Storage/ProductAjax/GetList";
                    return {
                        URL_GetList: URL_GetList
                    };
                })();

                //數據操做服務
                var dataServer = (function ($, config) {
                    //查詢分頁列表
                    var GetList=function(data,callback){
                        $.gitAjax({
                            url: config.URL_GetList,
                            data: data,
                            type: "post",
                            dataType: "json",
                            success: function (result) {
                                if(callback!=undefined && typeof callback=="function"){
                                    callback(result);
                                }
                            }
                        });
                    }

                    return {
                        GetList: GetList
                    }

                })($, config);
                return dataServer;
            },
            PageClick:function(PageIndex,PageSize){
                $.jBox.tip("正在努力加載數據...","loading");
                var Server=DataServer.Server();
                var search={};
                search["PageIndex"]=PageIndex;
                search["PageSize"]=PageSize;
                Server.GetList(search,function(result){
                    DataServer.SetTable(result);
                    $.jBox.closeTip();
                });
            },
            SetTable:function(result){
                current.find("#tabInfo").DataTable({
                    destroy: true,
                    data:result.Result,
                    paging:false,
                    searching:false,
                    scrollX: false,
                    bAutoWidth:false,
                    bInfo:false,
                    ordering:false,
                    columns: [
                        { data: 'SnNum' ,render:function(data, type, full, meta){
                            return "<input type='checkbox' name='product_item' value='"+data+"' data-full='"+JSON.stringify(full)+"'/>";
                        }},
                        { data: 'BarCode'},
                        { data: 'ProductName',createdCell:function(td, cellData, rowData, row, col){
                            if(!git.IsEmpty(cellData) && cellData.length>10){
                                $(td).popover({container:"body",content:cellData,trigger:"hover",placement:"bottom",delay:{show:500}});
                            } 
                        },render:function(data,type,full,meat){
                            return git.GetStrSub(data,10);
                        }},
                        { data: 'Size',render:function(data,type,full,meta){
                            return git.GetStrSub(data,10);
                        },createdCell:function(td, cellData, rowData, row, col){
                            if(!git.IsEmpty(cellData) && cellData.length>10){
                                $(td).popover({container:"body",content:cellData,trigger:"hover",placement:"bottom",delay:{show:500}});
                            } 
                        }},
                        { data: 'CateName'},
                        { data: 'UnitName'},
                        { data: 'MaxNum'},
                        { data: 'MinNum'},
                        { data: 'AvgPrice'},
                        { data: 'Display',render:function(data,type,full,meta){
                            return git.GetStrSub(data,10);
                        },createdCell:function(td, cellData, rowData, row, col){
                            if(!git.IsEmpty(cellData) && cellData.length>10){
                                $(td).popover({container:"body",content:cellData,trigger:"hover",placement:"bottom",delay:{show:500}});
                            } 
                        }}
                    ],
                    aoColumnDefs:[
                        { "sWidth": "15px",  "aTargets": [0] }
                    ],
                    oLanguage:{
                        sEmptyTable:"沒有查詢到任何數據"
                    }
                });
                var pageInfo=result.PageInfo;
                if(pageInfo!=undefined){
                    current.find("#myMinPager").minpager({ pagenumber: pageInfo.PageIndex, recordCount: pageInfo.RowCount, pageSize: pageInfo.PageSize, buttonClickCallback: DataServer.PageClick });
                }

                DataServer.BindEvent();
            },
            BindEvent:function(){
                if(defaultOption.Mult){
                    current.find("#tabInfo").find("input[name='item_all']").click(function(event) {
                        var flag=$(this).attr("checked");
                        if(flag){
                            current.find("#tabInfo").find("input[name='product_item']").attr("checked",true);
                        }else{
                            current.find("#tabInfo").find("input[name='product_item']").attr("checked",false);
                        }
                    });
                }
                else{
                    current.find("#tabInfo").find("input[name='item_all']").hide();
                    current.find("#tabInfo").find("input[name='product_item']").click(function(event) {
                        current.find("#tabInfo").find("input[name='product_item']").attr('checked', false);
                        $(this).attr("checked",true);
                    });
                }
                //搜索
                current.find(".search").find('button[data-command="Search"]').click(function(event) {
                    DataServer.PageClick(1,10);
                });
            },
            GetSelect:function(){
                var list=[];
                current.find("#tabInfo").find("input[name='product_item']").each(function(i,item){
                    var flag=$(item).attr("checked");
                    if(flag){
                        var value=$(item).attr("data-full");
                        list.push(JSON.parse(value));
                    }
                });
                return list;
            }
        }

        var submit = function (v, h, f) {
            if (v == 1) {
                var list=DataServer.GetSelect();
                if(list==undefined || list.length==0){
                    $.jBox.tip("請選擇產品","warn");
                    return false;
                }
                if (defaultOption.callBack != undefined && typeof (defaultOption.callBack) == "function") {
                    if(defaultOption.Mult){
                        defaultOption.callBack(list);
                    }else{
                        defaultOption.callBack(list[0]);
                    }
                }
            }
        };
        
        $(this).bind(defaultOption.EventName, function () {
            $.jBox.open("get:/Storage/Product/Dialog", "選擇產品", 850, 600, {
                buttons: { "選擇": 1, "關閉": 2 }, submit: submit, loaded: function (h) {
                    current=h;
                    DataServer.PageClick(1,10);
                }
            });
        });
    };
})(jQuery);
選擇產品的公共組件

    

     相似於這種的組件,在項目中有大量使用,若是可以作到全局公共而且方便使用這就是極佳的。最終造成組件也是有發展歷程的: 開始只是一個簡單的額對話框顯示錶格而且選中產品,慢慢的又有更多的需求,好比要可以搜索,要可以分頁,要支持多選以及單選等等,雙幾行可以自動選擇等一系列問題。其實你作好了公共組件在後期的開發中也就省事了。

 

    3. 代碼的套路

    10我的就有10種代碼風格,這種相互改代碼會讓人崩潰,人員的離職,沒有文檔和註釋的說明,字段和數據庫的對應不起來,各類讓人吐的問題。不要太多的花樣,定義好套路,全部的代碼必須遵循這種套路你會快不少,最關鍵的是找bug的速度回快不少。

/**
*
*財務管理-應收實收
*
**/

var FinanceBillManager = {
    Server: function () {
        var config = (function () {
            var URL_Add = "/Finance/BillAjax/AddRec";
            var URL_GetList = "/Finance/BillManagerAjax/GetList";
            var URL_GetDetail = "/Finance/BillManagerAjax/GetDetail";
            var URL_Delete = "/Finance/BillManagerAjax/Delete";
            var URL_Cancel = "/Finance/BillManagerAjax/Cancel";
            var URL_Audite = "/Finance/BillManagerAjax/Audite";
            var URL_ToExcel = "/Finance/BillManagerAjax/ToExcel";

            var URL_AddPay = "/Finance/BillAjax/AddPay";
            var URL_PayDetail = "/Finance/BillAjax/AddRec";

            return {
                URL_GetList: URL_GetList,
                URL_Add: URL_Add,
                URL_Delete: URL_Delete,
                URL_Cancel: URL_Cancel,
                URL_Audite: URL_Audite,
                URL_ToExcel: URL_ToExcel,

                URL_AddPay: URL_AddPay,
                URL_PayDetail: URL_PayDetail,
            };
        })();

        //數據操做服務
        var dataServer = (function ($, config) {

            //查詢分頁列表
            var Add=function(data,callback){
                $.gitAjax({
                    url: config.URL_Add,
                    data: data,
                    type: "post",
                    dataType: "json",
                    success: function (result) {
                        if(callback!=undefined && typeof callback=="function"){
                            callback(result);
                        }
                    }
                });
            }

            var GetList=function(data,callback){
                $.gitAjax({
                    url: config.URL_GetList,
                    data: data,
                    type: "post",
                    dataType: "json",
                    success: function (result) {
                        if(callback!=undefined && typeof callback=="function"){
                            callback(result);
                        }
                    }
                });
            }

            var Delete=function(data,callback){
                $.gitAjax({
                    url: config.URL_Delete,
                    data: data,
                    type: "post",
                    dataType: "json",
                    success: function (result) {
                        if(callback!=undefined && typeof callback=="function"){
                            callback(result);
                        }
                    }
                });
            }

            var Cancel=function(data,callback){
                $.gitAjax({
                    url: config.URL_Cancel,
                    data: data,
                    type: "post",
                    dataType: "json",
                    success: function (result) {
                        if(callback!=undefined && typeof callback=="function"){
                            callback(result);
                        }
                    }
                });
            }

            var Audite=function(data,callback){
                $.gitAjax({
                    url: config.URL_Audite,
                    data: data,
                    type: "post",
                    dataType: "json",
                    success: function (result) {
                        if(callback!=undefined && typeof callback=="function"){
                            callback(result);
                        }
                    }
                });
            }

            var ToExcel=function(data,callback){
                $.gitAjax({
                    url: config.URL_ToExcel,
                    data: data,
                    type: "post",
                    dataType: "json",
                    success: function (result) {
                        if(callback!=undefined && typeof callback=="function"){
                            callback(result);
                        }
                    }
                });
            }


            var AddPay=function(data,callback){
                $.gitAjax({
                    url: config.URL_AddPay,
                    data: data,
                    type: "post",
                    dataType: "json",
                    success: function (result) {
                        if(callback!=undefined && typeof callback=="function"){
                            callback(result);
                        }
                    }
                });
            }

            return {
                Add: Add,
                GetList: GetList,
                Delete: Delete,
                Cancel: Cancel,
                Audite: Audite,
                ToExcel: ToExcel,
                AddPay: AddPay,
            }

        })($, config);
        return dataServer;
    },
    PageClick:function(PageIndex,PageSize){
        $.jBox.tip("正在努力加載數據...","loading");
        var Server=FinanceBillManager.Server();
        var search=FinanceBillManager.GetSearch();
        search["PageIndex"]=PageIndex;
        search["PageSize"]=PageSize;
        Server.GetList(search,function(result){
            FinanceBillManager.SetTable(result);
            $.jBox.closeTip();
        });
    },
    Refresh:function(){
        var PageSize=$("#mypager").pager("GetPageSize");
        var PageIndex=$("#mypager").pager("GetCurrent");
        $.jBox.tip("正在努力加載數據...","loading");
        var Server=FinanceBillManager.Server();
        var search=FinanceBillManager.GetSearch();
        search["PageIndex"]=PageIndex;
        search["PageSize"]=PageSize;
        Server.GetList(search,function(result){
            FinanceBillManager.SetTable(result);
            $.jBox.closeTip();
        });
    },
    SetTable:function(result){
        $("#tabList").DataTable({
            destroy: true,
            data:result.Result,
            paging:false,
            searching:false,
            scrollX: false,
            bAutoWidth:false,
            bInfo:false,
            ordering:false,
            columns: [
                { data: 'SnNum' ,render:function(data, type, full, meta){
                    return "<input type='checkbox' name='bill_item' value='"+data+"' data-full='"+JSON.stringify(full)+"'/>";
                }},
                { data: 'BillNum'},
                { data: 'Title'},
                { data: 'CateName'},
                { data: 'FromName'},
                { data: 'Amount',render:function(data,type,full,meta){
                    return git.ToDecimal(data,2);
                }},
                { data: 'RealPayAmount',render:function(data,type,full,meta){
                    return git.ToDecimal(data,2);
                }},
                { data: 'LeavAmount',render:function(data,type,full,meta){

                    if(parseFloat(data)>0){
                        return '<span class="label label-warning">'+git.ToDecimal(data,2)+'</span>';
                    }
                    else{
                        return "0.00";
                    }
                }},
                { data: 'Status',render:function(data,type,full,meta){
                    if(data==EFinanceStatusJson.Pass){
                        return '<span class="label label-success">'+git.GetEnumDesc(EFinanceStatus,data)+'</span>';
                    }else if(data==EFinanceStatusJson.NotPass){
                        return '<span class="label label-warning">'+git.GetEnumDesc(EFinanceStatus,data)+'</span>';
                    }else{
                        return git.GetEnumDesc(EFinanceStatus,data);
                    }
                }},
                { data: 'CreateTime',render:function(data,type,full,meta){
                    return git.JsonToDateTime(data);
                }},
                { data:"ID",render:function(data,type,full,meta){
                    var html="";
                    if(full.Status==EFinanceStatusJson.Wait || full.Status==EFinanceStatusJson.NotPass){
                        html+='<a class="edit" href="javascript:void(0)">編輯</a>&nbsp;';
                    }
                    if(full.Status==EFinanceStatusJson.Wait || full.Status==EFinanceStatusJson.NotPass){
                        html+='<a class="audite" href="javascript:void(0)">審覈</a>&nbsp;';
                    }
                    html+='<a class="view" href="javascript:void(0)">查看</a>&nbsp;';

                    if(full.Status==EFinanceStatusJson.Wait || full.Status==EFinanceStatusJson.NotPass){
                        html+='<a class="delete" href="javascript:void(0)">刪除</a>&nbsp;';
                    }
                    
                    if(full.Status==EFinanceStatusJson.Pass || full.Status==EFinanceStatusJson.PayPart){
                        html+='<a class="pay" href="javascript:void(0)">收款</a>&nbsp;';
                    }
                    return html;
                }}
            ],
            aoColumnDefs:[
                { "sWidth": "15px",  "aTargets": [0] }
            ],
            oLanguage:{
                sEmptyTable:"沒有查詢到任何數據"
            }
        });

        var pageInfo=result.PageInfo;
        if(pageInfo!=undefined){
            $("#mypager").pager({ pagenumber: pageInfo.PageIndex, recordCount: pageInfo.RowCount, pageSize: pageInfo.PageSize, buttonClickCallback: FinanceBillManager.PageClick });
        }

        //綁定編輯 刪除事件
        FinanceBillManager.BindEvent();
    },
    BindEvent:function(){

        $("#tabList").find("tbody td").popover({
            container:"body",
        });

        $("#tabList").find("a.edit").click(function(){
            var SN=$(this).parent().parent().find("input[name='bill_item']").val();
            FinanceBillManager.Detail(SN,"Edit");
        });

        //審覈
        $("#tabList").find("a.audite").click(function(){
            var SN=$(this).parent().parent().find("input[name='bill_item']").val();
            FinanceBillManager.Detail(SN,"Audite");
        });

        //查看
        $("#tabList").find("a.view").click(function(){
            var SN=$(this).parent().parent().find("input[name='bill_item']").val();
            FinanceBillManager.Detail(SN,"View");
        });

        $("#tabList").find("a.delete").click(function(){
            var SN=$(this).parent().parent().find("input[name='bill_item']").val();
            var submit=function(v,h,f){
                if(v=="ok"){
                    var list=[];
                    list.push(SN);
                    var param={};
                    param["list"]=JSON.stringify(list);
                    var Server=FinanceBillManager.Server();
                    Server.Delete(param,function(result){
                        $.jBox.tip(result.Message,"success");
                        var pageSize=$("#mypager").pager("GetPageSize");
                        FinanceBillManager.PageClick(1,pageSize);
                    });
                }
            }
            $.jBox.confirm("肯定要刪除嗎?", "提示", submit);
        });


        //付款
        $("#tabList").find("a.pay").click(function(){
            var SN=$(this).parent().parent().find("input[name='bill_item']").val();
            FinanceBillManager.Pay("",SN,"Add");
        });
    },
    SelectAll:function(item){
        var flag=$(item).attr("checked");
        if(flag){
            $("#tabList").find("input[name='bill_item']").attr("checked",true);
        }else{
            $("#tabList").find("input[name='bill_item']").attr("checked",false);
        }
    },
    GetSelect:function(){
        var list=[];
        $("#tabList").find("input[name='bill_item']").each(function(i,item){
            var flag=$(item).attr("checked");
            if(flag){
                var value=$(item).val();
                list.push(value);
            }
        });
        return list;
    },
    GetSearch:function(){
        var searchBar=$("div[data-condition='search']");

        var BillNum=searchBar.find("input[name='BillNum']").val();
        var CateNum=searchBar.find("select[name='CateNum']").val();
        var FromName=searchBar.find("input[name='FromName']").val();
        var Title=searchBar.find("input[name='Title']").val();
        var ContractNum=searchBar.find("input[name='ContractNum']").val();
        var Status=$("div[data-group='Status']").find("button.disabled").attr("value");
        var BeginTime=searchBar.find("input[name='BeginTime']").val();
        var EndTime=searchBar.find("input[name='EndTime']").val();
        var search={};
        search["BillNum"]=BillNum;
        search["CateNum"]=CateNum;
        search["FromName"]=FromName;
        search["Title"]=Title;
        search["ContractNum"]=ContractNum;
        search["Status"]=Status;
        search["BeginTime"]=BeginTime;
        search["EndTime"]=EndTime;

        return search;
    },
    Detail:function(SnNum,Command){
        var currentSnNum=SnNum;
        var submit=function(v,h,f){
            if(v=="1"){
                var BillNum=h.find('input[name="BillNum"]').val();
                var SnNum=h.find('input[name="SnNum"]').val();
                var CateNum=h.find('select[name="CateNum"]').val();
                var FromName=h.find('input[name="FromName"]').val();
                var ToName=h.find('input[name="ToName"]').val();
                var Amount=h.find('input[name="Amount"]').val();
                var PrePayCount=h.find('input[name="PrePayCount"]').val();
                var Remark=h.find('input[name="Remark"]').val();
                var Title=h.find('input[name="Title"]').val();
                var Remark=h.find('input[name="Remark"]').val();
                var LastTime=h.find('input[name="LastTime"]').val();
                var Title=h.find('input[name="Title"]').val();

                var param={};
                param["BillNum"]=BillNum;
                param["SnNum"]=SnNum;
                param["CateNum"]=CateNum;
                param["FromName"]=FromName;
                param["ToName"]=ToName;
                param["Amount"]=Amount;
                param["PrePayCount"]=PrePayCount;
                param["Status"]=1; //審覈經過
                param["Remark"]=Remark;
                param["LastTime"]=LastTime;
                param["Title"]=Title;

                var Server=FinanceBillManager.Server();
                Server.Add(param,function(result){
                    $.jBox.tip(result.Message,"success");
                    var pageSize=$("#mypager").pager("GetPageSize");
                    FinanceBillManager.PageClick(1,pageSize);
                }); 
            }else if(v=="2"){
                
            }else if(v=="3"){
                var param={};
                param["SnNum"]=currentSnNum;
                param["Status"]=2; //審覈經過
                var Server=FinanceBillManager.Server();
                Server.Audite(param,function(result){
                    $.jBox.tip(result.Message,"success");
                    var pageSize=$("#mypager").pager("GetPageSize");
                    FinanceBillManager.PageClick(1,pageSize);
                }); 
            }else if(v=="4"){
                var param={};
                param["SnNum"]=currentSnNum;
                param["Status"]=3; //審覈經過
                var Server=FinanceBillManager.Server();
                Server.Audite(param,function(result){
                    $.jBox.tip(result.Message,"success");
                    var pageSize=$("#mypager").pager("GetPageSize");
                    FinanceBillManager.PageClick(1,pageSize);
                }); 
            }
        }
        
        // 1肯定 2 關閉  3 審覈經過 4 審覈不經過
        if(Command=="View"){
            $.jBox.open("get:/Finance/Bill/AddRec?SnNum="+SnNum, "查看應收", 670, 350, { buttons: {"關閉":2 } ,submit:submit,loaded:function(h){
                h.find('input,select').attr('disabled',true);
            }}); 
        }else if(Command=="Audite"){
            $.jBox.open("get:/Finance/Bill/AddRec?SnNum="+SnNum, "審覈應收", 670, 350, { buttons: {"審覈經過": 3, "審覈不經過": 4,"關閉":2 } ,submit:submit,loaded:function(h){
                h.find('input,select').attr('disabled',true);
            }}); 
        }else if(Command=="Add"){
            $.jBox.open("get:/Finance/Bill/AddRec", "新增應收", 670, 350, { buttons: {"肯定": 1, "關閉":2 } ,submit:submit,loaded:function(h){
                
            }}); 
        }else if(Command=="Edit"){
            $.jBox.open("get:/Finance/Bill/AddRec?SnNum="+SnNum, "編輯應收", 670, 350, { buttons: {"肯定": 1, "關閉":2 } ,submit:submit,loaded:function(h){
                
            }}); 
        }
    },
    Pay:function(SnNum,BillSnNum,Command){
        var currentSnNum=SnNum;
        var submit=function(v,h,f){
            if(v=="1"){
                var PayNum=h.find('input[name="PayNum"]').val();
                var SnNum=h.find('input[name="SnNum"]').val();
                var PayType=h.find('select[name="PayType"]').val();
                var BankName=h.find('input[name="BankName"]').val();
                var Amount=h.find('input[name="Amount"]').val();
                var PayTime=h.find('input[name="PayTime"]').val();
                var Remark=h.find('input[name="Remark"]').val();
                var BillSnNum=h.find('input[name="BillSnNum"]').val();

                var param={};
                param["PayNum"]=PayNum;
                param["SnNum"]=SnNum;
                param["PayType"]=PayType;
                param["BankName"]=BankName;
                param["Amount"]=Amount;
                param["PayTime"]=PayTime;
                param["Remark"]=Remark;
                param["BillSnNum"]=BillSnNum;

                var Server=FinanceBillManager.Server();
                Server.AddPay(param,function(result){
                    $.jBox.tip(result.Message,"success");
                    var pageSize=$("#mypager").pager("GetPageSize");
                    FinanceBillManager.PageClick(1,pageSize);
                }); 
            }else if(v=="2"){
                
            }
        }
        
        // 1肯定 2 關閉
        if(Command=="Add"){
            $.jBox.open("get:/Finance/Bill/AddPay?BillSnNum="+BillSnNum, "新增實收", 670, 300, { buttons: {"肯定": 1, "關閉":2 } ,submit:submit,loaded:function(h){
                
            }}); 
        }else if(Command=="Edit"){
            $.jBox.open("get:/Finance/Bill/AddPay?BillSnNum="+BillSnNum+"&SnNum="+SnNum, "編輯實收", 670, 300, { buttons: {"肯定": 1, "關閉":2 } ,submit:submit,loaded:function(h){
                
            }}); 
        }
    },
    ToolBar:function(){
        //工具欄按鈕點擊事件
        $("div.toolbar").find("a.btn").click(function(){
            var command=$(this).attr("data-command");

            if(command=="Add"){
                FinanceBillManager.Detail(undefined,"Add");
            }else if(command=="Edit"){
                var list=FinanceBillManager.GetSelect();
                if(list.length==0){
                    $.jBox.tip("請選擇要編輯的項","warn");
                    return false;
                }
                var SN=list[0];
                FinanceBillManager.Detail(SN,"Edit");
            }else if(command=="Delete"){
                var submit=function(v,h,f){
                    if(v=="ok"){
                        var list=FinanceBillManager.GetSelect();
                        if(list.length==0){
                            $.jBox.tip("請選擇要刪除的項","warn");
                            return false;
                        }
                        var param={};
                        param["list"]=JSON.stringify(list);
                        var Server=FinanceBillManager.Server();
                        Server.Delete(param,function(result){
                            $.jBox.tip(result.Message,"success");
                            var pageSize=$("#mypager").pager("GetPageSize");
                            FinanceBillManager.PageClick(1,pageSize);
                        });
                    }
                }
                $.jBox.confirm("肯定要刪除嗎?", "提示", submit);

            }else if(command=="Excel"){
                var Server=FinanceBillManager.Server();
                var search=FinanceBillManager.GetSearch();
                Server.ToExcel(search,function(result){
                    
                    if(result.Code==1000){
                        var path = unescape(result.Message);
                        window.location.href = path;
                    }else{
                        $.jBox.info(result.Message, "提示");
                    }
                });
            }else if(command=="Refresh"){
                FinanceBillManager.Refresh();
            }

        });

        //搜索 高級搜索按鈕
        var searchBar=$("div[data-condition='search']");
        searchBar.find("a[data-command='search']").click(function(){
            FinanceBillManager.PageClick(1,10);
        });
        searchBar.find("button[data-command='Advanced']").click(function(){
            var display=$("div.formsearch").css("display");
            if(display=="block"){
                $("div.formsearch").hide(300);
            }else{
                $("div.formsearch").show(300);
            }
        });
        searchBar.find("button[data-command='Clear']").click(function(){
            //清空搜索條件
            searchBar.find("input[name='BillNum']").val("");
            searchBar.find("select[name='CateNum']").val("");
            searchBar.find("input[name='FromName']").val("");
            searchBar.find("input[name='Title']").val("");
            searchBar.find("input[name='ContractNum']").val("");
            searchBar.find("input[name='BeginTime']").val("");
            searchBar.find("input[name='EndTime']").val("");
        });


        //狀態按鈕處理
        $("div[data-group='Status']").find("button").click(function(){
            $("div[data-group='Status']").find("button").removeClass("disabled");
            $(this).addClass("disabled");
            FinanceBillManager.PageClick(1,10);
        });
        
        //加載默認數據
        FinanceBillManager.PageClick(1,10);
    }
}
吉特倉儲管系統-JS套路

    在吉特倉儲管理系統中,通過屢次的改版以後,最終肯定了JS的代碼風格:

    (1) 不必定要遵循世間的套路什麼駝峯命名,帕斯卡命名,定好符合本身的規則

    (2) 先後端數據傳輸Key名稱儘可能和Model或者數據庫字段一致,雖然違反了必定傳統的命名規則

    (3) 每一個模塊定義一個對象,全部的操做方法都封裝到對象中

    (4) 儘可能作到UI分離,多使用事件驅動

ITopClient client = new TopClientDefault();
            string list = WebUtil.GetFormValue<string>("list");
            string CompanyID = this.CompanyID;
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("CompanyID", CompanyID);
            dic.Add("List", list);
            string result = client.Execute(DepartApiName.DepartApiName_Delete, dic);
            return Content(result);
統計的接口訪問方式

    調用API使用而代碼示例

    (1) 全部的代碼都遵循如上操做方式,不得標新立異再作一套

    (2) 請求API所有是使用POST的方式 (根據本身的狀況來,有些人說這種作法很差,我以爲挺好)

    (3) 統一的數據返回格式JSON,也便於作攔截處理,代碼要結構化

    代碼套路多,這裏很少說 有興趣去GitHub上下載開源版本的代碼下來觀摩

 

  三. 八九月我激動過分

    從未如此爲項目激動,想着有一天軟件可以被客戶所可以接受,八九月的確有點出乎個人意料以外,吉特倉儲管理系統已經不溫不火的作了四年了,改版也不知道多少,雖然也有些客戶在使用,但那終究不是我滿意的結果,不是對客戶不滿意而是我在這些客戶身上沒有獲取真正的價值,由於不少項目都是靠時間堆積起來的。八月九月兩個月客戶諮詢的客戶有點多,最終選擇了幾個客戶合做, 項目金額超10W。 對於我如今一個兼職開發者(爲生活所迫)來講的確是一件可喜可賀的事情,不要拿這個跟某某公司來對比,我也歷來不想超過哪一個公司,我只想認真的作好一個本身想作的軟件。

    10W+ 這遠超過我工資收入,固然忙我也找了一些小夥伴幫忙,可是如今的確要比以前的處理速度要快不少。

    8月初有個山西的客戶聯繫我了,讓我幫其弄一個倉庫系統,說是給他們縣城的小型加工廠使用,也就是雲倉儲。其實正中我下懷, 費用也就2W 我沒有多要價,也想着拿新版本倉儲系統試水, 20來天項目上線使用,客戶爽快付款90%,聽他說以前有個團隊給他們弄了幾個月還不是他想要的。

  

    1. 項目大底開發速度高了不少

      這幾個客戶開發效率本身明顯推動速度高了不少,除了前期本身積累了大量的公共組建,現有成熟的軟件以外,也積累了大量的客戶犯錯案例

    2. 正確的引導客戶

      大多數客戶其實不清楚本身要作什麼東西的,若是對方是程序員我估計你會很溝通。首先給客戶一個演示版本,讓客戶看是否是他想要的,若是不是那就不用談了,避免浪費雙方的時間

    3. 合理的建議

      在某種狀況下你要決定的相信你的專業能力要比客戶強,給客戶實際的可見的演示軟件,還要給客戶說具體的案例,特別是案例中會出現的問題以及解決方式,合理的處理建議會讓客戶相信你的專業度

    4. 多爲客戶考慮

      多爲客戶考慮,有時候客戶考慮的功能不多,你要合理的給客戶新增一些業務功能,同時也要刪減一些沒必要要的需求,你的目的就是爲他解決這個問題

    5. 不要一味的談技術

      可能客戶會處於禮貌的聽你說你的技術如何的牛逼,可是客戶絕大時候是聽不懂在說什麼的。 我會問客戶的倉庫規劃狀況,銷售狀況,打印狀況,做業包裝狀況等,側面找方式闡述你的解決方案

 

  四. 軟件版權保護

 

    1. 軟件著做權登記證書

    不得不說有些人真的很可惡,吉特倉儲管理系統(GitWMS)以前有一個版本開源以後,本身下載悶聲去作客戶就不說什麼了,可是有些人卻公開出售源碼,以前還和某平臺鬧過一次。 這裏很少說了,其實當時已經在申請軟件著做權登記,這個登記證書終於下來了。

    

    雖然不少人說這個東西沒卵用,有時候這個東西是必須的,最起碼在給別人說這個東西是我本身的時候有底氣一點,看代碼別人不認可是你的東西啊。

 

   2. 如何看待開源問題

    我從心裏裏面認可開源給我帶來了不少的讓我意向不到的好處,可是絕大部分來下載此代碼的人都是程序員或者軟件公司,他們問我出售價格以及使用技術,其實我更想聽到合做意向,可是這種聲音少之又少,同時還有更多的人或者企業拿到以後默默的去修改代碼,去掉版權信息而後去作本身的客戶,作本身的私單,而後有問題了就來像我諮詢。其實我心裏是高興和糾結的,還有人說我是花了10塊錢買的代碼,留的聯繫方式是你的說能夠提供技術支持,10塊錢一頓飯都不夠,並且錢不在我口袋。

    (1). 開源的目的

    我真正開源的目的是想讓更多人瞭解個人項目,供你們一個能夠參考學習的案例,最初我也沒有想過有人能夠拿着去賣錢或者直接修改給客戶去使用,就算申明不能夠給客戶使用有些人仍是會默默的修改不露聲色的去給客戶使用,就比如說不能兜售源碼可是仍是有人默默的在兜售源碼。

    (2). 你爲何不所有開源

    我開源了全部的業務代碼,固然我也能夠負所有責任的告訴你,新版本的是沒有開源的(不要問我爲何),以及底層的一些操做基本沒有公開源代碼,我相信代碼已經流露在外面了。 公開的代碼是2.0版本的代碼,其中刪除了一些非倉庫業務的功能,其他功能模塊代碼徹底公開了,保證是一個能夠正常運行,流程能夠走通的,數據庫結構所有公開的程序,沒有任何的保留。

    老是有人問我質問我,你這些都開源了爲何還有底層的一些東西不開源,你就得將全部的代碼所有開源,要否則你開源幹嗎。對於這種質問我很無奈, 打個不恰當的比喻,.NET如今也要開源了,爲何他不開源他依託的Windows系統, 我想我也是這麼想的。但願你們可以讀懂個人意思,有時候想作一個好事反而遭來辱罵聲其實內心很不爽。

 

   3. 開源帶來更多的分享者以及潛在客戶

    其實我並非那麼在意有人拿着我東西去作其餘的客戶,只但願他們可以保留個人版權標題等基本信息,可是不少人作不到。自從開源以後個人確有不少開發者對此表示了興趣,仔細個人人也不少,其實認真去看的人很少。每一個人內心都有這一個心理,開源的東西就是好東西,可是有多少人真正去看過開源的代碼,更有甚者那些優秀的開源項目你下載以後看成安心石的代碼你可以真的看得懂麼。"若是開源你看不懂,那和不開源有什麼區別" ,開源只是爲那些懂的人而開源的。  固然也有不少人下載代碼以後給我提了好多的意見,這些意見都是很是寶貴的,我在此很是的感謝這些人,分享各位的想法和經驗,我才能作得更好。

 

  五. 學習的參考對象

     在博客園也算混了好久了,其中牛人比較多。至於哪些人是牛人我很少說,在開發吉特倉儲管理系統的時候,我也參考過他們的模式。

    吉日嘎拉: http://www.cnblogs.com/jirigala/   當年他所開發的 通用權限管理系統

    魏瓊東: http://www.cnblogs.com/eastjade/   AgileEAS.NET SOA 中間件平臺,醫療系統開發

    路過秋天: http://www.cnblogs.com/cyq1162/  QBlog 博客

    李天平: http://www.cnblogs.com/ltp/category/44293.html 代碼生成器

    麥舒: http://www.cnblogs.com/ansiboy/category/322450.html ALinq 當年也算雄霸一方

    固然還有更多的優秀做品, 我參考過他們的不少運營模式。其中吉日嘎啦和魏瓊東的相對是偏重業務行業性的, 最起碼給個人感受是這樣的,我沒有深刻的去了解過他們的代碼。其實我我的的側重點也是如此,我更想但願側重於偏重行業性質的軟件開發。

    以前收入一直很低,其實老婆給我了很大的支持,我也很是懼怕她說我爲何不找個正經的工做去幹,每天折騰這些東西。我給她玩笑的說,我說我用吉特倉儲管理系統能夠賺到100W, 而後我也就笑笑,她也就笑笑。我說知道大家不會相信個人,我說賺不到100W我賺50W也能夠,再不行30W也能夠。

    我一直堅信本身可以作到,固然過去的幾年我也曾一度懷疑本身,雖然如今這個也很遙遠,可是我但願本身依舊堅持。

     

    參考了不少產品,大致上能夠分爲兩種: (1) 以技術型爲主,也就是技術開發框架或者組件, 麥舒的就是典型的案例  (2) 以業務型爲主,老魏的醫療系統絕對的偏向行業性質

    且不論這二者之間各有什麼優缺點,但堅信一點只要你堅持去作持續改進都可以作出好東西來。

 

    此文有點囉嗦,有不正之處望請諒解,有心在業餘時間發展我的倉儲系統,若是對此感興趣的朋友能夠下載開源版本的代碼研究並和本人交流,但願可以給到更多更好的建議。

 


做者:情緣
出處:http://www.cnblogs.com/qingyuan/
關於做者:從事倉庫,生產軟件方面的開發,在項目管理以及企業經營方面尋求發展之路
版權聲明:本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
聯繫方式: 我的QQ  821865130 ; 倉儲技術QQ羣 88718955,142050808 ;
吉特倉儲管理系統 開源地址: https://github.com/hechenqingyuan/gitwms

相關文章
相關標籤/搜索