SOURCE

console 命令行工具 X clear

                    
>
console
const erp_base_url = 'https://erp.dropshippinglite.com';
const res = {

    "pack_machine": "p1",
    "pack_by": 67,
    "operator": "张三", //操作人姓名
    "today": 232, //今日已打包包裹数,从每日0点开始算。
    "month": 562441,//本月已打包包裹数,从每月1日0点开始算。
    "perDay": 210, // 日均打包数,本月已打包数/本月天数
    "data": [
        {
            "ticketsNum": "92626903590992110041655769",
            "result": "true",
            "message": "JPS", //物流名称
            "detail": [
                {
                    "product": "春秋T恤",//产品名
                    "sku": "黑色/XL", //sku属性
                    "img": "https://images.pexels.com/photos/9582594/pexels-photo-9582594.jpeg?auto=compress&cs=tinysrgb&w=800",//对应的内部产品图片
                    "quanity": 36 //sku数量
                },
                {
                    "product": "春秋T恤",
                    "sku": "白色/M",
                    "img": "https://images.pexels.com/photos/9544524/pexels-photo-9544524.jpeg?auto=compress&cs=tinysrgb&w=800",
                    "quanity": 1
                }
            ]
        }
    ]
};

mainTask();
async function mainTask() {
    await conectCom(upload);
    await initSelect();
    let pack_by;
    $('select').on('change', e => {
        pack_by = $('select').val();
    });

    //upload('33324324214314');
    async function upload(s) {
       if (pack_by === '0' || !pack_by) { return Toast('请先选择打包人'); }
        let body = [
            {
                "pack_machine": "p1",
                "ticketsNum": "92626903590992110041655738",
                "pack_by": 67
            }
        ];
        let r = await fetchPost(erp_base_url + '/api/shipment_parcels/pack_data', body);
        console.log(r)
        res.data[0]=r[0]
        res.data[0].detail=[];
        insert(res)
    }

}


async function initSelect() {
    let arr = await fetch(erp_base_url + '/api/filters/warehouse_users').then(r => r.json());
    arr.unshift({ id: 0, username: "请选择" })
    let optionHtml = arr.map(v => `<option value="${v.id}">${v.username}</option>`).join('');
    $('select').empty().append(optionHtml);
}

async function conectCom(cb) {
    let port = await navigator.serial.requestPort();
    await port.open({ baudRate: 9600 });
    port.readable.pipeTo(new WritableStream({
        write(chunk) {
            let s = new TextDecoder('utf-8').decode(chunk);
            cb(s);
        }
    }));
}

function insert(res) {
    ['today', 'month', 'perDay'].map(s => $('#' + s).text(res[s]));
    $('#package_img_container').empty().append(res.data[0].detail.map(getImgItem).join(''));
    $('#records').prepend(getRecordItem(res.data[0]));
}

function getImgItem(o) {
    return `<div class="package_img_card">
            <img  class="package_img" src="${o.img}">
            <div style="display:flex;">
                <div style="flex-grow: 1;">
                    <div class="product_name">${o.product}</div>
                    <div class="product_name product_sku">${o.sku}</div>
                </div>
                <div style="padding:5px;">
                    <strong class="sku_pcs">${o.quanity}</strong>件
                </div>
            </div>
        </div>`;
}

function getRecordItem(o) {
    return `<div>
            <span class="gray">07/19 12:34:21</span><span style="color: darkorange;margin:0 10px;">${o.message}</span>
             ${o.ticketsNum}
             <span class="gray">${o.detail.map(v => [v.product, v.sku, '×' + v.quanity].join(' ')).join(';')}</span>
        </div>`;
}


function fetchPost(url, body) {
    return fetch(url, {
        "headers": {
            "content-type": "application/json"
        },
        "body": JSON.stringify(body),
        "method": "POST"
    }).then(r => r.json())
}


function sleep(t) {
    return new Promise(r => setTimeout(r, t));
}

function Toast(msg, duration = 2000) {
    var m = document.createElement('div');
    m.innerHTML = msg;
    m.style.cssText = "max-width:80%;min-width: 150px;padding:0 14px;height: 40px;color: rgb(255, 255, 255);line-height: 40px;text-align: center;border-radius: 4px;position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);z-index: 999999;background: rgba(0, 0, 0,.7);font-size: 16px;";
    document.body.appendChild(m);
    setTimeout(() => {
        var d = 0.5;
        m.style.webkitTransition = '-webkit-transform ' + d + 's ease-in, opacity ' + d + 's ease-in';
        m.style.opacity = '0';
        setTimeout(() => { document.body.removeChild(m) }, d * 1000);
    }, duration);
}
<div class="vertical_container">
	<div style="display:flex;">
		<div style="flex:1;">
            <span class="gray">打包人:</span>
			<select style="font-size:16px;width:120px;">
                <option value="aaa">张三</option>
                <option value="aaa">李四</option>
            </select>
        </div>
        <div style="flex:1;"  class="gray">设备名称:</div>
    </div>
    <div id="statistics" class="gray"  style="display:flex;width:460px;">
        <div style="flex:1;">
            今日:<span style="color:darkorange" id="today">23324</span>
        </div>
        <div style="flex:1;">
            本月:<span id="month">23324</span>
        </div>
        <div style="flex:1;">
            日均:<span id="perDay">23324</span>
        </div>
    </div>
    
    <div style="display:flex;flex-wrap:wrap" id="package_img_container">
      <!--  <div class="package_img_card">
            <img  class="package_img" src="https://img0.baidu.com/it/u=1610680713,975251961&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=750">
            <div style="display:flex;">
                <div style="flex-grow: 1;">
                    <div class="product_name">春秋潮流T恤</div>
                    <div class="product_name product_sku">白色/XL</div>
                </div>
                <div style="padding:5px;">
                    <strong class="sku_pcs">2</strong>件
                </div>
            </div>
        </div>-->
    </div>
    <div style="border:1px solid gray;flex-grow:1;padding:5px;overflow:scroll;" id="records">
      <!--  <div>
            <span class="gray">07/19 12:34:21</span><span style="color: darkorange;margin:0 10px;">JPS</span>
             2342329018133490
             <span class="gray">春秋潮流T恤 白色/XL*1;春秋潮流T恤 黑色/XL*1;</span>
        </div>-->
    </div>
    <p></p>
</div>
.gray{color:gray;}
.vertical_container{display:flex;flex-direction:column;height:100vh;max-width:1000px;margin:10px auto;}
.vertical_container>div{margin-top: 10px;}
.package_img_card{width: 240px;height: 282px;background: lightgrey;margin:5px;text-align: center;font-size: 14px;}
.package_img{width: 240px;height: 240px;}
.product_sku{color:darkorange!important;font-weight: bolder}
.product_name{color:black;white-space: nowrap;text-overflow: ellipsis;overflow: hidden;width: 180px;}
.sku_pcs{color:red;font-weight:boldere;font-size:26px;}
#statistics>div>span{color:black;font-weight: bolder;font-size:24px;}

本项目引用的自定义外部资源