1
pzy
2024-08-11 db08b0f3239df006eadea02d004451ab6a90eb5f
WebTM/views/ÖÊÁ¿¹ÜÀí/ÖÊÁ¿±¨±í/QC_InspectionFormReport.html
@@ -97,8 +97,6 @@
                                            <label class="layui-form-label" style="width: 85px;">上限</label>
                                            <div class="layui-input-block" style="margin-left: 120px;">
                                                <input type="text" class="layui-input" name="HUpLimit" id="HUpLimit" style="background-color:#efefef4d;" readonly>
                                                <input type="hidden" class="layui-input" name="HControlUpperLimit" id="HControlUpperLimit" >
                                                <input type="hidden" class="layui-input" name="HControlLowerLimit" id="HControlLowerLimit" >
                                            </div>
                                        </div>
                                    </div>
@@ -132,31 +130,56 @@
                                            </div>
                                        </div>
                                    </div>
                                    <div class="layui-row" style="margin: 10px 0 10px;display:none;">
                                    <div class="layui-row" style="margin-top:5px;">
                                        <div class="layui-inline">
                                            <label class="layui-form-label">过滤</label>
                                            <div class="layui-input-block">
                                                <select name="ColName" id="ColName" lay-filter="ColName" style="width:190px;">
                                                </select>
                                            <label class="layui-form-label" style="width: 85px;">控制上限</label>
                                            <div class="layui-input-block" style="margin-left: 120px;">
                                                <input type="text" class="layui-input" name="HControlUpperLimit_X" id="HControlUpperLimit_X">
                                            </div>
                                        </div>
                                        <div class="layui-inline" style="margin-left: 48px;">
                                            <label class="layui-form-label" style="width: 85px;">控制下限</label>
                                            <div class="layui-input-block" style="margin-left: 120px;">
                                                <input type="text" class="layui-input" name="HControlLowerLimit_X" id="HControlLowerLimit_X">
                                            </div>
                                        </div>
                                        <div class="layui-inline">
                                            <select name="Comparator" id="Comparator" lay-filter="Comparator" style="width:190px;">
                                                <option value="0" selected="selected"></option>
                                                <option value="=">=</option>
                                                <option value=">=">>=</option>
                                                <option value=">">></option>
                                                <option value="<="><=</option>
                                                <option value="<"><</option>
                                                <option value="<>"><></option>
                                                <option value="7">包含</option>
                                                <option value="8">左包含</option>
                                                <option value="9">右包含</option>
                                                <option value="10">不包含</option>
                                            </select>
                                            <label class="layui-form-label" style="width: 85px;">X中心线</label>
                                            <div class="layui-input-block" style="margin-left: 120px;">
                                                <input type="text" class="layui-input" name="HCenterline_X" id="HCenterline_X">
                                            </div>
                                        </div>
                                        <div class="layui-inline">
                                            <input type="text" class="layui-input" value="" name="ColContent" id="ColContent">
                                            <label class="layui-form-label" style="width: 85px;">PPK</label>
                                            <div class="layui-input-block" style="margin-left: 120px;">
                                                <input type="text" class="layui-input" name="HPPK" id="HPPK" style="background-color:#efefef4d;" readonly>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="layui-row" style="margin-top:5px;">
                                        <div class="layui-inline">
                                            <label class="layui-form-label" style="width: 85px;">控制上限</label>
                                            <div class="layui-input-block" style="margin-left: 120px;">
                                                <input type="text" class="layui-input" name="HControlUpperLimit_S" id="HControlUpperLimit_S">
                                            </div>
                                        </div>
                                        <div class="layui-inline" style="margin-left: 48px;">
                                            <label class="layui-form-label" style="width: 85px;">控制下限</label>
                                            <div class="layui-input-block" style="margin-left: 120px;">
                                                <input type="text" class="layui-input" name="HControlLowerLimit_S" id="HControlLowerLimit_S">
                                            </div>
                                        </div>
                                        <div class="layui-inline">
                                            <label class="layui-form-label" style="width: 85px;">S中心线</label>
                                            <div class="layui-input-block" style="margin-left: 120px;">
                                                <input type="text" class="layui-input" name="HCenterline_S" id="HCenterline_S">
                                            </div>
                                        </div>
                                        <div class="layui-inline">
                                            <label class="layui-form-label" style="width: 85px;">C P K</label>
                                            <div class="layui-input-block" style="margin-left: 120px;">
                                                <input type="text" class="layui-input" id="HCPK" name="HCPK" style="background-color:#efefef4d;" readonly>
                                            </div>
                                        </div>
                                    </div>
                                </div>
