appendModel

append model in orderDetailAddPage

Ekde 2023/01/03. Vidu La ĝisdata versio.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         appendModel
// @namespace    http://tampermonkey.net/
// @version      4.11
// @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;
            } else if(config.url==='sales/supplierAuditOrderMuti.do'){
                let regexp = /X.*,/g;
                let order = config.body.match(regexp);
                let order_list = order.toString().split(',');
                if (undefined===order_list[order_list.length]){
                    order_list.splice(-1, 1)
                }
                let num =1;
                let total = `${order_list.length}~`;
                let order_index;
                let customer_list=[];
                let order_mode = prompt('请输入订单备注模式:\n 1.按照订单数量(默认)\n 2.按照客户数量','1');
                let input_urgent_level = prompt('请输入订单加急级别,保持原有级别直接回车');
                if (order_mode === '2') {
                    for (let item of order_list) {
                        let customer = await getOrderCustomer(item);
                        customer_list.push(customer);
                    }
                    let temp_list = sortOrder(order_list,customer_list);
                    order_list=temp_list[0];
                    customer_list = temp_list[1];
                    order_index = customerNumber(customer_list);
                    total = '';
                    num = 0;
                }
                for (let item of order_list) {
                    let text = await queryOrderStock(item)
                    let from_data;
                    if (text){
                        from_data = await queryEditOrder(item,order_mode === '2' ? order_index[num] : num,
                            total,input_urgent_level,'orderEditPage.do')
                        // updateOrder(from_date)

                    } else {
                        from_data = await queryEditOrder(item,order_mode === '2' ? order_index[num] : num,
                            total,input_urgent_level,'orderDeployInfoPage.do')
                        // updateOrder(from_date)
                    }
                    let flag = await updateOrder(from_data);
                    // console.log(`第${num}张单`);
                    num++;
                }
                config.body = config.body.replace(regexp,`${order_list.toString()},`);
            }
            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-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?sale_order[row_num].sendnum:'未出库',
                checkprice: sale_order[row_num].checkprice?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;
}