appendModel

append model in orderDetailAddPage

Versión del día 8/4/2023. Echa un vistazo a la versión más reciente.

// ==UserScript==
// @name         appendModel
// @namespace    http://tampermonkey.net/
// @version      5.20
// @description  append model in orderDetailAddPage
// @author       FengXia
// @match        http://47.107.106.156/*
// @icon
// @grant        none
// @license MIT
// @require https://greatest.deepsurf.us/scripts/448895-elementgetter%E5%BA%93/code/ElementGetter%E5%BA%93.js?version=1077494
// @require https://unpkg.com/[email protected]/dist/ajaxhook.min.js
// ==/UserScript==


(function() {
    const elmGetter = new ElementGetter();  //初始化ElementGetter
    let url_bool = false;   //网址判断变量
    ah.proxy({  //ajax hook
        //请求发起前进入
        onRequest: async (config, handler) => {
            // console.log(config.url)
            if (config.url==='sales/getGoodsDetail.do'){    //判断xhr网址是否是获取新增订单商品
                url_bool =true;
            }
            handler.next(config);
        },
        //请求成功后进入
        onResponse: (response, handler) => {
            if (url_bool) { //
                // console.log(response.response);
                updateData(response.response);
                url_bool =false;
            }

            handler.next(response)
        }
    });

    // module 给销售核销增加单据搜索
    elmGetter.get('input[name="saleorderid"]').then(input_order => {
        input_order.addEventListener("keypress", addSearch,true);
        // console.log(order);
    });

    // module 给新增销售订单的单号元素添加重复订单查询监听
    elmGetter.each('#sales-sourceid-orderAddPage', document, order => {
        order.addEventListener("focusout", addListener,true);
        // console.log(order);
    });

    // module 给新增退货通知单的单号元素添加重复退货单查询监听
    elmGetter.each('#sales-sourceid-rejectBillAddPage', document, out_order => {
        out_order.addEventListener("focusout", addListenerOutOrder,true);
        // console.log(out_order);
    });


    // module 订单添加规格
    elmGetter.each('#remark', document, add_model => {
        const table_tr=add_model.parentNode.parentNode;
        let model_string = `
<td>规格:</td>
<td><input id="products_model" class="len150 readonly" readonly="readonly" name="model" placeholder=""></td>
</tr>`
        addElement(table_tr,'#products_model',model_string,'beforeend')
    });

    // module 换货单添加'*'监控,自动完成正负
    elmGetter.each('#sales-form-swapOrderDetailAddPage', document, swap => {
        if (swap) {
            // console.log('find')
            swap.addEventListener('keydown', checkKey);
        }
    });

    // module 订单添加最新采购价
    elmGetter.each('#sales-loading-orderDetailAddPage', document, add_price => {
        const table = add_price.parentNode.parentNode;
        let price_string = `
<tr>
<td>最新采购价:</td>
<td><input id="products_price" class="len150 readonly" readonly="readonly" name="newstorageprice" placeholder="">
</td>
</tr>`
        addElement(table,'#products_price',price_string,'beforeend')
    });


    // module 销售单添加历史销售明细
    elmGetter.each('#sales-dialog-orderAddPage-content', document, add_history_price => {
        // console.log(add_history_price);
        const div = add_history_price.parentNode;
        div.style.width = '1201px'
        let div_string = `
<div class="panel window" id="addhistoryprice" style="width: 600px; left:601px">
<div class="panel-header panel-header-noborder window-header" style="width: 600px;">
<div class="panel-title" style="">商品历史价格</div>
</div>
<div class="easyui-layout layout easyui-fluid" data-options="fit:true" style="width: 600px; height: 424px;">
<div class="panel layout-panel layout-panel-center" style="width: 600px; left: 0px; top: 0px;">
<div data-options="region:'center',border:false" title="" class="panel-body panel-body-noheader panel-body-noborder layout-body" style="width: 600px; height: 424px;">
<table cellpadding="0" cellspacing="0">
<tbody>
<tr class="datagrid-header-row">
<td class="len120">日期</td>
<td class="len100">数量</td>
<td class="len100">单价</td>
<td class="len100">出库数量</td>
<td class="len100">验收单价</td>
</tr>
</tbody></table>
<table cellpadding="0" cellspacing="0">
<tbody id="table_row">
</tbody></table>
</div>
</div>
</div>
</div>
`
        addElement(div,'#addhistoryprice',div_string,'afterbegin')
    });

    // module 换货单添加历史销售明细
    elmGetter.each('#sales-dialog-swapOrderAddPage-content', document, add_history_swap => {
        // console.log(add_history_price);
        const div = add_history_swap.parentNode;
        div.style.width = '1201px'
        let div_string = `
<div class="panel window" id="addhistoryswap" style="width: 600px; left:601px">
<div class="panel-header panel-header-noborder window-header" style="width: 600px;">
<div class="panel-title" style="">商品历史价格</div>
</div>
<div class="easyui-layout layout easyui-fluid" data-options="fit:true" style="width: 600px; height: 424px;">
<div class="panel layout-panel layout-panel-center" style="width: 600px; left: 0px; top: 0px;">
<div data-options="region:'center',border:false" title="" class="panel-body panel-body-noheader panel-body-noborder layout-body" style="width: 600px; height: 424px;">
<table cellpadding="0" cellspacing="0">
<tbody>
<tr class="datagrid-header-row">
<td class="len120">日期</td>
<td class="len100">数量</td>
<td class="len100">单价</td>
<td class="len100">出库数量</td>
<td class="len100">验收单价</td>
</tr>
</tbody></table>
<table cellpadding="0" cellspacing="0">
<tbody id="table_row">
</tbody></table>
</div>
</div>
</div>
</div>
`
        addElement(div,'#addhistoryswap',div_string,'afterbegin')
    });

    // module 退货单添加历史销售明细
    elmGetter.each('#sales-dialog-rejectBillAddPage-content', document, add_history_reject => {
        // console.log(add_history_price);
        const div = add_history_reject.parentNode;
        div.style.width = '1201px';
        div.style.left='360px';
        let div_string = `
<div class="panel window" id="addhistoryreject" style="width: 600px; left:601px">
<div class="panel-header panel-header-noborder window-header" style="width: 600px;">
<div class="panel-title" style="">商品历史价格</div>
</div>
<div class="easyui-layout layout easyui-fluid" data-options="fit:true" style="width: 600px; height: 480px;">
<div class="panel layout-panel layout-panel-center" style="width: 600px; left: 0px; top: 0px;">
<div data-options="region:'center',border:false" title="" class="panel-body panel-body-noheader panel-body-noborder layout-body" style="width: 600px; height: 480px;">
<table cellpadding="0" cellspacing="0">
<tbody>
<tr class="datagrid-header-row">
<td class="len120">日期</td>
<td class="len100">数量</td>
<td class="len100">单价</td>
<td class="len100">出库数量</td>
<td class="len100">验收单价</td>
</tr>
</tbody></table>
<table cellpadding="0" cellspacing="0">
<tbody id="table_row">
</tbody></table>
</div>
</div>
</div>
</div>
`
        addElement(div,'#addhistoryreject',div_string,'afterbegin')
    });


    // module 换货单添加最新采购价
    elmGetter.each('#sales-loading-swapOrderDetailAddPage', document, add_price => {
        const table = add_price.parentNode.parentNode;
        let price_string = `
<tr>
<td>最新采购价:</td>
<td><input id="products_price" class="len150 readonly" readonly="readonly" name="newstorageprice" placeholder="">
</td>
</tr>`
        addElement(table,'#products_price',price_string,'beforeend')
    });
})();


