yusijie
2026-04-09 ef4ba11d43ff3687fdc1a3be97ae382184f04caa
Merge branch 'master' of http://101.37.171.70:10101/r/MES-WEB-LayUI
6个文件已修改
4个文件已添加
3058 ■■■■■ 已修改文件
WebTM/WebTM.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/WebTM.csproj.user 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/数采管理/DAQ_EvidenceEquipmentCockpit.html 1153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/数采管理/DAQ_EvidenceEquipmentCockpitDetail.html 517 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/模治具管理/器具报表/Sc_MouldDailyUseReport.html 829 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/模治具管理/器具报表/Sc_MouldMonthUseReport.html 541 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/模治具管理/模治具仓库管理/Sc_MouldProdOutBillEdit.html 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/系统管理/多级审批/审核流程单/Xt_CheckFlowEdit.html 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/设备管理/设备工艺参数订单点检表/SB_EquipICMOTechParamBillEdit.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/质量管理/首件检验单/QC_FirstPieceCheckBillList2.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/WebTM.csproj
@@ -686,6 +686,8 @@
    <Content Include="views\案例代码\华远\HY_HistogramReport_ForPCSCheckNote.html" />
    <Content Include="views\案例代码\华远\HY_HistogramReport.html" />
    <Content Include="views\案例代码\华远\HY_InterfaceTest.html" />
    <Content Include="views\模治具管理\器具报表\Sc_MouldDailyUseReport.html" />
    <Content Include="views\模治具管理\器具报表\Sc_MouldMonthUseReport.html" />
    <Content Include="views\模治具管理\器具报表\Sc_MoldMainoverdueWarnReport.html" />
    <Content Include="views\模治具管理\器具领用申请单\Sc_MouldOutRequestBillEdit.html" />
    <Content Include="views\模治具管理\器具领用申请单\Sc_MouldOutRequestBillList.html" />
WebTM/WebTM.csproj.user
@@ -6,7 +6,7 @@
    <ProjectView>ShowAllFiles</ProjectView>
    <LastActiveSolutionConfig>Release|Any CPU</LastActiveSolutionConfig>
    <NameOfLastUsedPublishProfile>D:\智云LMes\MESWMS-LayUI\WebTM\Properties\PublishProfiles\SWETM.pubxml</NameOfLastUsedPublishProfile>
    <NameOfLastUsedPublishProfile>D:\工作代码\智云迈思\MES\MES-WEB-LayUI\WebTM\Properties\PublishProfiles\LAYUI.pubxml</NameOfLastUsedPublishProfile>
    <NameOfLastUsedPublishProfile>C:\Users\19858\Desktop\智云迈思\MES-WEB-LayUI\WebTM\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
    <ProjectView>ShowAllFiles</ProjectView>
    <LastActiveSolutionConfig>Debug|Any CPU</LastActiveSolutionConfig>
    <UseIISExpress>true</UseIISExpress>
WebTM/views/Êý²É¹ÜÀí/DAQ_EvidenceEquipmentCockpit.html
New file
@@ -0,0 +1,1153 @@
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>设备状态分布</title>
    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
    <script src="../../layuiadmin/layui/layui.js"></script>
    <script src="../../layuiadmin/layui/layui.js"></script>
    <script src="../../layuiadmin/Scripts/json2.js"></script>
    <script src="../../layuiadmin/Scripts/jquery-1.4.1.js"></script>
    <script src="../../layuiadmin/layui/layui1.js"></script>
    <script src="../../layuiadmin/echarts.min.js"></script>
    <link href="../../layuiadmin/layui/css/ReportPlatform.css" rel="stylesheet" />
    <script src="../../layuiadmin/Scripts/webConfig.js"></script>
    <style>
        /*树状图点击高亮变色*/
        .layui-tree-set-active>.layui-tree-entry .layui-tree-main {
            background: #aef0f7;
        }
        .cnt {
            border: 1px solid #5FB878;
            height: 50px;
            border-radius: 5px;
            /*background: -webkit-gradient(linear, 0% 0%, 0% 50%,from(#262525), to(#262525));*/
            /*谷歌*/
        }
        .bottomright {
            cursor: pointer;
            /*鼠标变成手指样式*/
            transition: all 0.1s;
            /*所有属性变化在0.6秒内执行动画*/
        }
        .bottomright:hover {
            transform: scale(1.3);
            /*鼠标放上之后元素变成1.4倍大小*/
        }
        .imgtitle {
            width: 70%;
            height: 50px;
            text-align: center;
            display: block;
            font-size: 15px;
            float: left;
            line-height: 50px;
        }
        .cns {
            border: 1px solid #5FB878;
            height: 130px;
            border-radius: 5px;
        }
        .cns p {
            font-size: 12px;
            line-height: 18px;
            margin: 0 5px;
            white-space: nowrap;
            text-overflow: ellipsis;
            overflow: hidden;
        }
        .check1 {
            cursor: pointer;
            /*鼠标变成手指样式*/
            -webkit-transition: border linear .1s, -webkit-box-shadow linear .5s;
            border-color: rgba(0, 148, 255, .75);
            -webkit-box-shadow: 0 0 18px rgba(0, 148, 255);
        }
        .prs {
            font-family: "微软雅黑";
            font-weight: bold;
            line-height: 30px;
            margin: 0 0px 0px 10px;
            float: left;
        }
        .layui-progress {
            width: 45%;
            float: left;
            top: 6px;
        }
        .tr1-1,
        .tr1-2,
        .tr1-3,
        .tr1-4 {
            margin-left: 3%;
            margin-top: 4%;
            height: 310px;
            border: 1px solid rgb(0 0 0 / 10%);
            width: 95%;
        }
        .btnM {
            width: 30%;
            height: 50px;
            line-height: 50px;
            float: left;
            text-align: right;
        }
        .layui-icon {
            font-size: 20px;
        }
    </style>
</head>
<body>
    <div class="layui-fluid">
        <div class="layui-col-md12">
            <div class="layui-card" style="padding: 1px">
                <div class="layui-card-body" style="padding: 1px;">
                    <form class="layui-form" action="" lay-filter="component-form-group">
                        <div class="layui-row">
                            <div class="layui-col-xs2 layui-inline" style="border: solid 1.5px #e0d6d64d;">
                                <div id="TreeTable" class="demo-tree demo-tree-box"
                                    style="height: 600px; overflow: scroll;"></div>
                            </div>
                            <div class="layui-col-xs10 layui-inline" style="border: solid 1.5px #e0d6d64d;">
                                <div id="btomleft" style="height:600px;display:block;overflow-y:auto;">
                                </div>
                            </div>
                            <!-- <div class="layui-col-xs1 layui-inline" style="border: solid 1.5px #e0d6d64d;">
                                <fieldset style="border: 1px solid #eee; box-shadow: 0 2px 5px 0 rgb(0 0 0 / 10%); height: 585px;">
                                    <legend style="color: #5FB878">操作台</legend>
                                    <div class="content4">
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="PowerOn(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-pause imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">开机</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="PowerOff(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-logout imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">停机</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="DotCheck(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-list imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">点检记录</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="FaultRegistration(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-list imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">故障登记</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="Maintenance(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-form imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">ç»´ä¿®</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="Resume(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-table imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">履历</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="Process(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-file imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">工艺</span>
                                                </div>
                                            </div>
                                        </div>
                                        <div class="layui-row layui-col-space10">
                                            <div class="layui-col-sm12 " onclick="HStatus(event,this)">
                                                <div class="cnt bottomright">
                                                    <div class="btnM">
                                                        <span class="layui-icon layui-icon-set imgicon"></span>
                                                    </div>
                                                    <span class="imgtitle">状态</span>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </fieldset>
                            </div> -->
                        </div>
                        <div class="layui-row" style="display: none;">
                            <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-1" id="mychart11"> </div>
                            </div>
                            <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-2" id="mychart22"> </div>
                            </div>
                            <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-3" id="mychart3"> </div>
                            </div>
                            <div class="layui-col-xs3 layui-inline">
                                <div class="tr1-4" id="mychart4"> </div>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</body>
