Browse Source

Merge branch '20200710_pc_vue_new_branch' of http://git.shengws.com/csx/Vue_New into 20200710_pc_vue_new_branch

XMLWAN 4 years ago
parent
commit
cf06a78cac

+ 1 - 0
src/lang/zh.js View File

@@ -64,6 +64,7 @@ export default {
64 64
     medicalScheduling:'医护排班',
65 65
     medicalSchedulingIndex:'医护排班',
66 66
     class:'班种列表',
67
+    schedulingStatistics:'排班统计',
67 68
     permissionManage: '权限管理',
68 69
     adminManage: '员工管理',
69 70
     roleManage: '权限管理',

+ 9 - 0
src/router/modules/medical_scheduling.js View File

@@ -38,5 +38,14 @@ export default {
38 38
       noCache: true
39 39
     }
40 40
   },
41
+  {
42
+    path: '/medicalScheduling/schedulingStatistics',
43
+    component: () => import('@/xt_pages/medicalScheduling/schedulingStatistics'),
44
+    name: 'schedulingStatistics',
45
+    meta: {
46
+      title: 'schedulingStatistics',
47
+      noCache: true
48
+    }
49
+  },
41 50
   ]
42 51
 }

+ 143 - 21
src/xt_pages/medicalScheduling/index.vue View File

@@ -3,6 +3,7 @@
3 3
         <div class="position">
4 4
             <bread-crumb :crumbs="crumbs"></bread-crumb>
5 5
             <div style="display:flex;align-items:center">
6
+                <el-button type="primary" @click="setting">设置</el-button>
6 7
                 <el-button type="primary" @click="DeleteStaffSchedule">清除</el-button>
7 8
                 <el-button type="primary" @click="copyStaffSchedule">复制</el-button>
8 9
                 <el-button type="primary" icon="el-icon-printer" @click="toPrint">打印</el-button>
@@ -202,6 +203,98 @@
202 203
                 <el-button type="primary" @click="submitAction('form')">保 存</el-button>
203 204
             </div>
204 205
             </el-dialog>
206
+
207
+            <el-dialog
208
+                title="设置"
209
+                width="800px"
210
+                :visible.sync="nurseVisible"
211
+                :before-close="_close"
212
+                >
213
+                <div>
214
+                    <el-tabs v-model="activeName">
215
+                        <el-tab-pane label="护士" name="nurse">
216
+                            <el-table
217
+                                :data="nurseTableData"
218
+                                border
219
+                                height="250"
220
+                                style="width: 100%">
221
+                                <el-table-column
222
+                                align="center"
223
+                                prop="name"
224
+                                label="姓名"
225
+                                width="180">
226
+                                </el-table-column>
227
+                                <el-table-column
228
+                                align="center"
229
+                                prop="date"
230
+                                label="职称"
231
+                                width="180">
232
+                                </el-table-column>
233
+                                <el-table-column
234
+                                align="center"
235
+                                label="排序">
236
+                                <template slot-scope="scope">
237
+                                    <el-input v-model="input" placeholder="请输入内容"></el-input>
238
+                                </template>
239
+                                </el-table-column>
240
+                                <el-table-column
241
+                                align="center"
242
+                                label="是否排班">
243
+                                <template slot-scope="scope">
244
+                                    <el-radio v-model="radio" label="1">是</el-radio>
245
+                                    <el-radio v-model="radio" label="2">否</el-radio>
246
+                                </template>
247
+                                </el-table-column>
248
+                            </el-table>
249
+                        </el-tab-pane>
250
+                        <el-tab-pane label="医生" name="doctor">
251
+                            <el-table
252
+                                :data="nurseTableData"
253
+                                border
254
+                                height="250"
255
+                                style="width: 100%">
256
+                                <el-table-column
257
+                                align="center"
258
+                                prop="name"
259
+                                label="姓名"
260
+                                width="180">
261
+                                </el-table-column>
262
+                                <el-table-column
263
+                                align="center"
264
+                                prop="date"
265
+                                label="职称"
266
+                                width="180">
267
+                                </el-table-column>
268
+                                <el-table-column
269
+                                align="center"
270
+                                label="排序">
271
+                                <template slot-scope="scope">
272
+                                    <el-input v-model="input" placeholder="请输入内容"></el-input>
273
+                                </template>
274
+                                </el-table-column>
275
+                                <el-table-column
276
+                                align="center"
277
+                                label="是否排班">
278
+                                <template slot-scope="scope">
279
+                                    <el-radio v-model="radio" label="1">是</el-radio>
280
+                                    <el-radio v-model="radio" label="2">否</el-radio>
281
+                                </template>
282
+                                </el-table-column>
283
+                            </el-table>
284
+                        </el-tab-pane>
285
+                    </el-tabs>
286
+                    <div style="margin-top:20px;">
287
+                        <p style="line-height:20px;">1.默认科室所有排序在职员工账号</p>
288
+                        <p style="line-height:20px;">2.护士默认排序,按加入机构先后降序排序,最先加入机构的排序为1,显示在列表最下面,自定义排序,最大的序号排在最上面</p>
289
+                        <p style="line-height:20px;">3.职称显示与管理中旬的员工列表显示的职称一样</p>
290
+                        <p style="line-height:20px;">4.是否排班,默认机构所有用户是“是”,如果是否,则该用户不在医护排班列表中</p>
291
+                    </div>
292
+                </div>
293
+                <!-- <div slot="footer" class="dialog-footer">
294
+                <el-button @click="hide">取 消</el-button>
295
+                <el-button type="primary" @click="submitAction()">保 存</el-button>
296
+                </div> -->
297
+            </el-dialog>
205 298
         </div>