// module 添加元素
function addElement(element,element_id,add_string,add_mode){
    if(!document.querySelector(element_id)){
        element.insertAdjacentHTML(add_mode,add_string)
    }
}

// module 查询订单号重复
function QueryCustomerOrder(customer,order){
    let xhr = new XMLHttpRequest();
    let url = new URL('http://47.107.106.156:8888/sales/getOrderList.do');
    let query_date = getIntervalDate();
    url.searchParams.set('businessdate', query_date.start_date);
    url.searchParams.set('businessdate1', query_date.end_date);
    url.searchParams.set('id', '');
    url.searchParams.set('salesdept', '');
    url.searchParams.set('customerid', customer);
    url.searchParams.set('status', '');
    url.searchParams.set('sourceid', order);
    url.searchParams.set('goodsid', '');
    url.searchParams.set('printsign', '');
    url.searchParams.set('queryprinttimes', '');
    url.searchParams.set('urgentlevel', '');
    url.searchParams.set('lineid', '');
    url.searchParams.set('isstoragelock', '0');
    url.searchParams.set('salesuserArrs', '');
    url.searchParams.set('page', '1');
    url.searchParams.set('rows', '200');
    url.searchParams.set('sort', 'addtime');
    url.searchParams.set('order', 'desc');

    // 2. 配置它:从 URL /article/.../load GET-request
    xhr.open('post', url);

    // 3. 通过网络发送请求
    xhr.send();

    // 4. 当接收到响应后,将调用此函数
    xhr.onload = function() {
        if (xhr.status != 200) { // 分析响应的 HTTP 状态
            alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
        } else { // 显示结果
            let xhrString = JSON.parse(xhr.response)
            // console.log(xhrString)
            if (xhrString.total > 0){
                let i = 0;
                let orderNo='';
                for (; i < xhrString.rows.length;i++) {
                    if (xhrString.rows[i].status != '5'){
                        orderNo += `${xhrString.rows[i].id},`
                    }
                }
                if (orderNo){
                    alert( `有重复订单,订单号为${orderNo}`);
                }
            }
            // alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应
        }
    };

    xhr.onerror = function() {
        alert("Request failed");
    };

}

// module 更新规格和最新采购价
function updateData(xhr_string) {
    try {
        let xhrString = JSON.parse(xhr_string);
        let customer = document.querySelector('[id^="sales-customer-showid"] a');
        let model_string = xhrString.detail.goodsInfo.model;
        let products_price  = xhrString.detail.goodsInfo.newbuyprice;
        let products_string = xhrString.detail.goodsInfo.id;
        queryHistoryPrice((customer?customer.innerText:
            document.querySelector('#sales-customer-showid-dispatchBillAddPage').innerText.substring(3)), products_string);
        document.querySelector('#products_model').setAttribute("placeholder", model_string);
        document.querySelector('#products_price').setAttribute("placeholder", products_price);
    } catch (err) {
        // console.log('err');
        return
    }
}

// module 销售核销添加搜索功能
function addSearch(evt){
    if (evt.keyCode == 13){
        let inputString =document.querySelector('input[name="saleorderid"]');
        let alertString = document.querySelector('#alertTd')

        let querySet = FormatString(inputString.value);
        CheckString(querySet);

        inputString.select();
    }
}

// module 格式化单据号
function FormatString(inputString){
    // console.log(inputString,inputString.length);
    let regString,queryString,orderType;
    if (inputString.length === 7){
        regString = new RegExp('XD22'+inputString);
        queryString = "td[field=\"orderid\"]";
        orderType = 'sale';

    } else if (inputString.length === 9){
        regString = new RegExp(`THTZD-2022${inputString}`);
        queryString = "td[field=\"id\"]";
        orderType = 'out';

    } else if (inputString.length === 8){
        regString = new RegExp(`HHD-2022${inputString}`);
        queryString = "td[field=\"sourceid\"]";

    } else if (inputString.length === 11){
        regString = new RegExp(`${inputString}`);
        queryString = "td[field=\"orderid\"]";
        orderType = 'sale';
    }
    let querySet = {
        'regString':regString,
        'queryString':queryString,
        'orderType':orderType
    }
    return querySet
}

