miaofuhao лет назад: 6
Родитель
Сommit
78e9d9cb2c

+ 25 - 9
WebChart/js/pieChat.js

@@ -17,8 +17,16 @@ function satisfaction(start, end, areaTwoVal) {
17 17
 			if(data.state == "success") {
18 18
 				var sorceData=data.data
19 19
 				var option = {
20
+//					tooltip: {
21
+//						formatter: "{b} : {c} ({d}%)"
22
+//					},
20 23
 					tooltip: {
21
-						formatter: "{b} : {c} ({d}%)"
24
+					    formatter: function (val) {
25
+					        // console.log(val);// 打印可以看到里面包含什么
26
+					        var percent = val.data.name+":"+val.data.text;
27
+					        // 下面return的值可以随便填。填你所需要的值就好。
28
+					        return percent;
29
+					    }
22 30
 					},
23 31
 					legend: {
24 32
 						orient: 'vertical',
@@ -70,35 +78,43 @@ function satisfaction(start, end, areaTwoVal) {
70 78
 						},
71 79
 
72 80
 						data: [{
73
-								value: sorceData[0].Count,
81
+								value: 0,
82
+								text: sorceData[0].Count,
74 83
 								name: '12345邮箱',
75 84
 							},
76 85
 							{
77
-								value: sorceData[1].Count,
86
+								value: 0,
87
+								text: sorceData[1].Count,
78 88
 								name: '电话',
79 89
 							},
80 90
 							{
81
-								value: sorceData[2].Count,
91
+								value: 0,
92
+								text: sorceData[2].Count,
82 93
 								name: '市县转单',
83 94
 							},
84 95
 							{
85
-								value: sorceData[3].Count,
96
+								value: 0,
97
+								text: sorceData[3].Count,
86 98
 								name: '手机APP',
87 99
 							},
88 100
 							{
89
-								value: sorceData[4].Count,
101
+								value: 0,
102
+								text: sorceData[4].Count,
90 103
 								name: '网站',
91 104
 							},
92 105
 							{
93
-								value: sorceData[5].Count,
106
+								value: 0,
107
+								text: sorceData[5].Count,
94 108
 								name: '微博',
95 109
 							},
96 110
 							{
97
-								value: sorceData[6].Count,
111
+								value: 0,
112
+								text: sorceData[6].Count,
98 113
 								name: '微信',
99 114
 							},
100 115
 							{
101
-								value: sorceData[7].Count,
116
+								value: 0,
117
+								text: sorceData[7].Count,
102 118
 								name: '政府服务网',
103 119
 							}
104 120
 

+ 11 - 98
WebUI/CallCenterWeb.UI/CommonHtml/PrintPreview-1.html

@@ -14,7 +14,7 @@
14 14
     </METAHTTP-EQUIV="Expires" CONTENT="0">-->
15 15
 		<style>
16 16
 			#main {
17
-				width: 788.8px;
17
+				width: 100%;
18 18
 				/*margin: 0 auto;*/
19 19
 				-webkit-box-shadow: 1px 1px 9px 2px #D2D2D2;
20 20
 				box-shadow: 1px 1px 9px 2px #D2D2D2;
@@ -57,7 +57,7 @@
57 57
 			}
58 58
 			#main table {
59 59
 				margin: 0 auto;
60
-				width: 621px;
60
+				width: 100%;
61 61
 				border-collapse: collapse;
62 62
 				font-size: 13pt;
63 63
 				font-family: "仿宋";
@@ -323,13 +323,15 @@
323 323
 		<!--endprint1-->
324 324
 
325 325
 		<div class="alignC">
326
-			<input type="button" value="导出PDF" class="btn" id="btn-html2canvas" />
326
+			<input type="button" value="导出Word" class="btn" id="btn-html2canvas" />
327 327
 			<input type="button" value="打印" class="btn" onclick="preview(1)" />
328 328
 		</div>
329 329
 
330 330
 		<script src="../js/plugins/html2pdf/jspdf.debug.js"></script>
331 331
 		<script src="../js/plugins/html2pdf/html2canvas.js"></script>
332 332
 		<script src="../js/plugins/html2pdf/canvas2image.js"></script>
333
+		<script src="../js/plugins/html2pdf/FileSaver.js"></script>
334
+		<script src="../js/plugins/html2pdf/jquery.wordexport.js"></script>
333 335
 		<script type="text/javascript">
334 336
 			var wid = helper.request.queryString("wid");
335 337
 			$(document).ready(function() {
@@ -350,6 +352,8 @@
350 352
 							$(".lxr ").text(content.data[0].F_ComContent); //内容
351 353
 							if (content.data[0].F_IsReload>0) {
352 354
 								$(".textCb").show();
355
+							}else{
356
+								$(".textCb").remove();
353 357
 							}
354 358
 							var T = content.data[0].F_CreateTime; //受理时间
355 359
 							if(T) {
@@ -423,102 +427,11 @@
423 427
 						}
424 428
 					})
425 429
 				}
426
-				//导出pdf点击事件
427
-				document.getElementById("btn-html2canvas").onclick = convert2pdf;
428
-			})
429
-
430
-			//导出pdf处理过清晰度
431
-			function convert2pdf() {
432
-				var cntElem = $('#main')[0];
433
-				var shareContent = cntElem; //需要截图的包裹的(原生的)DOM 对象
434
-				var width = shareContent.offsetWidth; //获取dom 宽度
435
-				var height = shareContent.offsetHeight; //获取dom 高度
436
-				var canvas = document.createElement("canvas"); //创建一个canvas节点
437
-				var scale = 2; //定义任意放大倍数 支持小数
438
-				canvas.width = width * scale; //定义canvas 宽度 * 缩放
439
-				canvas.height = height * scale; //定义canvas高度 *缩放
440
-				canvas.getContext("2d").scale(scale, scale); //获取context,设置scale 
441
-				var opts = {
442
-					scale: scale, // 添加的scale 参数
443
-					canvas: canvas, //自定义 canvas
444
-					// logging: true, //日志开关,便于查看html2canvas的内部执行流程
445
-					width: width, //dom 原始宽度
446
-					height: height,
447
-					useCORS: true // 【重要】开启跨域配置
448
-				};
449
-
450
-				html2canvas(shareContent, opts).then(function(canvas) {
451
-					var context = canvas.getContext('2d');
452
-					// 【重要】关闭抗锯齿
453
-					context.mozImageSmoothingEnabled = false;
454
-					context.webkitImageSmoothingEnabled = false;
455
-					context.msImageSmoothingEnabled = false;
456
-					context.imageSmoothingEnabled = false;
457
-					var w = canvas.width;
458
-					var h = canvas.height;
459
-					// 【重要】默认转化的格式为png,也可设置为其他格式
460
-					var img = Canvas2Image.convertToJPEG(canvas, w, h, 'jpeg');
461
-
462
-					var imgData = $(img).attr('src');
463
-
464
-					var doc = new jsPDF("p", "mm", "a4");
465
-					//                               |
466
-					// |—————————————————————————————|                     
467
-					// A0 841×1189                           
468
-					// A1 594×841                            
469
-					// A2 420×594                            
470
-					// A3 297×420                            
471
-					// A4 210×297                            
472
-					// A5 148×210                            
473
-					// A6 105×148                            
474
-					// A7 74×105                             
475
-					// A8 52×74                              
476
-					// A9 37×52                              
477
-					// A10 26×37             
478
-					//     |——|———————————————————————————|
479
-					//                                 |——|——|
480
-					//                                 |     |      
481
-					doc.addImage(imgData, 'JPEG', 0, 0, 210, 297);
482
-
483
-					doc.save('sq12345.pdf');
484
-
485
-				});
486
-			}
487
-
488
-			//导出pdf未处理清晰度
489
-			function convert2pdf1() {
490
-				// 将 id 为 content 的 div 渲染成 canvas
491
-				html2canvas(document.getElementById("main"), {
492
-
493
-					// 渲染完成时调用,获得 canvas
494
-					onrendered: function(canvas) {
495
-
496
-						// 从 canvas 提取图片数据
497
-						var imgData = canvas.toDataURL('image/jpeg');
498
-
499
-						var doc = new jsPDF("p", "mm", "a4");
500
-						//                               |
501
-						// |—————————————————————————————|                     
502
-						// A0 841×1189                           
503
-						// A1 594×841                            
504
-						// A2 420×594                            
505
-						// A3 297×420                            
506
-						// A4 210×297                            
507
-						// A5 148×210                            
508
-						// A6 105×148                            
509
-						// A7 74×105                             
510
-						// A8 52×74                              
511
-						// A9 37×52                              
512
-						// A10 26×37             
513
-						//     |——|———————————————————————————|
514
-						//                                 |——|——|
515
-						//                                 |     |      
516
-						doc.addImage(imgData, 'JPEG', 0, 0, 210, 297);
517
-
518
-						doc.save('sq12345.pdf');
519
-					}
430
+				$("#btn-html2canvas").on("click",function(){
431
+				    $("#main").wordExport();
520 432
 				});
521
-			}
433
+				
434
+			})
522 435
 
523 436
 			function preview(oper) {
524 437
 				//debugger;

+ 43 - 12
WebUI/CallCenterWeb.UI/ReportForm/seatsCheck.html

@@ -82,7 +82,17 @@
82 82
 						<div class="one_content">
83 83
 							<div class="toolBar clearfix">
84 84
 								<div class="toolLeft">
85
-									开始时间: <span class="time-box"><i class="tub fa fa-calendar"></i><input type="text" id="startTime" /></span> 结束时间: <span class="time-box"><i class="tub fa fa-calendar"></i><input type="text" id="endTime" /></span>
85
+									 
86
+									开始时间: 
87
+									<span class="time-box">
88
+										<i class="tub fa fa-calendar"></i>
89
+										<input type="text" id="startTime" style="width: 190px;"/>
90
+									</span>
91
+									 结束时间: 
92
+									 <span class="time-box">
93
+									 	<i class="tub fa fa-calendar"></i>
94
+									 	<input type="text" id="endTime" style="width: 190px;"/>
95
+									 </span>
86 96
 									<a class="search btns">搜索</a>
87 97
 									<a class="btns export">导出</a>
88 98
 
@@ -115,7 +125,16 @@
115 125
 						<div class="two_content" style="display: none;">
116 126
 							<div class="toolBar clearfix">
117 127
 								<div class="toolLeft">
118
-									开始时间: <span class="time-box"><i class="tub fa fa-calendar"></i><input type="text" id="startTime1" /></span> 结束时间: <span class="time-box"><i class="tub fa fa-calendar"></i><input type="text" id="endTime1" /></span>
128
+									开始时间: 
129
+									<span class="time-box">
130
+										<i class="tub fa fa-calendar"></i>
131
+										<input type="text" id="startTime1" />
132
+									</span> 
133
+									结束时间: 
134
+									<span class="time-box">
135
+										<i class="tub fa fa-calendar"></i>
136
+										<input type="text" id="endTime1" />
137
+									</span>
119 138
 									<a class="search2 btns">搜索</a>
120 139
 									<a class="btns export2">导出</a>
121 140
 
@@ -150,9 +169,21 @@
150 169
 		<script>
151 170
 			var table1 = $('#table1');
152 171
 			var dates = new Date();
153
-			var time = dates.getFullYear() + "-" + (dates.getMonth() + 1) + "-" + (dates.getDate());
172
+			//helper.DateFormat.getNowDate();
173
+			//alert()
174
+			var timeS = dates.getFullYear() + "-" 
175
+			+ (dates.getMonth() + 1) 
176
+			+ "-" + (dates.getDate())
177
+			+ " 00:00:00";
178
+			var timeE = dates.getFullYear() + "-" 
179
+			+ (dates.getMonth() + 1) 
180
+			+ "-" + (dates.getDate())
181
+			+ " " + (dates.getHours())
182
+			+ ":" + (dates.getMinutes())
183
+			+ ":" + (dates.getSeconds());
154 184
 			$(document).ready(function() {
155
-
185
+				//获取当前小时数(0-23)    
186
+		 		//获取当前分钟数(0-59)    
156 187
 				$('.ul_tab li').click(function() {
157 188
 					//					$(this).parent().find("li").removeClass("active");
158 189
 					$(this).addClass("active").siblings().removeClass("active");
@@ -160,28 +191,28 @@
160 191
 					$('.tab-content').children("div").eq(index).show().siblings().hide();
161 192
 				})
162 193
 
163
-				$('#startTime').val(time)
194
+				$('#startTime').val(timeS)
164 195
 				laydate.render({
165 196
 					elem: '#startTime',
166
-					format: 'yyyy-MM-dd',
197
+					type: 'datetime',
167 198
 					theme: '#00a1cb'
168 199
 				});
169
-				$('#endTime').val(time)
200
+				$('#endTime').val(timeE)
170 201
 				laydate.render({
171 202
 					elem: '#endTime',
172
-					format: 'yyyy-MM-dd',
203
+					type: 'datetime',
173 204
 					theme: '#00a1cb'
174 205
 				});
175
-				$('#startTime1').val(time)
206
+				$('#startTime1').val(timeS)
176 207
 				laydate.render({
177 208
 					elem: '#startTime1',
178
-					format: 'yyyy-MM-dd',
209
+					type: 'datetime',
179 210
 					theme: '#00a1cb'
180 211
 				});
181
-				$('#endTime1').val(time)
212
+				$('#endTime1').val(timeE)
182 213
 				laydate.render({
183 214
 					elem: '#endTime1',
184
-					format: 'yyyy-MM-dd',
215
+					type: 'datetime',
185 216
 					theme: '#00a1cb'
186 217
 				});
187 218
 				initTable1();

+ 14 - 0
WebUI/CallCenterWeb.UI/YeWu/Number.html

@@ -59,6 +59,10 @@
59 59
         .cx {
60 60
             display: block;
61 61
         }
62
+        .seach-box ul li select{
63
+        	height: 32px;
64
+        	line-height: 32px;
65
+        }
62 66
     </style>
63 67
 </head>
64 68
 
@@ -94,6 +98,15 @@
94 98
                                     </span>
95 99
                                 </li>
96 100
                                 <li>
101
+                                	办理单位:
102
+                                	<select name="" id="BLDW">
103
+									 	<option value="">一级单位</option>
104
+									 	<option value="1">一级单位</option>
105
+									 	<option value="2">一级单位</option>
106
+									 </select>
107
+                                </li>
108
+                                
109
+                                <li>
97 110
                                     <a class="sc_btn btns db">搜索</a>
98 111
                                      <a class="sc_btn btns export">导出</a>
99 112
                                 </li>
@@ -166,6 +179,7 @@
166 179
                 type: 'get',
167 180
                 data: {
168 181
                     sdate: $("#startTimes").val(),
182
+                    isdept:$("#BLDW").val(),
169 183
                     edate: $("#endTimes").val(),
170 184
                     //date: $("#monthDateTimes").val(),
171 185
                     token: $.cookie("token")

+ 211 - 0
WebUI/CallCenterWeb.UI/YeWu/QXMY.html

@@ -0,0 +1,211 @@
1
+<!DOCTYPE html>
2
+<html>
3
+
4
+<head>
5
+    <meta charset="UTF-8">
6
+    <title>满意度统计</title>
7
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
+    <script src="../Script/Common/huayi.load.js"></script>
9
+    <script src="../Script/Common/huayi.config.js"></script>
10
+    <link rel="stylesheet" href="../js/zTree/zTreeStyle.css" />
11
+    <link href="../css/WorkOrder/Search.css" rel="stylesheet">
12
+    <link href="../css/init.css" rel="stylesheet" />
13
+    <script src="../css/laydate/laydate.js"></script>
14
+    <script src="../My97DatePicker/WdatePicker.js"></script>
15
+    <style>
16
+        table td {
17
+            word-break: break-all;
18
+            word-wrap: break-word;
19
+        }
20
+
21
+        .ld-service li {
22
+            float: left;
23
+            font-size: 14px;
24
+            color: #000;
25
+            padding: 5px 15px;
26
+            cursor: pointer;
27
+            border-bottom: 1px solid #ccc;
28
+        }
29
+
30
+        .cr-click {
31
+            border: 1px solid #ccc;
32
+            background-color: #fff;
33
+            border-bottom: none !important;
34
+            border-bottom-left-radius: 5px;
35
+            border-bottom-right-radius: 5px;
36
+        }
37
+
38
+        .Shows {
39
+            display: block !important;
40
+        }
41
+
42
+        .complain {
43
+            display: none;
44
+        }
45
+
46
+        th {
47
+            padding: 5px;
48
+            text-align: center;
49
+        }
50
+
51
+        td {
52
+            padding: 5px;
53
+        }
54
+
55
+        .Borders {
56
+            border: 1px solid #d7d7d7;
57
+        }
58
+        .cx {
59
+            display: block;
60
+        }
61
+    </style>
62
+</head>
63
+
64
+<body class="gray-bg">
65
+    <div class="wrapper wrapper-content animated fadeInRight">
66
+        <div class="daoHang clearfix">
67
+            <div class="dhLeft">
68
+                <sapn>
69
+                    <i class="syIcon"></i>位置:
70
+                    <a href="javaScript:;" id="ReIndex">首页</a>&gt;
71
+                    <a href="javaScript:;">业务统计</a>&gt;
72
+                    <a class="nowPosition">区县满意度统计</a>
73
+                </sapn>
74
+            </div>
75
+             <div class="dhRight">
76
+					<a href="" title="刷新"><i class="fa fa-refresh"></i></a>					
77
+				</div>
78
+        </div>
79
+
80
+        <div class="Content_box">
81
+            <!--待处理/-->
82
+            <div class="complain Shows">
83
+                <div class="th-box">
84
+                    <div class="th-bar">
85
+                        <div class="seach-box">
86
+                            <ul>
87
+                                <li>
88
+                                    	创建时间:
89
+                                    <input class="photo x-color inputs laydate-icon" type="text" id="startTimes" />-
90
+                                    <input class="photo x-color inputs laydate-icon" type="text" id="endTimes" />
91
+                                </li>
92
+                                <li>
93
+                                    <a class="sc_btn btns db" style="padding: 7px 10px;">搜索</a>
94
+                                     <a class="sc_btn btns export">导出</a>
95
+                                </li>
96
+                                <li><span class="text-danger" style="padding-left: 10px;line-height: 30px;">默认显示当前月的信息</span></li>
97
+                            </ul>
98
+                        </div>
99
+                    </div>
100
+                </div>
101
+                <div style="width: 100%;padding: 10px;">
102
+                    <table id="workorderlist" data-row-style="rowStyle" data-query-params="queryParams" data-pagination="true">
103
+                        <thead>
104
+                            <tr>
105
+                                <th data-field="deptname" data-align="center">单位名称</th>
106
+                                <th data-field="count" data-align="center">处理总量</th>
107
+                                 <th data-field="satisfiedcount" data-align="center">满意总量</th>
108
+                                <th data-field="notsatisfiedcount" data-align="center">不满意总量</th>
109
+                                  <th data-field="satisfiedrate" data-align="center">满意度</th>
110
+                            </tr>
111
+                        </thead>
112
+                    </table>
113
+                </div>
114
+            </div>
115
+
116
+        </div>
117
+    </div>
118
+   
119
+    <script>
120
+        
121
+        $(document).ready(function () {
122
+            laydate.skin('blue');
123
+            laydate({
124
+                elem: '#startTimes',
125
+                event: 'focus'
126
+            });
127
+
128
+            laydate({
129
+                elem: '#endTimes',
130
+                event: 'focus'
131
+            });
132
+            initTable();
133
+        })
134
+        function initTable() {
135
+            $.ajax({
136
+                url: huayi.config.callcenter_url + 'workorderreport/getareasatisfied',
137
+                type: 'get',
138
+                data: {
139
+                    start: $("#startTimes").val(),
140
+                    end: $("#endTimes").val(),
141
+                    token: $.cookie("token")
142
+                },
143
+                dataType: "json",
144
+                async: true,
145
+                success: function (returnValue) {
146
+                    //异步获取数据
147
+                    var resultData1 = returnValue.data.AreaSatisfiedReport;
148
+                    $('#workorderlist').bootstrapTable('load', resultData1);
149
+                }
150
+            });
151
+            $('#workorderlist').bootstrapTable('destroy').bootstrapTable({ striped: true });
152
+        }
153
+        //表格一
154
+        //function initTable() {
155
+        //    //先销毁表格
156
+        //    $('#workorderlist').bootstrapTable('destroy');
157
+        //    //初始化表格,动态从服务器加载数据
158
+        //    $("#workorderlist").bootstrapTable({
159
+        //        method: "get", //使用get请求到服务器获取数据
160
+        //        url:huayi.config.callcenter_url +"WorkOrderReport/GetDeptSatisfied",
161
+        //        contentType: "application/x-www-form-urlencoded",striped: true, //表格显示条纹
162
+        //        pagination: true, //启动分页
163
+        //        pageSize: 10, //每页显示的记录数
164
+        //        pageNumber: 1, //当前第几页
165
+        //        pageList: [10, 20, 50, 100], //记录数可选列表
166
+        //        search: false, //是否启用查询
167
+        //        showColumns: false, //显示下拉框勾选要显示的列
168
+        //        showRefresh: false, //显示刷新按钮
169
+        //        sidePagination: "server", //表示服务端请求
170
+        //        //设置为undefined可以获取pageNumber,pageSize,searchText,sortName,sortOrder
171
+        //        //设置为limit可以获取limit, offset, search, sort, order
172
+        //        queryParamsType: "undefined",
173
+        //        queryParams: function queryParams(params) { //设置查询参数
174
+        //            var param = {
175
+        //                pageIndex: params.pageNumber,
176
+        //                pageSize: params.pageSize,
177
+        //                starttime: $("#startTimes").val(),
178
+        //                endtime: $("#endTimes").val(),
179
+        //                token: $.cookie("token")
180
+        //            };
181
+        //            return param;
182
+        //        },
183
+        //        onLoadSuccess: function () { //加载成功时执行
184
+        //            //layer.msg("加载成功");
185
+        //        },
186
+        //        onLoadError: function () { //加载失败时执行
187
+        //            //layer.msg("加载数据失败", { time: 1500, icon: 2 });
188
+        //        }
189
+        //    });
190
+        //}
191
+       
192
+        //代办搜索
193
+        $(".db").click(function () {
194
+            initTable();
195
+        })
196
+ 		//导出
197
+         $('.export').click(function(){
198
+        		dcexcel(this);
199
+        })
200
+           		
201
+	   function dcexcel(obj) {
202
+        var url = huayi.config.callcenter_url + "workorderreport/getareasatisfied?token=" + $.cookie("token");
203
+        url += "&start=" + $("#startTimes").val() + "&end=" + $("#endTimes").val() + "&isExport=true";
204
+            obj.href = url;
205
+   		 }
206
+     
207
+   
208
+    </script>
209
+</body>
210
+
211
+</html>

+ 188 - 0
WebUI/CallCenterWeb.UI/js/plugins/html2pdf/FileSaver.js

@@ -0,0 +1,188 @@
1
+/* FileSaver.js
2
+ * A saveAs() FileSaver implementation.
3
+ * 1.3.2
4
+ * 2016-06-16 18:25:19
5
+ *
6
+ * By Eli Grey, http://eligrey.com
7
+ * License: MIT
8
+ *   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
9
+ */
10
+
11
+/*global self */
12
+/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
13
+
14
+/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
15
+
16
+var saveAs = saveAs || (function(view) {
17
+	"use strict";
18
+	// IE <10 is explicitly unsupported
19
+	if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
20
+		return;
21
+	}
22
+	var
23
+		  doc = view.document
24
+		  // only get URL when necessary in case Blob.js hasn't overridden it yet
25
+		, get_URL = function() {
26
+			return view.URL || view.webkitURL || view;
27
+		}
28
+		, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
29
+		, can_use_save_link = "download" in save_link
30
+		, click = function(node) {
31
+			var event = new MouseEvent("click");
32
+			node.dispatchEvent(event);
33
+		}
34
+		, is_safari = /constructor/i.test(view.HTMLElement)
35
+		, is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)
36
+		, throw_outside = function(ex) {
37
+			(view.setImmediate || view.setTimeout)(function() {
38
+				throw ex;
39
+			}, 0);
40
+		}
41
+		, force_saveable_type = "application/octet-stream"
42
+		// the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
43
+		, arbitrary_revoke_timeout = 1000 * 40 // in ms
44
+		, revoke = function(file) {
45
+			var revoker = function() {
46
+				if (typeof file === "string") { // file is an object URL
47
+					get_URL().revokeObjectURL(file);
48
+				} else { // file is a File
49
+					file.remove();
50
+				}
51
+			};
52
+			setTimeout(revoker, arbitrary_revoke_timeout);
53
+		}
54
+		, dispatch = function(filesaver, event_types, event) {
55
+			event_types = [].concat(event_types);
56
+			var i = event_types.length;
57
+			while (i--) {
58
+				var listener = filesaver["on" + event_types[i]];
59
+				if (typeof listener === "function") {
60
+					try {
61
+						listener.call(filesaver, event || filesaver);
62
+					} catch (ex) {
63
+						throw_outside(ex);
64
+					}
65
+				}
66
+			}
67
+		}
68
+		, auto_bom = function(blob) {
69
+			// prepend BOM for UTF-8 XML and text/* types (including HTML)
70
+			// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
71
+			if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
72
+				return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
73
+			}
74
+			return blob;
75
+		}
76
+		, FileSaver = function(blob, name, no_auto_bom) {
77
+			if (!no_auto_bom) {
78
+				blob = auto_bom(blob);
79
+			}
80
+			// First try a.download, then web filesystem, then object URLs
81
+			var
82
+				  filesaver = this
83
+				, type = blob.type
84
+				, force = type === force_saveable_type
85
+				, object_url
86
+				, dispatch_all = function() {
87
+					dispatch(filesaver, "writestart progress write writeend".split(" "));
88
+				}
89
+				// on any filesys errors revert to saving with object URLs
90
+				, fs_error = function() {
91
+					if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
92
+						// Safari doesn't allow downloading of blob urls
93
+						var reader = new FileReader();
94
+						reader.onloadend = function() {
95
+							var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
96
+							var popup = view.open(url, '_blank');
97
+							if(!popup) view.location.href = url;
98
+							url=undefined; // release reference before dispatching
99
+							filesaver.readyState = filesaver.DONE;
100
+							dispatch_all();
101
+						};
102
+						reader.readAsDataURL(blob);
103
+						filesaver.readyState = filesaver.INIT;
104
+						return;
105
+					}
106
+					// don't create more object URLs than needed
107
+					if (!object_url) {
108
+						object_url = get_URL().createObjectURL(blob);
109
+					}
110
+					if (force) {
111
+						view.location.href = object_url;
112
+					} else {
113
+						var opened = view.open(object_url, "_blank");
114
+						if (!opened) {
115
+							// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
116
+							view.location.href = object_url;
117
+						}
118
+					}
119
+					filesaver.readyState = filesaver.DONE;
120
+					dispatch_all();
121
+					revoke(object_url);
122
+				}
123
+			;
124
+			filesaver.readyState = filesaver.INIT;
125
+
126
+			if (can_use_save_link) {
127
+				object_url = get_URL().createObjectURL(blob);
128
+				setTimeout(function() {
129
+					save_link.href = object_url;
130
+					save_link.download = name;
131
+					click(save_link);
132
+					dispatch_all();
133
+					revoke(object_url);
134
+					filesaver.readyState = filesaver.DONE;
135
+				});
136
+				return;
137
+			}
138
+
139
+			fs_error();
140
+		}
141
+		, FS_proto = FileSaver.prototype
142
+		, saveAs = function(blob, name, no_auto_bom) {
143
+			return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
144
+		}
145
+	;
146
+	// IE 10+ (native saveAs)
147
+	if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
148
+		return function(blob, name, no_auto_bom) {
149
+			name = name || blob.name || "download";
150
+
151
+			if (!no_auto_bom) {
152
+				blob = auto_bom(blob);
153
+			}
154
+			return navigator.msSaveOrOpenBlob(blob, name);
155
+		};
156
+	}
157
+
158
+	FS_proto.abort = function(){};
159
+	FS_proto.readyState = FS_proto.INIT = 0;
160
+	FS_proto.WRITING = 1;
161
+	FS_proto.DONE = 2;
162
+
163
+	FS_proto.error =
164
+	FS_proto.onwritestart =
165
+	FS_proto.onprogress =
166
+	FS_proto.onwrite =
167
+	FS_proto.onabort =
168
+	FS_proto.onerror =
169
+	FS_proto.onwriteend =
170
+		null;
171
+
172
+	return saveAs;
173
+}(
174
+	   typeof self !== "undefined" && self
175
+	|| typeof window !== "undefined" && window
176
+	|| this.content
177
+));
178
+// `self` is undefined in Firefox for Android content script context
179
+// while `this` is nsIContentFrameMessageManager
180
+// with an attribute `content` that corresponds to the window
181
+
182
+if (typeof module !== "undefined" && module.exports) {
183
+  module.exports.saveAs = saveAs;
184
+} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) {
185
+  define([], function() {
186
+    return saveAs;
187
+  });
188
+}

