iT邦幫忙

0

排班表問題請教

最近需要做一個排班表

這是我的初步架構

https://ithelp.ithome.com.tw/upload/images/20190611/20110132yPUgyD1QNc.jpg

我希望能做成一個月的,不含星期天,不過目前我暫時只有做出當週的,所以想請問
該如何實現我這個做法呢?

html

<div class="row">
    <!--床位排程資訊-->
    <div class="col-md-12 panel-left panel-80">
        <div class="box box-primary">
            <div class="box-header">
            </div><!-- /.box-header -->
            <div class="box-body">
                <div id="schTable">
                    <table id="dataTable" class="table table-bordered table-hover" style="margin: 0px 0px;">
                        <thead>
                            <tr>
                                <th class="sch-left-th"></th>
                                <th colspan="3" class="th-weekday"><span class="th-date">@DateHelper.ToDate(Model.DateOfMon)</span> 一</th>
                                <th colspan="3" class="th-weekday"><span class="th-date">@DateHelper.ToDate(Model.DateOfTue)</span> 二</th>
                                <th colspan="3" class="th-weekday"><span class="th-date">@DateHelper.ToDate(Model.DateOfWen)</span> 三</th>
                                <th colspan="3" class="th-weekday"><span class="th-date">@DateHelper.ToDate(Model.DateOfThu)</span> 四</th>
                                <th colspan="3" class="th-weekday"><span class="th-date">@DateHelper.ToDate(Model.DateOfFri)</span> 五</th>
                                <th colspan="3" class="th-weekday"><span class="th-date">@DateHelper.ToDate(Model.DateOfSat)</span> 六</th>
                            </tr>
                            <tr>
                                <th class="sch-left-th">時段</th>
                                @for (int i = 0; i < 6; i++)
                                {
                                    <th>早</th>
                                    <th>午</th>
                                    <th>晚</th>
                                }
                            </tr>
                        </thead>
                        <tbody id="dataTbody">
                            <tr>
                                <th class="sch-left-th">排班醫師</th>
                                @for (int day = 0; day < 6; day++)
                                {
                                    for (int spell = 0; spell < 3; spell++)
                                    {
                                        <td></td>
                                    }
                                }
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
            <!-- /.box-body -->
        </div>
        <!-- /.box -->
    </div>

model

 public DateTime GetStartMondayDate()
        {
            DateTime startDate = QueryDate;
            if (startDate.DayOfWeek == DayOfWeek.Sunday)
            {
                return startDate.AddDays(1);
            }
            else if (startDate.DayOfWeek == DayOfWeek.Monday)
            {
                return startDate;
            }
            else if (startDate.DayOfWeek == DayOfWeek.Tuesday)
            {
                return startDate.AddDays(-1);
            }
            else if (startDate.DayOfWeek == DayOfWeek.Wednesday)
            {
                return startDate.AddDays(-2);
            }
            else if (startDate.DayOfWeek == DayOfWeek.Thursday)
            {
                return startDate.AddDays(-3);
            }
            else if (startDate.DayOfWeek == DayOfWeek.Friday)
            {
                return startDate.AddDays(-4);
            }
            else if (startDate.DayOfWeek == DayOfWeek.Saturday)
            {
                return startDate.AddDays(-5);
            }
            else
            {
                return startDate;
            }
        }
        public DateTime DateOfMon
        {
            get
            {
                return GetStartMondayDate();
            }
        }
        public DateTime DateOfTue
        {
            get
            {
                if (DateHelper.IsDefaultDate(GetStartMondayDate())) return DateHelper.DefaultDate();
                return GetStartMondayDate().AddDays(1);
            }
        }
        public DateTime DateOfWen
        {
            get
            {
                if (DateHelper.IsDefaultDate(GetStartMondayDate())) return DateHelper.DefaultDate();
                return GetStartMondayDate().AddDays(2);
            }
        }
        public DateTime DateOfThu
        {
            get
            {
                if (DateHelper.IsDefaultDate(GetStartMondayDate())) return DateHelper.DefaultDate();
                return GetStartMondayDate().AddDays(3);
            }
        }
        public DateTime DateOfFri
        {
            get
            {
                if (DateHelper.IsDefaultDate(GetStartMondayDate())) return DateHelper.DefaultDate();
                return GetStartMondayDate().AddDays(4);
            }
        }
        public DateTime DateOfSat
        {
            get
            {
                if (DateHelper.IsDefaultDate(GetStartMondayDate())) return DateHelper.DefaultDate();
                return GetStartMondayDate().AddDays(5);
            }
        }