// module 查询核销单号
function CheckString(querySet,booleanH = true) {
    if (querySet.regString){
        let orderId = document.querySelectorAll(querySet.queryString);
        let booleanSelect = false ;
        let selectString = /datagrid-row-selected/;
        let regH = /[^F]HHD-\d{8}-\d{3}/;
        let orderString;
        for (let num = 0;num< orderId.length;num++){
            orderString = orderId[num].parentNode;
            if (orderId[num].innerText.search(querySet.regString)>=0 && orderString.className.search(selectString) < 0){
                orderString.click();
                booleanSelect = true;
            }
        }
        if (booleanSelect){
            AddAlertTd('已经选择')
            return
        } else {
            let orderString = querySet.regString.toString();
            let newOrder = orderString.replace(/\//g,'')
            let customer = document.querySelector('#account-customerid-salesInvoiceSourceQueryPage-hidden');
            let temp =customer.getAttribute('object')
            let customerTemp ='';
            if (temp){
                let customerString = JSON.parse(temp);
                customerTemp =customerString.id;
            }
            if (querySet.orderType === 'sale'){
                CheckSaleOrder(newOrder,customerTemp);
                return
            } else if (querySet.orderType === 'out'){
                CheckOutOrder(newOrder,customerTemp);
                return
            }
        }
    } else {
        AddAlertTd('请输入正确单号')
        return
    }
}

// module 添加窗口弹出
function AddAlertTd(alertString) {
    let alertTd = document.querySelector('#alertTd');
    if (alertTd) {
        // console.log(alertTd.innerHTML);
        alertTd.innerHTML =alertString;
    } else {
        let alertTr = document.querySelectorAll('form[id="account-form-query-salesInvoiceSouceBill"] tr');
        let createTd = document.createElement("td");
        createTd.innerHTML=`<font color="red" id="alertTd" >${alertString}</font>`
        alertTr[2].appendChild(createTd);
    }
}

// module 添加销售单单号重复查询
function addListener(){
    let customerInput = document.querySelector('#sales-customer-showid-orderAddPage a');
    let inputOrder = document.querySelector('#sales-sourceid-orderAddPage');
    if (inputOrder.value){
        QueryCustomerOrder(customerInput.innerText,inputOrder.value);
    }
}

// module 添加退货通知单单号重复查询
function addListenerOutOrder(){
    let customer = document.querySelector('#sales-customer-showid-dispatchBillAddPage');
    let out_order = document.querySelector('#sales-sourceid-rejectBillAddPage');
    if (out_order.value){
        // console.log(customer.innerText.slice(3),out_order.value);
        queryOutOrder(customer.innerText.slice(3),out_order.value);

    }
}

// module 查询销售单是否核销
function CheckSaleOrder(orderId,customer) {
    let xhr = new XMLHttpRequest();
    let url = new URL('http://47.107.106.156:8888/sales/getReceiptList.do');
    let returnString;
    let query_date = getIntervalDate()
    url.searchParams.set('businessdate', '');
    url.searchParams.set('businessdate1', '');
    url.searchParams.set('id', orderId);
    url.searchParams.set('customersort', '');
    url.searchParams.set('detailOrder', '0');
    url.searchParams.set('customerid', customer);
    url.searchParams.set('indooruserid', '');
    url.searchParams.set('salesuser', '');
    url.searchParams.set('isinvoice', '-1');
    url.searchParams.set('status', '');
    url.searchParams.set('accounttype', '');
    url.searchParams.set('salesarea', '');
    url.searchParams.set('ispassdue', '');
    url.searchParams.set('brandid', '');
    url.searchParams.set('isbook', '');
    url.searchParams.set('isledger', '');
    url.searchParams.set('deliveryid', '');
    url.searchParams.set('sourceid', '');
    url.searchParams.set('goodsid', '');
    url.searchParams.set('page', '1');
    url.searchParams.set('rows', '100');
    url.searchParams.set('sort', 'id');
    url.searchParams.set('order', 'desc');

    // 2. 配置它:从 URL /article/.../load GET-request
    xhr.open('post', url);

    // 3. 通过网络发送请求
    xhr.send();

    // 4. 当接收到响应后,将调用此函数
    xhr.onload = function() {
        if (xhr.status != 200) { // 分析响应的 HTTP 状态
            alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
        } else { // 显示结果
            let xhrString = JSON.parse(xhr.response)
            // console.log(xhrString)
            if (xhrString.total > 0){
                let rows = xhrString.rows;
                if (rows[0].status === '4'){
                    AddAlertTd('已经核销');
                    return
                }else if(rows[0].status === '2'){
                    AddAlertTd('未验收');
                    return
                } else if(rows[0].isinvoice === '4' || rows[0].isinvoice === '1'){
                    AddAlertTd('已经申请抽单');
                    return
                }else{
                    AddAlertTd('未出库');
                    return
                }
            } else {
                AddAlertTd('请输入正确单号');
                return
            }
            // alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应

        }
    };
    xhr.onerror = function() {
        alert("Request failed");
    };
    return returnString
}

// module 查询退货单是否核销
function CheckOutOrder(orderId,customer) {
    let xhr = new XMLHttpRequest();

    let url = new URL('http://47.107.106.156:8888/sales/getRejectBillList.do');
    url.searchParams.set('businessdate', '');
    url.searchParams.set('businessdate1', '');
    url.searchParams.set('salesdept','');
    url.searchParams.set('indooruserid', '');
    url.searchParams.set('ysbusinessdate', '');
    url.searchParams.set('ysbusinessdate1', '');
    url.searchParams.set('isinvoice', '3');
    url.searchParams.set('id', orderId);
    url.searchParams.set('goodsid', '');
    url.searchParams.set('billtype', '');
    url.searchParams.set('isbook', '');
    url.searchParams.set('customerid', customer);
    url.searchParams.set('ysprintsign', '');
    url.searchParams.set('queryysprinttimes', '0');
    url.searchParams.set('isledger', '');
    url.searchParams.set('status', '');
    url.searchParams.set('page', '1');
    url.searchParams.set('rows', '20');
    url.searchParams.set('sort', 'addtime');
    url.searchParams.set('order', 'desc');

    // 2. 配置它:从 URL /article/.../load GET-request
    xhr.open('post', url);

    // 3. 通过网络发送请求
    xhr.send();

    // 4. 当接收到响应后,将调用此函数
    xhr.onload = function() {
        if (xhr.status != 200) { // 分析响应的 HTTP 状态
            alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
        } else { // 显示结果
            let xhrString = JSON.parse(xhr.response)
            // console.log(xhrString)
            if (xhrString.total > 0){
                let rows = xhrString.rows;
                if (rows[0].isinvoice === '2'){
                    AddAlertTd('已经核销');

                } else if (rows[0].isinvoice === '1'){
                    AddAlertTd('已经申请抽单');

                }
            } else {
                AddAlertTd('未验收');

            }
            // alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应

        }
    };
    xhr.onerror = function() {
        alert("Request failed");
    };
}

// module 查询退货单号重复
function queryOutOrder(customer,order_id){
    let xhr = new XMLHttpRequest();
    let url = new URL(' http://47.107.106.156:8888/sales/getRejectBillList.do');
    let query_date = getIntervalDate();
    url.searchParams.set('businessdate', query_date.start_date);
    url.searchParams.set('businessdate1', query_date.end_date);
    url.searchParams.set('storageid','');
    url.searchParams.set('id','');
    url.searchParams.set('confirmstatus','');
    url.searchParams.set('goodsid','');
    url.searchParams.set('billtype','');
    url.searchParams.set('source','9');
    url.searchParams.set('status','');
    url.searchParams.set('sourceid','');
    url.searchParams.set('printsign','');
    url.searchParams.set('queryprinttimes','0');
    url.searchParams.set('customerid',customer);
    url.searchParams.set('page','1');
    url.searchParams.set('rows','1000');
    url.searchParams.set('sort','addtime');
    url.searchParams.set('order','desc');

    // 2. 配置它:从 URL /article/.../load GET-request
    xhr.open('post', url);

    // 3. 通过网络发送请求
    xhr.send();

    // 4. 当接收到响应后,将调用此函数
    xhr.onload = function() {
        if (xhr.status != 200) { // 分析响应的 HTTP 状态
            alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
        } else { // 显示结果
            let xhrString = JSON.parse(xhr.response)
            // console.log(xhrString)
            if (xhrString.total > 0){
                let i = 0;
                let orderNo='';
                for (; i < xhrString.rows.length;i++) {
                    if (xhrString.rows[i].remark === order_id || xhrString.rows[i].sourceid === order_id ){
                        orderNo += `${xhrString.rows[i].id},`
                    }
                }
                if (orderNo){
                    alert( `有重复单,单号为${orderNo}`);
                }
            }
            // alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应
        }
    };

    xhr.onerror = function() {
        alert("Request failed");
    };
}

// module 获取时间参数
function getIntervalDate(){
    let date = new Date();
    let end_date = `${date.getFullYear()}-${(date.getMonth()+1).toString().padStart(2,"0")}-${date.getDate().toString().padStart(2,'0')}`;
    date.setDate(date.getDate()-90);
    let start_date = `${date.getFullYear()}-${date.getMonth().toString().padStart(2,"0")}-${date.getDate().toString().padStart(2,'0')}`;
    let query_date ={
        'start_date':start_date,
        'end_date':end_date
    }
    return query_date
}

// module 查询销售情况流水明细
// function showCustomerSalesFlowList(customer,products){
//     let xhr = new XMLHttpRequest();
//     let url = new URL('http://47.107.106.156:8888/report/finance/showCustomerSalesFlowList.do');
//     let query_date = getIntervalDate();
//     url.searchParams.set("businessdate1", "2022-03-01");
//     url.searchParams.set("businessdate2", query_date.end_date);
//     url.searchParams.set("goodsid", products);
//     url.searchParams.set("salesuser", "");
//     url.searchParams.set("batchno", "");
//     url.searchParams.set("goodssort", "");
//     url.searchParams.set("customerid", customer);
//     url.searchParams.set("pcustomerid", "");
//     url.searchParams.set("salesarea", "");
//     url.searchParams.set("customersort","");
//     url.searchParams.set("salesdept", "");
//     url.searchParams.set("brandid", "");
//     url.searchParams.set("orderid", "");
//     url.searchParams.set("type", "");
//     url.searchParams.set("invoice1", "1");
//     url.searchParams.set("writeoff1","1");
//     url.searchParams.set("invoice2", "1");
//     url.searchParams.set("writeoff2", "1");
//     url.searchParams.set("id", "");
//     url.searchParams.set("storageid", "");
//     url.searchParams.set("supplierid", "");
//     url.searchParams.set("page", "1");
//     url.searchParams.set("rows", "1000");
//     // 2. 配置它:从 URL /article/.../load GET-request
//     xhr.open('post', url);
//
//     // 3. 通过网络发送请求
//     xhr.send();
//
//     // 4. 当接收到响应后,将调用此函数
//     xhr.onload = function() {
//         if (xhr.status != 200) { // 分析响应的 HTTP 状态
//             alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
//         } else { // 显示结果
//             let xhrString = JSON.parse(xhr.response)
//             // console.log(xhrString)
//             let table_html = '';
//             let table_parentNode = document.querySelector("#table_row");
//             if (xhrString.total > 0){
//                 let row_data = xhrString.rows;
//                 let x = 1;  //用x取余来做斑马格
//                 for (let row_num in row_data){
//                     table_html = `
// <tr class="${(x%2 ==0) ?"datagrid-row-alt datagrid-row":"datagrid-row"}">
// <td class="len120">${row_data[row_num].addtime}</td>
// <td class="len80">${row_data[row_num].deliverystoragename}</td>
// <td class="len80">${row_data[row_num].unitname}</td>
// <td class="len100">${row_data[row_num].unitnum}</td>
// <td class="len100">${row_data[row_num].price}</td>
// <td class="len120">${row_data[row_num].taxamount}</td>
// </tr>
// ` + table_html;
//                     x=++x;
//                 }
//             }
//             table_parentNode.innerHTML=table_html;
//             // alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应
//         }
//     };
//
//     xhr.onerror = function() {
//         alert("Request failed");
//     };
// }

// module 查询订单是否可以配置库存
function queryOrderStock(order) {
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest();
        let url = new URL(`http://47.107.106.156:8888/sales/orderDeployInfo.do?id=${order}`);

        // 2. 配置它:从 URL /article/.../load GET-request
        xhr.open('post', url);

        // 3. 通过网络发送请求
        xhr.send();

        // 4. 当接收到响应后,将调用此函数
        xhr.onload = function() {
            if (xhr.status != 200) { // 分析响应的 HTTP 状态
                alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
            } else { // 显示结果
                let xhrString = JSON.parse(xhr.response)
                console.log(xhrString.flag);
                resolve(xhrString.flag);
            }
        };

        xhr.onerror = function() {
            alert("Request failed");
        };
    })
}

