搜索函数加多选

搜索函数加多选
This commit is contained in:
liozvqe 2025-07-05 14:38:04 +08:00
parent 7fcccae676
commit f7b2c69435
2 changed files with 294 additions and 178 deletions

View File

@ -1,49 +1,37 @@
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------搜索功能开始 //----------------------------------------------------------------------------------------------------------------------------------------------------------------------------搜索功能开始
var searchDetailNum = 1; // 搜索明细序号设置
var basic_info = {//搜索字段初始化
all_search_field_id: 'field268341',//模糊搜索字段此字段搜索search_obj里的detail_field_id对应字段内容的显示值均为
search_obj: [
{
detail_field_id: 'field235347',//费用名称
search_field_id: 'field268342',
control_field_id: undefined,
type: 'browser' // 浏览框
},
{
detail_field_id: 'field237848',//事务类型
search_field_id: 'field268345',
control_field_id: undefined,
type: 'browser' // 浏览框
},
{
detail_field_id: 'field238884',//费用类型
search_field_id: 'field268346',
control_field_id: undefined,
type: 'select' // 选择框
}
]
}
/*all_search_field_id id search_obj /*all_search_field_id id search_obj
search_obj 中的 detail_field_id 为搜索对象在明细中的字段id search_field_id 为搜索对象的搜索字段id control_field_id 为控制搜索字段可选范围的字段id控制功能只针对浏览框 search_obj 中的 detail_field_id 为搜索对象在明细中的字段id search_field_id 为搜索对象的搜索字段id control_field_id 为控制搜索字段可选范围的字段id控制功能只针对浏览框
search_field_id control_field_id 均为主表字段均允许值为 undefined search_field_id control_field_id 均为主表字段均允许值为 undefined
search_field_id undefined 表示该搜索对象仅为模糊搜索的对象无需精准搜索 search_field_id undefined 表示该搜索对象仅为模糊搜索的对象无需精准搜索
control_field_id undefined 表示该搜索对象的搜索字段可选范围不受明细已有值的影响 control_field_id undefined 表示该搜索对象的搜索字段可选范围不受明细已有值的影响
当type: 'displayValue' // 指定获取显示值这个代表是浏览框或者下拉框type: 'rawValue' // 指定获取值,这个代表文本,显示值和实际值一致 当type: 'browser' // 指定获取显示值这个代表是浏览框或者下拉框type: 'text' // 指定获取值,这个代表文本,显示值和实际值一致type: 'select'选择框
***如需控制浏览框搜索字段的可选范围需在泛微对该浏览框做相应的选择范围设置一般为数据id属于 control_field_id 字段值的范围 ***如需控制浏览框搜索字段的可选范围需在泛微对该浏览框做相应的选择范围设置一般为数据id属于 control_field_id 字段值的范围
***当前代码不支持对明细多选字段的搜索功能 ***当前代码不支持对明细多选字段的搜索功能
*/ */
var searchDetailNum = 1; // 搜索明细序号设置
var basic_info = {//搜索字段初始化
all_search_field_id: 'field200841',//模糊搜索字段此字段搜索search_obj里的detail_field_id对应字段内容的显示值均为
search_obj: [
{
detail_field_id: 'field198856',//证件号码
search_field_id: 'field200844',
control_field_id: undefined,
type: 'rawValue' // 文本显示和实际值一致
},
{
detail_field_id: 'field199842',//姓名
search_field_id: 'field205846',
control_field_id: 'field200344',
type: 'displayValue' // 浏览框
},
{
detail_field_id: 'field201352',//身份标签
search_field_id: 'field200845',
control_field_id: undefined,
type: 'displayValue' // 浏览框
},
{
detail_field_id: 'field198858',//部门
search_field_id: 'field223429',
control_field_id: undefined,
type: 'displayValue' // 浏览框
},
{
detail_field_id: 'field198857',//机构
search_field_id: 'field223430',
control_field_id: undefined,
type: 'displayValue' // 浏览框
}
]
}
basic_info.search_obj.forEach(function (search) { basic_info.search_obj.forEach(function (search) {
if (search.search_field_id) { if (search.search_field_id) {
WfForm.changeFieldValue(search.search_field_id, { value: "" });//清空搜索字段 WfForm.changeFieldValue(search.search_field_id, { value: "" });//清空搜索字段
@ -51,11 +39,11 @@ basic_info.search_obj.forEach(function (search) {
}); });
WfForm.changeFieldValue(basic_info.all_search_field_id, { value: "" });//清空模糊搜索字段 WfForm.changeFieldValue(basic_info.all_search_field_id, { value: "" });//清空模糊搜索字段
WfForm.bindFieldChangeEvent(basic_info.all_search_field_id, function (obj, id, value) {//模糊搜索 WfForm.bindFieldChangeEvent(basic_info.all_search_field_id, function (obj, id, value) {//模糊搜索
detailSearch(basic_info.all_search_field_id, value); searchFunction(basic_info.all_search_field_id, value);
}); });
$(".wf-input-" + basic_info.all_search_field_id).keydown(function (event) {//模糊搜索 $(".wf-input-" + basic_info.all_search_field_id).keydown(function (event) {//模糊搜索
let value = event.target.value; let value = event.target.value;
detailSearch(basic_info.all_search_field_id, value); searchFunction(basic_info.all_search_field_id, value);
}); //搜索区间触发 }); //搜索区间触发
// 生成字段变化事件绑定字符串 // 生成字段变化事件绑定字符串
function getFieldChangeEventIds() { function getFieldChangeEventIds() {
@ -67,15 +55,11 @@ function getFieldChangeEventIds() {
WfForm.bindFieldChangeEvent( WfForm.bindFieldChangeEvent(
getFieldChangeEventIds(), // 动态生成的字段 ID 字符串 getFieldChangeEventIds(), // 动态生成的字段 ID 字符串
function (obj, id, value) { function (obj, id, value) {
detailSearch(id, value); searchFunction(id, value);
} }
); );
$(".wf-input-" + basic_info.search_obj[0].search_field_id).keydown(function (event) {//证件号码
let value = event.target.value;
detailSearch(basic_info.search_obj[0].search_field_id, value);
});
//明细搜索函数 //明细搜索函数
function detailSearch(fieldid, value) { function searchFunction(fieldid, value) {
Arrtmp = []; Arrtmp = [];
if (fieldid == basic_info.all_search_field_id) {//---------------------------------------------------------------------模糊搜索 if (fieldid == basic_info.all_search_field_id) {//---------------------------------------------------------------------模糊搜索
var search = {}; var search = {};
@ -88,10 +72,12 @@ function detailSearch(fieldid, value) {
let fieldId = field.detail_field_id + "_" + rowIndex; let fieldId = field.detail_field_id + "_" + rowIndex;
let fieldType = field.type; let fieldType = field.type;
let value; let value;
if (fieldType == 'rawValue') {//实际值和显示值一致,如文本框 if (fieldType == 'text') {//实际值和显示值一致,如文本框
value = WfForm.getFieldValue(fieldId); value = WfForm.getFieldValue(fieldId);
} else if (fieldType == 'displayValue') {//浏览框 } else if (fieldType == 'browser') {//浏览框
value = WfForm.getBrowserShowName(fieldId); value = WfForm.getBrowserShowName(fieldId);
} else if (fieldType == 'select') {//选择框
value = WfForm.getSelectShowName(fieldId);
} }
fieldValues.push(value); fieldValues.push(value);
} }
@ -163,13 +149,15 @@ function detailSearch(fieldid, value) {
if (field.detail_field_id) { if (field.detail_field_id) {
let searchField = searchValues[field.detail_field_id]; let searchField = searchValues[field.detail_field_id];
let detailValue = detail[field.detail_field_id].value; let detailValue = detail[field.detail_field_id].value;
if (searchField.type == 'rawValue') { if (searchField.type == 'text') {
// 部分匹配 // 支持模糊匹配
isMatch = isMatch && (!searchField.value || detailValue.includes(searchField.value)); isMatch = isMatch && (!searchField.value || detailValue.includes(searchField.value));
} else if (searchField.type == 'displayValue') { } else if (searchField.type == 'browser' || searchField.type == 'select') {
// 完整匹配,但处理多个逗号分隔的值 // 多选匹配支持交集
let searchValuesArray = searchField.value.split(',').map(v => v.trim()); let searchValuesArray = (searchField.value || "").split(',').map(v => v.trim()).filter(v => v);
isMatch = isMatch && (!searchField.value || searchValuesArray.includes(detailValue)); let detailValuesArray = (detailValue || "").split(',').map(v => v.trim()).filter(v => v);
let hasMatch = searchValuesArray.length === 0 || searchValuesArray.some(sv => detailValuesArray.includes(sv));
isMatch = isMatch && hasMatch;
} }
} }
}); });

128
汇总函数.js Normal file
View File

@ -0,0 +1,128 @@
let detNum = 1;
let isUpdating = false;
let detcompCodeFI = "field247341";//综合能力编码
let detexamScoreFI = "field247353";//考试得分
let detminScoreFI = "field247343";//最低分
let detmaxScoreFI = "field247344";//最高分
let ScoreFI = "field246848";//职级评定分数
WfForm.bindDetailFieldChangeEvent(detexamScoreFI, function (id, rowIndex, value) {//考评得分汇总
let rdname = WfForm.getFieldValue(rdnameFI);
let rowArr = WfForm.getDetailAllRowIndexStr("detail_" + detNum).split(",");
if (rowArr.length > 0 && rdname != "") {
if (!isUpdating) {//手动修改判断
updateScores(rowIndex);// 执行更新金额操作
}
}
});
//------------------------------------------------------------------------------------------------------------------------------汇总函数开始
function updateScores(rowIndex) {
if (isUpdating) return;
isUpdating = true;
let compCode = WfForm.getFieldValue(detcompCodeFI + "_" + rowIndex);
let scoreStr = WfForm.getFieldValue(detexamScoreFI + "_" + rowIndex);
let score = scoreStr != "" ? parseFloat(scoreStr) : null; // 保持未填写状态
let minScore = parseFloat(WfForm.getFieldValue(detminScoreFI + "_" + rowIndex)) || 0;
let maxScore = parseFloat(WfForm.getFieldValue(detmaxScoreFI + "_" + rowIndex)) || 0;
// **评分超范围检查**
if (score != null && (score < minScore || score > maxScore)) {
WfForm.showMessage(`评分必须在 ${minScore} - ${maxScore} 之间!`, 2, 3); //错误信息3s后消失
WfForm.changeFieldValue(detexamScoreFI + "_" + rowIndex, { value: "" });
}
// 第一步:形成初始数据
let rowArr = WfForm.getDetailAllRowIndexStr("detail_" + detNum).split(",");
let nodeMap = {}; // 用 "本级编码" 作为 key 存储节点数据
rowArr.forEach(rowIndex => {
let code = WfForm.getFieldValue(detcompCodeFI + "_" + rowIndex); // 本级编码
let value = WfForm.getFieldValue(detexamScoreFI + "_" + rowIndex); // 数值
nodeMap[code] = {
rowIndex,
code,
value: parseFloat(value) || 0, // 确保是数值
parentCode: null, // 暂时空
rootId: null // 暂时空
};
});
// 第二步为每个节点确定其直接上级编码parentCode
for (let code in nodeMap) {
let node = nodeMap[code]; // 当前节点对象
let candidate = code; // 从当前编码开始尝试向上找父级
// 尝试逐级截断后两位,查找是否存在合法父节点
while (candidate.length > 2) {
candidate = candidate.slice(0, -2); // 去掉末尾两位,尝试变成父级编码
if (nodeMap[candidate]) { // 如果该编码在 nodeMap 中存在,说明是合法父节点
node.parentCode = candidate; // 记录父级编码
break; // 找到后退出循环
}
}
}
// 第三步每个节点查询roorid
for (let code in nodeMap) {
let rootCode = code;
while (nodeMap[rootCode] && nodeMap[rootCode].parentCode) {
rootCode = nodeMap[rootCode].parentCode; // 向上找父节点
}
nodeMap[code].rootId = rootCode; // 给当前节点赋值根节点ID
}
// 第四步:以 rootId 分组,形成平铺结构
const groupedByRoot = {};
for (let code in nodeMap) {
const node = nodeMap[code];
if (!groupedByRoot[node.rootId]) {
groupedByRoot[node.rootId] = [];
}
groupedByRoot[node.rootId].push(node); // 平铺加入该 rootId 的分组
}
// console.log("按 rootId 分组的节点集合:", groupedByRoot);
//查询出受影响的rootid
let rootId = nodeMap[compCode].rootId;
let chain = getAffectedChain(groupedByRoot[rootId], compCode);//受影响的节点
// console.log("受影响的链路(修改前原始值):", chain.map(node => ({ ...node })));
sumDirectChildrenValue(groupedByRoot[rootId], chain);//更新受影响数值
updateDetailFormValues(chain, detexamScoreFI);//更新明细表数值
// 获取所有 rootId 对应的“根节点对象”
let rootNodes = Object.values(nodeMap).filter(node => node.code == node.rootId);
// 汇总根节点的得分
let totalTopScore = rootNodes.reduce((sum, node) => {
return sum + (parseFloat(node.value) || 0);
}, 0);
// 写入主表字段(如:总得分)
WfForm.changeFieldValue(ScoreFI, { value: totalTopScore });
isUpdating = false;
}
//------------------------------------------------------------------------------------------------------------------------------获取从指定节点 compCode 一直向上的链路,直到根节点,返回包含所有这些节点的数组
function getAffectedChain(nodes, compCode) {
const map = {}; // 初始化一个映射对象,用于存储 code -> 节点对象 的映射
// 遍历所有节点,将它们以 code 为键存入 map 中,方便后续快速查找父节点
nodes.forEach(node => {
map[node.code] = node;
});
const chain = []; // 用于存储从 compCode 到 root 的链路节点数组
let currentCode = compCode; // 当前处理的节点编码,初始为 compCode
// 当当前编码存在并且在映射中能找到对应节点时,一直向上查找 parentCode
while (currentCode && map[currentCode]) {
chain.push(map[currentCode]); // 将当前节点对象加入链路数组中
currentCode = map[currentCode].parentCode; // 更新当前编码为当前节点的 parentCode继续向上查找
}
return chain; // 返回从 compCode 到 root 的链路节点数组(顺序是从子到父)
}
//------------------------------------------------------------------------------------------------------------------------------汇总金额
function sumDirectChildrenValue(nodes, chain) {
// 遍历链路中从上级开始的节点(不包含第一个节点,即受影响的“当前节点”)
for (let i = 1; i < chain.length; i++) {
const node = chain[i];
// 找当前节点的直接子节点
const children = nodes.filter(n => n.parentCode == node.code);
// 汇总子节点的 value 值
const total = children.reduce((sum, child) => sum + (Number(child.value) || 0), 0);
// 更新当前节点的 value 字段
node.value = total;
}
}
//------------------------------------------------------------------------------------------------------------------------------修改明细的额函数
function updateDetailFormValues(chain, fieldPrefix) {
chain.forEach(node =>
WfForm.changeFieldValue(`${fieldPrefix}_${node.rowIndex}`, { value: String(node.value) })
);
}
//------------------------------------------------------------------------------------------------------------------------------汇总函数结束