</html>
<script>
    var wktag = 0;
    var HEquipID = 0;//设备id
    var HEquipNumber = "";//设备编码
    var HEquipName = "";//设备名称
    var HSourceID = "";//产线id
    var HDeptID = "";
    layui.config({
        base: '../../layuiadmin/' //静态资源所在路径
    }).extend({
        index: 'lib/index', //主入口模块
    }).use(['index', 'form', 'table', 'element', 'laypage', 'laydate', 'tree'], function () {
        //#region å…¬ç”¨å˜é‡
        var $ = layui.$
            , admin = layui.admin
            , layer = layui.layer
            , table = layui.table
            , form = layui.form
            , element = layui.element
            , laypage = layui.laypage
            , laydate = layui.laydate
            , tree = layui.tree
        //#endregion
        //#region è¿›å…¥é¡µé¢å³åŠ è½½
        //初始化界面
        set_ClearBill();
        //#endregion
        //#region è§¦å‘事件:包括form.on(){}格式的所有点击事件、选择事件等
        //#endregion
        //#region æœ¬é¡µé¢è¢«è°ƒç”¨çš„æ‰€æœ‰æ–¹æ³•
        //#region åˆå§‹åŒ–界面
        function set_ClearBill() {
            var mychart11 = echarts.init(document.getElementById('mychart11'));
            var mychart22 = echarts.init(document.getElementById('mychart22'));
            var mychart3 = echarts.init(document.getElementById('mychart3'));
            var mychart4 = echarts.init(document.getElementById('mychart4'));
            get_Histogram1(mychart11, '');//柱状图1
            get_LineChart(mychart22, '');//折线
            get_Statistics(mychart3, '');//饼图
            get_Histogram4(mychart4, '');//柱状图4
            //查询
            get_Display_Tree();
        }
        //#endregion
        //查询工单
        function Check(HDeptID) {
            wktag = 0;
            $("#btomleft").html("");
            $.ajax({
                url: GetWEBURL() + '/Sc_HEquipStateDistribution/Sc_HEquipStateDistribution_Souce',
                type: "GET",
                data: { "HDeptID": HDeptID, "user": sessionStorage["HUserName"], "OrganizationID": sessionStorage["OrganizationID"] },
                dataType: "json",//数据类型可以为 text xml json  script  jsonp
                success: function (data) {
                    var LoadData1 = data.data.h_p_sc_HDeptSouceMOList;
                    if (LoadData1.length > 0)  //工单列表数据
                    {
                        for (var i = 0; i < LoadData1.length; i++) {
                            var html1 = '';
                            html1 += '<div class="layui-col-sm12 layui-col-md2" style="margin: 6px;width: 180px;">';
                            html1 += '<div class="cns" id="bs' + (i + 1) + '" onclick="CheckBtom(this,' + (i + 1) + ')">';
                            html1 += '<dl>';
                            html1 += '<dd class="tcenter">';
                            html1 += '<h1 style="display:none;"><span>生产订单号主ID:</span><span id="df' + (i + 1) + '">' + LoadData1[i].生产订单主内码 + '</span></h1>';
                            html1 += '<h1 style="display:none;"><span>生产订单子ID:</span><span id="ds' + (i + 1) + '">' + LoadData1[i].生产订单子内码 + '</span></h1>';
                            html1 += '<h1 style="display:none;"><span>产线ID:</span><span id="cs' + (i + 1) + '">' + LoadData1[i].HSourceID + '</span></h1>';
                            html1 += '<h1 style="display:none;"><span>设备ID:</span><span id="sb' + (i + 1) + '">' + LoadData1[i].设备id + '</span></h1>';
                            html1 += '<p><span>设备编码:</span><span id="sbbm' + (i + 1) + '">' + LoadData1[i].设备编码 + '</span></p>';
                            html1 += '<p><span>设备名称:</span><span id="sbmc' + (i + 1) + '">' + LoadData1[i].设备名称 + '</span></p>';
                            html1 += '<p><span>产线:</span><span id="cxmc' + (i + 1) + '">' + LoadData1[i].产线 + '</span></p>';
                            html1 += '<p><span>当前订单:</span><span id="gd' + (i + 1) + '">' + LoadData1[i].生产订单 + '</span></p>';
                            html1 += '<p><span>订单数量:</span><span id="ddqty' + (i + 1) + '">' + LoadData1[i].任务单数量 + '</span></p>';
                            html1 += '<p><span>完成数量:</span><span id="wcqty' + (i + 1) + '">' + LoadData1[i].流转卡数量 + '</span></p>';
                            switch (LoadData1[i].设备状态) {
                                case "空闲":
                                    html1 += '<p><span>当前状态:</span><span class="gj_icon color_border6"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
                                    break;
                                case "开机":
                                    html1 += '<p><span>当前状态:</span><span class="gj_icon color_border4"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
                                    break;
                                case "停机":
                                    html1 += '<p><span>当前状态:</span><span class="gj_icon color_border3"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
                                    break;
                                case "生产":
                                    html1 += '<p><span>当前状态:</span><span class="gj_icon color_border2"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
                                    break;
                                case "维修中":
                                    html1 += '<p><span>当前状态:</span><span class="gj_icon color_border5"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
                                    break;
                                case "故障":
                                    html1 += '<p><span>当前状态:</span><span class="gj_icon color_border1"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
                                    break;
                                case "维修完成":
                                    html1 += '<p><span>当前状态:</span><span class="gj_icon color_border7"></span><span>' + LoadData1[i].设备状态 + '</span></p>';
                                    break;
                                default:
                            }
                            html1 += '</dd>';
                            html1 += '</dl>';
                            html1 += '</div>';
                            html1 += '</div>';
                            $("#btomleft").append(html1);
                        }
                    }
                },
                error: function (err) {
                    layer.alert(err.Message, { time: 1 * 2000, icon: 5 });
                    return false;
                }
            });
        }
        // æ ‘状图查询
        function get_Display_Tree() {
            var sWhere = " and  HWorkShopFlag =1   and HUSEORGID=" + sessionStorage["OrganizationID"];
            var ajaxLoad = layer.load();
            $.ajax({
                url: GetWEBURL() + '/Gy_Department/Gy_DepartmentTreeList',
                data: { "sWhere": sWhere },
                type: "GET",
                success: function (data1) {
                    if (data1.count == 1) {
                        layer.close(ajaxLoad);
                        var data = JSON.parse(data1.data);
                        MenuMain(data);
                    } else {
                        layer.close(ajaxLoad);
                        layer.alert(data1.code + data1.Message, { icon: 5 });
                    }
                }, error: function () {
                    layer.close(ajaxLoad);
                    layer.alert("接口请求失败!", { icon: 5 });
                }
            });
        }
        //遍历生成主菜单
        function MenuMain(data) {
            var liStr = '[';
            //遍历生成主菜单
            for (var i = 0; i < data.length; i++) {
                // åˆ¤æ–­æ˜¯å¦å­˜åœ¨å­èœå•
                if (data[i].children != null && data[i].children.length > 0) {
                    liStr += '{"title": "' + data[i].id + "-" + data[i].title + '", "id": "' + data[i].id + '","spread":true, "children":[ ';
                    // éåŽ†èŽ·å–å­èœå•
                    for (var k = 0; k < data[i].children.length; k++) {
                        liStr += getChildMenu(data[i].children[k], 0);
                    }
                    liStr = liStr.substring(0, liStr.length - 1);
                    liStr += ']},';
                } else {
                    liStr += '{"title": "' + data[i].id + "-" + data[i].title + '", "id": "' + data[i].id + '"},';
                }
            };
            liStr = liStr.substring(0, liStr.length - 1);
            liStr += "]";
            var treeTable = JSON.parse(liStr);
            tree.render({
                elem: '#TreeTable' //默认是点击节点可进行收缩
                , data: treeTable
                , click: function (obj) {
                    //高亮变色
                    $(".layui-tree-set").removeClass('layui-tree-set-active');
                    obj.elem.addClass('layui-tree-set-active');
                    var data = obj.data;  //获取当前点击的节点数据
                    HDeptID = 0;
                    if (data.id == "0") {
                    } else {
                        HDeptID = data.id;
                    }
                    Check(HDeptID);
                }
            });
        }
        // é€’归生成子菜单
        function getChildMenu(subMenu, num) {
            num++;
            var subStr = '';
            if (subMenu.children != null && subMenu.children.length > 0) {
                subStr += '{"title": "' + subMenu.id + "-" + subMenu.title + '", "id": "' + subMenu.id + '", "children":[';
                for (var j = 0; j < subMenu.children.length; j++) {
                    subStr += getChildMenu(subMenu.children[j], num);
                    if (j + 1 == subMenu.children.length) {
                        subStr = subStr.substring(0, subStr.length - 1);
                    }
                }
                subStr += ']},';
            } else {
                subStr += '{"title": "' + subMenu.id + "-" + subMenu.title + '", "id": "' + subMenu.id + '"},';
            }
            return subStr;
        }
    });
    //#endregion
    //工单列表选中
    function CheckBtom(obj, i) {
        workcode = $("#gd" + i + "").html(); //通过样式ID获取html内容(工单号)
        HICMOInterID = $("#df" + i + "").html();     //生产订单主内码
        HICMOEntryID = $("#ds" + i + "").html();     //生产订单子内码
        HEquipID = $("#sb" + i + "").html();     //设备id
        HEquipNumber = $("#sbbm" + i + "").html();     //设备编码
        HEquipName = $("#sbmc" + i + "").html();     //设备名称
        HSourceID = $("#cs" + i + "").html();     //产线id
        $('.cns').removeClass('check1');  //删除不同父级clss样式相同的所有元素
        $("#bs" + i + "").addClass('check1'); // æ·»åŠ å½“å‰å…ƒç´ çš„æ ·å¼
        if (HEquipID != "" && HEquipID != null) {
            wktag = 1;
        }
        sWhere = {
            HDeptID: HDeptID
            , HSourceID: HSourceID
        }
        /* ç‚¹å‡» è®¾å¤‡ å¼€å¯è®¾å¤‡è¯¦æƒ…弹窗,设备状态详情页面
        *详情页面:日期过滤、设备运行分析、警报(可以先取值为最近的安灯管理)取值用 è®¾å¤‡è¿è¡ŒçŠ¶æ€è¡¨ Sb_EquipRunningStatus(设备当前状态效率分析)
        */
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '设备详情',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: './DAQ_EvidenceEquipmentCockpitDetail.html?HEquipID=' + HEquipID,
            end: function () {
            },
            success: function (dom, index) {
            },
        });
        // FourReport(JSON.stringify(sWhere));
    }
    //查询 éƒ¨é—¨+产线 4个图表 èµ‹å€¼
    function FourReport(sWhere) {
        $.ajax({
            url: GetWEBURL() + '/Sc_HEquipStateDistribution/Get_EquipStateDistribution_FourReport',
            type: "GET",
            data: { "sWhere": sWhere, "user": sessionStorage["HUserName"], "OrganizationID": sessionStorage["OrganizationID"] },
            dataType: "json",//数据类型可以为 text xml json  script  jsonp
            success: function (data) {
                var chartData = data.data.h_p_Sc_FourStateDistributionReport;
                var chartData1 = data.data.h_p_Sc_FourStateDistributionReport1;
                var chartData2 = data.data.h_p_Sc_FourStateDistributionReport2;
                var chartData3 = data.data.h_p_Sc_FourStateDistributionReport3;
                var mychart11 = echarts.init(document.getElementById('mychart11'));
                var mychart22 = echarts.init(document.getElementById('mychart22'));
                var mychart3 = echarts.init(document.getElementById('mychart3'));
                var mychart4 = echarts.init(document.getElementById('mychart4'));
                get_Histogram1(mychart11, chartData);
                get_LineChart(mychart22, chartData1);
                get_Statistics(mychart3, chartData2);
                get_Histogram4(mychart4, chartData3);
            },
            error: function (err) {
                layer.alert(err.Message, { time: 1 * 2000, icon: 5 });
                return false;
            }
        });
    }
    //柱状图
    function get_Histogram1(mychart11, chartData) {
        // é»˜è®¤çš„option结构
        var option = {
            title: {
                text: '近七天产能', // é»˜è®¤æ ‡é¢˜ä¸ºç©º
                left: 'center',
                top: '10%', // è°ƒæ•´æ ‡é¢˜ä½ç½®ï¼Œæ”¾åˆ°æœ€ä¸Šé¢
                textStyle: {
                    fontSize: 18,
                    color: '#ff0000'
                }
            },
            grid: {
                top: '25%', // è°ƒæ•´grid的top值,给标题留出空间
                bottom: '20%',
                left: '10%',
                right: '10%'
            },
            xAxis: {
                type: 'category',
                data: [] // é»˜è®¤x轴数据为空
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    data: [], // é»˜è®¤series数据为空
                    type: 'bar'
                }
            ]
        };
        // å¦‚果有数据,更新option的内容
        if (chartData && chartData.length > 0) {
            option.title.text = '近七天产能'; // æ­£å¸¸æ•°æ®æ—¶æ²¡æœ‰æ ‡é¢˜
            option.xAxis.data = chartData.map(item => item.日期); // è®¾ç½®x轴数据
            option.series[0].data = chartData.map(item => item['生产总数']); // è®¾ç½®y轴数据
            option.series[0].label = {
                normal: {
                    show: true,
                    position: 'top',
                    formatter: function (params) {
                        return echarts.format.addCommas(params.value);
                    }
                }
            };
            option.series[0].itemStyle = {
                normal: {
                    color: '#15b1fa',
                    label: {
                        show: true // åœ¨æŸ±çŠ¶å›¾ä¸Šæ˜¾ç¤ºæ•°æ®
                    }
                }
            };
        } else {
            // æ²¡æœ‰æ•°æ®æ—¶ï¼Œæ˜¾ç¤º"暂无数据"提示
            option.title.text = '暂无数据';
        }
        // æ›´æ–°å›¾è¡¨
        mychart11.setOption(option);
    }
    //柱状图2
    function get_LineChart(mychart22, chartData1) {
        // é»˜è®¤çš„option结构
        var option = {
            title: {
                text: 'ç»´ä¿®', // é»˜è®¤æ ‡é¢˜ä¸ºç©º
                left: 'center',
                top: '10%', // è°ƒæ•´æ ‡é¢˜ä½ç½®ï¼Œæ”¾åˆ°æœ€ä¸Šé¢
                textStyle: {
                    fontSize: 18,
                    color: '#ff0000'
                }
            },
            axisLabel: {
                show: true,
                interval: 0,
                color: '#15b1fa',
                formatter: function (value) {
                    var ret = "";//拼接加\n返回的类目项
                    var maxLength = 1;//每项显示文字个数
                    var valLength = value.length;//X轴类目项的文字个数
                    var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
                    if (rowN > 1)//如果类目项的文字大于3,
                    {
                        for (var i = 0; i < rowN; i++) {
                            var temp = "";//每次截取的字符串
                            var start = i * maxLength;//开始截取的位置
                            var end = start + maxLength;//结束截取的位置
                            //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
                            temp = value.substring(start, end) + "\n";
                            ret += temp; //凭借最终的字符串
                        }
                        return ret;
                    }
                    else {
                        return value;
                    }
                }
            },
            grid: {
                top: '25%', // è°ƒæ•´grid的top值,给标题留出空间
                bottom: '20%',
                left: '10%',
                right: '10%'
            },
            xAxis: {
                type: 'category',
                data: [] // é»˜è®¤x轴数据为空
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    data: [], // é»˜è®¤series数据为空
                    type: 'bar'
                }
            ]
        };
        // å¦‚果有数据,更新option的内容
        if (chartData1 && chartData1.length > 0) {
            option.title.text = '不良原因'; // æ­£å¸¸æ•°æ®æ—¶æ²¡æœ‰æ ‡é¢˜
            option.xAxis.data = chartData1.map(item => item.不良原因); // è®¾ç½®x轴数据
            option.series[0].data = chartData1.map(item => item['数量']); // è®¾ç½®y轴数据
            option.series[0].label = {
                normal: {
                    show: true,
                    position: 'top',
                    formatter: function (params) {
                        return echarts.format.addCommas(params.value);
                    }
                }
            };
            option.series[0].itemStyle = {
                normal: {
                    color: '#15b1fa',
                    label: {
                        show: true // åœ¨æŸ±çŠ¶å›¾ä¸Šæ˜¾ç¤ºæ•°æ®
                    }
                }
            };
        } else {
            // æ²¡æœ‰æ•°æ®æ—¶ï¼Œæ˜¾ç¤º"暂无数据"提示
            option.title.text = '暂无数据';
        }
        // æ›´æ–°å›¾è¡¨
        mychart22.setOption(option);
    }
    //饼图
    function get_Statistics(mychart3, chartData2) {
        // å¦‚æžœ chartData2 ä¸ºç©ºï¼Œæä¾›ä¸€ä¸ªâ€œæ— æ•°æ®â€æç¤º
        if (chartData2.length === 0) {
            mychart3.setOption({
                title: {
                    text: '暂无数据',
                    left: 'center',
                    top: '10%',
                    textStyle: {
                        color: 'red', // è®¾ç½®æ ‡é¢˜é¢œè‰²ä¸ºçº¢è‰²
                        fontSize: 18,
                        fontWeight: 'bold'
                    }
                },
                series: [],  // æ¸…空数据
                graphic: []  // æ¸…空图形中的文本
            });
            return;
        }
        // çŠ¶æ€é¢œè‰²æ˜ å°„
        const statusColorMap = {
            '开机': '#28a745',    // ç»¿è‰²
            '故障': '#ff63a5',    // æ¡ƒçº¢è‰²
            '停机': '#f0ad4e',    // é»„色
            '未知': '#6c757d'     // ç°è‰²
        };
        // è®¡ç®—开机率
        const totalDevices = chartData2.reduce((sum, item) => sum + item.数量, 0);
        const onlineDevices = chartData2.find(item => item.状态 === '开机')?.数量 || 0;
        const onlineRate = totalDevices === 0 ? 0 : (onlineDevices / totalDevices * 100).toFixed(2);
        // åŠ¨æ€ç”Ÿæˆé¥¼å›¾æ•°æ®ï¼Œå¹¶æ ¹æ®çŠ¶æ€è®¾ç½®é¢œè‰²
        var data = chartData2.map(function (item) {
            // èŽ·å–å½“å‰çŠ¶æ€çš„é¢œè‰²ï¼Œé»˜è®¤ä¸ºç°è‰²
            var color = statusColorMap[item.状态] || statusColorMap['未知'];
            return {
                value: item.数量,
                name: item.状态,
                itemStyle: {
                    color: color  // ä¸ºæ¯ä¸ªçŠ¶æ€è®¾ç½®å¯¹åº”çš„é¢œè‰²
                }
            };
        });
        // å›¾è¡¨çš„配置项
        var option = {
            title: {
                text: '设备状态分析对比',
                left: 'center',
                top: '10%',  // å°†æ ‡é¢˜æ”¾ç½®åˆ°é¡¶éƒ¨
                textStyle: {
                    color: 'red',  // è®¾ç½®æ ‡é¢˜å­—体颜色为红色
                    fontSize: 18,
                    fontWeight: 'bold'
                }
            },
            tooltip: {
                trigger: 'item'
            },
            legend: {
                orient: 'vertical',
                left: 'left'
            },
            series: [
                {
                    name: '设备状态',
                    type: 'pie',
                    radius: '50%',
                    data: data,  // ä½¿ç”¨åŠ¨æ€ç”Ÿæˆçš„æ•°æ®
                    emphasis: {
                        itemStyle: {
                            shadowBlur: 10,
                            shadowOffsetX: 0,
                            shadowColor: 'rgba(0, 0, 0, 0.5)'
                        }
                    }
                }
            ],
            graphic: [{
                type: 'text',
                left: 'center',
                top: '85%',  // è°ƒæ•´æ–‡æœ¬ä½ç½®ï¼Œè®©å…¶ç¨å¾®æ›´å¾€ä¸‹
                style: {
                    text: `开机率: ${onlineRate}%`,  // æ˜¾ç¤ºå¼€æœºçއ
                    font: '16px Arial',
                    fill: '#00aaff'  // ä½¿ç”¨æµ…蓝色显示开机率
                }
            }]
        };
        // è®¾ç½®å›¾è¡¨çš„配置项
        mychart3.setOption(option);
    }
    //柱状图4
    function get_Histogram4(mychart4, chartData3) {
        // é»˜è®¤çš„option结构
        var option = {
            title: {
                text: 'ç»´ä¿®', // é»˜è®¤æ ‡é¢˜ä¸ºç©º
                left: 'center',
                top: '10%', // è°ƒæ•´æ ‡é¢˜ä½ç½®ï¼Œæ”¾åˆ°æœ€ä¸Šé¢
                textStyle: {
                    fontSize: 18,
                    color: '#ff0000'
                }
            },
            axisLabel: {
                show: true,
                interval: 0,
                color: '#15b1fa',
                formatter: function (value) {
                    var ret = "";//拼接加\n返回的类目项
                    var maxLength = 1;//每项显示文字个数
                    var valLength = value.length;//X轴类目项的文字个数
                    var rowN = Math.ceil(valLength / maxLength); //类目项需要换行的行数
                    if (rowN > 1)//如果类目项的文字大于3,
                    {
                        for (var i = 0; i < rowN; i++) {
                            var temp = "";//每次截取的字符串
                            var start = i * maxLength;//开始截取的位置
                            var end = start + maxLength;//结束截取的位置
                            //这里也可以加一个是否是最后一行的判断,但是不加也没有影响,那就不加吧
                            temp = value.substring(start, end) + "\n";
                            ret += temp; //凭借最终的字符串
                        }
                        return ret;
                    }
                    else {
                        return value;
                    }
                }
            },
            grid: {
                top: '25%', // è°ƒæ•´grid的top值,给标题留出空间
                bottom: '20%',
                left: '10%',
                right: '10%'
            },
            xAxis: {
                type: 'category',
                data: [] // é»˜è®¤x轴数据为空
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    data: [], // é»˜è®¤series数据为空
                    type: 'bar'
                }
            ]
        };
        // å¦‚果有数据,更新option的内容
        if (chartData3 && chartData3.length > 0) {
            option.title.text = 'ç»´ä¿®'; // æ­£å¸¸æ•°æ®æ—¶æ²¡æœ‰æ ‡é¢˜
            option.xAxis.data = chartData3.map(item => item.维修项目); // è®¾ç½®x轴数据
            option.series[0].data = chartData3.map(item => item['维修次数']); // è®¾ç½®y轴数据
            option.series[0].label = {
                normal: {
                    show: true,
                    position: 'top',
                    formatter: function (params) {
                        return echarts.format.addCommas(params.value);
                    }
                }
            };
            option.series[0].itemStyle = {
                normal: {
                    color: '#15b1fa',
                    label: {
                        show: true // åœ¨æŸ±çŠ¶å›¾ä¸Šæ˜¾ç¤ºæ•°æ®
                    }
                }
            };
        } else {
            // æ²¡æœ‰æ•°æ®æ—¶ï¼Œæ˜¾ç¤º"暂无数据"提示
            option.title.text = '暂无数据';
        }
        // æ›´æ–°å›¾è¡¨
        mychart4.setOption(option);
    }
    //#region   æ“ä½œå°æŒ‰é’®ç‚¹å‡»äº‹ä»¶
    //开机按钮点击事件
    function PowerOn(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增开机单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/设备开机单/Sb_EquipBeginBill.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //停机按钮点击事件
    function PowerOff(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增停机单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/设备停机单/Sb_EquipStopBill.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //点检记录按钮点击事件
    function DotCheck(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备月点检记录',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../车间管理/启动点检单/Sc_WorkDotCheckBillList_Day.html?OperationType=设备&linterid=' + HEquipID + '',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID,
                    "HEquipType": "设备"
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //故障登记按钮点击事件
    function FaultRegistration(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增故障登记单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/Sb_Add_EqpConkBookBillList.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //维修记录按钮点击事件
    function Maintenance(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '新增维修记录单',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/Sb_Add_EqpMaintenanceBillList.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //履历按钮点击事件
    function Resume(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备履历',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../设备管理/设备报表/Sb_EquipResumeCheckQuery.html?OperationType=1&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID,
                    "HEquipNumber": HEquipNumber,
                    "HEquipName": HEquipName
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //工艺按钮点击事件
    function Process(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备工艺参数',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../生产管理/订单状态分布/Sc_EquipmentProcessList.html?OperationType=4&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipID": HEquipID,
                    "HICMOInterID": HICMOInterID,
                    "HICMOEntryID": HICMOEntryID
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //状态按钮点击事件
    function HStatus(event, obj) {
        if (wktag == 0) {
            layer.alert("请选择对应设备", { icon: 5 });
            return false;
        }
        layer.open({
            type: 2,
            skin: 'layui-layer-rim', //加上边框
            title: '查看设备OEE',
            closeBtn: 1,
            shift: 2,
            area: ['100%', '100%'],
            maxmin: true,
            content: '../../生产管理/订单状态分布/Sc_OEEStatusReport.html?OperationType=4&linterid=0&HSouceBillType=',
            end: function () {
            },
            success: function (dom, index) {
                var data = [];
                data.push({
                    "HEquipNumber": HEquipNumber
                });
                //通过索引获取到当前iframe弹出层
                var iframe = window['layui-layer-iframe' + index];
                //调用iframe弹出层内的方法
                iframe.edit(data);
            },
        });
    }
    //#endregion
</script>
WebTM/views/Êý²É¹ÜÀí/DAQ_EvidenceEquipmentCockpitDetail.html
New file
@@ -0,0 +1,517 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>证据设备驾驶舱</title>
    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
    <script src="../../layuiadmin/layui/layui1.js"></script>
    <script src="../../layuiadmin/Scripts/json2.js"></script>
    <script src="../../layuiadmin/Scripts/jquery-1.4.1.js"></script>
    <script src="../../layuiadmin/PubCustom.js"></script>
    <script src="../../layuiadmin/zgqCustom/zgqCustom.js"></script>
    <script src="../../layuiadmin/HideButton.js"></script>
    <script src="../../layuiadmin/soulTable.slim.js"></script>
    <script src="../../layuiadmin/PageTitle.js"></script>
    <script src="../../layuiadmin/echarts.min.js"></script>
    <script src="../../layuiadmin/Scripts/webConfig.js"></script>
    <style type="text/css">
        #deviceRunningInfo {
            background: #ffffff;
            border-radius: 8px;
            box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
            padding: 22px 20px;
            margin: 15px 0;
            border: 1px solid #f0f0f0;
        }
        #deviceRunningInfo .layui-form-label {
            text-align: left;
            font-weight: 500;
            color: #555;
            padding-left: 0;
            width: auto;
        }
        #deviceRunningInfo .layui-form-static {
            border: 1px solid #e8e8e8;
            border-radius: 6px;
            padding: 0 12px;
            line-height: 38px;
            background-color: #fafbfc;
            color: #333;
            font-size: 14px;
            transition: all 0.2s;
        }
        #deviceRunningInfo .layui-form-static:hover {
            background-color: #f5f7fa;
            border-color: #dcdfe6;
        }
        #deviceRunningInfo .layui-form-item {
            margin-bottom: 18px;
        }
        .zy-sub-title {
            font-size: large;
            padding: 20px;
            font-weight: bold;
        }
        #EquipRunningStatusCharts {
            height: 230px;
        }
    </style>
</head>
<body>
    <div class="layui-fluid">
        <div class="layui-col-md12">
            <div class="layui-card" style="padding: 1px">
                <div class="layui-card-body" style="padding: 1px;">
                    <form class="layui-form" action="" lay-filter="component-form-group">
                        <!-- é€‰æ‹©æ—¥æœŸ -->
                        <div class="layui-collapse">
                            <div class="layui-colla-item">
                                <div class="layui-form-item">
                                    <div class="layui-inline">
                                        <label class="layui-form-label">日期范围</label>
                                        <div class="layui-inline" id="ID-laydate-range">
                                            <div class="layui-input-inline">
                                                <input type="text" autocomplete="off" id="HBeginDate"
                                                    class="layui-input" placeholder="开始日期">
                                            </div>
                                            <div class="layui-form-mid">-</div>
                                            <div class="layui-input-inline">
                                                <input type="text" autocomplete="off" id="HEndDate" class="layui-input"
                                                    placeholder="结束日期">
                                            </div>
                                        </div>
                                        <button class="layui-btn layuiadmin-btn-order" type="button" lay-submit=""
                                            lay-filter="btnSearch" id="btnSearch">
                                            <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
                                        </button>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <!-- è®¾å¤‡è¿è¡Œä¿¡æ¯ -->
                        <div class="layui-form-item" id="deviceRunningInfo">
                            <label class="zy-sub-title" style="padding: 0;">设备运行信息<label
                                    id="deviceRunningDate"></label></label>
                            <div class="layui-row" style="padding-top: 20px;">
                                <!-- å æ¯” 2/12 (约1/6),用于放标签 -->
                                <div class="layui-col-xs1 layui-col-md1">
                                    <label class="layui-form-label"
                                        style="text-align: left; padding-left: 0;">设备名称</label>
                                </div>
                                <!-- å æ¯” 4/12 (约1/3),用于放值 -->
                                <div class="layui-col-xs4 layui-col-md4">
                                    <div class="layui-form-static" id="HEquipName"></div>
                                </div>
                                <!-- å ä½ç©ºåˆ—,用于隔开左右两组数据 -->
                                <div class="layui-col-xs1 layui-col-md1">&nbsp;</div>
                                <!-- ç¬¬äºŒåˆ—标签:所属区域 -->
                                <div class="layui-col-xs1 layui-col-md1">
                                    <label class="layui-form-label"
                                        style="text-align: left; padding-left: 0;">所属区域</label>
                                </div>
                                <div class="layui-col-xs4 layui-col-md4">
                                    <div class="layui-form-static" id="HDeptName"></div>
                                </div>
                            </div>
                            <div class="layui-row">
                                <!-- å æ¯” 2/12 (约1/6),用于放标签 -->
                                <div class="layui-col-xs1 layui-col-md1">
                                    <label class="layui-form-label"
                                        style="text-align: left; padding-left: 0;">设备状态</label>
                                </div>
                                <!-- å æ¯” 4/12 (约1/3),用于放值 -->
                                <div class="layui-col-xs4 layui-col-md4">
                                    <div class="layui-form-static" id="HEquipStatus"></div>
                                </div>
                                <!-- å ä½ç©ºåˆ—,用于隔开左右两组数据 -->
                                <div class="layui-col-xs1 layui-col-md1">&nbsp;</div>
                                <!-- ç¬¬äºŒåˆ—标签:所属区域 -->
                                <div class="layui-col-xs1 layui-col-md1">
                                    <label class="layui-form-label"
                                        style="text-align: left; padding-left: 0;">日期</label>
                                </div>
                                <div class="layui-col-xs4 layui-col-md4">
                                    <div class="layui-form-static" id="HDate"></div>
                                </div>
                            </div>
                        </div>
                        <!-- è®¾å¤‡è¿è¡Œä¿¡æ¯(时序) echarts å®žçް-->
                        <div>
                            <label class="zy-sub-title">设备运行时序</label>
                            <div class="layui-row">
                                <div class="layui-col-xs12 layui-inline">
                                    <div id="EquipRunningStatusCharts"></div>
                                </div>
                            </div>
                        </div>
                        <!-- å®‰ç¯(警报)记录 maintable -->
                        <div>
                            <label class="zy-sub-title">最近10条警报记录</label>
                            <table class="" id="mainTable" lay-filter="mainTable"></table>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
    <script>
        layui.config({
            base: '../../layuiadmin/' //静态资源所在路径
        }).extend({
            index: 'lib/index', //主入口模块
        }).use(['index', 'form', 'table', 'element', 'laypage', 'laydate', 'tree', 'util'], function () {
            //#region å…¬ç”¨å˜é‡
            var $ = layui.$
                , admin = layui.admin
                , layer = layui.layer
                , table = layui.table
                , form = layui.form
                , element = layui.element
                , laypage = layui.laypage
                , laydate = layui.laydate
                , tree = layui.tree
                , util = layui.util;
            //查询条件
            var sWhere = "";
            var option = [];
            var chartsOption = {}
            var params = getUrlVars()
            var HEquipID = params[params[0]]
            //#endregion
            //#region è¿›å…¥é¡µé¢å³åŠ è½½
            //初始化界面
            set_ClearBill();
            //#endregion
            //#region è§¦å‘事件:包括form.on(){}格式的所有点击事件、选择事件等
            form.on("submit(btnSearch)", function (data) {
                get_Display();
            })
            //#endregion
            // #region æœ¬é¡µé¢è°ƒç”¨çš„æ‰€æœ‰æ–¹æ³•
            function set_ClearBill() {
                // åˆå§‹åŒ–日期选择器
                initDateSelector()
                // åˆå§‹åŒ–echarts
                set_InitCharts()
                //初始化表格
                set_InitGrid();
                // èŽ·å–æ•°æ®
                get_Display();
            }
            function initDateSelector() {
                // é»˜è®¤æ—¥æœŸä¸ºä»Šå¤©
                var yesterdaySameTime = new Date();
                yesterdaySameTime.setDate(yesterdaySameTime.getDate() - 1);
                $("#HBeginDate").val(util.toDateString(yesterdaySameTime, 'yyyy-MM-dd HH:mm:ss'))
                $("#HEndDate").val(util.toDateString(new Date(), 'yyyy-MM-dd HH:mm:ss'))
                // åˆå§‹åŒ–日期范围选择
                laydate.render({
                    elem: '#ID-laydate-range',
                    range: ['#HBeginDate', '#HEndDate'],
                    type: 'datetime',
                });
            }
            function set_InitCharts() {
                var EquipRunningStatusCharts = echarts.init(document.getElementById("EquipRunningStatusCharts"))
                get_LineChart(EquipRunningStatusCharts, []);//折线
            }
            function set_InitGrid() {
                option = {
                    elem: '#mainTable'
                    // , toolbar: '#toolbarDemo'
                    , height: 'full-50'
                    , page: true
                    , cellMinWidth: 90
                    , totalRow: true
                    , limit: 50
                    , limits: [50, 500, 5000, 20000]
                    , done: function (res, curr, count) {
                        // soulTable.render(this);
                    }
                    , cols: [[
                        { type: 'checkbox', fixed: 'left', totalRowText: '合计行' }
                        , { field: '警报代码', title: '警报代码' }
                        , { field: '持续时间', title: '持续时间' }
                        , { field: '原因', title: '原因' }
                        , {
                            field: '时间', title: '时间', templet: function (d) {
                                return layui.util.toDateString(d.时间, 'yyyy-MM-dd HH:mm:ss');
                            }
                        }
                    ]],
                    data: []
                };
                table.render(option)
            }
            function get_LineChart(mychart22, chartData1) {
                var baseTime = $("HBeginDate").val()
                var endTime = $("HEndDate").val()
                var yAxisData = [$("#HDeptName").val()]
                var seriesData = chartData1.map(item => [
                    item.StartTime,
                    item.EndTime,
                    item.EquipName,
                    item.Status
                ]);
                // é»˜è®¤çš„option结构
                chartsOption = {
                    // æ ‡é¢˜
                    title: {
                        text: '设备运行时序',
                        left: 'left',
                        show: false
                    },
                    // å›¾ä¾‹ï¼ˆå³ä¸Šè§’的状态标识)
                    legend: {
                        data: ['运行', '开机', '停机', '告警', '关机'],
                        right: 10,
                        top: 5,
                        show: true
                    },
                    // æç¤ºæ¡†ï¼ˆé¼ æ ‡æ‚¬æµ®æ—¶æ˜¾ç¤ºï¼‰
                    tooltip: {
                        trigger: 'axis',
                        formatter: function (params) {
                            // params æ˜¯ä¸€ä¸ªæ•°ç»„,这里只有一条数据
                            const data = params[0];
                            const start = new Date(data.value[0]);
                            const end = new Date(data.value[1]);
                            // æ ¼å¼åŒ–时间显示
                            return `${data.name}<br/>${start.toLocaleTimeString()} ~ ${end.toLocaleTimeString()}`;
                        }
                    },
                    // ç½‘格(调整图表内边距,给Y轴和X轴标签留出空间)
                    grid: {
                        left: '3%',
                        right: '4%',
                        bottom: '3%',
                        containLabel: true
                    },
                    // X轴配置:时间轴
                    xAxis: {
                        type: 'time', // å…³é”®ï¼šæ—¶é—´ç±»åž‹è½´
                        min: baseTime, // å›ºå®šæœ€å°æ—¶é—´ï¼š14:00
                        max: endTime,  // å›ºå®šæœ€å¤§æ—¶é—´ï¼šæ¬¡æ—¥12:00
                        axisLabel: {
                            // æ ¼å¼åŒ–X轴标签显示为 14:00, 16:00 æ ¼å¼
                            formatter: function (value) {
                                const date = new Date(value);
                                return `${date.getHours()}:${String(date.getMinutes()).padStart(2, '0')}`;
                            },
                            interval: 2 * 3600 * 1000 // æ¯2小时显示一个刻度(对应14, 16, 18...)
                        },
                        axisLine: { show: true },
                        splitLine: { show: true }
                    },
                    // Y轴配置:类目轴
                    yAxis: {
                        type: 'category',
                        data: yAxisData,
                        axisLine: { show: false },
                        axisTick: { show: false } // éšè—Y轴刻度线
                    },
                    // ç³»åˆ—数据
                    series: [
                        {
                            name: ['运行', '开机', '停机', '告警', '关机'],
                            type: 'bar', // ä½¿ç”¨æŸ±çŠ¶å›¾å®žçŽ°ç”˜ç‰¹å›¾æ•ˆæžœ
                            barWidth: '80%', // æŸ±å­é«˜åº¦
                            // æ•°æ®æ˜ å°„:将时间戳数据关联到Xè½´
                            encode: {
                                x: [0, 1], // value çš„第0项作为起始,第1项作为结束
                                y: 2       // value çš„第2项作为Y轴类目
                            },
                            // å…·ä½“数据
                            data: seriesData,
                            // çŠ¶æ€é¢œè‰²æ˜ å°„
                            itemStyle: {
                                color: function (params) {
                                    // æ ¹æ®æ•°æ®åç§°åŒ¹é…é¢œè‰²
                                    const name = params.data[2];
                                    const colorMap = {
                                        '运行': '#67C23A',
                                        '运行中': '#67C23A',
                                        '开机': '#409EFF',
                                        '停机': '#E6A23C',
                                        '告警': '#F56C6C',
                                        '关机': '#909399',
                                        '维修中': '#F56C6C',
                                        '维护中': '#F56C6C'
                                    };
                                    return colorMap[name] || '#ccc';
                                }
                            },
                            // æŸ±å­ä¸Šä¸æ˜¾ç¤ºæ–‡å­—标签
                            label: { show: false }
                        }
                    ]
                };
                // å¦‚果有数据,更新option的内容
                if (chartData1 && chartData1.length > 0) {
                } else {
                    // æ²¡æœ‰æ•°æ®æ—¶ï¼Œæ˜¾ç¤º"暂无数据"提示
                    chartsOption.title.text = '暂无数据';
                }
                // æ›´æ–°å›¾è¡¨
                mychart22.setOption(chartsOption);
            }
            function get_Display() {
                var HBeginDate = $("#HBeginDate").val()
                var HEndDate = $("#HEndDate").val()
                sWhere = get_sWhere()
                var sWhere2 = ""
                if (HBeginDate && HEndDate) {
                    sWhere2 += " and StartTime BETWEEN CAST('" + HBeginDate + "' AS DATETIME)" +
                        " AND DATEADD(MILLISECOND, -3, DATEADD(DAY, 1, CAST('" + HEndDate + "' AS DATETIME))) "
                }
                // èŽ·å–è®¾å¤‡æ¡£æ¡ˆ
                $.ajax({
                    url: GetWEBURL() + '/Gy_EquipFileMain/GetList',
                    type: "GET",
                    data: { "user": sessionStorage["HUserName"], sWhere: " and hmainid = " + HEquipID },
                    dataType: "json",//数据类型可以为 text xml json  script  jsonp
                    success: function (data) {
                        if (data.count == 1) {
                            $("#HEquipName").text(data.data[0]["设备名称"])
                            $("#HDeptName").text(data.data[0]["使用部门"])
                            $("#HEquipStatus").text(data.data[0]["当前状态"])
                            $("#HDate").text(util.toDateString(new Date(), 'MM月dd日'))
                        }
                        else {
                            layer.alert(data.Message, { time: 1 * 2000, icon: 5 });
                            return false;
                        }
                    },
                    error: function (err) {
                        layer.alert(err.Message, { time: 1 * 2000, icon: 5 });
                        return false;
                    }
                });
                // èŽ·å–è®¾å¤‡è¿è¡Œæ—¶åºä¿¡æ¯
                $.ajax({
                    url: GetWEBURL() + '/SB_EquipRunningStatus/ReportByID',
                    type: "GET",
                    data: { "HEquipID": HEquipID, "sWhere": sWhere2, "user": sessionStorage["HUserName"] },
                    dataType: "json",//数据类型可以为 text xml json  script  jsonp
                    success: function (data) {
                        console.log(data)
                        if (data.count == 1) {
                            var EquipRunningStatusCharts = echarts.init(document.getElementById("EquipRunningStatusCharts"))
                            get_LineChart(EquipRunningStatusCharts, data.data);//折线
                        } else {
                            layer.alert(data.Message, { time: 1 * 2000, icon: 5 });
                            return false;
                        }
                    },
                    error: function (err) {
                        layer.alert(err.Message, { time: 1 * 2000, icon: 5 });
                        return false;
                    }
                });
                // èŽ·å–æœ€è¿‘10条安灯(警报记录)
                $.ajax({
                    url: GetWEBURL() + '/Sc_MESTransFerWorkBill/Get_TransFerBillListByHEquipID',
                    type: "GET",
                    data: { "HEquipID": HEquipID, sWhere: sWhere },
                    dataType: "json",//数据类型可以为 text xml json  script  jsonp
                    success: function (data) {
                        var LoadData1 = data.data.OA_ErrMsgBackBillMain;
                        if (data.code == 1)  //工单列表数据
                        {
                            option.data = LoadData1;
                            table.render(option)
                        } else {
                            layer.alert(data.msg, { time: 1 * 2000, icon: 5 });
                            return false;
                        }
                    },
                    error: function (err) {
                        layer.alert(err.Message, { time: 1 * 2000, icon: 5 });
                        return false;
                    }
                });
            }
            function get_sWhere() {
                var sWhereStr = ""
                var HBeginDate = $("#HBeginDate").val()
                var HEndDate = $("#HEndDate").val()
                if (HBeginDate && HEndDate) {
                    sWhereStr += " and a.HDate BETWEEN CAST('" + HBeginDate + "' AS DATETIME)" +
                        " AND DATEADD(MILLISECOND, -3, DATEADD(DAY, 1, CAST('" + HEndDate + "' AS DATETIME))) "
                }
                return sWhereStr
            }
            // #endregion
            function getUrlVars() {
                var vars = [], hash;
                var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
                for (var i = 0; i < hashes.length; i++) {
                    hash = hashes[i].split('=');
                    vars.push(hash[0]);
                    vars[hash[0]] = hash[1];
                }
                return vars;
            }
            //#endregion
        })
    </script>
</body>
</html>
WebTM/views/Ä£Öξ߹ÜÀí/Æ÷¾ß±¨±í/Sc_MouldDailyUseReport.html
New file
@@ -0,0 +1,829 @@
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>每日使用情况报表</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../../layuiadmin/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../../layuiadmin/style/admin.css" media="all">
    <script src="../../../layuiadmin/layui/layui.js"></script>
    <script src="../../../layuiadmin/Scripts/json2.js"></script>
    <script src="../../../layuiadmin/Scripts/jquery-1.4.1.js"></script>
    <script src="../../../layuiadmin/Scripts/webConfig.js"></script>
    <script src="../../../layuiadmin/PubCustom.js"></script>
    <script src="../../../layuiadmin/zgqCustom/zgqCustom.js"></script>
    <script src="../../../layuiadmin/HideButton.js"></script>
    <script src='../../../layuiadmin/lib/extend/echarts.min.js'></script>
    <style type="text/css">
        * { margin: 0; padding: 0; box-sizing: border-box; }
        html, body { height: 100%; }
        .page-container {
            height: 100%;
            padding: 10px;
            background: linear-gradient(180deg, #eef2f5 0%, #e4e8eb 100%);
            display: flex;
            flex-direction: column;
        }
        .query-bar {
            background: #fff;
            padding: 10px 15px;
            border-radius: 6px;
            margin-bottom: 10px;
            box-shadow: 0 1px 4px rgba(0,0,0,0.08);
            flex-shrink: 0;
        }
        .summary-row {
            display: flex;
            flex-wrap: wrap;
            margin-bottom: 10px;
            flex-shrink: 0;
        }
        .chart-container {
            background: #fff;
            border-radius: 6px;
            padding: 8px;
            box-shadow: 0 1px 4px rgba(0,0,0,0.08);
            flex: 1;
            overflow: hidden;
            min-height: 0;
        }
        .chart-row { display: flex; height: 100%; }
        .chart-box { flex: 1; margin: 4px; border: 1px solid #eee; border-radius: 4px; background: #fafbfc; }
        /* æ±‡æ€»ç»Ÿè®¡å¡ç‰‡æ ·å¼ */
        .summary-card {
            margin: 4px;
            border: 1px solid #eee;
            border-radius: 4px;
            background: #fafbfc;
            text-align: center;
            padding: 8px 4px;
            min-width: 200px;
        }
        .summary-card.total-card {
            background: linear-gradient(135deg, #1e9fff 0%, #5fb3ff 100%);
            border-color: #1e9fff;
        }
        .summary-card.total-card .summary-number,
        .summary-card.total-card .summary-label { color: #fff; }
        .summary-number { font-size: 16px; font-weight: bold; color: #1e9fff; }
        .summary-label { font-size: 11px; color: #888; margin-top: 2px; }
    </style>
</head>
<body>
    <div class="page-container">
        <!-- æŸ¥è¯¢æ  -->
        <div class="query-bar">
            <form class="layui-form" action="" lay-filter="component-form-group">
                <div class="layui-inline">
                    <label class="layui-form-label" style="width: 75px;">开始日期</label>
                    <div class="layui-input-inline">
                        <input type="date" class="layui-input" id="HBeginDate" style="width:140px;">
                    </div>
                </div>
                <div class="layui-inline">
                    <label class="layui-form-label" style="width: 75px;">结束日期</label>
                    <div class="layui-input-inline">
                        <input type="date" class="layui-input" id="HEndDate" style="width:140px;">
                    </div>
                </div>
                <button class="layui-btn layuiadmin-btn-order" type="button" lay-submit="" lay-filter="btnSearch" id="btnSearch">
                    <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>查询
                </button>
                <button class="layui-btn layui-btn-primary layuiadmin-btn-order" type="button" lay-submit="" lay-filter="btnReSearch" id="btnReSearch">重置</button>
            </form>
        </div>
        <!-- æ±‡æ€»ç»Ÿè®¡ï¼ˆåŠ¨æ€ç”Ÿæˆï¼‰ -->
        <div class="summary-row" id="summaryRow"></div>
        <!-- å›¾è¡¨åŒºåŸŸï¼ˆåŠ¨æ€ç”Ÿæˆï¼‰ -->
        <div class="chart-container" id="chartContainer"></div>
    </div>
    <script>
        layui.config({
            base: '../../../layuiadmin/'
        }).extend({
            index: 'lib/index',
        }).use(['index', 'form', 'element'], function () {
            var $ = layui.$, layer = layui.layer, form = layui.form;
            var chartInstances = {};
            var chartConfigKeys = []; // å­˜å‚¨é…ç½®key顺序
            //#region ========== å›¾è¡¨é…ç½®ï¼ˆæ–°å¢žå›¾è¡¨åªéœ€åœ¨æ­¤å¤„添加配置)==========
            /*
             * é…ç½®è¯´æ˜Žï¼š
             * - chartTitle: å›¾è¡¨æ ‡é¢˜
             * - chartType: å›¾è¡¨ç±»åž‹ (pie/bar)
             * - chartColors: å›¾è¡¨é¢œè‰²æ•°ç»„
             * - api: æŽ¥å£é…ç½®
             *   - url: æŽ¥å£åœ°å€
             *   - method: è¯·æ±‚方法 (GET/POST)
             *   - buildParams: æž„建参数的函数(beginDate, endDate)
             *   - dataPath: æ•°æ®åœ¨è¿”回结果中的路径,如 'data' æˆ– 'data.list'
             *   - successCode: æˆåŠŸçš„çŠ¶æ€ç 
             * - statusMap: çŠ¶æ€æ˜ å°„é…ç½®
             *   - name: çŠ¶æ€åç§°
             *   - condition: åˆ¤æ–­æ¡ä»¶è¡¨è¾¾å¼
             *
             * æ–°å¢žå›¾è¡¨åªéœ€åœ¨æ­¤å¤„添加配置,页面会自动生成对应的汇总卡片和图表
             */
            var ChartConfig = {
                // é¢†ç”¨å•
                lingyong: {
                    chartTitle: '领用单统计',
                    chartType: 'pie',
                    chartColors: ['#5470c6', '#91cc75', '#fac858', '#ee6666'],
                    api: {
                        url: '/Sc_MouldProdOutBillController/page',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'" + " and å¾€æ¥ç±»åž‹='部门'",
                                user: sessionStorage["HUserName"] || '',
                                page: 1,
                                size: 999999,
                                Type: '3802'
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null && (关闭人=="" || å…³é—­äºº==null)' },
                        { name: '已关闭', condition: '关闭人!="" && å…³é—­äºº!=null' }
                    ]
                },
                // é€€åº“单
                tuiku: {
                    chartTitle: '退库单统计',
                    chartType: 'pie',
                    chartColors: ['#73c0de', '#3ba272', '#fc8452', '#9a60b4'],
                    api: {
                        url: '/Sc_MouldProdBackBillController/page',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'" + " and å¾€æ¥ç±»åž‹='部门'",
                                user: sessionStorage["HUserName"] || '',
                                page: 1,
                                size: 999999,
                                Type: '3803'
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '已关闭', condition: '关闭人!="" && å…³é—­äºº!=null' }
                    ]
                },
                // è°ƒæ‹¨å•
                diaobo: {
                    chartTitle: '调拨单统计',
                    chartType: 'pie',
                    chartColors: ['#ea7ccc', '#5470c6', '#91cc75', '#fac858'],
                    api: {
                        url: '/Sc_MouldProdMoveBillController/page',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'",
                                user: sessionStorage["HUserName"] || '',
                                page: 1,
                                size: 999999,
                                Type: '3814'
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '已关闭', condition: '关闭人!="" && å…³é—­äºº!=null' }
                    ]
                },
                // å€Ÿå‡ºå•
                jiechu: {
                    chartTitle: '借出单统计',
                    chartType: 'pie',
                    chartColors: ['#fc8452', '#73c0de', '#3ba272', '#ee6666'],
                    api: {
                        url: '/Sc_MouldProdOutBillController/page',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'" + " and å¾€æ¥ç±»åž‹='供应商'",
                                user: sessionStorage["HUserName"] || '',
                                page: 1,
                                size: 999999,
                                Type: '3802'
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '已关闭', condition: '关闭人!="" && å…³é—­äºº!=null' }
                    ]
                },
                // å½’还单
                guihuan: {
                    chartTitle: '归还单统计',
                    chartType: 'pie',
                    chartColors: ['#9a60b4', '#ea7ccc', '#5470c6', '#fac858'],
                    api: {
                        url: '/Sc_MouldProdBackBillController/page',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'" + " and å¾€æ¥ç±»åž‹='供应商'",
                                user: sessionStorage["HUserName"] || '',
                                page: 1,
                                size: 999999,
                                Type: '3803'
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '已关闭', condition: '关闭人!="" && å…³é—­äºº!=null' }
                    ]
                },
                // ä¸Šæ¨¡å•
                shangmo: {
                    chartTitle: '上模单统计',
                    chartType: 'pie',
                    chartColors: ['#3ba272', '#fc8452', '#73c0de', '#ee6666'],
                    api: {
                        url: '/Sc_MouldUpperBill/Sc_MouldUpperBillListPage',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'",
                                user: sessionStorage["HUserName"] || '',
                                page: 1,
                                size: 999999
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '已关闭', condition: '关闭人!="" && å…³é—­äºº!=null' }
                    ]
                },
                // ä¸‹æ¨¡å•
                xiamo: {
                    chartTitle: '下模单统计',
                    chartType: 'pie',
                    chartColors: ['#5470c6', '#91cc75', '#fac858', '#ee6666'],
                    api: {
                        url: '/Sc_MouldUpperBill/Sc_MouldLowerBillListPage',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'",
                                user: sessionStorage["HUserName"] || '',
                                page: 1,
                                size: 999999
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '已关闭', condition: '关闭人!="" && å…³é—­äºº!=null' }
                    ]
                },
                // ä¿å…»è®°å½•
                baoyang: {
                    chartTitle: '保养记录统计',
                    chartType: 'pie',
                    chartColors: ['#73c0de', '#3ba272', '#fc8452', '#ee6666'],
                    api: {
                        url: '/Sc_MouldMaintainBill/GetMouldMaintainBillListPage',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'",
                                user: sessionStorage["HUserName"] || '',
                                page: 1,
                                size: 999999
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '待保养', condition: '1==1' }
                    ]
                },
                // ç‚¹æ£€è®°å½•
                dianjian: {
                    chartTitle: '点检记录统计',
                    chartType: 'pie',
                    chartColors: ['#91cc75', '#fac858', '#5470c6', '#ee6666'],
                    api: {
                        url: '/Sc_MouldDotCheckBill/GetMouldDotCheckBillListPage',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'",
                                user: sessionStorage["HUserName"] || '',
                                page: 1,
                                size: 999999
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '异常', condition: '1==1' }
                    ]
                },
                // ç»´ä¿®è®°å½•
                weixiu: {
                    chartTitle: '维修记录统计',
                    chartType: 'pie',
                    chartColors: ['#3ba272', '#fc8452', '#73c0de', '#9a60b4'],
                    api: {
                        url: '/Sb_MouldRepairWorkBill/GetMouldRepairWorkBillListPage',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'",
                                user: sessionStorage["HUserName"] || '',
                                page: 1,
                                size: 999999
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '已关闭', condition: '关闭人!="" && å…³é—­äºº!=null' }
                    ]
                },
                // å¯¿å‘½è°ƒæ•´å•
                shoumingtiaozheng: {
                    chartTitle: '寿命调整单',
                    chartType: 'pie',
                    chartColors: ['#5470c6', '#fac858', '#ee6666', '#73c0de'],
                    api: {
                        url: '/Sc_MouldLifeChangeBill/page',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'",
                                user: sessionStorage["HUserName"] || '',
                                Organization: sessionStorage["Organization"] || '',
                                page: 1,
                                size: 999999
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '已关闭', condition: '关闭人!="" && å…³é—­äºº!=null' }
                    ]
                },
                // å¯¿å‘½è€—用单
                shouminghaoyon: {
                    chartTitle: '寿命耗用单',
                    chartType: 'pie',
                    chartColors: ['#91cc75', '#3ba272', '#fc8452', '#ea7ccc'],
                    api: {
                        url: '/Sc_MouldLifeUseBill/page',
                        method: 'GET',
                        buildParams: function(beginDate, endDate) {
                            return {
                                sWhere: " and æ—¥æœŸ between '" + beginDate + "' and '" + endDate + "'",
                                user: sessionStorage["HUserName"] || '',
                                Organization: sessionStorage["Organization"] || '',
                                page: 1,
                                size: 999999
                            };
                        },
                        dataPath: 'data',
                        successCode: 1
                    },
                    statusMap: [
                        { name: '创建', condition: '审核人=="" || å®¡æ ¸äºº==null' },
                        { name: '已审核', condition: '审核人!="" && å®¡æ ¸äºº!=null' },
                        { name: '已关闭', condition: '关闭人!="" && å…³é—­äºº!=null' }
                    ]
                }
            };
            //#endregion
            //#region ========== åŠ¨æ€ç”Ÿæˆé¡µé¢ç»“æž„ ==========
            /**
             * æ ¹æ®ChartConfig动态生成汇总卡片和图表容器
             */
            function generatePageStructure() {
                // èŽ·å–é…ç½®key顺序
                chartConfigKeys = [];
                for (var key in ChartConfig) {
                    chartConfigKeys.push(key);
                }
                var chartCount = chartConfigKeys.length;
                // ç”Ÿæˆæ±‡æ€»å¡ç‰‡
                generateSummaryCards(chartCount);
                // ç”Ÿæˆå›¾è¡¨å®¹å™¨
                generateChartBoxes(chartCount);
                // è®¡ç®—高度
                calculateHeights(chartCount);
            }
            /**
             * ç”Ÿæˆæ±‡æ€»å¡ç‰‡
             */
            function generateSummaryCards(chartCount) {
                var $summaryRow = $('#summaryRow');
                $summaryRow.empty();
                // æ€»è®¡å¡ç‰‡
                var cardWidth = calculateCardWidth(chartCount + 1);
                $summaryRow.append('<div class="summary-card total-card" id="card-total" style="width:' + cardWidth + '">' +
                    '<div class="summary-number">0</div><div class="summary-label">总计</div></div>');
                // å„类型卡片
                for (var i = 0; i < chartConfigKeys.length; i++) {
                    var key = chartConfigKeys[i];
                    var config = ChartConfig[key];
                    var label = config.chartTitle.replace('统计', '').replace('单', '');
                    $summaryRow.append('<div class="summary-card" id="card-' + key + '" style="width:' + cardWidth + '">' +
                        '<div class="summary-number">0</div><div class="summary-label">' + label + '</div></div>');
                }
            }
            /**
             * è®¡ç®—卡片宽度
             */
            function calculateCardWidth(count) {
                // æ¯è¡Œæœ€å¤š12个,根据数量计算宽度
                var perRow = Math.min(count, 12);
                return 'calc(' + (100 / perRow) + '% - 8px)';
            }
            /**
             * ç”Ÿæˆå›¾è¡¨å®¹å™¨ï¼ˆæ¯è¡Œ4个)
             */
            function generateChartBoxes(chartCount) {
                var $chartContainer = $('#chartContainer');
                $chartContainer.empty();
                var colsPerRow = 4; // æ¯è¡Œ4个图表
                var rows = Math.ceil(chartCount / colsPerRow);
                for (var row = 0; row < rows; row++) {
                    var $rowDiv = $('<div class="chart-row"></div>');
                    for (var col = 0; col < colsPerRow; col++) {
                        var index = row * colsPerRow + col;
                        if (index < chartCount) {
                            var key = chartConfigKeys[index];
                            $rowDiv.append('<div class="chart-box" id="chart-' + key + '"></div>');
                        } else {
                            // å¡«å……空白盒子保持布局
                            $rowDiv.append('<div class="chart-box" style="visibility:hidden;"></div>');
                        }
                    }
                    $chartContainer.append($rowDiv);
                }
            }
            /**
             * è®¡ç®—各部分高度
             */
            function calculateHeights(chartCount) {
                var rows = Math.ceil(chartCount / 4);
                // chart-container已通过flex:1自动填充,只需设置每行高度
                $('.chart-row').css('height', (100 / rows) + '%');
            }
            //#endregion
            //#region ========== é€šç”¨æ•°æ®èŽ·å–æ–¹æ³• ==========
            function getValueByPath(obj, path) {
                if (!path) return obj;
                var keys = path.split('.');
                var result = obj;
                for (var i = 0; i < keys.length; i++) {
                    if (result && result[keys[i]] !== undefined) {
                        result = result[keys[i]];
                    } else {
                        return null;
                    }
                }
                return result;
            }
            function fetchChartData(chartKey, beginDate, endDate) {
                var config = ChartConfig[chartKey];
                if (!config) return Promise.resolve([]);
                return new Promise(function(resolve) {
                    var params = {};
                    if (config.api.buildParams) {
                        params = config.api.buildParams(beginDate, endDate);
                    }
                    $.ajax({
                        url: GetWEBURL() + config.api.url,
                        type: config.api.method || 'GET',
                        data: params,
                        success: function(result) {
                            var successCode = config.api.successCode || 1;
                            var dataPath = config.api.dataPath || 'data';
                            if (result.code == successCode || result.count == successCode) {
                                var data = getValueByPath(result, dataPath);
                                resolve(data || []);
                            } else {
                                resolve([]);
                            }
                        },
                        error: function() {
                            resolve([]);
                        }
                    });
                });
            }
            function countByStatusConfig(dataList, config) {
                var result = [];
                var statusMap = config.statusMap;
                for (var i = 0; i < statusMap.length; i++) {
                    var statusItem = statusMap[i];
                    var count = 0;
                    for (var j = 0; j < dataList.length; j++) {
                        if (evalCondition(dataList[j], statusItem.condition)) {
                            count++;
                        }
                    }
                    result.push({
                        name: statusItem.name,
                        value: count
                    });
                }
                return result;
            }
            function evalCondition(item, condition) {
                if (!condition) return true;
                if (condition.indexOf('==""') > -1 || condition.indexOf('==null') > -1) {
                    var fieldMatch = condition.match(/(\S+)==""/);
                    if (fieldMatch) {
                        var field = fieldMatch[1];
                        return !item[field] || item[field] === '';
                    }
                }
                if (condition.indexOf('!=""') > -1 || condition.indexOf('!=null') > -1) {
                    var notEmptyMatch = condition.match(/(\S+)!=""/);
                    if (notEmptyMatch) {
                        var field = notEmptyMatch[1];
                        return item[field] && item[field] !== '';
                    }
                }
                var equalMatch = condition.match(/(\S+)==\"([^\"]+)\"/);
                if (equalMatch) {
                    var field = equalMatch[1];
                    var value = equalMatch[2];
                    return item[field] === value;
                }
                return condition === '1==1';
            }
            function fetchAllChartData(beginDate, endDate) {
                var promises = [];
                var results = {};
                for (var i = 0; i < chartConfigKeys.length; i++) {
                    var key = chartConfigKeys[i];
                    (function(chartKey) {
                        var promise = fetchChartData(chartKey, beginDate, endDate).then(function(data) {
                            results[chartKey] = countByStatusConfig(data, ChartConfig[chartKey]);
                        });
                        promises.push(promise);
                    })(key);
                }
                return Promise.all(promises).then(function() {
                    return results;
                });
            }
            //#endregion
            //#region ========== å›¾è¡¨æ¸²æŸ“ ==========
            function renderPieChart(chartId, title, data, colors) {
                var chartDom = document.getElementById(chartId);
                if (!chartDom) return;
                var chart = echarts.init(chartDom);
                chartInstances[chartId] = chart;
                var pieData = data.map(function(item) {
                    return { name: item.name, value: item.value };
                });
                chart.setOption({
                    title: {
                        text: title,
                        left: 'center',
                        top: 5,
                        textStyle: { fontSize: 12, fontWeight: 'bold' }
                    },
                    tooltip: {
                        trigger: 'item',
                        formatter: '{b}: {c} ({d}%)'
                    },
                    series: [{
                        type: 'pie',
                        radius: ['30%', '50%'],
                        center: ['50%', '55%'],
                        data: pieData,
                        itemStyle: { borderRadius: 3, borderColor: '#fff', borderWidth: 1 },
                        label: { show: true, fontSize: 10, formatter: '{b}\n{c}' },
                        color: colors || ['#91cc75', '#fac858', '#ee6666', '#73c0de']
                    }]
                });
            }
            function renderAllCharts(data) {
                for (var i = 0; i < chartConfigKeys.length; i++) {
                    var key = chartConfigKeys[i];
                    var config = ChartConfig[key];
                    if (config.chartType === 'pie') {
                        renderPieChart('chart-' + key, config.chartTitle, data[key] || [], config.chartColors);
                    }
                }
                updateSummaryCards(data);
            }
            function updateSummaryCards(data) {
                var grandTotal = 0;
                for (var i = 0; i < chartConfigKeys.length; i++) {
                    var key = chartConfigKeys[i];
                    var config = ChartConfig[key];
                    var total = 0;
                    if (data[key]) {
                        for (var j = 0; j < data[key].length; j++) {
                            total += data[key][j].value;
                        }
                    }
                    grandTotal += total;
                    $('#card-' + key).find('.summary-number').text(total);
                }
                $('#card-total').find('.summary-number').text(grandTotal);
            }
            //#endregion
            //#region ========== äº‹ä»¶ç»‘定 ==========
            form.on('submit(btnReSearch)', function(data) {
                set_ClearQuery();
            });
            form.on('submit(btnSearch)', function(data) {
                get_FastQuery();
            });
            function set_ClearBill() {
                // å…ˆç”Ÿæˆé¡µé¢ç»“æž„
                generatePageStructure();
                // è®¾ç½®æ—¥æœŸå¹¶æŸ¥è¯¢
                var today = Format(new Date(), "yyyy-MM-dd");
                $("#HBeginDate").val(Format(new Date(new Date().setDate(new Date().getDate() - 5)), "yyyy-MM-dd"));
                $("#HEndDate").val(today);
                get_FastQuery();
            }
            function get_FastQuery() {
                var wait = layer.load();
                var beginDate = $("#HBeginDate").val();
                var endDate = $("#HEndDate").val();
                fetchAllChartData(beginDate, endDate).then(function(statsData) {
                    var hasData = false;
                    for (var i = 0; i < chartConfigKeys.length; i++) {
                        var key = chartConfigKeys[i];
                        if (statsData[key] && statsData[key].length > 0) {
                            var sum = 0;
                            for (var j = 0; j < statsData[key].length; j++) {
                                sum += statsData[key][j].value;
                            }
                            if (sum > 0) {
                                hasData = true;
                                break;
                            }
                        }
                    }
                    if (hasData) {
                        renderAllCharts(statsData);
                    } else {
                        renderAllCharts(getMockData());
                    }
                    layer.close(wait);
                }).catch(function() {
                    renderAllCharts(getMockData());
                    layer.close(wait);
                });
            }
            function set_ClearQuery() {
                var today = Format(new Date(), "yyyy-MM-dd");
                $("#HBeginDate").val(today);
                $("#HEndDate").val(today);
                get_FastQuery();
            }
            //#endregion
            //#region ========== æ¨¡æ‹Ÿæ•°æ® ==========
            function getMockData() {
                var mockData = {};
                for (var i = 0; i < chartConfigKeys.length; i++) {
                    var key = chartConfigKeys[i];
                    var config = ChartConfig[key];
                    mockData[key] = [];
                    for (var j = 0; j < config.statusMap.length; j++) {
                        mockData[key].push({
                            name: config.statusMap[j].name,
                            value: Math.floor(Math.random() * 20) + 5
                        });
                    }
                }
                return mockData;
            }
            //#endregion
            // åˆå§‹åŒ–
            set_ClearBill();
            // çª—口大小变化时重新渲染图表
            window.onresize = function() {
                setTimeout(function() {
                    for (var key in chartInstances) {
                        if (chartInstances[key]) {
                            chartInstances[key].resize();
                        }
                    }
                }, 100);
            };
        });
    </script>