sam0407 iT邦高手 1 級 ‧ 2019-06-12 09:36:48 檢舉
母湯啊~~~

印象中樓主問了一系列醫院系統的問題,表示這不是學校作業能交差就好,而是預備正式上線的系統對嗎?

如果是正式要用的系統,就要考慮您的設計是否符合實際狀況,也許您去訪談使用者會告訴您星期天不用排班,但實際上呢?人事行政局決定要調假某個星期天需要上班,那您們醫院調不調??

這也就是為什麼幾位大師會建議您用現成的套件或行事曆的作法,不然等上線後早晚還是會被要求加上排星期天的需求。
tenno081 iT邦新手 4 級 ‧ 2019-06-12 10:09:29 檢舉
感謝您的疑慮,不過我被記住了那我就不敢說我這邊的無奈啦XD

好啦!無奈的不是我,是我的上面,我只是按照他們說的去做並偶爾聽聽他們的抱
怨,然後我這邊是屬於研發的,所以做好後再被修改也是正常現象,因為他們的想法
常常改變
0
淺水員
iT邦新手 2 級 ‧ 2019-06-12 19:25:50
最佳解答

今天第一次寫 asp.net
老實說我覺得前面都已經給出答案了...

<div class="row">
    <!--床位排程資訊-->
    <div class="col-md-12 panel-left panel-80">
        <div class="box box-primary">
            <div class="box-header">
            </div><!-- /.box-header -->
            <div class="box-body">
                <div id="schTable">
                    <table id="dataTable" class="table table-bordered table-hover" style="margin: 0px 0px;">
                        <tbody id="dataTbody">
                            @foreach (string[] row in DateHelper.getMonthArray(2019, 6))
                            {
                                <tr>
                                    <th class="sch-left-th"></th>
                                    @foreach (string text in row)
                                    {
                                        @if (!String.IsNullOrEmpty(text))
                                        {
                                            <th colspan="3" class="th-weekday"><span class="th-date">@text</span></th>
                                        } else {
                                            <th colspan="3" rowspan="3" class="th-weekday"></th>
                                        }
                                    }
                                </tr>
                                <tr>
                                    <th class="sch-left-th">時段</th>
                                    @foreach (string text in row)
                                    {
                                        @if (!String.IsNullOrEmpty(text))
                                        {
                                            <th>早</th>
                                            <th>午</th>
                                            <th>晚</th>
                                        }
                                    }
                                </tr>
                                <tr>
                                    <th class="sch-left-th">排班醫師</th>
                                    @foreach (string text in row)
                                    {
                                        @if (!String.IsNullOrEmpty(text))
                                        {
                                            <td></td><td></td><td></td>
                                        }
                                    }
                                </tr>
                            }
                        </tbody>
                    </table>
                </div>
            </div>
            <!-- /.box-body -->
        </div>
        <!-- /.box -->
    </div>
</div>
public class DateHelper
{
    //取得二維陣列,其內容為顯示日期的字串 YYYY/MM/DD W
    public static string[][] getMonthArray(int year, int month)
    {
        string[] weekArray = new string[] {"日", "一", "二", "三",  "四", "五", "六"};
        DateTime dt = new DateTime(year, month, 1, 0, 0, 0);
        int lastDay = dt.AddMonths(1).AddDays(-1).Day; //該月最後一天
        int wDay = (int)dt.DayOfWeek; //該月第一天是星期幾
        int nRows = (wDay + lastDay + 6) / 7; //計算共需要幾列來顯示
        string[][] result = new string[nRows][];
        for (int i = 0; i < nRows; ++i)
        {
            result[i] = new string[7];
            for(int j = 0; j < 7; ++j)
            {
                int d = i * 7 + j- wDay + 1;
                if(d>0 && d<=lastDay)
                {
                    result[i][j] = year+"/"+month+"/"+d + weekArray[(d-1+wDay)%7];
                } else
                {
                    result[i][j] = "";
                }
            }
        }
        return result;
    }
}
tenno081 iT邦新手 4 級 ‧ 2019-06-13 09:13:02 檢舉

太感謝了,原來是這樣,其實經過前面解說後我是有取得第一天跟最後一天的日期,只是那時我還沒想到要怎麼把它變成幾列來顯示,那時我只有
一列然後30格,現在我知道了,萬分感謝

0
dragonH
iT邦大師 4 級 ‧ 2019-06-11 16:14:43

如果你是想要做成像月曆那樣的 layout 的話

先不提有沒有套件可以用

基本的邏輯就是

1 .
取得該月的開始天(ex. Monday)

2 .
取得該月最後一天日期

3 .
算出該月周數

接下來用迴圈去跑

codepen

