代码备份
This commit is contained in:
parent
aa8bcaaabe
commit
0069490db0
@ -7,5 +7,5 @@ VITE_API_URL2 = https://maxcessth.gatedge.cn:91
|
||||
VITE_API_File1 = https://maxcessth.gatedge.cn
|
||||
|
||||
|
||||
VITE_API_File = https://maxcess.gatedge.cn
|
||||
VITE_API_URL = https://maxcess.gatedge.cn:91
|
||||
VITE_API_File = https://maxcessth.gatedge.cn
|
||||
VITE_API_URL = http://58.252.252.77:91
|
||||
@ -6,5 +6,5 @@ VITE_API_URL1 = http://58.252.252.77:90
|
||||
VITE_API_URL2 = https://maxcessth.gatedge.cn:91
|
||||
VITE_API_File1 = https://maxcessth.gatedge.cn
|
||||
|
||||
VITE_API_File = https://maxcessth.gatedge.cn
|
||||
VITE_API_URL = https://maxcessth.gatedge.cn:91
|
||||
VITE_API_File = https://maxcess.gatedge.cn
|
||||
VITE_API_URL = http://58.252.252.77:90
|
||||
189
LodopFuncs.js
Normal file
189
LodopFuncs.js
Normal file
@ -0,0 +1,189 @@
|
||||
//==本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例,可直接使用,建议理解后融入自己程序==
|
||||
|
||||
//用双端口加载主JS文件Lodop.js(或CLodopfuncs.js兼容老版本)以防其中某端口被占:
|
||||
var MainJS ="CLodopfuncs.js",
|
||||
URL_WS1 = "ws://localhost:8000/"+MainJS, //ws用8000/18000
|
||||
URL_WS2 = "ws://localhost:18000/"+MainJS,
|
||||
URL_HTTP1 = "http://localhost:8000/"+MainJS, //http用8000/18000
|
||||
URL_HTTP2 = "http://localhost:18000/"+MainJS,
|
||||
URL_HTTP3 = "https://localhost.lodop.net:8443/"+MainJS; //https用8000/8443
|
||||
|
||||
var CreatedOKLodopObject, CLodopIsLocal, LoadJsState;
|
||||
|
||||
//==判断是否需要CLodop(那些不支持插件的浏览器):==
|
||||
function needCLodop() {
|
||||
try {
|
||||
var ua = navigator.userAgent;
|
||||
if (ua.match(/Windows\sPhone/i) ||
|
||||
ua.match(/iPhone|iPod|iPad/i) ||
|
||||
ua.match(/Android/i) ||
|
||||
ua.match(/Edge\D?\d+/i))
|
||||
return true;
|
||||
var verTrident = ua.match(/Trident\D?\d+/i);
|
||||
var verIE = ua.match(/MSIE\D?\d+/i);
|
||||
var verOPR = ua.match(/OPR\D?\d+/i);
|
||||
var verFF = ua.match(/Firefox\D?\d+/i);
|
||||
var x64 = ua.match(/x64/i);
|
||||
if ((!verTrident) && (!verIE) && (x64)) return true;
|
||||
else if (verFF) {
|
||||
verFF = verFF[0].match(/\d+/);
|
||||
if ((verFF[0] >= 41) || (x64)) return true;
|
||||
} else if (verOPR) {
|
||||
verOPR = verOPR[0].match(/\d+/);
|
||||
if (verOPR[0] >= 32) return true;
|
||||
} else if ((!verTrident) && (!verIE)) {
|
||||
var verChrome = ua.match(/Chrome\D?\d+/i);
|
||||
if (verChrome) {
|
||||
verChrome = verChrome[0].match(/\d+/);
|
||||
if (verChrome[0] >= 41) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
//==检查加载成功与否,如没成功则用http(s)再试==
|
||||
//==低版本CLODOP6.561/Lodop7.043及前)用本方法==
|
||||
function checkOrTryHttp() {
|
||||
if (window.getCLodop) {
|
||||
LoadJsState = "complete";
|
||||
return true;
|
||||
}
|
||||
if (LoadJsState == "loadingB" || LoadJsState == "complete") return;
|
||||
LoadJsState = "loadingB";
|
||||
var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
|
||||
var JS1 = document.createElement("script")
|
||||
,JS2 = document.createElement("script")
|
||||
,JS3 = document.createElement("script");
|
||||
JS1.src = URL_HTTP1;
|
||||
JS2.src = URL_HTTP2;
|
||||
JS3.src = URL_HTTP3;
|
||||
JS1.onload = JS2.onload = JS3.onload = JS2.onerror = JS3.onerror=function(){LoadJsState = "complete";}
|
||||
JS1.onerror = function(e) {
|
||||
if (window.location.protocol !== 'https:')
|
||||
head.insertBefore(JS2, head.firstChild); else
|
||||
head.insertBefore(JS3, head.firstChild);
|
||||
}
|
||||
head.insertBefore(JS1,head.firstChild);
|
||||
}
|
||||
|
||||
//==加载Lodop对象的主过程:==
|
||||
(function loadCLodop(){
|
||||
if (!needCLodop()) return;
|
||||
CLodopIsLocal = !!((URL_WS1 + URL_WS2).match(/\/\/localho|\/\/127.0.0./i));
|
||||
LoadJsState = "loadingA";
|
||||
|
||||
if (!window.WebSocket && window.MozWebSocket) window.WebSocket=window.MozWebSocket;
|
||||
//ws方式速度快(小于200ms)且可避免CORS错误,但要求Lodop版本足够新:
|
||||
try {
|
||||
var WSK1=new WebSocket(URL_WS1);
|
||||
WSK1.onopen = function(e) { setTimeout(checkOrTryHttp,200); }
|
||||
WSK1.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}
|
||||
WSK1.onerror = function(e) {
|
||||
var WSK2=new WebSocket(URL_WS2);
|
||||
WSK2.onopen = function(e) {setTimeout(checkOrTryHttp,200);}
|
||||
WSK2.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}
|
||||
WSK2.onerror= function(e) {checkOrTryHttp();}
|
||||
}
|
||||
} catch(e){
|
||||
checkOrTryHttp();
|
||||
}
|
||||
})();
|
||||
|
||||
//==获取LODOP对象主过程,判断是否安装、需否升级:==
|
||||
function getLodop(oOBJECT, oEMBED) {
|
||||
var strFontTag = "<br><font color='#FF00FF'>打印控件";
|
||||
var strLodopInstall = strFontTag + "未安装!点击这里<a href='install_lodop32.exe' target='_self'>执行安装</a>";
|
||||
var strLodopUpdate = strFontTag + "需要升级!点击这里<a href='install_lodop32.exe' target='_self'>执行升级</a>";
|
||||
var strLodop64Install = strFontTag + "未安装!点击这里<a href='install_lodop64.exe' target='_self'>执行安装</a>";
|
||||
var strLodop64Update = strFontTag + "需要升级!点击这里<a href='install_lodop64.exe' target='_self'>执行升级</a>";
|
||||
var strCLodopInstallA = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>下载执行安装</a>";
|
||||
var strCLodopInstallB = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)";
|
||||
var strCLodopUpdate = "<br><font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>";
|
||||
var strLodop7FontTag = "<br><font color='#FF00FF'>Web打印服务Lodop7";
|
||||
var strLodop7HrefX86 = "点击这里<a href='Lodop7_Linux_X86_64.tar.gz' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";
|
||||
var strLodop7HrefARM = "点击这里<a href='Lodop7_Linux_ARM64.tar.gz' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";
|
||||
var strLodop7Install_X86 = strLodop7FontTag + "未安装启动," + strLodop7HrefX86;
|
||||
var strLodop7Install_ARM = strLodop7FontTag + "未安装启动," + strLodop7HrefARM;
|
||||
var strLodop7Update_X86 = strLodop7FontTag + "需升级," + strLodop7HrefX86;
|
||||
var strLodop7Update_ARM = strLodop7FontTag + "需升级," + strLodop7HrefARM;
|
||||
var strInstallOK = ",成功后请刷新本页面或重启浏览器。</font>";
|
||||
var LODOP;
|
||||
try {
|
||||
var isWinIE = (/MSIE/i.test(navigator.userAgent)) || (/Trident/i.test(navigator.userAgent));
|
||||
var isWinIE64 = isWinIE && (/x64/i.test(navigator.userAgent));
|
||||
var isLinuxX86 = (/Linux/i.test(navigator.platform)) && (/x86/i.test(navigator.platform));
|
||||
var isLinuxARM = (/Linux/i.test(navigator.platform)) && (/aarch/i.test(navigator.platform));
|
||||
|
||||
if (needCLodop() || isLinuxX86 || isLinuxARM) {
|
||||
try {
|
||||
LODOP = window.getCLodop();
|
||||
} catch (err) {}
|
||||
if (!LODOP && LoadJsState !== "complete") {
|
||||
if (!LoadJsState)
|
||||
alert("未曾加载Lodop主JS文件,请先调用loadCLodop过程."); else
|
||||
alert("网页还没下载完毕,请稍等一下再操作.");
|
||||
return;
|
||||
}
|
||||
var strAlertMessage;
|
||||
if (!LODOP) {
|
||||
if (isLinuxX86)
|
||||
strAlertMessage = strLodop7Install_X86;
|
||||
else if (isLinuxARM)
|
||||
strAlertMessage = strLodop7Install_ARM;
|
||||
else
|
||||
strAlertMessage = strCLodopInstallA + (CLodopIsLocal ? strCLodopInstallB : "");
|
||||
document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;
|
||||
return;
|
||||
} else {
|
||||
if (isLinuxX86 && LODOP.CVERSION < "7.1.0.1")
|
||||
strAlertMessage = strLodop7Update_X86;
|
||||
else if (isLinuxARM && LODOP.CVERSION < "7.1.0.1")
|
||||
strAlertMessage = strLodop7Update_ARM;
|
||||
else if (CLODOP.CVERSION < "6.6.2.1")
|
||||
strAlertMessage = strCLodopUpdate;
|
||||
|
||||
if (strAlertMessage)
|
||||
document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;
|
||||
}
|
||||
} else {
|
||||
//==如果页面有Lodop插件就直接使用,否则新建:==
|
||||
if (oOBJECT || oEMBED) {
|
||||
if (isWinIE)
|
||||
LODOP = oOBJECT;
|
||||
else
|
||||
LODOP = oEMBED;
|
||||
} else if (!CreatedOKLodopObject) {
|
||||
LODOP = document.createElement("object");
|
||||
LODOP.setAttribute("width", 0);
|
||||
LODOP.setAttribute("height", 0);
|
||||
LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;");
|
||||
if (isWinIE)
|
||||
LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA");
|
||||
else
|
||||
LODOP.setAttribute("type", "application/x-print-lodop");
|
||||
document.documentElement.appendChild(LODOP);
|
||||
CreatedOKLodopObject = LODOP;
|
||||
} else
|
||||
LODOP = CreatedOKLodopObject;
|
||||
//==Lodop插件未安装时提示下载地址:==
|
||||
if ((!LODOP) || (!LODOP.VERSION)) {
|
||||
document.body.innerHTML = (isWinIE64 ? strLodop64Install : strLodopInstall) + strInstallOK + document.body.innerHTML;
|
||||
return LODOP;
|
||||
}
|
||||
if (LODOP.VERSION < "6.2.2.6") {
|
||||
document.body.innerHTML = (isWinIE64 ? strLodop64Update : strLodopUpdate) + strInstallOK + document.body.innerHTML;
|
||||
}
|
||||
}
|
||||
//===如下空白位置适合调用统一功能(如注册语句、语言选择等):======================
|
||||
LODOP.SET_LICENSES("","8B7A45DAE7262E36A87452727380929E9FC","","");
|
||||
//===============================================================================
|
||||
return LODOP;
|
||||
} catch (err) {
|
||||
alert("getLodop出错:" + err);
|
||||
}
|
||||
}
|
||||
|
||||
export { getLodop }
|
||||
@ -13,7 +13,7 @@
|
||||
content="123"
|
||||
/>
|
||||
<link rel="icon" href="/logo.png" />
|
||||
<script type="module" src="/lodop.js"></script>
|
||||
<script type="module" src="/LodopFuncs.js"></script>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
<title>Maxcess SCEP</title>
|
||||
</head>
|
||||
|
||||
335
lodop.js
335
lodop.js
@ -1,189 +1,196 @@
|
||||
//==本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例,可直接使用,建议理解后融入自己程序==
|
||||
|
||||
//用双端口加载主JS文件Lodop.js(或CLodopfuncs.js兼容老版本)以防其中某端口被占:
|
||||
var MainJS ="CLodopfuncs.js",
|
||||
URL_WS1 = "ws://localhost:8000/"+MainJS, //ws用8000/18000
|
||||
URL_WS2 = "ws://localhost:18000/"+MainJS,
|
||||
URL_HTTP1 = "http://localhost:8000/"+MainJS, //http用8000/18000
|
||||
URL_HTTP2 = "http://localhost:18000/"+MainJS,
|
||||
URL_HTTP3 = "https://localhost.lodop.net:8443/"+MainJS; //https用8000/8443
|
||||
var MainJS = 'CLodopfuncs.js',
|
||||
URL_WS1 = 'ws://localhost:8000/' + MainJS, //ws用8000/18000
|
||||
URL_WS2 = 'ws://localhost:18000/' + MainJS,
|
||||
URL_HTTP1 = 'http://localhost:8000/' + MainJS, //http用8000/18000
|
||||
URL_HTTP2 = 'http://localhost:18000/' + MainJS,
|
||||
URL_HTTP3 = 'https://localhost.lodop.net:8443/' + MainJS; //https用8000/8443
|
||||
|
||||
var CreatedOKLodopObject, CLodopIsLocal, LoadJsState;
|
||||
|
||||
//==判断是否需要CLodop(那些不支持插件的浏览器):==
|
||||
function needCLodop() {
|
||||
try {
|
||||
var ua = navigator.userAgent;
|
||||
if (ua.match(/Windows\sPhone/i) ||
|
||||
ua.match(/iPhone|iPod|iPad/i) ||
|
||||
ua.match(/Android/i) ||
|
||||
ua.match(/Edge\D?\d+/i))
|
||||
return true;
|
||||
var verTrident = ua.match(/Trident\D?\d+/i);
|
||||
var verIE = ua.match(/MSIE\D?\d+/i);
|
||||
var verOPR = ua.match(/OPR\D?\d+/i);
|
||||
var verFF = ua.match(/Firefox\D?\d+/i);
|
||||
var x64 = ua.match(/x64/i);
|
||||
if ((!verTrident) && (!verIE) && (x64)) return true;
|
||||
else if (verFF) {
|
||||
verFF = verFF[0].match(/\d+/);
|
||||
if ((verFF[0] >= 41) || (x64)) return true;
|
||||
} else if (verOPR) {
|
||||
verOPR = verOPR[0].match(/\d+/);
|
||||
if (verOPR[0] >= 32) return true;
|
||||
} else if ((!verTrident) && (!verIE)) {
|
||||
var verChrome = ua.match(/Chrome\D?\d+/i);
|
||||
if (verChrome) {
|
||||
verChrome = verChrome[0].match(/\d+/);
|
||||
if (verChrome[0] >= 41) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return true;
|
||||
}
|
||||
try {
|
||||
var ua = navigator.userAgent;
|
||||
if (ua.match(/Windows\sPhone/i) || ua.match(/iPhone|iPod|iPad/i) || ua.match(/Android/i) || ua.match(/Edge\D?\d+/i)) return true;
|
||||
var verTrident = ua.match(/Trident\D?\d+/i);
|
||||
var verIE = ua.match(/MSIE\D?\d+/i);
|
||||
var verOPR = ua.match(/OPR\D?\d+/i);
|
||||
var verFF = ua.match(/Firefox\D?\d+/i);
|
||||
var x64 = ua.match(/x64/i);
|
||||
if (!verTrident && !verIE && x64) return true;
|
||||
else if (verFF) {
|
||||
verFF = verFF[0].match(/\d+/);
|
||||
if (verFF[0] >= 41 || x64) return true;
|
||||
} else if (verOPR) {
|
||||
verOPR = verOPR[0].match(/\d+/);
|
||||
if (verOPR[0] >= 32) return true;
|
||||
} else if (!verTrident && !verIE) {
|
||||
var verChrome = ua.match(/Chrome\D?\d+/i);
|
||||
if (verChrome) {
|
||||
verChrome = verChrome[0].match(/\d+/);
|
||||
if (verChrome[0] >= 41) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
//==检查加载成功与否,如没成功则用http(s)再试==
|
||||
//==低版本CLODOP6.561/Lodop7.043及前)用本方法==
|
||||
function checkOrTryHttp() {
|
||||
if (window.getCLodop) {
|
||||
LoadJsState = "complete";
|
||||
return true;
|
||||
}
|
||||
if (LoadJsState == "loadingB" || LoadJsState == "complete") return;
|
||||
LoadJsState = "loadingB";
|
||||
var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
|
||||
var JS1 = document.createElement("script")
|
||||
,JS2 = document.createElement("script")
|
||||
,JS3 = document.createElement("script");
|
||||
JS1.src = URL_HTTP1;
|
||||
JS2.src = URL_HTTP2;
|
||||
JS3.src = URL_HTTP3;
|
||||
JS1.onload = JS2.onload = JS3.onload = JS2.onerror = JS3.onerror=function(){LoadJsState = "complete";}
|
||||
JS1.onerror = function(e) {
|
||||
if (window.location.protocol !== 'https:')
|
||||
head.insertBefore(JS2, head.firstChild); else
|
||||
head.insertBefore(JS3, head.firstChild);
|
||||
}
|
||||
head.insertBefore(JS1,head.firstChild);
|
||||
if (window.getCLodop) {
|
||||
LoadJsState = 'complete';
|
||||
return true;
|
||||
}
|
||||
if (LoadJsState == 'loadingB' || LoadJsState == 'complete') return;
|
||||
LoadJsState = 'loadingB';
|
||||
var head = document.head || document.getElementsByTagName('head')[0] || document.documentElement;
|
||||
var JS1 = document.createElement('script'),
|
||||
JS2 = document.createElement('script'),
|
||||
JS3 = document.createElement('script');
|
||||
JS1.src = URL_HTTP1;
|
||||
JS2.src = URL_HTTP2;
|
||||
JS3.src = URL_HTTP3;
|
||||
JS1.onload =
|
||||
JS2.onload =
|
||||
JS3.onload =
|
||||
JS2.onerror =
|
||||
JS3.onerror =
|
||||
function () {
|
||||
LoadJsState = 'complete';
|
||||
};
|
||||
JS1.onerror = function (e) {
|
||||
if (window.location.protocol !== 'https:') head.insertBefore(JS2, head.firstChild);
|
||||
else head.insertBefore(JS3, head.firstChild);
|
||||
};
|
||||
head.insertBefore(JS1, head.firstChild);
|
||||
}
|
||||
|
||||
//==加载Lodop对象的主过程:==
|
||||
(function loadCLodop(){
|
||||
if (!needCLodop()) return;
|
||||
CLodopIsLocal = !!((URL_WS1 + URL_WS2).match(/\/\/localho|\/\/127.0.0./i));
|
||||
LoadJsState = "loadingA";
|
||||
if (!window.WebSocket && window.MozWebSocket) window.WebSocket=window.MozWebSocket;
|
||||
//ws方式速度快(小于200ms)且可避免CORS错误,但要求Lodop版本足够新:
|
||||
try {
|
||||
var WSK1=new WebSocket(URL_WS1);
|
||||
WSK1.onopen = function(e) { setTimeout("checkOrTryHttp()",200); }
|
||||
WSK1.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}
|
||||
WSK1.onerror = function(e) {
|
||||
var WSK2=new WebSocket(URL_WS2);
|
||||
WSK2.onopen = function(e) {setTimeout("checkOrTryHttp()",200);}
|
||||
WSK2.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}
|
||||
WSK2.onerror= function(e) {checkOrTryHttp();}
|
||||
}
|
||||
} catch(e){
|
||||
checkOrTryHttp();
|
||||
}
|
||||
(function loadCLodop() {
|
||||
if (!needCLodop()) return;
|
||||
CLodopIsLocal = !!(URL_WS1 + URL_WS2).match(/\/\/localho|\/\/127.0.0./i);
|
||||
LoadJsState = 'loadingA';
|
||||
if (!window.WebSocket && window.MozWebSocket) window.WebSocket = window.MozWebSocket;
|
||||
//ws方式速度快(小于200ms)且可避免CORS错误,但要求Lodop版本足够新:
|
||||
try {
|
||||
var WSK1 = new WebSocket(URL_WS1);
|
||||
WSK1.onopen = function (e) {
|
||||
setTimeout('checkOrTryHttp()', 200);
|
||||
};
|
||||
WSK1.onmessage = function (e) {
|
||||
if (!window.getCLodop) eval(e.data);
|
||||
};
|
||||
WSK1.onerror = function (e) {
|
||||
var WSK2 = new WebSocket(URL_WS2);
|
||||
WSK2.onopen = function (e) {
|
||||
setTimeout('checkOrTryHttp()', 200);
|
||||
};
|
||||
WSK2.onmessage = function (e) {
|
||||
if (!window.getCLodop) eval(e.data);
|
||||
};
|
||||
WSK2.onerror = function (e) {
|
||||
checkOrTryHttp();
|
||||
};
|
||||
};
|
||||
} catch (e) {
|
||||
checkOrTryHttp();
|
||||
}
|
||||
})();
|
||||
|
||||
//==获取LODOP对象主过程,判断是否安装、需否升级:==
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-unused-vars
|
||||
function getLodop(oOBJECT, oEMBED) {
|
||||
var strFontTag = "<br><font color='#FF00FF'>打印控件";
|
||||
var strLodopInstall = strFontTag + "未安装!点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>执行安装</a>";
|
||||
var strLodopUpdate = strFontTag + "需要升级!点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>";
|
||||
var strLodop64Install = strFontTag + "未安装!点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>执行安装</a>";
|
||||
var strLodop64Update = strFontTag + "需要升级!点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>";
|
||||
var strCLodopInstallA = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>下载执行安装</a>";
|
||||
var strCLodopInstallB = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)";
|
||||
var strCLodopUpdate = "<br><font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>";
|
||||
var strLodop7FontTag = "<br><font color='#FF00FF'>Web打印服务Lodop7";
|
||||
var strLodop7HrefX86 = "点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";
|
||||
var strLodop7HrefARM = "点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";
|
||||
var strLodop7Install_X86 = strLodop7FontTag + "未安装启动," + strLodop7HrefX86;
|
||||
var strLodop7Install_ARM = strLodop7FontTag + "未安装启动," + strLodop7HrefARM;
|
||||
var strLodop7Update_X86 = strLodop7FontTag + "需升级," + strLodop7HrefX86;
|
||||
var strLodop7Update_ARM = strLodop7FontTag + "需升级," + strLodop7HrefARM;
|
||||
var strInstallOK = ",成功后请刷新本页面或重启浏览器。</font>";
|
||||
var LODOP;
|
||||
try {
|
||||
var isWinIE = (/MSIE/i.test(navigator.userAgent)) || (/Trident/i.test(navigator.userAgent));
|
||||
var isWinIE64 = isWinIE && (/x64/i.test(navigator.userAgent));
|
||||
var isLinuxX86 = (/Linux/i.test(navigator.platform)) && (/x86/i.test(navigator.platform));
|
||||
var isLinuxARM = (/Linux/i.test(navigator.platform)) && (/aarch/i.test(navigator.platform));
|
||||
alert("SET_LICENSES执行了");
|
||||
var strFontTag = "<br><font color='#FF00FF'>打印控件";
|
||||
var strLodopInstall = strFontTag + "未安装!点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>执行安装</a>";
|
||||
var strLodopUpdate = strFontTag + "需要升级!点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>";
|
||||
var strLodop64Install = strFontTag + "未安装!点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>执行安装</a>";
|
||||
var strLodop64Update = strFontTag + "需要升级!点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>";
|
||||
var strCLodopInstallA =
|
||||
"<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>下载执行安装</a>";
|
||||
var strCLodopInstallB = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)";
|
||||
var strCLodopUpdate =
|
||||
"<br><font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>";
|
||||
var strLodop7FontTag = "<br><font color='#FF00FF'>Web打印服务Lodop7";
|
||||
var strLodop7HrefX86 =
|
||||
"点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";
|
||||
var strLodop7HrefARM =
|
||||
"点击这里<a href='http://58.252.252.77:8085/CLodop_Setup_for_Win32NT.exe' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";
|
||||
var strLodop7Install_X86 = strLodop7FontTag + '未安装启动,' + strLodop7HrefX86;
|
||||
var strLodop7Install_ARM = strLodop7FontTag + '未安装启动,' + strLodop7HrefARM;
|
||||
var strLodop7Update_X86 = strLodop7FontTag + '需升级,' + strLodop7HrefX86;
|
||||
var strLodop7Update_ARM = strLodop7FontTag + '需升级,' + strLodop7HrefARM;
|
||||
var strInstallOK = ',成功后请刷新本页面或重启浏览器。</font>';
|
||||
var LODOP;
|
||||
try {
|
||||
var isWinIE = /MSIE/i.test(navigator.userAgent) || /Trident/i.test(navigator.userAgent);
|
||||
var isWinIE64 = isWinIE && /x64/i.test(navigator.userAgent);
|
||||
var isLinuxX86 = /Linux/i.test(navigator.platform) && /x86/i.test(navigator.platform);
|
||||
var isLinuxARM = /Linux/i.test(navigator.platform) && /aarch/i.test(navigator.platform);
|
||||
|
||||
if (needCLodop() || isLinuxX86 || isLinuxARM) {
|
||||
try {
|
||||
LODOP = window.getCLodop();
|
||||
} catch (err) { /* empty */ }
|
||||
if (!LODOP && LoadJsState !== "complete") {
|
||||
if (!LoadJsState)
|
||||
alert("未曾加载Lodop主JS文件,请先调用loadCLodop过程."); else
|
||||
alert("网页还没下载完毕,请稍等一下再操作.");
|
||||
return;
|
||||
}
|
||||
var strAlertMessage;
|
||||
if (!LODOP) {
|
||||
if (isLinuxX86)
|
||||
strAlertMessage = strLodop7Install_X86;
|
||||
else if (isLinuxARM)
|
||||
strAlertMessage = strLodop7Install_ARM;
|
||||
else
|
||||
strAlertMessage = strCLodopInstallA + (CLodopIsLocal ? strCLodopInstallB : "");
|
||||
document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;
|
||||
return;
|
||||
} else {
|
||||
if (isLinuxX86 && LODOP.CVERSION < "7.1.0.1")
|
||||
strAlertMessage = strLodop7Update_X86;
|
||||
else if (isLinuxARM && LODOP.CVERSION < "7.1.0.1")
|
||||
strAlertMessage = strLodop7Update_ARM;
|
||||
else if (CLODOP.CVERSION < "6.6.2.3")
|
||||
strAlertMessage = strCLodopUpdate;
|
||||
if (needCLodop() || isLinuxX86 || isLinuxARM) {
|
||||
try {
|
||||
LODOP = window.getCLodop();
|
||||
} catch (err) {
|
||||
/* empty */
|
||||
}
|
||||
if (!LODOP && LoadJsState !== 'complete') {
|
||||
if (!LoadJsState) alert('未曾加载Lodop主JS文件,请先调用loadCLodop过程.');
|
||||
else alert('网页还没下载完毕,请稍等一下再操作.');
|
||||
return;
|
||||
}
|
||||
var strAlertMessage;
|
||||
if (!LODOP) {
|
||||
if (isLinuxX86) strAlertMessage = strLodop7Install_X86;
|
||||
else if (isLinuxARM) strAlertMessage = strLodop7Install_ARM;
|
||||
else strAlertMessage = strCLodopInstallA + (CLodopIsLocal ? strCLodopInstallB : '');
|
||||
document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;
|
||||
return;
|
||||
} else {
|
||||
if (isLinuxX86 && LODOP.CVERSION < '7.1.0.1') strAlertMessage = strLodop7Update_X86;
|
||||
else if (isLinuxARM && LODOP.CVERSION < '7.1.0.1') strAlertMessage = strLodop7Update_ARM;
|
||||
else if (CLODOP.CVERSION < '6.6.2.3') strAlertMessage = strCLodopUpdate;
|
||||
|
||||
if (strAlertMessage)
|
||||
document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;
|
||||
}
|
||||
} else {
|
||||
//==如果页面有Lodop插件就直接使用,否则新建:==
|
||||
if (oOBJECT || oEMBED) {
|
||||
if (isWinIE)
|
||||
LODOP = oOBJECT;
|
||||
else
|
||||
LODOP = oEMBED;
|
||||
} else if (!CreatedOKLodopObject) {
|
||||
LODOP = document.createElement("object");
|
||||
LODOP.setAttribute("width", 0);
|
||||
LODOP.setAttribute("height", 0);
|
||||
LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;");
|
||||
if (isWinIE)
|
||||
LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA");
|
||||
else
|
||||
LODOP.setAttribute("type", "application/x-print-lodop");
|
||||
document.documentElement.appendChild(LODOP);
|
||||
CreatedOKLodopObject = LODOP;
|
||||
} else
|
||||
LODOP = CreatedOKLodopObject;
|
||||
//==Lodop插件未安装时提示下载地址:==
|
||||
if ((!LODOP) || (!LODOP.VERSION)) {
|
||||
document.body.innerHTML = (isWinIE64 ? strLodop64Install : strLodopInstall) + strInstallOK + document.body.innerHTML;
|
||||
return LODOP;
|
||||
}
|
||||
if (LODOP.VERSION < "6.2.2.6") {
|
||||
document.body.innerHTML = (isWinIE64 ? strLodop64Update : strLodopUpdate) + strInstallOK + document.body.innerHTML;
|
||||
}
|
||||
}
|
||||
//===如下空白位置适合调用统一功能(如注册语句、语言选择等):=======================
|
||||
LODOP.SET_LICENSES("","EE0887D00FCC7D29375A695F728489A6","C94CEE276DB2187AE6B65D56B3FC2848","");
|
||||
if (strAlertMessage) document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;
|
||||
}
|
||||
} else {
|
||||
//==如果页面有Lodop插件就直接使用,否则新建:==
|
||||
if (oOBJECT || oEMBED) {
|
||||
if (isWinIE) LODOP = oOBJECT;
|
||||
else LODOP = oEMBED;
|
||||
} else if (!CreatedOKLodopObject) {
|
||||
LODOP = document.createElement('object');
|
||||
LODOP.setAttribute('width', 0);
|
||||
LODOP.setAttribute('height', 0);
|
||||
LODOP.setAttribute('style', 'position:absolute;left:0px;top:-100px;width:0px;height:0px;');
|
||||
if (isWinIE) LODOP.setAttribute('classid', 'clsid:2105C259-1E0C-4534-8141-A753534CB4CA');
|
||||
else LODOP.setAttribute('type', 'application/x-print-lodop');
|
||||
document.documentElement.appendChild(LODOP);
|
||||
CreatedOKLodopObject = LODOP;
|
||||
} else LODOP = CreatedOKLodopObject;
|
||||
//==Lodop插件未安装时提示下载地址:==
|
||||
if (!LODOP || !LODOP.VERSION) {
|
||||
document.body.innerHTML = (isWinIE64 ? strLodop64Install : strLodopInstall) + strInstallOK + document.body.innerHTML;
|
||||
return LODOP;
|
||||
}
|
||||
if (LODOP.VERSION < '6.2.2.6') {
|
||||
document.body.innerHTML = (isWinIE64 ? strLodop64Update : strLodopUpdate) + strInstallOK + document.body.innerHTML;
|
||||
}
|
||||
}
|
||||
//===如下空白位置适合调用统一功能(如注册语句、语言选择等):=======================
|
||||
alert("SET_LICENSES执行了");
|
||||
LODOP.SET_LICENSES("","8B7A45DAE7262E36A87452727380929E9FC","","");
|
||||
alert("SET_LICENSES执行了");
|
||||
|
||||
//===============================================================================
|
||||
return LODOP;
|
||||
} catch (err) {
|
||||
alert("getLodop出错:" + err);
|
||||
}
|
||||
//===============================================================================
|
||||
return LODOP;
|
||||
} catch (err) {
|
||||
alert('getLodop出错:' + err);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -133,5 +133,22 @@ export function listApi() {
|
||||
data,
|
||||
});
|
||||
},
|
||||
//修改发票号和发票日期
|
||||
BatchSetFaPiao: (data: object) => {
|
||||
return request({
|
||||
url: '/api/Admin/InvoiceOrder/BatchSetFaPiao',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
},
|
||||
|
||||
//删除某个发货订单明细
|
||||
DeleteOrderDetail: (data: object) => {
|
||||
return request({
|
||||
url: '/api/Admin/InvoiceOrder/DeleteOrderDetail',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@ -58,6 +58,7 @@ export default {
|
||||
pleaseConfirmTheDateChange:' Please confirm the date change',
|
||||
passwordChangedFailed:'Password changed failed',
|
||||
shipmentQTY:'Shipment QTY',
|
||||
prompt:'Tips',
|
||||
invoiceNumber:'Invoice number',
|
||||
invoiceNumber1:'Invoice #',
|
||||
deliveryNote1:'Delivery Note',
|
||||
@ -77,14 +78,19 @@ export default {
|
||||
success:'Success',
|
||||
copy:'Copy',
|
||||
deleteText:'Delete',
|
||||
deleteTextAll:'Delete All',
|
||||
scqd:'Please confirm the deletion of the delivery note?',
|
||||
scqd1:'Please confirm the deletion of the Data?',
|
||||
receiver:'Receiver',
|
||||
sltzddh:'Delivery Note Number',
|
||||
qtxfph:'Input invoice #',
|
||||
fprq:'Invoice date#',
|
||||
qxzfprq:'Select Invoice date#',
|
||||
organizationCode:'Organization Code',
|
||||
organizationName:'Organization Name'
|
||||
organizationName:'Organization Name',
|
||||
xgfphm:'Please confirm the Invoice No. modification.',
|
||||
xgfprq:'Please confirm the Invoice date modification.',
|
||||
cgtype:'PO Type'
|
||||
},
|
||||
tiaoma:{
|
||||
pno:'P/NO',
|
||||
|
||||
@ -78,14 +78,19 @@ export default {
|
||||
success:'成功',
|
||||
copy:'复制',
|
||||
deleteText:'删除',
|
||||
deleteTextAll:'删除整单',
|
||||
scqd:'确定要删除该条送货单?',
|
||||
scqd1:'确定要删除该条数据?',
|
||||
receiver:'接收人',
|
||||
sltzddh:'收料通知单单号',
|
||||
qtxfph:'请填写发票号',
|
||||
fprq:'发票日期',
|
||||
qxzfprq:'请选择发票日期',
|
||||
organizationCode:'组织代码',
|
||||
organizationName:'组织名称'
|
||||
organizationName:'组织名称',
|
||||
xgfphm:'确定要修改此次发票号',
|
||||
xgfprq:'确定要修改此次发票日期',
|
||||
cgtype:'采购类型'
|
||||
},
|
||||
tiaoma:{
|
||||
pno:'物料编码',
|
||||
|
||||
189
src/utils/LodopFuncs.js
Normal file
189
src/utils/LodopFuncs.js
Normal file
@ -0,0 +1,189 @@
|
||||
//==本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例,可直接使用,建议理解后融入自己程序==
|
||||
|
||||
//用双端口加载主JS文件Lodop.js(或CLodopfuncs.js兼容老版本)以防其中某端口被占:
|
||||
var MainJS ="CLodopfuncs.js",
|
||||
URL_WS1 = "ws://localhost:8000/"+MainJS, //ws用8000/18000
|
||||
URL_WS2 = "ws://localhost:18000/"+MainJS,
|
||||
URL_HTTP1 = "http://localhost:8000/"+MainJS, //http用8000/18000
|
||||
URL_HTTP2 = "http://localhost:18000/"+MainJS,
|
||||
URL_HTTP3 = "https://localhost.lodop.net:8443/"+MainJS; //https用8000/8443
|
||||
|
||||
var CreatedOKLodopObject, CLodopIsLocal, LoadJsState;
|
||||
|
||||
//==判断是否需要CLodop(那些不支持插件的浏览器):==
|
||||
function needCLodop() {
|
||||
try {
|
||||
var ua = navigator.userAgent;
|
||||
if (ua.match(/Windows\sPhone/i) ||
|
||||
ua.match(/iPhone|iPod|iPad/i) ||
|
||||
ua.match(/Android/i) ||
|
||||
ua.match(/Edge\D?\d+/i))
|
||||
return true;
|
||||
var verTrident = ua.match(/Trident\D?\d+/i);
|
||||
var verIE = ua.match(/MSIE\D?\d+/i);
|
||||
var verOPR = ua.match(/OPR\D?\d+/i);
|
||||
var verFF = ua.match(/Firefox\D?\d+/i);
|
||||
var x64 = ua.match(/x64/i);
|
||||
if ((!verTrident) && (!verIE) && (x64)) return true;
|
||||
else if (verFF) {
|
||||
verFF = verFF[0].match(/\d+/);
|
||||
if ((verFF[0] >= 41) || (x64)) return true;
|
||||
} else if (verOPR) {
|
||||
verOPR = verOPR[0].match(/\d+/);
|
||||
if (verOPR[0] >= 32) return true;
|
||||
} else if ((!verTrident) && (!verIE)) {
|
||||
var verChrome = ua.match(/Chrome\D?\d+/i);
|
||||
if (verChrome) {
|
||||
verChrome = verChrome[0].match(/\d+/);
|
||||
if (verChrome[0] >= 41) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
//==检查加载成功与否,如没成功则用http(s)再试==
|
||||
//==低版本CLODOP6.561/Lodop7.043及前)用本方法==
|
||||
function checkOrTryHttp() {
|
||||
if (window.getCLodop) {
|
||||
LoadJsState = "complete";
|
||||
return true;
|
||||
}
|
||||
if (LoadJsState == "loadingB" || LoadJsState == "complete") return;
|
||||
LoadJsState = "loadingB";
|
||||
var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
|
||||
var JS1 = document.createElement("script")
|
||||
,JS2 = document.createElement("script")
|
||||
,JS3 = document.createElement("script");
|
||||
JS1.src = URL_HTTP1;
|
||||
JS2.src = URL_HTTP2;
|
||||
JS3.src = URL_HTTP3;
|
||||
JS1.onload = JS2.onload = JS3.onload = JS2.onerror = JS3.onerror=function(){LoadJsState = "complete";}
|
||||
JS1.onerror = function(e) {
|
||||
if (window.location.protocol !== 'https:')
|
||||
head.insertBefore(JS2, head.firstChild); else
|
||||
head.insertBefore(JS3, head.firstChild);
|
||||
}
|
||||
head.insertBefore(JS1,head.firstChild);
|
||||
}
|
||||
|
||||
//==加载Lodop对象的主过程:==
|
||||
(function loadCLodop(){
|
||||
if (!needCLodop()) return;
|
||||
CLodopIsLocal = !!((URL_WS1 + URL_WS2).match(/\/\/localho|\/\/127.0.0./i));
|
||||
LoadJsState = "loadingA";
|
||||
|
||||
if (!window.WebSocket && window.MozWebSocket) window.WebSocket=window.MozWebSocket;
|
||||
//ws方式速度快(小于200ms)且可避免CORS错误,但要求Lodop版本足够新:
|
||||
try {
|
||||
var WSK1=new WebSocket(URL_WS1);
|
||||
WSK1.onopen = function(e) { setTimeout(checkOrTryHttp,200); }
|
||||
WSK1.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}
|
||||
WSK1.onerror = function(e) {
|
||||
var WSK2=new WebSocket(URL_WS2);
|
||||
WSK2.onopen = function(e) {setTimeout(checkOrTryHttp,200);}
|
||||
WSK2.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}
|
||||
WSK2.onerror= function(e) {checkOrTryHttp();}
|
||||
}
|
||||
} catch(e){
|
||||
checkOrTryHttp();
|
||||
}
|
||||
})();
|
||||
|
||||
//==获取LODOP对象主过程,判断是否安装、需否升级:==
|
||||
function getLodop(oOBJECT, oEMBED) {
|
||||
var strFontTag = "<br><font color='#FF00FF'>打印控件";
|
||||
var strLodopInstall = strFontTag + "未安装!点击这里<a href='install_lodop32.exe' target='_self'>执行安装</a>";
|
||||
var strLodopUpdate = strFontTag + "需要升级!点击这里<a href='install_lodop32.exe' target='_self'>执行升级</a>";
|
||||
var strLodop64Install = strFontTag + "未安装!点击这里<a href='install_lodop64.exe' target='_self'>执行安装</a>";
|
||||
var strLodop64Update = strFontTag + "需要升级!点击这里<a href='install_lodop64.exe' target='_self'>执行升级</a>";
|
||||
var strCLodopInstallA = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>下载执行安装</a>";
|
||||
var strCLodopInstallB = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)";
|
||||
var strCLodopUpdate = "<br><font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>";
|
||||
var strLodop7FontTag = "<br><font color='#FF00FF'>Web打印服务Lodop7";
|
||||
var strLodop7HrefX86 = "点击这里<a href='Lodop7_Linux_X86_64.tar.gz' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";
|
||||
var strLodop7HrefARM = "点击这里<a href='Lodop7_Linux_ARM64.tar.gz' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";
|
||||
var strLodop7Install_X86 = strLodop7FontTag + "未安装启动," + strLodop7HrefX86;
|
||||
var strLodop7Install_ARM = strLodop7FontTag + "未安装启动," + strLodop7HrefARM;
|
||||
var strLodop7Update_X86 = strLodop7FontTag + "需升级," + strLodop7HrefX86;
|
||||
var strLodop7Update_ARM = strLodop7FontTag + "需升级," + strLodop7HrefARM;
|
||||
var strInstallOK = ",成功后请刷新本页面或重启浏览器。</font>";
|
||||
var LODOP;
|
||||
try {
|
||||
var isWinIE = (/MSIE/i.test(navigator.userAgent)) || (/Trident/i.test(navigator.userAgent));
|
||||
var isWinIE64 = isWinIE && (/x64/i.test(navigator.userAgent));
|
||||
var isLinuxX86 = (/Linux/i.test(navigator.platform)) && (/x86/i.test(navigator.platform));
|
||||
var isLinuxARM = (/Linux/i.test(navigator.platform)) && (/aarch/i.test(navigator.platform));
|
||||
|
||||
if (needCLodop() || isLinuxX86 || isLinuxARM) {
|
||||
try {
|
||||
LODOP = window.getCLodop();
|
||||
} catch (err) {}
|
||||
if (!LODOP && LoadJsState !== "complete") {
|
||||
if (!LoadJsState)
|
||||
alert("未曾加载Lodop主JS文件,请先调用loadCLodop过程."); else
|
||||
alert("网页还没下载完毕,请稍等一下再操作.");
|
||||
return;
|
||||
}
|
||||
var strAlertMessage;
|
||||
if (!LODOP) {
|
||||
if (isLinuxX86)
|
||||
strAlertMessage = strLodop7Install_X86;
|
||||
else if (isLinuxARM)
|
||||
strAlertMessage = strLodop7Install_ARM;
|
||||
else
|
||||
strAlertMessage = strCLodopInstallA + (CLodopIsLocal ? strCLodopInstallB : "");
|
||||
document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;
|
||||
return;
|
||||
} else {
|
||||
if (isLinuxX86 && LODOP.CVERSION < "7.1.0.1")
|
||||
strAlertMessage = strLodop7Update_X86;
|
||||
else if (isLinuxARM && LODOP.CVERSION < "7.1.0.1")
|
||||
strAlertMessage = strLodop7Update_ARM;
|
||||
else if (CLODOP.CVERSION < "6.6.2.1")
|
||||
strAlertMessage = strCLodopUpdate;
|
||||
|
||||
if (strAlertMessage)
|
||||
document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;
|
||||
}
|
||||
} else {
|
||||
//==如果页面有Lodop插件就直接使用,否则新建:==
|
||||
if (oOBJECT || oEMBED) {
|
||||
if (isWinIE)
|
||||
LODOP = oOBJECT;
|
||||
else
|
||||
LODOP = oEMBED;
|
||||
} else if (!CreatedOKLodopObject) {
|
||||
LODOP = document.createElement("object");
|
||||
LODOP.setAttribute("width", 0);
|
||||
LODOP.setAttribute("height", 0);
|
||||
LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;");
|
||||
if (isWinIE)
|
||||
LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA");
|
||||
else
|
||||
LODOP.setAttribute("type", "application/x-print-lodop");
|
||||
document.documentElement.appendChild(LODOP);
|
||||
CreatedOKLodopObject = LODOP;
|
||||
} else
|
||||
LODOP = CreatedOKLodopObject;
|
||||
//==Lodop插件未安装时提示下载地址:==
|
||||
if ((!LODOP) || (!LODOP.VERSION)) {
|
||||
document.body.innerHTML = (isWinIE64 ? strLodop64Install : strLodopInstall) + strInstallOK + document.body.innerHTML;
|
||||
return LODOP;
|
||||
}
|
||||
if (LODOP.VERSION < "6.2.2.6") {
|
||||
document.body.innerHTML = (isWinIE64 ? strLodop64Update : strLodopUpdate) + strInstallOK + document.body.innerHTML;
|
||||
}
|
||||
}
|
||||
//===如下空白位置适合调用统一功能(如注册语句、语言选择等):======================
|
||||
LODOP.SET_LICENSES("","8B7A45DAE7262E36A87452727380929E9FC","","");
|
||||
//===============================================================================
|
||||
return LODOP;
|
||||
} catch (err) {
|
||||
alert("getLodop出错:" + err);
|
||||
}
|
||||
}
|
||||
|
||||
export { getLodop }
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<el-dialog :model-value="state.show" @close="closeFun" width="95%">
|
||||
<avue-crud ref="crudRef" :data="state.data" :option="state.option">
|
||||
<avue-crud ref="crudRef" :data="state.data" :option="tableOption">
|
||||
<template #packagingQuantity="{ row }">
|
||||
<div style="display: flex; align-items: center; justify-content: center; width: 100%">
|
||||
<el-input-number v-model="row.packagingQuantity" style="width: 100%" :min="1" size="small" @change="inputNumberFun($event, row)" />
|
||||
@ -18,14 +18,14 @@
|
||||
</template>
|
||||
<template #expand="expandObj">
|
||||
<div class="expandListBox">
|
||||
<avue-crud ref="crudRef" :data="expandObj.row.children" :option="state.expandOption">
|
||||
<avue-crud ref="crudRef" :data="expandObj.row.children" :option="expandOption">
|
||||
<template #supplierName="{ row }">
|
||||
<el-tooltip :content="row.supplierName" placement="top">
|
||||
<div class="multi-line-omit">{{ row.supplierName }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<template #printBtn="{ row }">
|
||||
<el-button type="text" @click="printPackingFun(row,expandObj.row)">{{ t('message.index.print') }}</el-button>
|
||||
<el-button type="text" @click="printPackingFun(row, expandObj.row)">{{ t('message.index.print') }} </el-button>
|
||||
</template>
|
||||
</avue-crud>
|
||||
</div>
|
||||
@ -55,8 +55,8 @@
|
||||
</div>
|
||||
<el-button type="primary" size="default" @click="printCheckAllFun">{{ t('message.tiaoma.zddy') }}</el-button>
|
||||
<el-button type="primary" size="default" @click="printCheckAllFun">{{ t('message.tiaoma.tjdy') }}</el-button>
|
||||
<el-button type="primary" size="default" @click="defaultPrinterFun">{{ t('message.tiaoma.xzdyj') }}</el-button>
|
||||
<!-- <el-button type="danger" size="default" v-if="state.timer !== null" @click="printCheckDangerFun">取消打印</el-button> -->
|
||||
<el-button type="primary" size="default" @click="defaultPrinterFun">{{ t('message.tiaoma.xzdyj') }} </el-button>
|
||||
<!-- <el-button type="danger" size="default" v-if="state.timer !== null" @click="printCheckDangerFun">取消打印</el-button> -->
|
||||
</div>
|
||||
</template>
|
||||
</avue-crud>
|
||||
@ -64,13 +64,15 @@
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { computed, defineExpose, reactive, ref } from 'vue';
|
||||
import { computed, defineExpose, reactive, ref, onMounted } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { listApi } from '/@/api/list';
|
||||
import barCode from './barCode.vue';
|
||||
import { ElMessage, ElMessageBox, ElNotification } from 'element-plus';
|
||||
const LODOP = window.LODOP;
|
||||
import { ElMessage, ElMessageBox, } from 'element-plus';
|
||||
import { getLodop } from '../../utils/LodopFuncs.js';
|
||||
// const LODOP = window.LODOP;
|
||||
const barCodeRef = ref();
|
||||
const LODOP = ref();
|
||||
const { t } = useI18n();
|
||||
const state: any = reactive({
|
||||
data: [],
|
||||
@ -78,65 +80,8 @@ const state: any = reactive({
|
||||
printSelection: '0',
|
||||
printJQ: '',
|
||||
printState: '0',
|
||||
option: {
|
||||
expand: true,
|
||||
expandRowKeys: [1],
|
||||
rowKey: 'id',
|
||||
tip: false,
|
||||
selection: false,
|
||||
index: false,
|
||||
menu: false,
|
||||
menuWidth: 150,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
searchLabelWidth: 140,
|
||||
searchMenuSpan: 6,
|
||||
addBtn: false,
|
||||
column: [
|
||||
{ label: computed(() => t('message.index.PO1')), prop: 'purchaseOrderFBillNo' },
|
||||
{ label: computed(() => t('message.index.maxcessLot')), prop: 'mssSupplierLot' },
|
||||
{ label: computed(() => t('message.index.supplierLot')), prop: 'fSupplierLot' },
|
||||
{ label: computed(() => t('message.index.partNumber')), prop: 'materialCode' },
|
||||
{ label: computed(() => t('message.index.materialName')), prop: 'materialName' },
|
||||
{ label: computed(() => t('message.index.supplierCode')), prop: 'supplierId' },
|
||||
{ label: computed(() => t('message.index.supplierName')), prop: 'supplierName'},
|
||||
{ label: computed(() => t('message.index.shipmentQTY')), prop: 'qty' },
|
||||
{ label: computed(() => t('message.tiaoma.mbs')), prop: 'packagingQuantity' },
|
||||
{ label: computed(() => t('message.tiaoma.bzsxh')), prop: 'quantityPerPackage' },
|
||||
{ label: computed(() => t('message.index.print')), prop: 'printBtn' },
|
||||
],
|
||||
},
|
||||
expandOption: {
|
||||
expandRowKeys: [1],
|
||||
rowKey: 'id',
|
||||
tip: false,
|
||||
selection: false,
|
||||
index: false,
|
||||
menu: false,
|
||||
menuWidth: 150,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
searchLabelWidth: 140,
|
||||
searchMenuSpan: 6,
|
||||
addBtn: false,
|
||||
column: [
|
||||
{ label: computed(() => t('message.index.PO1')), prop: 'purchaseOrderFBillNo' },
|
||||
{ label: computed(() => t('message.index.maxcessLot')), prop: 'mssSupplierLot' },
|
||||
{ label: computed(() => t('message.index.supplierLot')), prop: 'fSupplierLot' },
|
||||
{ label: computed(() => t('message.index.partNumber')), prop: 'materialCode' },
|
||||
{ label: computed(() => t('message.index.materialName')), prop: 'materialName' },
|
||||
{ label: computed(() => t('message.index.supplierCode')), prop: 'supplierId' },
|
||||
{ label: computed(() => t('message.index.supplierName')), prop: 'supplierName' },
|
||||
{ label: computed(() => t('message.index.shipmentQTY')), prop: 'qty' },
|
||||
{ label: computed(() => t('message.tiaoma.mbs')), prop: 'packagingQuantity' },
|
||||
{ label: computed(() => t('message.tiaoma.bzsxh')), prop: 'quantityPerPackage' },
|
||||
{ label: computed(() => t('message.index.print')), prop: 'printBtn' },
|
||||
],
|
||||
},
|
||||
option: {},
|
||||
expandOption: {},
|
||||
formData: {
|
||||
sheet: '',
|
||||
fDateBegin: '',
|
||||
@ -148,6 +93,71 @@ const state: any = reactive({
|
||||
timer: null,
|
||||
allSetTime: null,
|
||||
});
|
||||
|
||||
const expandOption = computed(() => ({
|
||||
expandRowKeys: [1],
|
||||
rowKey: 'id',
|
||||
tip: false,
|
||||
selection: false,
|
||||
index: false,
|
||||
menu: false,
|
||||
menuWidth: 150,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
searchLabelWidth: 140,
|
||||
searchMenuSpan: 6,
|
||||
addBtn: false,
|
||||
column: [
|
||||
{ label: t('message.index.PO1'), prop: 'purchaseOrderFBillNo' },
|
||||
{ label: t('message.index.maxcessLot'), prop: 'mssSupplierLot' },
|
||||
{ label: t('message.index.supplierLot'), prop: 'fSupplierLot' },
|
||||
{ label: t('message.index.partNumber'), prop: 'materialCode' },
|
||||
{ label: t('message.index.materialName'), prop: 'materialName' },
|
||||
{ label: t('message.index.supplierCode'), prop: 'supplierId' },
|
||||
{ label: t('message.index.supplierName'), prop: 'supplierName' },
|
||||
{ label: t('message.index.shipmentQTY'), prop: 'qty' },
|
||||
{ label: t('message.tiaoma.mbs'), prop: 'packagingQuantity' },
|
||||
{ label: t('message.tiaoma.bzsxh'), prop: 'quantityPerPackage' },
|
||||
{ label: t('message.index.print'), prop: 'printBtn' },
|
||||
],
|
||||
}))
|
||||
const tableOption = computed(() => ({
|
||||
expand: true,
|
||||
expandRowKeys: [1],
|
||||
rowKey: 'id',
|
||||
tip: false,
|
||||
selection: false,
|
||||
index: false,
|
||||
menu: false,
|
||||
menuWidth: 150,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
searchLabelWidth: 140,
|
||||
searchMenuSpan: 6,
|
||||
addBtn: false,
|
||||
column: [
|
||||
{ label: t('message.index.PO1'), prop: 'purchaseOrderFBillNo' },
|
||||
{ label: t('message.index.maxcessLot'), prop: 'mssSupplierLot' },
|
||||
{ label: t('message.index.supplierLot'), prop: 'fSupplierLot' },
|
||||
{ label: t('message.index.partNumber'), prop: 'materialCode' },
|
||||
{ label: t('message.index.materialName'), prop: 'materialName' },
|
||||
{ label: t('message.index.supplierCode'), prop: 'supplierId' },
|
||||
{ label: t('message.index.supplierName'), prop: 'supplierName' },
|
||||
{ label: t('message.index.shipmentQTY'), prop: 'qty' },
|
||||
{ label: t('message.tiaoma.mbs'), prop: 'packagingQuantity' },
|
||||
{ label: t('message.tiaoma.bzsxh'), prop: 'quantityPerPackage' },
|
||||
{ label: t('message.index.print'), prop: 'printBtn' },
|
||||
],
|
||||
}))
|
||||
onMounted(() => {
|
||||
setTimeout(() => {
|
||||
LODOP.value = getLodop();
|
||||
}, 1000);
|
||||
});
|
||||
//打印校验
|
||||
const printVerification = () => {
|
||||
if (state.printSelection === '') {
|
||||
@ -162,7 +172,7 @@ const printVerification = () => {
|
||||
};
|
||||
//切换打印机
|
||||
const defaultPrinterFun = () => {
|
||||
LODOP.SELECT_PRINTER();
|
||||
LODOP.value.SELECT_PRINTER();
|
||||
};
|
||||
//全部打印
|
||||
const printCheckAllFun = () => {
|
||||
@ -184,10 +194,10 @@ const printCheckAllFun = () => {
|
||||
getBaoShuTiaoMa(state.data[i].id, state.data[i].packagingQuantity, i);
|
||||
i++;
|
||||
}
|
||||
if (state.data.length == i) {
|
||||
clearInterval(state.allSetTime);
|
||||
state.allSetTime = null;
|
||||
}
|
||||
if (state.data.length == i) {
|
||||
clearInterval(state.allSetTime);
|
||||
state.allSetTime = null;
|
||||
}
|
||||
}, 1000);
|
||||
done();
|
||||
} else {
|
||||
@ -198,55 +208,52 @@ const printCheckAllFun = () => {
|
||||
}
|
||||
};
|
||||
//包装打印
|
||||
const printPackingFun = (row: any, mainRow:any) => {
|
||||
const printPackingFun = (row: any, mainRow: any) => {
|
||||
if (printVerification()) {
|
||||
getBaoShuTiaoMa(mainRow.id, mainRow.packagingQuantity, mainRow.$index, row.$index);
|
||||
getBaoShuTiaoMa(mainRow.id, mainRow.packagingQuantity, mainRow.$index, row.$index);
|
||||
}
|
||||
};
|
||||
//此条打印
|
||||
const printThisFun = (row: any) => {
|
||||
if(printVerification()){
|
||||
getBaoShuTiaoMa(row.id, row.packagingQuantity, row.$index);
|
||||
}
|
||||
if (printVerification()) {
|
||||
getBaoShuTiaoMa(row.id, row.packagingQuantity, row.$index);
|
||||
}
|
||||
};
|
||||
//数据装载
|
||||
const getBaoShuTiaoMa = async (topId: any, ceseQty: any, i: number, t:number = -1) => {
|
||||
const getBaoShuTiaoMa = async (topId: any, ceseQty: any, i: number, t: number = -1) => {
|
||||
await listApi()
|
||||
.setBaoShuTiaoMa({ id: topId, cuseQty: ceseQty })
|
||||
.then((res: any) => {
|
||||
console.log(res)
|
||||
debugger
|
||||
res.data.barCodeList.forEach((item:any) => {
|
||||
item.purchaseOrderFBillNo = item.purchaseBillNo
|
||||
item.packagingQuantity = item.qty
|
||||
item.quantityPerPackage = res.data.barCodeList.length + '-' + item.sortNum
|
||||
})
|
||||
if(t === -1){
|
||||
state.data[i].children = res.data.barCodeList
|
||||
dataExtractFun(state.data[i].children);
|
||||
} else {
|
||||
state.data[i].children = res.data.barCodeList
|
||||
dataExtractFun([state.data[i].children[t]]);
|
||||
}
|
||||
|
||||
res.data.barCodeList.forEach((item: any) => {
|
||||
item.purchaseOrderFBillNo = item.purchaseBillNo;
|
||||
item.packagingQuantity = item.qty;
|
||||
item.quantityPerPackage = res.data.barCodeList.length + '-' + item.sortNum;
|
||||
});
|
||||
if (t === -1) {
|
||||
state.data[i].children = res.data.barCodeList;
|
||||
dataExtractFun(state.data[i].children);
|
||||
} else {
|
||||
state.data[i].children = res.data.barCodeList;
|
||||
dataExtractFun([state.data[i].children[t]]);
|
||||
}
|
||||
});
|
||||
};
|
||||
//打印
|
||||
const dataExtractFun = (list: any = []) => {
|
||||
let stepCounter = 0;
|
||||
state.printState = '1';
|
||||
let mainState = list.length === 1
|
||||
let mainState = list.length === 1;
|
||||
state.timer = setInterval(() => {
|
||||
if (state.printSelection === '0') {
|
||||
LODOP.PRINT_INITA(0, 0, 0, 0, 'L4');
|
||||
LODOP.SET_PRINT_PAGESIZE(1, 1000, 500, '');
|
||||
AddPrintContentZhuhai(list[stepCounter],mainState);
|
||||
LODOP.PRINT();
|
||||
LODOP.value.PRINT_INITA(0, 0, 0, 0, 'L4');
|
||||
LODOP.value.SET_PRINT_PAGESIZE(1, 1000, 500, '');
|
||||
AddPrintContentZhuhai(list[stepCounter], mainState);
|
||||
LODOP.value.PRINT();
|
||||
} else {
|
||||
LODOP.PRINT_INITA(0, 0, 0, 0, 'L4');
|
||||
LODOP.SET_PRINT_PAGESIZE(1, 1000, 500, '');
|
||||
AddPrintContentTaiguo(list[stepCounter],mainState);
|
||||
LODOP.PRINT();
|
||||
LODOP.value.PRINT_INITA(0, 0, 0, 0, 'L4');
|
||||
LODOP.value.SET_PRINT_PAGESIZE(1, 1000, 500, '');
|
||||
AddPrintContentTaiguo(list[stepCounter], mainState);
|
||||
LODOP.value.PRINT();
|
||||
}
|
||||
if (list.length - 1 == stepCounter) {
|
||||
clearInterval(state.timer);
|
||||
@ -258,37 +265,69 @@ const dataExtractFun = (list: any = []) => {
|
||||
};
|
||||
//珠海模板
|
||||
const AddPrintContentZhuhai = (row: any, mainState: boolean = false) => {
|
||||
LODOP.ADD_PRINT_BARCODE(25, -5, 150, 150, 'QRCode', row.fBarCode);
|
||||
LODOP.ADD_PRINT_TEXT(140, 45, 300, 20, `${row.quantityPerPackage}`);
|
||||
mainState ? LODOP.ADD_PRINT_TEXT(10, 35, 300, 20, '主标签') : null
|
||||
LODOP.ADD_PRINT_TEXT(10, 120, 300, 20, `供应商简称:${row.supplierName}`);
|
||||
LODOP.ADD_PRINT_TEXT(30, 120, 300, 20, `物料编码:${row.materialCode}`);
|
||||
LODOP.ADD_PRINT_TEXT(50, 120, 300, 20, `包装数量:${row.packagingQuantity}`);
|
||||
LODOP.ADD_PRINT_TEXT(70, 120, 300, 20, `销售订单号:${row.fdemandbillno}`);
|
||||
LODOP.ADD_PRINT_TEXT(90, 120, 300, 20, `供应商批号:${row.fSupplierLot}`);
|
||||
LODOP.ADD_PRINT_TEXT(110, 120, 300, 20, `采购订单号:${row.purchaseOrderFBillNo}`);
|
||||
LODOP.ADD_PRINT_TEXT(130, 120, 300, 20, `送货日期:${state.indexRow.deliveryDate}`);
|
||||
LODOP.ADD_PRINT_TEXT(150, 120, 300, 20, `收料通知单单号:${state.indexRow.fBillNo}`);
|
||||
LODOP.ADD_PRINT_TEXT(170, 120, 300, 20, `采购备注:${state.indexRow.fBillNo}`);
|
||||
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 0);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 8);
|
||||
LODOP.value.ADD_PRINT_TEXT(10, 20, 300, 20, `${row.fbilltypeid}`);
|
||||
mainState ? LODOP.value.ADD_PRINT_TEXT(30, 35, 50, 20, '主标签') : null;
|
||||
LODOP.value.ADD_PRINT_BARCODE(45, -5, 150, 150, 'QRCode', row.fBarCode);
|
||||
LODOP.value.ADD_PRINT_TEXT(160, 45, 300, 20, `${row.quantityPerPackage}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(5, 120, 300, 20, `供应商简称:${row.supplierName}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(25, 120, 300, 20, `物料编码:`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 5);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 12);
|
||||
LODOP.value.ADD_PRINT_TEXT(22, 175, 300, 20, `${row.materialCode}`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 0);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 8);
|
||||
LODOP.value.ADD_PRINT_TEXT(45, 120, 300, 20, `包装数量:`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 5);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 12);
|
||||
LODOP.value.ADD_PRINT_TEXT(42, 175, 300, 20, `${row.packagingQuantity}`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 0);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 8);
|
||||
LODOP.value.ADD_PRINT_TEXT(65, 120, 300, 20, `销售订单号:${row.fdemandbillno}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(85, 120, 300, 20, `供应商批号:${row.fSupplierLot}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(105, 120, 300, 20, `采购订单号:`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 5);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 12);
|
||||
LODOP.value.ADD_PRINT_TEXT(102, 180, 300, 20, `${row.purchaseOrderFBillNo}`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 0);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 8);
|
||||
LODOP.value.ADD_PRINT_TEXT(125, 120, 300, 20, `送货日期:${state.indexRow.deliveryDate}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(145, 120, 300, 20, `收料通知单单号:${state.indexRow.fBillNo}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(165, 120, 300, 20, `采购备注:${row.remart}`);
|
||||
};
|
||||
|
||||
//泰国模板
|
||||
const AddPrintContentTaiguo = (row: any, mainState: boolean = false) => {
|
||||
LODOP.ADD_PRINT_BARCODE(25, -5, 150, 150, 'QRCode', row.fBarCode);
|
||||
LODOP.ADD_PRINT_TEXT(140, 45, 300, 20, `${row.quantityPerPackage}`);
|
||||
mainState ? LODOP.ADD_PRINT_TEXT(10, 35, 300, 20, 'Main Label') : null
|
||||
// LODOP.ADD_PRINT_TEXT(28, 120, 300, 20, `${t('message.tiaoma.pno')}:${row.materialCode}`);
|
||||
// LODOP.ADD_PRINT_TEXT(58, 120, 300, 20, `${t('message.tiaoma.qty')}:${row.packagingQuantity}`);
|
||||
// LODOP.ADD_PRINT_TEXT(88, 120, 300, 20, `${t('message.tiaoma.bn')}:${row.mssSupplierLot}`);
|
||||
// LODOP.ADD_PRINT_TEXT(118, 120, 300, 20, `${t('message.tiaoma.po')}:${row.purchaseBillNo}`);
|
||||
LODOP.ADD_PRINT_TEXT(10, 120, 300, 20, `${t('message.tiaoma.gysjc')}:${row.supplierName}`);
|
||||
LODOP.ADD_PRINT_TEXT(30, 120, 300, 20, `${t('message.index.partNumber')}:${row.materialCode}`);
|
||||
LODOP.ADD_PRINT_TEXT(50, 120, 300, 20, `${t('message.tiaoma.qty')}:${row.packagingQuantity}`);
|
||||
LODOP.ADD_PRINT_TEXT(70, 120, 300, 20, `${t('message.tiaoma.bn')}:${row.mssSupplierLot}`);
|
||||
LODOP.ADD_PRINT_TEXT(90, 120, 300, 20, `${t('message.index.supplierLot')}:${row.fSupplierLot}`);
|
||||
LODOP.ADD_PRINT_TEXT(110, 120, 300, 20, `${t('message.index.PO1')}:${row.purchaseOrderFBillNo}`);
|
||||
LODOP.ADD_PRINT_TEXT(130, 120, 300, 20, `${t('message.index.deliveryDate')}:${state.indexRow.deliveryDate}`);
|
||||
LODOP.ADD_PRINT_TEXT(150, 120, 300, 20, `${t('message.index.sltzddh')}:${state.indexRow.fBillNo}`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 0);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 8);
|
||||
LODOP.value.ADD_PRINT_TEXT(10, -3, 300, 20, `${row.fbilltypeid}`);
|
||||
mainState ? LODOP.value.ADD_PRINT_TEXT(30, 35, 300, 20, 'Main Label') : null;
|
||||
LODOP.value.ADD_PRINT_BARCODE(45, 0, 150, 150, 'QRCode', row.fBarCode);
|
||||
// LODOP.value.ADD_PRINT_TEXT(160, 45, 1, 20, `${row.quantityPerPackage}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(5, 140, 1000, 20, `Supplier Name:${row.supplierName}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(25, 140, 1000, 20, `Part Number:`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 5);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 12);
|
||||
LODOP.value.ADD_PRINT_TEXT(23, 208, 1000, 20, `${row.materialCode}`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 0);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 8);
|
||||
LODOP.value.ADD_PRINT_TEXT(45, 140, 1000, 20, `Qty:`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 5);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 12);
|
||||
LODOP.value.ADD_PRINT_TEXT(43, 165, 1000, 20, `${row.packagingQuantity}`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 0);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 8);
|
||||
LODOP.value.ADD_PRINT_TEXT(65, 140, 1000, 20, `Batch No:${row.mssSupplierLot}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(85, 140, 1000, 20, `Supplier Lot #:${row.fSupplierLot}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(105, 140, 1000, 20, `PO #:`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 5);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 12);
|
||||
LODOP.value.ADD_PRINT_TEXT(103, 168, 1000, 20, `${row.purchaseOrderFBillNo}`);
|
||||
LODOP.value.SET_PRINT_STYLE('Bold', 0);
|
||||
LODOP.value.SET_PRINT_STYLE('FontSize', 8);
|
||||
LODOP.value.ADD_PRINT_TEXT(125, 140, 1000, 20, `Delivery Date:${state.indexRow.deliveryDate}`);
|
||||
LODOP.value.ADD_PRINT_TEXT(145, 140, 1000, 20, `Delivery Note Number:${state.indexRow.fBillNo}`);
|
||||
};
|
||||
//本地分包算法
|
||||
const inputNumberFun = (e: any, row: any) => {
|
||||
@ -319,13 +358,13 @@ const inputNumberFun = (e: any, row: any) => {
|
||||
|
||||
child.quantityPerPackage = packages + '-' + (i + 1);
|
||||
child.printBtn = t('message.index.print');
|
||||
child.supplierName = item.supplierName
|
||||
child.supplierName = item.supplierName;
|
||||
if (i === packages - 1 && item.qty % e !== 0) {
|
||||
child.packagingQuantity = item.qty % e;
|
||||
child.qty = child.packagingQuantity
|
||||
child.qty = child.packagingQuantity;
|
||||
} else {
|
||||
child.packagingQuantity = e;
|
||||
child.qty = child.packagingQuantity
|
||||
child.qty = child.packagingQuantity;
|
||||
}
|
||||
return child;
|
||||
});
|
||||
@ -334,44 +373,22 @@ const inputNumberFun = (e: any, row: any) => {
|
||||
};
|
||||
//获取数据
|
||||
const openShowDataFun = (row: any) => {
|
||||
if (LODOP === undefined) {
|
||||
ElNotification({
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.tiaoma.jcdwdypz'),
|
||||
type: 'warning',
|
||||
duration: 0,
|
||||
position: 'top-left',
|
||||
state.indexRow = row;
|
||||
state.formData.sheet = row.sheet;
|
||||
listApi()
|
||||
.invoiceOrderGetPageList({ condition: state.formData, pageSize: 100000, page: 1 })
|
||||
.then((res: any) => {
|
||||
if (res.resultCode === 0) {
|
||||
state.data = res.data.dataList;
|
||||
state.data.forEach((item: any) => {
|
||||
item.packagingQuantity = item.qty;
|
||||
item.quantityPerPackage = 1;
|
||||
item.children = [];
|
||||
item.printBtn = t('message.index.print');
|
||||
});
|
||||
state.show = true;
|
||||
}
|
||||
});
|
||||
const userAgent = window.navigator.userAgent.toLowerCase();
|
||||
if (userAgent.includes('windows')) {
|
||||
window.location.href = import.meta.env.import.meta.env.VITE_API_URL + '/CLodop_Setup_for_Win64NT_6.623EN.exe';
|
||||
} else if (userAgent.includes('mac')) {
|
||||
ElNotification({
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.noMac'),
|
||||
type: 'error',
|
||||
duration: 0,
|
||||
position: 'top-left',
|
||||
});
|
||||
}
|
||||
} else {
|
||||
state.indexRow = row;
|
||||
state.formData.sheet = row.sheet;
|
||||
listApi()
|
||||
.invoiceOrderGetPageList({ condition: state.formData, pageSize: 100000, page: 1 })
|
||||
.then((res: any) => {
|
||||
if (res.resultCode === 0) {
|
||||
state.data = res.data.dataList;
|
||||
state.data.forEach((item: any) => {
|
||||
item.packagingQuantity = item.qty;
|
||||
item.quantityPerPackage = 1;
|
||||
item.children = [];
|
||||
item.printBtn = t('message.index.print');
|
||||
});
|
||||
state.show = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
const closeFun = () => {
|
||||
state.show = false;
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
<avue-crud
|
||||
ref="crudRef"
|
||||
:data="state.data"
|
||||
:option="state.option"
|
||||
:option="tableOption"
|
||||
v-model:page="state.page"
|
||||
@on-load="onLoadFun"
|
||||
:table-loading="state.loading"
|
||||
@ -15,6 +15,35 @@
|
||||
</div>
|
||||
</template>
|
||||
<template #deliveryDate="{ row }">{{ row.ifHidden === 0 ? row.deliveryDate : '' }}</template>
|
||||
<template #f_VHUB_Text="{ row }">
|
||||
<div v-if="row.ifHidden === 0" class="tableInputBox" @click="f_VHUB_TextTableInputBoxFun(row)">
|
||||
<div v-if="!row.f_VHUB_TextInputShow">{{ row.f_VHUB_Text === '' ? '----' : row.f_VHUB_Text }}</div>
|
||||
<el-input
|
||||
v-else
|
||||
style="text-align: center"
|
||||
size="small"
|
||||
v-model="row.f_VHUB_Text"
|
||||
@blur="f_VHUB_TextTableInputBoxFun({ id: '-1' })"
|
||||
@change="f_VHUB_TextTableInputChangFun(row)"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<template #f_URXD_Date="{ row }">
|
||||
<div v-if="row.ifHidden === 0" class="tableInputBox" @click="f_URXD_DateTableInputBoxFun(row)">
|
||||
<div v-if="!row.f_URXD_DateInputShow">{{ row.f_URXD_Date === '' ? '----' : row.f_URXD_Date }}</div>
|
||||
<el-date-picker
|
||||
v-else
|
||||
v-model="row.f_URXD_Date"
|
||||
type="date"
|
||||
:placeholder="t('message.index.date')"
|
||||
size="small"
|
||||
style="width: 100%"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
@change="f_URXD_DateTableInputChangFun(row)"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<template #fBillNo="{ row }">{{ row.ifHidden === 0 ? row.fBillNo : '' }}</template>
|
||||
<template #sheet="{ row }">{{ row.ifHidden === 0 ? row.sheet : '' }}</template>
|
||||
<template #materialName="{ row }">
|
||||
@ -27,16 +56,19 @@
|
||||
<div class="multi-line-omit">{{ row.supplierName }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<template #remark="{ row }">
|
||||
<el-tooltip :content="row.remark" placement="top">
|
||||
<div class="multi-line-omit">{{ row.remark }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<template #remark="{ row }">
|
||||
<el-tooltip :content="row.remark" placement="top">
|
||||
<div class="multi-line-omit">{{ row.remark }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<template #menu-left>
|
||||
<div class="selectBoxes">
|
||||
<div class="selectItem">
|
||||
<el-input v-model="state.formData.sheet" style="width: 240px" :placeholder="t('message.index.deliveryNote')" size="default" />
|
||||
</div>
|
||||
<div class="selectItem">
|
||||
<el-input v-model="state.formData.supplierName" style="width: 8vw" :placeholder="t('message.index.supplierName')" size="default" />
|
||||
</div>
|
||||
<div class="selectItem">
|
||||
<el-date-picker
|
||||
v-model="state.elDatePicker"
|
||||
@ -54,7 +86,11 @@
|
||||
<el-button type="primary" size="default" @click="selectFun">{{ t('message.index.search') }}</el-button>
|
||||
<el-button size="default" @click="resetFun">{{ t('message.index.reset') }}</el-button>
|
||||
<el-button type="primary" size="default" @click="openComponentPrintingFun">
|
||||
<span>{{ t('message.index.selected') }} {{ state.selectedData.length }} {{ t('message.index.items') }},{{ t('message.index.print') }}</span>
|
||||
<span
|
||||
>{{ t('message.index.selected') }} {{ state.selectedData.length }} {{ t('message.index.items') }},{{
|
||||
t('message.index.print')
|
||||
}}</span
|
||||
>
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
@ -65,30 +101,37 @@
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
<template #deleteText="{ row }">
|
||||
<template #deleteTextAll="{ row }">
|
||||
<div class="btnList">
|
||||
<el-button v-if="row.ifHidden === 0" type="text" @click="invoiceOrderDeleteOrderFun(row)">
|
||||
{{ t('message.index.deleteText') }}
|
||||
{{ t('message.index.deleteTextAll') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
<template #deleteText="{ row }">
|
||||
<div class="btnList">
|
||||
<el-button type="text" @click="invoiceOrderDeleteOrderFunOne(row)">
|
||||
{{ t('message.index.deleteText') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</avue-crud>
|
||||
</el-card>
|
||||
<selectedData ref="selectedDataRef"/>
|
||||
<selectedData ref="selectedDataRef" />
|
||||
<componentPrinting ref="componentPrintingRef" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, onMounted, computed, ref,nextTick } from 'vue';
|
||||
import { reactive, onMounted, computed, ref } from 'vue';
|
||||
import { listApi } from '/@/api/list';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import SelectedData from '/@/views/materialReceiptNotice/selectedData.vue';
|
||||
import componentPrinting from './componentPrinting.vue';
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
|
||||
const componentPrintingRef = ref();
|
||||
const selectedDataRef = ref();
|
||||
const LODOP = window.LODOP;
|
||||
const { t } = useI18n();
|
||||
const crudRef = ref();
|
||||
const state = reactive({
|
||||
@ -97,42 +140,7 @@ const state = reactive({
|
||||
currentPage: 1,
|
||||
pageSize: 30,
|
||||
},
|
||||
option: {
|
||||
// excelBtn: true,
|
||||
tip: false,
|
||||
rowSort: false,
|
||||
index: false,
|
||||
menuWidth: 120,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
selection: false,
|
||||
searchMenuSpan: 3,
|
||||
addBtn: false,
|
||||
menu: false,
|
||||
column: [
|
||||
{ label: '', prop: 'checkboxBox', width: 35 },
|
||||
{ label: computed(() => t('message.index.deliveryDate')), prop: 'deliveryDate' },
|
||||
{ label: computed(() => t('message.index.deliveryNoteNumber2')), prop: 'sheet', width: '135' },
|
||||
{ label: computed(() => t('message.index.sltzddh')), prop: 'fBillNo', width: '135' },
|
||||
{ label: computed(() => t('message.index.PO1')), prop: 'purchaseOrderFBillNo', width: '135' },
|
||||
{ label: computed(() => t('message.index.xsddh')), prop: 'fdemandbillno', width: '135' },
|
||||
{ label: computed(() => t('message.index.maxcessLot')), prop : 'mssSupplierLot' },
|
||||
{ label: computed(() => t('message.index.supplierLot')), prop: 'fSupplierLot' },
|
||||
{ label: computed(() => t('message.index.partNumber')), prop: 'materialCode', width: '120' },
|
||||
{ label: computed(() => t('message.index.materialName')), prop: 'materialName' },
|
||||
{ label: computed(() => t('message.index.supplierCode')), prop: 'supplierId', width: '90',hide: true, },
|
||||
{ label: computed(() => t('message.index.supplierName')), prop: 'supplierName', width: '120',hide: true, },
|
||||
// { label: computed(() => t('message.index.receivedQTY')), prop: 'sendedQty', width: '110' },
|
||||
{ label: computed(() => t('message.index.shipmentQTY')), prop: 'qty' },
|
||||
// { label: computed(() => t('message.index.POQTY')), prop: 'purchaseQty' },
|
||||
{ label: computed(() => t('message.index.unit')), prop: 'unitName' },
|
||||
{ label: computed(() => t('message.tiaoma.cgbz')), prop: 'remark', width: 140 },
|
||||
{ label: computed(() => t('message.index.print')), prop: 'print', width: 80 },
|
||||
{ label: computed(() => t('message.index.deleteText')), prop: 'deleteText', width: 80 },
|
||||
],
|
||||
},
|
||||
option: {},
|
||||
data: [],
|
||||
elDatePicker: '',
|
||||
formData: {
|
||||
@ -140,11 +148,127 @@ const state = reactive({
|
||||
fDateBegin: '',
|
||||
fDateEmd: '',
|
||||
fmrpCloseStatus: '',
|
||||
supplierName: ''
|
||||
},
|
||||
selectedData: [],
|
||||
selectedDataShow: false,
|
||||
loading: false,
|
||||
});
|
||||
|
||||
const tableOption = computed(() => ({
|
||||
tip: false,
|
||||
rowSort: false,
|
||||
index: false,
|
||||
menuWidth: 120,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
selection: false,
|
||||
searchMenuSpan: 3,
|
||||
addBtn: false,
|
||||
menu: false,
|
||||
column: [
|
||||
{ label: '', prop: 'checkboxBox', width: 35 },
|
||||
{ label: t('message.index.deliveryDate'), prop: 'deliveryDate' },
|
||||
{ label: t('message.index.deliveryNoteNumber2'), prop: 'sheet', width: '135' },
|
||||
{ label: t('message.index.sltzddh'), prop: 'fBillNo', width: '135' },
|
||||
{ label: t('message.index.invoiceNumber'), prop: 'f_VHUB_Text', width: '135' },
|
||||
{ label: t('message.index.fprq'), prop: 'f_URXD_Date', width: '135' },
|
||||
{ label: t('message.index.cgtype'), prop: 'fbilltypeid', width: '110',filters: true },
|
||||
{ label: t('message.index.PO1'), prop: 'purchaseOrderFBillNo', width: '135' },
|
||||
{ label: t('message.index.xsddh'), prop: 'fdemandbillno', width: '135' },
|
||||
{ label: t('message.index.maxcessLot'), prop: 'mssSupplierLot' },
|
||||
{ label: t('message.index.supplierLot'), prop: 'fSupplierLot' },
|
||||
{ label: t('message.index.partNumber'), prop: 'materialCode', width: '120' },
|
||||
{ label: t('message.index.materialName'), prop: 'materialName' },
|
||||
{ label: t('message.index.supplierCode'), prop: 'supplierId', width: '90', hide: true },
|
||||
{ label: t('message.index.supplierName'), prop: 'supplierName', width: '120' },
|
||||
{ label: t('message.index.shipmentQTY'), prop: 'qty' ,width: '120',},
|
||||
{ label: t('message.index.unit'), prop: 'unitName' },
|
||||
{ label: t('message.tiaoma.cgbz'), prop: 'remark', width: 140 },
|
||||
{ label: t('message.index.print'), prop: 'print', width: 80 },
|
||||
{ label: t('message.index.deleteTextAll'), prop: 'deleteTextAll', width: 80 },
|
||||
{ label: t('message.index.deleteText'), prop: 'deleteText', width: 80 },
|
||||
],
|
||||
}))
|
||||
|
||||
const f_VHUB_TextTableInputChangFun = (row: any) => {
|
||||
ElMessageBox({
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.xgfphm'),
|
||||
confirmButtonText: t('message.index.confirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
showCancelButton: true,
|
||||
buttonSize: 'default',
|
||||
beforeClose: (action, instance, done) => {
|
||||
if (action === 'confirm') {
|
||||
instance.confirmButtonLoading = true;
|
||||
listApi()
|
||||
.BatchSetFaPiao({
|
||||
f_VHUB_Text: row.f_VHUB_Text,
|
||||
f_URXD_Date: row.f_URXD_Date,
|
||||
ids: [row.id.toString()],
|
||||
})
|
||||
.then((res: any) => {
|
||||
done();
|
||||
if (res.resultCode === 0) {
|
||||
ElMessage.success(t('message.index.passwordChangedSuccessfully'));
|
||||
getList();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
done();
|
||||
}
|
||||
},
|
||||
});
|
||||
};
|
||||
const f_URXD_DateTableInputChangFun = (row: any) => {
|
||||
ElMessageBox({
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.xgfprq'),
|
||||
confirmButtonText: t('message.index.confirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
showCancelButton: true,
|
||||
buttonSize: 'default',
|
||||
beforeClose: (action, instance, done) => {
|
||||
if (action === 'confirm') {
|
||||
instance.confirmButtonLoading = true;
|
||||
listApi()
|
||||
.BatchSetFaPiao({
|
||||
f_VHUB_Text: row.f_VHUB_Text,
|
||||
f_URXD_Date: row.f_URXD_Date,
|
||||
ids: [row.id.toString()],
|
||||
})
|
||||
.then((res: any) => {
|
||||
done();
|
||||
if (res.resultCode === 0) {
|
||||
ElMessage.success(t('message.index.passwordChangedSuccessfully'));
|
||||
getList();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
done();
|
||||
}
|
||||
},
|
||||
});
|
||||
};
|
||||
const f_VHUB_TextTableInputBoxFun = (row: any) => {
|
||||
state.data.forEach((item: any) => {
|
||||
if (item.id === row.id) item.f_VHUB_TextInputShow = true;
|
||||
else delete item.f_VHUB_TextInputShow;
|
||||
});
|
||||
};
|
||||
const f_URXD_DateTableInputBoxFun = (row: any) => {
|
||||
state.data.forEach((item: any) => {
|
||||
if (item.id === row.id) item.f_URXD_DateInputShow = true;
|
||||
else delete item.f_URXD_DateInputShow;
|
||||
});
|
||||
};
|
||||
const elDatePickerFun = (val: any) => {
|
||||
state.formData.fDateBegin = val[0];
|
||||
state.formData.fDateEmd = val[1];
|
||||
@ -177,6 +301,36 @@ const invoiceOrderDeleteOrderFun = (row: any) => {
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const invoiceOrderDeleteOrderFunOne = (row: any) => {
|
||||
ElMessageBox({
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.scqd1'),
|
||||
confirmButtonText: t('message.index.confirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
showCancelButton: true,
|
||||
buttonSize: 'default',
|
||||
beforeClose: (action, instance, done) => {
|
||||
if (action === 'confirm') {
|
||||
instance.confirmButtonLoading = true;
|
||||
listApi()
|
||||
.DeleteOrderDetail({ id: row.id })
|
||||
.then((res: any) => {
|
||||
done();
|
||||
getList();
|
||||
if (res.resultCode === 0) {
|
||||
ElMessage.success(t('message.index.success'));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
done();
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
const selectionChange = (row: any) => {
|
||||
if (row.checkboxBox == '1') {
|
||||
state.data.forEach((item: any) => {
|
||||
@ -184,7 +338,8 @@ const selectionChange = (row: any) => {
|
||||
item.checkboxBox = '0';
|
||||
}
|
||||
});
|
||||
listApi().invoiceOrderGetPageList({
|
||||
listApi()
|
||||
.invoiceOrderGetPageList({
|
||||
condition: {
|
||||
sheet: row.sheet,
|
||||
fDateBegin: '',
|
||||
@ -208,11 +363,10 @@ const componentPrintingFunDataRow = (row: any) => {
|
||||
componentPrintingRef.value.openShowDataFun(row);
|
||||
};
|
||||
const openComponentPrintingFun = () => {
|
||||
if(state.selectedData.length){
|
||||
console.log(state.selectedData)
|
||||
selectedDataRef.value.showFun(state.selectedData)
|
||||
}
|
||||
}
|
||||
if (state.selectedData.length) {
|
||||
selectedDataRef.value.showFun(state.selectedData);
|
||||
}
|
||||
};
|
||||
//接口数据处理
|
||||
const selectFun = () => {
|
||||
state.page.currentPage = 1;
|
||||
@ -260,14 +414,30 @@ onMounted(() => {});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.tableInputBox {
|
||||
width: 100%;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.tableInputBox:hover {
|
||||
color: #409eff;
|
||||
}
|
||||
|
||||
:deep(.el-checkbox) {
|
||||
height: 15px !important;
|
||||
}
|
||||
|
||||
:deep(.avue-crud__refreshBtn) {
|
||||
display: none;
|
||||
display: none;
|
||||
}
|
||||
|
||||
:deep(.cell) {
|
||||
padding: 0 !important;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
:deep(.avue-crud__left) {
|
||||
@ -353,11 +523,12 @@ onMounted(() => {});
|
||||
}
|
||||
|
||||
:deep(.el-form) {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
}
|
||||
:deep(.el-table--default){
|
||||
height: 100%;
|
||||
|
||||
:deep(.el-table--default) {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.system-user-container {
|
||||
|
||||
@ -4,10 +4,11 @@
|
||||
<avue-crud
|
||||
ref="crudRef"
|
||||
:data="state.data"
|
||||
:option="state.option"
|
||||
:option="tableOption"
|
||||
v-model:page="state.page"
|
||||
@on-load="onLoadFun"
|
||||
@selection-change="selectionChange"
|
||||
@sort-change="sortChange"
|
||||
:table-loading="state.loading"
|
||||
>
|
||||
<template #fBillNo="{ row }">
|
||||
@ -15,22 +16,27 @@
|
||||
</template>
|
||||
<template #fDate="{ row }">{{ row.ifHidden === 0 ? row.fDate : '' }}</template>
|
||||
<template #fPurchaseOrgName="{ row }">
|
||||
<el-tooltip :content="row.fPurchaseOrgName" placement="top" v-if="row.ifHidden === 0 ">
|
||||
<div class="multi-line-omit">{{ row.fPurchaseOrgName }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<el-tooltip :content="row.fPurchaseOrgName" placement="top" v-if="row.ifHidden === 0">
|
||||
<div class="multi-line-omit">{{ row.fPurchaseOrgName }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<template #fCancelStatus="{ row }">
|
||||
{{ row.ifHidden === 0 ? (row.fCancelStatus === 'A' ? t('message.index.unclosed') : t('message.index.unclosed')) : '' }}
|
||||
</template>
|
||||
<template #materialName="{ row }">
|
||||
<el-tooltip :content="row.materialName" placement="top">
|
||||
<div class="multi-line-omit">{{ row.materialName }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<template #materialName="{ row }">
|
||||
<el-tooltip :content="row.materialName" placement="top">
|
||||
<div class="multi-line-omit">{{ row.materialName }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<template #supplierName="{ row }">
|
||||
<el-tooltip :content="row.supplierName" placement="top">
|
||||
<div class="multi-line-omit">{{ row.supplierName }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<template #receiveorgName="{ row }">
|
||||
<el-tooltip :content="row.receiveorgName" placement="top">
|
||||
<div class="multi-line-omit">{{ row.receiveorgName }}</div>
|
||||
</el-tooltip>
|
||||
<el-tooltip :content="row.receiveorgName" placement="top">
|
||||
<div class="multi-line-omit">{{ row.receiveorgName }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<template #chengNuoJiaoQi="{ row }">
|
||||
<el-date-picker
|
||||
@ -38,10 +44,10 @@
|
||||
type="date"
|
||||
:placeholder="t('message.index.date')"
|
||||
size="small"
|
||||
style="width: 100%"
|
||||
style="width: 100%"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
:disabled="row.chengNuoJiaoQi != null"
|
||||
:disabled="row.chengNuoJiaoQi != null"
|
||||
@change="batchSetChengNuoJiaoQiFun([{ id: row.id, newTime: row.chengNuoJiaoQi }])"
|
||||
/>
|
||||
</template>
|
||||
@ -54,67 +60,75 @@
|
||||
style="width: 100%"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
:disabled="true"
|
||||
@change="batchSetNewChengNuoJiaoQiFun([{ id: row.id, newTime: row.newChengNuoJiaoQi }])"
|
||||
/>
|
||||
</template>
|
||||
<template #menu-left>
|
||||
<div class="selectBoxes">
|
||||
<div class="selectBoxes">
|
||||
<div class="selectItem">
|
||||
<el-input v-model="state.formData.fBillNo" style="width: 8vw" :placeholder="t('message.index.DocNumber')" size="default" />
|
||||
</div>
|
||||
<div class="selectItem">
|
||||
<el-input v-model="state.formData.fBillNo" style="width: 8vw" :placeholder="t('message.index.DocNumber')" size="default" />
|
||||
<el-input v-model="state.formData.supplierName" style="width: 8vw" :placeholder="t('message.index.supplierName')" size="default" />
|
||||
</div>
|
||||
<div class="selectItem">
|
||||
<el-input v-model="state.formData.materialCode" style="width: 8vw" :placeholder="t('message.tiaoma.pno')" size="default" />
|
||||
</div>
|
||||
<div class="selectItem">
|
||||
<el-select :placeholder="t('message.index.DocStatus')" size="default" style="width: 8vw" v-model="state.formData.fmrpCloseStatus">
|
||||
<el-option v-for="item in state.option.column[11].dicData" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="selectItem">
|
||||
<el-date-picker
|
||||
v-model="state.elDatePicker"
|
||||
style="width: 22vw"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
:start-placeholder="t('message.index.StartDate')"
|
||||
:end-placeholder="t('message.index.EndDate')"
|
||||
size="default"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
@change="elDatePickerFun"
|
||||
/>
|
||||
</div>
|
||||
<div class="selectItem" style="margin-right: 0">
|
||||
<el-button type="primary" size="default" @click="selectFun">{{ t('message.index.search') }}</el-button>
|
||||
<el-button size="default" @click="resetFun">{{ t('message.index.reset') }}</el-button>
|
||||
</div>
|
||||
<div class="selectItem" style="flex: 1; margin-right: 0">
|
||||
<div class="piliang">
|
||||
<el-button type="primary" size="small" @click="state.selectedDataShow = true">
|
||||
<span>{{ t('message.index.selected') }} {{ state.selectedData.length }} {{ t('message.index.items') }},{{ t('message.index.proceed') }}</span>
|
||||
</el-button>
|
||||
<el-date-picker
|
||||
v-model="state.chengNuoJiaoQiP"
|
||||
type="date"
|
||||
:placeholder="t('message.index.batchUpdateEarliestDeliveryDate')"
|
||||
size="small"
|
||||
style="width: 45%; margin-left: 12px"
|
||||
@change="chengNuoJiaoQiPFun('0')"
|
||||
/>
|
||||
<el-date-picker
|
||||
v-model="state.newChengNuoJiaoQiP"
|
||||
type="date"
|
||||
:placeholder="t('message.index.batchUpdateLatestDeliveryDate')"
|
||||
size="small"
|
||||
style="width: 45%; margin-left: 12px"
|
||||
@change="chengNuoJiaoQiPFun('1')"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="selectItem">
|
||||
<el-input v-model="state.formData.materialCode" style="width: 8vw" :placeholder="t('message.tiaoma.pno')" size="default" />
|
||||
</div>
|
||||
<div class="selectItem">
|
||||
<el-select :placeholder="t('message.index.DocStatus')" size="default" style="width: 8vw" v-model="state.formData.fmrpCloseStatus">
|
||||
<el-option v-for="(item,index) in state.fmrpCloseStatusUl" :key="index" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="selectItem">
|
||||
<el-date-picker
|
||||
v-model="state.elDatePicker"
|
||||
style="width: 22vw"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
:start-placeholder="t('message.index.StartDate')"
|
||||
:end-placeholder="t('message.index.EndDate')"
|
||||
size="default"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
@change="elDatePickerFun"
|
||||
/>
|
||||
</div>
|
||||
<div class="selectItem" style="margin-right: 0">
|
||||
<el-button type="primary" size="default" @click="selectFun">{{ t('message.index.search') }}</el-button>
|
||||
<el-button size="default" @click="resetFun">{{ t('message.index.reset') }}</el-button>
|
||||
</div>
|
||||
<div class="selectItem" style="flex: 1; margin-right: 0">
|
||||
<div class="piliang">
|
||||
<el-button type="primary" size="small" @click="state.selectedDataShow = true">
|
||||
<span
|
||||
>{{ t('message.index.selected') }} {{ state.selectedData.length }} {{ t('message.index.items') }},{{
|
||||
t('message.index.proceed')
|
||||
}}</span
|
||||
>
|
||||
</el-button>
|
||||
<el-date-picker
|
||||
v-model="state.chengNuoJiaoQiP"
|
||||
type="date"
|
||||
:placeholder="t('message.index.batchUpdateEarliestDeliveryDate')"
|
||||
size="small"
|
||||
style="width: 45%; margin-left: 12px"
|
||||
@change="chengNuoJiaoQiPFun('0')"
|
||||
/>
|
||||
<el-date-picker
|
||||
v-model="state.newChengNuoJiaoQiP"
|
||||
type="date"
|
||||
:placeholder="t('message.index.batchUpdateLatestDeliveryDate')"
|
||||
size="small"
|
||||
style="width: 45%; margin-left: 12px"
|
||||
@change="chengNuoJiaoQiPFun('1')"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template #menu="{ row }">
|
||||
<el-button type="text" icon="el-icon-pie-chart" @click="toPurchaseDetails(row)">{{ t('message.index.view') }}</el-button>
|
||||
<el-button type="text" icon="el-icon-pie-chart" @click="toPurchaseDetails(row)">{{ t('message.index.view') }} </el-button>
|
||||
</template>
|
||||
</avue-crud>
|
||||
</el-card>
|
||||
@ -140,6 +154,8 @@ import { listApi } from '/@/api/list';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import SelectedData from '/@/views/mssPurchaseOrder/selectedData.vue';
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
import { Local } from '/@/utils/storage';
|
||||
const crudRef = ref()
|
||||
const selectedDataRef = ref();
|
||||
const { t } = useI18n();
|
||||
const router = useRouter();
|
||||
@ -150,6 +166,10 @@ const state = reactive({
|
||||
currentPage: 1,
|
||||
pageSize: 30,
|
||||
},
|
||||
fmrpCloseStatusUl:[
|
||||
{ label: computed(() => t('message.index.normal')), value: 'A' },
|
||||
{ label: computed(() => t('message.index.closed')), value: 'B' },
|
||||
],
|
||||
option: {
|
||||
tip: false,
|
||||
index: false,
|
||||
@ -163,47 +183,155 @@ const state = reactive({
|
||||
reserveSelection: true,
|
||||
searchMenuSpan: 3,
|
||||
addBtn: false,
|
||||
defaultSort: {
|
||||
prop: 'fBillNo',
|
||||
order: 'ascending'
|
||||
},
|
||||
column: [
|
||||
{ label: computed(() => t('message.index.DocNumber')), prop: 'fBillNo', searchSpan: 3, width: '125',filters: true },
|
||||
{ label: computed(() => t('message.index.khmc')), prop: 'fPurchaseOrgName', searchSpan: 3, width: '165',filters: true },
|
||||
{ label: computed(() => t('message.index.date1')), prop: 'fDate', type: 'datetime', searchSpan: 6, searchRange: true,width: '125' },
|
||||
{
|
||||
label: computed(() => t('message.index.DocNumber')),
|
||||
prop: 'fBillNo',
|
||||
searchSpan: 3,
|
||||
width: '140',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.khmc')),
|
||||
prop: 'fPurchaseOrgName',
|
||||
searchSpan: 3,
|
||||
width: '180',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.date1')),
|
||||
prop: 'fDate',
|
||||
type: 'datetime',
|
||||
searchSpan: 6,
|
||||
searchRange: true,
|
||||
width: '140',
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.status')),
|
||||
prop: 'fCancelStatus',
|
||||
filters: true,
|
||||
filters: true,
|
||||
dicData: [
|
||||
{ label: computed(() => t('message.index.unclosed')), value: 'A' },
|
||||
{ label: computed(() => t('message.index.closed1')), value: 'B' },
|
||||
{ label: computed(() => t('message.index.unclosed')), value: 'A' },
|
||||
{ label: computed(() => t('message.index.closed1')), value: 'B' },
|
||||
],
|
||||
width: '110',
|
||||
width: '130',
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.supplierName')),
|
||||
prop: 'supplierName',
|
||||
searchSpan: 3,
|
||||
width: '200',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.xsddh')),
|
||||
prop: 'fdemandbillno',
|
||||
searchSpan: 3,
|
||||
width: '140',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.sgxsddh')),
|
||||
prop: 'f_TSPR_Text_qtr1',
|
||||
searchSpan: 3,
|
||||
width: '165',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.partNumber')),
|
||||
prop: 'materialCode',
|
||||
width: '185',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.materialName')),
|
||||
prop: 'materialName',
|
||||
width: '240',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{ label: computed(() => t('message.index.unit')), prop: 'unitName', width: '135', filters: true, sortable: true },
|
||||
{ label: computed(() => t('message.index.qty')), prop: 'qty', width: '135', filters: true, sortable: true },
|
||||
{
|
||||
label: computed(() => t('message.index.cgtype')),
|
||||
prop: 'fbilltypeid',
|
||||
width: '200',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.organizationCode')),
|
||||
prop: 'receiveorgCode',
|
||||
width: '180',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.organizationName')),
|
||||
prop: 'receiveorgName',
|
||||
width: '180',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.requestDate')),
|
||||
prop: 'fDeliveryDate',
|
||||
width: '165',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{ label: computed(() => t('message.index.xsddh')), prop: 'fdemandbillno', searchSpan: 3, width: '125',filters: true },
|
||||
{ label: computed(() => t('message.index.sgxsddh')), prop: 'f_TSPR_Text_qtr1', searchSpan: 3, width: '140',filters: true },
|
||||
{ label: computed(() => t('message.index.partNumber')), prop: 'materialCode', width: '160',filters: true },
|
||||
{ label: computed(() => t('message.index.materialName')), prop: 'materialName', width: '240',filters: true, },
|
||||
{ label: computed(() => t('message.index.unit')), prop: 'unitName', width: '110',filters: true, },
|
||||
{ label: computed(() => t('message.index.qty')), prop: 'qty', width: '110',filters: true },
|
||||
|
||||
|
||||
{ label: computed(() => t('message.index.organizationCode')), prop: 'receiveorgCode', width: '180',filters: true },
|
||||
{ label: computed(() => t('message.index.organizationName')), prop: 'receiveorgName', width: '180',filters: true },
|
||||
|
||||
{ label: computed(() => t('message.index.requestDate')), prop: 'fDeliveryDate', width: '165',filters: true },
|
||||
{
|
||||
label: computed(() => t('message.index.DocStatus')),
|
||||
prop: 'fmrpCloseStatus',
|
||||
searchSpan: 3,
|
||||
filters: true,
|
||||
filters: true,
|
||||
dicData: [
|
||||
{ label: computed(() => t('message.index.normal')), value: 'A' },
|
||||
{ label: computed(() => t('message.index.closed')), value: 'B' },
|
||||
{ label: computed(() => t('message.index.normal')), value: 'A' },
|
||||
{ label: computed(() => t('message.index.closed')), value: 'B' },
|
||||
],
|
||||
width: '110',
|
||||
width: '135',
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.receivedQTY')),
|
||||
prop: 'mssReceiveQty',
|
||||
width: '210',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.unreceivedQTY')),
|
||||
prop: 'notSendQty',
|
||||
width: '140',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.earliestDeliveryDate')),
|
||||
prop: 'chengNuoJiaoQi',
|
||||
width: '200',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.latestDeliveryDate')),
|
||||
prop: 'newChengNuoJiaoQi',
|
||||
width: '220',
|
||||
filters: true,
|
||||
sortable: true,
|
||||
},
|
||||
{ label: computed(() => t('message.index.receivedQTY')), prop: 'mssReceiveQty', width: '180',filters: true },
|
||||
{ label: computed(() => t('message.index.unreceivedQTY')), prop: 'notSendQty', width: '110',filters: true },
|
||||
{ label: computed(() => t('message.index.earliestDeliveryDate')), prop: 'chengNuoJiaoQi', width: '160',filters: true },
|
||||
{ label: computed(() => t('message.index.latestDeliveryDate')), prop: 'newChengNuoJiaoQi', width: '180',filters: true },
|
||||
],
|
||||
},
|
||||
data: [],
|
||||
@ -213,14 +341,81 @@ const state = reactive({
|
||||
fDateBegin: '',
|
||||
fDateEmd: '',
|
||||
fmrpCloseStatus: '',
|
||||
materialCode:''
|
||||
},
|
||||
materialCode: '',
|
||||
sortType: 0,
|
||||
sortString: '',
|
||||
supplierName: ''
|
||||
} as any,
|
||||
selectedData: [],
|
||||
chengNuoJiaoQiP: '',
|
||||
newChengNuoJiaoQiP: '',
|
||||
selectedDataShow: false,
|
||||
loading: false,
|
||||
});
|
||||
|
||||
|
||||
const tableOption = computed(() => ({
|
||||
tip: false,
|
||||
index: false,
|
||||
menu: true,
|
||||
menuWidth: 85,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
selection: true,
|
||||
reserveSelection: true,
|
||||
searchMenuSpan: 3,
|
||||
addBtn: false,
|
||||
defaultSort: {
|
||||
prop: 'fBillNo',
|
||||
order: 'ascending'
|
||||
},
|
||||
column: [
|
||||
{ label: t('message.index.DocNumber'), prop: 'fBillNo', searchSpan: 3, width: '140', filters: true, sortable: true },
|
||||
{ label: t('message.index.khmc'), prop: 'fPurchaseOrgName', searchSpan: 3, width: '180', filters: true, sortable: true },
|
||||
{ label: t('message.index.date1'), prop: 'fDate', type: 'datetime', searchSpan: 6, searchRange: true, width: '140', sortable: true },
|
||||
{
|
||||
label: t('message.index.status'),
|
||||
prop: 'fCancelStatus',
|
||||
filters: true,
|
||||
dicData: [
|
||||
{ label: t('message.index.unclosed'), value: 'A' },
|
||||
{ label: t('message.index.closed1'), value: 'B' },
|
||||
],
|
||||
width: '130',
|
||||
sortable: true,
|
||||
},
|
||||
{ label: t('message.index.supplierName'), prop: 'supplierName', searchSpan: 3, width: '200', filters: true, sortable: true },
|
||||
{ label: t('message.index.xsddh'), prop: 'fdemandbillno', searchSpan: 3, width: '140', filters: true, sortable: true },
|
||||
{ label: t('message.index.sgxsddh'), prop: 'f_TSPR_Text_qtr1', searchSpan: 3, width: '165', filters: true, sortable: true },
|
||||
{ label: t('message.index.partNumber'), prop: 'materialCode', width: '185', filters: true, sortable: true },
|
||||
{ label: t('message.index.materialName'), prop: 'materialName', width: '240', filters: true, sortable: true },
|
||||
{ label: t('message.index.unit'), prop: 'unitName', width: '135', filters: true, sortable: true },
|
||||
{ label: t('message.index.qty'), prop: 'qty', width: '135', filters: true, sortable: true },
|
||||
{ label: t('message.index.cgtype'), prop: 'fbilltypeid', width: '200', filters: true, sortable: true },
|
||||
{ label: t('message.index.organizationCode'), prop: 'receiveorgCode', width: '180', filters: true, sortable: true },
|
||||
{ label: t('message.index.organizationName'), prop: 'receiveorgName', width: '180', filters: true, sortable: true },
|
||||
{ label: t('message.index.requestDate'), prop: 'fDeliveryDate', width: '165', filters: true, sortable: true },
|
||||
{
|
||||
label: t('message.index.DocStatus'),
|
||||
prop: 'fmrpCloseStatus',
|
||||
searchSpan: 3,
|
||||
filters: true,
|
||||
dicData: [
|
||||
{ label: t('message.index.normal'), value: 'A' },
|
||||
{ label: t('message.index.closed'), value: 'B' },
|
||||
],
|
||||
width: '135',
|
||||
sortable: true,
|
||||
},
|
||||
{ label: t('message.index.receivedQTY'), prop: 'mssReceiveQty', width: '210', filters: true, sortable: true },
|
||||
{ label: t('message.index.unreceivedQTY'), prop: 'notSendQty', width: '140', filters: true, sortable: true },
|
||||
{ label: t('message.index.earliestDeliveryDate'), prop: 'chengNuoJiaoQi', width: '200', filters: true, sortable: true },
|
||||
{ label: t('message.index.latestDeliveryDate'), prop: 'newChengNuoJiaoQi', width: '220', filters: true, sortable: true },
|
||||
],
|
||||
}));
|
||||
|
||||
const selectionChange = (list: any) => {
|
||||
nextTick(() => {
|
||||
state.selectedData = JSON.parse(JSON.stringify(list));
|
||||
@ -232,15 +427,15 @@ const chengNuoJiaoQiPFun = (e: string) => {
|
||||
if (e === '0') {
|
||||
state.selectedData.forEach((item: any) => {
|
||||
arr.push({ id: item.id, newTime: state.chengNuoJiaoQiP });
|
||||
item.chengNuoJiaoQi = state.chengNuoJiaoQiP
|
||||
item.chengNuoJiaoQi = state.chengNuoJiaoQiP;
|
||||
});
|
||||
ElMessageBox({
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.pleaseConfirmTheDateChange'),
|
||||
confirmButtonText: t('message.user.logOutConfirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.pleaseConfirmTheDateChange'),
|
||||
confirmButtonText: t('message.user.logOutConfirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
showCancelButton: true,
|
||||
buttonSize: 'default',
|
||||
beforeClose: (action, instance, done) => {
|
||||
@ -269,15 +464,15 @@ const chengNuoJiaoQiPFun = (e: string) => {
|
||||
if (e === '1') {
|
||||
state.selectedData.forEach((item: any) => {
|
||||
arr.push({ id: item.id, newTime: state.newChengNuoJiaoQiP });
|
||||
item.newChengNuoJiaoQi = state.newChengNuoJiaoQiP
|
||||
item.newChengNuoJiaoQi = state.newChengNuoJiaoQiP;
|
||||
});
|
||||
ElMessageBox({
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.pleaseConfirmTheDateChange'),
|
||||
confirmButtonText: t('message.user.logOutConfirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.pleaseConfirmTheDateChange'),
|
||||
confirmButtonText: t('message.user.logOutConfirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
showCancelButton: true,
|
||||
buttonSize: 'default',
|
||||
beforeClose: (action, instance, done) => {
|
||||
@ -310,10 +505,10 @@ const batchSetChengNuoJiaoQiFun = (arr: any) => {
|
||||
ElMessageBox({
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.pleaseConfirmTheDateChange'),
|
||||
confirmButtonText: t('message.user.logOutConfirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.pleaseConfirmTheDateChange'),
|
||||
confirmButtonText: t('message.user.logOutConfirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
showCancelButton: true,
|
||||
buttonSize: 'default',
|
||||
beforeClose: (action, instance, done) => {
|
||||
@ -322,6 +517,7 @@ const batchSetChengNuoJiaoQiFun = (arr: any) => {
|
||||
listApi()
|
||||
.batchSetChengNuoJiaoQi(arr)
|
||||
.then((res: any) => {
|
||||
getList();
|
||||
done();
|
||||
if (res.resultCode === 0) {
|
||||
getList();
|
||||
@ -333,7 +529,7 @@ const batchSetChengNuoJiaoQiFun = (arr: any) => {
|
||||
}
|
||||
});
|
||||
} else {
|
||||
getList();
|
||||
getList();
|
||||
done();
|
||||
}
|
||||
},
|
||||
@ -343,10 +539,10 @@ const batchSetNewChengNuoJiaoQiFun = (arr: any) => {
|
||||
ElMessageBox({
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.pleaseConfirmTheDateChange'),
|
||||
confirmButtonText: t('message.user.logOutConfirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
title: t('message.index.prompt'),
|
||||
message: t('message.index.pleaseConfirmTheDateChange'),
|
||||
confirmButtonText: t('message.user.logOutConfirm'),
|
||||
cancelButtonText: t('message.user.logOutCancel'),
|
||||
showCancelButton: true,
|
||||
buttonSize: 'default',
|
||||
beforeClose: (action, instance, done) => {
|
||||
@ -366,7 +562,7 @@ const batchSetNewChengNuoJiaoQiFun = (arr: any) => {
|
||||
}
|
||||
});
|
||||
} else {
|
||||
getList();
|
||||
getList();
|
||||
done();
|
||||
}
|
||||
},
|
||||
@ -389,6 +585,34 @@ const elDatePickerFun = (val: any) => {
|
||||
state.formData.fDateBegin = val[0];
|
||||
state.formData.fDateEmd = val[1];
|
||||
};
|
||||
const sortChange = (row: any) => {
|
||||
/*
|
||||
order
|
||||
ascending 正序
|
||||
descending 倒序
|
||||
null 无序
|
||||
prop
|
||||
*/
|
||||
// sortType: 0,
|
||||
// sortString: '',
|
||||
console.log( state.option.defaultSort)
|
||||
if (row.order === 'ascending') {
|
||||
state.formData.sortType = 1;
|
||||
state.formData.sortString = row.prop;
|
||||
// state.option.defaultSort.order = 'ascending'
|
||||
}
|
||||
if (row.order === 'descending') {
|
||||
state.formData.sortType = 0;
|
||||
state.formData.sortString = row.prop;
|
||||
// state.option.defaultSort.order = 'descending'
|
||||
}
|
||||
if (row.order === null) {
|
||||
state.formData.sortType = 1;
|
||||
state.formData.sortString = ''
|
||||
// state.option.defaultSort.order = 'ascending'
|
||||
}
|
||||
getList();
|
||||
};
|
||||
//接口数据处理
|
||||
const selectFun = () => {
|
||||
state.page.currentPage = 1;
|
||||
@ -404,13 +628,19 @@ const resetFun = () => {
|
||||
fDateBegin: '',
|
||||
fDateEmd: '',
|
||||
fmrpCloseStatus: '',
|
||||
sortType: 0,
|
||||
sortString: '',
|
||||
};
|
||||
Local.remove('mssPurchaseOrderForm')
|
||||
Local.remove('mssPurchaseOrderOption')
|
||||
crudRef.value.refreshTable()
|
||||
getList();
|
||||
};
|
||||
const onLoadFun = (e: any) => {
|
||||
state.page.currentPage = e.currentPage;
|
||||
state.page.pageSize = e.pageSize;
|
||||
getList();
|
||||
state.page.currentPage != 1 ? getList() : null
|
||||
console.log(state.page.currentPage)
|
||||
};
|
||||
const getList = () => {
|
||||
state.loading = true;
|
||||
@ -423,6 +653,9 @@ const getList = () => {
|
||||
.then((res: any) => {
|
||||
state.loading = false;
|
||||
if (res.resultCode === 0) {
|
||||
Local.set('mssPurchaseOrderForm', state.formData);
|
||||
Local.set('mssPurchaseOrderOption',JSON.stringify(state.option))
|
||||
console.log(state.option)
|
||||
state.data = res.data.dataList;
|
||||
state.page.total = res.data.total;
|
||||
}
|
||||
@ -430,6 +663,22 @@ const getList = () => {
|
||||
};
|
||||
// 页面加载时
|
||||
onMounted(() => {
|
||||
const mssPurchaseOrderForm : any = Local.get('mssPurchaseOrderForm') || {}
|
||||
const mssPurchaseOrderOption : any = Local.get('mssPurchaseOrderOption') || {}
|
||||
// debugger
|
||||
if(Object.keys(mssPurchaseOrderForm).length > 0){
|
||||
nextTick(() => {
|
||||
state.formData = mssPurchaseOrderForm
|
||||
getList()
|
||||
})
|
||||
} else {
|
||||
Local.set('mssPurchaseOrderForm', state.formData);
|
||||
getList()
|
||||
}
|
||||
if(Object.keys(mssPurchaseOrderOption).length > 0){
|
||||
state.option = JSON.parse(mssPurchaseOrderOption)
|
||||
console.log(state.option);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@ -534,11 +783,13 @@ onMounted(() => {
|
||||
|
||||
:deep(.el-form) {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
overflow: hidden;
|
||||
}
|
||||
:deep(.el-table--default){
|
||||
height: 100%;
|
||||
|
||||
:deep(.el-table--default) {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.system-user-container {
|
||||
:deep(.el-card__body) {
|
||||
display: flex;
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="system-user-container layout-padding">
|
||||
<el-card class="layout-padding-auto" shadow="hover">
|
||||
<avue-crud ref="crudRef" :data="state.data" :option="state.option" @selection-change="selectionChange" :table-loading="state.loading">
|
||||
<avue-crud ref="crudRef" :data="state.data" :option="tableOption" @selection-change="selectionChange" :table-loading="state.loading">
|
||||
<template #fBillNo="{ row }">{{ row.fBillNo }}</template>
|
||||
<template #fDate="{ row }">{{ row.fDate }}</template>
|
||||
<template #materialName="{ row }">
|
||||
@ -18,7 +18,7 @@
|
||||
style="width: 220px"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
:disabled="row.chengNuoJiaoQi != null"
|
||||
:disabled="row.chengNuoJiaoQi != null"
|
||||
@change="batchSetChengNuoJiaoQiFun([{ id: row.id, newTime: row.chengNuoJiaoQi }])"
|
||||
/>
|
||||
</template>
|
||||
@ -31,6 +31,7 @@
|
||||
style="width: 220px"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
:disabled="true"
|
||||
@change="batchSetNewChengNuoJiaoQiFun([{ id: row.id, newTime: row.newChengNuoJiaoQi }])"
|
||||
/>
|
||||
</template>
|
||||
@ -95,59 +96,6 @@ const state = reactive({
|
||||
currentPage: 1,
|
||||
pageSize: 25,
|
||||
},
|
||||
option: {
|
||||
tip: false,
|
||||
index: true,
|
||||
menuWidth: 120,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
// searchLabelWidth:100,
|
||||
selection: true,
|
||||
searchMenuSpan: 3,
|
||||
addBtn: false,
|
||||
menu: false,
|
||||
column: [
|
||||
{ label: computed(() => t('message.index.DocNumber')), prop: 'fBillNo', searchSpan: 3, width: '125' },
|
||||
{
|
||||
label: computed(() => t('message.index.date')),
|
||||
prop: 'fDate',
|
||||
type: 'datetime',
|
||||
searchSpan: 6,
|
||||
searchRange: true,
|
||||
},
|
||||
{
|
||||
label: computed(() => t('message.index.status')),
|
||||
prop: 'fCancelStatus',
|
||||
dicData: [
|
||||
{ label: computed(() => t('message.index.unclosed')), value: 'A' },
|
||||
{ label: computed(() => t('message.index.closed1')), value: 'B' },
|
||||
],
|
||||
width: '90',
|
||||
},
|
||||
{ label: computed(() => t('message.index.partNumber')), prop: 'materialCode', width: '120' },
|
||||
{ label: computed(() => t('message.index.materialName')), prop: 'materialName', width: '240' },
|
||||
{ label: computed(() => t('message.index.specification')), prop: 'guige', width: '120' },
|
||||
{ label: computed(() => t('message.index.unit')), prop: 'unitName', width: '90' },
|
||||
{ label: computed(() => t('message.index.qty')), prop: 'qty', width: '90' },
|
||||
{ label: computed(() => t('message.index.requestDate')), prop: 'fDeliveryDate', width: '165' },
|
||||
{
|
||||
label: computed(() => t('message.index.DocStatus')),
|
||||
prop: 'fmrpCloseStatus',
|
||||
searchSpan: 3,
|
||||
dicData: [
|
||||
{ label: computed(() => t('message.index.normal')), value: 'A' },
|
||||
{ label: computed(() => t('message.index.closed')), value: 'B' },
|
||||
],
|
||||
width: '90',
|
||||
},
|
||||
{ label: computed(() => t('message.index.receivedQTY')), prop: 'mssReceiveQty', width: '180' },
|
||||
{ label: computed(() => t('message.index.unreceivedQTY')), prop: 'notSendQty', width: '110' },
|
||||
{ label: computed(() => t('message.index.earliestDeliveryDate')), prop: 'chengNuoJiaoQi', width: '160' },
|
||||
{ label: computed(() => t('message.index.latestDeliveryDate')), prop: 'newChengNuoJiaoQi', width: '160' },
|
||||
],
|
||||
},
|
||||
data: [],
|
||||
elDatePicker: '',
|
||||
formData: {
|
||||
@ -163,6 +111,61 @@ const state = reactive({
|
||||
loading: false,
|
||||
topId: '',
|
||||
});
|
||||
|
||||
const tableOption = computed(() => ({
|
||||
tip: false,
|
||||
index: true,
|
||||
menuWidth: 120,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
selection: true,
|
||||
searchMenuSpan: 3,
|
||||
addBtn: false,
|
||||
menu: false,
|
||||
column: [
|
||||
{ label: t('message.index.DocNumber'), prop: 'fBillNo', searchSpan: 3, width: '125' },
|
||||
{
|
||||
label: t('message.index.date'),
|
||||
prop: 'fDate',
|
||||
type: 'datetime',
|
||||
searchSpan: 6,
|
||||
searchRange: true,
|
||||
},
|
||||
{
|
||||
label: t('message.index.status'),
|
||||
prop: 'fCancelStatus',
|
||||
dicData: [
|
||||
{ label: t('message.index.unclosed'), value: 'A' },
|
||||
{ label: t('message.index.closed1'), value: 'B' },
|
||||
],
|
||||
width: '90',
|
||||
},
|
||||
{ label: t('message.index.partNumber'), prop: 'materialCode', width: '120' },
|
||||
{ label: t('message.index.materialName'), prop: 'materialName', width: '240' },
|
||||
{ label: t('message.index.specification'), prop: 'guige', width: '120' },
|
||||
{ label: t('message.index.unit'), prop: 'unitName', width: '90' },
|
||||
{ label: t('message.index.qty'), prop: 'qty', width: '90' },
|
||||
{ label: t('message.index.cgtype'), prop: 'fbilltypeid', width: '110', filters: true },
|
||||
{ label: t('message.index.requestDate'), prop: 'fDeliveryDate', width: '165' },
|
||||
{
|
||||
label: t('message.index.DocStatus'),
|
||||
prop: 'fmrpCloseStatus',
|
||||
searchSpan: 3,
|
||||
dicData: [
|
||||
{ label: t('message.index.normal'), value: 'A' },
|
||||
{ label: t('message.index.closed'), value: 'B' },
|
||||
],
|
||||
width: '90',
|
||||
},
|
||||
{ label: t('message.index.receivedQTY'), prop: 'mssReceiveQty', width: '180' },
|
||||
{ label: t('message.index.unreceivedQTY'), prop: 'notSendQty', width: '110' },
|
||||
{ label: t('message.index.earliestDeliveryDate'), prop: 'chengNuoJiaoQi', width: '160' },
|
||||
{ label: t('message.index.latestDeliveryDate'), prop: 'newChengNuoJiaoQi', width: '160' },
|
||||
],
|
||||
}))
|
||||
|
||||
const selectionChange = (list: any) => {
|
||||
nextTick(() => {
|
||||
state.selectedData = JSON.parse(JSON.stringify(list));
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<el-dialog :model-value="props.showes" @close="closeFun" width="90%">
|
||||
|
||||
<avue-crud ref="crudRef" :data="state.data" :option="state.option">
|
||||
<avue-crud ref="crudRef" :data="state.data" :option="tableOption">
|
||||
<template #fSupplierLot="{ row }">
|
||||
<div style="display: flex; align-items: center; justify-content: center">
|
||||
<el-input v-model="row.fSupplierLot" :placeholder="t('message.index.supplierLot')" size="small" />
|
||||
@ -84,37 +84,40 @@ const state = reactive({
|
||||
data: [],
|
||||
show: true,
|
||||
formData: {},
|
||||
option: {
|
||||
tip: false,
|
||||
selection: false,
|
||||
index: true,
|
||||
menu: false,
|
||||
menuWidth: 150,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
searchLabelWidth: 140,
|
||||
searchMenuSpan: 6,
|
||||
addBtn: false,
|
||||
column: [
|
||||
{ label: computed(() => t('message.index.PO1')), prop: 'fBillNo' },
|
||||
{ label: computed(() => t('message.index.partNumber')), prop: 'materialCode' },
|
||||
{ label: computed(() => t('message.index.materialName')), prop: 'materialName', width: '180' },
|
||||
{ label: computed(() => t('message.index.unit')), prop: 'unitName' },
|
||||
{ label: computed(() => t('message.index.qty')), prop: 'qty' },
|
||||
{ label: computed(() => t('message.index.receivedQTY')), prop: 'mssReceiveQty' },
|
||||
{ label: computed(() => t('message.index.unreceivedQTY')), prop: 'notSendQtyText' },
|
||||
{ label: computed(() => t('message.index.supplierLot')), prop: 'fSupplierLot' },
|
||||
{ label: computed(() => t('message.index.shipmentQTY')), prop: 'notSendQty', width: '180' },
|
||||
{ label: computed(() => t('message.index.earliestDeliveryDate')), prop: 'chengNuoJiaoQi', width: '180' },
|
||||
{ label: computed(() => t('message.index.latestDeliveryDate')), prop: 'newChengNuoJiaoQi', width: '180' },
|
||||
],
|
||||
},
|
||||
option: {},
|
||||
topId: '',
|
||||
chengNuoJiaoQiP: '',
|
||||
newChengNuoJiaoQiP: '',
|
||||
});
|
||||
|
||||
const tableOption = computed(() => ({
|
||||
tip: false,
|
||||
selection: false,
|
||||
index: true,
|
||||
menu: false,
|
||||
menuWidth: 150,
|
||||
border: true,
|
||||
delBtn: false,
|
||||
editBtn: false,
|
||||
align: 'center',
|
||||
searchLabelWidth: 140,
|
||||
searchMenuSpan: 6,
|
||||
addBtn: false,
|
||||
column: [
|
||||
{ label: t('message.index.PO1'), prop: 'fBillNo' },
|
||||
{ label: t('message.index.partNumber'), prop: 'materialCode' },
|
||||
{ label: t('message.index.materialName'), prop: 'materialName', width: '180' },
|
||||
{ label: t('message.index.unit'), prop: 'unitName' },
|
||||
{ label: t('message.index.qty'), prop: 'qty' },
|
||||
{ label: t('message.index.receivedQTY'), prop: 'mssReceiveQty' },
|
||||
{ label: t('message.index.unreceivedQTY'), prop: 'notSendQtyText' },
|
||||
{ label: t('message.index.supplierLot'), prop: 'fSupplierLot' },
|
||||
{ label: t('message.index.shipmentQTY'), prop: 'notSendQty', width: '180' },
|
||||
{ label: t('message.index.earliestDeliveryDate'), prop: 'chengNuoJiaoQi', width: '180' },
|
||||
{ label: t('message.index.latestDeliveryDate'), prop: 'newChengNuoJiaoQi', width: '180' },
|
||||
],
|
||||
}))
|
||||
|
||||
watch(
|
||||
() => props.listData,
|
||||
() => {
|
||||
@ -126,14 +129,14 @@ watch(
|
||||
);
|
||||
const batchAddInvoiceOrderFun = () => {
|
||||
if(Local.get('setUserInfo').ifForeign === 1){
|
||||
if(state.f_VHUB_Text === ''){
|
||||
ElMessage.error(t('message.index.qtxfph'))
|
||||
return
|
||||
}
|
||||
if(state.f_URXD_Date === ''){
|
||||
ElMessage.error(t('message.index.qtxfph'))
|
||||
return
|
||||
}
|
||||
// if(state.f_VHUB_Text === ''){
|
||||
// ElMessage.error(t('message.index.qtxfph'))
|
||||
// return
|
||||
// }
|
||||
// if(state.f_URXD_Date === ''){
|
||||
// ElMessage.error(t('message.index.qtxfph'))
|
||||
// return
|
||||
// }
|
||||
if(state.faHuoDate === ''){
|
||||
ElMessage.error(t('message.index.deliveryDate'))
|
||||
return
|
||||
|
||||
@ -29,7 +29,7 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
|
||||
hmr: true,
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'https://maxcess.gatedge.cn:91',
|
||||
target: 'https://58.252.252.77:91',
|
||||
ws: true,
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => path.replace(/^\/api/, ''),
|
||||
@ -46,19 +46,19 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
|
||||
drop_debugger: true // 移除debugger
|
||||
}
|
||||
},
|
||||
rollupOptions: {
|
||||
output: {
|
||||
chunkFileNames: 'assets/js/[name]-[hash].js',
|
||||
entryFileNames: 'assets/js/[name]-[hash].js',
|
||||
assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
|
||||
manualChunks(id) {
|
||||
if (id.includes('node_modules')) {
|
||||
return id.toString().match(/\/node_modules\/(?!.pnpm)(?<moduleName>[^\/]*)\//)?.groups!.moduleName ?? 'vender';
|
||||
}
|
||||
},
|
||||
},
|
||||
...(JSON.parse(env.VITE_OPEN_CDN) ? { external: buildConfig.external } : {}),
|
||||
},
|
||||
// rollupOptions: {
|
||||
// output: {
|
||||
// chunkFileNames: 'assets/js/[name]-[hash].js',
|
||||
// entryFileNames: 'assets/js/[name]-[hash].js',
|
||||
// assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
|
||||
// manualChunks(id) {
|
||||
// if (id.includes('node_modules')) {
|
||||
// return id.toString().match(/\/node_modules\/(?!.pnpm)(?<moduleName>[^\/]*)\//)?.groups!.moduleName ?? 'vender';
|
||||
// }
|
||||
// },
|
||||
// },
|
||||
// ...(JSON.parse(env.VITE_OPEN_CDN) ? { external: buildConfig.external } : {}),
|
||||
// },
|
||||
},
|
||||
define:{
|
||||
__VUE_I18N_LEGACY_API__: JSON.stringify(false),
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user