</body>
</html>
WebTM/views/Ä£Öξ߹ÜÀí/Æ÷¾ß±¨±í/Sc_MouldMonthUseReport.html
New file
@@ -0,0 +1,541 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>模具使用情况报表</title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <!-- æ³¨æ„ï¼šæ‰€æœ‰å¼•用路径保持与原项目一致,确保功能完整 -->
    <script src="../../../layuiadmin/Scripts/json2.js"></script>
    <script src="../../../layuiadmin/Scripts/jquery-1.4.1.js"></script>
    <script src="../../../layuiadmin/Scripts/webConfig.js"></script>
    <script src="../../../layuiadmin/PubCustom.js"></script>
    <script src="../../../layuiadmin/zgqCustom/zgqCustom.js"></script>
    <link rel="stylesheet" href="../../../layuiadmin/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../../layuiadmin/style/admin.css" media="all">
    <link rel="stylesheet" href="../../../layuiadmin/ext/soulTable.css" media="all">
    <script src="../../../layuiadmin/layui/layui.js"></script>
    <script src="../../../layuiadmin/SetColumn.js"></script>
</head>
<body>
    <div class="layui-fluid">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body">
                    <form class="layui-form" action="" lay-filter="component-form-group" autocomplete="off">
                        <div class="layui-collapse">
                            <div class="layui-colla-item">
                                <div class="layui-colla-title layui-inline">
                                    <div class="layui-inline">
                                        <span>更多</span>
                                    </div>
                                </div>
                                <!-- ç”Ÿäº§è½¦é—´ -->
                                <!--<div class="layui-inline">
                                    <label class="layui-form-label">生产车间</label>
                                    <div class="layui-input-block">
                                        <select name="HDeptID" id="HDeptID" lay-verify="required" lay-search class="layui-input ForFilteringSchemes">-->
                                            <!-- åŠ¨æ€æ¸²æŸ“è½¦é—´ -->
                                        <!--</select>
                                    </div>
                                </div>-->
                                <!-- ç‰©æ–™ -->
                                <div class="layui-inline">
                                    <label class="layui-form-label">模具</label>
                                    <div class="layui-input-inline">
                                        <input type="text" class="layui-input" name="HMouldNumber" id="HMouldNumber" style="float:left;width:150px;">
                                        <input type="hidden" class="layui-input" name="HMouldID" id="HMouldID" value="0">
                                        <button type="button" lay-submit="" class="layui-btn" lay-filter="HMaterList" style="width:40px;">
                                            <i class="layui-icon layui-icon-search layuiadmin-button-btn" style="margin-left:-9px;"></i>
                                        </button>
                                    </div>
                                </div>
                                <!--<div class="layui-inline">
                                    <label class="layui-form-label">费用项目</label>
                                    <div class="layui-input-inline">
                                        <input type="text" class="layui-input" name="HItMoneyName" id="HItMoneyName" style="float:left;width:150px;">
                                        <input type="hidden" class="layui-input" name="HItMoneyID" id="HItMoneyID" value="0">
                                        <button type="button" lay-submit="" class="layui-btn" lay-filter="HItemMoneyList" style="width:40px;">
                                            <i class="layui-icon layui-icon-search layuiadmin-button-btn" style="margin-left:-9px;"></i>
                                        </button>
                                    </div>
                                </div>-->
                                <!--<div class="layui-inline">
                                    <label class="layui-form-label">成本对象 </label>
                                    <div class="layui-input-inline">
                                        <input type="text" class="layui-input" name="HCostObjectName" id="HCostObjectName" style="float:left;width:150px;">
                                        <input type="hidden" class="layui-input" name="HCostObjectID" id="HCostObjectID" value="0">
                                        <button type="button" lay-submit="" class="layui-btn" lay-filter="HCostobjList" style="width:40px;">
                                            <i class="layui-icon layui-icon-search layuiadmin-button-btn" style="margin-left:-9px;"></i>
                                        </button>
                                    </div>
                                </div>-->
                                <!--<div class="layui-inline">
                                    <label class="layui-form-label">工序</label>
                                    <div class="layui-input-inline">
                                        <input type="text" class="layui-input" name="HProcName" id="HProcName" style="float:left;width:150px;">
                                        <input type="hidden" class="layui-input" name="HProcID" id="HProcID" value="0">
                                        <button type="button" lay-submit="" class="layui-btn" lay-filter="HProcList" style="width:40px;">
                                            <i class="layui-icon layui-icon-search layuiadmin-button-btn" style="margin-left:-9px;"></i>
                                        </button>
                                    </div>
                                </div>-->
                                <!-- å¼€å§‹å¹´æœˆ -->
                                <div class="layui-inline" style="margin-left: 20px;">
                                    <label class="layui-form-label">开始年月</label>
                                    <div class="layui-input-inline">
                                        <input type="text" class="layui-input" id="ID-laydate-start-month" placeholder="选择开始年月" readonly>
                                    </div>
                                </div>
                                <!-- ç»“束年月 -->
                                <div class="layui-inline" style="margin-left: 20px;">
                                    <label class="layui-form-label">结束年月</label>
                                    <div class="layui-input-inline">
                                        <input type="text" class="layui-input" id="ID-laydate-end-month" placeholder="选择结束年月" readonly>
                                    </div>
                                </div>
                                <!-- æŸ¥è¯¢æŒ‰é’® -->
                                <button class="layui-btn layuiadmin-btn-order" type="button" lay-submit="" lay-filter="btnSearch" id="btnSearch">
                                    <i class="layui-icon layui-icon-search layuiadmin-button-btn"></i>
                                </button>
                                <!-- é‡ç½®æŒ‰é’® -->
                                <button class="layui-btn layuiadmin-btn-order" type="button" lay-submit="" lay-filter="btnReSearch" id="btnReSearch" style="padding:0 5px">重置</button>
                            </div>
                        </div>
                    </form>
                    <div style="margin-top: 10px;">
                        <table class="" id="mainTable" lay-filter="mainTable"></table>
                        <!-- è¡¨æ ¼å¤´å·¥å…·æ  -->
                        <script type="text/html" id="toolbarDemo">
                            <div class="layui-btn-container">
                                <button type="button" class="layui-btn layui-btn-sm" lay-event="btn-reload2"><i class="layui-icon layui-icon-refresh"></i>刷新</button>
                                <button type="button" class="layui-btn layui-btn-sm" lay-event="get_export2"><i class="layui-icon layui-icon-export"></i>导出</button>
                                <button type="button" class="layui-btn layui-btn-sm" lay-event="set_HideColumn2"><i class="layui-icon layui-icon-form"></i>列设置</button>
                                <button type="button" class="layui-btn layui-btn-sm" lay-event="set_SouceExcel" id="set_SouceExcel"><i class="layui-icon layui-icon-delete"></i>导入</button>
                            </div>
                        </script>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script>
        layui.config({
            base: '../../../layuiadmin/'
        }).extend({
            index: 'lib/index',
        }).use(['index', 'form', 'table', 'element', 'laydate', 'soulTable', 'tableSelect'], function () {
            var $ = layui.$,
                admin = layui.admin,
                layer = layui.layer,
                table = layui.table,
                form = layui.form,
                element = layui.element,
                laydate = layui.laydate,
                soulTable = layui.soulTable,
                tableSelect = layui.tableSelect;
            // æ¨¡å—名(用于列设置存储)
            var HModName = "Sc_MouldMonthUseReport";
            // è¡¨æ ¼é€‰é¡¹
            var option = {
                elem: '#mainTable',
                toolbar: '#toolbarDemo',
                height: 'full-120',      // é€‚当留出底部空间
                page: true,
                cellMinWidth: 90,
                totalRow: true,
                limit: 500,
                limits: [50, 500, 5000, 20000],
                done: function (res, curr, count) {
                    soulTable.render(this);
                },
                cols: [[]]
            };
            // å¯åŠ¨é¡µé¢
            initPage();
            function initPage() {
                // æ¸²æŸ“车间下拉框
                loadDeptSelect();
                // è®¾ç½®é»˜è®¤æ—¥æœŸ: å¼€å§‹å¹´æœˆä¸º7个月前,结束年月为今天
                var currentDate = new Date();
                var lastMonth = new Date(currentDate);
                lastMonth.setMonth(currentDate.getMonth() - 6);
                // æ–°å¢žï¼šæ¸²æŸ“开始年月选择器
                laydate.render({
                    elem: '#ID-laydate-start-month',
                    type: 'month',
                    format: 'yyyy-MM',
                    value: lastMonth,
                    done: function (value, date) {
                        // å¯ä»¥é€‰æ‹©åœ¨è¿™é‡Œè§¦å‘查询
                        // getFastQuery(2);
                    }
                });
                // æ–°å¢žï¼šæ¸²æŸ“结束年月选择器
                laydate.render({
                    elem: '#ID-laydate-end-month',
                    type: 'month',
                    format: 'yyyy-MM',
                    value: currentDate,
                    done: function (value, date) {
                        // å¯ä»¥é€‰æ‹©åœ¨è¿™é‡Œè§¦å‘查询
                        // getFastQuery(2);
                    }
                });
                getFastQuery(2);
                // é‡æ–°æ¸²æŸ“表单元素(select等)
                form.render('select');
            }
            // èŽ·å–è½¦é—´ä¸‹æ‹‰
            function loadDeptSelect() {
                $.ajax({
                    type: "GET",
                    url: GetWEBURL() + "/Sc_ICMOBill/GetHDeptList",
                    async: false,
                    data: { "HOrgID": sessionStorage["OrganizationID"] || 1 }, // é»˜è®¤ç»„织1
                    success: function (result) {
                        var html = '<option value="0" style="color:red;" selected>全部车间</option>';
                        if (result.count == 1 && result.data) {
                            var data = result.data;
                            for (var i = 0; i < data.length; i++) {
                                html += '<option style="color:blue;" value="' + data[i].HItemID + '">' + data[i].HName + '</option>';
                            }
                        }
                        $("#HDeptID").html(html);
                        form.render('select');
                    },
                    error: function () {
                        layer.alert('获取车间列表失败', { icon: 2 });
                    }
                });
            }
            // ä¿®æ”¹åŽçš„getFastQuery函数
            function getFastQuery(type) {
                // ä¿®æ”¹ï¼šä»Žå¹´æœˆé€‰æ‹©å™¨èŽ·å–å€¼ï¼Œè€Œä¸æ˜¯ä»Žæ—¥æœŸè¾“å…¥æ¡†
                var HStartYearMonth = $("#ID-laydate-start-month").val();
                var HEndYearMonth = $("#ID-laydate-end-month").val();
                // æ–°å¢žï¼šéªŒè¯æ˜¯å¦é€‰æ‹©äº†å¼€å§‹å¹´æœˆ
                if (!HStartYearMonth) {
                    layer.msg('请选择开始年月', { icon: 2 });
                    return;
                }
                // æ–°å¢žï¼šéªŒè¯æ˜¯å¦é€‰æ‹©äº†ç»“束年月
                if (!HEndYearMonth) {
                    layer.msg('请选择结束年月', { icon: 2 });
                    return;
                }
                // æ–°å¢žï¼šè§£æžå¼€å§‹å¹´æœˆä¸ºå¹´å’Œæœˆ
                var startParts = HStartYearMonth.split('-');
                var HStartYear = startParts[0];
                var HStartPeriod = startParts[1];
                // æ–°å¢žï¼šè§£æžç»“束年月为年和月
                var endParts = HEndYearMonth.split('-');
                var HEndYear = endParts[0];
                var HEndPeriod = endParts[1];
                // æ–°å¢žï¼šéªŒè¯å¹´æœˆèŒƒå›´æ˜¯å¦æœ‰æ•ˆ
                var startValue = parseInt(HStartYear) * 100 + parseInt(HStartPeriod);
                var endValue = parseInt(HEndYear) * 100 + parseInt(HEndPeriod);
                if (startValue > endValue) {
                    layer.msg('开始年月不能大于结束年月', { icon: 2 });
                    return;
                }
                var HCostObjID = $("#HMouldID").val() || '0';
                var HWorkShopID = $("#HDeptID").val() || '0';
                var HWorkShopID = $("#HDeptID").val() || '0';
                var HProcID = $("#HProcID").val() || '0';
                // ä¿®æ”¹ï¼šå­˜å‚¨è¿‡ç¨‹å‚数改为开始年、开始月、结束年、结束月、车间、物料
                var spParams = "'" + HStartYear + "','" + HStartPeriod + "','" +
                    HEndYear + "','" + HEndPeriod + "','" +
                    HWorkShopID + "','" + HCostObjID + "'" + ",'" + HProcID+"'";
                sWhere = spParams;
                if (type == 2) {
                    get_Display(spParams);
                }
            }
            // åŠ è½½é˜¶æ¢¯è®¡ä»¶æ•°æ®
            function get_Display(params) {
                var loadIndex = layer.load(1, { shade: false });
                var sql = "exec h_p_CB_ActualItemMoneyCost" + params;
                $.ajax({
                    url: GetWEBURL() + '/CB_ActualItemMoneyCostController/CB_ActualItemMoneyCostList',
                    type: "GET",
                    data: { "sWhere": sql },
                    success: function (data1) {
                        layer.close(loadIndex);
                        if (data1.count == 1) {
                            // è§£æžåˆ—定义
                            var colDefs = []; // å­˜æ”¾ {id, name, Type}
                            if (data1.list && data1.list.length > 0) {
                                for (var k in data1.list) {
                                    colDefs.push({
                                        id: data1.list[k].ColmCols,
                                        name: data1.list[k].ColmCols,
                                        Type: data1.list[k].ColmType
                                    });
                                }
                            }
                            // æž„建表格列
                            var cols = [];
                            // å¤šé€‰æ¡†åˆ—
                            cols.push({ type: 'checkbox', fixed: 'left', totalRowText: '合计' });
                            // è¾…助判断日期字段(形如"2025-02-20"),原代码用isValidDate但未定义,简单按字段名是否含横线判断,实际根据业务调整
                            for (var i = 0; i < colDefs.length; i++) {
                                var fieldName = colDefs[i].name;
                                var fieldId = colDefs[i].id;
                                var fieldType = colDefs[i].Type;
                                // é’ˆå¯¹é˜¶æ¢¯æŠ¥è¡¨ï¼Œæœ‰äº›åˆ—可能是动态日期(例如“02-20”),原代码用isValidDate判断,我们简单模拟:如果字段名包含 '-' ä¸”长度<=10 è§†ä¸ºæ—¥æœŸçŸ­åˆ—
                                var isShortDate = (fieldName.indexOf('-') > 0 && fieldName.length <= 10);
                                if (isShortDate) {
                                    // æ˜¾ç¤ºæˆ MM-dd æ ¼å¼ï¼ŒåŽŸä»£ç å°è¯•Format但未定义,此处直接显示原字段名
                                    cols.push({
                                        field: fieldId,
                                        title: fieldName,  // åŽŸä»£ç : Format(fieldName,'MM-dd') ä½†Format函数可能未引入,保持原样
                                        width: 70,
                                        totalRow: true,
                                        filter: true,
                                        align: 'center'
                                    });
                                } else if (fieldType == 'DateTime') {
                                    cols.push({
                                        field: fieldId,
                                        title: fieldName,
                                        align: 'center',
                                        sort: true,
                                        filter: true,
                                        templet: "<div>{{ d." + fieldId + " == '' ? '' : layui.util.toDateString(d." + fieldId + ", 'yyyy-MM-dd HH:mm:ss') }}</div>",
                                        width: 180
                                    });
                                } else {
                                    cols.push({
                                        field: fieldId,
                                        title: fieldName,
                                        align: 'center',
                                        sort: true,
                                        width: 150,
                                        filter: true
                                    });
                                }
                            }
                            // æ›´æ–°è¡¨æ ¼é…ç½®
                            option.cols = [cols];
                            option.data = data1.data || [];
                            // åº”用列隐藏设置(如果存在)
                            DisPlay_HideColumn(HModName, sessionStorage["HUserName"] || 'admin', option, []);
                            // æ¸²æŸ“表格
                            table.render(option);
                        } else {
                            layer.alert(data1.code + ' ' + data1.Message, { icon: 5 });
                        }
                    },
                    error: function () {
                        layer.close(loadIndex);
                        layer.alert("接口请求失败", { icon: 5 });
                    }
                });
            }
            // é‡ç½®è¿‡æ»¤æ¡ä»¶
            // ä¿®æ”¹åŽçš„clearQuery函数
            function clearQuery() {
                var currentDate = new Date();
                var lastMonth = new Date(currentDate);
                lastMonth.setMonth(currentDate.getMonth() - 7);
                // ä¿®æ”¹ï¼šé‡æ–°è®¾ç½®å¼€å§‹å¹´æœˆé€‰æ‹©å™¨çš„值
                laydate.render({
                    elem: '#ID-laydate-start-month',
                    type: 'month',
                    format: 'yyyy-MM',
                    value: lastMonth,
                    show: false  // ä¸æ˜¾ç¤ºé¢æ¿
                });
                // ä¿®æ”¹ï¼šé‡æ–°è®¾ç½®ç»“束年月选择器的值
                laydate.render({
                    elem: '#ID-laydate-end-month',
                    type: 'month',
                    format: 'yyyy-MM',
                    value: currentDate,
                    show: false  // ä¸æ˜¾ç¤ºé¢æ¿
                });
                $("#HDeptID").val(0);
                $("#HMouldID").val("0");
                $("#HMouldNumber").val("");
                $("#HProcID").val("0");
                $("#HProcName").val("");
                form.render('select');
            }
            // ---------- äº‹ä»¶ç»‘定 ----------
            // æŸ¥è¯¢æŒ‰é’®
            form.on('submit(btnSearch)', function () {
                getFastQuery(2);
                return false;
            });
            // é‡ç½®æŒ‰é’®
            form.on('submit(btnReSearch)', function () {
                clearQuery();
                getFastQuery(2);
                return false;
            });
            // ç­ç»„弹出框(保留原有弹窗方式,与tableSelect共存,优先使用tableSelect;同时支持弹窗选择)
            // èŒå‘˜å¼¹å‡ºæ¡† HItemMoneyList
            form.on('submit(HMaterList)', function () {
                openHMaterDialog();
                return false;
            });
            // æ‰“开模具 (原 get_checkEmp)
            function openHMaterDialog() {
                layer.open({
                    type: 2,
                    skin: 'layui-layer-rim',
                    title: '职',
                    closeBtn: 1,
                    shift: 2,
                    area: ['80%', '80%'],
                    maxmin: true,
                    content: ['../../模治具管理/模治具管理/Gy_MouldFileList.html?openType=2', 'yes'],
                    btn: ['确定', '取消'],
                    btn1: function (index, layero) {
                        var iframeWindow = window['layui-layer-iframe' + index];
                        var checkStatus = iframeWindow.layui.table.checkStatus('mainTable');
                        if (checkStatus.data.length === 0) {
                            return layer.msg('请选择数据');
                        }
                        $("#HMouldID").val(checkStatus.data[0].hmainid);
                        $("#HMouldNumber").val(checkStatus.data[0].模具名称);
                        layer.close(index);
                    }
                });
            }
            // å¤´å·¥å…·æ äº‹ä»¶ (mainTable)
            table.on('toolbar(mainTable)', function (obj) {
                switch (obj.event) {
                    case 'set_HideColumn2':
                        get_HideColumnNoPage(HModName, sessionStorage["HUserName"] || 'admin', option, function () { getFastQuery(2); });
                        break;
                    case 'btn-reload2':
                        getFastQuery(2);
                        break;
                    case 'get_export2':
                        exportExcel();
                        break;
                    //导入
                    case 'set_SouceExcel': set_SouceExcel();
                        break;
                    default:
                        break;
                }
            });
            // å¯¼å‡ºExcel (原 get_Export2)
            function exportExcel() {
                var ModRightNameCheck = "Pay_PaymentEntryReportExcel";
                $.ajax({
                    type: "GET",
                    url: GetWEBURL() + "/LMES/getReportByModRightNameCheck",
                    data: { "ModRightNameCheck": ModRightNameCheck, "user": sessionStorage["HUserName"] },
                    success: function (result) {
                        if (result.count == 1) {
                            var data = option.data || [];
                            // æ¸…洗数据
                            data.forEach(function (item) {
                                for (var key in item) {
                                    if (item[key] == null) item[key] = "";
                                    if (typeof item[key] === 'string') {
                                        item[key] = item[key].replace(/[\r\n]+/g, '').replace(/,/g, '');
                                    }
                                }
                            });
                            table.exportFile("mainTable", data, "xls");
                        } else {
                            layer.alert("当前模块没有导出权限!", { icon: 5 });
                        }
                    },
                    error: function () {
                        layer.alert("接口请求失败!", { icon: 5 });
                    }
                });
            }
            //导入
            function set_SouceExcel() {
                layer.open({
                    type: 2
                    , area: ['100%', '100%']
                    , title: '资料导入'
                    , shift: 0//弹出动画
                    , content: './Gy_WIPBal_Excel.html?OperationType=dao&HSouceBillType='
                })
            }
            // å…¨å±€è¾…助函数 Format (如果不存在,简单定义)
            if (typeof Format !== 'function') {
                window.Format = function (date, fmt) {
                    if (!date) return '';
                    var d = new Date(date);
                    var o = {
                        "M+": d.getMonth() + 1,
                        "d+": d.getDate(),
                        "H+": d.getHours(),
                        "m+": d.getMinutes(),
                        "s+": d.getSeconds()
                    };
                    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (d.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)));
                    return fmt;
                };
            }
        });
        // ä¸‹é¢ä¸¤ä¸ªæ–¹æ³•供弹窗回调使用 (Gy_EmployeeList.html å’Œ Gy_Group.html ä¼šè°ƒç”¨)
        function GetMouldFileValue(obj)           //器具
        {
            $("#HMouldID").val(obj[0].hmainid);
            $("#HMouldNumber").val(obj[0].模具名称);
        }
    </script>