// module 编辑订单模式
function queryEditOrder(order_num,num,total,urgentlevel,mode_page){
    return new Promise((resolve, reject) => {
        let urgentlevel_list = ['1','2','3'];
        let xhr = new XMLHttpRequest();
        let timestamp = Date.parse( new Date());
        let saleorder_salestype = false;
        let goodsjson;
        let url = new URL(`http://47.107.106.156:8888/sales/${mode_page}?id=${order_num}&_=${timestamp}`);
        // 2. 配置它:从 URL /article/.../load GET-request
        xhr.open('post', url);
        // 3. 通过网络发送请求
        xhr.send();
        // 4. 当接收到响应后,将调用此函数
        xhr.onload = function() {
            if (xhr.status != 200) { // 分析响应的 HTTP 状态
                alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
            } else { // 显示结果
                let parser = new DOMParser();
                let doc = parser.parseFromString(xhr.response, "text/html")
                // console.log(doc);
                let script_string = doc.scripts.item(0).text;
                let saleorder_id = order_num;
                let saleorder_businessdate = doc.querySelector('#sales-businessdate-orderAddPage').value;
                let saleorder_urgentlevel = doc.querySelector('[name="saleorder.urgentlevel"] option[selected="selected"]').value;
                if (urgentlevel_list.includes(urgentlevel)){
                    saleorder_urgentlevel = urgentlevel
                }
                if ('orderEditPage.do' === mode_page){
                    saleorder_salestype = doc.querySelector('[name="saleorder.salestype"] option[selected="selected"]').value;
                    goodsjson = script_string.match(/\[{".*"}\]/);
                } else {
                    goodsjson = script_string.match(/\[{".*}\]/);
                }
                let saleorder_status = doc.querySelector('[name="saleorder.status"]').value;
                let saleorder_customerid = doc.querySelector('[name="saleorder.customerid"]').value;
                let saleorder_salesuser = doc.querySelector('[name="saleorder.salesuser"]').value;
                let saleorder_storageid = doc.querySelector('[name="saleorder.storageid"]').value;
                let saleorder_salesdept = doc.querySelector('[name="saleorder.salesdept"]').value;
                let saleorder_sourceid = doc.querySelector('[name="saleorder.sourceid"]').value;
                let saleorder_remark = doc.querySelector('[name="saleorder.remark"]').value;
                let regexp = /[,]*此单为超级审核[,]*/g;
                saleorder_remark = `${total}${num} ${saleorder_remark.replaceAll(regexp, "")}`;
                // console.log(saleorder_remark);
                let lackGoodsjson = doc.querySelector('[name="lackGoodsjson"]').innerHTML;
                let saveaudit = doc.querySelector('[name="saveaudit"]').value;
                // let oldFromData = doc.querySelector('[name="oldFromData"]').value;

                let from_date = {
                    'saleorder_id': saleorder_id,
                    'saleorder_businessdate': saleorder_businessdate,
                    'saleorder_status': saleorder_status,
                    'saleorder_customerid': saleorder_customerid,
                    'saleorder_salestype': saleorder_salestype,
                    'saleorder_urgentlevel': saleorder_urgentlevel,
                    'saleorder_storageid': saleorder_storageid,
                    'saleorder_salesdept': saleorder_salesdept,
                    'saleorder_salesuser': saleorder_salesuser,
                    'saleorder_sourceid': saleorder_sourceid,
                    'saleorder_remark': saleorder_remark,
                    'goodsjson': goodsjson,
                    'lackGoodsjson': lackGoodsjson,
                    'saveaudit': saveaudit,
                    // 'oldFromData':oldFromData,
                };
                resolve(from_date);
                // console.log(from_date);

                // alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应
            }
        };

        xhr.onerror = function() {
            alert("Request failed");
        };
    })
}

// module 更新订单
function updateOrder(from_date){
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest();
        let data;
        xhr.open('post', 'http://47.107.106.156:8888/sales/updateOrder.do');
        // 必须在xhr.send()前设置
        xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
        // data必须是这种表单数据格式的字符串;否则服务器接受到数据,按照表单数据格式解析,实际发送的不是表单格式的数据,将会解析不出来
        if (from_date.saleorder_salestype) {
            data = `addType=real&saleorder.oldid=${from_date.saleorder_id}&saleorder.id=${from_date.saleorder_id}&saleorder.businessdate=${from_date.saleorder_businessdate}&saleorder.status=${from_date.saleorder_status}&saleorder.customerid=${from_date.saleorder_customerid}&saleorder.salestype=${from_date.saleorder_salestype}&saleorder.urgentlevel=${from_date.saleorder_urgentlevel}&saleorder.storageid=${from_date.saleorder_storageid}&saleorder.salesdept=${from_date.saleorder_salesdept}&saleorder.salesuser=${from_date.saleorder_salesuser}&saleorder.sourceid=${from_date.saleorder_sourceid}&saleorder.remark=${from_date.saleorder_remark}&goodsjson=${from_date.goodsjson}&lackGoodsjson=${from_date.lackGoodsjson}&saveaudit=${from_date.saveaudit}`;
        } else {
            data = `addType=real&saleorder.oldid=${from_date.saleorder_id}&saleorder.id=${from_date.saleorder_id}&saleorder.businessdate=${from_date.saleorder_businessdate}&saleorder.status=${from_date.saleorder_status}&saleorder.customerid=${from_date.saleorder_customerid}&saleorder.urgentlevel=${from_date.saleorder_urgentlevel}&saleorder.storageid=${from_date.saleorder_storageid}&saleorder.salesdept=${from_date.saleorder_salesdept}&saleorder.salesuser=${from_date.saleorder_salesuser}&saleorder.sourceid=${from_date.saleorder_sourceid}&saleorder.remark=${from_date.saleorder_remark}&goodsjson=${from_date.goodsjson}&lackGoodsjson=${from_date.lackGoodsjson}&saveaudit=${from_date.saveaudit}`;
        }
        xhr.send(encodeURI(data));
        xhr.onload = function() {
            if (xhr.status != 200) { // 分析响应的 HTTP 状态
                alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
            } else { // 显示结果
                let xhrString = JSON.parse(xhr.response)
                console.log(xhrString.flag);
                resolve(xhrString.flag);
            }
        };
        xhr.onerror = function() {
            alert("Request failed");
        };
    })
}

// module 根据客户数量排序
function customerNumber(customer){
    let customer_list=[];   // 用来存放客户对象列表
// 循环客户数组
    customer.forEach((item, index, array) => {
        let customer_arr = {};  // 客户对象
        let customer_index = [];    // 客户顺序数组
        // 用客户数组里的客户搜索客户对象列表里的客户对象并且取反
        if (!customer_list.find(customer_arr => customer_arr.customer === item)) {
            // 如果没找到,则证明客户对象列表里没有这个名称的客户对象,然后循环客户数组找出序号
            customer.forEach((item_1, index_1, array_1) => {
                if (item === item_1) {
                    customer_index.push(index_1)
                }
            });
            customer_arr = {
                'customer': item,
                'index': customer_index
            }
            customer_list.push(customer_arr)
        }
    });
    // console.log(customer_list);

// 客户序号数组
    let order_index = [];
// 循环给客户序号数组赋值为0
    for (let i = 0; i < customer.length; i++) {
        order_index.push(0)
    }
    let customer_num = 1;   // 客户送货顺序变量
// 循环客户对象列表
    for (let key in customer_list) {
        // 当客户对象里index列表大于1时,则说明有2个以上相同的客户
        if (customer_list[key].index.length>1){
            let customer_index= customer_list[key].index;   //变量等于当前这个客户index列表
            let num_list =1;    //相同客户计数
            // 循环客户index列表
            customer_index.forEach((item, index, array) => {
                if (order_index[item]===0) {
                    order_index.splice(item, 1, `${customer_num}-${num_list}`)
                }
                ++num_list
            });
            ++customer_num
        } else {
            order_index.splice(customer_list[key].index,1,customer_num);
            ++customer_num
        }
    }
    return order_index
}

// module 获取订单的客户名
function getOrderCustomer(order){
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest();
        let url = new URL('http://47.107.106.156:8888/sales/getOrderList.do');
        url.searchParams.set('businessdate', '');
        url.searchParams.set('businessdate1', '');
        url.searchParams.set('id', order);
        url.searchParams.set('salesdept', '');
        url.searchParams.set('customerid', '');
        url.searchParams.set('status', '2');
        url.searchParams.set('sourceid', '');
        url.searchParams.set('goodsid', '');
        url.searchParams.set('printsign', '');
        url.searchParams.set('queryprinttimes', '0');
        url.searchParams.set('urgentlevel', '');
        url.searchParams.set('lineid', '');
        url.searchParams.set('isstoragelock', '0');
        url.searchParams.set('salesuserArrs', '');
        url.searchParams.set('page', '1');
        url.searchParams.set('rows', '20');
        url.searchParams.set('sort', 'addtime');
        url.searchParams.set('order', 'desc');

        // 2. 配置它:从 URL /article/.../load GET-request
        xhr.open('post', url);

        // 3. 通过网络发送请求
        xhr.send();

        // 4. 当接收到响应后,将调用此函数
        xhr.onload = function() {
            if (xhr.status != 200) { // 分析响应的 HTTP 状态
                alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
            } else { // 显示结果
                let xhrString = JSON.parse(xhr.response)
                if (xhrString.total > 0){
                    // console.log(xhrString.rows[0].customername);
                    resolve(xhrString.rows[0].customername);
                }
            }
        };

        xhr.onerror = function() {
            alert("Request failed");
        };
    })
}

