|
|
@@ -1060,16 +1060,23 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
|
|
|
var got = false;
|
|
|
['czlyq', 'CCLBMMC', 'cywyxm', 'CGYMC'].forEach(function (f) {
|
|
|
var src = incoming[f];
|
|
|
- if (!src || typeof src !== 'object') {
|
|
|
+ if (src == null) {
|
|
|
return;
|
|
|
}
|
|
|
- if (!filterOpts[f] || typeof filterOpts[f] !== 'object') {
|
|
|
+ var normalized = procuremenNormalizeFilterMap(src);
|
|
|
+ if (!filterOpts[f] || typeof filterOpts[f] !== 'object' || $.isArray(filterOpts[f])) {
|
|
|
filterOpts[f] = {};
|
|
|
}
|
|
|
- if (Object.keys(src).length) {
|
|
|
+ // 若已有选项是下标污染,直接替换
|
|
|
+ if (procuremenFilterMapLooksLikeIndexJunk(filterOpts[f])) {
|
|
|
+ filterOpts[f] = {};
|
|
|
+ }
|
|
|
+ if (Object.keys(normalized).length) {
|
|
|
got = true;
|
|
|
+ $.extend(filterOpts[f], normalized);
|
|
|
+ // 再规范化一次,避免 extend 留下数字下标
|
|
|
+ filterOpts[f] = procuremenNormalizeFilterMap(filterOpts[f]);
|
|
|
}
|
|
|
- $.extend(filterOpts[f], src);
|
|
|
});
|
|
|
if (typeof Config !== 'undefined') {
|
|
|
Config.procuremenFilterOptions = filterOpts;
|
|
|
@@ -1078,9 +1085,98 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
|
|
|
Controller._filterOptionsReady = true;
|
|
|
}
|
|
|
}
|
|
|
+ function procuremenNormalizeFilterMap(src) {
|
|
|
+ var out = {};
|
|
|
+ if (!src) {
|
|
|
+ return out;
|
|
|
+ }
|
|
|
+ if ($.isArray(src)) {
|
|
|
+ // JSON 数组:用值本身做选项,切勿用下标 0/1/2…
|
|
|
+ src.forEach(function (v) {
|
|
|
+ var s = String(v == null ? '' : v).trim();
|
|
|
+ if (s !== '') {
|
|
|
+ out[s] = s;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return out;
|
|
|
+ }
|
|
|
+ if (typeof src !== 'object') {
|
|
|
+ return out;
|
|
|
+ }
|
|
|
+ $.each(src, function (k, v) {
|
|
|
+ var vs = String(v == null ? '' : v).trim();
|
|
|
+ var ks = String(k == null ? '' : k).trim();
|
|
|
+ // 优先用值;值为空时若 key 不是纯数字下标再用 key
|
|
|
+ var s = vs !== '' ? vs : ((ks !== '' && !/^\d+$/.test(ks)) ? ks : '');
|
|
|
+ if (s === '') {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 丢掉 0=>0、1=>1 这种数组下标伪选项(真实工序名「1206」会因值=键且来自业务字段而保留:若全是这类则后面用表数据重建)
|
|
|
+ if (/^\d+$/.test(ks) && vs === ks && /^\d+$/.test(vs) && parseInt(vs, 10) < 50 && String(parseInt(vs, 10)) === vs) {
|
|
|
+ // 仍保留:可能是合法短数字编码;仅在「整表都是 0..n 连续下标」时判定损坏
|
|
|
+ out[s] = s;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ out[s] = s;
|
|
|
+ });
|
|
|
+ return out;
|
|
|
+ }
|
|
|
+ function procuremenFilterMapLooksLikeIndexJunk(map) {
|
|
|
+ var keys = Object.keys(map || {});
|
|
|
+ if (keys.length < 2) {
|
|
|
+ return keys.length === 0;
|
|
|
+ }
|
|
|
+ var allSmallInt = true;
|
|
|
+ var nums = [];
|
|
|
+ keys.forEach(function (k) {
|
|
|
+ var s = String(map[k] == null ? k : map[k]).trim();
|
|
|
+ if (!/^\d+$/.test(s)) {
|
|
|
+ allSmallInt = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var n = parseInt(s, 10);
|
|
|
+ if (n > 30) {
|
|
|
+ allSmallInt = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ nums.push(n);
|
|
|
+ });
|
|
|
+ if (!allSmallInt || !nums.length) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ nums.sort(function (a, b) { return a - b; });
|
|
|
+ // 连续 0..n 或 1..n 视为下标污染
|
|
|
+ var start = nums[0];
|
|
|
+ if (start !== 0 && start !== 1) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ for (var i = 1; i < nums.length; i++) {
|
|
|
+ if (nums[i] !== nums[i - 1] + 1) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ function procuremenCollectFilterFromTable(field) {
|
|
|
+ var out = {};
|
|
|
+ try {
|
|
|
+ var data = $('#table').bootstrapTable('getData') || [];
|
|
|
+ data.forEach(function (row) {
|
|
|
+ if (!row || typeof row !== 'object') {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var s = String(row[field] == null ? '' : row[field]).trim();
|
|
|
+ if (s !== '') {
|
|
|
+ out[s] = s;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } catch (ignore) {
|
|
|
+ }
|
|
|
+ return out;
|
|
|
+ }
|
|
|
function procuremenSearchList(field) {
|
|
|
var list = filterOpts && filterOpts[field] ? filterOpts[field] : {};
|
|
|
- return list && typeof list === 'object' ? list : {};
|
|
|
+ return procuremenNormalizeFilterMap(list);
|
|
|
}
|
|
|
// 表头标题文字后小筛选:承揽部门 / 工序名称 / 类型
|
|
|
Controller.colFilters = {CCLBMMC: '', CGYMC: '', czlyq: ''};
|
|
|
@@ -1096,22 +1192,37 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
|
|
|
.replace(/>/g, '>')
|
|
|
.replace(/"/g, '"');
|
|
|
}
|
|
|
+ function procuremenResolveFilterList(field) {
|
|
|
+ var list = procuremenSearchList(field);
|
|
|
+ var fromTable = procuremenCollectFilterFromTable(field);
|
|
|
+ if (procuremenFilterMapLooksLikeIndexJunk(list)) {
|
|
|
+ list = {};
|
|
|
+ }
|
|
|
+ list = procuremenNormalizeFilterMap($.extend({}, list, fromTable));
|
|
|
+ if (procuremenFilterMapLooksLikeIndexJunk(list)) {
|
|
|
+ // 表数据也异常时至少不要展示 0..n
|
|
|
+ list = procuremenNormalizeFilterMap(fromTable);
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
function procuremenBuildHeaderFilterMenu(field) {
|
|
|
var cur = Controller.colFilters[field] || '';
|
|
|
- var list = procuremenSearchList(field);
|
|
|
+ var list = procuremenResolveFilterList(field);
|
|
|
var html = '<li' + (!cur ? ' class="active"' : '') + '>'
|
|
|
+ '<a href="javascript:;" class="procuremen-th-filter-item" data-field="'
|
|
|
+ procuremenEscOption(field) + '" data-value="">全部</a></li>';
|
|
|
- $.each(list, function (k, v) {
|
|
|
- var val = k != null && String(k) !== '' ? String(k) : String(v);
|
|
|
- var lab = v != null && String(v) !== '' ? String(v) : val;
|
|
|
+ var labels = Object.keys(list).sort(function (a, b) {
|
|
|
+ return String(a).localeCompare(String(b), 'zh');
|
|
|
+ });
|
|
|
+ labels.forEach(function (lab) {
|
|
|
+ var val = String(list[lab] != null ? list[lab] : lab).trim();
|
|
|
if (!val) {
|
|
|
return;
|
|
|
}
|
|
|
html += '<li' + (cur === val ? ' class="active"' : '') + '>'
|
|
|
+ '<a href="javascript:;" class="procuremen-th-filter-item" data-field="'
|
|
|
+ procuremenEscOption(field) + '" data-value="' + procuremenEscOption(val) + '">'
|
|
|
- + procuremenEscOption(lab) + '</a></li>';
|
|
|
+ + procuremenEscOption(val) + '</a></li>';
|
|
|
});
|
|
|
return html;
|
|
|
}
|