+ 84 - 0
WebUI/CallCenterWeb.UI/js/plugins/html2pdf/jquery.wordexport.js

@@ -0,0 +1,84 @@
1
+if (typeof jQuery !== "undefined" && typeof saveAs !== "undefined") {
2
+    (function($) {
3
+        $.fn.wordExport = function(fileName) {
4
+            fileName = typeof fileName !== 'undefined' ? fileName : "工单详情";
5
+            var static = {
6
+                mhtml: {
7
+                   	top: "Mime-Version: 1.0\nContent-Base: " + location.href + "\nContent-Type: Multipart/related; boundary=\"NEXT.ITEM-BOUNDARY\";type=\"text/html\"\n\n--NEXT.ITEM-BOUNDARY\nContent-Type: text/html; charset=\"utf-8\"\nContent-Location: " + location.href + "\n\n<!DOCTYPE html>\n<html>\n_html_</html>",
8
+                    head: "<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n<style>\n_styles_\n</style>\n</head>\n",
9
+                    body: "<body>_body_</body>"
10
+                }
11
+            };
12
+            var options = {
13
+                maxWidth: 624
14
+            };
15
+            // Clone selected element before manipulating it
16
+            var markup = $(this).clone();
17
+
18
+            // Remove hidden elements from the output
19
+            markup.each(function() {
20
+                var self = $(this);
21
+                if (self.is(':hidden'))
22
+                    self.remove();
23
+            });
24
+
25
+            // Embed all images using Data URLs
26
+            var images = Array();
27
+            var img = markup.find('img');
28
+            for (var i = 0; i < img.length; i++) {
29
+                // Calculate dimensions of output image
30
+                var w = Math.min(img[i].width, options.maxWidth);
31
+                var h = img[i].height * (w / img[i].width);
32
+                // Create canvas for converting image to data URL
33
+                var canvas = document.createElement("CANVAS");
34
+                canvas.width = w;
35
+                canvas.height = h;
36
+                // Draw image to canvas
37
+                var context = canvas.getContext('2d');
38
+                context.drawImage(img[i], 0, 0, w, h);
39
+                // Get data URL encoding of image
40
+                var uri = canvas.toDataURL("image/png");
41
+                $(img[i]).attr("src", img[i].src);
42
+                img[i].width = w;
43
+                img[i].height = h;
44
+                // Save encoded image to array
45
+                images[i] = {
46
+                    type: uri.substring(uri.indexOf(":") + 1, uri.indexOf(";")),
47
+                    encoding: uri.substring(uri.indexOf(";") + 1, uri.indexOf(",")),
48
+                    location: $(img[i]).attr("src"),
49
+                    data: uri.substring(uri.indexOf(",") + 1)
50
+                };
51
+            }
52
+
53
+            // Prepare bottom of mhtml file with image data
54
+            var mhtmlBottom = "\n";
55
+            for (var i = 0; i < images.length; i++) {
56
+                mhtmlBottom += "--NEXT.ITEM-BOUNDARY\n";
57
+                mhtmlBottom += "Content-Location: " + images[i].location + "\n";
58
+                mhtmlBottom += "Content-Type: " + images[i].type + "\n";
59
+                mhtmlBottom += "Content-Transfer-Encoding: " + images[i].encoding + "\n\n";
60
+                mhtmlBottom += images[i].data + "\n\n";
61
+            }
62
+            mhtmlBottom += "--NEXT.ITEM-BOUNDARY--";
63
+
64
+            //TODO: load css from included stylesheet
65
+            var styles = "";
66
+
67
+            // Aggregate parts of the file together
68
+            var fileContent = static.mhtml.top.replace("_html_", static.mhtml.head.replace("_styles_", styles) + static.mhtml.body.replace("_body_", markup.html())) + mhtmlBottom;
69
+
70
+            // Create a Blob with the file contents
71
+            var blob = new Blob([fileContent], {
72
+                type: "application/msword;charset=utf-8"
73
+            });
74
+            saveAs(blob, fileName + ".doc");
75
+        };
76
+    })(jQuery);
77
+} else {
78
+    if (typeof jQuery === "undefined") {
79
+        console.error("jQuery Word Export: missing dependency (jQuery)");
80
+    }
81
+    if (typeof saveAs === "undefined") {
82
+        console.error("jQuery Word Export: missing dependency (FileSaver.js)");
83
+    }
84
+}