// module 排序单号
function sortOrder(order_list, customer_list) {
    let order_temp=[];
    let customer_temp = [];
    customer_list.forEach((item, index) => {
        let find_index = customer_temp.indexOf(item);
        if (find_index>=0){
            customer_temp.splice(find_index, 0, item);
            order_temp.splice(find_index,0,order_list[index]);
            // console.log(order_temp,customer_temp);
        } else {
            customer_temp.splice(index, 0, item);
            order_temp.splice(index,0,order_list[index]);
            // console.log(order_temp,customer_temp);
        }
    });
    return [order_temp,customer_temp]
}

// module 重制查询历史数据
function showCustomerSalesFlowList(customer,products){
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest();
        let query_date = getIntervalDate();
        let url = new URL('http://47.107.106.156:8888/report/finance/showCustomerSalesFlowList.do');
        url.searchParams.set("businessdate1", "2022-03-01");
        url.searchParams.set("businessdate2", query_date.end_date);
        url.searchParams.set("goodsid", products);
        url.searchParams.set("salesuser", "");
        url.searchParams.set("batchno", "");
        url.searchParams.set("goodssort", "");
        url.searchParams.set("customerid", customer);
        url.searchParams.set("pcustomerid", "");
        url.searchParams.set("salesarea", "");
        url.searchParams.set("customersort","");
        url.searchParams.set("salesdept", "");
        url.searchParams.set("brandid", "");
        url.searchParams.set("billtype[]", "2");
        url.searchParams.append("billtype[]", "3");
        url.searchParams.set("orderid", "");
        url.searchParams.set("type", "");
        url.searchParams.set("invoice1", "1");
        url.searchParams.set("writeoff1","1");
        url.searchParams.set("invoice2", "1");
        url.searchParams.set("writeoff2", "1");
        url.searchParams.set("id", "");
        url.searchParams.set("storageid", "");
        url.searchParams.set("supplierid", "");
        url.searchParams.set("page", "1");
        url.searchParams.set("rows", "1000");
        // 2. 配置它:从 URL /article/.../load GET-request
        xhr.open('post', url);

        // 3. 通过网络发送请求
        xhr.send();

        // 4. 当接收到响应后,将调用此函数
        xhr.onload = function() {
            if (xhr.status != 200) { // 分析响应的 HTTP 状态
                alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
            } else { // 显示结果
                let xhrString = JSON.parse(xhr.response)
                resolve(xhrString.rows)
                // alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应
            }
        };

        xhr.onerror = function() {
            alert("Request failed");
        };
    })
}