</body>
</html>
WebTM/views/Ä£Öξ߹ÜÀí/Ä£Öξֿ߲â¹ÜÀí/Sc_MouldProdOutBillEdit.html
@@ -68,7 +68,8 @@
                                            <div class="layui-input-inline">
                                                <input type="text" class="layui-input" name="HBillNo" id="HBillNo" style="background-color:#efefef4d;" readonly>
                                                <input type="hidden" name="HInterID" id="HInterID" value="0">
                                                <input type="hidden" name="HRedBlueFlag" id="HRedBlueFlag" value="false" >
                                                <input type="hidden" name="HRedBlueFlag" id="HRedBlueFlag" value="false">
                                                <input type="hidden" name="HBillSubType" id="HBillSubType" value="3802">
                                            </div>
                                        </div>
                                        <div class="layui-inline">
WebTM/views/ϵͳ¹ÜÀí/¶à¼¶ÉóÅú/ÉóºËÁ÷³Ìµ¥/Xt_CheckFlowEdit.html
@@ -306,16 +306,17 @@
            //选择部门
            function get_btnHDeptID() {
                var HOrgName = sessionStorage["Organization"]
                //打开部门小窗体
                layer.open({
                    type: 2
                    , skin: "layui-layer-rim" //加上边框
                    , title: "供应商列表"  //标题
                    , title: "部门列表"  //标题
                    , closeBtn: 1  //窗体右上角关闭 çš„ æ ·å¼
                    , shift: 2 //弹出动画
                    , area: ["90%", "90%"] //窗体大小
                    , maxmin: true //设置最大最小按钮是否显示
                    , content: ["../../../Baseset/基础资料/Gy_DepartmentList.html", "yes"]
                    , content: ['../../../基础资料/公用基础资料/Gy_DepartmentList.html?Type=2&HOrgName=' + HOrgName, 'yes']
                    , btn: ["确定", "取消"]
                    , btn1: function (index, laero) {
                        //按钮一  çš„回调
@@ -327,7 +328,7 @@
                        }
                        //更新表格缓存的数据
                        $("#HDeptID").val(checkStatus.data[0].HItemID);
                        $("#HDeptIDName").val(checkStatus.data[0].HName);
                        $("#HDeptIDName").val(checkStatus.data[0].部门名称);
                        layer.close(index);//关闭弹窗
                    }
                })