大概寫一下

還沒測有無bug

tenno081 iT邦新手 4 級 ‧ 2019-06-11 17:11:46 檢舉

你好,第一個是算該月的第一天這樣嗎?

是的話第一個第二個我大略上有實現

Firstday = DateTime.Now.AddDays(-DateTime.Now.Day + 1);

Lastday=DateTime.Now.AddMonths(1).AddDays(DateTime.Now.AddMonths(1).Day); 

第三個暫時沒想法,我看到的都是取得今天是第幾週

dragonH iT邦大師 4 級 ‧ 2019-06-11 17:23:33 檢舉

我有補上js版的你可以參考一下

基本上邏輯都一樣

月週數如果都固定每個固定格數的話

就不太需要

也比較統一美觀

1
浩瀚星空
iT邦大師 1 級 ‧ 2019-06-11 16:17:28

哇!!好久沒看到波動代碼了。

認真來說,你將星期一到六各自拆成一個模組動作就已經是不太對了。

你該換另一種思考。給與日期或是月份生成。
可以去看一下行事歷的生成做法來改變。

目前來說,如果要用你目前的程式碼來做的話。改起來會很累
建議換一下思考並重建程式碼。

tenno081 iT邦新手 4 級 ‧ 2019-06-11 16:33:11 檢舉

請問波動代碼是?我這個做法原本是屬於週排班的功能,我目前只是暫時借用過來,所以想請問一下如果只是單純排一週的話這做法也不適合嗎?

slime iT邦大師 1 級 ‧ 2019-06-11 16:59:56 檢舉

因為 日期/時間/週幾 是一個已經約定成俗的功能, 所以大部份的軟體都有對應的處理方式.

而您需要的功能, 則是在畫面顯示上"方便瀏覽(週幾排列)", 以及"部分條件設定(本月, 不排週日)".

所以建議的是思考"如何找出當月的第一天是週幾", "顯示上整理", 而其他的部分使用軟體的功能來達成, 就不用重複寫.

0
sonia
iT邦新手 3 級 ‧ 2019-06-12 15:44:44

https://ithelp.ithome.com.tw/upload/images/20190612/20018873tP8hjI2qd0.jpg]

像這樣可以嗎?

tenno081 iT邦新手 4 級 ‧ 2019-06-12 16:07:43 檢舉

類似,請問也是用asp.net MVC嗎?

這是我目前的狀況,我的總架構大略就是這樣

https://ithelp.ithome.com.tw/upload/images/20190612/20110132HkyV80cqoE.jpg

<div class="row">
    <!--床位排程資訊-->
    <div class="col-md-12 panel-left panel-80">
        <div class="box box-primary">
            <div class="box-header">
            </div><!-- /.box-header -->
            <div class="box-body">
                <div id="schTable">
                    <table id="dataTable" class="table table-bordered table-hover" style="margin: 0px 0px;">
                        <thead>
                            @for (int i = 0; i < 6; i++)
                            {
                                <tr>
                                    <th class="sch-left-th"></th>
                                    <th colspan="3" class="th-weekday"><span class="th-date"></span> 一</th>
                                    <th colspan="3" class="th-weekday"><span class="th-date"></span> 二</th>
                                    <th colspan="3" class="th-weekday"><span class="th-date"></span> 三</th>
                                    <th colspan="3" class="th-weekday"><span class="th-date"></span> 四</th>
                                    <th colspan="3" class="th-weekday"><span class="th-date"></span> 五</th>
                                    <th colspan="3" class="th-weekday"><span class="th-date"></span> 六</th>
                                    <th colspan="3" class="th-weekday"><span class="th-date"></span> 日</th>
                                </tr>
                                <tr>
                                    <th class="sch-left-th">時段</th>
                                    @for (int y = 0; y < 7; y++)
                                    {
                                        <th>早</th>
                                        <th>午</th>
                                        <th>晚</th>
                                    }
                                </tr>
                                <tr>
                                    <th class="sch-left-th">排班醫師</th>
                                    @for (int day = 0; day < 7; day++)
                                    {
                                        for (int spell = 0; spell < 3; spell++)
                                        {
                                            <td></td>
                                        }
                                    }
                                </tr>

                            }
                        </thead>
                    </table>
                </div>
            </div>
            <!-- /.box-body -->
        </div>
        <!-- /.box -->
    </div>

sonia iT邦新手 3 級 ‧ 2019-06-13 09:41:21 檢舉

我是webform,用FullCalendar做的,星期日可以用javacript控制不給輸入並show警語。用法你可參考https://ithelp.ithome.com.tw/articles/10197783

我要發表回答

立即登入回答