Files
N_XLXSBJ----MX/images/BJDPLTJ.js
T
2026-08-21 17:03:02 +08:00

4105 lines
190 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 OpenAlone = sessionStorage.getItem("OpenAlone") || "";
let topDocument;
if(OpenAlone === 'Y')
{
try {
topDocument = parent.document;
} catch (e) {
topDocument = document;
}
}
else
{
try {
topDocument = top.document;
} catch (e) {
topDocument = document;
}
}
const queryParams = getQueryParams();
let sBJDID = queryParams['BJDID'] || '';
let sSource = queryParams['FROMPARENTDIV'] || '';
// 获取 BJFLID 和 BJDYZ
function getBJFLIDAndBJDYZ() {
let bjflid = getQueryParams()['BJFLID'] || '';
let bjdyz = getQueryParams()['BJDYZ'] || '';
if (!bjflid) {
const txtBJFLIDElem = document.getElementById('txtBJFLID');
if (txtBJFLIDElem) {
bjflid = txtBJFLIDElem.value || '';
}
}
if (!bjdyz) {
const txtBJDYZElem = document.getElementById('txtBJDYZ');
if (txtBJDYZElem) {
bjdyz = txtBJDYZElem.value || '';
}
}
if ((!bjflid || !bjdyz) && topDocument) {
try {
if (!bjflid) {
const parentBJFLIDElem = topDocument.getElementById('txtBJFLID') ||
topDocument.getElementById('ctl00_CphForm_txtBJFLID') ||
topDocument.querySelector('[id*="txtBJFLID"]');
if (parentBJFLIDElem) {
bjflid = parentBJFLIDElem.value || '';
}
if (!bjflid) {
const parentCbxBJFLIDElem = topDocument.getElementById('cbxBJFLID') ||
topDocument.getElementById('ctl00_CphForm_cbxBJFLID') ||
topDocument.querySelector('[id*="cbxBJFLID"]');
if (parentCbxBJFLIDElem) {
bjflid = parentCbxBJFLIDElem.value || '';
}
}
}
if (!bjdyz) {
const parentBJDYZElem = topDocument.getElementById('txtBJDYZ') ||
topDocument.getElementById('ctl00_CphForm_txtBJDYZ') ||
topDocument.querySelector('[id*="txtBJDYZ"]');
if (parentBJDYZElem) {
bjdyz = parentBJDYZElem.value || '';
}
}
} catch (e) {
console.warn('从父页面获取BJFLID/BJDYZ失败:', e);
}
}
return { bjflid, bjdyz };
}
// 初始获取
let { bjflid: sBJFLID, bjdyz: sBJDYZ } = getBJFLIDAndBJDYZ();
console.log('sBJDID:', sBJDID);
console.log('FROMPARENTDIV:', sSource);
console.log('sBJFLID:', sBJFLID);
console.log('sBJDYZ:', sBJDYZ);
const FILTERABLE_COLUMNS = [
'XLXHID', // 型号
'XLGGID', // 规格
'XLBZID', // 标准
'DYDJID', // 电压等级
'JLDW', // 计量单位
'CPYT' // 产品用途
];
const { createApp, h } = Vue;
const { ElTableV2, ElButton, ElSelect, ElSelectV2, ElOption, ElInput, ElCheckbox, ElDialog, ElPopover, ElScrollbar, ElIcon, ElCheckboxGroup, ElTag, ElMessage, ElMessageBox, ElDropdown, ElDropdownMenu, ElDropdownItem, ElDrawer, ElForm, ElFormItem, ElInputNumber, ElRow, ElCol, ElProgress } = ElementPlus;
const { Filter, Operation, Edit } = ElementPlusIconsVue;
const app = createApp({
components: { ElTableV2, ElButton, ElDropdown, ElDropdownMenu, ElDropdownItem, ElDrawer, ElForm, ElFormItem, ElInputNumber, ElRow, ElCol, ElProgress },
data: function () {
return {
tableWidth: 1600,
tableHeight: 800,
importing: false,
showLoading: false,
loadingProgress: 0,
loadingTimer: null,
// 列最小宽度映射表
COLUMN_MIN_WIDTH_MAP: {
XLXHID: 120,
XLGGID: 120,
XLBZID: 100,
DYDJID: 100,
JLDW: 100,
CPYT: 240,
BJCP: 250,
BJSL: 100,
BJDHQCLCB: 130,
CLCB: 130,
JGBJJ: 120,
JGBBJ: 120,
TZQCPBJ: 100,
TZCPBJ: 100,
CPBJ: 100,
TZQBJJE: 100,
TZBJJE: 100,
BJJE: 120,
BZ: 200,
BJSDBZ: 100
},
dynamicWidths: {},
resizingKey: '',
startX: 0,
startWidth: 0,
isResizing: false,
sJGEJGB: '',
bjcphgColumnName: '材料清单未生成',
title: '批量调价',
filteredItems: [],
items: [],
priceUpDialogVisible: false,
priceDownDialogVisible: false,
batchPriceDialogVisible: false,
materialPriceDialogVisible: false,
priceUpForm: {
range: 'C',
value: 0,
rangeOptions: ['N', 'Y', 'C'],
formulaLabel: '新报价=原报价/(1-'
},
priceDownForm: {
range: 'C',
value: 0,
rangeOptions: ['N', 'Y', 'C'],
formulaLabel: '新报价=原报价*(1-'
},
materialPriceForm: {
range: 'C',
rangeOptions: ['Y', 'C'],
referenceColumn: 'LJ', // 固定为料价价差率
adjustRatio: '',
materialType: 'XDZ',
hasNoTablePrice: false,
isNonPurchased: false,
canEditNonPurchased: true
},
batchPriceForm: {
adjustType: 'up',
range: 'C',
value: 0,
materialType: 'relative',
materialValue: 0,
rangeOptions: ['N', 'Y', 'C']
},
tempColumnFilters: {},
columnFilters: {},
columnUniqueValues: {},
filterPopoverVisible: {},
filterSearch: {},
tableVersion: 0,
columnVisibility: {
BJDHQCLCB: false,
CLCB: false,
JGBJJ: false,
TZQCPBJ: false,
TZCPBJ: false,
CPBJ: true,
TZQBJJE: false,
TZBJJE: false,
BJJE: true,
CLZL: false,
CLCBJCL: false,
JGBBJJCL: false,
JGBBJJCE: false,
FBH: false,
CPBJXJ: false,
BJXJKD: false,
BJXJJJ: false,
XJBJCE: false,
BZ: false,
BJSDBZ: false,
XLXSBJDMX_WHRID: false,
XLXSBJDMX_WHR: false,
XLXSBJDMX_WHSJ: false,
XLXSBJDMX_XH: false,
PX0: false
},
decimalPlaces: {},
// 动态列
dynamicColumns: [],
buttonVisibility: {
BJSD: true,
BJSF: true,
BJXF: true,
JMBGS: false,
LJJCLLX: false,
BJXJ: false,
CLYLBL: false
},
queryDrawerVisible: false,
queryConditions: {
XLJGID: '',
XLGGID: '',
JMBGS: '',
ZJMS: '',
ZJMZ: '',
BJSLS: '',
BJSLZ: '',
BJJES: '',
BJJEZ: '',
DJS: '',
DJZ: '',
BH: [],
CPYT: [],
XJBJCEWF: false
},
showJMBGS: false,
showLSBJ: false,
showBH: false,
showXJBJ: false,
bhOptions: [],
bjslUnit: 'M',
xlggOptions: [],
xlbzOptions: [],
xlbzAllOptions: [],
dydjOptions: [],
xlysOptions: [],
cpytOptions: [],
JGBBJBMValue: '',
BJDHQLJBMValue: '',
iXSWS: 5,
showXJBJ: false,
jmbgsButtonText: '基价表格式',
dynamicYZButtons: [],
selectedRows: [],
selectedRowMap: {}, // 以XH为键的已选记录映射,用于O(1)查找,避免大数据量全选卡死
useCPML: false, // 是否使用产品目录(true=产品目录,false=产品用途)
bjdyz: '', // BJDYZ 参数,用于生成列标题
sortField: '',
sortOrder: '',
dynamicWidths: {},
resizingKey: '',
startX: 0,
startWidth: 0,
isResizing: false,
bjxjDialogVisible: false,
bjxjForm: {
range: 'C',
rangeOptions: ['Y', 'C'],
kdValue: '',
jjValue: '',
onlyNegative: false
},
// 因子对话框
yzDialogVisible: false,
yzForm: {
dialogTitle: '因子调价',
range: 'C',
rangeOptions: ['Y', 'C'],
showReferenceColumn: false,
referenceColumn: '',
referenceColumnOptions: [],
factorLabel: '因子值:',
factorValue: '',
factorUnit: '',
showOnlyNegative: false,
onlyNegative: false,
showHasTablePrice: false,
hasTablePrice: false,
showPurchased: false,
isPurchased: false,
isNonPurchased: false,
YZID: '',
YZType: ''
}
};
},
async created() {
try {
// 确保loadingProgress已初始化(但不设置 showLoading,由 loadData 控制)
if (this.loadingProgress === undefined) {
this.loadingProgress = 0;
}
// 延迟重新获取 BJFLID 和 BJDYZ
setTimeout(() => {
const { bjflid, bjdyz } = getBJFLIDAndBJDYZ();
if (bjflid) {
sBJFLID = bjflid;
console.log('延迟获取到 sBJFLID:', sBJFLID);
}
if (bjdyz) {
sBJDYZ = bjdyz;
console.log('延迟获取到 sBJDYZ:', sBJDYZ);
}
if (bjflid || bjdyz) {
this.loadColumnVisibility();
}
}, 500);
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373006.ashx';
await Promise.all([
GThinking.Web.AjaxServiceProxy.invoke('IsJGEJGB', false, {
'sBJDID': sBJDID
}, result => {
console.log("IsJGEJGB_CallBack");
console.log(result);
this.sJGEJGB = result;
if (this.sJGEJGB === "Y") {
this.bjcphgColumnName = '材料清单未生成';
} else {
this.bjcphgColumnName = '无表价';
}
this.COLUMN_MIN_WIDTH_MAP['BJCPBHG'] = this.bjcphgColumnName.length >= 6 ? 150 : 100;
this.calcTableSize();
}, CallBackNULLJSON, "IsJGEJGB_CallBack"),
GThinking.Web.AjaxServiceProxy.invoke('GetXLYSList', false, {}, CallBackFun, CallBackNULLJSON, "GetXLYSList_CallBack"),
GThinking.Web.AjaxServiceProxy.invoke('GetXLBZList', false, {
'sBJDID': sBJDID,
'sXLXHID': '',
'sXLGGID': ''
}, result => {
this.xlbzAllOptions = result;
}, CallBackNULLJSON, "GetXLBZList_CallBack")
]);
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
this.loadColumnVisibility();
this.loadButtonConfig();
this.loadQueryOptions();
this.loadDecimalPlaces();
this.loadDynamicColumns(); // 会在列可见性配置加载完成后再次调用
this.loadUseCPML();
this.loadData();
} catch (error) {
console.error("数据加载失败:", error);
} finally {
// this.$nextTick(() => {
// this.$refs.table?.forceUpdate();
// });
}
},
computed: {
columns() {
return this.generateColumns();
},
safeLoadingProgress() {
// 确保 loadingProgress 始终有值,避免 Vue 3 警告
try {
const progress = this.loadingProgress;
if (typeof progress === 'number' && !isNaN(progress)) {
return Math.max(0, Math.min(100, progress));
}
return 0;
} catch (e) {
return 0;
}
}
},
watch: {
showLoading(newVal, oldVal) {
if (newVal) {
// 开始加载时启动进度条
this.loadingProgress = 0;
// 使用 nextTick 确保 DOM 更新后再启动进度条
this.$nextTick(() => {
this.startLoadingProgress();
});
} else {
// 加载完成时清除定时器并重置进度
if (this.loadingTimer) {
clearInterval(this.loadingTimer);
this.loadingTimer = null;
}
// 快速完成到100%然后重置
this.loadingProgress = 100;
setTimeout(() => {
this.loadingProgress = 0;
}, 300);
}
}
},
beforeMount() {
// 在挂载前确保属性存在,避免 Vue 3 警告
if (this.loadingProgress === undefined) {
this.loadingProgress = 0;
}
if (this.loadingTimer === undefined) {
this.loadingTimer = null;
}
},
mounted() {
// 确保 loadingProgress 在实例上存在(Vue 3 响应式初始化)
this.loadingProgress = this.loadingProgress ?? 0;
this.loadingTimer = this.loadingTimer ?? null;
this.calcTableSize();
this.calculateColumnWidths();
window.addEventListener('resize', this._onResize = this.resizeColumns.bind(this));
this.$nextTick(() => {
const appElement = document.getElementById('app');
if (appElement) {
appElement.style.opacity = '1';
appElement.style.pointerEvents = 'auto';
}
});
},
beforeUnmount() {
window.removeEventListener('resize', this._onResize);
// 清理进度条定时器
if (this.loadingTimer) {
clearInterval(this.loadingTimer);
this.loadingTimer = null;
}
},
methods: {
startLoadingProgress() {
// 清除之前的定时器
if (this.loadingTimer) {
clearInterval(this.loadingTimer);
this.loadingTimer = null;
}
// 如果loading已经结束,不再启动进度条
if (!this.showLoading) {
return;
}
// 立即设置初始值
this.loadingProgress = 0;
// 根据数据量估算加载时间
// 如果有历史数据,根据数据量估算;否则使用默认值
let estimatedDuration = 3000; // 默认3秒
if (this.items && this.items.length > 0) {
// 根据已有数据量估算:每1000条数据约需1秒,最少2秒,最多8秒
const dataCount = this.items.length;
estimatedDuration = Math.max(2000, Math.min(8000, Math.ceil(dataCount / 1000) * 1000));
} else {
// 如果没有历史数据,根据筛选条件估算
// 如果有筛选条件,可能数据量较大,使用较长的时间
const hasFilters = Object.keys(this.columnFilters || {}).some(key =>
this.columnFilters[key] && this.columnFilters[key].length > 0
);
if (hasFilters) {
estimatedDuration = 4000; // 有筛选条件,估算4秒
} else {
estimatedDuration = 3000; // 无筛选条件,估算3秒
}
}
const targetProgress = 96; // 最终进度96%
const updateInterval = 50; // 每50ms更新一次
const startTime = Date.now();
// 使用自定义分段函数实现前面非常快、后面非常慢的效果
// 前30%时间快速达到85%,后70%时间缓慢达到96%
const customEasing = (t) => {
if (t <= 0.3) {
// 前30%时间:快速从0到85%
return (t / 0.3) * 0.85;
} else {
// 后70%时间:缓慢从85%到96%
const remainingProgress = 0.96 - 0.85; // 11%
const remainingTime = (t - 0.3) / 0.7; // 0到1
// 使用指数函数让后面非常慢
const slowProgress = 1 - Math.pow(1 - remainingTime, 3);
return 0.85 + slowProgress * remainingProgress;
}
};
// 使用箭头函数保持 this 上下文
const interval = setInterval(() => {
// 如果loading已经结束,清除定时器
if (!this.showLoading) {
clearInterval(interval);
this.loadingTimer = null;
return;
}
// 计算已过时间
const elapsed = Date.now() - startTime;
const progress = Math.min(elapsed / estimatedDuration, 1); // 0 到 1
// 应用自定义缓动函数,使前面非常快、后面非常慢
const easedProgress = customEasing(progress);
// 计算当前进度(0 到 96)
const currentProgress = Math.min(Math.round(easedProgress * 100), targetProgress);
// 更新进度值 - Vue 3 会自动检测响应式变化
this.loadingProgress = currentProgress;
// 如果达到96%,停止动画,等待实际完成
if (currentProgress >= targetProgress) {
clearInterval(interval);
this.loadingTimer = null;
}
}, updateInterval);
this.loadingTimer = interval;
},
// 获取当前筛选结果的明细ID(逗号分隔),用于“所查记录”范围
getFilteredIds() {
if (!this.filteredItems || this.filteredItems.length === 0) return '';
return this.filteredItems
.map(row => row.XLXSBJDMX_XH || row.XH)
.filter(Boolean)
.join(',');
},
applyFilter() {
if (!this.items || !Array.isArray(this.items)) {
this.filteredItems = [];
return;
}
// 如果数据量较大,显示loading并使用异步处理
const dataCount = this.items.length;
const shouldShowLoading = dataCount > 1000;
if (shouldShowLoading) {
this.showLoading = true;
}
// 使用异步处理大数据量筛选,避免阻塞UI
const filterData = () => {
let filteredData = this.items.filter(row => {
return Object.keys(this.columnFilters).every(key => {
const filters = this.columnFilters[key];
if (!filters || filters.length === 0) return true;
const value = (row[key] ?? '').toString().trim();
return filters.some(f => (f ?? '').toString().trim() === value);
});
});
filteredData = filteredData.sort((a, b) => {
const aXSSX = a.XLXSBJDMX_XSSX || a.XSSX || a.XH || 0;
const bXSSX = b.XLXSBJDMX_XSSX || b.XSSX || b.XH || 0;
return aXSSX - bXSSX;
});
this.filteredItems = filteredData;
this.tableVersion += 1; // 强制刷新表格渲染
if (shouldShowLoading) {
this.showLoading = false;
}
};
if (shouldShowLoading) {
// 使用setTimeout让UI有机会渲染loading状态
setTimeout(() => {
filterData();
}, 10);
} else {
filterData();
}
},
handleHeaderClick(column) {
if (this.isResizing) return;
},
updateColumnValues(key) {
if (!this.items || !Array.isArray(this.items) || this.items.length === 0) return;
// 按其他已选筛选条件先过滤,做到二级联动
const sourceData = (this.items || []).filter(row => {
return Object.keys(this.columnFilters || {}).every(fk => {
if (fk === key) return true; // 当前列不参与过滤
const filters = this.columnFilters[fk];
if (!filters || filters.length === 0) return true;
const value = (row[fk] ?? '').toString().trim();
return filters.some(f => (f ?? '').toString().trim() === value);
});
});
const allValues = sourceData.map(row => {
const value = (row[key] ?? '').toString().trim();
return { label: value || '空', value };
});
const uniqueValues = Array.from(new Map(
allValues.map(item => [item.value, item])
).values()).sort((a, b) => {
if (a.value === '') return -1;
if (b.value === '') return 1;
return a.value.localeCompare(b.value, undefined, {
numeric: true,
sensitivity: 'base',
caseFirst: 'false'
});
});
this.columnUniqueValues[key] = uniqueValues;
},
resizeColumns() {
const container = this.$refs.tableContainer;
if (container) {
const scrollbarWidth = container.offsetWidth - container.clientWidth;
this.tableWidth = container.getBoundingClientRect().width - scrollbarWidth - 1;
this.tableHeight = container.clientHeight;
console.log('自适应表宽高:', this.tableWidth, this.tableHeight);
}
},
calcTableSize() {
const container = this.$refs.tableContainer;
if (!container) return;
const scrollbarWidth = container.offsetWidth - container.clientWidth;
this.tableWidth = container.getBoundingClientRect().width - scrollbarWidth - 1;
this.tableHeight = container.clientHeight;
console.log(' calcTableSize ', this.tableWidth, this.tableHeight);
},
calculateColumnWidths() {
console.log('批量调价使用固定列宽');
},
generateColumns() {
const getWidth = (key, defaultWidth) => this.dynamicWidths[key] || defaultWidth;
const columns = [
// 选择列
{
key: 'selection',
title: '',
width: 55,
minWidth: 55,
fixed: 'left',
headerCellRenderer: () => {
const selectedXHSet = new Set(this.selectedRows.map(sel => sel.XH));
const allSelected = this.filteredItems.length > 0 &&
this.filteredItems.every(row => selectedXHSet.has(row.XH));
const someSelected = this.filteredItems.some(row => selectedXHSet.has(row.XH));
return h('div', {
style: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: '100%',
width: '100%'
}
}, [
h(ElCheckbox, {
modelValue: allSelected,
indeterminate: someSelected && !allSelected,
onChange: (checked) => {
if (checked) {
// 全选:使用批量方式,避免大数据量下 O(n²) 卡死
const existingXHs = new Set(this.selectedRows.map(sel => sel.XH));
const newRows = [];
this.filteredItems.forEach(row => {
if (!existingXHs.has(row.XH)) {
existingXHs.add(row.XH);
newRows.push(row);
this.selectedRowMap[row.XH] = row;
}
});
if (newRows.length > 0) {
this.selectedRows = this.selectedRows.concat(newRows);
}
} else {
// 取消全选:使用 Set 批量过滤
const filteredXHs = new Set(this.filteredItems.map(row => row.XH));
this.selectedRows = this.selectedRows.filter(sel => {
const keep = !filteredXHs.has(sel.XH);
if (!keep) {
delete this.selectedRowMap[sel.XH];
}
return keep;
});
}
}
})
]);
},
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
const isSelected = !!this.selectedRowMap[rowData.XH];
return h('div', {
style: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
height: '100%',
width: '100%'
}
}, [
h(ElCheckbox, {
modelValue: isSelected,
onChange: (checked) => {
if (checked) {
if (!this.selectedRowMap[rowData.XH]) {
this.selectedRowMap[rowData.XH] = rowData;
this.selectedRows = this.selectedRows.concat([rowData]);
}
} else {
if (this.selectedRowMap[rowData.XH]) {
delete this.selectedRowMap[rowData.XH];
this.selectedRows = this.selectedRows.filter(sel => sel.XH !== rowData.XH);
}
}
}
})
]);
}
},
// 隐藏的序号列(用于判断是哪列)
{
key: 'XH',
title: '',
width: 0,
minWidth: 0,
cellRenderer: () => h('div', { style: { display: 'none' } })
},
// 显示序号列(使用后台序号)
{
key: 'XSSX',
title: '显示序号',
width: getWidth('XSSX', 80),
minWidth: 80,
align: 'center',
headerCellRenderer: () => {
const self = this;
return h('div', {
style: {
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
width: '100%',
height: '100%',
textAlign: 'center',
position: 'relative'
}
}, [
h('span', '显示序号'),
h('div', {
class: 'resizer',
onMousedown: (e) => {
e.stopPropagation();
self.startResizing('XSSX', e);
}
})
]);
},
cellRenderer: ({ rowData, rowIndex }) => {
const displayIndex = rowData?.XLXSBJDMX_XSSX || rowData?.XSSX || (rowIndex + 1);
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
}
}, displayIndex);
}
},
// 型号列
this.buildFilterableColumn({
key: 'XLXHID',
title: '型号',
width: 120,
minWidth: 120,
align: 'center',
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
}
}, rowData.XLXHID || '');
}
}),
// 规格列
this.buildFilterableColumn({
key: 'XLGGID',
title: '规格',
width: 120,
minWidth: 120,
align: 'center',
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
}
}, rowData.XLGGID || '');
}
}),
// 标准列
this.buildFilterableColumn({
key: 'XLBZID',
title: '标准',
width: 100,
minWidth: 100,
align: 'center',
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
}
}, rowData.XLBZID || '');
}
}),
// 电压等级列
this.buildFilterableColumn({
key: 'DYDJID',
title: '电压等级',
width: 100,
minWidth: 100,
align: 'center',
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
}
}, rowData.DYDJID || '');
}
}),
// 计量单位列
this.buildFilterableColumn({
key: 'JLDW',
title: '计量单位',
width: 100,
minWidth: 100,
align: 'center',
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
}
}, rowData.JLDW || '');
}
}),
// 产品用途/产品目录列
this.buildFilterableColumn({
key: 'CPYT',
title: this.useCPML ? '产品目录' : '产品用途',
width: 240,
minWidth: 240,
align: 'center',
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
}
}, rowData.CPYT || '');
}
}),
// 报价产品列
this.buildFilterableColumn({
key: 'BJCP',
title: '报价产品',
width: 250,
minWidth: 250,
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center'
}
}, rowData.BJCP || '');
}
}),
// 报价数量列
{
key: 'BJSL',
title: '报价数量',
width: getWidth('BJSL', 100),
minWidth: 100,
align: 'right',
headerCellRenderer: () => {
const self = this;
return h('div', {
style: {
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
width: '100%',
height: '100%',
textAlign: 'center',
position: 'relative'
}
}, [
h('span', '报价数量'),
h('div', {
class: 'resizer',
onMousedown: (e) => {
e.stopPropagation();
self.startResizing('BJSL', e);
}
})
]);
},
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.BJSL, this.getDecimalPlace('BJSL')));
}
},
// 报价单行情料价列
...(this.columnVisibility.BJDHQCLCB ? [{
key: 'BJDHQCLCB',
title: this.BJDHQLJBMValue || '报价单行情料价',
width: getWidth('BJDHQCLCB', 130),
minWidth: 130,
align: 'right',
headerCellRenderer: this.createCenteredHeader(this.BJDHQLJBMValue || '报价单行情料价', 'BJDHQCLCB'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.BJDHQCLCB, this.getDecimalPlace('BJDHQCLCB')));
}
}] : []),
// 价格表行情料价列
...(this.columnVisibility.CLCB ? [{
key: 'CLCB',
title: '价格表行情料价',
width: getWidth('CLCB', 130),
minWidth: 130,
align: 'right',
headerCellRenderer: this.createCenteredHeader('价格表行情料价', 'CLCB'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.CLCB, this.getDecimalPlace('CLCB')));
}
}] : []),
// 基价列
...(this.columnVisibility.JGBJJ ? [{
key: 'JGBJJ',
title: '基价',
width: getWidth('JGBJJ', 120),
minWidth: 120,
align: 'right',
headerCellRenderer: this.createCenteredHeader('基价', 'JGBJJ'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.JGBJJ, this.getDecimalPlace('JGBJJ')));
}
}] : []),
// 表价列
{
key: 'JGBBJ',
title: this.JGBBJBMValue || '表价',
width: getWidth('JGBBJ', 120),
minWidth: 120,
align: 'right',
headerCellRenderer: this.createCenteredHeader(this.JGBBJBMValue || '表价', 'JGBBJ'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.JGBBJ, this.getDecimalPlace('JGBBJ')));
}
},
// 动态因子列(放在表价列之后)
...this.dynamicColumns.map(col => ({
key: col.prop,
title: col.label,
width: getWidth(col.prop, col.width || 100),
minWidth: col.width || 100,
align: col.align || 'right',
headerCellRenderer: this.createCenteredHeader(col.label, col.prop),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: col.align === 'right' ? 'flex-end' : 'center'
}
}, this.formatNumber(rowData[col.prop], col.decimalPlace || this.iXSWS));
}
})),
// 调整前报价列
...(this.columnVisibility.TZQCPBJ ? [{
key: 'TZQCPBJ',
title: '调整前报价',
width: getWidth('TZQCPBJ', 100),
minWidth: 100,
align: 'right',
headerCellRenderer: this.createCenteredHeader('调整前报价', 'TZQCPBJ'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.TZQCPBJ, this.getDecimalPlace('TZQCPBJ')));
}
}] : []),
// 调整报价列
...(this.columnVisibility.TZCPBJ ? [{
key: 'TZCPBJ',
title: '调整报价(%)',
width: getWidth('TZCPBJ', 150),
minWidth: 150,
align: 'right',
headerCellRenderer: this.createCenteredHeader('调整报价(%)', 'TZCPBJ'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.TZCPBJ, this.getDecimalPlace('TZCPBJ')));
}
}] : []),
// 报价列
...(this.columnVisibility.CPBJ ? [{
key: 'CPBJ',
title: '报价',
width: getWidth('CPBJ', 100),
minWidth: 100,
align: 'right',
headerCellRenderer: this.createCenteredHeader('报价', 'CPBJ'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.CPBJ, this.getDecimalPlace('CPBJ')));
}
}] : []),
// 报价金额列
...(this.columnVisibility.TZQBJJE ? [{
key: 'TZQBJJE',
title: '报价金额',
width: getWidth('TZQBJJE', 100),
minWidth: 100,
align: 'right',
headerCellRenderer: this.createCenteredHeader('报价金额', 'TZQBJJE'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.TZQBJJE, this.getDecimalPlace('TZQBJJE')));
}
}] : []),
// 调整金额列
...(this.columnVisibility.TZBJJE ? [{
key: 'TZBJJE',
title: '调整金额(元)',
width: getWidth('TZBJJE', 100),
minWidth: 100,
align: 'right',
headerCellRenderer: this.createCenteredHeader('调整金额(元)', 'TZBJJE'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.TZBJJE, this.getDecimalPlace('TZBJJE')));
}
}] : []),
// 报价金额列
...(this.columnVisibility.BJJE ? [{
key: 'BJJE',
title: this.columnVisibility.TZQBJJE ? '调整后报价金额' : '报价金额',
width: getWidth('BJJE', 120),
minWidth: 120,
align: 'right',
headerCellRenderer: this.createCenteredHeader(this.columnVisibility.TZQBJJE ? '调整后报价金额' : '报价金额', 'BJJE'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.BJJE, this.getDecimalPlace('BJJE')));
}
}] : []),
// 材料重量列
...(this.columnVisibility.CLZL ? [{
key: 'CLZL',
title: '材料重量',
width: getWidth('CLZL', 100),
minWidth: 100,
align: 'right',
headerCellRenderer: this.createCenteredHeader('材料重量', 'CLZL'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.CLZL, this.getDecimalPlace('CLZL')));
}
}] : []),
// 料价价差率列
...(this.columnVisibility.CLCBJCL ? [{
key: 'CLCBJCL',
title: '料价价差率(%)',
width: getWidth('CLCBJCL', 120),
minWidth: 120,
align: 'right',
headerCellRenderer: this.createCenteredHeader('料价价差率(%)', 'CLCBJCL'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.CLCBJCL, this.getDecimalPlace('CLCBJCL')));
}
}] : []),
// 表价价差率列
...(this.columnVisibility.JGBBJJCL ? [{
key: 'JGBBJJCL',
title: '表价价差率(%)',
width: getWidth('JGBBJJCL', 120),
minWidth: 120,
align: 'right',
headerCellRenderer: this.createCenteredHeader('表价价差率(%)', 'JGBBJJCL'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.JGBBJJCL, this.getDecimalPlace('JGBBJJCL')));
}
}] : []),
// 产品报价限价列
...(this.columnVisibility.CPBJXJ ? [{
key: 'CPBJXJ',
title: '产品报价限价',
width: getWidth('CPBJXJ', 120),
minWidth: 120,
align: 'right',
headerCellRenderer: this.createCenteredHeader('产品报价限价', 'CPBJXJ'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.CPBJXJ, this.getDecimalPlace('CPBJXJ')));
}
}] : []),
// 报价限价扣点列
...(this.columnVisibility.BJXJKD ? [{
key: 'BJXJKD',
title: '报价限价扣点',
width: getWidth('BJXJKD', 120),
minWidth: 120,
align: 'right',
headerCellRenderer: this.createCenteredHeader('报价限价扣点', 'BJXJKD'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.BJXJKD, this.getDecimalPlace('BJXJKD')));
}
}] : []),
// 报价限价加价列
...(this.columnVisibility.BJXJJJ ? [{
key: 'BJXJJJ',
title: '报价限价加价',
width: getWidth('BJXJJJ', 120),
minWidth: 120,
align: 'right',
headerCellRenderer: this.createCenteredHeader('报价限价加价', 'BJXJJJ'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.BJXJJJ, this.getDecimalPlace('BJXJJJ')));
}
}] : []),
// 限价报价差额列
...(this.columnVisibility.XJBJCE ? [{
key: 'XJBJCE',
title: '限价报价差额',
width: getWidth('XJBJCE', 120),
minWidth: 120,
align: 'right',
headerCellRenderer: this.createCenteredHeader('限价报价差额', 'XJBJCE'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end'
}
}, this.formatNumber(rowData.XJBJCE, this.getDecimalPlace('XJBJCE')));
}
}] : []),
// 备注列
...(this.columnVisibility.BZ ? [{
key: 'BZ',
title: '备注',
width: getWidth('BZ', 200),
minWidth: 200,
headerCellRenderer: this.createCenteredHeader('备注', 'BZ'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h('div', {
style: {
paddingLeft: '8px',
paddingRight: '8px',
height: '100%',
display: 'flex',
alignItems: 'center'
}
}, rowData.BZ || '');
}
}] : []),
// 报价锁定列
...(this.columnVisibility.BJSDBZ ? [{
key: 'BJSDBZ',
title: '报价锁定',
width: getWidth('BJSDBZ', 100),
minWidth: 100,
align: 'center',
headerCellRenderer: this.createCenteredHeader('报价锁定', 'BJSDBZ'),
cellRenderer: ({ rowData }) => {
if (!rowData) return h('div', '');
return h(ElTag, {
type: rowData.BJSDBZ === 'Y' ? 'success' : 'info',
size: 'small'
}, () => rowData.BJSDBZ === 'Y' ? '锁定' : '未锁定');
}
}] : [])
];
// 过滤掉不可见的列
const filteredColumns = columns.filter(col => {
// 隐藏的序号列始终隐藏
if (col.key === 'XH') {
return false;
}
if (col.key && this.columnVisibility.hasOwnProperty(col.key)) {
// 只有当值为 true 时才显示
const isVisible = this.columnVisibility[col.key] === true;
if (!isVisible && col.key.startsWith('TZYZ_')) {
console.log('generateColumns: 过滤掉不可见的动态列:', col.key, '可见性:', this.columnVisibility[col.key]);
}
return isVisible;
}
// 如果列可见性配置中不存在该列,默认显示(兼容性处理)
return true;
});
// 调试日志:统计动态列
const dynamicCols = filteredColumns.filter(col => col.key && col.key.startsWith('TZYZ_'));
if (dynamicCols.length > 0) {
console.log('generateColumns: 动态列过滤结果 - 数量:', dynamicCols.length, ', 列名:', dynamicCols.map(col => col.key));
} else {
console.log('generateColumns: 警告 - 没有动态列被显示!');
console.log('generateColumns: dynamicColumns 数组:', this.dynamicColumns);
console.log('generateColumns: columnVisibility 中 TZYZ_ 相关的配置:',
Object.keys(this.columnVisibility).filter(key => key.startsWith('TZYZ_')).map(key => `${key}: ${this.columnVisibility[key]}`));
}
return filteredColumns;
},
createHeaderWithResizer() {
return ({ column }) => {
return h('div', {
// 拖动条样式
style: {
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
position: 'relative',
width: '100%',
height: '100%',
textAlign: 'center',
},
onMousedown: (e) => {
e.stopPropagation();
}
}, [
column.title,
h('div', {
class: 'resizer',
// style: {
// position: 'absolute',
// right: '-6px',
// top: 0,
// bottom: 0,
// width: '3px',
// background: '#ddd',
// cursor: 'col-resize',
// zIndex: 10,
// transform: 'translateX(100%)'
// },
onMousedown: (e) => {
e.stopPropagation();
this.startResizing(column.key, e);
}
})
]);
};
},
buildFilterableColumn(columnConfig) {
const self = this;
const columnKey = columnConfig.key;
const getWidth = (key, defaultWidth) => self.dynamicWidths[key] || defaultWidth;
return {
...columnConfig,
width: getWidth(columnKey, columnConfig.width || columnConfig.minWidth || 100),
headerCellRenderer: () => {
return h('div', {
style: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
width: '100%',
height: '100%',
textAlign: 'center',
position: 'relative'
},
onMousedown: (e) => {
e.stopPropagation();
}
}, [
h('span', columnConfig.title),
h('div', {
class: 'resizer',
onMousedown: (e) => {
e.stopPropagation();
self.startResizing(columnKey, e);
}
}),
h(ElPopover, {
trigger: 'click',
visible: self.filterPopoverVisible[columnKey],
'onUpdate:visible': (val) => {
self.filterPopoverVisible[columnKey] = val;
if (val) {
self.tempColumnFilters[columnKey] = [...(self.columnFilters[columnKey] || [])];
self.updateColumnValues(columnKey);
}
},
placement: 'bottom',
width: 220,
popperClass: 'filter-popover'
}, {
default: () => [
h('div', { class: 'filter-content' }, [
h('div', { style: { padding: '0 12px 8px', flexShrink: 0 } }, [
h(ElInput, {
modelValue: self.filterSearch[columnKey] || '',
size: 'small',
clearable: true,
placeholder: '输入关键字定位',
onInput: (val) => {
self.filterSearch[columnKey] = val || '';
}
})
]),
h(ElScrollbar, { class: 'filter-scroll' }, {
default: () => {
const keyword = (self.filterSearch[columnKey] || '').toString().trim().toLowerCase();
const options = (self.columnUniqueValues[columnKey] || []).filter(opt => {
if (!keyword) return true;
const label = (opt.label || '').toString().trim().toLowerCase();
const value = (opt.value || '').toString().trim().toLowerCase();
return label.includes(keyword) || value.includes(keyword);
});
return [
h(ElCheckboxGroup, {
modelValue: self.tempColumnFilters[columnKey] || [],
onChange: (val) => {
self.tempColumnFilters[columnKey] = val;
}
}, {
default: () => options.map(opt =>
h(ElCheckbox, {
label: opt.label,
value: opt.value,
style: {
display: 'block',
margin: '4px 0',
width: '100%'
}
}, () => opt.label === '' ? '空' : opt.label)
)
})
];
}
}),
h('div', {
class: 'filter-footer',
style: {
display: 'flex',
gap: '8px',
justifyContent: 'flex-end',
padding: '8px',
background: '#fff',
borderTop: '1px solid #ebeef5'
}
}, [
h(ElButton, {
size: 'small',
onClick: () => {
self.tempColumnFilters[columnKey] = [];
self.columnFilters[columnKey] = [];
self.applyFilter();
}
}, () => '重置'),
h(ElButton, {
type: 'primary',
size: 'small',
onClick: () => {
self.columnFilters[columnKey] = [...self.tempColumnFilters[columnKey]];
self.filterPopoverVisible[columnKey] = false;
self.applyFilter();
}
}, () => '筛选')
])
])
],
reference: () => h(ElIcon, {
class: 'filter-trigger',
style: {
position: 'absolute',
right: 0,
top: '50%',
transform: 'translateY(-50%)',
cursor: 'pointer',
color: self.columnFilters[columnKey]?.length ? '#409EFF' : '#909399',
fontSize: '14px'
},
onClick: (e) => e.stopPropagation()
}, () => h(Filter))
})
]);
}
};
},
// 创建居中的标题渲染器(支持列宽调整)
createCenteredHeader(title, columnKey) {
const self = this;
return (props) => {
const column = props.column;
const key = columnKey || column.key;
return h('div', {
style: {
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
width: '100%',
height: '100%',
textAlign: 'center',
position: 'relative'
}
}, [
h('span', title),
h('div', {
class: 'resizer',
onMousedown: (e) => {
e.stopPropagation();
self.startResizing(key, e);
}
})
]);
};
},
// 获取列宽(优先使用自定义宽度)
getColumnWidth(columnKey, defaultWidth) {
return this.dynamicWidths[columnKey] || defaultWidth;
},
resetFilters() {
this.applyFilter();
},
updateItemFields(item, resultItem) {
item.BHGXX = [];
if (resultItem.XLXHHG !== undefined && resultItem.XLXHHG !== null) {
item.XLXHHG = resultItem.XLXHHG;
if (item.XLXHHG === 'N') {
item.BHGXX.push({ type: 'warning', label: '型号' });
}
}
if (resultItem.XLGGHG !== undefined && resultItem.XLGGHG !== null) {
item.XLGGHG = resultItem.XLGGHG;
if (item.XLGGHG === 'N') {
item.BHGXX.push({ type: 'warning', label: '规格' });
}
}
if (resultItem.DYDJHG !== undefined && resultItem.DYDJHG !== null) {
item.DYDJHG = resultItem.DYDJHG;
if (item.DYDJHG === 'N') {
item.BHGXX.push({ type: 'warning', label: '电压等级' });
}
}
if (resultItem.BJCPBHG !== undefined && resultItem.BJCPBHG !== null) {
item.BJCPBHG = resultItem.BJCPBHG;
}
if (resultItem.XLWBBJDMX_XLBZID && !item.XLWBBJDMX_XLBZID) {
item.XLWBBJDMX_XLBZID = resultItem.XLWBBJDMX_XLBZID;
if (resultItem.XLBZ_XLBZLXMC) {
item.XLBZ_XLBZLXMC = resultItem.XLBZ_XLBZLXMC;
}
}
if (resultItem.XLWBBJDMX_DYDJID && !item.XLWBBJDMX_DYDJID) {
item.XLWBBJDMX_DYDJID = resultItem.XLWBBJDMX_DYDJID;
}
},
startResizing(key, event) {
this.isResizing = true;
this.resizingKey = key;
this.startX = event.clientX;
this.startWidth = this.dynamicWidths[key] || 100;
document.addEventListener('mousemove', this.handleColumnResizeMove);
document.addEventListener('mouseup', this.stopResizing);
},
handleColumnResizeMove(event) {
if (!this.resizingKey) return;
const delta = event.clientX - this.startX;
const minWidth = this.COLUMN_MIN_WIDTH_MAP[this.resizingKey] || 50;
const newWidth = Math.max(
this.startWidth + delta,
minWidth
);
this.dynamicWidths[this.resizingKey] = newWidth;
this.$forceUpdate();
},
stopResizing() {
setTimeout(() => {
this.isResizing = false;
}, 100);
this.resizingKey = '';
document.removeEventListener('mousemove', this.handleColumnResizeMove);
document.removeEventListener('mouseup', this.stopResizing);
},
loadXLGGList(index, value) {
const { XLWBBJDMX_XLXHID, XLWBBJDMX_XLGGID, XLWBBJDMX_XLBZID, XLWBBJDMX_DYDJID } = this.filteredItems[index];
const currentBJDID = getQueryParams()['BJDID'] || (document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373006.ashx';
GThinking.Web.AjaxServiceProxy.invoke('GetXLGGList', false, {
'sBJDID': currentBJDID,
'sXLXHID': XLWBBJDMX_XLXHID || ''
}, result => {
console.log('loadXLGGList:', result);
const exists = result.some(item => item.CodeID === value);
if (value && !exists) {
result.push({
CodeID: value,
CodeMC: value
});
}
this.xlggOptions = result;
}, CallBackNULLJSON, "GetXLGGList_CallBack");
},
loadXLBZList(index) {
const { XLWBBJDMX_XLXHID, XLWBBJDMX_XLGGID, XLWBBJDMX_XLBZID, XLWBBJDMX_DYDJID } = this.filteredItems[index];
const currentBJDID = getQueryParams()['BJDID'] || (document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373006.ashx';
GThinking.Web.AjaxServiceProxy.invoke('GetXLBZList', false, {
'sBJDID': currentBJDID,
'sXLXHID': XLWBBJDMX_XLXHID || '',
'sXLGGID': XLWBBJDMX_XLGGID || ''
}, result => {
console.log('loadXLBZList:', result);
this.xlbzOptions = result;
}, CallBackNULLJSON, "GetXLBZList_CallBack");
},
loadDYDJList(index, value) {
const { XLWBBJDMX_XLXHID, XLWBBJDMX_XLGGID, XLWBBJDMX_XLBZID, XLWBBJDMX_DYDJID } = this.filteredItems[index];
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke('GetDYDJList', false, {
'sBJDID': sBJDID,
'sXLXHID': XLWBBJDMX_XLXHID || '',
'sXLGGID': XLWBBJDMX_XLGGID || '',
'sXLBZID': XLWBBJDMX_XLBZID || ''
}, result => {
console.log('loadDYDJList:', result);
const exists = result.some(item => item.CodeID === value);
if (value && !exists) {
result.push({
CodeID: value,
CodeMC: value
});
}
this.dydjOptions = result;
}, CallBackNULLJSON, "GetDYDJList_CallBack");
},
handleChange(index, fieldName) {
let editedItem = this.filteredItems[index];
const sXLXHID = editedItem.XLWBBJDMX_XLXHID || ' ';
const sXLGGID = editedItem.XLWBBJDMX_XLGGID || ' ';
const sXLBZID = editedItem.XLWBBJDMX_XLBZID || ' ';
const sDYDJID = editedItem.XLWBBJDMX_DYDJID || ' ';
const sXLYSID = editedItem.XLWBBJDMX_XLYSID || ' ';
let sBGLM = '';
if (fieldName === 'XLWBBJDMX_XLXHID') {
sBGLM = 'XLXHID';
} else if (fieldName === 'XLWBBJDMX_XLGGID') {
sBGLM = 'XLGGID';
} else if (fieldName === 'XLWBBJDMX_DYDJID') {
sBGLM = 'DYDJID';
}
if (fieldName === 'XLWBBJDMX_XLBZID') {
if (sXLBZID && sXLBZID.trim() !== '' && this.xlbzAllOptions && this.xlbzAllOptions.length > 0) {
const xlbzAllOption = this.xlbzAllOptions.find(opt =>
opt.CodeID === sXLBZID
);
editedItem.XLBZ_XLBZLXMC = xlbzAllOption?.CodeMC || ' ';
} else {
editedItem.XLBZ_XLBZLXMC = ' ';
}
sBGLM = 'XLBZID';
console.log('XLBZLXMC:', editedItem.XLBZ_XLBZLXMC);
}
if (fieldName === 'XLWBBJDMX_XLYSID') {
const colorName = this.xlysOptions.find(
opt => opt.CodeID === sXLYSID
)?.CodeMC || '';
editedItem.XLYSB_XLYSMC = colorName;
}
const originalIndex = this.items.findIndex(
item => item.XLWBBJDMX_DRHH === editedItem.XLWBBJDMX_DRHH
);
if (originalIndex !== -1) {
this.items[originalIndex] = { ...editedItem };
}
console.log('handleChange:', index);
console.log('Parameters:', editedItem);
console.log('BGLM:', sBGLM);
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke('AfterBgBJCP', false, {
'sBJDID': sBJDID,
'CPXX': editedItem,
'sBGLM': sBGLM
}, result => {
console.log('AfterBgBJCP:', result);
editedItem.BHGXX = [];
if (result.XLXHHG !== undefined && result.XLXHHG !== null) {
editedItem.XLXHHG = result.XLXHHG;
if (editedItem.XLXHHG === 'N') {
editedItem.BHGXX.push({ type: 'warning', label: '型号' });
}
}
if (result.XLGGHG !== undefined && result.XLGGHG !== null) {
editedItem.XLGGHG = result.XLGGHG;
if (editedItem.XLGGHG === 'N') {
editedItem.BHGXX.push({ type: 'warning', label: '规格' });
}
}
if (result.DYDJHG !== undefined && result.DYDJHG !== null) {
editedItem.DYDJHG = result.DYDJHG;
if (editedItem.DYDJHG === 'N') {
editedItem.BHGXX.push({ type: 'warning', label: '电压等级' });
}
}
if (result.BJCPBHG !== undefined && result.BJCPBHG !== null) {
editedItem.BJCPBHG = result.BJCPBHG;
}
if (result.XLWBBJDMX_XLBZID && !editedItem.XLWBBJDMX_XLBZID) {
editedItem.XLWBBJDMX_XLBZID = result.XLWBBJDMX_XLBZID;
if (result.XLBZ_XLBZLXMC)
editedItem.XLBZ_XLBZLXMC = result.XLBZ_XLBZLXMC;
}
if (result.XLWBBJDMX_DYDJID && !editedItem.XLWBBJDMX_DYDJID) {
editedItem.XLWBBJDMX_DYDJID = result.XLWBBJDMX_DYDJID;
}
console.log('editedItem:', editedItem);
if (originalIndex !== -1) {
this.items[originalIndex] = { ...editedItem };
}
// 强制更新视图
//this.$forceUpdate();
}, CallBackNULLJSON, "AfterBgBJCP_CallBack");
},
handleFieldChange(rowIndex, fieldName, newValue) {
const editedItem = this.filteredItems[rowIndex];
const originalIndex = this.items.findIndex(
item => item.XLWBBJDMX_DRHH === editedItem.XLWBBJDMX_DRHH
);
if (originalIndex !== -1) {
this.items[originalIndex][fieldName] = newValue;
}
if (fieldName === 'XLWBBJDMX_XLYSID') {
const colorName = this.xlysOptions.find(
opt => opt.CodeID === newValue
)?.CodeMC || '';
editedItem.XLYSB_XLYSMC = colorName;
this.items[originalIndex].XLYSB_XLYSMC = colorName;
}
},
getUniqueFilters(prop) {
const uniqueValues = new Set(this.items.map(item => item[prop]));
const sortedUniqueValues = Array.from(uniqueValues).sort((a, b) =>
a.localeCompare(b, undefined, {
numeric: true,
sensitivity: 'base',
caseFirst: 'false'
})
);
return Array.from(sortedUniqueValues).map(value => ({ text: value, value }));
},
importQuoteDetails() {
if (this.importing)
return;
this.importing = true;
this.showLoading = true;
const nonCompliantItems = this.filteredItems.filter(item => item.BJCPBHG === 'Y');
this.InsertBJDMX(this.items);
// if (nonCompliantItems.length > 0) {
// this.nonCompliantItems = nonCompliantItems;
// this.dialogVisible = true;
// } else {
// this.InsertBJDMX(this.items);
// }
},
handleClose(done) {
this.dialogVisible = false;
done();
},
continueImport() {
this.dialogVisible = false;
this.InsertBJDMX(this.items);
},
InsertBJDMX(items) {
// 调用服务端红本验证方法
console.log('Checking redbook coverage...');
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke('IFFGQCP', false, {
'sBJDID': sBJDID
}, result => {
console.log('IFFGQCP response:', result);
// 3. 处理验证结果(result直接是字符串)
if (result === 'N') {
// 验证未通过时显示确认提示
this.showLoading = false;
this.$confirm('当前导入明细产品未完全覆盖红本,是否继续?', '操作确认', {
confirmButtonText: '继续导入',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// 用户确认后执行插入操作
this.showLoading = true;
this.executeInsert(items);
}).catch(() => {
// 用户取消操作
this.showLoading = false;
this.importing = false;
this.$message({
type: 'info',
message: '操作已取消',
duration: 2000
});
});
} else {
// 4. 验证通过(返回不是'N')时直接执行插入
console.log('红本验证通过:', result);
this.executeInsert(items);
}
}, (error) => {
this.showLoading = false;
this.importing = false;
ElMessage.error({
message: '网络异常或服务错误',
duration: 2000,
showClose: false
});
}, "IFFGQCP_CallBack");
},
// 提取的插入执行方法(保持不变)
executeInsert(items) {
console.log('Inserting details:', items);
this.SFDR = false;
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke('InsertBJDMX', false, {
'InfoList': items
}, result => {
console.log('InsertBJDMX response:', result);
if (result?.Success) {
this.showLoading = false;
const successMsg = result.Message || '导入成功!';
ElMessage.success({
message: successMsg,
duration: 3000,
showClose: false
});
// 3秒后关闭界面
setTimeout(() => {
this.SFDR = true;
this.closePanel();
this.importing = false;
}, 3000);
} else {
this.showLoading = false;
this.importing = false;
const errorMsg = result?.ErrorMessage || '未知错误';
ElMessage.error({
message: errorMsg,
duration: 3000,
showClose: false
});
}
}, (error) => {
this.showLoading = false;
this.importing = false;
ElMessage.error({
message: '网络异常或服务错误',
duration: 2000,
showClose: false
});
}, "InsertBJDMX_CallBack");
},
handleEditClick(index) {
if (this.currentEditIndex === index) {
this.currentEditIndex = -1
} else {
const prev = this.currentEditIndex;
this.currentEditIndex = index;
this.$nextTick(() => {
if (prev > -1) {
this.filteredItems[prev] = {
...this.filteredItems[prev]
};
}
});
}
},
handlePreview() {
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
//获取预览文件信息
GThinking.Web.AjaxServiceProxy.invoke('GetYLXX', false, {
'sBJDID': sBJDID
}, result => {
console.log('GetYLXX:', result);
this.WJLX = result.WJLX;
this.DOCGRPID = result.DOCGRPID;
this.RWJXJG = result.RWJXJG;
this.XZJG = result.XZJG;
this.RWWCSJ = result.RWWCSJ;
sessionStorage.setItem('quoteData', result.RWJXJG);
sessionStorage.setItem('XZJGData', result.XZJG);
sessionStorage.setItem("quoteBJDID", sBJDID);
sessionStorage.setItem('RWWCSJ', this.RWWCSJ);
const sourceElement = topDocument.getElementById('divBYZDY_102373016');
if (sourceElement) {
sessionStorage.setItem('OpenMoudle', '102373016');
} else {
sessionStorage.setItem('OpenMoudle', '102849002');
}
if (this.WJLX && (this.WJLX.toUpperCase() === 'XLS' || this.WJLX.toUpperCase() === 'XLSX')) {
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'GetFileUrlJDLJ',
false,
{ DOCGRPID: this.DOCGRPID },
(result) => this.handleFileUrlJDLJCallback(result),
(error) => ElMessage.error(`获取文件失败: ${error}`),
"GetFileUrl_CallBack",
40000
);
}
else
{
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'GetFileUrl',
false,
{ DOCGRPID: this.DOCGRPID },
(result) => this.handleFileUrlCallback(result),
(error) => ElMessage.error(`获取文件失败: ${error}`),
"GetFileUrl_CallBack",
40000
);
}
}, CallBackNULLJSON, "GetYLXX_CallBack")
},
handleFileUrlCallback(result) {
console.log("GetFileUrlJDLJ 返回结果:", result);
if (!result || result === '') {
ElMessage.error('文件路径不存在');
return;
}
const basePath = '../../work/temp/S_XLXSBJ/';
const fullUrl = basePath + result;
this.openPreview(fullUrl);
},
handleFileUrlJDLJCallback(result) {
console.log("GetFileUrlJDLJ 返回结果:", result);
if (!result || result === '') {
ElMessage.error('文件路径不存在');
return;
}
const basePath = '../../work/temp/S_XLXSBJ/';
const fullUrl = basePath + result;
this.openPreview(result);
},
openPreview(fileUrl) {
this.previewUrl = fileUrl;
const ext = fileUrl.split('.').pop().toLowerCase();
this.fileExtension = ext;
const imageTypes = ['png', 'jpg', 'jpeg', 'gif'];
const officeTypes = ['xls', 'xlsx'];
// 获取当前页面的协议、域名和端口
// 拼接动态地址
const basePath = '../Components/N_XLBJAIZL/';
if (imageTypes.includes(ext)) {
this.previewType = 'image';
sessionStorage.setItem('imageFilePath', fileUrl);
const pageName = 'ImageCompare.html';
const sUrl = basePath + pageName;
this.showZDYDIVWJYL(sUrl);
} else if (ext === 'pdf') {
this.previewType = 'pdf';
sessionStorage.setItem('pdfFilePath', fileUrl);
const pageName = 'PDFCompare.html';
const sUrl = basePath + pageName;
this.showZDYDIVWJYL(sUrl);
//this.$message.error('PDF暂不支持预览!');
// this.previewType = 'pdf';
// this.currentPdfPage = 1;
// this.pdfSource = fileUrl;
// console.log("fileUrl 返回结果:", fileUrl);
} else if (officeTypes.includes(ext)) {
this.previewType = 'office';
sessionStorage.setItem('excelFilePath', fileUrl);
const pageName = 'ExcelCompare.html';
const sUrl = basePath + pageName;
this.showZDYDIVWJYL(sUrl);
//this.officePreviewUrl = `https://view.officeapps.live.com/op/view.aspx?src=${encodeURIComponent(fileUrl)}`;
} else {
sessionStorage.setItem("wordFilePath", fileUrl);
const pageName = "WordCompare.html";
const sUrl = basePath + pageName;
this.showZDYDIVWJYL(sUrl);
}
//console.log("officePreviewUrl 返回结果:", this.officePreviewUrl);
},
showZDYDIVWJYL(url) {
console.log('开始加载iframe,URL:', url);
// 创建内部容器div_ZDY2
const innerContainer = document.createElement('div');
innerContainer.id = 'divZDY_102849002_WJYL';
innerContainer.style.width = '100%';
innerContainer.style.height = '100%';
// 创建iframe元素
const iframe = document.createElement('iframe');
iframe.id = 'iframeZDY_102849002_WJYL';
iframe.style.width = '100%';
iframe.style.height = '100%';
iframe.style.marginLeft = 'auto';
iframe.style.backgroundColor = '#ffffff';
iframe.src = url;
iframe.scrolling = 'no';
iframe.frameBorder = '0';
// 添加iframe加载完成事件监听
iframe.onload = function() {
console.log('iframe加载完成');
try {
// 尝试访问iframe内部的文档
const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
console.log('iframe文档状态:', iframeDoc.readyState);
// 检查iframe中的脚本是否有错误
if (iframe.contentWindow.console) {
console.log('iframe控制台可用');
}
// 发送消息到iframe
setTimeout(() => {
console.log('向iframe发送消息...');
iframe.contentWindow.postMessage({
type: 'INIT',
quoteData: sessionStorage.getItem('quoteData'),
filePath: sessionStorage.getItem('excelFilePath')
}, '*');
}, 1000);
} catch (error) {
console.error('访问iframe内容时出错:', error);
alert('加载iframe内容失败: ' + error.message);
}
};
// 添加iframe加载错误事件监听
iframe.onerror = function() {
console.error('iframe加载错误');
alert('iframe加载失败,请检查URL是否正确');
};
// 确保父容器存在
var parentDiv = topDocument.getElementById('div_BYZDY');
var OpenAlone = sessionStorage.getItem("OpenAlone") || '';
if (OpenAlone === "Y") {
url = url.replace("../Components/N_XLBJAIZL/","");
}
iframe.src = url;
if (parentDiv) {
//parentDiv.innerHTML = '';
parentDiv.appendChild(iframe);
parentDiv.style.display = "block";
console.log('iframe已添加到父容器');
var divBYZDY_102373016 = topDocument.getElementById('divBYZDY_102373016');
if (divBYZDY_102373016) {
divBYZDY_102373016.style.display='none';
}
} else {
console.error('找不到父容器div_BYZDY');
alert('找不到容器元素,请检查页面结构');
return;
}
innerContainer.style.display = 'flex';
// 创建一个包含 @keyframes 规则的样式标签
const style = topDocument.createElement('style');
style.innerHTML = "@keyframes slideInFromRight {0% {transform: translateX(100%);opacity: 0;}100% {transform: translateX(0);opacity: 1;}}";
topDocument.head.appendChild(style);
// 设置内联动画样式
innerContainer.style.animation = 'slideInFromRight 0.5s ease-out forwards';
console.log('iframe加载流程已完成,等待加载事件...');
},
showDXTH() {
this.showReplaceButton = false;
ElMessageBox.confirm(
'确认后将清空型号、规格、标准、电压等级,重新解析替换,是否继续?',
'操作确认',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
this.handleDXTH();
}).catch(() => {
// 用户点击“取消”
});
},
handleDXTH() {
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke('CXDXTH', false, {
'sBJDID': sBJDID
}, result => {
if (result && result.Success === true) {
GThinking.Web.AjaxServiceProxy.invoke('GetXLCPList', false, {
'sBJDID': sBJDID
}, result => {
console.log("GetXLCPList_CallBack");
console.log(result);
const processedData = result.map(item => {
const bhgxx = [];
if (item.XLXHHG === 'N') {
bhgxx.push({ type: 'warning', label: '型号' });
}
if (item.XLGGHG === 'N') {
bhgxx.push({ type: 'warning', label: '规格' });
}
if (item.DYDJHG === 'N') {
bhgxx.push({ type: 'warning', label: '电压等级' });
}
return {
...item,
BHGXX: bhgxx
};
});
this.items = processedData;
this.resetFilters();
ElMessage.success({
message: '等效替换成功!',
duration: 3000,
type: 'success',
showClose: false
});
}, CallBackNULLJSON, "GetXLCPList_CallBack");
} else {
const errorMessage = result.ErrorMessage || '未知错误';
ElMessage.error({
message: errorMessage,
duration: 3000,
type: 'error',
showClose: false
});
}
}, CallBackNULLJSON, "DXTH_CallBack");
},
showPP() {
this.showReplaceButton = false;
ElMessageBox.confirm(
'是否匹配标准和电压等级?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
this.handlePP();
}).catch(() => {
// 用户点击“取消”
});
},
handlePP() {
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke('PPBZDYDJ', false, {
'sBJDID': sBJDID
}, result => {
if (result && result.Success === true) {
GThinking.Web.AjaxServiceProxy.invoke('GetXLCPList', false, {
'sBJDID': sBJDID
}, result => {
console.log("GetXLCPList_CallBack");
console.log(result);
const processedData = result.map(item => {
const bhgxx = [];
if (item.XLXHHG === 'N') {
bhgxx.push({ type: 'warning', label: '型号' });
}
if (item.XLGGHG === 'N') {
bhgxx.push({ type: 'warning', label: '规格' });
}
if (item.DYDJHG === 'N') {
bhgxx.push({ type: 'warning', label: '电压等级' });
}
return {
...item,
BHGXX: bhgxx
};
});
this.items = processedData;
this.resetFilters();
ElMessage.success({
message: '匹配成功!',
duration: 3000,
type: 'success',
showClose: false
});
}, CallBackNULLJSON, "GetXLCPList_CallBack");
} else {
const errorMessage = result.ErrorMessage || '未知错误';
ElMessage.error({
message: errorMessage,
duration: 3000,
type: 'error',
showClose: false
});
}
}, CallBackNULLJSON, "PP_CallBack");
},
showQK() {
this.showReplaceButton = false;
ElMessageBox.confirm(
'是否清空筛选记录的标准和电压等级后重新匹配?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
this.handleQK();
}).catch(() => {
// 用户点击“取消”
});
},
handleQK() {
const sXHList = this.filteredItems.map(item => item.XLWBBJDMX_DRHH).join(',');
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke('QKHPPBZDYDJ', false, {
'sBJDID': sBJDID,
'sXHList': sXHList
}, result => {
if (result && result.Success === true) {
GThinking.Web.AjaxServiceProxy.invoke('GetXLCPList', false, {
'sBJDID': sBJDID
}, result => {
console.log("GetXLCPList_CallBack");
console.log(result);
const processedData = result.map(item => {
const bhgxx = [];
if (item.XLXHHG === 'N') {
bhgxx.push({ type: 'warning', label: '型号' });
}
if (item.XLGGHG === 'N') {
bhgxx.push({ type: 'warning', label: '规格' });
}
if (item.DYDJHG === 'N') {
bhgxx.push({ type: 'warning', label: '电压等级' });
}
return {
...item,
BHGXX: bhgxx
};
});
this.items = processedData;
this.resetFilters();
ElMessage.success({
message: '匹配成功!',
duration: 3000,
type: 'success',
showClose: false
});
}, CallBackNULLJSON, "GetXLCPList_CallBack");
} else {
const errorMessage = result.ErrorMessage || '未知错误';
ElMessage.error({
message: errorMessage,
duration: 3000,
type: 'error',
showClose: false
});
}
}, CallBackNULLJSON, "QK_CallBack");
},
// 加载数据
loadData() {
this.showLoading = true;
this.loadingProgress = 0; // 立即重置进度
// 重新加载数据时清空已选记录,避免旧数据残留导致状态不一致
this.selectedRows = [];
this.selectedRowMap = {};
// 直接启动进度条,不依赖监听器
this.$nextTick(() => {
this.startLoadingProgress();
});
const currentBJDID = getQueryParams()['BJDID'] || (document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
const currentBJFLID = getQueryParams()['BJFLID'] || (document.getElementById('txtBJFLID') ? document.getElementById('txtBJFLID').value : '') || '';
const currentBJDYZ = getQueryParams()['BJDYZ'] || (document.getElementById('txtBJDYZ') ? document.getElementById('txtBJDYZ').value : '') || '';
console.log('loadData - BJDID:', currentBJDID);
if (!currentBJDID) {
ElMessage.warning('报价单ID不能为空');
this.items = [];
this.showLoading = false;
return;
}
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'GetPLTJData',
false,
{
BJDID: currentBJDID,
BJDYZ: currentBJDYZ || '',
sortField: this.sortField || '',
sortOrder: this.sortOrder || '',
CPYT: this.queryConditions.CPYT && this.queryConditions.CPYT.length > 0 ? this.queryConditions.CPYT.join(',') : '',
XLJGID: this.queryConditions.XLJGID || '',
XLGGID: this.queryConditions.XLGGID || '',
ZJMS: this.queryConditions.ZJMS || '',
ZJMZ: this.queryConditions.ZJMZ || '',
BJSLS: this.queryConditions.BJSLS || '',
BJSLZ: this.queryConditions.BJSLZ || '',
BJJES: this.queryConditions.BJJES || '',
BJJEZ: this.queryConditions.BJJEZ || '',
DJS: this.queryConditions.DJS || '',
DJZ: this.queryConditions.DJZ || '',
JMBGS: this.queryConditions.JMBGS || '',
BH: this.queryConditions.BH && this.queryConditions.BH.length > 0 ? this.queryConditions.BH.join(',') : '',
XJBJCEWF: this.queryConditions.XJBJCEWF ? 'Y' : ''
},
result => {
console.log('GetPLTJData result:', result);
// 延迟5秒用于测试进度条效果
setTimeout(() => {
if (result && Array.isArray(result)) {
this.items = result;
this.applyFilter();
if (result.length === 0) {
ElMessage.info('没有查询到数据');
}
} else if (result && result.d && Array.isArray(result.d)) {
this.items = result.d;
this.applyFilter();
} else {
console.log('数据格式异常,result:', result);
ElMessage.warning('数据格式异常: ' + (typeof result === 'object' ? JSON.stringify(result) : result));
this.items = [];
}
this.showLoading = false;
// 确保显示
this.$nextTick(() => {
const appElement = document.getElementById('app');
if (appElement) {
appElement.style.opacity = '1';
appElement.style.pointerEvents = 'auto';
}
});
}, 100); // 延迟0.1秒
},
error => {
console.error('加载数据失败:', error);
// 延迟5秒用于测试进度条效果
setTimeout(() => {
ElMessage.error('加载数据失败: ' + (error || '未知错误'));
this.items = [];
this.showLoading = false;
// 确保显示(即使加载失败)
this.$nextTick(() => {
const appElement = document.getElementById('app');
if (appElement) {
appElement.style.opacity = '1';
appElement.style.pointerEvents = 'auto';
}
});
}, 100); // 延迟0.1秒
},
'GetPLTJData_CallBack',
40000
);
},
// 加载列显示配置
loadColumnVisibility() {
// 获取 BJDID
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') ||
sBJDID || '';
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'GetColumnVisibility',
false,
{
BJDID: currentBJDID || ''
},
result => {
console.log('列显示配置:', result);
if (result && typeof result === 'object') {
// 合并列可见性配置,确保布尔值正确传递
Object.keys(result).forEach(key => {
this.columnVisibility[key] = result[key] === true;
});
// 注意:showLSBJ 现在由 loadQueryOptions 从后端返回的 QueryVisibility 中获取
// 列可见性配置加载完成后,重新加载动态列配置(根据可见性过滤)
this.loadDynamicColumns();
// 强制重新生成列(触发响应式更新)
this.$forceUpdate();
}
},
error => {
console.error('加载列显示配置失败:', error);
},
'GetColumnVisibility_CallBack',
40000
);
},
// 加载按钮配置
loadButtonConfig() {
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') ||
sBJDID || '';
console.log('loadButtonConfig: 开始加载按钮配置,BJDID=', currentBJDID);
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'GetButtonConfig',
false,
{
BJDID: currentBJDID || ''
},
result => {
console.log('按钮配置:', result);
if (result && typeof result === 'object') {
// 服务端返回格式:{ ButtonVisibility: {...}, DynamicYZButtons: [...], JMBGSButtonText: "..." }
if (result.ButtonVisibility) {
this.buttonVisibility = { ...this.buttonVisibility, ...result.ButtonVisibility };
// 注意:showJMBGS 和 showXJBJ 现在由 loadQueryOptions 从后端返回的 QueryVisibility 中获取
}
if (result.DynamicYZButtons) {
this.dynamicYZButtons = result.DynamicYZButtons;
}
if (result.BJDYZ) {
this.bjdyz = result.BJDYZ;
}
if (result.JMBGSButtonText) {
this.jmbgsButtonText = result.JMBGSButtonText;
}
// 按钮配置加载完成后,重新加载动态列配置(以获取因子标签和 BJDYZ)
this.loadDynamicColumns();
}
},
error => {
console.error('loadButtonConfig: 加载按钮配置失败', error);
},
'GetButtonConfig_CallBack',
40000
);
},
// 加载是否使用产品目录
loadUseCPML() {
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'GetUseCPML',
false,
{},
result => {
console.log('是否使用产品目录:', result);
this.useCPML = result === true;
// 强制更新列标题
this.$nextTick(() => {
this.$forceUpdate();
});
},
error => {
console.error('loadUseCPML: 加载失败', error);
this.useCPML = false; // 默认使用产品用途
},
'GetUseCPML_CallBack',
40000
);
},
// 加载查询选项
loadQueryOptions() {
const currentBJDID = getQueryParams()['BJDID'] || '';
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'GetQueryOptions',
false,
{
BJDID: currentBJDID
},
result => {
console.log('查询选项:', result);
if (result && typeof result === 'object') {
// 映射后端返回的选项(如果存在)
if (result.CPYTOptions) {
this.cpytOptions = result.CPYTOptions.map(item => ({
value: item.value || item.CPYT,
label: item.label || item.CPYTMC || item.text || item.value,
CPYT: item.value || item.CPYT,
CPYTMC: item.label || item.CPYTMC || item.text
}));
}
if (result.BHOptions) {
this.bhOptions = result.BHOptions.map(item => ({
value: item.value || item.BH,
label: item.label || item.text || item.value
}));
}
// 从后端返回的 QueryVisibility 中获取查询项可见性配置
if (result.QueryVisibility) {
if (typeof result.QueryVisibility.showJMBGS === 'boolean') {
this.showJMBGS = result.QueryVisibility.showJMBGS;
}
if (typeof result.QueryVisibility.showLSBJ === 'boolean') {
this.showLSBJ = result.QueryVisibility.showLSBJ;
}
if (typeof result.QueryVisibility.showBH === 'boolean') {
this.showBH = result.QueryVisibility.showBH;
}
if (typeof result.QueryVisibility.showXJBJ === 'boolean') {
this.showXJBJ = result.QueryVisibility.showXJBJ;
}
}
}
},
error => {
console.error('加载查询选项失败:', error);
},
'GetQueryOptions_CallBack',
40000
);
},
// 加载小数位数配置
loadDecimalPlaces() {
const CPBJMRXSWS = getQueryParams()['CPBJMRXSWS'] ||
(document.getElementById('txtCPBJMRXSWS') ? document.getElementById('txtCPBJMRXSWS').value : '') || '';
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'GetDecimalPlaces',
false,
{
CPBJMRXSWS: CPBJMRXSWS
},
result => {
console.log('小数位数配置:', result);
if (result && typeof result === 'object') {
this.decimalPlaces = { ...this.decimalPlaces, ...result };
}
},
error => {
console.error('加载小数位数配置失败:', error);
},
'GetDecimalPlaces_CallBack',
40000
);
},
// 加载动态列配置(完全根据服务端的列可见性配置生成)
// 服务端返回的列可见性配置中,TZYZ_BJ01, TZYZ_BJ02 等字段名是基于索引位置的
// 对于可见的列(visible = true),生成对应的动态列
loadDynamicColumns() {
this.dynamicColumns = [];
// 如果没有列可见性配置,无法生成动态列
if (!this.columnVisibility || Object.keys(this.columnVisibility).length === 0) {
console.log('loadDynamicColumns: 列可见性配置为空,等待配置加载');
return;
}
// 获取 BJDYZ(优先从服务端返回,其次从参数或页面元素)
const currentBJDYZ = this.bjdyz ||
getQueryParams()['BJDYZ'] ||
(document.getElementById('txtBJDYZ') ? document.getElementById('txtBJDYZ').value : '') || '';
// 构建因子ID到原始标签的映射(从 BJDYZ 解析)
const yzIdToRawLabelMap = {};
const yzIdToTJLXMap = {}; // 因子ID到TJLX的映射
if (currentBJDYZ) {
const sBJDYZ = currentBJDYZ.split(',');
for (let i = 0; i < sBJDYZ.length && i < 20; i++) {
const sYZItem = sBJDYZ[i].trim();
if (!sYZItem) continue;
const parts = sYZItem.split('|');
if (parts.length >= 2) {
const yzId = parts[0].trim();
const rawLabel = parts[1].trim(); // 原始标签,包含后缀如 (JD), (JJ) 等
yzIdToRawLabelMap[yzId] = rawLabel;
// 从 dynamicYZButtons 中获取 TJLX
if (this.dynamicYZButtons && Array.isArray(this.dynamicYZButtons)) {
const btn = this.dynamicYZButtons.find(b => b.YZID === yzId);
if (btn && btn.TJLX) {
yzIdToTJLXMap[yzId] = btn.TJLX;
}
}
}
}
}
console.log('loadDynamicColumns: 列可见性配置:', this.columnVisibility);
console.log('loadDynamicColumns: 因子原始标签映射:', yzIdToRawLabelMap);
console.log('loadDynamicColumns: 因子TJLX映射:', yzIdToTJLXMap);
// 遍历所有可能的因子列位置(TZYZ_BJ01 到 TZYZ_BJ20)
for (let i = 1; i <= 20; i++) {
const dataFieldName = 'TZYZ_BJ' + i.toString().padStart(2, '0'); // TZYZ_BJ01, TZYZ_BJ02 等
// 检查列可见性配置
if (this.columnVisibility.hasOwnProperty(dataFieldName)) {
const isVisible = this.columnVisibility[dataFieldName] === true;
if (!isVisible) {
console.log(`跳过不可见列 [${i}]: ${dataFieldName}`);
continue;
}
// 获取因子标签(参考 XLBJD_PLTJList 的逻辑)
const yzId = 'BJ' + i.toString().padStart(2, '0');
let yzLabel = '';
// 从 BJDYZ 中获取原始标签
const rawLabel = yzIdToRawLabelMap[yzId];
if (rawLabel) {
// 根据 TJLX 处理标签(参考 XLBJD_PLTJList 的逻辑)
const tjlx = yzIdToTJLXMap[yzId] || '';
if (tjlx === '1') {
// 调价格:TJLX == "1"
yzLabel = rawLabel
.replace(/\(\)/g, '')
.replace(/\(JD\)/g, '(%)')
.replace(/\(JJ\)/g, '(元)')
.replace(/\(KD\)/g, '(%)')
.replace(/\(MD\)/g, '(%)')
.replace(/\(DD\)/g, '(%)')
.replace(/\(XX\)/g, '(不参与调价)')
.replace(/\(MX\)/g, '')
.replace(/\(DX\)/g, '')
.replace(/\(SX\)/g, '(%)')
.replace(/\(MP\)/g, '(%)');
} else {
// 调因子值:TJLX != "1"
yzLabel = rawLabel
.replace(/\(\)/g, '')
.replace(/\(JD\)/g, '(%)')
.replace(/\(JJ\)/g, '')
.replace(/\(KD\)/g, '(%)')
.replace(/\(MP\)/g, '(%)');
}
} else {
// 如果 BJDYZ 中没有,尝试从 dynamicYZButtons 中获取(作为后备)
if (this.dynamicYZButtons && Array.isArray(this.dynamicYZButtons)) {
const btn = this.dynamicYZButtons.find(b => b.YZID === yzId);
if (btn && btn.Text) {
yzLabel = btn.Text;
}
}
// 如果还是没有,使用默认标签
if (!yzLabel) {
yzLabel = `因子${i}`;
}
}
// 根据后缀确定小数位数
let decimalPlace = this.iXSWS || 5;
if (rawLabel && (rawLabel.endsWith('(MX)') || rawLabel.endsWith('(DX)'))) {
decimalPlace = 4;
} else {
decimalPlace = 2;
}
console.log(`添加动态列 [${i}]: ${dataFieldName} (${yzLabel}), 可见: ${isVisible}, 小数位: ${decimalPlace}`);
this.dynamicColumns.push({
prop: dataFieldName, // 使用数据字段名(TZYZ_BJ01, TZYZ_BJ02 等)来读取服务端数据
label: yzLabel,
width: 100,
align: 'right',
visible: true,
decimalPlace: decimalPlace
});
}
}
console.log('动态列配置最终结果:', this.dynamicColumns);
console.log('动态列数量:', this.dynamicColumns.length);
},
// 获取小数位数
getDecimalPlace(fieldName) {
return this.decimalPlaces[fieldName] || this.iXSWS || 5;
},
// 格式化数字
formatNumber(value, decimals = 2) {
if (value === null || value === undefined || value === '') return '0';
const num = parseFloat(value);
if (isNaN(num)) return '0';
return num.toFixed(decimals);
},
// 报价锁定下拉菜单
handleLockCommand(command) {
const isLock = command === 'BJSD-SD';
// 确定锁定范围 - 只对勾选的记录进行操作
if (this.selectedRows.length === 0) {
ElMessage.warning('请先选择要操作的记录');
return;
}
const sBJDXHList = this.selectedRows.map(row => row.XH || row.XLXSBJDMX_XH).join(',');
const sPLSZAll = 'N'; // N=勾选记录
this.showLoading = true;
const currentBJDID = getQueryParams()['BJDID'] || '';
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'BatchLock',
false,
{
BJDID: currentBJDID,
lockType: isLock ? 'Y' : 'N',
PLSZAll: sPLSZAll,
selectedIds: sBJDXHList
},
result => {
if (result && result.success !== false) {
ElMessage.success(isLock ? '锁定成功' : '解锁成功');
this.loadData();
} else {
ElMessage.error(result?.msg || (isLock ? '锁定失败' : '解锁失败'));
}
this.showLoading = false;
},
error => {
ElMessage.error((isLock ? '锁定失败' : '解锁失败') + ': ' + (error || '未知错误'));
this.showLoading = false;
},
'BatchLock_CallBack',
40000
);
},
// 报价上浮
handlePriceUp() {
this.priceUpForm = {
range: this.selectedRows.length > 0 ? 'N' : 'C',
value: 0,
rangeOptions: this.selectedRows.length > 0 ? ['N', 'Y', 'C'] : ['Y', 'C'],
formulaLabel: '新报价=原报价/(1-'
};
this.priceUpDialogVisible = true;
},
// 确认报价上浮
confirmPriceUp() {
if (!this.priceUpForm.value) {
ElMessage.warning('请输入上浮值');
return;
}
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
const currentBJFLID = getQueryParams()['BJFLID'] ||
(document.getElementById('txtBJFLID') ? document.getElementById('txtBJFLID').value : '') || '';
const JCLLX = getQueryParams()['JCLLX'] ||
(document.getElementById('txtJCLLX') ? document.getElementById('txtJCLLX').value : '') || '';
const LJJCLLX = getQueryParams()['LJJCLLX'] ||
(document.getElementById('txtLJJCLLX') ? document.getElementById('txtLJJCLLX').value : '') || '';
const CPBJMRXSWS = getQueryParams()['CPBJMRXSWS'] ||
(document.getElementById('txtCPBJMRXSWS') ? document.getElementById('txtCPBJMRXSWS').value : '') || '';
let sBJDXHList = '';
let sPLSZAll = 'C';
if (this.priceUpForm.range === 'N') {
if (this.selectedRows.length === 0) {
ElMessage.warning('请先选择要调价的记录');
return;
}
sPLSZAll = 'N';
sBJDXHList = this.selectedRows.map(row => row.XH || row.XLXSBJDMX_XH).join(',');
} else if (this.priceUpForm.range === 'Y') {
sPLSZAll = 'Y';
} else {
// 所查记录:只传当前筛选集合,且改用 PLSZAll='N' 限制更新范围
sPLSZAll = 'N';
sBJDXHList = this.getFilteredIds();
if (!sBJDXHList) {
ElMessage.warning('当前无可调价的所查记录');
this.showLoading = false;
return;
}
}
this.showLoading = true;
console.log('调用 BatchPriceAdjust (报价上浮):', {
BJDID: currentBJDID,
adjustType: 'up',
range: this.priceUpForm.range,
value: this.priceUpForm.value
});
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'BatchPriceAdjust',
false,
{
BJDID: currentBJDID || '',
adjustType: 'up',
range: this.priceUpForm.range || '',
value: String(this.priceUpForm.value || 0),
materialType: '',
materialValue: '0',
selectedIds: sBJDXHList || '',
PLSZAll: sPLSZAll || '',
JCLLX: JCLLX || '',
LJJCLLX: LJJCLLX || '',
CPBJMRXSWS: CPBJMRXSWS || ''
},
result => {
console.log('BatchPriceAdjust (报价上浮) 返回结果:', result);
this.showLoading = false;
if (result && result.success !== false) {
ElMessage.success('报价上浮成功');
this.priceUpDialogVisible = false;
this.loadData();
} else {
ElMessage.error(result?.msg || '报价上浮失败');
}
},
error => {
console.error('BatchPriceAdjust (报价上浮) 错误:', error);
this.showLoading = false;
ElMessage.error('报价上浮失败: ' + (error || '未知错误'));
},
'BatchPriceUp_CallBack',
40000
);
},
// 报价下浮
handlePriceDown() {
this.priceDownForm = {
range: this.selectedRows.length > 0 ? 'N' : 'C',
value: 0,
rangeOptions: this.selectedRows.length > 0 ? ['N', 'Y', 'C'] : ['Y', 'C'],
formulaLabel: '新报价=原报价*(1-'
};
this.priceDownDialogVisible = true;
},
// 确认报价下浮
confirmPriceDown() {
if (!this.priceDownForm.value) {
ElMessage.warning('请输入下浮值');
return;
}
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
const JCLLX = getQueryParams()['JCLLX'] ||
(document.getElementById('txtJCLLX') ? document.getElementById('txtJCLLX').value : '') || '';
const LJJCLLX = getQueryParams()['LJJCLLX'] ||
(document.getElementById('txtLJJCLLX') ? document.getElementById('txtLJJCLLX').value : '') || '';
const CPBJMRXSWS = getQueryParams()['CPBJMRXSWS'] ||
(document.getElementById('txtCPBJMRXSWS') ? document.getElementById('txtCPBJMRXSWS').value : '') || '';
let sBJDXHList = '';
let sPLSZAll = 'C';
if (this.priceDownForm.range === 'N') {
if (this.selectedRows.length === 0) {
ElMessage.warning('请先选择要调价的记录');
return;
}
sPLSZAll = 'N';
sBJDXHList = this.selectedRows.map(row => row.XH || row.XLXSBJDMX_XH).join(',');
} else if (this.priceDownForm.range === 'Y') {
sPLSZAll = 'Y';
} else {
sPLSZAll = 'N';
sBJDXHList = this.getFilteredIds();
if (!sBJDXHList) {
ElMessage.warning('当前无可调价的所查记录');
this.showLoading = false;
return;
}
}
this.showLoading = true;
console.log('调用 BatchPriceAdjust (报价下浮):', {
BJDID: currentBJDID,
adjustType: 'down',
range: this.priceDownForm.range,
value: this.priceDownForm.value
});
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'BatchPriceAdjust',
false,
{
BJDID: currentBJDID || '',
adjustType: 'down',
range: this.priceDownForm.range || '',
value: String(this.priceDownForm.value || 0),
materialType: '',
materialValue: '0',
selectedIds: sBJDXHList || '',
PLSZAll: sPLSZAll || '',
JCLLX: JCLLX || '',
LJJCLLX: LJJCLLX || '',
CPBJMRXSWS: CPBJMRXSWS || ''
},
result => {
console.log('BatchPriceAdjust (报价下浮) 返回结果:', result);
this.showLoading = false;
if (result && result.success !== false) {
ElMessage.success('报价下浮成功');
this.priceDownDialogVisible = false;
this.loadData();
} else {
ElMessage.error(result?.msg || '报价下浮失败');
}
},
error => {
console.error('BatchPriceAdjust (报价下浮) 错误:', error);
this.showLoading = false;
ElMessage.error('报价下浮失败: ' + (error || '未知错误'));
},
'BatchPriceDown_CallBack',
40000
);
},
// 批量调价
handleBatchPriceAdjust() {
this.batchPriceForm = {
adjustType: 'up',
range: this.selectedRows.length > 0 ? 'N' : 'C',
value: 0,
materialType: 'relative',
materialValue: 0
};
this.batchPriceDialogVisible = true;
},
// 确认批量调价
confirmBatchPriceAdjust() {
if (this.batchPriceForm.adjustType !== 'material' && !this.batchPriceForm.value) {
ElMessage.warning('请输入调价值');
return;
}
if (this.batchPriceForm.adjustType === 'material' && !this.batchPriceForm.materialValue) {
ElMessage.warning('请输入材料成本值');
return;
}
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
const JCLLX = getQueryParams()['JCLLX'] ||
(document.getElementById('txtJCLLX') ? document.getElementById('txtJCLLX').value : '') || '';
const LJJCLLX = getQueryParams()['LJJCLLX'] ||
(document.getElementById('txtLJJCLLX') ? document.getElementById('txtLJJCLLX').value : '') || '';
const CPBJMRXSWS = getQueryParams()['CPBJMRXSWS'] ||
(document.getElementById('txtCPBJMRXSWS') ? document.getElementById('txtCPBJMRXSWS').value : '') || '';
let sBJDXHList = '';
let sPLSZAll = 'C';
if (this.batchPriceForm.range === 'N') {
if (this.selectedRows.length === 0) {
ElMessage.warning('请先选择要调价的记录');
return;
}
sPLSZAll = 'N';
sBJDXHList = this.selectedRows.map(row => row.XH || row.XLXSBJDMX_XH).join(',');
} else if (this.batchPriceForm.range === 'Y') {
sPLSZAll = 'Y';
} else {
sPLSZAll = 'N';
sBJDXHList = this.getFilteredIds();
if (!sBJDXHList) {
ElMessage.warning('当前无可调价的所查记录');
this.showLoading = false;
return;
}
}
this.showLoading = true;
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'BatchPriceAdjust',
false,
{
BJDID: currentBJDID || '',
adjustType: this.batchPriceForm.adjustType || '',
range: this.batchPriceForm.range || '',
value: String(this.batchPriceForm.value || 0),
materialType: this.batchPriceForm.materialType || '',
materialValue: String(this.batchPriceForm.materialValue || 0),
selectedIds: sBJDXHList || '',
PLSZAll: sPLSZAll || '',
JCLLX: JCLLX || '',
LJJCLLX: LJJCLLX || '',
CPBJMRXSWS: CPBJMRXSWS || ''
},
result => {
console.log('BatchPriceAdjust 返回结果:', result);
this.showLoading = false;
if (result && result.success !== false) {
ElMessage.success('批量调价成功');
this.batchPriceDialogVisible = false;
this.loadData();
} else {
ElMessage.error(result?.msg || '批量调价失败');
}
},
error => {
console.error('BatchPriceAdjust 错误:', error);
this.showLoading = false;
ElMessage.error('批量调价失败: ' + (error || '未知错误'));
},
'BatchPriceAdjust_CallBack',
40000
);
},
// 关闭对话框方法
closePriceUpDialog() {
this.priceUpDialogVisible = false;
},
closePriceDownDialog() {
this.priceDownDialogVisible = false;
},
closeBatchPriceDialog() {
this.batchPriceDialogVisible = false;
},
// 打开查询条件抽屉
openQueryDrawer() {
this.queryDrawerVisible = true;
},
// 确认查询
confirmQueryDrawer() {
this.queryDrawerVisible = false;
this.loadData();
},
// 重置筛选
handleResetFilter() {
this.sortField = '';
this.sortOrder = '';
this.queryConditions = {
XLJGID: '',
XLGGID: '',
JMBGS: '',
ZJMS: '',
ZJMZ: '',
BJSLS: '',
BJSLZ: '',
BJJES: '',
BJJEZ: '',
DJS: '',
DJZ: '',
BH: [],
CPYT: [],
XJBJCEWF: false
};
this.applyFilter();
this.loadData();
},
// 基价表格式
handleJMBGS() {
ElMessage.info('基价表格式功能待实现');
},
// 料价价差率
handleMaterialPrice() {
const self = this;
// 获取 BJFLID,优先从 URL 参数或页面元素获取,如果为空则通过 BJDID 从后端获取
const { bjflid } = getBJFLIDAndBJDYZ();
const currentBJFLID = bjflid || getQueryParams()['BJFLID'] ||
(document.getElementById('txtBJFLID') ? document.getElementById('txtBJFLID').value : '') || '';
// 初始化表单
this.materialPriceForm = {
range: this.selectedRows.length > 0 ? 'N' : 'C',
rangeOptions: this.selectedRows.length > 0 ? ['N', 'Y', 'C'] : ['Y', 'C'],
referenceColumn: 'LJ', // 固定为料价价差率
adjustRatio: '',
materialType: 'XDZ',
hasNoTablePrice: false,
isNonPurchased: false,
canEditNonPurchased: true
};
this.materialPriceDialogVisible = true;
},
// 确认料价价差率
confirmMaterialPrice() {
if (!this.materialPriceForm.adjustRatio) {
ElMessage.warning('请输入调整比率');
return;
}
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
const JCLLX = getQueryParams()['JCLLX'] ||
(document.getElementById('txtJCLLX') ? document.getElementById('txtJCLLX').value : '') || '';
const LJJCLLX = getQueryParams()['LJJCLLX'] ||
(document.getElementById('txtLJJCLLX') ? document.getElementById('txtLJJCLLX').value : '') || '';
const CPBJMRXSWS = getQueryParams()['CPBJMRXSWS'] ||
(document.getElementById('txtCPBJMRXSWS') ? document.getElementById('txtCPBJMRXSWS').value : '') || '';
let sBJDXHList = '';
let sPLSZAll = 'C';
if (this.materialPriceForm.range === 'N') {
if (this.selectedRows.length === 0) {
ElMessage.warning('请先选择要调价的记录');
return;
}
sPLSZAll = 'N';
sBJDXHList = this.selectedRows.map(row => row.XH || row.XLXSBJDMX_XH).join(',');
} else if (this.materialPriceForm.range === 'Y') {
sPLSZAll = 'Y';
} else {
sPLSZAll = 'C';
}
if (sPLSZAll === 'C') {
// 所查 -> 仅当前筛选,改为 N + 列表限制
sPLSZAll = 'N';
sBJDXHList = this.getFilteredIds();
if (!sBJDXHList) {
ElMessage.warning('当前无可调价的所查记录');
this.showLoading = false;
return;
}
}
// 构建参数字符串:调价范围|参照栏目|调整比率|材料成本类型|无表价,非外购
const paramStr = [
this.materialPriceForm.range || 'C',
this.materialPriceForm.referenceColumn || '',
this.materialPriceForm.adjustRatio || '0',
this.materialPriceForm.materialType || 'XDZ',
(this.materialPriceForm.hasNoTablePrice ? 'Y' : 'N') + ',' + (this.materialPriceForm.isNonPurchased ? 'Y' : 'N')
].join('|');
this.showLoading = true;
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'BatchMaterialPriceAdjust',
false,
{
BJDID: currentBJDID,
paramStr: paramStr,
selectedIds: sBJDXHList,
PLSZAll: sPLSZAll,
JCLLX: JCLLX,
LJJCLLX: LJJCLLX,
CPBJMRXSWS: CPBJMRXSWS
},
result => {
if (result && result.success !== false) {
ElMessage.success('料价价差率调价成功');
this.materialPriceDialogVisible = false;
this.loadData();
} else {
ElMessage.error(result?.msg || '料价价差率调价失败');
}
this.showLoading = false;
},
error => {
ElMessage.error('料价价差率调价失败: ' + (error || '未知错误'));
this.showLoading = false;
},
'BatchMaterialPriceAdjust_CallBack',
40000
);
},
// 产品报价限价
handleBJXJ() {
this.bjxjForm = {
range: this.selectedRows.length > 0 ? 'N' : 'C',
rangeOptions: this.selectedRows.length > 0 ? ['N', 'Y', 'C'] : ['Y', 'C'],
kdValue: '',
jjValue: '',
onlyNegative: false
};
this.bjxjDialogVisible = true;
},
// 关闭产品报价限价对话框
closeBJXJDialog() {
this.bjxjDialogVisible = false;
},
// 确认产品报价限价
confirmBJXJ() {
if (!this.bjxjForm.kdValue && !this.bjxjForm.jjValue) {
ElMessage.warning('请输入报价限价扣点或报价限价加价');
return;
}
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
const JCLLX = getQueryParams()['JCLLX'] ||
(document.getElementById('txtJCLLX') ? document.getElementById('txtJCLLX').value : '') || '';
const LJJCLLX = getQueryParams()['LJJCLLX'] ||
(document.getElementById('txtLJJCLLX') ? document.getElementById('txtLJJCLLX').value : '') || '';
const CPBJMRXSWS = getQueryParams()['CPBJMRXSWS'] ||
(document.getElementById('txtCPBJMRXSWS') ? document.getElementById('txtCPBJMRXSWS').value : '') || '';
let sBJDXHList = '';
let sPLSZAll = 'C';
if (this.bjxjForm.range === 'N') {
if (this.selectedRows.length === 0) {
ElMessage.warning('请先选择要调价的记录');
return;
}
sPLSZAll = 'N';
sBJDXHList = this.selectedRows.map(row => row.XH || row.XLXSBJDMX_XH).join(',');
} else if (this.bjxjForm.range === 'Y') {
sPLSZAll = 'Y';
} else {
sPLSZAll = 'C';
}
this.showLoading = true;
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'BatchPriceLimit',
false,
{
BJDID: currentBJDID,
kdValue: this.bjxjForm.kdValue || '',
jjValue: this.bjxjForm.jjValue || '',
onlyNegative: this.bjxjForm.onlyNegative ? 'true' : 'false',
selectedIds: sBJDXHList,
PLSZAll: sPLSZAll,
JCLLX: JCLLX,
LJJCLLX: LJJCLLX,
CPBJMRXSWS: CPBJMRXSWS
},
result => {
if (result && result.success !== false) {
ElMessage.success('产品报价限价调价成功');
this.bjxjDialogVisible = false;
this.loadData();
} else {
ElMessage.error(result?.msg || '产品报价限价调价失败');
}
this.showLoading = false;
},
error => {
ElMessage.error('产品报价限价调价失败: ' + (error || '未知错误'));
this.showLoading = false;
},
'BatchPriceLimit_CallBack',
40000
);
},
// 材料用量比例
handleCLYLBL() {
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
if (!currentBJDID) {
ElMessage.error('无法获取报价单ID');
return;
}
// 打开材料用量比例页面
const url = '../N_XLXSBJ/XLBJD_CLYLBLInfo.aspx?BJDID=' + encodeURIComponent(currentBJDID);
window.open(url, '_blank', 'width=1200,height=800,scrollbars=yes,resizable=yes');
},
// 截面比公式
handleJMBGS() {
// 从后端获取截面比公式的配置信息
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
if (!currentBJDID) {
ElMessage.error('无法获取报价单ID');
return;
}
this.showLoading = true;
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'GetJMBGSYZID',
false,
{
BJDID: currentBJDID
},
result => {
this.showLoading = false;
if (result && result.Success !== false && result.YZID) {
// 获取因子详细信息
GThinking.Web.AjaxServiceProxy.invoke(
'GetYZInfo',
false,
{
YZID: result.YZID,
BJDID: currentBJDID
},
yzResult => {
this.showLoading = false;
if (yzResult && yzResult.Success !== false) {
// 使用因子对话框
this.yzForm = {
dialogTitle: result.JMBGSButtonText || '截面比公式',
range: this.selectedRows.length > 0 ? 'N' : 'C',
rangeOptions: this.selectedRows.length > 0 ? ['N', 'Y', 'C'] : ['Y', 'C'],
showReferenceColumn: yzResult.ShowReferenceColumn || false,
referenceColumn: '',
referenceColumnOptions: yzResult.ReferenceColumnOptions || [],
factorLabel: yzResult.FactorLabel || '因子值:',
factorValue: '',
factorUnit: yzResult.FactorUnit || '',
showOnlyNegative: yzResult.ShowOnlyNegative || false,
onlyNegative: false,
showHasTablePrice: yzResult.ShowHasTablePrice || false,
hasTablePrice: false,
showPurchased: yzResult.ShowPurchased || false,
isPurchased: false,
isNonPurchased: false,
YZID: result.YZID,
YZType: 'JMBGS',
JJFS: yzResult.JJFS || ''
};
this.yzDialogVisible = true;
} else {
ElMessage.error(yzResult?.Message || '获取因子信息失败');
}
},
error => {
this.showLoading = false;
ElMessage.error('获取因子信息失败: ' + (error || '未知错误'));
},
'GetYZInfo_CallBack',
40000
);
} else {
ElMessage.error(result?.Message || '获取截面比公式配置失败');
}
},
error => {
this.showLoading = false;
ElMessage.error('获取截面比公式配置失败: ' + (error || '未知错误'));
},
'GetJMBGSYZID_CallBack',
40000
);
},
// 处理因子按钮下拉命令
handleYZCommand(command, yzItem) {
if (!command || !yzItem) {
return;
}
// 解析命令
if (command.startsWith('CZ|')) {
// 重置操作:CZ|YZID|Text|TJYS
const parts = command.split('|');
if (parts.length >= 4) {
const yzid = parts[1];
const text = parts[2];
const tjys = parts[3];
this.handleYZReset(yzid, text, tjys);
}
} else if (command.startsWith('CL')) {
// 清空操作:CLBJ01
const yzidChild = command.substring(2);
this.handleYZClear(yzidChild, yzItem);
}
},
// 因子重置操作
handleYZReset(yzid, text, tjys) {
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
if (!currentBJDID || !yzid) {
ElMessage.error('无法获取报价单ID或因子ID');
return;
}
// 显示确认提示
ElMessageBox.confirm(
`即将重置当前记录所有明细的【${text}】,是否继续?`,
'操作确认',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
this.showLoading = true;
// 调用重置服务
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'ResetFactor',
false,
{
BJDID: currentBJDID,
YZID: yzid,
TJYS: tjys || ''
},
result => {
this.showLoading = false;
if (result && result.success) {
ElMessage.success(result.msg || '重置成功');
this.loadData();
} else {
ElMessage.error(result?.msg || '重置失败');
}
},
error => {
this.showLoading = false;
ElMessage.error('重置失败: ' + (error || '未知错误'));
},
'ResetFactor_CallBack',
40000
);
}).catch(() => {
// 用户取消操作
});
},
// 因子清空操作
handleYZClear(yzidChild, yzItem) {
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
if (!currentBJDID || !yzItem || !yzItem.YZID) {
ElMessage.error('无法获取报价单ID或因子ID');
return;
}
// 从 yzidChild 中提取实际的因子ID(去掉 CL 前缀,然后转换为 YZID)
// yzidChild 格式为 "CLBJ01",需要转换为对应的 YZID
// 这里需要根据 yzItem 来获取因子信息
const yzText = yzItem.Text || '';
// 显示确认提示
ElMessageBox.confirm(
`即将清空当前记录所有明细的【${yzText}】是否继续?`,
'操作确认',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
this.showLoading = true;
// 调用清空服务(将因子值设为0)
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'ClearFactor',
false,
{
BJDID: currentBJDID,
YZID: yzItem.YZID
},
result => {
this.showLoading = false;
if (result && result.success) {
ElMessage.success(result.msg || '清空成功');
this.loadData();
} else {
ElMessage.error(result?.msg || '清空失败');
}
},
error => {
this.showLoading = false;
ElMessage.error('清空失败: ' + (error || '未知错误'));
},
'ClearFactor_CallBack',
40000
);
}).catch(() => {
// 用户取消操作
});
},
// 动态因子按钮
handleYZButton(yzItem) {
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
if (!currentBJDID || !yzItem.YZID) {
ElMessage.error('无法获取报价单ID或因子ID');
return;
}
this.showLoading = true;
// 从后端获取因子详细信息
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'GetYZInfo',
false,
{
YZID: yzItem.YZID,
BJDID: currentBJDID
},
result => {
this.showLoading = false;
if (result && result.Success !== false) {
const bcytj = result.BCYTJ || 'N';
// 如果 BCYTJ === 'Y',不打开对话框,直接更新因子值
if (bcytj === 'Y') {
ElMessageBox.confirm(
'即将更新选中记录的因子值,是否继续?',
'操作确认',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => {
this.updateFactorValueDirectly(yzItem, result);
}).catch(() => {
// 用户取消操作
});
return;
}
// BCYTJ === 'N' 时,打开对话框
// 根据原实现构建因子对话框数据
const jjfs = result.JJFS || yzItem.JJFS || '';
const yzmc = result.YZMC || yzItem.Text || '因子调价';
let factorLabel = yzmc + ':';
let factorUnit = '';
// 根据计算方式设置单位
if (jjfs === 'JD' || jjfs === 'KD' || jjfs === 'SX' || jjfs === 'DD' || jjfs === 'MD' || jjfs === 'MP') {
factorUnit = '%';
} else if (jjfs === 'JJ') {
// 需要检查 TJLX,这里先默认使用元
factorUnit = '元';
} else if (jjfs === 'MX' || jjfs === 'DX') {
factorUnit = '';
}
// 解析默认调价范围
const mrtjfw = result.MRTJFW || '';
let hasTablePrice = false;
let isPurchased = false;
let isNonPurchased = false;
if (mrtjfw.indexOf('1') >= 0) {
hasTablePrice = true;
}
if (mrtjfw.indexOf('2') >= 0) {
isPurchased = true;
}
if (mrtjfw.indexOf('3') >= 0) {
isNonPurchased = true;
}
// 构建对话框表单
const defYZZ = result.DefYZZ ? parseFloat(result.DefYZZ) : 0;
this.yzForm = {
dialogTitle: yzmc,
range: this.selectedRows.length > 0 ? 'N' : 'C',
rangeOptions: this.selectedRows.length > 0 ? ['N', 'Y', 'C'] : ['Y', 'C'],
factorLabel: factorLabel,
factorValue: defYZZ,
factorUnit: factorUnit,
showOnlyNegative: bcytj === 'Y',
onlyNegative: false,
showHasTablePrice: true,
hasTablePrice: hasTablePrice,
showPurchased: true,
isPurchased: isPurchased,
isNonPurchased: isNonPurchased,
YZID: yzItem.YZID,
YZType: 'YZ',
JJFS: jjfs,
DefYZZ: result.DefYZZ || '',
MinYZZ: result.MinYZZ || '',
MaxYZZ: result.MaxYZZ || '',
BCYTJ: bcytj,
JGBBJBM: result.JGBBJBM || '表价',
TJYS: result.TJYS || ''
};
this.yzDialogVisible = true;
} else {
ElMessage.error(result?.Message || '获取因子信息失败');
}
},
error => {
this.showLoading = false;
ElMessage.error('获取因子信息失败: ' + (error || '未知错误'));
},
'GetYZInfo_CallBack',
40000
);
},
// 直接更新因子值(BCYTJ === 'Y' 时使用)
updateFactorValueDirectly(yzItem, yzInfo) {
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
if (!currentBJDID || !yzItem.YZID) {
ElMessage.error('无法获取报价单ID或因子ID');
return;
}
let sBJDXHList = '';
let sPLSZAll = this.selectedRows.length > 0 ? 'N' : 'C';
if (sPLSZAll === 'N') {
if (this.selectedRows.length === 0) {
ElMessage.warning('请先选择要调价的记录');
return;
}
sBJDXHList = this.selectedRows.map(row => row.XH || row.XLXSBJDMX_XH).join(',');
} else {
// 所查记录 -> 仅当前筛选,改为 N + 过滤列表
sPLSZAll = 'N';
sBJDXHList = this.getFilteredIds();
if (!sBJDXHList) {
ElMessage.warning('当前无可调价的所查记录');
return;
}
}
this.showLoading = true;
// 调用更新因子值服务
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'UpdateFactorValue',
false,
{
BJDID: currentBJDID,
YZID: yzItem.YZID,
TJYS: yzInfo.TJYS || '',
selectedIds: sBJDXHList,
PLSZAll: sPLSZAll
},
result => {
this.showLoading = false;
if (result && result.success !== false) {
const msg = sBJDXHList ? '所选明细更新完成!' : '所查明细更新完成!';
ElMessage.success(result.msg || msg);
this.loadData();
} else {
ElMessage.error(result?.msg || '更新因子值失败');
}
},
error => {
this.showLoading = false;
ElMessage.error('更新因子值失败: ' + (error || '未知错误'));
},
'UpdateFactorValue_CallBack',
40000
);
},
// 关闭因子对话框
closeYZDialog() {
this.yzDialogVisible = false;
},
// 确认因子调价
confirmYZ() {
if (!this.yzForm.range) {
ElMessage.warning('调价范围不允许为空!');
return;
}
const factorValue = this.yzForm.factorValue;
if (factorValue === null || factorValue === undefined || factorValue === '') {
ElMessage.warning('请输入因子值');
return;
}
const numFactorValue = parseFloat(factorValue);
if (isNaN(numFactorValue)) {
ElMessage.warning('因子值必须是数字');
return;
}
// 验证最小值
if (this.yzForm.MinYZZ && this.yzForm.MinYZZ !== '') {
const minValue = parseFloat(this.yzForm.MinYZZ);
if (!isNaN(minValue) && numFactorValue < minValue) {
ElMessage.warning(`不允许低于设置的调价最小值${this.yzForm.MinYZZ}!`);
return;
}
}
// 验证最大值
if (this.yzForm.MaxYZZ && this.yzForm.MaxYZZ !== '') {
const maxValue = parseFloat(this.yzForm.MaxYZZ);
if (!isNaN(maxValue) && numFactorValue > maxValue) {
ElMessage.warning(`不允许高于设置的调价最大值${this.yzForm.MaxYZZ}!`);
return;
}
}
const currentBJDID = getQueryParams()['BJDID'] ||
(document.getElementById('txtBJDID') ? document.getElementById('txtBJDID').value : '') || '';
const JCLLX = getQueryParams()['JCLLX'] ||
(document.getElementById('txtJCLLX') ? document.getElementById('txtJCLLX').value : '') || '';
const LJJCLLX = getQueryParams()['LJJCLLX'] ||
(document.getElementById('txtLJJCLLX') ? document.getElementById('txtLJJCLLX').value : '') || '';
const CPBJMRXSWS = getQueryParams()['CPBJMRXSWS'] ||
(document.getElementById('txtCPBJMRXSWS') ? document.getElementById('txtCPBJMRXSWS').value : '') || '';
let sBJDXHList = '';
let sPLSZAll = this.yzForm.range || 'C';
if (sPLSZAll === 'N') {
if (this.selectedRows.length === 0) {
ElMessage.warning('请先选择要调价的记录');
return;
}
sBJDXHList = this.selectedRows.map(row => row.XH || row.XLXSBJDMX_XH).join(',');
}
if (sPLSZAll === 'C') {
// 所查记录 -> 仅当前筛选,改为 N + 过滤列表
sPLSZAll = 'N';
sBJDXHList = this.getFilteredIds();
if (!sBJDXHList) {
ElMessage.warning('当前无可调价的所查记录');
this.showLoading = false;
return;
}
}
this.showLoading = true;
GThinking.Web.AjaxServiceProxy.servicePath = 'S_XLXSBJ/102373016.ashx';
GThinking.Web.AjaxServiceProxy.invoke(
'BatchFactorAdjust',
false,
{
BJDID: currentBJDID,
YZID: this.yzForm.YZID,
isJMBGS: this.yzForm.YZType === 'JMBGS' ? 'true' : 'false',
factorValue: String(this.yzForm.factorValue || '0'),
JJFS: this.yzForm.JJFS || '',
onlyNegative: this.yzForm.onlyNegative ? 'true' : 'false',
hasTablePrice: this.yzForm.hasTablePrice ? 'true' : 'false',
isPurchased: this.yzForm.isPurchased ? 'true' : 'false',
isNonPurchased: this.yzForm.isNonPurchased ? 'true' : 'false',
selectedIds: sBJDXHList,
PLSZAll: sPLSZAll,
JCLLX: JCLLX,
LJJCLLX: LJJCLLX,
CPBJMRXSWS: CPBJMRXSWS
},
result => {
this.showLoading = false;
if (result && result.success !== false) {
ElMessage.success('因子调价成功');
this.yzDialogVisible = false;
this.loadData();
} else {
ElMessage.error(result?.msg || '因子调价失败');
}
},
error => {
this.showLoading = false;
ElMessage.error('因子调价失败: ' + (error || '未知错误'));
},
'BatchFactorAdjust_CallBack',
40000
);
},
// 处理数字输入(用于限制输入格式)
handlePriceInput(formName, event, fieldName) {
const value = event.target ? event.target.value : event;
// 只允许数字和小数点
const cleaned = value.replace(/[^\d.]/g, '');
// 确保只有一个小数点
const parts = cleaned.split('.');
if (parts.length > 2) {
const finalValue = parts[0] + '.' + parts.slice(1).join('');
if (fieldName) {
this[formName][fieldName] = finalValue;
} else {
this[formName].value = finalValue;
}
} else {
if (fieldName) {
this[formName][fieldName] = cleaned;
} else {
this[formName].value = cleaned;
}
}
},
closeMaterialPriceDialog() {
this.materialPriceDialogVisible = false;
},
closePanel() {
const parentDoc = topDocument || document;
const docs = [parentDoc, document];
const overlayIds = [
'divZDY_102373016', 'divZDY_102849002', 'divZDY_102849001', 'divZDY_102849000',
'divBYZDY_102373016', 'divBYZDY_102849001', 'divBYZDY_102849000'
];
// 强制清理遮罩/容器并隐藏 div_ZDY/div_BYZDY
docs.forEach(doc => {
overlayIds.forEach(id => {
const el = doc.getElementById(id);
if (el && el.parentNode) {
el.parentNode.removeChild(el);
}
});
const zdy = doc.getElementById('div_ZDY');
if (zdy) { zdy.innerHTML = ''; zdy.style.display = 'none'; }
const byzdy = doc.getElementById('div_BYZDY');
if (byzdy) { byzdy.innerHTML = ''; byzdy.style.display = 'none'; }
});
// 移除自身 iframe(如果存在)
const frameEl = window.frameElement;
if (frameEl && frameEl.parentNode) {
try { frameEl.parentNode.removeChild(frameEl); } catch (e) { console.warn(e); }
}
// 尝试刷新父页面报价单(若存在)
try {
const frameElement = parentDoc.getElementById('XLBJDInfo_frame');
if (frameElement && frameElement.contentWindow && frameElement.contentWindow.location) {
frameElement.contentWindow.location.reload();
}
} catch (e) {
console.warn('刷新父页报价单失败', e);
}
// 刷新报价单
const frameElement = parentDoc.getElementById('XLBJDInfo_frame');
if (!frameElement) {
console.log('未找到 XLBJDInfo_frame');
} else {
const iframeDoc = frameElement.contentWindow.document;
if (!iframeDoc) {
console.log('跨域访问被阻止');
} else {
const reloadButton = iframeDoc.getElementById('ctl00_CPHButton_btnReLoad');
if (reloadButton) {
reloadButton.click();
} else {
console.log('未找到 btnReLoad 控件');
}
}
}
}
}
});
function CallBackNULLJSON(result, userContext, methodName) { }
function CallBackFun(result, userContext, methodName) {
console.log("CallBackFun");
const app = window.app;
if (userContext == "GetXLCPList_CallBack") {
}
if (userContext == "IsJGEJGB_CallBack") {
}
if (userContext == "GetXLYSList_CallBack") {
console.log("GetXLYSList_CallBack");
console.log(result); // 查看 result 的结构
app.xlysOptions = result;
}
}
function getQueryParams() {
const params = {};
window.location.search.substring(1).split('&').forEach(param => {
const [key, value] = param.split('=');
params[key] = decodeURIComponent(value || '');
});
return params;
}
app.use(ElementPlus);
app.component('Filter', Filter);
app.component('Operation',ElementPlusIconsVue.Operation);
window.app = app.mount('#app');