// ==UserScript==
// @name appendModel
// @namespace http://tampermonkey.net/
// @version 2.01
// @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: (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)
}
});
//增加单据搜索
elmGetter.get('input[name="saleorderid"]').then(input_order => {
input_order.addEventListener("keypress", addSearch,true);
// console.log(order);
});
// elmGetter.get('#sales-sourceid-orderAddPage').then(order => {
// order.addEventListener("focusout", addListener,true);
// // console.log(order);
// });
//给新增销售订单的单号元素添加监听
elmGetter.each('#sales-sourceid-orderAddPage', document, order => {
order.addEventListener("focusout", addListener,true);
// console.log(order);
});
//给新增退货通知单的单号元素添加监听
elmGetter.get('#sales-sourceid-rejectBillAddPage').then(out_order => {
out_order.addEventListener("focusout", addListenerOutOrder,true);
// console.log(out_order);
});
//订单添加规格
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')
});
//订单添加最新采购价
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')
});
//销售单添加历史销售明细
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="len80">仓库</td>
<td class="len80">单位</td>
<td class="len100">数量</td>
<td class="len100">单价</td>
<td class="len120">金额</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')
});
//换货单添加历史销售明细
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="len80">仓库</td>
<td class="len80">单位</td>
<td class="len100">数量</td>
<td class="len100">单价</td>
<td class="len120">金额</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')
});
//退货单添加历史销售明细
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="len80">仓库</td>
<td class="len80">单位</td>
<td class="len100">数量</td>
<td class="len100">单价</td>
<td class="len120">金额</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')
});
// 换货单添加最新采购价
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')
});
})();
//添加元素
function addElement(element,element_id,add_string,add_mode){
if(!document.querySelector(element_id)){
element.insertAdjacentHTML(add_mode,add_string)
}
}
// 查询订单号重复
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");
};
}
//更新规格和最新采购价
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;
showCustomerSalesFlowList((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
}
}
//销售核销添加搜索功能
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();
}
}
//格式化单据号
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
}
//查询核销单号
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
}
}
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);
}
}
//添加销售单单号重复查询
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);
}
}
//添加退货通知单单号重复查询
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);
}
}
//查询销售单是否核销
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
}
//查询退货单是否核销
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('已经核销');
return
} else if (rows[0].isinvoice === '1'){
AddAlertTd('已经申请抽单');
return
}
} else {
AddAlertTd('未验收');
return
}
// alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应
}
};
xhr.onerror = function() {
alert("Request failed");
};
}
// 查询退货单号重复
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");
};
}
//获取时间参数
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
}
// 查询销售情况流水明细
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");
};
}