Files
PropertyDeployment/resources/Web/MicroCommunityWeb/html/components/fee/batchPayConfirm/batchPayConfirm.js
2025-12-09 20:22:03 +08:00

544 lines
23 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function (vc) {
vc.extends({
data: {
aba_pay_status:true,
ABAQRCode: null,
pollingTimerId: null,
trainId: null,
preCheck:true,
batchPayConfirmInfo: {
payType: '',
fees: [],
primeRate: '',
primeRates: [],
payerObjName: '',
orderId: '',
paymentPoolId: '',
authCode: '',
feePrices: '',
detailIds: '',
printUrl: '/print.html#/pages/property/printPayFee',
accountAmount: '',
acctId: ''
}
},
watch: {
'batchPayConfirmInfo.primeRate': {
deep: true,
handler: function () {
let _primeRate = $that.batchPayConfirmInfo.primeRate;
if(_primeRate=="9"){
$that.preCheck = true;
$that._doPayFee()
}
}
}
},
_initMethod: function () {
//与字典表支付方式关联
vc.getDict('pay_fee_detail', "prime_rate", function (_data) {
$that.batchPayConfirmInfo.primeRates = _data;
});
$that._listFeePrintPages();
},
_initEvent: function () {
vc.on('batchPayConfirm', 'openBatchPayFee', function (_param) {
console.log("清除定时器");
clearInterval($that.pollingTimerId);
$that._resetBatchPayConfirm();
$that.batchPayConfirmInfo.payType = _param.payType;
$that.batchPayConfirmInfo.fees = _param.fees;
$that.batchPayConfirmInfo.feePrices = _param.feePrices;
$that.batchPayConfirmInfo.payerObjName = _param.payerObjName;
$that.batchPayConfirmInfo.accountAmount = _param.accountAmount;
$that.batchPayConfirmInfo.acctId = _param.acctId;
$("#doBatchPayFeeModal").modal('show');
if (_param.payType == 'qrCode') {
setTimeout('document.getElementById("authCode").focus()', 500);
}
console.log("创建aba支付连接");
$that._createAba();
});
},
methods: {
_closeDoBatchPayFeeModal: function () {
$("#doBatchPayFeeModal").modal('hide');
if (this.pollingTimerId) {
clearInterval(this.pollingTimerId);
console.log("离开页面,已清除 ABA 支付轮询定时器");
this.pollingTimerId = null; // 重置变量,避免内存泄漏
}
},
_doPayFee: function () {
if (!$that.batchPayConfirmInfo.primeRate) {
vc.toast('请选择支付方式');
return;
}
let _fees = $that.batchPayConfirmInfo.fees;
_fees.forEach(_fee => {
_fee.primeRate = $that.batchPayConfirmInfo.primeRate;
});
let _data = {
communityId: vc.getCurrentCommunity().communityId,
fees: _fees,
trainId: $that.trainId,
acctId: $that.batchPayConfirmInfo.acctId,
accountAmount: $that.batchPayConfirmInfo.accountAmount,
thirdPayId: $that.trainId,
preCheck:$that.preCheck,
}
vc.http.apiPost(
'/fee.payBatchFee',
JSON.stringify(_data), {
emulateJSON: true
},
function (json, res) {
let _json = JSON.parse(json);
if (_json.code == 0) {
$that._doDealPayResult(_json);
return;
}
if ($that.preCheck==true){
if (_json.msg == "预检完成,可正常缴费") {
$that.preCheck = false;
}else{
$that.ABAQRCode = _json.msg;
}
}
vc.toast(_json.msg);
},
function (errInfo, error) {
console.log("预检完成")
if ($that.preCheck==true){
if (_json.msg == "预检完成,可正常缴费") {
$that.preCheck = false;
}else{
$that.ABAQRCode = _json.msg;
}
}
console.log('请求失败处理');
$that._closeDoBatchPayFeeModal();
vc.toast(errInfo);
});
},
_qrCodePayFee: function () {
if ($that.batchPayConfirmInfo.primeRate == '') {
vc.toast('请选择支付方式');
return;
}
let _fees = $that.batchPayConfirmInfo.fees;
_fees.forEach(_fee => {
_fee.primeRate = $that.batchPayConfirmInfo.primeRate;
});
let _data = {
communityId: vc.getCurrentCommunity().communityId,
fees: _fees,
acctId: $that.batchPayConfirmInfo.acctId,
accountAmount: $that.batchPayConfirmInfo.accountAmount,
authCode: $that.batchPayConfirmInfo.authCode,
receivedAmount: $that.batchPayConfirmInfo.feePrices,
payerObjName: $that.batchPayConfirmInfo.payerObjName,
subServiceCode: 'fee.payBatchFee'
}
vc.http.apiPost(
'/payment.qrCodePayment',
JSON.stringify(_data), {
emulateJSON: true
},
function (json, res) {
let _data = JSON.parse(json);
if (_data.code == 404) {
vc.toast(_data.msg);
if (_data.data && _data.data.orderId) {
$that.batchPayConfirmInfo.orderId = _data.data.orderId;
$that.batchPayConfirmInfo.paymentPoolId = _data.data.paymentPoolId;
setTimeout('$that._qrCodeCheckPayFinish()', 5000);
}
return;
} else if (_data.code == 0) {
$that._doDealPayResult(_data);
} else {
vc.toast(_data.msg);
}
},
function (errInfo, error) {
console.log('请求失败处理');
vc.toast(errInfo);
}
);
},
_qrCodeCheckPayFinish: function () {
let _fees = $that.batchPayConfirmInfo.fees;
_fees.forEach(_fee => {
_fee.primeRate = $that.batchPayConfirmInfo.primeRate;
});
let _data = {
communityId: vc.getCurrentCommunity().communityId,
fees: _fees,
acctId: $that.batchPayConfirmInfo.acctId,
accountAmount: $that.batchPayConfirmInfo.accountAmount,
authCode: $that.batchPayConfirmInfo.authCode,
receivedAmount: $that.batchPayConfirmInfo.feePrices,
subServiceCode: 'fee.payBatchFee',
orderId: $that.batchPayConfirmInfo.orderId,
paymentPoolId: $that.batchPayConfirmInfo.paymentPoolId
}
vc.http.apiPost(
'/payment.checkPayFinish',
JSON.stringify(_data), {
emulateJSON: true
},
function (json, res) {
let _data = JSON.parse(json);
if (_data.code == 404) {
vc.toast(_data.msg);
return;
} else if (_data.code == 41) {
setTimeout('$that._qrCodeCheckPayFinish()', 5000);
return;
}
$that._doDealPayResult(_data);
},
function (errInfo, error) {
console.log('请求失败处理');
vc.toast(errInfo);
}
);
},
_doDealPayResult: function (_json) {
$that._closeDoBatchPayFeeModal();
let _data = _json.data;
let detailIds = '';
_data.details.forEach(item => {
detailIds += (item + ',');
})
$that.batchPayConfirmInfo.detailIds = detailIds;
//todo 这里等三秒,有可能收据队列还没有生成
setTimeout(function () {
$("#payFeeResult").modal({
backdrop: "static", //点击空白处不关闭对话框
show: true
});
}, 2000);
vc.emit('batchPayFeeOrder', 'loadBatchFees', {});
},
_printAndBack: function (_merge) {
$('#payFeeResult').modal("hide");
window.open($that.batchPayConfirmInfo.printUrl + "?detailIds=" + $that.batchPayConfirmInfo.detailIds + "&merge=" + _merge)
},
_back: function () {
$('#payFeeResult').modal("hide");
vc.getBack();
},
_listFeePrintPages: function (_page, _rows) {
let param = {
params: {
page: 1,
row: 1,
state: 'T',
communityId: vc.getCurrentCommunity().communityId
}
};
//发送get请求
vc.http.apiGet('/feePrintPage.listFeePrintPage',
param,
function (json, res) {
let _json = JSON.parse(json);
let feePrintPages = _json.data;
if (feePrintPages && feePrintPages.length > 0) {
$that.batchPayConfirmInfo.printUrl = feePrintPages[0].url;
}
},
function (errInfo, error) {
console.log('请求失败处理');
}
);
},
_resetBatchPayConfirm: function () {
let _primeRates = $that.batchPayConfirmInfo.primeRates;
let _printUrl = $that.batchPayConfirmInfo.printUrl;
$that.batchPayConfirmInfo = {
payType: '',
fees: [],
primeRate: '',
primeRates: _primeRates,
payerObjName: '',
orderId: '',
paymentPoolId: '',
authCode: '',
feePrices: '',
detailIds: '',
printUrl: _printUrl,
accountAmount: '',
acctId: ''
}
},
_createAba() {
// 假设这些变量已定义
const data = [
// {name: $that.ABANeedData.ownerPhone, quantity: 1, price: 1},
// {name: $that.payFeeOrderInfo.communityId, quantity: 0, price: 0},
// {name: $that.payFeeOrderInfo.payerObjName, quantity: 0, price: 0},
// {name: $that.ABANeedData.ownerId, quantity: 0, price: 0}
];
// $that.ABANeedData.selectPayFeeIds=
// $that.ABANeedData.accountAmount=$that.batchPayFeeOrderInfo.accountAmount;
// $that.ABANeedData.feePrices=$that.batchPayFeeOrderInfo.feePrices;
// console.log( $that.ABANeedData)
// console.log( $that.batchPayFeeOrderInfo)
const custom = $that.convertFeeIdsList($that.batchPayFeeOrderInfo.selectPayFeeIds)
console.log(custom)
// 先序列化为JSON字符串
const jsonStr = JSON.stringify(data);
const customStr = JSON.stringify(custom);
// 再进行Base64编码
const base64Str = btoa(unescape(encodeURIComponent(jsonStr)));
const customBase64Str = btoa(unescape(encodeURIComponent(customStr)));
console.log(base64Str);
// 构建第二个请求的参数此时ABANeedData已准备好
const payParams = {
amount: $that.batchPayFeeOrderInfo.feePrices,
shipping: "",
itemsJson: "",
firstname: $that.batchPayFeeOrderInfo.payerObjNames[0],
lastname: "",
email: "",
phone: $that.batchPayFeeOrderInfo.communityId,
type: "purchase",
paymentOption: "abapay_khqr",
currency: "USD",
returnParams: "",
googlePayToken: "",
customFields: customBase64Str
};
console.log(payParams);
const config = {
params: payParams // 关键:参数需要放在 params 属性中
};
// 发送第二个请求
vc.http.apiGet(
'/acct.abaPayCreate', // URL
config, // 配置对象,包含 params 属性
function (json, res) { // 成功回调
let response = JSON.parse(json);
console.log('请求成功', response);
$that.aba_pay_status=false
// 处理成功逻辑将qrImage赋值给目标变量
$that.ABAQRCode = response.qrImage;
// vc.emit('payFeeOrderConfirm', 'openConfirm', $that.payFeeOrderInfo);
// todo 启动定时查询任务
console.log(response)
console.log(response.status)
$that.isLoadData = true
console.log("isLoadData赋值为 true")
// 启动定时查询3分钟超时
// 第一次先查 queryLifetime
$that._getABAPayQueryLifetime(response.status.tran_id, function (trainId, duration) {
// 拿到查询时长后再启动定时轮询
$that.trainId = trainId;
$that._startABAPayPolling(trainId, duration);
});
},
function (errInfo, error) { // 错误回调
console.error('请求失败:', errInfo);
// 处理错误逻辑,例如:
// vc.toast('支付请求失败,请稍后重试');
}
);
},
/**
* 查询 ABA 支付状态允许的查询时长(带 queryLifetime
* @param {String} trainId - 支付交易 ID
* @param {Function} callback - 回调函数,返回 (trainId, duration),单位毫秒
*/
_getABAPayQueryLifetime: function (trainId, callback) {
if (!trainId) {
console.error("trainId 不能为空");
return;
}
vc.http.apiGet(
'/acct.abaPayStatus',
{params: {trainId: trainId, queryLifetime: true}},
function (json, res) {
try {
let result = JSON.parse(json);
console.log("首次查询结果:", result);
if (result && result) {
let duration = parseInt(result) * 60 * 1000; // 分钟转毫秒
console.log("允许查询时长(毫秒):", duration);
console.log("允许查询时长(分钟", result);
if (callback) {
callback(trainId, duration);
}
} else {
console.warn("未返回 queryLifetime使用默认 3 分钟");
if (callback) {
callback(trainId, 3 * 60 * 1000);
}
}
} catch (e) {
console.error("解析 queryLifetime 响应失败:", e);
if (callback) {
callback(trainId, 3 * 60 * 1000);
}
}
},
function (errInfo, error) {
console.error("请求失败:", errInfo);
if (callback) {
callback(trainId, 3 * 60 * 1000);
}
}
);
},
/**
* 启动定时查询 ABA 支付状态
* @param {String} trainId - 支付交易 ID
* @param {Number} duration - 查询总时长(毫秒),默认 3 分钟
* @param {Number} interval - 查询间隔(毫秒),默认 3 秒
*/
_startABAPayPolling: function (trainId, duration = 3 * 60 * 1000, interval = 3000) {
$that.batchPayConfirmInfo.thirdPayId = trainId;
// 页面中间消息提示
function showMessage(message, duration = 20000) {
let msgBox = document.createElement("div");
msgBox.innerText = message;
Object.assign(msgBox.style, {
position: "fixed",
top: "50%",
left: "50%",
transform: "translate(-50%, -50%)",
background: "rgba(0,0,0,0.8)",
color: "#fff",
padding: "15px 25px",
borderRadius: "10px",
fontSize: "16px",
textAlign: "center",
zIndex: 9999,
opacity: "0",
transition: "opacity 0.5s"
});
document.body.appendChild(msgBox);
setTimeout(() => {
msgBox.style.opacity = "1";
}, 50);
setTimeout(() => {
msgBox.style.opacity = "0";
setTimeout(() => {
if (msgBox && msgBox.parentNode) {
msgBox.parentNode.removeChild(msgBox);
}
}, 500);
}, duration);
}
if (!trainId) {
console.error("trainId 不能为空");
return;
}
let startTime = new Date().getTime();
// 保存定时器 id方便后续清理
let pollingTimer = setInterval(() => {
let now = new Date().getTime();
// 超时判断
if (now - startTime > duration) {
clearInterval(pollingTimer);
console.warn("支付状态查询超时,未完成支付");
return;
}
// 请求支付状态
vc.http.apiGet(
'/acct.abaPayStatus',
{params: {trainId: trainId}},
function (json, res) {
try {
let result = JSON.parse(json);
console.log("支付状态查询结果:", result);
// 这里假设接口直接返回 bool 值 { success: true/false }
if (result === true || result.success === true) {
console.log("支付成功 ✅,停止轮询");
$that.aba_pay_status= true
clearInterval(pollingTimer);
// 其他页面中调用_payFee方法
// 可以传递参数,也可以不传递
// vc.emit('payFeeOrderConfirm', 'callPayFee', {});
$that._doPayFee()
// 页面提示 20 秒
showMessage("Payment succeeded ✅ order form " + trainId + " Completed", 5000);
// 可以在这里发事件通知
vc.emit('payFeeOrder', 'ABAPaySuccess', {trainId: trainId});
}
} catch (e) {
console.error("解析支付状态响应失败:", e);
}
},
function (errInfo, error) {
console.error("支付状态请求失败:", errInfo);
// 请求失败也不中断,继续下次轮询
}
);
}, interval);
$that.pollingTimerId = pollingTimer;
},
convertFeeIdsList: function (feeIdsList) {
const keyValueMap = {};
if (Array.isArray(feeIdsList)) {
feeIdsList.forEach((value, index) => {
const key = "f" + (index + 1);
keyValueMap[key] = value;
});
}
return keyValueMap;
},
}
});
})(window.vc);