WebTM/views/É豸¹ÜÀí/É豸¹¤ÒÕ²ÎÊý¶©µ¥µã¼ì±í/SB_EquipICMOTechParamBillEdit.html
@@ -965,7 +965,6 @@
                let interID = isEmpty($('#HInterID').val()) == true ? 0 : $('#HInterID').val()
                let HProcID = $('#HProcID').val()
                let HSourceID = $('#HSourceID').val()
                debugger
                if (isEmpty(HProcID, true, true) == false) {
                    // å·¥åºæ˜¯å¿…填项
                    sWhere = " and HProcID = " + HProcID + " and HSourceID = " + HSourceID
@@ -1956,6 +1955,7 @@
            //#region  å®¡æ ¸ï¼ˆnum=1)/反审核(num=2)
            function set_CheckBill(num) {
                HInterID = $("#HInterID").val()
                $.ajax({
                    type: "GET",
                    url: GetWEBURL() + "/SB_EquipICMOTechParamBillController/GetSB_EquipICMOTechParamBill_Check_Json",
WebTM/views/ÖÊÁ¿¹ÜÀí/Ê×¼þ¼ìÑéµ¥/QC_FirstPieceCheckBillList2.html
@@ -782,7 +782,7 @@
            //#region å¿«é€Ÿè¿‡æ»¤
            function get_FastQuery(number) {
                var sqlWhere = " and 1=1 ";
                var sqlWhere = " ";
                var HBillNo = $("#HBillNo").val();//单据号
                var HProject = $("#HProject").val();//项目号
                var HNumber = $("#HNumber").val();//物料编码