206 299
     </div>
207 300
 </template>
@@ -267,6 +360,29 @@ export default {
267 360
            arrFive:[],
268 361
            arrSix:[],
269 362
            arrSeven:[],
363
+
364
+           //
365
+           nurseTableData: [{
366
+            date: '2016-05-02',
367
+            name: '王小虎',
368
+            address: '上海市普陀区金沙江路 1518 弄'
369
+            }, {
370
+            date: '2016-05-04',
371
+            name: '王小虎',
372
+            address: '上海市普陀区金沙江路 1517 弄'
373
+            }, {
374
+            date: '2016-05-01',
375
+            name: '王小虎',
376
+            address: '上海市普陀区金沙江路 1519 弄'
377
+            }, {
378
+            date: '2016-05-03',
379
+            name: '王小虎',
380
+            address: '上海市普陀区金沙江路 1516 弄'
381
+            }],
382
+            nurseVisible:false,
383
+            activeName:'nurse',
384
+            radio:'1'
385
+            
270 386
         }
271 387
     },
272 388
     methods:{
@@ -777,10 +893,10 @@ export default {
777 893
         
778 894
         },
779 895
 
780
-     unique(arr) { 
781
-        const res = new Map();
782
-        return arr.filter((arr) => !res.has(arr.admin_user_id) && res.set(arr.admin_user_id, 1))
783
-     },
896
+        unique(arr) { 
897
+            const res = new Map();
898
+            return arr.filter((arr) => !res.has(arr.admin_user_id) && res.set(arr.admin_user_id, 1))
899
+        },
784 900
         
785 901
         //获取上一周下一周的排班数据
786 902
         getNextWeekList(){
@@ -1292,23 +1408,29 @@ export default {
1292 1408
                 return value2 - value1;
1293 1409
             }
1294 1410
         },
1295
-       tableCellStyle (row, rowIndex, column) {
1296
-         var week = (row.column.label).split('');
1297
-          var weeks = 0
1298
-         if (week.length == 13) {
1299
-            weeks = week[4]+week[5]+week[6]+week[7]+week[8]+week[9]+week[10]+week[11]
1300
-         }
1301
-         if (week.length == 14) {
1302
-            weeks = week[4]+week[5]+week[6]+week[7]+week[8]+week[9]+week[10]+week[11]+week[12]
1303
-         }
1304
-        
1305
-        //  console.log("week",week)
1306
-        //  console.log("weeks",weeks)
1307
-         var weekdate =  this.getTimestamp(weeks)
1308
-         if(weekdate  < this.timeNow){
1309
-           return 'background-color:#e5e5e5;'
1310
-          }
1311
-       },
1411
+        tableCellStyle (row, rowIndex, column) {
1412
+            var week = (row.column.label).split('');
1413
+            var weeks = 0
1414
+            if (week.length == 13) {
1415
+                weeks = week[4]+week[5]+week[6]+week[7]+week[8]+week[9]+week[10]+week[11]
1416
+            }
1417
+            if (week.length == 14) {
1418
+                weeks = week[4]+week[5]+week[6]+week[7]+week[8]+week[9]+week[10]+week[11]+week[12]
1419
+            }
1420
+            
1421
+            //  console.log("week",week)
1422
+            //  console.log("weeks",weeks)
1423
+            var weekdate =  this.getTimestamp(weeks)
1424
+            if(weekdate  < this.timeNow){
1425
+            return 'background-color:#e5e5e5;'
1426
+            }
1427
+        },
1428
+        setting(){
1429
+            this.nurseVisible = true
1430
+        },
1431
+        _close: function(done) {
1432
+            done();
1433
+        },
1312 1434
     },