function showSalesOrderTrackReportData(customer,products){
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest();
        let url = new URL('http://47.107.106.156:8888/report/sales/showSalesOrderTrackReportData.do');
        let query_date = getIntervalDate();
        url.searchParams.set("businessdate1", "2022-03-01");
        url.searchParams.set("businessdate2", query_date.end_date);
        url.searchParams.set("id","");
        url.searchParams.set("brandid","");
        url.searchParams.set("goodsid", products);
        url.searchParams.set("customerid",customer);
        url.searchParams.set("checkstatus","");
        url.searchParams.set("salesuser","");
        url.searchParams.set("pcustomerid","");
        url.searchParams.set("indooruserid","");
        url.searchParams.set("sourceid","");
        url.searchParams.set("goodssort","");
        url.searchParams.set("page", "1");
        url.searchParams.set("rows", "1000");
        url.searchParams.set("sort", "businessdate");
        url.searchParams.set("order", "asc");
        // 2. 配置它:从 URL /article/.../load GET-request
        xhr.open('post', url);

        // 3. 通过网络发送请求
        xhr.send();

        // 4. 当接收到响应后,将调用此函数
        xhr.onload = function() {
            if (xhr.status != 200) { // 分析响应的 HTTP 状态
                alert(`Error ${xhr.status}: ${xhr.statusText}`); // 例如 404: Not Found
            } else { // 显示结果
                let xhrString = JSON.parse(xhr.response)
                resolve(xhrString.rows)
                // alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应
            }
        };

        xhr.onerror = function() {
            alert("Request failed");
        };
    })
}

