// ==UserScript==
// @name swporder
// @namespace https://scriptcat.org/zh-CN/script-show-page/3820
// @version 1.6
// @description 在'换货单'增加功能
// @author fengxia
// @match http://122.13.25.247:8888/sales/swaporder/swapOrderPage.do
// @match http://47.107.106.156:8888/sales/swaporder/swapOrderPage.do
// @match http://47.107.106.156:8888/sales/swaporder/swapOrderPage.do?type=edit&id=*
// @match http://122.13.25.247:8888/sales/swaporder/swapOrderPage.do?type=edit&id=*
// @match http://47.107.106.156:8888/sales/swaporder/showSwapOrderListPage.do*
// @match http://122.13.25.247:8888/sales/swaporder/showSwapOrderListPage.do*
// @icon data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDEiIGhlaWdodD0iNDEiIHZpZXdCb3g9IjAgMCA0MSA0MSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBzdHJva2Utd2lkdGg9IjEuNSIgY2xhc3M9ImgtNiB3LTYiIHJvbGU9ImltZyI+PHRpdGxlPkNoYXRHUFQ8L3RpdGxlPjx0ZXh0IHg9Ii05OTk5IiB5PSItOTk5OSI+Q2hhdEdQVDwvdGV4dD48cGF0aCBkPSJNMzcuNTMyNCAxNi44NzA3QzM3Ljk4MDggMTUuNTI0MSAzOC4xMzYzIDE0LjA5NzQgMzcuOTg4NiAxMi42ODU5QzM3Ljg0MDkgMTEuMjc0NCAzNy4zOTM0IDkuOTEwNzYgMzYuNjc2IDguNjg2MjJDMzUuNjEyNiA2LjgzNDA0IDMzLjk4ODIgNS4zNjc2IDMyLjAzNzMgNC40OTg1QzMwLjA4NjQgMy42Mjk0MSAyNy45MDk4IDMuNDAyNTkgMjUuODIxNSAzLjg1MDc4QzI0Ljg3OTYgMi43ODkzIDIzLjcyMTkgMS45NDEyNSAyMi40MjU3IDEuMzYzNDFDMjEuMTI5NSAwLjc4NTU3NSAxOS43MjQ5IDAuNDkxMjY5IDE4LjMwNTggMC41MDAxOTdDMTYuMTcwOCAwLjQ5NTA0NCAxNC4wODkzIDEuMTY4MDMgMTIuMzYxNCAyLjQyMjE0QzEwLjYzMzUgMy42NzYyNCA5LjM0ODUzIDUuNDQ2NjYgOC42OTE3IDcuNDc4MTVDNy4zMDA4NSA3Ljc2Mjg2IDUuOTg2ODYgOC4zNDE0IDQuODM3NyA5LjE3NTA1QzMuNjg4NTQgMTAuMDA4NyAyLjczMDczIDExLjA3ODIgMi4wMjgzOSAxMi4zMTJDMC45NTY0NjQgMTQuMTU5MSAwLjQ5ODkwNSAxNi4yOTg4IDAuNzIxNjk4IDE4LjQyMjhDMC45NDQ0OTIgMjAuNTQ2NyAxLjgzNjEyIDIyLjU0NDkgMy4yNjggMjQuMTI5M0MyLjgxOTY2IDI1LjQ3NTkgMi42NjQxMyAyNi45MDI2IDIuODExODIgMjguMzE0MUMyLjk1OTUxIDI5LjcyNTYgMy40MDcwMSAzMS4wODkyIDQuMTI0MzcgMzIuMzEzOEM1LjE4NzkxIDM0LjE2NTkgNi44MTIzIDM1LjYzMjIgOC43NjMyMSAzNi41MDEzQzEwLjcxNDEgMzcuMzcwNCAxMi44OTA3IDM3LjU5NzMgMTQuOTc4OSAzNy4xNDkyQzE1LjkyMDggMzguMjEwNyAxNy4wNzg2IDM5LjA1ODcgMTguMzc0NyAzOS42MzY2QzE5LjY3MDkgNDAuMjE0NCAyMS4wNzU1IDQwLjUwODcgMjIuNDk0NiA0MC40OTk4QzI0LjYzMDcgNDAuNTA1NCAyNi43MTMzIDM5LjgzMjEgMjguNDQxOCAzOC41NzcyQzMwLjE3MDQgMzcuMzIyMyAzMS40NTU2IDM1LjU1MDYgMzIuMTExOSAzMy41MTc5QzMzLjUwMjcgMzMuMjMzMiAzNC44MTY3IDMyLjY1NDcgMzUuOTY1OSAzMS44MjFDMzcuMTE1IDMwLjk4NzQgMzguMDcyOCAyOS45MTc4IDM4Ljc3NTIgMjguNjg0QzM5Ljg0NTggMjYuODM3MSA0MC4zMDIzIDI0LjY5NzkgNDAuMDc4OSAyMi41NzQ4QzM5Ljg1NTYgMjAuNDUxNyAzOC45NjM5IDE4LjQ1NDQgMzcuNTMyNCAxNi44NzA3Wk0yMi40OTc4IDM3Ljg4NDlDMjAuNzQ0MyAzNy44ODc0IDE5LjA0NTkgMzcuMjczMyAxNy42OTk0IDM2LjE1MDFDMTcuNzYwMSAzNi4xMTcgMTcuODY2NiAzNi4wNTg2IDE3LjkzNiAzNi4wMTYxTDI1LjkwMDQgMzEuNDE1NkMyNi4xMDAzIDMxLjMwMTkgMjYuMjY2MyAzMS4xMzcgMjYuMzgxMyAzMC45Mzc4QzI2LjQ5NjQgMzAuNzM4NiAyNi41NTYzIDMwLjUxMjQgMjYuNTU0OSAzMC4yODI1VjE5LjA1NDJMMjkuOTIxMyAyMC45OThDMjkuOTM4OSAyMS4wMDY4IDI5Ljk1NDEgMjEuMDE5OCAyOS45NjU2IDIxLjAzNTlDMjkuOTc3IDIxLjA1MiAyOS45ODQyIDIxLjA3MDcgMjkuOTg2NyAyMS4wOTAyVjMwLjM4ODlDMjkuOTg0MiAzMi4zNzUgMjkuMTk0NiAzNC4yNzkxIDI3Ljc5MDkgMzUuNjg0MUMyNi4zODcyIDM3LjA4OTIgMjQuNDgzOCAzNy44ODA2IDIyLjQ5NzggMzcuODg0OVpNNi4zOTIyNyAzMS4wMDY0QzUuNTEzOTcgMjkuNDg4OCA1LjE5NzQyIDI3LjcxMDcgNS40OTgwNCAyNS45ODMyQzUuNTU3MTggMjYuMDE4NyA1LjY2MDQ4IDI2LjA4MTggNS43MzQ2MSAyNi4xMjQ0TDEzLjY5OSAzMC43MjQ4QzEzLjg5NzUgMzAuODQwOCAxNC4xMjMzIDMwLjkwMiAxNC4zNTMyIDMwLjkwMkMxNC41ODMgMzAuOTAyIDE0LjgwODggMzAuODQwOCAxNS4wMDczIDMwLjcyNDhMMjQuNzMxIDI1LjExMDNWMjguOTk3OUMyNC43MzIxIDI5LjAxNzcgMjQuNzI4MyAyOS4wMzc2IDI0LjcxOTkgMjkuMDU1NkMyNC43MTE1IDI5LjA3MzYgMjQuNjk4OCAyOS4wODkzIDI0LjY4MjkgMjkuMTAxMkwxNi42MzE3IDMzLjc0OTdDMTQuOTA5NiAzNC43NDE2IDEyLjg2NDMgMzUuMDA5NyAxMC45NDQ3IDM0LjQ5NTRDOS4wMjUwNiAzMy45ODExIDcuMzg3ODUgMzIuNzI2MyA2LjM5MjI3IDMxLjAwNjRaTTQuMjk3MDcgMTMuNjE5NEM1LjE3MTU2IDEyLjA5OTggNi41NTI3OSAxMC45MzY0IDguMTk4ODUgMTAuMzMyN0M4LjE5ODg1IDEwLjQwMTMgOC4xOTQ5MSAxMC41MjI4IDguMTk0OTEgMTAuNjA3MVYxOS44MDhDOC4xOTM1MSAyMC4wMzc4IDguMjUzMzQgMjAuMjYzOCA4LjM2ODIzIDIwLjQ2MjlDOC40ODMxMiAyMC42NjE5IDguNjQ4OTMgMjAuODI2NyA4Ljg0ODYzIDIwLjk0MDRMMTguNTcyMyAyNi41NTQyTDE1LjIwNiAyOC40OTc5QzE1LjE4OTQgMjguNTA4OSAxNS4xNzAzIDI4LjUxNTUgMTUuMTUwNSAyOC41MTczQzE1LjEzMDcgMjguNTE5MSAxNS4xMTA3IDI4LjUxNiAxNS4wOTI0IDI4LjUwODJMNy4wNDA0NiAyMy44NTU3QzUuMzIxMzUgMjIuODYwMSA0LjA2NzE2IDIxLjIyMzUgMy41NTI4OSAxOS4zMDQ2QzMuMDM4NjIgMTcuMzg1OCAzLjMwNjI0IDE1LjM0MTMgNC4yOTcwNyAxMy42MTk0Wk0zMS45NTUgMjAuMDU1NkwyMi4yMzEyIDE0LjQ0MTFMMjUuNTk3NiAxMi40OTgxQzI1LjYxNDIgMTIuNDg3MiAyNS42MzMzIDEyLjQ4MDUgMjUuNjUzMSAxMi40Nzg3QzI1LjY3MjkgMTIuNDc2OSAyNS42OTI4IDEyLjQ4MDEgMjUuNzExMSAxMi40ODc5TDMzLjc2MzEgMTcuMTM2NEMzNC45OTY3IDE3Ljg0OSAzNi4wMDE3IDE4Ljg5ODIgMzYuNjYwNiAyMC4xNjEzQzM3LjMxOTQgMjEuNDI0NCAzNy42MDQ3IDIyLjg0OSAzNy40ODMyIDI0LjI2ODRDMzcuMzYxNyAyNS42ODc4IDM2LjgzODIgMjcuMDQzMiAzNS45NzQzIDI4LjE3NTlDMzUuMTEwMyAyOS4zMDg2IDMzLjk0MTUgMzAuMTcxNyAzMi42MDQ3IDMwLjY2NDFDMzIuNjA0NyAzMC41OTQ3IDMyLjYwNDcgMzAuNDczMyAzMi42MDQ3IDMwLjM4ODlWMjEuMTg4QzMyLjYwNjYgMjAuOTU4NiAzMi41NDc0IDIwLjczMjggMzIuNDMzMiAyMC41MzM4QzMyLjMxOSAyMC4zMzQ4IDMyLjE1NCAyMC4xNjk4IDMxLjk1NSAyMC4wNTU2Wk0zNS4zMDU1IDE1LjAxMjhDMzUuMjQ2NCAxNC45NzY1IDM1LjE0MzEgMTQuOTE0MiAzNS4wNjkgMTQuODcxN0wyNy4xMDQ1IDEwLjI3MTJDMjYuOTA2IDEwLjE1NTQgMjYuNjgwMyAxMC4wOTQzIDI2LjQ1MDQgMTAuMDk0M0MyNi4yMjA2IDEwLjA5NDMgMjUuOTk0OCAxMC4xNTU0IDI1Ljc5NjMgMTAuMjcxMkwxNi4wNzI2IDE1Ljg4NThWMTEuOTk4MkMxNi4wNzE1IDExLjk3ODMgMTYuMDc1MyAxMS45NTg1IDE2LjA4MzcgMTEuOTQwNUMxNi4wOTIxIDExLjkyMjUgMTYuMTA0OCAxMS45MDY4IDE2LjEyMDcgMTEuODk0OUwyNC4xNzE5IDcuMjUwMjVDMjUuNDA1MyA2LjUzOTAzIDI2LjgxNTggNi4xOTM3NiAyOC4yMzgzIDYuMjU0ODJDMjkuNjYwOCA2LjMxNTg5IDMxLjAzNjQgNi43ODA3NyAzMi4yMDQ0IDcuNTk1MDhDMzMuMzcyMyA4LjQwOTM5IDM0LjI4NDIgOS41Mzk0NSAzNC44MzM0IDEwLjg1MzFDMzUuMzgyNiAxMi4xNjY3IDM1LjU0NjQgMTMuNjA5NSAzNS4zMDU1IDE1LjAxMjhaTTE0LjI0MjQgMjEuOTQxOUwxMC44NzUyIDE5Ljk5ODFDMTAuODU3NiAxOS45ODkzIDEwLjg0MjMgMTkuOTc2MyAxMC44MzA5IDE5Ljk2MDJDMTAuODE5NSAxOS45NDQxIDEwLjgxMjIgMTkuOTI1NCAxMC44MDk4IDE5LjkwNThWMTAuNjA3MUMxMC44MTA3IDkuMTgyOTUgMTEuMjE3MyA3Ljc4ODQ4IDExLjk4MTkgNi41ODY5NkMxMi43NDY2IDUuMzg1NDQgMTMuODM3NyA0LjQyNjU5IDE1LjEyNzUgMy44MjI2NEMxNi40MTczIDMuMjE4NjkgMTcuODUyNCAyLjk5NDY0IDE5LjI2NDkgMy4xNzY3QzIwLjY3NzUgMy4zNTg3NiAyMi4wMDg5IDMuOTM5NDEgMjMuMTAzNCA0Ljg1MDY3QzIzLjA0MjcgNC44ODM3OSAyMi45MzcgNC45NDIxNSAyMi44NjY4IDQuOTg0NzNMMTQuOTAyNCA5LjU4NTE3QzE0LjcwMjUgOS42OTg3OCAxNC41MzY2IDkuODYzNTYgMTQuNDIxNSAxMC4wNjI2QzE0LjMwNjUgMTAuMjYxNiAxNC4yNDY2IDEwLjQ4NzcgMTQuMjQ3OSAxMC43MTc1TDE0LjI0MjQgMjEuOTQxOVpNMTYuMDcxIDE3Ljk5OTFMMjAuNDAxOCAxNS40OTc4TDI0LjczMjUgMTcuOTk3NVYyMi45OTg1TDIwLjQwMTggMjUuNDk4M0wxNi4wNzEgMjIuOTk4NVYxNy45OTkxWiIgZmlsbD0iY3VycmVudENvbG9yIj48L3BhdGg+PC9zdmc+
// @require https://scriptcat.org/lib/513/2.1.0/ElementGetter.js
// @require https://scriptcat.org/lib/637/1.4.6/ajaxHooker.js
// @grant none
//@run-at document-start
// ==/UserScript==
(function() {
'use strict';
let re_url = /(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}/;
let temp_url = window.location.href;
window.site_url;
window.test = re_url.exec(temp_url)[0];
const eg = elmGetter;
elmGetter.each('#sales-sourceid-swapOrderAddPage', document, order => {
order.addEventListener("change", () => addListenerOutOrder(order, 'sourceid'),true);
});
// unsafeWindow.addEventListener('keydown', (evt)=>{
// console.log('evt',evt);
// });
createTbaleTd()
ajaxHooker.hook(request => {
console.log(request.url)
if (request.url === 'sales/getGoodsDetail.do') {
request.response = res => {
let json_array,products_id,products_model,products_newbuyprice
try {
json_array =((JSON.parse(res.responseText)).detail)['goodsInfo'];
// console.log(json_array.id)
products_id =json_array.id;
products_model = json_array.model;
products_newbuyprice = json_array.newbuyprice;
}
catch(err){
console.log(err)
}
let customer_id
let select_year = $('.new_div .tabs-selected span').html()
// console.log(customer_id?$('#sales-customer-hidden-swapOrderAddPage').val():document.querySelector('[id^="sales-customer-showid"] a').innerText,products_id,select_year )
$('#products_price').val(products_newbuyprice)
$('#products_model').val(products_model)
queryHistoryPrice(customer_id?$('#sales-customer-hidden-swapOrderAddPage').val():document.querySelector('[id^="sales-customer-showid"] a').innerText,products_id,select_year )
};
}
if (request.url.includes('sales/swaporder/swapOrderEditPage.do?id=')) {
request.response = res => {
let temp = readstring(res.responseText)
try {
elmGetter.each('#sales-id-swapOrderAddPage', document, reply => {
let taxtable = $('td[field="taxprice"][class="droppable"]');
var newbuytable ='
最新采购价
'
taxtable.after(newbuytable);
let taxtables = $('td[field="taxprice"]');
for (let i = 1; i < taxtables.length; i++) {
if (i<=temp.length){
var newtd = `${temp[i-1]['goodsInfo']['newbuyprice'].toFixed(2)}
`
taxtables.eq(i).after(newtd);
}
else {
var scendtd = '
'
taxtables.eq(i).after(scendtd);
}
}
})
}
catch(err){
console.log(err)
}
};
}
});
elmGetter.each('#sales-form-swapOrderDetailAddPage', document, reply => {
// reply.addEventListener("keydown",checkKey);
var targetDiv = $('div.panel.window').filter("[style*='display: block;']");
var targetShadow = $('div.window-shadow').filter("[style*='display: block;']");
const div_top = targetDiv.css("top")
var div_wight = $('div.window-mask').width();
const div_num= div_wight-1010;
// const div_index = targetDiv.css("z-index")
// console.log(div_index);
// var screenWidth = window.screen.width;
// console.log(screenWidth)
// if (screenWidth <= 1550) {
targetDiv.css("left",div_num*0.85+"px");
targetShadow.css("left",div_num*0.85+"px");
// }
var newDiv =`
`
var second_div= `
`
const currentYear = new Date().getFullYear();
const startYear = (currentYear - 5 < 2022) ? 2022 : (currentYear - 5);
// 生成年份的li元素
var tab_div = ""
var table_div=""
for (let year = startYear; year <= currentYear; year++) {
// 创建新的li元素
let liClass = ""; // li的class属性初始化为
let divstyle="display: none"
if (year === startYear) {
liClass += "tabs-last"; // 第一个li添加tabs-last类,第一个是2022年
}
if (year === currentYear) {
liClass += " tabs-first tabs-selected"; // 最后一个li添加tabs-first类
divstyle = "display: block"
}
tab_div +=`${year} `;
table_div +=`
`;
}
newDiv=newDiv+tab_div+' '+table_div+second_div+'
'
targetDiv.before(newDiv);//添加新div
var remove_div = $(".new_div");
var remove_second_div = $(".second_div")
targetDiv.find(".panel-tool-close").on('click', function() {//添加一个关闭窗口的函数
remove_div.remove(); // 移除新DIV
remove_second_div.remove();
});
// 换货单添加自动取反
var swp_taxprice = $("#sales-taxprice-swapOrderDetailAddPage")
swp_taxprice.css("width","60px");
var swp_str = `
+
- `
swp_taxprice.after(swp_str);
// $("[name='unitnum']").focus(function() {
// // console.log('Input is focused');
// }).blur(function() {
// $("#sales-taxprice-swapOrderDetailAddPage").trigger("select");
// // console.log('Input is not focused');
// });
var price_temp= $("[name='price']")
swp_taxprice.focus(function() {
// console.log('Input is focused');
}).blur(function() {
price_temp.trigger("select");
// console.log('Input is not focused');
});
price_temp.keydown(function(event){
if(event.keyCode==13){
// console.log(price_temp.val())
if(price_temp.val()==""){
addSaveDetail(true);
return false;
}
else{
add(true,price_temp.val())
addSaveDetail(true);
return false;
}
}
// console.log(event.keyCode);
});
$('.new_div .tabs li').on('click', function() {//给新的分页添加切换效果
// 检查当前选中的标签
if (!$(this).hasClass('tabs-selected')) {
var index = $(this).index();
var div_table = $('.new_div .panel-body-noborder.layout-body');
div_table.css("display", "none");
div_table.eq(index).css("display", "block");
// 移除其他标签的选中状态
$('.tabs li').removeClass('tabs-selected');
// 添加选中状态到当前标签
$(this).addClass('tabs-selected');
let products_id = $("input[name=goodsid]").val()
if (products_id!=''){
let customer_id
let select_year = $('.new_div .tabs-selected span').html()
console.log(customer_id?$('#sales-customer-hidden-swapOrderAddPage').val():document.querySelector('[id^="sales-customer-showid"] a').innerText,products_id,select_year)
queryHistoryPrice(customer_id?$('#sales-customer-hidden-swapOrderAddPage').val():document.querySelector('[id^="sales-customer-showid"] a').innerText,products_id,select_year )
}
}});
return true;
});
})();
function add(go,price) { //添加新数据确定后操作,
var flag = true;
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();
var f_t = Number(form.taxprice)
var f_b = Number(form.boxnum)
var f_u = Number(form.unitnum)
// console.log(form.taxamount)
if (price>0){
form.taxprice = price
form.fixnum = f_u * -1
form.unitnum = form.fixnum
form.boxprice = price*f_b
form.taxamount = form.unitnum * price
}
else{
form.fixnum = form.unitnum
form.boxprice = form.taxprice * f_b
form.taxamount = form.unitnum * form.taxprice
}
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;
}
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 && price>0) { //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(); //第添加一条商品明细计算一次合计
}
function getIntervalDate(year){
let start_date,end_date
if (year){
start_date = `${year}-01-01`;
end_date = `${year}-12-31`;
}
else if(typeof year == 'undefined') {
let date = new Date();
end_date = `${date.getFullYear()}-${(date.getMonth()+1).toString().padStart(2,"0")}-${date.getDate().toString().padStart(2,'0')}`;
date.setDate(date.getDate()-90);
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
}
// 查询历史旧价
async function queryHistoryPrice(customer,products,year){
let user = new Object();
let list_order = [];
let returns_order=await showCustomerSalesFlowList(customer,products,year);
// let sale_order=await showSalesOrderTrackReportData(customer,products,year);
// console.log(sa2)
for (let row_num in returns_order){
user = { // 一个对象
goodsid:returns_order[row_num].goodsid,
date: returns_order[row_num].businessdate,
unitnum:returns_order[row_num].enternum===0?returns_order[row_num].outnum:returns_order[row_num].enternum*-1,
price:returns_order[row_num].price,
};
list_order.push(user)
}
// for (let row_num in sale_order){
// if (sale_order[row_num].ordernum > 0) {
// user = { // 一个对象
// goodsid:sale_order[row_num].goodsid,
// 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(list_order)
//console.log(Object.keys(list_order).length === 0)
let tr_html = '';
let x = 1; //用x取余来做斑马格
for (let row_num in list_order){
tr_html = tr_html+`
${list_order[row_num].goodsid}
${list_order[row_num].date}
${list_order[row_num].unitnum}
${list_order[row_num].price}
`;
x=++x;
}
if (Object.keys(list_order).length === 0){tr_html=`${products}无销售`}
let table_html = `
'
let div = $('.panel-body-noborder.layout-body.'+year);
$(div).html(table_html);
countunitnum(list_order)
}
// module 根据出入库流水账查询销售退货单数据
function showCustomerSalesFlowList(customer,products,year){
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
let query_date = getIntervalDate(year);
// let url = new URL(`http://${window.test}:8888/report/finance/showCustomerSalesFlowList.do`);
let url = new URL(`http://${window.test}:8888/report/storage/showInOutFlowListData.do`);
url.searchParams.set("businessdate1", query_date.start_date);
url.searchParams.set("businessdate2", query_date.end_date);
url.searchParams.set("id", "");
url.searchParams.set("brandid", "");
url.searchParams.set("goodsid", products);
url.searchParams.set("billtype", ["1","5"]);
url.searchParams.set("supplierid", "");
url.searchParams.set("customerid", customer);
url.searchParams.set("storageid", "");
url.searchParams.set("customersort","");
url.searchParams.set("audituserid", "");
url.searchParams.set("page", "1");
url.searchParams.set("rows", "1000");
url.searchParams.set("sort", "businessdate");
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("2");
resolve(xhrString.rows)
// alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应
}
};
xhr.onerror = function() {
alert("Request failed");
};
})
}
// 通过查询订单追踪明细表获取订单数据
function showSalesOrderTrackReportData(customer,products,year){
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
let url = new URL(`http://${window.test}:8888/report/sales/showSalesOrderTrackReportData.do`);
let query_date = getIntervalDate(year);
url.searchParams.set("businessdate1", query_date.start_date);
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("oldFromData", {"businessdate1":query_date.start_date,"businessdate2":query_date.end_date,"id":"","brandid":"","goodsid":"","customerid":"","checkstatus":"","salesuser":"","pcustomerid":"","indooruserid":"","sourceid":"","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)
// console.log("1");
resolve(xhrString.rows)
// alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应
}
};
xhr.onerror = function() {
alert("Request failed");
};
})
}
function checkKey(e) {
if (e.key == '*') {
e.preventDefault();
let price = prompt("请输入价格", ""); //输入价格
let price_number = Number(price);
if (price != '' && price_number){
console.log('ok')
add(true,-1)
add(true,price_number)
}
}
}
function countTotal() { //计算合计
var checkrows = $("#sales-datagrid-swapOrderAddPage").datagrid('getChecked');
var usablenum = 0;
var unitnum = 0;
var taxamount = 0;
var notaxamount = 0;
var tax = 0;
var totalbox = 0;
var totalboxweight = 0;
var totalboxvolume = 0;
for (var i = 0; i < checkrows.length; i++) {
usablenum += Number(checkrows[i].usablenum == undefined ? 0 : checkrows[i].usablenum);
unitnum += Number(checkrows[i].unitnum == undefined ? 0 : checkrows[i].unitnum);
taxamount += Number(checkrows[i].taxamount == undefined ? 0 : checkrows[i].taxamount);
notaxamount += Number(checkrows[i].notaxamount == undefined ? 0 : checkrows[i].notaxamount);
tax += Number(checkrows[i].tax == undefined ? 0 : checkrows[i].tax);
totalbox += Number(checkrows[i].totalbox == undefined ? 0 : checkrows[i].totalbox);
totalboxweight += Number(checkrows[i].totalboxweight == undefined ? 0 : checkrows[i].totalboxweight);
totalboxvolume += Number(checkrows[i].totalboxvolume == undefined ? 0 : checkrows[i].totalboxvolume);
}
totalboxweight = formatterMoney(totalboxweight);
totalboxweight = formatterMoney(totalboxweight);
totalbox=totalbox.toFixed(2);
var foot = [{
goodsid: '选中合计',
usablenum: usablenum,
unitnum: unitnum,
taxamount: taxamount,
notaxamount: notaxamount,
tax: tax,
auxnumdetail: totalbox + "箱",
totalboxvolume: totalboxvolume,
totalboxweight: totalboxweight
}];
//合计
var rows = $("#sales-datagrid-swapOrderAddPage").datagrid('getRows');
var usablenumSum = 0;
var unitnumSum = 0;
var taxamountSum = 0;
var notaxamountSum = 0;
var taxSum = 0;
var totalboxSum = 0;
var totalboxweightSum = 0;
var totalboxvolumeSum = 0;
for (var i = 0; i < rows.length; i++) {
usablenumSum += Number(rows[i].usablenum == undefined ? 0 : rows[i].usablenum);
unitnumSum += Number(rows[i].unitnum == undefined ? 0 : rows[i].unitnum);
taxamountSum += Number(rows[i].taxamount == undefined ? 0 : rows[i].taxamount);
notaxamountSum += Number(rows[i].notaxamount == undefined ? 0 : rows[i].notaxamount);
taxSum += Number(rows[i].tax == undefined ? 0 : rows[i].tax);
totalboxSum += Number(rows[i].totalbox == undefined ? 0 : rows[i].totalbox);
totalboxweightSum += Number(rows[i].totalboxweight == undefined ? 0 : rows[i].totalboxweight);
totalboxvolumeSum += Number(rows[i].totalboxvolume == undefined ? 0 : rows[i].totalboxvolume);
}
totalboxSum = formatterMoney(totalboxSum);
var footSum = {
goodsid: '合计',
usablenum: usablenumSum,
unitnum: Number(unitnumSum.toFixed()),
taxamount: taxamountSum,
notaxamount: notaxamountSum,
tax: taxSum,
auxnumdetail: totalboxSum + "箱",
totalboxvolume: totalboxvolumeSum,
totalboxweight: totalboxweightSum
};
foot.push(footSum);
$("#sales-datagrid-swapOrderAddPage").datagrid('reloadFooter', foot);
}
function countunitnum(data){
const amountGroups = {};
// 2. 遍历所有行,计算金额并分组
data.forEach(item => {
// 假设item有price和quantity属性
const quantity = item.unitnum;
const amount = item.price;
// 按金额分组并累加数量
if (!amountGroups[amount]) {
amountGroups[amount] = 0;
}
amountGroups[amount] += quantity;
});
let result = "不同单价的数量总和: ";
for (const [amount, totalQuantity] of Object.entries(amountGroups)) {
result += `单价 ${amount}: 数量总和 = ${totalQuantity} `;
}
$('#second_swp').html(result);
// 4. 显示结果
// console.log(result);
}
function createTbaleTd(){
elmGetter.each('#remark', document, add_model => {
const table_tr=add_model.closest('tr');
const table_tbody=add_model.closest('tbody');
let model_string = `
规格:
`
table_tr.insertAdjacentHTML('beforeend', model_string);
let price_string = `
最新采购价:
`
table_tbody.insertAdjacentHTML('beforeend', price_string);
})
}
function readstring(stringdata){
const regex = /\[{.*\}]/s;
const match = stringdata.match(regex);
const jsonData = JSON.parse(match[0]);
return jsonData
}
// module 添加冲差单客户单号查询
function addListenerOutOrder(out_order,model){
let customer = document.querySelector('#sales-customer-showid-swapOrderAddPage');
if (out_order.value){
// console.log(customer.innerText.slice(3),out_order.value);
queryOutOrder(customer.querySelector('a').innerText,out_order.value,model);
}
}
// module 查询冲差单客户单号
function queryOutOrder(customer,order_id,model){
let xhr = new XMLHttpRequest();
let url = new URL(`http://${window.test}:8888/sales/swaporder/getSwapOrderList.do`);
url.searchParams.set('selectids','');
url.searchParams.set('businessdate','');
url.searchParams.set('businessdate1','');
url.searchParams.set('id','');
url.searchParams.set('salesdept','');
url.searchParams.set('customerid',customer);
url.searchParams.set('status','');
url.searchParams.set('sourceid',order_id);
url.searchParams.set('goodsid','');
url.searchParams.set('printsign','');
url.searchParams.set('queryprinttimes','0');
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++) {
orderNo += `${xhrString.rows[i].id},`
}
if (orderNo){
alert( `有重复单,单号为${orderNo}`);
}
}
// alert(`Done, got ${xhr.response.length} bytes`); // response 是服务器响应
}
};
xhr.onerror = function() {
alert("Request failed");
};
}
// ============================================================
// 换货单批量审核(列表页 showSwapOrderListPage.do)
// 由 swap-batch-audit.user.js 合并而来;本脚本 @grant none,
// 故用同源 fetch 替代 GM_xmlhttpRequest(arrayBuffer + GBK 解码)
// ============================================================
(function () {
'use strict';
// 仅在换货单列表页运行
function isListPage() {
return location.pathname.indexOf('/sales/swaporder/showSwapOrderListPage.do') !== -1;
}
if (!isListPage()) return;
// ==================== 可配置项 ====================
const CONFIG = {
baseUrl: location.origin, // 跟随当前页面地址(支持 47.107.106.156 / 122.13.25.247)
editPageUrl: '/sales/swaporder/swapOrderEditPage.do', // GET 编辑页
submitUrl: '/sales/swaporder/updateSwapOrder.do', // POST 提交审核
saveauditValue: 'saveaudit', // saveaudit 字段值,若实测应为 save 改这里
unauditedStatus: '2', // 未审核状态码,编辑页 status 非此值则跳过
goodsRowTotal: 12, // goodsjson 不足此行数补空对象 { };达到或超过则不补
delayMs: 300, // 每单之间的间隔
timeoutMs: 30000, // 单次请求超时(毫秒)
};
// ==================== 工具函数 ====================
// 同源 fetch 封装,arrayBuffer 接收以支持 GBK 解码;带超时控制
async function httpRequest(options) {
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), CONFIG.timeoutMs);
try {
const res = await fetch(options.url, {
method: options.method || 'GET',
headers: options.headers || {},
body: options.data,
credentials: 'include',
signal: controller.signal,
});
const buffer = await res.arrayBuffer();
return { status: res.status, response: buffer, contentType: res.headers.get('content-type') || '' };
} catch (e) {
if (e && e.name === 'AbortError') throw new Error('请求超时(' + CONFIG.timeoutMs + 'ms)');
throw new Error('网络错误: ' + (e && e.message ? e.message : e));
} finally {
clearTimeout(timer);
}
}
// 按响应头/HTML meta 判断编码,默认 gbk
function decodeResponse(res) {
const buffer = res.response;
if (!buffer) return '';
let charset = '';
const ctMatch = (res.contentType || '').match(/charset=([\w-]+)/i);
if (ctMatch) charset = ctMatch[1].toLowerCase();
if (!charset) {
const head = new TextDecoder('utf-8', { fatal: false }).decode(buffer.slice(0, 2048)).toLowerCase();
const metaMatch = head.match(/charset=["']?([\w-]+)/);
if (metaMatch) charset = metaMatch[1];
}
if (!charset) charset = 'gbk';
try {
return new TextDecoder(charset, { fatal: false }).decode(buffer);
} catch (e) {
return new TextDecoder('gbk', { fatal: false }).decode(buffer);
}
}
function sleep(ms) {
return new Promise((r) => setTimeout(r, ms));
}
// ==================== 1. 收集勾选的单号 ====================
function getCheckedIds() {
const ids = [];
const push = (id) => { if (id && ids.indexOf(id) === -1) ids.push(id); };
// 优先用 EasyUI datagrid API 取选中行,比解析 DOM 更稳(兼容冻结列/翻页)
const jq = window.$ || window.jQuery;
if (jq && jq.fn && jq.fn.datagrid) {
jq('table').each(function () {
let checked = null;
try { checked = jq(this).datagrid('getChecked'); } catch (e) { return; /* 非 datagrid */ }
if (checked && checked.length) {
checked.forEach((row) => { if (row && row.id != null) push(String(row.id)); });
}
});
}
// 回退:无 EasyUI 或 API 取不到时解析 DOM
if (ids.length === 0) {
document.querySelectorAll('tr.datagrid-row').forEach((tr) => {
const cls = tr.className || '';
const cb = tr.querySelector('input[name="ck"]');
const checked = cls.indexOf('datagrid-row-checked') !== -1 || (cb && cb.checked);
if (!checked) return;
const cell = tr.querySelector('td[field="id"] .datagrid-cell');
if (cell) push(cell.textContent.trim());
});
}
return ids;
}
// ==================== 2/3. 抓取编辑页并提取提交数据 ====================
async function fetchEditPageHtml(id) {
const url = CONFIG.baseUrl + CONFIG.editPageUrl + '?id=' + encodeURIComponent(id) + '&_=' + Date.now();
const res = await httpRequest({ method: 'GET', url });
if (res.status < 200 || res.status >= 300) {
throw new Error('编辑页返回 HTTP ' + res.status);
}
return decodeResponse(res);
}
// 从编辑页 HTML 提取全部提交字段
function extractFormData(html, id) {
const doc = new DOMParser().parseFromString(html, 'text/html');
// 所有 input(hidden 为主)按 name 收集
const fields = {};
doc.querySelectorAll('input[name]').forEach((inp) => {
fields[inp.name] = inp.value == null ? '' : inp.value;
});
const form = {
addType: fields['addType'] || 'real',
'saleSwapOrder.oldid': fields['saleSwapOrder.oldid'] || id,
'saleSwapOrder.id': fields['saleSwapOrder.id'] || id,
'saleSwapOrder.businessdate': fields['saleSwapOrder.businessdate'] || '',
'saleSwapOrder.status': fields['saleSwapOrder.status'] || '',
'saleSwapOrder.customerid': fields['saleSwapOrder.customerid'] || '',
'saleSwapOrder.salesdept': fields['saleSwapOrder.salesdept'] || '',
'saleSwapOrder.salesuser': fields['saleSwapOrder.salesuser'] || '',
'saleSwapOrder.sourceid': fields['saleSwapOrder.sourceid'] || '',
'saleSwapOrder.storageid': fields['saleSwapOrder.storageid'] || '',
'saleSwapOrder.remark': fields['saleSwapOrder.remark'] || '',
goodsjson: '',
saveaudit: CONFIG.saveauditValue,
ck: fields['ck'] || '',
oldFromData: fields['oldFromData'] || '',
};
// 校验:id 必须一致,status 必须为未审核
if (form['saleSwapOrder.id'] !== id) {
throw new Error('编辑页单号不一致: ' + form['saleSwapOrder.id']);
}
if (form['saleSwapOrder.status'] !== CONFIG.unauditedStatus) {
throw new Error('状态非未审核(status=' + form['saleSwapOrder.status'] + '),跳过');
}
// 提取