Files
shencaisuan/public/js/fufei-3dyjs-publish.js
T

969 lines
31 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.
const $ = layui.$;
// 全局变量
let gmjldata = []; // 转换后的扁平数组
let originalData = []; // 原始树形数据
let qishuok = {}; // 期号数据
let selectedLotteryPath = [];
let selectedLotteryIds = [];
let currentIssue = ""; // 当前期号
let currentPayPublishOptions = null;
let currentPayPicker = null;
let isSubmittingPayArticle = false;
let selections = [];
let stepsConfig = [];
const REQUIRED_DAILY_FREE_ARTICLES = 2;
// 页面加载完成后获取首页信息
layui.$(document).ready(function () {
CommonUtil.loadPageConfig({ ads: false, links: false });
checkPaidPublishPermission().then(function (result) {
if (!result.canPaid) {
layui.layer.alert(
result.reason || "暂无付费文章发布权限。",
{
title: "暂无权限",
},
function () {
window.location.href = "fabumianfeiwenzhang.html";
},
);
return;
}
loadLotteryData();
});
});
// 判断布尔字段,兼容后端可能返回的 1/true/"true"。
function isTruthy(value) {
return (
value === true ||
value === 1 ||
value === "1" ||
String(value).toLowerCase() === "true"
);
}
function padDatePart(value) {
return String(value).padStart(2, "0");
}
function formatLocalDate(date) {
return (
date.getFullYear() +
"-" +
padDatePart(date.getMonth() + 1) +
"-" +
padDatePart(date.getDate())
);
}
function getArticleDateText(value) {
if (!value) return "";
if (typeof value === "number") {
const numericDate = new Date(value);
return isNaN(numericDate.getTime())
? ""
: formatLocalDate(numericDate);
}
const text = String(value).trim();
const match = text.match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})/);
if (match) {
return (
match[1] + "-" + padDatePart(match[2]) + "-" + padDatePart(match[3])
);
}
const parsedDate = new Date(text.replace(/-/g, "/"));
return isNaN(parsedDate.getTime()) ? "" : formatLocalDate(parsedDate);
}
function isPublishedFreeArticle(item) {
if (!item) return false;
const statusText = String(
item.statusText ||
item.auditStatusText ||
item.publishStatusText ||
item.stateText ||
"",
).toLowerCase();
if (/已发布|审核通过|通过|published|approved|pass/.test(statusText)) {
return true;
}
const status =
item.status != null
? item.status
: item.auditStatus != null
? item.auditStatus
: item.publishStatus;
return status === true || status === 1 || status === "1";
}
function getTodayPublishedFreeCount(rows) {
const today = formatLocalDate(new Date());
return ApiClient.asArray(rows).filter(function (item) {
const articleDate = getArticleDateText(
item.createTime ||
item.create_time ||
item.publishTime ||
item.publish_time ||
item.auditTime ||
item.audit_time ||
item.updateTime ||
item.update_time ||
item.createdAt,
);
return articleDate === today && isPublishedFreeArticle(item);
}).length;
}
function loadTodayPublishedFreeCount() {
return ApiClient.get(ApiClient.API.mineFreeArticleList, {
pageNum: 1,
pageSize: 100,
})
.then(function (res) {
if (!ApiClient.isSuccess(res)) return 0;
const data = res.data || res;
const rows = ApiClient.asArray(
data.rows || data.records || data.list || data.data || data,
);
return getTodayPublishedFreeCount(rows);
})
.catch(function () {
return 0;
});
}
// 付费文章发布权限:专家身份 + 当天 2 篇审核通过/已发布的免费文章。
function checkPaidPublishPermission() {
return ApiClient.get(ApiClient.API.mineSummary)
.then(function (res) {
if (!ApiClient.isSuccess(res) || !res.data) {
return { canPaid: false, reason: "暂时无法获取发布权限。" };
}
const status = String(
res.data.expertStatus || res.data.expert_status || "",
).toLowerCase();
const isRegularExpert =
isTruthy(res.data.is_regular_expert) ||
isTruthy(res.data.isRegularExpert) ||
isTruthy(res.data.regularExpert) ||
/正式|regular|formal/.test(status);
const hasExpertIdentity =
isTruthy(res.data.is_expert) ||
isTruthy(res.data.isExpert) ||
isTruthy(res.data.expert) ||
isRegularExpert ||
/实习|intern|trial|正式|regular|formal/.test(status);
if (!hasExpertIdentity || !isRegularExpert) {
return { canPaid: false, reason: "正式专家才能发布付费文章。" };
}
return loadTodayPublishedFreeCount().then(function (count) {
return {
canPaid: count >= REQUIRED_DAILY_FREE_ARTICLES,
reason:
count >= REQUIRED_DAILY_FREE_ARTICLES
? ""
: "今天需先发布2篇审核通过的免费文章后,才能发布付费文章(当前" +
count +
"篇)。",
};
});
})
.catch(function () {
return { canPaid: false, reason: "暂时无法获取发布权限。" };
});
}
// 加载彩种数据
async function loadLotteryData() {
try {
console.log("开始加载彩种数据...");
const response = await ApiClient.get(ApiClient.API.homeNav);
console.log("API返回的原始数据:", response);
if (
response.code === 0 &&
response.data &&
Array.isArray(response.data)
) {
originalData = await preparePayPublishMenuTree(response.data);
// 1. 转换树形结构为适合selectY2的扁平数组
gmjldata = convertTreeToFlatArray(originalData);
console.log("转换后的扁平数组:", gmjldata);
// 2. 初始化期号数据
initIssueData(originalData);
// 3. 初始化LayUI组件
initLayuiComponents();
} else {
throw new Error(response.msg || "获取数据失败");
}
} catch (error) {
console.error("加载彩种数据失败:", error);
layui.layer.msg("加载彩种数据失败: " + error.message, { icon: 2 });
}
}
// 转换树形结构为扁平数组
function convertTreeToFlatArray(treeData) {
const excludeNames = [
"首页",
"专家推荐",
"断组",
"杀组合",
"断组1",
"杀组合1",
"断组2",
"杀组合2",
"组三",
"组六",
];
let flatArray = [];
// 递归遍历树形数据
function traverse(node, parentId = 0) {
const nodeId = getMenuNodeId(node);
const nodeName = getMenuNodeName(node);
const children = getMenuNodeChildren(node);
// 检查当前节点名称是否在排除列表中
if (!nodeId || !nodeName || excludeNames.includes(nodeName)) {
return; // 跳过这个节点及其子节点
}
// 添加当前节点到扁平数组
flatArray.push({
id: nodeId,
pid: parentId,
name: nodeName,
code: node.code || node.lotteryCode || "",
});
// 如果有子节点,递归处理
if (children && Array.isArray(children)) {
children.forEach((child) => {
traverse(child, nodeId);
});
}
}
// 遍历整个树
if (Array.isArray(treeData)) {
treeData.forEach((rootNode) => {
traverse(rootNode, 0);
});
}
return flatArray;
}
function getMenuNodeId(node) {
return node && (node.id || node.menuId || node.value);
}
function getMenuNodeName(node) {
return String(
(node && (node.name || node.menuName || node.title || node.label)) ||
"",
).trim();
}
function getMenuNodeChildren(node) {
return ApiClient.asArray(
node && (node.children || node.childList || node.list),
);
}
function isFixedPublishNav(node) {
const name = getMenuNodeName(node);
const path = String(
(node && (node.path || node.url || node.href)) || "",
).trim();
return (
["首页", "专家推荐"].includes(name) ||
/(^|\/)(index|zhuanjia)\.html/i.test(path)
);
}
function normalizeMenuChildren(node, children) {
node.children = ApiClient.asArray(children);
return node.children;
}
function loadMenuChildrenForNode(node, depth) {
if (!node || depth <= 0) {
return Promise.resolve(node);
}
const existingChildren = getMenuNodeChildren(node);
const menuId = getMenuNodeId(node);
const childrenPromise =
existingChildren.length || !menuId
? Promise.resolve(existingChildren)
: ApiClient.get(ApiClient.API.menuChildren(menuId))
.then(function (res) {
return ApiClient.asArray(
res.data || res.rows || res.records || res.list || res,
);
})
.catch(function () {
return [];
});
return childrenPromise.then(function (children) {
normalizeMenuChildren(node, children);
return Promise.all(
node.children.map(function (child) {
return loadMenuChildrenForNode(child, depth - 1);
}),
).then(function () {
return node;
});
});
}
function preparePayPublishMenuTree(navList) {
const lotteryList = ApiClient.asArray(navList).filter(function (item) {
return !isFixedPublishNav(item);
});
return Promise.all(
lotteryList.map(function (item) {
return loadMenuChildrenForNode(item, 2);
}),
).then(function () {
return lotteryList;
});
}
// 初始化期号数据
function initIssueData(data) {
// 从原始数据中提取期号信息
data.forEach((lottery) => {
const lotteryId = getMenuNodeId(lottery);
if (lottery.lotteryResult && lottery.lotteryResult.expect) {
qishuok[lotteryId] = lottery.lotteryResult.expect;
} else if (lottery.expect || lottery.issue) {
qishuok[lotteryId] = lottery.expect || lottery.issue;
}
});
console.log("期号数据:", qishuok);
}
function formatPayMoney(value) {
return Number(value || 0).toFixed(2) + "元";
}
function updatePayTitleCount() {
const value = $("#payTitle").val() || "";
$("#payTitleCount").text(value.length + "/100");
}
$(document).on("input", "#payTitle", updatePayTitleCount);
function initNumberSelector(config) {
stepsConfig = Array.isArray(config) ? config : [];
selections = Array(stepsConfig.length).fill(null);
updateNumberSelectorUI();
}
function initNumberPool() {
const numberPool = document.getElementById("numberPool");
if (!numberPool) {
return;
}
numberPool.innerHTML = "";
if (!stepsConfig.length) {
return;
}
stepsConfig.forEach(function (step, stepIndex) {
const stepContainer = document.createElement("div");
stepContainer.className = "mianfeiThreeTextRedballBox";
stepContainer.innerHTML = `
<div class="RedballText" data-class="${step.class}" data-classok="${step.classok}">
${step.name}(选择 ${step.requiredCount} 个)
</div>
<div class="RedballBox" id="step-${stepIndex}"></div>
`;
numberPool.appendChild(stepContainer);
renderStepNumbers(step, stepIndex);
});
}
function renderStepNumbers(step, stepIndex) {
const stepNumberPool = document.getElementById("step-" + stepIndex);
if (!stepNumberPool || !Array.isArray(step.numberRange)) {
return;
}
step.numberRange.forEach(function (number) {
const text =
number !== "" && !isNaN(Number(number)) && Number(number) < 10
? "0" + Number(number)
: String(number);
const numberElement = document.createElement("div");
numberElement.className = step.class;
numberElement.textContent = text;
numberElement.dataset.number = text;
numberElement.dataset.step = stepIndex;
const currentSelection = selections[stepIndex] || { numbers: [] };
if (
currentSelection.numbers.includes(normalizeSelectedNumber(text))
) {
numberElement.classList.add(step.classok);
}
numberElement.addEventListener("click", function () {
toggleNumberSelection(numberElement, step.classok);
});
stepNumberPool.appendChild(numberElement);
});
}
function normalizeSelectedNumber(value) {
const text = String(value);
return text !== "" && !isNaN(Number(text)) ? Number(text) : text;
}
function toggleNumberSelection(numberElement, selectedClass) {
const stepIndex = Number(numberElement.dataset.step);
const number = normalizeSelectedNumber(numberElement.dataset.number);
const step = stepsConfig[stepIndex];
const currentSelection = selections[stepIndex] || { numbers: [] };
if (!step) {
return;
}
if (numberElement.classList.contains(selectedClass)) {
numberElement.classList.remove(selectedClass);
currentSelection.numbers = currentSelection.numbers.filter(
function (item) {
return item !== number;
},
);
} else {
if (!step.allowMultiple) {
clearStepSelection(stepIndex, selectedClass);
currentSelection.numbers = [];
}
if (
step.allowMultiple &&
currentSelection.numbers.length >= step.requiredCount
) {
showNumberMessage(
"本步骤最多只能选择 " + step.requiredCount + " 个数字",
);
return;
}
numberElement.classList.add(selectedClass);
currentSelection.numbers.push(number);
}
selections[stepIndex] = currentSelection;
showFinalResult();
}
function clearStepSelection(stepIndex, selectedClass) {
document
.querySelectorAll('[data-step="' + stepIndex + '"]')
.forEach(function (element) {
element.classList.remove(selectedClass);
});
}
function showFinalResult() {
xzok(selections);
}
function resetNumberSelector() {
const doReset = function () {
selections = Array(stepsConfig.length).fill(null);
updateNumberSelectorUI();
};
if (layui.layer) {
layui.layer.confirm(
"确定要重置所有选择吗?",
{ icon: 3, title: "提示" },
function (index) {
doReset();
layui.layer.close(index);
},
);
return;
}
doReset();
}
function updateNumberSelectorUI() {
initNumberPool();
showFinalResult();
}
function showNumberMessage(message) {
if (layui.layer) {
layui.layer.msg(message);
return;
}
console.warn(message);
}
$(document).on("click", "#resetBtn", resetNumberSelector);
function renderPayPublishOptions(data) {
currentPayPublishOptions = data || {};
currentPayPicker = currentPayPublishOptions.picker || null;
const issue = currentPayPublishOptions.issue || $("#qi").val() || "";
const code = currentPayPublishOptions.code || "";
$("#qi").val(issue);
$("#qihao").text(issue || "--");
$("#expectInput").val(issue || "");
$("#expectText").text(issue || "选择方案后自动获取");
$("#payCode").val(code);
$("#priceInput").val(currentPayPublishOptions.priceCount1 || 0);
$("#priceText").text(currentPayPublishOptions.priceCount1 || 0);
const priceLines = [
"价格:" +
formatPayMoney(currentPayPublishOptions.priceCount1) +
",服务费:" +
formatPayMoney(currentPayPublishOptions.priceCount1Cost),
];
if (
currentPayPublishOptions.pointDeduction != null ||
currentPayPublishOptions.pointMaxDeduction != null
) {
priceLines.push(
"积分抵扣:" +
(currentPayPublishOptions.pointDeduction || 0) +
",最多:" +
formatPayMoney(currentPayPublishOptions.pointMaxDeduction),
);
}
$("#payPriceInfo").html(priceLines.join("<br />"));
applyPayPickerConfig(currentPayPicker);
}
function normalizePayBallValue(value) {
const text = String(value);
return text !== "" && !isNaN(Number(text)) ? Number(text) : text;
}
function applyPayPickerConfig(picker) {
const groups = Array.isArray(picker && picker.groups)
? picker.groups
: [];
if (!groups.length || typeof initNumberSelector !== "function") {
return;
}
const apiStepsConfig = groups.map(function (group) {
const min = Number(group.minSelect || 0);
const max = Number(group.maxSelect || min || 1);
return {
name: group.name || group.key || "号码选择",
numberRange: ApiClient.asArray(group.balls).map(
normalizePayBallValue,
),
allowMultiple: max > 1,
class: group.color === "blue" ? "Blueball" : "Redball",
classok: group.color === "blue" ? "BlueSelected" : "selected",
requiredCount: max,
minSelect: min,
maxSelect: max,
joiner: group.joiner,
key: group.key,
sortSelected: group.sortSelected,
};
});
initNumberSelector(apiStepsConfig);
}
function validatePayPickerSelection(currentSelections) {
if (!currentPayPicker || !Array.isArray(currentPayPicker.groups)) {
return true;
}
for (let index = 0; index < currentPayPicker.groups.length; index++) {
const group = currentPayPicker.groups[index];
const selected =
currentSelections[index] &&
Array.isArray(currentSelections[index].numbers)
? currentSelections[index].numbers
: [];
const min = Number(group.minSelect || 0);
const max = Number(group.maxSelect || min);
if (selected.length < min || selected.length > max) {
layer.alert(
(group.name || "当前分组") +
"需要选择" +
(min === max ? min : min + "-" + max) +
"个",
);
return false;
}
}
return true;
}
function buildPayPredictedCode(currentSelections) {
if (!currentPayPicker || !Array.isArray(currentPayPicker.groups)) {
return $("#vv").val();
}
const groups = currentPayPicker.groups;
const defaultJoiner = currentPayPicker.joiner || ",";
const groupJoiner = currentPayPicker.groupJoiner || "+";
const groupTexts = groups.map(function (group, index) {
let values =
currentSelections[index] &&
Array.isArray(currentSelections[index].numbers)
? currentSelections[index].numbers.slice()
: [];
if (group.sortSelected) {
values.sort(function (a, b) {
return Number(a) - Number(b);
});
}
return values.join(group.joiner || defaultJoiner);
});
if (currentPayPicker.mode === "positions") {
if (groupJoiner === "-") {
return groupTexts.filter(Boolean).join("-");
}
const lastGroup = groups[groups.length - 1];
if (
lastGroup &&
lastGroup.key === "special" &&
groupTexts.length > 1
) {
const front = groupTexts
.slice(0, -1)
.filter(Boolean)
.join(defaultJoiner);
const last = groupTexts[groupTexts.length - 1];
return [front, last].filter(Boolean).join(groupJoiner);
}
return groupTexts.filter(Boolean).join(defaultJoiner);
}
return groupTexts.filter(Boolean).join(groupJoiner);
}
function loadPayPublishOptions(menuId) {
currentPayPublishOptions = null;
currentPayPicker = null;
$("#payMenuId").val(menuId || "");
$("#payCode").val("");
$("#qi").val("");
$("#qihao").text("正在生成当前期号...");
$("#expectInput").val("");
$("#expectText").text("正在生成当前期号...");
$("#priceInput").val("");
$("#priceText").text(0);
$("#payPriceInfo").text("正在加载价格说明...");
if (!menuId) {
$("#qihao").text("请选择类型后自动生成");
$("#expectText").text("选择方案后自动获取");
$("#payPriceInfo").text("请选择方案后加载价格说明");
return Promise.resolve(null);
}
return ApiClient.get(ApiClient.API.payArticlePublishOptions(menuId))
.then(function (res) {
if (!ApiClient.isSuccess(res)) {
throw new Error(res.msg || "发布前置信息加载失败");
}
renderPayPublishOptions(res.data || {});
return res.data || {};
})
.catch(function (error) {
currentPayPublishOptions = null;
currentPayPicker = null;
$("#qi").val("");
$("#qihao").text("当前期号生成失败");
$("#expectInput").val("");
$("#expectText").text("选择方案后自动获取");
$("#priceInput").val("");
$("#priceText").text(0);
$("#payPriceInfo").text("发布前置信息加载失败");
$(".mianfeiThreeText").hide();
$(".mianfeiThreeButBox").hide();
layui.layer.msg(error.message || "发布前置信息加载失败", {
icon: 2,
});
throw error;
});
}
//console.log(qishuok);
function clearLotterySelection() {
selectedLotteryPath = [];
selectedLotteryIds = [];
currentPayPublishOptions = null;
currentPayPicker = null;
$("#a1,#a2,#a3,#qi,#vv,#payMenuId,#payCode").val("");
$("#payTitle").val("");
$("#payTitleCount").text("0/100");
$("#expectInput").val("");
$("#priceInput").val("");
$("#priceText").text(0);
$("#expectText").text("选择方案后自动获取");
$("#qihao").text("请选择方案");
$("#payPriceInfo").text("请选择方案后加载价格说明");
$("#gmjl").closest(".selectY-box").removeClass("is-selected");
$(".mianfeiThreeText").hide();
$(".mianfeiThreeButBox").hide();
initNumberSelector([]);
}
function initLayuiComponents() {
layui.use(["form", "selectY2", "notice"], function () {
var form = layui.form,
notice = layui.notice,
layer = layui.layer,
selectY2 = layui.selectY2,
$ = layui.$;
const $mianfeiThreeText = $(".mianfeiThreeText");
const $mianfeiThreeButBox = $(".mianfeiThreeButBox");
let xzid = 0;
let ob = selectY2({
elem: "#gmjl",
data: gmjldata,
//url为ajax 获取json数据,当url属性有值时,不提取data属性值
//url:'https://cityApi.html',
placeholder: "请选择方案",
disabledTips: "请选择",
allowClear: true,
clearText: "×",
clear: clearLotterySelection,
success: function (e) {
console.log(e.data);
console.log(e.ids);
console.log(qishuok[e.ids[0]], "zuijinqishu");
//
$("#qi").val("");
$("#qihao").text("正在生成当前期号...");
selectedLotteryPath = e.data || [];
selectedLotteryIds = e.ids || [];
$("#gmjl").closest(".selectY-box").addClass("is-selected");
$("#a1").val(selectedLotteryIds[0] || "");
$("#a2").val(selectedLotteryIds[1] || "");
$("#a3").val(selectedLotteryIds[selectedLotteryIds.length - 1] || "");
xzid = selectedLotteryIds[selectedLotteryIds.length - 1];
$("#payMenuId").val(xzid);
var ttt = e.data;
$mianfeiThreeText.hide();
$mianfeiThreeButBox.hide();
initNumberSelector([]);
loadPayPublishOptions(xzid)
.then(function (options) {
const groups =
options &&
options.picker &&
Array.isArray(options.picker.groups)
? options.picker.groups
: [];
if (!groups.length) {
currentPayPublishOptions = null;
currentPayPicker = null;
layui.layer.msg("后端未返回选号配置,请检查发布前置接口", {
icon: 2,
});
return;
}
$mianfeiThreeText.show();
$mianfeiThreeButBox.show();
})
.catch(function () {});
},
});
});
}
function chk() {
if (isSubmittingPayArticle) {
return false;
}
const menuId = layui.$("#payMenuId").val();
const qi = layui.$("#qi").val();
const title = layui.$("#payTitle").val().trim();
const code = layui.$("#payCode").val().trim() || "-";
if (!menuId) {
layer.alert("请选择发布方案");
return false;
}
if (!currentPayPublishOptions) {
layer.alert("发布前置信息还没有加载完成,请重新选择方案");
return false;
}
if (
!currentPayPicker ||
!Array.isArray(currentPayPicker.groups) ||
!currentPayPicker.groups.length
) {
layer.alert("后端未返回选号配置,请重新选择方案");
return false;
}
if (!title) {
layer.alert("请输入文章标题");
return false;
}
if (!qi) {
layer.alert("当前期号不能为空");
return false;
}
if (!validatePayPickerSelection(selections)) {
return false;
}
const vv = buildPayPredictedCode(selections);
layui.$("#vv").val(vv);
if (!vv) {
layer.alert("请选择号码");
return false;
}
isSubmittingPayArticle = true;
layui.$(".mianfeiThreeBut").text("发布中...").prop("disabled", true);
checkPaidPublishPermission()
.then(function (permission) {
if (!permission.canPaid) {
throw new Error(permission.reason || "暂无付费文章发布权限。");
}
return ApiClient.post(ApiClient.API.payArticlePublish, {
parentId: menuId,
code: code,
title: title,
predictedCode: vv,
issue: Number(qi),
});
})
.then(function (res) {
if (!ApiClient.isSuccess(res)) {
throw new Error(res.msg || "发布失败");
}
layer.msg("发布成功", { icon: 1, time: 1200 }, function () {
window.location.href = "usercenter.html";
});
})
.catch(function (error) {
layer.msg(error.message || "发布失败", { icon: 2 });
})
.finally(function () {
isSubmittingPayArticle = false;
layui.$(".mianfeiThreeBut").text("发布方案").prop("disabled", false);
});
return false;
}
function formatSelectedBallText(value) {
const text = String(value);
return text !== "" && !isNaN(Number(text)) && Number(text) < 10
? "0" + Number(text)
: text;
}
function isSelectionComplete(currentSelections) {
if (!stepsConfig.length) {
return false;
}
return stepsConfig.every(function (step, index) {
const selected =
currentSelections[index] &&
Array.isArray(currentSelections[index].numbers)
? currentSelections[index].numbers
: [];
const min = Number(step.minSelect || step.requiredCount || 0);
const max = Number(step.maxSelect || step.requiredCount || min);
return selected.length >= min && selected.length <= max;
});
}
function xzok(selections) {
const $jieguo = $("#jieguo");
const selectedGroups = [];
selections.forEach(function (selection, index) {
const step = stepsConfig[index] || {};
const numbers =
selection && Array.isArray(selection.numbers)
? selection.numbers
: [];
if (!numbers.length) {
return;
}
const selectedClass = step.classok || "selected";
const balls = numbers
.map(function (number) {
return (
'<div class="ball ball' +
index +
" " +
selectedClass +
'">' +
CommonUtil.escapeHtml(formatSelectedBallText(number)) +
"</div>"
);
})
.join("");
selectedGroups.push(
'<div class="FormBox ballok' + index + '">' + balls + "</div>",
);
});
if (selectedGroups.length) {
$jieguo.html(
'<div class="FormBox">' +
selectedGroups.join('<span class="selection-separator">|</span>') +
"</div>",
);
} else {
$jieguo.text("暂无号码");
}
layui.$("#vv").val(buildPayPredictedCode(selections));
}