ZhangQiangEcologyKit/明细搜索功能函数V1.js
liozvqe f7b2c69435 搜索函数加多选
搜索函数加多选
2025-07-05 14:38:04 +08:00

178 lines
11 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.

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------搜索功能开始
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 为搜索对象。
search_obj 中的 detail_field_id 为搜索对象在明细中的字段id search_field_id 为搜索对象的搜索字段id control_field_id 为控制搜索字段可选范围的字段id控制功能只针对浏览框
search_field_id 与 control_field_id 均为主表字段,均允许值为 undefined
当 search_field_id 为 undefined 时,表示该搜索对象仅为模糊搜索的对象,无需精准搜索
当 control_field_id 为 undefined 时,表示该搜索对象的搜索字段可选范围不受明细已有值的影响
当type: 'browser' // 指定获取显示值这个代表是浏览框或者下拉框type: 'text' // 指定获取值这个代表文本显示值和实际值一致type: 'select'选择框
***如需控制浏览框搜索字段的可选范围需在泛微对该浏览框做相应的选择范围设置一般为数据id属于 control_field_id 字段值的范围!!!
***当前代码不支持对明细多选字段的搜索功能!!!
*/
basic_info.search_obj.forEach(function (search) {
if (search.search_field_id) {
WfForm.changeFieldValue(search.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) {//模糊搜索
searchFunction(basic_info.all_search_field_id, value);
});
$(".wf-input-" + basic_info.all_search_field_id).keydown(function (event) {//模糊搜索
let value = event.target.value;
searchFunction(basic_info.all_search_field_id, value);
}); //搜索区间触发
// 生成字段变化事件绑定字符串
function getFieldChangeEventIds() {
return basic_info.search_obj
.filter(field => field.search_field_id) // 只保留有 search_field_id 的字段
.map(field => field.search_field_id) // 提取 search_field_id
.join(","); // 拼接成逗号分隔的字符串,生成类似:field188336,field193852,field201846
}
WfForm.bindFieldChangeEvent(
getFieldChangeEventIds(), // 动态生成的字段 ID 字符串
function (obj, id, value) {
searchFunction(id, value);
}
);
//明细搜索函数
function searchFunction(fieldid, value) {
Arrtmp = [];
if (fieldid == basic_info.all_search_field_id) {//---------------------------------------------------------------------模糊搜索
var search = {};
var rowArr = WfForm.getDetailAllRowIndexStr("detail_" + searchDetailNum).split(",");
rowArr.forEach(rowIndex => {
if (rowIndex !== "") {
let fieldValues = [];
basic_info.search_obj.forEach(field => {
if (field.detail_field_id) {
let fieldId = field.detail_field_id + "_" + rowIndex;
let fieldType = field.type;
let value;
if (fieldType == 'text') {//实际值和显示值一致,如文本框
value = WfForm.getFieldValue(fieldId);
} else if (fieldType == 'browser') {//浏览框
value = WfForm.getBrowserShowName(fieldId);
} else if (fieldType == 'select') {//选择框
value = WfForm.getSelectShowName(fieldId);
}
fieldValues.push(value);
}
});
let tmp = fieldValues.join(";") + ";";
// 以分号分隔存入值
search[rowIndex] = tmp;
}
});
let tmp = value.trim().split(" ");
if (tmp[0].length > 0) {
tmp = tmp.filter((i) => i && i.trim());
}
tmp.forEach((item) => {
let regex = new RegExp(item);
Object.keys(search).forEach((e) => {
if (regex.test(search[e])) {
Arrtmp.push(e);
}
});
});
if (value.trim() === "") {
// 如果value为空显示所有明细行
WfForm.controlDetailRowDisplay("detail_" + searchDetailNum, "all", false);
} else {
WfForm.controlDetailRowDisplay("detail_" + searchDetailNum, "all", true); // 全部隐藏
WfForm.controlDetailRowDisplay("detail_" + searchDetailNum, Arrtmp.join(), false); // 显示符合条件的行
}
WfForm.checkDetailRow("detail_" + searchDetailNum, "", true); // 清空所有勾选项
} else {
// 生成明细对象
var search = {};
var rowArr = WfForm.getDetailAllRowIndexStr("detail_" + searchDetailNum).split(",");
// 遍历所有明细行
rowArr.forEach(rowIndex => {
if (rowIndex !== "") {
var detailObj = {};
// 遍历 search_obj 获取每个字段的实际值,并存入 detailObj
basic_info.search_obj.forEach(field => {
if (field.detail_field_id) {
var fieldId = field.detail_field_id + "_" + rowIndex;
var fieldValue = WfForm.getFieldValue(fieldId); // 获取实际值
detailObj[field.detail_field_id] = {
value: fieldValue,
detail_field_id: field.detail_field_id // 关联 detail_field_id
};
}
});
detailObj.rowIndex = rowIndex;
search[rowIndex] = detailObj;
}
});
// 生成搜索值对象
var searchValues = {};
basic_info.search_obj.forEach(field => {
if (field.search_field_id) {
let searchFieldId = field.search_field_id;
let searchValue = WfForm.getFieldValue(searchFieldId); // 获取实际值
let type = field.type; // 获取字段的类型
searchValues[field.detail_field_id] = { value: searchValue, type: type }; // 用 detail_field_id 作为键
}
});
// 遍历每个明细行,判断是否匹配
Object.keys(search).forEach(key => {
let detail = search[key];
let isMatch = true;
// 遍历每个字段进行匹配
basic_info.search_obj.forEach(field => {
if (field.detail_field_id) {
let searchField = searchValues[field.detail_field_id];
let detailValue = detail[field.detail_field_id].value;
if (searchField.type == 'text') {
// 支持模糊匹配
isMatch = isMatch && (!searchField.value || detailValue.includes(searchField.value));
} else if (searchField.type == 'browser' || searchField.type == 'select') {
// 多选匹配支持交集
let searchValuesArray = (searchField.value || "").split(',').map(v => v.trim()).filter(v => v);
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;
}
}
});
if (isMatch) {
Arrtmp.push(detail.rowIndex);
}
});
// 显示符合条件的明细行
if (Object.values(searchValues).every(v => !v.value.trim())) {
WfForm.controlDetailRowDisplay("detail_" + searchDetailNum, "all", false); // 显示所有明细行
} else {
WfForm.controlDetailRowDisplay("detail_" + searchDetailNum, "all", true); // 全部隐藏
WfForm.controlDetailRowDisplay("detail_" + searchDetailNum, Arrtmp.join(), false); // 显示符合条件的行
}
WfForm.checkDetailRow("detail_" + searchDetailNum, "", true); // 清空所有勾选项
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------搜索功能结束