@@ -379,11 +402,25 @@
                            if (limit > data1.data.length - 3) {
                                layer.msg("取样数量超过实际数量!", { icon: 5 });
                            } else {
                                var data = [];//列字段数据
                                var col = [];
                                var totalArray = [];
                                //给空的数组赋值
                                for (var key in data1.list) {//循序遍历数组
                                    data.push({ "id": data1.list[key].ColmCols, "name": data1.list[key].ColmCols, "Type": data1.list[key].ColmType });//从每个对象中提取数据
                                }
                                for (var i = 0; i < data.length; i++) {//遍历data数组重的数据
                                    col.push({ field: data[i].id, title: data[i].name, align: 'center', sort: true, width: 120 });
                                }
                                option.cols = [col];
                                option.data = data1.data;
                                optionAVG = data1.data[limit + 1];
                                optionS = data1.data[limit + 2];
                                optionAVG[0] = data1.data[limit + 1];
                                optionS[0] = data1.data[limit + 2];
                                table.render(option);
                                set_Line();
                                set_PPK();
                                set_CPK();
                            }
                          
                        } else {
@@ -395,6 +432,197 @@
                        layer.alert("接口请求失败!", { icon: 5 });
                    }
                });
            }
            //PPK计算 x
            function set_PPK() {
                var x_AVG =0;
                var x_SUM = 0;
                var x_PPK = 0;
                var numCount = 0
                var c4 = [0.7979, 0.8862, 0.9213, 0.9400, 0.9515, 0.9594, 0.9650, 0.9693, 0.9727, 0.9754, 0.9776, 0.9794, 0.9810, 0.9823, 0.9835, 0.9845, 0.9854, 0.9862, 0.9869, 0.9876, 0.9882, 0.9887, 0.9892, 0.9896];
                for (var j = 1; j < option.cols[0].length; j++) {
                    if (optionAVG.length != 0 || optionS.length != 0) {
                        x_AVG = calc(x_AVG, parseFloat(optionAVG[0][option.cols[0][j].field]), "+");
                    }
                }
                x_AVG = calc(x_AVG, (option.cols[0].length - 1), "/");
                x_AVG = $("#HCenterline_X").val() == "" ? x_AVG : parseFloat($("#HCenterline_X").val());
                $("#HCenterline_X").val(x_AVG);
                for (var i = 1; i < option.cols[0].length; i++) {
                    for (var j = 0; j < option.data.length - 3; j++) {
                        numCount += 1;
                        x_SUM = calc(x_SUM, parseFloat(((parseFloat(option.data[j][option.cols[0][i].field]) - x_AVG) ** 2).toFixed(6)), "+")
                    }
                }
                x_PPK = Math.sqrt(calc(x_SUM, (numCount - 1), "/"));
                var limit = $("#limit").val();
                if (parseInt(limit) >= 9) {
                    $("#HCenterline_S").val(x_PPK.toFixed(4));
                }
                //上限
                if ($("#HUpLimit").val() != "" && $("#HDownLimit").val() == "") {
                    var HUpLimit = calc(calc(calc(parseFloat($("#HUpLimit").val()), parseFloat($("#HTargetVal").val()), "+"), x_AVG, "-"), calc(calc(3, x_PPK, "*"), c4[option.data.length - 4], "/"), "/");
                    $("#HPPK").val(HUpLimit.toFixed(4));
                }
                //下限
                else if ($("#HDownLimit").val() != "" && $("#HUpLimit").val() == "") {
                    var HDownLimit = calc(calc(x_AVG, calc(parseFloat($("#HDownLimit").val()), parseFloat($("#HTargetVal").val()), "+"), "-"), calc(calc(3, x_PPK, "*"), c4[option.data.length - 4], "/"), "/");
                    $("#HPPK").val(HDownLimit.toFixed(4));
                } else {
                    var HUpLimit = calc(calc(calc(parseFloat($("#HUpLimit").val()), parseFloat($("#HTargetVal").val()), "+"), x_AVG, "-"), calc(calc(3, x_PPK, "*"), c4[option.data.length - 4], "/"), "/");
                    var HDownLimit = (x_AVG - calc(parseFloat($("#HDownLimit").val()), parseFloat($("#HTargetVal").val()), "+")) / ((3 * x_PPK) / c4[option.data.length - 4]);
                    $("#HPPK").val(HUpLimit > HDownLimit ? HDownLimit.toFixed(4) : HUpLimit.toFixed(4));
                }
            }
             //CPK计算 s
            function set_CPK() {
                var x_AVG = 0;
                var s_AVG = 0;
                var s_CPK = 0;
                var d2 = [1.128, 1.693, 2.059, 2.326, 2.534, 2.704, 2.847, 3.078, 3.173, 3.258, 3.336, 3.407, 3.472, 3.532, 3.588, 3.640, 3.689, 3.735, 3.778, 3.819, 3.858, 3.895, 3.931];
                for (var j = 1; j < option.cols[0].length; j++) {
                    if (optionAVG.length != 0 || optionS.length != 0) {
                        s_AVG = calc(s_AVG, parseFloat(optionS[0][option.cols[0][j].field]), "+");
                    }
                }
                s_AVG = calc(s_AVG, (option.cols[0].length - 1), "/")
                s_AVG = $("#HCenterline_S").val() == "" || "0" ? s_AVG : parseFloat($("#HCenterline_S").val());
                $("#HCenterline_S").val(s_AVG);
                var limit = $("#limit").val();
                if (parseInt(limit) < 9) {
                    $("#HCenterline_S").val(s_AVG.toFixed(4));
                }
                for (var j = 1; j < option.cols[0].length; j++) {
                    if (optionAVG.length != 0 || optionS.length != 0) {
                        x_AVG = calc(x_AVG, parseFloat(optionAVG[0][option.cols[0][j].field]), "+");
                    }
                }
                x_AVG = calc(x_AVG, (option.cols[0].length - 1), "/");
                x_AVG = $("#HCenterline_X").val() == "" ? x_AVG : parseFloat($("#HCenterline_X").val());
                $("#HCenterline_X").val(x_AVG);
                s_CPK = calc(s_AVG, d2[option.data.length - 4], "/");
                //上限
                if ($("#HUpLimit").val() != "" && $("#HDownLimit").val() == "") {
                    var HUpLimit = calc(calc(calc(parseFloat($("#HUpLimit").val()), parseFloat($("#HTargetVal").val()),"+"), s_AVG, "-"), (3 * s_CPK), "/");
                    $("#HCPK").val(HUpLimit.toFixed(4));
                }
                //下限
                else if ($("#HDownLimit").val() != "" && $("#HUpLimit").val() == "") {
                    var HDownLimit = calc(calc(s_AVG, calc(parseFloat($("#HDownLimit").val()), parseFloat($("#HTargetVal").val()), "+"), "-"), (3 * s_CPK), "/");
                    $("#HCPK").val(HDownLimit.toFixed(4));
                } else {
                    var HUpLimit = calc(calc(calc(parseFloat($("#HUpLimit").val()), parseFloat($("#HTargetVal").val()), "+"), s_AVG, "-"), (3 * s_CPK), "/");
                    var HDownLimit = calc(calc(s_AVG, calc(parseFloat($("#HDownLimit").val()), parseFloat($("#HTargetVal").val()), "+"), "-"), (3 * s_CPK), "/");
                    if (s_CPK == 0) {
                        $("#HCPK").val(0);
                    } else {
                        $("#HCPK").val(HUpLimit > HDownLimit ? HDownLimit.toFixed(4) : HUpLimit.toFixed(4));
                    }
                }
            }
            function calc(num1, num2, calcStr) {
                var str1, // è½¬æ¢ä¸ºå­—符串的数字
                    str2,
                    ws1 = 0,// ws1,ws2 ç”¨æ¥å­˜å‚¨ä¼ å…¥çš„num的小数点后的数字的位数
                    ws2 = 0,// èµ‹é»˜è®¤å€¼ï¼Œè§£å†³å½“整数和小数运算时倍数计算错误导致的结果误差
                    bigger,// bigger和smaller用于加,减,除法找出小的那个数字,给后面补0,解决位数不对从而造成的计算错误的问题;乘法需要将结果除两个数字的倍数之和
                    smaller,// ä¾‹å¦‚:加减除法中1.001 + 2.03 ï¼Œå¦‚果不给2.03进行补0,最后会变成1001+203,数字错位导致结果错误;乘法中1.12*1.1会放大为112*11,所以结果需要除以1000才会是正确的结果,112*11/1000=1.232
                    zeroCount, // éœ€è¦è¡¥å……0的个数
                    isExistDot1, // ä¼ å…¥çš„æ•°å­—是否存在小数点
                    isExistDot2,
                    sum,
                    beishu = 1;
                // å°†æ•°å­—转换为字符串
                str1 = num1.toString();
                str2 = num2.toString();
                // æ˜¯å¦å­˜åœ¨å°æ•°ç‚¹ï¼ˆåˆ¤æ–­éœ€è¦è®¡ç®—的数字是不是包含小数)
                isExistDot1 = str1.indexOf('.') != -1 ? true : false;
                isExistDot2 = str2.indexOf('.') != -1 ? true : false;
                // å–小数点后面的位数
                if (isExistDot1) {
                    ws1 = str1.split('.')[1].length;
                }
                if (isExistDot2) {
                    ws2 = str2.split('.')[1].length;
                }
                // å¦‚ws1 å’Œ ws2 æ— é»˜è®¤å€¼ï¼Œå¦‚æžœnum1 æˆ– num2 ä¸æ˜¯å°æ•°çš„话则 ws1 æˆ– ws2 çš„值将为 undefined
                // bigger å’Œ smaller çš„值会和预期不符
                bigger = ws1 > ws2 ? ws1 : ws2;
                smaller = ws1 < ws2 ? ws1 : ws2;
                switch (calcStr) {
                    // åŠ å‡æ³•æ‰¾å‡ºå°çš„é‚£ä¸ªæ•°å­—ï¼Œç»™åŽé¢è¡¥0,解决位数不对从而造成的计算错误的问题
                    // ä¾‹å¦‚:1.001 + 2.03 ï¼Œå¦‚果不给2.03进行补0,最后会变成1001+203,数字错位导致结果错误
                    case "+":
                    case "-":
                    case "/":
                        zeroCount = bigger - smaller;
                        for (var i = 0; i < zeroCount; i++) {
                            if (ws1 == smaller) {
                                str1 += "0";
                            }
                            else {
                                str2 += "0";
                            }
                        }
                        break;
                    case "*":
                        // ä¹˜æ³•需要将结果除两个数字的倍数之和
                        bigger = bigger + smaller;
                        break;
                    default:
                        return "暂不支持的计算类型,现已支持的有加法、减法、乘法、除法";
                        break;
                }
                // åŽ»é™¤æ•°å­—ä¸­çš„å°æ•°ç‚¹
                str1 = str1.replace('.', '');
                str2 = str2.replace('.', '');
                // è®¡ç®—倍数,例如:1.001小数点后有三位,则需要乘 1000 å˜æˆ 1001,变成整数后精度丢失问题则不会存在
                for (var i = 0; i < bigger; i++) {
                    beishu *= 10; // ç­‰ä»·äºŽbeishu = beishu * 10;
                }
                num1 = parseInt(str1);
                num2 = parseInt(str2);
                // è¿›è¡Œæœ€ç»ˆè®¡ç®—并除相应倍数
                switch (calcStr) {
                    case "+":
                        sum = (num1 + num2) / beishu;
                        break;
                    case "-":
                        sum = (num1 - num2) / beishu;
                        break;
                    case "*":
                        sum = (num1 * num2) / beishu;
                        break;
                    case "/":
                        sum = num1 / num2;
                        /* é™¤æ•°ä¸Žè¢«é™¤æ•°åŒæ—¶æ”¾å¤§ä¸€å®šå€æ•°ï¼Œä¸å½±å“ç»“果,
                        æ‰€ä»¥å¯¹æ•°å­—进行放大对应倍数并进行补0操作后不用另对倍数做处理 */
                        break;
                    default:
                        return "暂不支持的计算类型,现已支持的有加法、减法、乘法、除法";
                }
                return sum;
            }
            //折线图
