Browse Source
2.header 新增判斷是否從藍凌過來的判斷方法 3.wms登入判斷強制改為大寫 4.大日程select優化 5.生管(業務)從M0024 改為 M0079 6.新增 BPM API 到 BPM測試檔案 7.首頁通知顯示bug修正 8.戰情室分布圖 工地 連接資料庫檔案修正及程式排版gary
18 changed files with 1331 additions and 499 deletions
@ -0,0 +1,637 @@ |
|||||
|
<html> |
||||
|
<!doctype html> |
||||
|
<html> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
|
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width"> |
||||
|
<title>電梯地圖</title> |
||||
|
<link rel="stylesheet" href="map.css" /> |
||||
|
<link rel="stylesheet" href="style.css" /> |
||||
|
<link rel="stylesheet" href="jsgrid.css"> |
||||
|
<link rel="stylesheet" href="jsgrid-theme.css"> |
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
<div id="map" style="height: 100%"></div> |
||||
|
|
||||
|
<!-- Jquery --> |
||||
|
<script src="js/lib/jquery-3.4.1.min.js"></script> |
||||
|
<!-- Bootstrap--> |
||||
|
<script src="js/lib/popper.min.js"></script> |
||||
|
<script src="js/lib/bootstrap.min.js"></script> |
||||
|
<script src="../da/chart.js/Chart.js"></script> |
||||
|
<script src="js/jsgrid.js"></script> |
||||
|
<script> |
||||
|
// This example displays a marker at the center of Australia. |
||||
|
// When the user clicks the marker, an info window opens. |
||||
|
const urll = location.href; |
||||
|
const wurl = urll.split('phb')[0]; |
||||
|
function initMap() { |
||||
|
var pointURL = wurl + 'phb/map/point.php'; |
||||
|
// var pointURL = wurl + 'phbbackup/map/point.php'; |
||||
|
var points = []; |
||||
|
var currentInfoWindow = null; |
||||
|
$.ajax({ |
||||
|
type: "GET", |
||||
|
url: pointURL, |
||||
|
success: function (msg) { |
||||
|
var result = eval("(" + msg + ")"); |
||||
|
if (result.length > 0) { |
||||
|
for (i = 0; i < result.length; i++) { |
||||
|
var obj = {}; |
||||
|
var longitude = Number(result[i]['longitude']); |
||||
|
var latitude = Number(result[i]['latitude']); |
||||
|
var custormname = result[i]['name']; |
||||
|
obj['lat'] = latitude; |
||||
|
obj['lng'] = longitude; |
||||
|
|
||||
|
var icon = { |
||||
|
url: 'icon/lift.png', |
||||
|
//scaledSize: new google.maps.Size(52, 50), // scaled size |
||||
|
scaledSize: new google.maps.Size(32.4, 31.2), // scaled size |
||||
|
origin: new google.maps.Point(0, 0), // origin |
||||
|
anchor: new google.maps.Point(0, 0) // anchor |
||||
|
}; |
||||
|
const marker = new google.maps.Marker({ |
||||
|
position: obj, |
||||
|
map, |
||||
|
title: custormname, |
||||
|
icon: icon |
||||
|
}); |
||||
|
|
||||
|
const contentString = |
||||
|
'<div class="container">' + |
||||
|
'<div class="row">' + |
||||
|
'<div class="col-md-12">' + |
||||
|
'<div id="choosecontent" style="height: 430px;width: 500px">' + |
||||
|
|
||||
|
'</div>' + |
||||
|
'</div>' + |
||||
|
"</div>" + |
||||
|
"</div>"; |
||||
|
const infowindow = new google.maps.InfoWindow({ |
||||
|
content: contentString |
||||
|
}); |
||||
|
|
||||
|
clickMarker(marker, latitude, infowindow); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
|
||||
|
function clickMarker(marker, latitude, infowindow) { |
||||
|
marker.addListener("click", (e) => { |
||||
|
if (currentInfoWindow != null) { |
||||
|
currentInfoWindow.close(); |
||||
|
} |
||||
|
infowindow.open({ |
||||
|
anchor: marker, |
||||
|
map, |
||||
|
shouldFocus: false, |
||||
|
}); |
||||
|
currentInfoWindow = infowindow; |
||||
|
var chooselat = e.latLng.lat(); |
||||
|
var accountURL = wurl + 'phb/map/account.php?latitude=' + chooselat; |
||||
|
$.ajax({ |
||||
|
type: "GET", |
||||
|
url: accountURL, |
||||
|
success: function (msg) { |
||||
|
var result = eval("(" + msg + ")"); |
||||
|
console.log(result); |
||||
|
var htmltai = ''; |
||||
|
if (result.length > 0) { |
||||
|
for (i = 0; i < result.length; i++) { |
||||
|
var name = result[i]['name']; |
||||
|
var tel = result[i]['tel']; |
||||
|
var address = result[i]['address']; |
||||
|
var repairername = result[i]['repairername']; |
||||
|
var repairertel = result[i]['repairertel']; |
||||
|
var customerid = result[i]['customerid']; |
||||
|
|
||||
|
htmltai += |
||||
|
'<div class="card card-primary card-outline mt-05">' + |
||||
|
'<div class="card-body box-profile">' + |
||||
|
'<h2 class="profile-username text-center">' + name + '</h2>' + |
||||
|
'<p class="lead text-center"><a href="tel:' + tel + '">' + tel + '</a></p>' + |
||||
|
'<p class="lead text-center">' + address + '</p>' + |
||||
|
'<ul class="list-group list-group-unbordered mb-3 lead">' + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>保養員</b> <a class="float-right">' + repairername + '</a>' + |
||||
|
'</li>' + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>保養員聯繫電話</b> <a class="float-right" href="tel:' + repairertel + '" >' + repairertel + '</a> ' + |
||||
|
'</li>' + |
||||
|
'</ul>' + |
||||
|
'<p class="lead text-center"><a href="#" onclick=jibnen("' + customerid + '","' + chooselat + '")>查看電梯</a></p>' |
||||
|
'</div>' + |
||||
|
'</div>'; |
||||
|
} |
||||
|
$('#choosecontent').empty().append(htmltai); |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
//const uluru = { lat:24.9966186 , lng: 121.1594333 }; |
||||
|
//const uluru = { lat:23.974003045820343 , lng: 120.97981583669126 }; |
||||
|
const uluru = { lat: 23.633310942708295, lng: 120.77153763992857 }; |
||||
|
const map = new google.maps.Map(document.getElementById("map"), { |
||||
|
zoom: 8, |
||||
|
center: uluru, |
||||
|
// disableDefaultUI: true, |
||||
|
}); |
||||
|
|
||||
|
const eledata2 = document.createElement("div"); |
||||
|
eledata2.className = 'gm-style-mtc'; |
||||
|
eledata2.style.cssText = "float: left; position: relative;"; |
||||
|
eledata2.innerHTML = "新竹以南、台南以北建置中。"; |
||||
|
eledata2.style.cssText = "background: none padding-box rgb(255, 255, 255);border: 0px; margin-left: 10px;text-transform: none; -webkit-appearance: none; position: relative; cursor: pointer; user-select: none; direction: ltr; overflow: hidden; text-align: center; height: 24px;width:200px; vertical-align: middle; color: rgb(0, 0, 0); font-family: Roboto, Arial, sans-serif; font-size: 15px; border-bottom-left-radius: 2px; border-top-left-radius: 2px; -webkit-background-clip: padding-box; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; min-width: 36px; font-weight: 500;"; |
||||
|
|
||||
|
const eledata = document.createElement("div"); |
||||
|
eledata.className = 'gm-style-mtc'; |
||||
|
eledata.style.cssText = "float: left; position: relative;"; |
||||
|
const fenbutu = document.createElement("button"); |
||||
|
fenbutu.textContent = "分佈圖"; |
||||
|
fenbutu.style.cssText = "background: none padding-box rgb(255, 255, 255);border: 0px; margin-left: 10px;text-transform: none; -webkit-appearance: none; position: relative; user-select: none; direction: ltr; overflow: hidden; text-align: center; height: 40px;width:70px; vertical-align: middle; color: rgb(0, 0, 0); font-family: Roboto, Arial, sans-serif; font-size: 18px; border-bottom-left-radius: 2px; border-top-left-radius: 2px; -webkit-background-clip: padding-box; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; min-width: 36px; font-weight: 500;"; |
||||
|
eledata.appendChild(fenbutu); |
||||
|
|
||||
|
const eledata1 = document.createElement("div"); |
||||
|
eledata1.className = 'gm-style-mtc xia'; |
||||
|
eledata1.style.cssText = "width:100px;margin-left: 10px;margin-top: 5px; display:none"; |
||||
|
eledata.appendChild(eledata1); |
||||
|
|
||||
|
const dainti = document.createElement("button"); |
||||
|
dainti.textContent = "電梯"; |
||||
|
dainti.style.cssText = "background: none padding-box rgb(255, 255, 255); border: 0px; margin-top: 2px;text-transform: none; -webkit-appearance: none; position: relative; cursor: pointer; user-select: none; direction: ltr; overflow: hidden; text-align: center; height: 40px;width:70px; vertical-align: middle; color: rgb(0, 0, 0); font-family: Roboto, Arial, sans-serif; font-size: 18px; border-bottom-left-radius: 2px; border-top-left-radius: 2px; -webkit-background-clip: padding-box; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; min-width: 36px; font-weight: 500;"; |
||||
|
|
||||
|
const baoyangyuan = document.createElement("button"); |
||||
|
baoyangyuan.textContent = "保養員"; |
||||
|
baoyangyuan.style.cssText = "background: none padding-box rgb(255, 255, 255);border: 0px;margin-top: 2px; text-transform: none; -webkit-appearance: none; position: relative; cursor: pointer; user-select: none; direction: ltr; overflow: hidden; text-align: center; height: 40px;width:70px; vertical-align: middle; color: rgb(0, 0, 0); font-family: Roboto, Arial, sans-serif; font-size: 18px; border-bottom-left-radius: 2px; border-top-left-radius: 2px; -webkit-background-clip: padding-box; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; min-width: 36px; font-weight: 500;"; |
||||
|
const gongchang = document.createElement("button"); |
||||
|
gongchang.textContent = "工廠"; |
||||
|
gongchang.style.cssText = "background: none padding-box rgb(255, 255, 255); border: 0px; margin-top: 2px;text-transform: none; -webkit-appearance: none; position: relative; cursor: pointer; user-select: none; direction: ltr; overflow: hidden; text-align: center; height: 40px;width:70px; vertical-align: middle; color: rgb(0, 0, 0); font-family: Roboto, Arial, sans-serif; font-size: 18px; border-bottom-left-radius: 2px; border-top-left-radius: 2px; -webkit-background-clip: padding-box; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; min-width: 36px; font-weight: 500;"; |
||||
|
|
||||
|
const gongdi = document.createElement("button"); |
||||
|
gongdi.textContent = "工地"; |
||||
|
gongdi.style.cssText = "background: none padding-box rgb(255, 255, 255); border: 0px; margin-top: 2px;text-transform: none; -webkit-appearance: none; position: relative; cursor: pointer; user-select: none; direction: ltr; overflow: hidden; text-align: center; height: 40px;width:70px; vertical-align: middle; color: rgb(0, 0, 0); font-family: Roboto, Arial, sans-serif; font-size: 18px; border-bottom-left-radius: 2px; border-top-left-radius: 2px; -webkit-background-clip: padding-box; box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px -1px; min-width: 36px; font-weight: 500;"; |
||||
|
|
||||
|
|
||||
|
eledata1.appendChild(dainti); |
||||
|
eledata1.appendChild(baoyangyuan); |
||||
|
eledata1.appendChild(gongchang); |
||||
|
eledata1.appendChild(gongdi); |
||||
|
map.controls[google.maps.ControlPosition.LEFT_TOP].push(eledata); |
||||
|
map.controls[google.maps.ControlPosition.LEFT_BOTTOM].push(eledata2); |
||||
|
|
||||
|
fenbutu.onmouseover = (() => { |
||||
|
eledata1.style.display = "block"; |
||||
|
}) |
||||
|
eledata1.onmouseleave = (() => { |
||||
|
eledata1.style.display = "none"; |
||||
|
}) |
||||
|
dainti.addEventListener('click', () => { |
||||
|
window.location.href = "tw.html"; |
||||
|
}); |
||||
|
baoyangyuan.addEventListener('click', () => { |
||||
|
window.location.href = "person.html"; |
||||
|
}); |
||||
|
gongchang.addEventListener('click', () => { |
||||
|
window.location.href = "factory.html"; |
||||
|
}); |
||||
|
gongdi.addEventListener('click', () => { |
||||
|
window.location.href = "worksite.html"; |
||||
|
}); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
window.initMap = initMap; |
||||
|
|
||||
|
function kehu(chooselng) { |
||||
|
|
||||
|
var accountURL = wurl + 'phb/map/account.php?latitude=' + chooselng; |
||||
|
$.ajax({ |
||||
|
type: "GET", |
||||
|
url: accountURL, |
||||
|
success: function (msg) { |
||||
|
var result = eval("(" + msg + ")"); |
||||
|
console.log(result); |
||||
|
var htmltai = ''; |
||||
|
if (result.length > 0) { |
||||
|
for (i = 0; i < result.length; i++) { |
||||
|
var name = result[i]['name']; |
||||
|
var tel = result[i]['tel']; |
||||
|
var address = result[i]['address']; |
||||
|
var repairername = result[i]['repairername']; |
||||
|
var repairertel = result[i]['repairertel']; |
||||
|
var customerid = result[i]['customerid']; |
||||
|
|
||||
|
htmltai += |
||||
|
'<div class="card card-primary card-outline mt-05">' + |
||||
|
'<div class="card-body box-profile">' + |
||||
|
'<h3 class="profile-username text-center">' + name + '</h3>' + |
||||
|
'<p class="text-muted text-center"><a href="tel:' + tel + '">' + tel + '</a</p>' + |
||||
|
'<p class="text-muted text-center">' + address + ' <a href="#" onclick=jibnen("' + customerid + '","' + chooselng + '")>查看作番</a></p>' + |
||||
|
'<ul class="list-group list-group-unbordered mb-3">' + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>保養員</b> <a class="float-right">' + repairername + '</a>' + |
||||
|
'</li>' + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>保養員聯繫電話</b> <a class="float-right" href="tel:' + repairertel + '" >' + repairertel + '</a> ' + |
||||
|
'</li>' + |
||||
|
'</ul>' + |
||||
|
'</div>' + |
||||
|
'</div>'; |
||||
|
} |
||||
|
$('#choosecontent').empty().append(htmltai); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
} |
||||
|
function jibnen(customerid, chooselng) { |
||||
|
var facilityURL = wurl + 'phb/map/facility.php?customerid=' + customerid; |
||||
|
$.ajax({ |
||||
|
type: "GET", |
||||
|
url: facilityURL, |
||||
|
success: function (msg) { |
||||
|
var result = eval("(" + msg + ")"); |
||||
|
console.log(result); |
||||
|
var htmlfacility = ''; |
||||
|
htmlfacility = '<div class="card card-primary card-outline">' + |
||||
|
' <div class="appHeader bg-primary text-light">' + |
||||
|
' <div class="left">' + |
||||
|
' <a href="#" onclick=kehu("' + chooselng + '") class="headerButton">' + |
||||
|
' <ion-icon name="chevron-back-outline"></ion-icon>' + |
||||
|
' </a>' + |
||||
|
' </div>' + |
||||
|
' <div class="pageTitle">電梯</div>' + |
||||
|
' </div>' + |
||||
|
'<div class="card-body box-profile" id="facility">' + |
||||
|
|
||||
|
'</div>' + |
||||
|
'</div>'; |
||||
|
|
||||
|
|
||||
|
if (result[0].length > 0) { |
||||
|
var htmlds = ''; |
||||
|
// next month |
||||
|
const date = new Date(); |
||||
|
const ndate = new Date(date.setMonth(date.getMonth() + 1)); |
||||
|
let nextDay = String(ndate.getDate()).padStart(2, '0'); |
||||
|
let nextMonth = String(ndate.getMonth() + 1).padStart(2, "0"); |
||||
|
let nextYear = ndate.getFullYear(); |
||||
|
//let nextDate = `${nextYear}-${nextMonth}-${nextDay}`; |
||||
|
let nextDate = `${nextYear}-${nextMonth}-15`; |
||||
|
|
||||
|
for (i = 0; i < result[0].length; i++) { |
||||
|
var facilityno = result[0][i]['facilityno']; |
||||
|
var address = result[0][i]['address']; |
||||
|
var speed = result[0][i]['speed']; |
||||
|
var numberoffloor = result[0][i]['numberoffloor']; |
||||
|
var numberofstop = (result[0][i]['numberofstop'] == 1) ? "2" : result[0][i]['numberofstop']; // 預設2停 |
||||
|
var actualdate = (result[1][facilityno]) ? result[1][facilityno]['actualdate'] : "預計 " + nextDate; |
||||
|
var sid = (result[1][facilityno]) ? result[1][facilityno]['id'] : "0"; |
||||
|
var schedule_detail = ""; |
||||
|
|
||||
|
// 補丁 actualdate = 展示太久沒更新保養日期做假資料 |
||||
|
actualdate = fakeActualdate(actualdate); |
||||
|
|
||||
|
if (sid > 0) { |
||||
|
schedule_detail += '<li class="list-group-item"><b>保養明細</b> '; |
||||
|
schedule_detail += '<a href="/app/app-maintenance-uploadsuccess-survey.php?id_schedule=' + sid + '&view=Y&actualdate=' + actualdate + '" class="float-right" target="_self">連結</a>'; |
||||
|
schedule_detail += '</li>'; |
||||
|
} |
||||
|
var ckmore = ""; |
||||
|
if (sid > 0) { |
||||
|
ckmore = '<a href="/app/app-maintenance-uploadsuccess-photo-review_v2.php?id_schedule=' + sid + '" target="_self" title="瀏覽保養照片"><img src="icon/camera.png" width="25" style="vertical-align:middle;"></a>'; |
||||
|
} |
||||
|
var baditems = (result[1][facilityno]) ? result[1][facilityno]['baditems'] : ""; |
||||
|
var sresult = ""; |
||||
|
if (baditems) { |
||||
|
if (result[1][facilityno]['item_detail']) { |
||||
|
sresult += '<br><a class="float-left" style="margin-top:6px;">' + baditems + '<br>' + result[1][facilityno]['item_detail'] + '</a>'; |
||||
|
} else { |
||||
|
sresult += '<a class="float-right">' + baditems + '</a>'; |
||||
|
} |
||||
|
} else { |
||||
|
sresult += '<a class="float-right">新梯待保養</a>'; |
||||
|
} |
||||
|
var fault_message = ''; |
||||
|
if (result[2][facilityno]) { |
||||
|
for (j = 0; j < result[2][facilityno].length; j++) { |
||||
|
fault_message += result[2][facilityno][j] + '<br>'; |
||||
|
} |
||||
|
} else fault_message = '狀態正常'; |
||||
|
htmlds += |
||||
|
'<ul class="list-group list-group-unbordered mb-3 lead">' + |
||||
|
'<li class="list-group-item list-group-item-secondary">' + |
||||
|
'<b>電梯ID</b> <a class="float-right">' + facilityno + '</a>' + |
||||
|
'</li>' + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>速度</b> <a class="float-right">' + speed + 'm/min</a>' + |
||||
|
'</li>' + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>樓層</b> <a class="float-right">' + numberoffloor + '樓</a>' + |
||||
|
'</li>' + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>樓停</b> <a class="float-right">' + numberofstop + '停</a>' + |
||||
|
'</li>' + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>地址</b> <a class="float-right">' + address + '</a>' + |
||||
|
'</li>' + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>最近一次保養日期</b> <a class="float-right">' + actualdate + '</a>' + |
||||
|
'</li>' + |
||||
|
schedule_detail + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>保養結果</b> ' + ckmore + sresult + |
||||
|
'</li>' + |
||||
|
'<li class="list-group-item">' + |
||||
|
'<b>故障訊息</b> <a class="float-right">' + fault_message + '</a>' + |
||||
|
//'<br><a class="float-right">' + item_detail + '</a>' + |
||||
|
'</li>' + |
||||
|
'</ul>'; |
||||
|
/* |
||||
|
'<li class="list-group-item">' + |
||||
|
'<a href="#" onclick=jishi("'+facilityno+'","'+customerid+'") class="btn btn-primary width40"><b>及時狀態</b></a>'+ |
||||
|
'<a href="#" onclick=guzhang("'+facilityno+'","'+customerid+'") class="btn btn-primary width40"><b>故障内容</b></a>'+ |
||||
|
'</li>' + |
||||
|
*/ |
||||
|
} |
||||
|
$('#choosecontent').empty().append(htmlfacility); |
||||
|
$('#facility').append(htmlds); |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
|
||||
|
} |
||||
|
// 及時狀態 |
||||
|
function jishi(facilityno, customerid) { |
||||
|
|
||||
|
var htmlds = ""; |
||||
|
var facilitystatusURL = wurl + 'phb/map/facility_status.php?facilityno=' + facilityno; |
||||
|
$.ajax({ |
||||
|
type: "GET", |
||||
|
url: facilitystatusURL, |
||||
|
success: function (msg) { |
||||
|
var result = eval("(" + msg + ")"); |
||||
|
console.log(result); |
||||
|
console.log(result['labels']); |
||||
|
|
||||
|
htmlds = '<div>' + |
||||
|
' <div class="appHeader bg-primary text-light">' + |
||||
|
' <div class="left">' + |
||||
|
' <a href="#" onclick=jibnen("' + customerid + '") class="headerButton">' + |
||||
|
' <ion-icon name="chevron-back-outline"></ion-icon>' + |
||||
|
' </a>' + |
||||
|
' </div>' + |
||||
|
' <div class="pageTitle">及時狀態</div>' + |
||||
|
' </div>' + |
||||
|
'<div class="chart">' + |
||||
|
'<canvas id="lineChart" height="200"></canvas>' + |
||||
|
'</div></div>'; |
||||
|
$('#choosecontent').empty().append(htmlds); |
||||
|
|
||||
|
|
||||
|
//折线图 |
||||
|
var lineChartCanvas = $('#lineChart') |
||||
|
let linedata = { |
||||
|
"labels": result['labels'], |
||||
|
"datasets": [{ |
||||
|
"label": "走行時間", |
||||
|
"data": result['walking_hours'], |
||||
|
"fill": false, |
||||
|
"borderColor": "rgb(75, 192, 192)", |
||||
|
"lineTension": 0.1 |
||||
|
}, { |
||||
|
"label": "走行次數", |
||||
|
"data": result['walking_times'], |
||||
|
"fill": false, |
||||
|
"borderColor": "rgb(192,75,126)", |
||||
|
"lineTension": 0.1 |
||||
|
}] |
||||
|
}; |
||||
|
const optsLineChart = { |
||||
|
scales: { |
||||
|
x: { |
||||
|
time: false, |
||||
|
}, |
||||
|
y: { |
||||
|
range: [0, 100], |
||||
|
}, |
||||
|
}, |
||||
|
series: [ |
||||
|
{}, |
||||
|
{ |
||||
|
fill: 'transparent', |
||||
|
width: 5, |
||||
|
stroke: 'rgba(60,141,188,1)', |
||||
|
}, |
||||
|
{ |
||||
|
stroke: '#c1c7d1', |
||||
|
width: 5, |
||||
|
fill: 'transparent', |
||||
|
}, |
||||
|
], |
||||
|
hover: { |
||||
|
animationDuration: 0 // 防止鼠标移上去,数字闪烁 |
||||
|
}, |
||||
|
animation: { // 这部分是数值显示的功能实现 |
||||
|
onComplete: function () { |
||||
|
var chartInstance = this.chart, |
||||
|
ctx = chartInstance.ctx; |
||||
|
// 以下属于canvas的属性(font、fillStyle、textAlign...) |
||||
|
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, Chart.defaults.global.defaultFontStyle, Chart.defaults.global.defaultFontFamily); |
||||
|
ctx.fillStyle = "black"; |
||||
|
ctx.textAlign = 'center'; |
||||
|
ctx.textBaseline = 'bottom'; |
||||
|
this.data.datasets.forEach(function (dataset, i) { |
||||
|
var meta = chartInstance.controller.getDatasetMeta(i); |
||||
|
meta.data.forEach(function (bar, index) { |
||||
|
var data = dataset.data[index]; |
||||
|
ctx.fillText(data, bar._model.x, bar._model.y - 5); |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
new Chart(lineChartCanvas, { |
||||
|
type: 'line', |
||||
|
data: linedata, |
||||
|
options: optsLineChart |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
} |
||||
|
// 故障內容 |
||||
|
function guzhang(facilityno, customerid) { |
||||
|
|
||||
|
var htmlds = ''; |
||||
|
var facilitybreakdownURL = wurl + 'phb/map/facility_breakdown.php?facilityno=' + facilityno; |
||||
|
$.ajax({ |
||||
|
type: "GET", |
||||
|
url: facilitybreakdownURL, |
||||
|
success: function (msg) { |
||||
|
var result = eval("(" + msg + ")"); |
||||
|
console.log(result); |
||||
|
|
||||
|
htmlds = '<div>' + |
||||
|
' <div class="appHeader bg-primary text-light">' + |
||||
|
' <div class="left">' + |
||||
|
' <a href="#" onclick=jibnen("' + customerid + '") class="headerButton">' + |
||||
|
' <ion-icon name="chevron-back-outline"></ion-icon>' + |
||||
|
' </a>' + |
||||
|
' </div>' + |
||||
|
' <div class="pageTitle">故障內容</div>' + |
||||
|
' </div>' + |
||||
|
'<div class="chart">' + |
||||
|
'<canvas id="guzhangchart" height="100" ></canvas>' + |
||||
|
'</div></div>'; |
||||
|
htmlds += '<div style="width: 100%;height:200px;overflow: scroll">' + |
||||
|
'<div id="jsGrid1" style="height: 300px;font-size: 12px"></div>' + |
||||
|
'</div>' |
||||
|
$('#choosecontent').empty().append(htmlds); |
||||
|
|
||||
|
//折线图 |
||||
|
var guzhangchartCanvas = $('#guzhangchart') |
||||
|
let guzhanglinedata = { |
||||
|
"labels": result['labels'], |
||||
|
"datasets": [{ |
||||
|
"label": "故障內容", |
||||
|
"data": result['data'], |
||||
|
"fill": true, |
||||
|
"borderColor": "rgb(75, 192, 192)", |
||||
|
"lineTension": 1 |
||||
|
}] |
||||
|
}; |
||||
|
const optsguzhangLineChart = { |
||||
|
scales: { |
||||
|
x: { |
||||
|
time: false, |
||||
|
}, |
||||
|
y: { |
||||
|
range: [0, 100], |
||||
|
}, |
||||
|
}, |
||||
|
series: [ |
||||
|
{}, |
||||
|
{ |
||||
|
fill: 'transparent', |
||||
|
width: 5, |
||||
|
stroke: 'rgba(60,141,188,1)', |
||||
|
}, |
||||
|
{ |
||||
|
stroke: '#c1c7d1', |
||||
|
width: 5, |
||||
|
fill: 'transparent', |
||||
|
}, |
||||
|
], |
||||
|
hover: { |
||||
|
animationDuration: 0 // 防止鼠标移上去,数字闪烁 |
||||
|
}, |
||||
|
animation: { // 这部分是数值显示的功能实现 |
||||
|
onComplete: function () { |
||||
|
var chartInstance = this.chart, |
||||
|
ctx = chartInstance.ctx; |
||||
|
// 以下属于canvas的属性(font、fillStyle、textAlign...) |
||||
|
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, Chart.defaults.global.defaultFontStyle, Chart.defaults.global.defaultFontFamily); |
||||
|
ctx.fillStyle = "black"; |
||||
|
ctx.textAlign = 'center'; |
||||
|
ctx.textBaseline = 'bottom'; |
||||
|
this.data.datasets.forEach(function (dataset, i) { |
||||
|
var meta = chartInstance.controller.getDatasetMeta(i); |
||||
|
meta.data.forEach(function (bar, index) { |
||||
|
var data = dataset.data[index]; |
||||
|
ctx.fillText(data, bar._model.x, bar._model.y - 5); |
||||
|
}); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
new Chart(guzhangchartCanvas, { |
||||
|
type: 'line', |
||||
|
data: guzhanglinedata, |
||||
|
options: optsguzhangLineChart |
||||
|
}); |
||||
|
//数据表 |
||||
|
|
||||
|
$("#jsGrid1").jsGrid({ |
||||
|
height: "300px", |
||||
|
width: "100%", |
||||
|
sorting: true, |
||||
|
paging: false, |
||||
|
data: result['tables'], |
||||
|
fields: [ |
||||
|
{ name: "id", title: "項次", type: "text", }, |
||||
|
{ name: "facilityno", title: "電梯編號", type: "text", }, |
||||
|
{ name: "identifying_code", title: "識別碼", type: "text", }, |
||||
|
{ name: "breakdown_code", title: "故障代碼", type: "text", }, |
||||
|
{ name: "breakdown_content", title: "故障内容", type: "text", }, |
||||
|
{ name: "breakdown_date", title: "故障时间", type: "text", }, |
||||
|
] |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
// 補丁 actualdate = 展示太久沒更新保養日期做假資料 |
||||
|
function fakeActualdate(actualdate) { |
||||
|
|
||||
|
if (actualdate.substring(0, 2) == '預計') { |
||||
|
return actualdate; |
||||
|
} |
||||
|
|
||||
|
const today = new Date(); |
||||
|
const currentYear = today.getFullYear(); |
||||
|
const currentMonth = today.getMonth() - 1; |
||||
|
|
||||
|
let datetimeArr = actualdate.split(' '); |
||||
|
let dateArr = datetimeArr[0].split('-'); |
||||
|
let timeArr = datetimeArr[1].split(':'); |
||||
|
let year = parseInt(dateArr[0]); |
||||
|
let month = parseInt(dateArr[1]); |
||||
|
let day = parseInt(dateArr[2]); |
||||
|
let hour = parseInt(timeArr[0]); |
||||
|
let minute = parseInt(timeArr[1]); |
||||
|
let second = parseInt(timeArr[2]); |
||||
|
if (day > 30) { |
||||
|
day = day - 1; |
||||
|
} |
||||
|
|
||||
|
// return "2020-01-01 00:00:00"; |
||||
|
if (year <= currentYear && month <= currentMonth) { |
||||
|
return year + '-' + (currentMonth + 1) + '-' + day + ' ' + hour + ':' + minute + ':' + second; |
||||
|
} else { |
||||
|
return actualdate; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
</script> |
||||
|
|
||||
|
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDCJp-JIcYIyeR_QNpREvsepApvVytZWOs&callback=initMap" |
||||
|
async defer></script> |
||||
|
</body> |
||||
|
|
||||
|
</html> |
@ -0,0 +1,99 @@ |
|||||
|
<?php |
||||
|
ini_set('display_errors', 'on'); |
||||
|
date_default_timezone_set('Asia/Taipei'); |
||||
|
|
||||
|
$referrer = isset($_REQUEST['referer']) ? $_REQUEST['referer'] : ""; |
||||
|
$hashReferer = "https://bpm.masada.com.twMasada@2023"; |
||||
|
|
||||
|
if ($hashReferer == $referrer) { |
||||
|
|
||||
|
include "T8_Authorization_from_bpm.php"; |
||||
|
|
||||
|
$user_id = "M0000"; |
||||
|
$user_password = "M012290493119"; |
||||
|
$validation = get_Auth("M0000", "M012290493119"); |
||||
|
|
||||
|
send_data_to_API($validation); |
||||
|
} else { |
||||
|
echo "非法訪問!"; |
||||
|
exit; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
function send_data_to_API($validation) |
||||
|
{ |
||||
|
// $apiurl = 'http://60.244.87.101:880//twWebAPI/V1/STKASSY/PostERPData'; |
||||
|
$apiurl = 'http://10.10.145.2:880//twWebAPI/V1/STKASSY/PostERPData'; |
||||
|
// $apiurl = 'https://erp.masada.com.tw:780/twWebAPI/V1/STKASSY/PostERPData'; |
||||
|
|
||||
|
$headerParam = [ |
||||
|
'CHI_Authorization: ' . $validation, |
||||
|
'Content-Type: application/json' |
||||
|
]; |
||||
|
|
||||
|
$body = [ |
||||
|
[ |
||||
|
"name" => "stkAssyMast", |
||||
|
"rows" => [ |
||||
|
[ |
||||
|
"BillNo" => "TEST06", |
||||
|
"OrgId" => "1000", |
||||
|
"TypeId" => "CA", |
||||
|
"MaterialId" => "3MH00302", |
||||
|
"PersonId" => "M0122", |
||||
|
"CompId" => "1001", |
||||
|
"DeptId" => "220", |
||||
|
"SQuantity" => 1, |
||||
|
"SUnitId" => "SET", |
||||
|
"CurrentState" => 2, |
||||
|
"CreatorId" => "M0122" |
||||
|
] |
||||
|
] |
||||
|
], |
||||
|
[ |
||||
|
"name" => "stkAssySubMatInfo", |
||||
|
"rows" => [ |
||||
|
[ |
||||
|
"BillNo" => "TEST06", |
||||
|
"MaterialId" => "3MH00302P", |
||||
|
"ComponentBaseQty" => 1, |
||||
|
"UnitQty" => 1, |
||||
|
"SUnitId" => "SET", |
||||
|
"MarkerNo" => "3MH00302", |
||||
|
"CU_MaterialId" => "3MH00302" |
||||
|
], |
||||
|
[ |
||||
|
"BillNo" => "TEST06", |
||||
|
"MaterialId" => "MX00000001", |
||||
|
"ComponentBaseQty" => 1, |
||||
|
"UnitQty" => 3, |
||||
|
"SUnitId" => "PCS", |
||||
|
"MarkerNo" => "3MH00302", |
||||
|
"CU_MaterialId" => "3MH00302" |
||||
|
] |
||||
|
] |
||||
|
] |
||||
|
]; |
||||
|
|
||||
|
$json = json_encode($body); |
||||
|
|
||||
|
$ch = curl_init(); |
||||
|
curl_setopt($ch, CURLOPT_URL, $apiurl); |
||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerParam); |
||||
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); |
||||
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $json); |
||||
|
|
||||
|
$response = curl_exec($ch); |
||||
|
|
||||
|
if ($response === false) { |
||||
|
echo 'Curl error: ' . curl_error($ch); |
||||
|
} else { |
||||
|
$result = json_decode($response, true); |
||||
|
echo $result['Status'] . "\n"; |
||||
|
echo $result['ErrorMsg'] . "\n"; |
||||
|
print_r($result['Data']); |
||||
|
} |
||||
|
|
||||
|
curl_close($ch); |
||||
|
} |
@ -0,0 +1,43 @@ |
|||||
|
<?php |
||||
|
|
||||
|
$user_id = "M0000"; |
||||
|
$user_password = "M012290493119"; |
||||
|
|
||||
|
function get_Auth($user_id = "M0000", $user_password = "M012290493119") |
||||
|
{ |
||||
|
|
||||
|
$now = gmdate("YmdHis"); |
||||
|
$data = "$user_id." . $now; |
||||
|
$sign = hash_hmac('SHA256', $data, 'B2D6395D2883E26C', false); |
||||
|
|
||||
|
|
||||
|
// $apiurl = 'https://erp.masada.com.tw:780/twWebAPI/GetAuth'; |
||||
|
// $apiurl = 'http://60.244.87.101:880//twWebAPI/GetAuth'; |
||||
|
$apiurl = 'http://10.10.145.2:880//twWebAPI/GetAuth'; |
||||
|
// $apiurl = 'https://erp.masada.com.tw:780/twWebAPI/GetAuth'; |
||||
|
|
||||
|
$headerParam = [ |
||||
|
"UserId: $user_id", |
||||
|
"Pwd: $user_password", |
||||
|
"TimestampUTC: $now", |
||||
|
"Sign: $sign" |
||||
|
]; |
||||
|
|
||||
|
$ch = curl_init(); |
||||
|
curl_setopt($ch, CURLOPT_URL, $apiurl); |
||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerParam); |
||||
|
|
||||
|
$response = curl_exec($ch); |
||||
|
if ($response === false) { |
||||
|
echo 'Curl error: ' . curl_error($ch); |
||||
|
} else { |
||||
|
// print_r($response); |
||||
|
// exit; |
||||
|
$result = json_decode($response, true); |
||||
|
$validation = $result['Data']['CHI_Authorization']; |
||||
|
return $validation; |
||||
|
} |
||||
|
|
||||
|
curl_close($ch); |
||||
|
} |
Loading…
Reference in new issue