+ 干燥失重 新开标签页对批号自增后自动填入批号输入框
+ 格式化代码
This commit is contained in:
352
lod.html
352
lod.html
@@ -11,8 +11,8 @@
|
||||
<script src="./decimal.js"></script>
|
||||
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
|
||||
<script>
|
||||
var debug = false;
|
||||
var localStorageSupport = storageAvailable("localStorage");
|
||||
var debug = false
|
||||
var localStorageSupport = storageAvailable("localStorage")
|
||||
var tip = `
|
||||
<br>
|
||||
操作过程:
|
||||
@@ -29,181 +29,243 @@
|
||||
删除:输入或选择样品批号,点击删除,此时将从已存储的数据中删除对应数据。
|
||||
<br>
|
||||
若保存、恢复、删除按钮均未显示,则表明您的浏览器不支持此功能。
|
||||
`;
|
||||
`
|
||||
|
||||
var decimal = Decimal.set(
|
||||
{
|
||||
rounding: Decimal.ROUND_HALF_EVEN,
|
||||
precision: 12
|
||||
}
|
||||
);
|
||||
|
||||
$(document).ready(function () {
|
||||
var input_m0l = document.getElementById("m0l");
|
||||
var input_m1l = document.getElementById("m1l");
|
||||
var input_m3l = document.getElementById("m3l");
|
||||
var input_m0r = document.getElementById("m0r");
|
||||
var input_m1r = document.getElementById("m1r");
|
||||
var input_m3r = document.getElementById("m3r");
|
||||
var decimal = Decimal.set({
|
||||
rounding: Decimal.ROUND_HALF_EVEN,
|
||||
precision: 12
|
||||
})
|
||||
|
||||
$(document).ready(() => {
|
||||
$(".msgbox").append(tip)
|
||||
|
||||
if (!localStorageSupport) {
|
||||
$("#remove").hide();
|
||||
$("#restore").hide();
|
||||
$("#save").hide();
|
||||
$("#lod-name").removeAttr("list");
|
||||
$("#remove").hide()
|
||||
$("#restore").hide()
|
||||
$("#save").hide()
|
||||
$("#lod-name").removeAttr("list")
|
||||
}
|
||||
|
||||
if (localStorageSupport) {
|
||||
loadSavedContentsList();
|
||||
if (localStorageSupport) loadSavedContentsList()
|
||||
|
||||
// 若有前面页面的传值,则导入传入的值
|
||||
if (window.location.search.startsWith('?data')) {
|
||||
let data = getUrlParams('data').replaceAll('%22', '"')
|
||||
importData(JSON.parse(data))
|
||||
}
|
||||
|
||||
$("#ok").click(function () {
|
||||
var m0l = input_m0l.value;
|
||||
var m1l = input_m1l.value;
|
||||
var m3l = input_m3l.value;
|
||||
|
||||
var m0r = input_m0r.value;
|
||||
var m1r = input_m1r.value;
|
||||
var m3r = input_m3r.value;
|
||||
$("#ok").click(() => {
|
||||
var m0l = $("#m0l").val()
|
||||
var m1l = $("#m1l").val()
|
||||
var m3l = $("#m3l").val()
|
||||
var m0r = $("#m0r").val()
|
||||
var m1r = $("#m1r").val()
|
||||
var m3r = $("#m3r").val()
|
||||
|
||||
|
||||
var lod1 = lod(m0l, m1l, m3l)
|
||||
var lod2 = lod(m0r, m1r, m3r)
|
||||
var average = decimal.add(lod1, lod2).div(2).toString();
|
||||
var average = decimal.add(lod1, lod2).div(2).toString()
|
||||
|
||||
// 结果小于0时,使用红色字体
|
||||
lod1 = (lod1 < 0) ? "<span style='color: red;'>" + lod1 + "</span>" : lod1;
|
||||
lod2 = (lod2 < 0) ? "<span style='color: red;'>" + lod2 + "</span>" : lod2;
|
||||
average = (average < 0) ? "<span style='color: red;'>" + average + "</span>" : average;
|
||||
// TODO 可能干燥失重不应该使用 RSD 值来判断是否平行,可尝试使用 RD 或 RAD 判断
|
||||
// let rsd = RSD(lod1, lod2)
|
||||
|
||||
var msg = "<br>" +
|
||||
"第一组干燥失重 = " + lod1 + "<br>" +
|
||||
"第二组干燥失重 = " + lod2 + "<br>" +
|
||||
"两组干燥失重平均值 = " + average + "<br>";
|
||||
var msg = `
|
||||
第一组干燥失重 = ${lod1 <= 0 ? `<span style='color: red;'>${lod1}</span>` : lod1}<br>
|
||||
第二组干燥失重 = ${lod2 <= 0 ? `<span style='color: red;'>${lod2}</span>` : lod2}<br>
|
||||
两组干燥失重平均值 = ${average}<br>
|
||||
${m0l != '' && m1l != '' ? `第一组恒重后空瓶+样 = ${decimal.add(m0l, m1l).toString()}` : ''}<br>
|
||||
${m0r != '' && m1r != '' ? `第二组恒重后空瓶+样 = ${decimal.add(m0r, m1r).toString()}` : ''}<br>
|
||||
`
|
||||
|
||||
if (m0l != '' && m1l != '') {
|
||||
msg += "第一组恒重后空瓶+样 = " + decimal.add(m0l, m1l).toString() + "<br>";
|
||||
}
|
||||
message(msg)
|
||||
})
|
||||
|
||||
if (m0r != '' && m1r != '') {
|
||||
msg += "第二组恒重后空瓶+样 = " + decimal.add(m0r, m1r).toString() + "<br>";
|
||||
}
|
||||
$("#clear").click(() => {
|
||||
if (!window.confirm("所填写的数据将被清空,确定?")) return
|
||||
$("#lod-name").val("")
|
||||
$("#m0l").val("")
|
||||
$("#m1l").val("")
|
||||
$("#m3l").val("")
|
||||
$("#m0r").val("")
|
||||
$("#m1r").val("")
|
||||
$("#m3r").val("")
|
||||
message(tip)
|
||||
})
|
||||
|
||||
|
||||
message(msg);
|
||||
});
|
||||
|
||||
$("#clear").click(function () {
|
||||
if (!window.confirm("所填写的数据(不包括批号)将被清空,确定?")) {
|
||||
return;
|
||||
}
|
||||
input_m0l.value = "";
|
||||
input_m1l.value = "";
|
||||
input_m3l.value = "";
|
||||
input_m0r.value = "";
|
||||
input_m1r.value = "";
|
||||
input_m3r.value = "";
|
||||
|
||||
message(tip);
|
||||
});
|
||||
|
||||
$("#new_page").click(function () {
|
||||
window.open(window.location.href, "_blank");
|
||||
});
|
||||
$("#new_page").click(() => {
|
||||
// 将当前页面的数据封装,并通过 URL 参数传递给新页面
|
||||
let data = JSON.stringify(exportData())
|
||||
let search = `?data=${data}`.replaceAll('"', '%22')
|
||||
let url = `${window.location.origin}${window.location.pathname}${search}`
|
||||
window.open(url, "_blank")
|
||||
})
|
||||
|
||||
$("#save").click(() => {
|
||||
let id = $("#lod-name").val();
|
||||
let id = $("#lod-name").val()
|
||||
if (id.length == 0) {
|
||||
confirm("请输入或选择样品批号!");
|
||||
return;
|
||||
confirm("请输入或选择样品批号!")
|
||||
return
|
||||
}
|
||||
|
||||
// save data to localStorage
|
||||
let m0l = input_m0l.value;
|
||||
let m1l = input_m1l.value;
|
||||
let m3l = input_m3l.value;
|
||||
let m0r = input_m0r.value;
|
||||
let m1r = input_m1r.value;
|
||||
let m3r = input_m3r.value;
|
||||
|
||||
let lod = {
|
||||
"time": Date.now(),
|
||||
"m0l": m0l,
|
||||
"m1l": m1l,
|
||||
"m3l": m3l,
|
||||
"m0r": m0r,
|
||||
"m1r": m1r,
|
||||
"m3r": m3r
|
||||
};
|
||||
localStorage.setItem(id, JSON.stringify(lod));
|
||||
loadSavedContentsList();
|
||||
});
|
||||
let lod = exportData()
|
||||
lod['time'] = Date.now()
|
||||
localStorage.setItem(id, JSON.stringify(lod))
|
||||
loadSavedContentsList()
|
||||
})
|
||||
|
||||
$("#restore").click(() => {
|
||||
let id = $("#lod-name").val();
|
||||
let id = $("#lod-name").val()
|
||||
if (id.length == 0) {
|
||||
confirm("请输入或选择样品批号!");
|
||||
return;
|
||||
confirm("请输入或选择样品批号!")
|
||||
return
|
||||
}
|
||||
|
||||
let lod = JSON.parse(localStorage.getItem(id));
|
||||
input_m0l.value = lod.m0l;
|
||||
input_m1l.value = lod.m1l;
|
||||
input_m3l.value = lod.m3l;
|
||||
input_m0r.value = lod.m0r;
|
||||
input_m1r.value = lod.m1r;
|
||||
input_m3r.value = lod.m3r;
|
||||
});
|
||||
let lod = JSON.parse(localStorage.getItem(id))
|
||||
$("#m0l").val(lod.m0l)
|
||||
$("#m1l").val(lod.m1l)
|
||||
$("#m3l").val(lod.m3l)
|
||||
$("#m0r").val(lod.m0r)
|
||||
$("#m1r").val(lod.m1r)
|
||||
$("#m3r").val(lod.m3r)
|
||||
})
|
||||
|
||||
$("#remove").click(() => {
|
||||
let id = $("#lod-name").val();
|
||||
let id = $("#lod-name").val()
|
||||
if (id.length == 0) {
|
||||
confirm("请输入或选择样品批号!");
|
||||
return;
|
||||
confirm("请输入或选择样品批号!")
|
||||
return
|
||||
}
|
||||
if (confirm("确认删除 " + id + " 的数据?")) {
|
||||
localStorage.removeItem(id);
|
||||
loadSavedContentsList();
|
||||
$("#lod-name").val("");
|
||||
localStorage.removeItem(id)
|
||||
loadSavedContentsList()
|
||||
$("#lod-name").val("")
|
||||
$("#clear").click()
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
if (debug) {
|
||||
document.getElementById("m0l").value = 18.34625;
|
||||
document.getElementById("m1l").value = 1.04213;
|
||||
document.getElementById("m3l").value = 19.38511;
|
||||
$("#m0l").val(18.34625)
|
||||
$("#m1l").val(1.04213)
|
||||
$("#m3l").val(19.38511)
|
||||
$("#m0r").val(21.23537)
|
||||
$("#m1r").val(1.00242)
|
||||
$("#m3r").val(22.23460)
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
// 需要传递给新页面的数据
|
||||
function exportData() {
|
||||
let data = {
|
||||
"id": $("#lod-name").val(),
|
||||
"m0l": $("#m0l").val(),
|
||||
"m1l": $("#m1l").val(),
|
||||
"m3l": $("#m3l").val(),
|
||||
"m0r": $("#m0r").val(),
|
||||
"m1r": $("#m1r").val(),
|
||||
"m3r": $("#m3r").val(),
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
// 需要导入哪些
|
||||
function importData(data) {
|
||||
// 对批号自增
|
||||
let id = data.id
|
||||
if (data.id.indexOf('-')) {
|
||||
let x = data.id.split('-')
|
||||
id = x[x.length - 1]
|
||||
}
|
||||
console.log(id)
|
||||
id = decimal.add(id, 1)
|
||||
if (data.id.indexOf('-')) {
|
||||
id = data.id.substring(0, data.id.lastIndexOf('-') + 1) + id
|
||||
}
|
||||
console.log(id)
|
||||
|
||||
$("#lod-name").val(id)
|
||||
// 暂时不需要自动填充上一个页面传来的数据
|
||||
// $("#m0l").val(data.m0l)
|
||||
// $("#m1l").val(data.m1l)
|
||||
// $("#m3l").val(data.m3l)
|
||||
// $("#m0r").val(data.m0r)
|
||||
// $("#m1r").val(data.m1r)
|
||||
// $("#m3r").val(data.m3r)
|
||||
}
|
||||
|
||||
function getUrlParams(key) {
|
||||
let params = window.location.search.substring(1).split("&")
|
||||
for (const v of params) {
|
||||
let pair = v.split("=")
|
||||
if (pair[0] == key) return pair[1]
|
||||
}
|
||||
}
|
||||
|
||||
// 计算相对标准偏差
|
||||
// Markdown 公式:$RSD = \frac{SD}{\overline{x}}*100\%$
|
||||
function RSD(...array) {
|
||||
let stdev = STDEV(...array)
|
||||
let average = () => {
|
||||
let sum = new Decimal(0)
|
||||
array.forEach(value => sum = sum.plus(new Decimal(value)))
|
||||
return sum.dividedBy(array.length)
|
||||
}
|
||||
|
||||
let rsd = stdev.dividedBy(average()).times(100)
|
||||
return rsd.toPrecision(5)
|
||||
}
|
||||
|
||||
// 计算标准偏差
|
||||
// Markdown 公式:$SD = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \overline{x})^2}{n-1}}$
|
||||
function STDEV(...array) {
|
||||
// 计算所有数值的和
|
||||
var sum = new Decimal(0)
|
||||
array.forEach(value => sum = sum.plus(new Decimal(value)))
|
||||
|
||||
// 计算所有数值的平均值
|
||||
let average = sum.dividedBy(array.length)
|
||||
|
||||
// 计算 ((每个数值减去平均值)的二次方)的和,即公式中分子的结果
|
||||
var sumEach = new Decimal(0)
|
||||
array.forEach(value => {
|
||||
let v = new Decimal(value)
|
||||
let temp = v.minus(average).toPower(2)
|
||||
sumEach = sumEach.plus(temp)
|
||||
})
|
||||
|
||||
// 以上结果除以 n-1 并开根号即得
|
||||
let x = sumEach.dividedBy(array.length - 1).squareRoot()
|
||||
return x
|
||||
}
|
||||
|
||||
function loadSavedContentsList() {
|
||||
// load data from localStorage to input.
|
||||
let keys = [];
|
||||
$("#keys").empty();
|
||||
for (let i = 0; i < localStorage.length; i++) {
|
||||
keys.push(localStorage.key(i));
|
||||
let keys = []
|
||||
$("#keys").empty()
|
||||
for (const key in localStorage) {
|
||||
if (Object.hasOwnProperty.call(localStorage, key)) keys.push(key)
|
||||
}
|
||||
keys.sort();
|
||||
keys.sort()
|
||||
keys.forEach(key => {
|
||||
let timestamp = JSON.parse(localStorage.getItem(key)).time;
|
||||
let time = new Date(timestamp).format("yyyy-MM-dd hh:mm");
|
||||
let option = document.createElement("option");
|
||||
$(option).attr("value", key);
|
||||
$(option).attr("label", `保存于 ${time}`);
|
||||
$("#keys").append(option);
|
||||
});
|
||||
let timestamp = JSON.parse(localStorage.getItem(key)).time
|
||||
let time = new Date(timestamp).format("yyyy-MM-dd hh:mm")
|
||||
let option = document.createElement("option")
|
||||
$(option).attr("value", key)
|
||||
$(option).attr("label", `保存于 ${time}`)
|
||||
$("#keys").append(option)
|
||||
})
|
||||
}
|
||||
|
||||
// check storage available
|
||||
function storageAvailable(type) {
|
||||
let storage;
|
||||
let storage
|
||||
try {
|
||||
storage = window[type];
|
||||
const x = '__storage_test__';
|
||||
storage.setItem(x, x);
|
||||
storage.removeItem(x);
|
||||
return true;
|
||||
storage = window[type]
|
||||
const x = '__storage_test__'
|
||||
storage.setItem(x, x)
|
||||
storage.removeItem(x)
|
||||
return true
|
||||
}
|
||||
catch (e) {
|
||||
return e instanceof DOMException && (
|
||||
@@ -217,13 +279,13 @@
|
||||
// Firefox
|
||||
e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
|
||||
// acknowledge QuotaExceededError only if there's something already stored
|
||||
(storage && storage.length !== 0);
|
||||
(storage && storage.length !== 0)
|
||||
}
|
||||
}
|
||||
|
||||
function message(msg) {
|
||||
$(".msgbox").empty();
|
||||
$(".msgbox").append(msg);
|
||||
$(".msgbox").empty()
|
||||
$(".msgbox").append(msg)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -235,26 +297,26 @@
|
||||
*/
|
||||
function lod(m0, m1, m3) {
|
||||
if (checkNull(m0, m1, m3)) {
|
||||
return "0";
|
||||
return "0"
|
||||
}
|
||||
|
||||
var a = new Decimal(m0);
|
||||
var b = new Decimal(m1);
|
||||
var c = new Decimal(m3);
|
||||
let a = new Decimal(m0)
|
||||
let b = new Decimal(m1)
|
||||
let c = new Decimal(m3)
|
||||
|
||||
// a + b - c / b
|
||||
var d = decimal.add(a, b).minus(c);
|
||||
var e = d.div(b).mul(100);
|
||||
return e.toString();
|
||||
let d = decimal.add(a, b).minus(c)
|
||||
let e = d.div(b).mul(100)
|
||||
return e.toString()
|
||||
}
|
||||
|
||||
function checkNull(m0, m1, m3) {
|
||||
return m0 == '' || m1 == '' || m3 == '';
|
||||
return m0 == '' || m1 == '' || m3 == ''
|
||||
}
|
||||
|
||||
// 为 Date 创建日期格式化方法
|
||||
Date.prototype.format = function (fmt) {
|
||||
var o = {
|
||||
let o = {
|
||||
"M+": this.getMonth() + 1, //月份
|
||||
"d+": this.getDate(), //日
|
||||
"h+": this.getHours(), //小时
|
||||
@@ -262,16 +324,16 @@
|
||||
"s+": this.getSeconds(), //秒
|
||||
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
|
||||
"S": this.getMilliseconds() //毫秒
|
||||
};
|
||||
}
|
||||
if (/(y+)/.test(fmt)) {
|
||||
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
|
||||
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length))
|
||||
}
|
||||
for (var k in o) {
|
||||
if (new RegExp("(" + k + ")").test(fmt)) {
|
||||
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
|
||||
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)))
|
||||
}
|
||||
}
|
||||
return fmt;
|
||||
return fmt
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user