@@ -409,49 +637,18 @@
                let HAvg = [];//平均值
                let HDifference = [];//差值
                //获取两个月期之间的相差
                var time1 = Date.parse(new Date($("#HBeginDate").val()));//开始时间
                var time2 = Date.parse(new Date($("#HEndDate").val()));//结束时间
                var Days = Math.abs(parseInt((time2 - time1) / 1000 / 3600 / 24));
                //获取年
                var yyyy = new Date($("#HBeginDate").val()).getFullYear();
                //获取月份
                var MM = new Date($("#HBeginDate").val()).getMonth() + 1;
                //获取开始月份的最大天数
                var SumMonth = new Date(yyyy, MM, 0).getDate(); //动态两月之差
                //获取开始日期的天数
                var HBEGINDATE = new Date(new Date($("#HBeginDate").val())).getDate(); //获取开始日期天数
                var k = 0;//收集循环次数
                for (var j = 0; j <= (Days - k); j++) {
                    /* columns.push({ field: Format(yyyy + '/' + MM + '/' + (HBEGINDATE + j), 'yyyy-MM-dd'), title: Format(yyyy + '/' + MM + '/' + (HBEGINDATE + j), 'MM.dd'), width: 120 })*/
                    if (optionAVG != [] || optionS != []) {
                        HAvg.push(optionAVG[Format(yyyy + '/' + MM + '/' + (HBEGINDATE + j), 'yyyy-MM-dd')]);
                        HDifference.push(optionS[Format(yyyy + '/' + MM + '/' + (HBEGINDATE + j), 'yyyy-MM-dd')]);
                for (var j = 1; j < option.cols[0].length; j++) {
                    if (optionAVG.length != 0 || optionS.length != 0) {
                        HAvg.push(optionAVG[0][option.cols[0][j].field]);
                        HDifference.push(optionS[0][option.cols[0][j].field]);
                    } else {
                        HAvg.push(0);
                        HDifference.push(0);
                    }
                    //跨年的话 ä¼šä»Žä¸€æœˆä¸€å·å¼€å§‹
                    if (MM == 12 && (HBEGINDATE + j) == 31) {
                        yyyy += 1;
                        MM = 1;
                        SumMonth = new Date(yyyy, MM, 0).getDate();
                        HBEGINDATE = 0;
                        k += j;
                        j = 0;
                    } else if ((HBEGINDATE + j) == SumMonth) { //跨月 æœˆæ•°åР䏀  å¤©æ•°ä»Žä¸€å¼€å§‹
                        HBEGINDATE = 0;
                        MM += 1;
                        SumMonth = new Date(yyyy, MM, 0).getDate();
                        k += j;
                        j = 0;
                    }
                }
                for (let i = 0; i <= Days; i++) {
                    H_X.push(i + 1);
                for (let i = 1; i < option.cols[0].length; i++) {
                    H_X.push(option.cols[0][i].field);
                }
                option_ZXT_Avg = {
@@ -471,9 +668,9 @@
                    },
                    yAxis: {
                        type: 'value',
                        min: parseInt($("#HTargetVal").val()) + parseInt($("#HDownLimit").val()) - 1, // è®¾ç½®æœ€å°å€¼
                        max: parseInt($("#HTargetVal").val()) + parseInt($("#HUpLimit").val()) + 1, // è®¾ç½®æœ€å¤§å€¼
                        interval: 0.1, // è®¾ç½®é—´è·
                        min: parseFloat($("#HDownLimit").val()) != 0 ? calc((parseFloat($("#HTargetVal").val()), calc(parseFloat($("#HDownLimit").val()), 1.3), "*"), "+") : 0, // è®¾ç½®æœ€å°å€¼
                        max: calc(parseFloat($("#HTargetVal").val()), calc(parseFloat($("#HUpLimit").val()), 1.3, "*"), "+"), // è®¾ç½®æœ€å¤§å€¼
                        interval: calc(calc(parseFloat($("#HUpLimit").val()), parseFloat($("#HDownLimit").val()), "-"), 10, "/"), // è®¾ç½®é—´è·
                    },
                    series: [
                        {
@@ -498,15 +695,19 @@
                            markLine: {
                                symbol: 'none',//去掉箭头
                                data: [
                                    { yAxis: $("#HUpLimit").val(), lineStyle: { color: '#FF1D00' }, label: { color: '#FF1D00', fontSize: 10 } },
                                    { yAxis: parseFloat($("#HTargetVal").val()) + parseFloat($("#HUpLimit").val()), lineStyle: { color: '#FF1D00' }, label: { color: '#FF1D00', fontSize: 10 } },
                                    {
                                        yAxis: $("#HDownLimit").val(), lineStyle: { color: '#FF1D00' }, label: { color: '#FF1D00', fontSize: 10 }
                                        yAxis: parseFloat($("#HTargetVal").val()) + parseFloat($("#HDownLimit").val()), lineStyle: { color: '#FF1D00' }, label: { color: '#FF1D00', fontSize: 10 }
                                    },
                                    {
                                        yAxis: $("#HControlUpperLimit").val(), lineStyle: { color: '#2cb615' }, label: { color: '#2cb615', fontSize: 10 }
                                        yAxis: parseFloat($("#HControlUpperLimit_X").val()), lineStyle: { color: '#2cb615' }, label: { color: '#2cb615', fontSize: 10 }
                                    },
                                    {
                                        yAxis: $("#HControlLowerLimit").val(), lineStyle: { color: '#2cb615' }, label: { color: '#2cb615', fontSize: 10 }
                                        yAxis: parseFloat($("#HControlLowerLimit_X").val()), lineStyle: { color: '#2cb615' }, label: { color: '#2cb615', fontSize: 10 }
                                    }
                                    ,
                                    {
                                        yAxis: parseFloat($("#HCenterline_X").val()), lineStyle: { color: '#6dadf0' }, label: { color: '#6dadf0', fontSize: 10 }
                                    }
                                ]
                            },
@@ -558,14 +759,21 @@
                                }
                            },
                            itemStyle: { normal: { label: { show: true } } },
                            //markLine: {
                            //    symbol: 'none',//去掉箭头
                            //    data: [
                            //        { type: 'max', name: 'Max', lineStyle: { color: 'red' } },
                            //        { type: 'average', name: 'Avg', lineStyle: { color: 'blue' } },
                            //        { type: 'min', name: 'Min', lineStyle: { color: 'green' } },
                            //    ]
                            //},
                            markLine: {
                                symbol: 'none',//去掉箭头
                                data: [
                                    {
                                        yAxis: parseFloat($("#HControlUpperLimit_S").val()) , lineStyle: { color: '#2cb615' }, label: { color: '#2cb615', fontSize: 10 }
                                    },
                                    {
                                        yAxis: parseFloat($("#HControlLowerLimit_S").val()), lineStyle: { color: '#2cb615' }, label: { color: '#2cb615', fontSize: 10 }
                                    }
                                    ,
                                    {
                                        yAxis: parseFloat($("#HCenterline_S").val()), lineStyle: { color: '#6dadf0' }, label: { color: '#6dadf0', fontSize: 10 }
                                    }
                                ]
                            },
                        }
                    ]
                };
@@ -717,8 +925,8 @@
                            $("#HUpLimit").val(data1.data[0].上限值);
                            $("#HDownLimit").val(data1.data[0].下限值);
                            $("#HTargetVal").val(data1.data[0].目标值);
                            $("#HControlUpperLimit").val(data1.data[0].控制上限);
                            $("#HControlLowerLimit").val(data1.data[0].控制下限);
                            //$("#HControlUpperLimit").val(data1.data[0].控制上限);
                            //$("#HControlLowerLimit").val(data1.data[0].控制下限);
                        } else {
                            layer.close(wait);
                            layer.alert(data1.Message, { icon: 5 });