async function queryHistoryPrice(customer,products){
    let user = new Object();
    let list_order = [];
    let returns_order=await showCustomerSalesFlowList(customer,products);
    let sale_order=await showSalesOrderTrackReportData(customer,products);
    // console.log(text)
    for (let row_num in returns_order){
        user = {     // 一个对象
            date: returns_order[row_num].businessdate,
            unitnum:returns_order[row_num].unitnum,
            price:returns_order[row_num].price,
            sendnum:returns_order[row_num].unitnum,
            checkprice:returns_order[row_num].price,
        };
        list_order.push(user)
    }
    for (let row_num in sale_order){
        if (sale_order[row_num].ordernum > 0) {
            user = {     // 一个对象
                date: sale_order[row_num].businessdate,
                unitnum: sale_order[row_num].initsendnum,
                price: sale_order[row_num].dispatchprice,
                sendnum: sale_order[row_num].sendnum === undefined?'未出库':sale_order[row_num].sendnum,
                checkprice: sale_order[row_num].checkprice === undefined?'未验收':sale_order[row_num].checkprice,
            };
            list_order.push(user)
        }
    }
    list_order.sort(function(a,b){
        // Turn your strings into dates, and then subtract them
        // to get a value that is either negative, positive, or zero.
        return new Date(a.date)-new Date(b.date);
    });
    // console.log(xhrString)
    let table_html = '';
    let table_parentNode = document.querySelector("#table_row");
    let x = 1;  //用x取余来做斑马格
    for (let row_num in list_order){
        table_html = `
<tr class="${(x%2 ==0) ?"datagrid-row-alt datagrid-row":"datagrid-row"}" style="${(list_order[row_num].price !==list_order[row_num].checkprice) ? "font-weight: bold;color: red;":""}">
<td class="len120">${list_order[row_num].date}</td>
<td class="len100">${list_order[row_num].unitnum}</td>
<td class="len100">${list_order[row_num].price}</td>
<td class="len100">${list_order[row_num].sendnum}</td>
<td class="len100">${list_order[row_num].checkprice}</td>
</tr>
` + table_html;
        x=++x;
    }
    // console.log(table_html);
    table_parentNode.innerHTML=table_html;
}