1313 1435
     created(){
1314 1436
         //获取医护人员

+ 422 - 0
src/xt_pages/medicalScheduling/schedulingStatistics.vue View File

@@ -0,0 +1,422 @@
1
+<template>
2
+    <div class="main-contain">
3
+        <div class="position">
4
+            <bread-crumb :crumbs="crumbs"></bread-crumb>
5
+            <div style="display:flex;align-items:center">
6
+                <el-button type="primary" icon="el-icon-printer">打印</el-button>
7
+            </div>
8
+        </div>
9
+        <div class="app-container">
10
+            <div class="cell clearfix">
11
+                <el-input
12
+                size="small"
13
+                style="width: 150px;"
14
+                class="filter-item"
15
+                v-model.trim="keywords"
16
+                placeholder="请输入医护人员姓名"
17
+                @keyup.enter.native='toSearch'
18
+                />
19
+                <el-button
20
+                size="small"
21
+                class="filter-item"
22
+                type="primary"
23
+                icon="el-icon-search"
24
+                @click="toSearch"
25
+                >搜索</el-button
26
+                >
27
+                <el-select style="margin-left:10px;width:150px;margin-right:10px;" v-model="typeValue" placeholder="请选择" @change="changeOption">
28
+                    <el-option
29
+                        v-for="item in options"
30
+                        :key="item.value"
31
+                        :label="item.label"
32
+                        :value="item.value">
33
+                    </el-option>
34
+                </el-select>
35
+                <el-radio v-model="timeSlot" label="1">周</el-radio>
36
+                <el-radio v-model="timeSlot" label="2">月</el-radio>
37
+                <el-radio v-model="timeSlot" label="3">自定义</el-radio>
38
+                <div style="display:flex;" v-if="timeSlot == '1'">
39
+                    <el-button @click="lastclick" type="text" style="margin:0 10px;">&lt;上一周({{ weekNum - 1 }})</el-button>
40
+                    <div class="dateBox">{{ weekDayArr[0] }}-{{ weekDayArr[6] }}({{ weekNum }})</div>
41
+                    <el-button @click="nextclick" type="text" style="margin:0 10px;">下一周({{ weekNum + 1 }})&gt;</el-button>
42
+                </div>
43
+                <div style="display:flex;" v-if="timeSlot == '2'">
44
+                    <!-- <el-button @click="lastclick" type="text" style="margin:0 10px;">&lt;上个月({{  }})</el-button>
45
+                    <div class="dateBox">{{  }}-{{  }}({{  }})</div>
46
+                    <el-button @click="nextclick" type="text" style="margin:0 10px;">下个月({{  }})&gt;</el-button> -->
47
+                    <el-date-picker
48
+                    @change='changeMonth'
49
+                    v-model="monthTime"
50
+                    type="month"
51
+                    placeholder="选择月">
52
+                    </el-date-picker>
53
+                </div>
54
+                <div style="display:flex;align-items: center;" v-if="timeSlot == '3'">
55
+                    <el-date-picker
56
+                    style="width:140px;"
57
+                    v-model="customTime1"
58
+                    type="date"
59
+                    placeholder="选择日期"
60
+                    :picker-options="pickerOptions">
61
+                    </el-date-picker>-
62
+                    <el-date-picker
63
+                    style="width:140px;"
64
+                    v-model="customTime2"
65
+                    type="date"
66
+                    placeholder="选择日期"
67
+                    :picker-options="pickerOptions">
68
+                    </el-date-picker>
69
+                </div>
70
+                
71
+            </div>
72
+            <div class="tableTitle">统计图</div>
73
+            <div class="cell clearfix" style="margin:0;">
74
+                <p class="point"></p>
75
+                <p class="pointTitle">工时/小时</p>
76
+            </div>
77
+            <div>
78
+                <line-chart :options="chart"></line-chart>
79
+            </div>
80
+            <div class="tableTitle">统计表</div>
81
+            <el-table
82
+                :data="tableData"
83
+                height="250"
84
+                border
85
+                style="width: 100%">
86
+                <el-table-column
87
+                align="center"
88
+                prop="date"
89
+                label="日期"
90
+                width="180">
91
+                </el-table-column>
92
+                <el-table-column
93
+                align="center"
94
+                prop="name"
95
+                label="姓名"
96
+                width="180">
97
+                </el-table-column>
98
+                <el-table-column
99
+                align="center"
100
+                prop="address"
101
+                label="地址">
102
+                </el-table-column>
103
+            </el-table>
104
+        </div>
105
+    </div>
106
+</template>
107
+
108
+
109
+<script>
110
+import echarts from "echarts";
111
+import BreadCrumb from '@/xt_pages/components/bread-crumb'
112
+import LineChart from "../qcd/components/LineChart";
113
+export default {
114
+    components:{
115
+        BreadCrumb,
116
+        LineChart
117
+    },
118
+    data(){
119
+        return{
120
+            pickerOptions: {
121
+                disabledDate(time) {
122
+                    let threeMonths = new Date(new Date().setFullYear(new Date().getFullYear()-1)).getTime() - 24 * 3600 * 1000;
123
+                    return time.getTime() > Date.now() || time.getTime() < threeMonths;;
124
+                }
125
+            },
126
+            crumbs: [
127
+                { path: false, name: '医护排班' },
128
+                { path: '/medicalScheduling/index', name: '排班统计' }
129
+            ],
130
+            keywords:'',
131
+            options: [{
132
+                value: '0',
133
+                label: '全部'
134
+            }, {
135
+                value: '2',
136
+                label: '医生'
137
+            }, {
138
+                value: '3',
139
+                label: '护士'
140
+            }],
141
+            typeValue:'0',
142
+            weekNum:'',
143
+            weekDayArr:[],
144
+            todayDate:'',
145
+            clen:7,
146
+            nowYear: new Date().getFullYear(),
147
+
148
+            timeSlot:'1',
149
+            monthTime:'',
150
+            customTime1:'',
151
+            customTime2:'',
152
+
153
+            chart: {
154
+                title: {
155
+                    text: "ECharts 入门示例"
156
+                },
157
+                tooltip: {},
158
+                legend: {
159
+                    data: [],
160
+                    left: 0
161
+                },
162
+                xAxis: {
163
+                    data: []
164
+                },
165
+                yAxis: {
166
+                    axisLabel: {
167
+                        formatter: "{value} %"
168
+                    },
169
+                    show: false
170
+                },
171
+                series: [
172
+                    {
173
+                        name: "",
174
+                        type: "bar",
175
+                        data: [],
176
+                        barWidth: 30,
177
+                        label: {
178
+                        normal: {
179
+                            show: true,
180
+                            position: "top",
181
+                            formatter: (params) => {
182
+                            if(this.percent.length > 0){
183
+                                let str = ''
184
+                                str = params.data + '('+ this.percent[params.dataIndex] +'%)'
185
+                                return str
186
+                            }else{
187
+                                let str = ''
188
+                                str = params.data
189
+                                return str
190
+                            }
191
+                            }
192
+                        }
193
+                        },
194
+                        //配置样式
195
+                        itemStyle: {
196
+                        //通常情况下:
197
+
198
+                        //每个柱子的颜色即为colorList数组里的每一项,如果柱子数目多于colorList的长度,则柱子颜色循环使用该数组
199
+                        normal: {
200
+                            color: function(params) {
201
+                            //我这边就两个柱子,大体就两个柱子颜色渐变,所以数组只有两个值,多个颜色就多个值
202
+                            var colorList = [
203
+                                ["#A9E0F3", "#9FBDFC"],
204
+
205
+                                ["#FFD7C0", "#FF9994"]
206
+                            ];
207
+
208
+                            var index = params.dataIndex;
209
+                            if (params.dataIndex >= colorList.length) {
210
+                                index = params.dataIndex % colorList.length;
211
+                            }
212
+
213
+                            return new echarts.graphic.LinearGradient(0, 0, 0, 1, [
214
+                                { offset: 0, color: colorList[index][0] },
215
+                                // { offset: 0.5, color: colorList[index][1] },
216
+                                { offset: 1, color: colorList[index][1] }
217
+                            ]);
218
+                            },
219
+                            barBorderRadius: [5, 5, 0, 0] //柱状角成椭圆形
220
+                        },
221
+
222
+                        //鼠标悬停时:
223
+                        emphasis: {
224
+                            shadowBlur: 10,
225
+                            shadowOffsetX: 0,
226
+                            shadowColor: "rgba(0, 0, 0, 0.2)"
227
+                        }
228
+                        }
229
+                    }
230
+                ],
231
+                dataZoom: [
232
+                    {
233
+                        // Y轴固定,让内容滚动
234
+                        type: 'slider',
235
+                        show: false,
236
+                        xAxisIndex: [0],
237
+                        start: 1,
238
+                        end: 20, // 设置X轴刻度之间的间隔(根据数据量来调整)
239
+                        zoomLock: true // 锁定区域禁止缩放(鼠标滚动会缩放,所以禁止)
240
+                    },
241
+                    {
242
+                        type: 'inside',
243
+                        xAxisIndex: [0],
244
+                        start: 1,
245
+                        end: 20,
246
+                        zoomLock: true // 锁定区域禁止缩放
247
+                    }
248
+                ]
249
+            },
250
+
251
+            tableData: [{
252
+                date: '2016-05-03',
253
+                name: '王小虎',
254
+                address: '上海市普陀区金沙江路 1518 弄'
255
+                }, {
256
+                date: '2016-05-02',
257
+                name: '王小虎',
258
+                address: '上海市普陀区金沙江路 1518 弄'
259
+                }, {
260
+                date: '2016-05-04',
261
+                name: '王小虎',
262
+                address: '上海市普陀区金沙江路 1518 弄'
263
+                }, {
264
+                date: '2016-05-01',
265
+                name: '王小虎',
266
+                address: '上海市普陀区金沙江路 1518 弄'
267
+                }, {
268
+                date: '2016-05-08',
269
+                name: '王小虎',
270
+                address: '上海市普陀区金沙江路 1518 弄'
271
+                }, {
272
+                date: '2016-05-06',
273
+                name: '王小虎',
274
+                address: '上海市普陀区金沙江路 1518 弄'
275
+                }, {
276
+                date: '2016-05-07',
277
+                name: '王小虎',
278
+                address: '上海市普陀区金沙江路 1518 弄'
279
+            }]
280
+
281
+        }
282
+    },
283
+    created(){
284
+        let year = new Date().getFullYear()
285
+        let month = new Date().getMonth() + 1
286
+        let date = new Date().getDate()
287
+        this.weekNum = this.getYearWeek(year,month,date)
288
+        this.todayDate=this.formatDate(new Date())
289
+        this.setDate(new Date())
290
+    },
291
+    methods:{
292
+        toSearch(){},
293
+        formatDate(date){      
294
+            var year = date.getFullYear()+'.'       
295
+            var month = (date.getMonth()+1)+'.';
296
+            var day = date.getDate();
297
+            return year+month+day
298
+        }, 
299
+        addDate(date,n){        
300
+            date.setDate(date.getDate()+n);        
301
+            return date;
302
+        },  
303
+        setDate(date){           
304
+            var week = date.getDay()-1;
305
+            date = this.addDate(date,week*-1);
306
+            this.currentFirstDate = new Date(date);
307
+            this.currentDate = new Date(date)
308
+            for(var i = 0;i<this.clen; i++){     
309
+                this.weekDayArr.push(this.formatDate(i==0 ? date : this.addDate(date,1)))
310
+            }         
311
+        },
312
+        //上一周 
313
+        lastclick(){
314
+            this.weekDayArr=[]
315
+            this.setDate(this.addDate(this.currentFirstDate,-7));   
316
+            if (this.weekNum == 1) {
317
+                let year = this.nowYear - 1
318
+                let month = 12
319
+                let date = 31
320
+                this.weekNum = this.getYearWeek(year, month, date)
321
+                this.nowYear = this.nowYear - 1
322
+            }
323
+            this.weekNum = this.weekNum - 1
324
+        },
325
+        //下一周
326
+        nextclick(){ 
327
+            this.weekDayArr=[]                
328
+            this.setDate(this.addDate(this.currentFirstDate,7));
329
+            this.weekNum = this.weekNum + 1
330
+            if (this.weekNum == 53) {
331
+                let year = this.nowYear + 1
332
+                let month = 1
333
+                let date = 1
334
+                this.weekNum = this.getYearWeek(year, month, date)
335
+                this.nowYear = this.nowYear + 1
336
+            }
337
+        },
338
+        getYearWeek(year,month,date){
339
+            /*  
340
+                dateNow是当前日期 
341
+                dateFirst是当年第一天  
342
+                dataNumber是当前日期是今年第多少天  
343
+                用dataNumber + 当前年的第一天的周差距的和在除以7就是本年第几周  
344
+            */      
345
+            let dateNow = new Date(year, parseInt(month) - 1, date);
346
+            let dateFirst = new Date(year, 0, 1);
347
+            let dataNumber = Math.round((dateNow.valueOf() - dateFirst.valueOf()) / 86400000);
348
+            return Math.ceil((dataNumber + ((dateFirst.getDay() + 1) - 1)) / 7);        
349
+            },
350
+            getTimestamp(time) { //把时间日期转成时间戳
351
+            return (new Date(time)).getTime() / 1000
352
+        },
353
+
354
+        changeMonth(value){
355
+            console.log(value)
356
+            console.log('monthStartTime',value.getTime() / 1000)
357
+            let monthStartTime = value.getTime() / 1000
358
+            var nowDate = new Date(value);
359
+            var cloneNowDate = new Date(value);
360
+            var fullYear = nowDate.getFullYear();
361
+            var month = nowDate.getMonth() + 1; // getMonth 方法返回 0-11,代表1-12月
362
+            var endOfMonth = new Date(fullYear, month, 0).getDate(); // 获取本月最后一天
363
+            let monthEndTime = this.getFullDate(cloneNowDate.setDate(endOfMonth))
364
+            
365
+            
366
+            console.log('monthEndTime',this.getTimestamp(monthEndTime))
367
+            
368
+        },
369
+        getFullDate(targetDate) {
370
+            var D, y, m, d;
371
+            if (targetDate) {
372
+                D = new Date(targetDate);
373
+                y = D.getFullYear();
374
+                m = D.getMonth() + 1;
375
+                d = D.getDate();
376
+            } else {
377
+                y = fullYear;
378
+                m = month;
379
+                d = date;
380
+            }
381
+            m = m > 9 ? m : '0' + m;
382
+            d = d > 9 ? d : '0' + d;
383
+            return y + '-' + m + '-' + d;
384
+        },
385
+        getTimestamp(time) { //把时间日期转成时间戳
386
+            return (new Date(time)).getTime() / 1000
387
+        },
388
+    }
389
+}
390
+</script>
391
+
392
+
393
+<style lang="scss" scoped>
394
+.dateBox{
395
+    border: 1px solid #DCDFE6;
396
+    height: 36px;
397
+    line-height: 36px;
398
+    text-align: center;
399
+    padding: 0 10px;
400
+    border-radius: 4px;
401
+}
402
+.tableTitle {
403
+  font-size: 16px;
404
+  color: #000;
405
+  font-weight: bold;
406
+  margin-bottom: 10px;
407
+}
408
+.point {
409
+  width: 13px;
410
+  height: 13px;
411
+  background: linear-gradient(
412
+    0deg,
413
+    rgba(169, 224, 243, 1),
414
+    rgba(159, 189, 252, 1)
415
+  );
416
+  border-radius: 7px;
417
+  margin-right: 8px;
418
+}
419
+.pointTitle {
420
+  font-size: 13px;
421
+}
422
+</style>