// module 按键监听事件并且判断输入价格
function checkKey(e) {
    if (e.key == '*') {
        e.preventDefault();
        let price = prompt("请输入价格", ""); //输入价格
        price_number = Number(price);
        if (price != '' && price_number){
            console.log('ok')
            addSaveDetailCopy(true,price_number)
        }
    }
}

// module 深复制
function deepCopy(obj) {
    //判断要克隆的是数组还是对象。
    var toStr = Object.prototype.toString, //引用,目的是简化
        arrStr = '[ Object Array ] ',//引用,目的是简化比对
        newObj= toStr.call (obj) ==arrStr ? [] : {};
    //用instanceof运算符就是var newObj = obj instanceof Array ? [] : {};
    //用constructor运算符就是var newObj = new obj.constructor();
    if(obj instanceof Date) return new Date(obj);
    if(obj instanceof RegExp) return new RegExp(obj);
    //克隆正则和Date对象的情况。
    for (var key in obj) {
        //检测一个属性是否是对象的自有属性
        if (obj.hasOwnProperty(key)) {
            //三木运算符简化代码,判断是对象或者数组且不为空,为真则递归,不然返回值。
            newObj[key] = typeof obj[key] === 'object' && obj[key] !== null ? deepCopy(obj[key]) : obj[key];
        }
    }
    return newObj;
}

// module 换货单添加数据进表格
function addSaveDetailCopy(go,price) { //添加新数据确定后操作,
    var flag = $("#sales-form-swapOrderDetailAddPage").form('validate');
    if (flag == false) {
        return false;
    }
    var form = $("#sales-form-swapOrderDetailAddPage").serializeJSON();
    var goodsJson = $("#sales-goodsId-swapOrderDetailAddPage").goodsWidget('getObject');
    form.goodsInfo = goodsJson;
    var customer = $("#sales-customer-swapOrderAddPage-hidden").val();
    form.fixnum = form.unitnum;
    if (form.overnum != 0) {
        if (form.auxnum == null || form.auxnum == "") {
            form.auxnum = 0;
        }
        form.auxnumdetail = form.auxnum + form.auxunitname + form.overnum + form.unitname;
    } else {
        form.auxnumdetail = form.auxnum + form.auxunitname;
    }
    let form_copy =deepCopy(form);
    addSaveDetailReverse(form_copy,price);
    var rowIndex = 0;
    var rows = $wareList.datagrid('getRows');
    var updateFlag = false;
    for (var i = 0; i < rows.length; i++) {
        var rowJson = rows[i];

        if (rowJson.goodsid == undefined && rowJson.brandid == undefined) {
            rowIndex = i;
            break;
        }
    }
    // console.log(form)
    if (rowIndex == rows.length - 1) {
        $wareList.datagrid('appendRow', {}); //如果是最后一行则添加一新行
    }
    if (insertIndex == undefined) {
        $wareList.datagrid('updateRow', {index: rowIndex, row: form}); //将数据更新到列表中
    }
    else {
        $wareList.datagrid('insertRow', {index: insertIndex + 1, row: form});
        insertIndex = undefined;
    }
    if (go) { //go为true确定并继续添加一条
        $("#sales-form-swapOrderDetailAddPage").form("clear");
        $("input[name=deliverydate]").val(deliverydate);
        $("#sales-deliverytype-swapOrderDetailAddPage").val("0");
    }
    else { //否则直接关闭
        $("#sales-dialog-swapOrderAddPage-content").dialog('close', true)
    }

    countTotal(); //第添加一条商品明细计算一次合计
}


// module 换货单商品数量取反
function addSaveDetailReverse(form,price) { //添加新数据确定后操作,
    form.taxprice = price;
    form.boxprice = price *Number(form.boxnum);
    form.unitnum = -1*Number(form.unitnum);
    form.fixnum = form.unitnum;
    form.taxamount = form.taxprice * form.unitnum

    var rowIndex = 0;
    var rows = $wareList.datagrid('getRows');
    var updateFlag = false;
    for (var i = 0; i < rows.length; i++) {
        var rowJson = rows[i];

        if (rowJson.goodsid == undefined && rowJson.brandid == undefined) {
            rowIndex = i;
            break;
        }
    }
    // console.log(form)
    if (rowIndex == rows.length - 1) {
        $wareList.datagrid('appendRow', {}); //如果是最后一行则添加一新行
    }
    if (insertIndex == undefined) {
        $wareList.datagrid('updateRow', {index: rowIndex, row: form}); //将数据更新到列表中
    }
    else {
        $wareList.datagrid('insertRow', {index: insertIndex + 1, row: form});
        insertIndex = undefined;
    }
    // if (go) { //go为true确定并继续添加一条
    //     // $("#sales-form-swapOrderDetailAddPage").form("clear");
    //     // $("input[name=deliverydate]").val(deliverydate);
    //     // $("#sales-deliverytype-swapOrderDetailAddPage").val("0");
    // }
    // else { //否则直接关闭
    //     $("#sales-dialog-swapOrderAddPage-content").dialog('close', true)
    // }

    countTotal(); //第添加一条商品明细计算一次合计
}