|
item === rowData[dataKey])}
>
|
};
const resetUI = () => {
selectedRowKeysTable.current = [];
selectedRowKeysTableParent.current = null;
setRcjhl([]);
if (rcjTable.current) {
rcjTable.current.replaceData([]);
}
setFuzhu([]);
isQdrcj.current = true;
highlight.current = [];
setTuijian([]);
if (tuijianTable.current) tuijianTable.current.replaceData([]);
};
React.useEffect(() => {
myTable.current = new Tabulator(myRef.current, {
index: "key",
height: 380,
renderVertical: "basic",
data: detail, //link data to table
reactiveData: false, //enable data reactivity
dataTreeStartExpanded:true,
dataTree: true,
selectableRows:1, //make rows selectable
editTriggerEvent:"dblclick", //trigger edit on double click
dataTreeStartExpanded:function(row, level){
return true;
},
columns: [ //Define Table Columns
{title:"序号", field:"序号", width:80, headerSort:false, frozen: true}, //never hide this column
{title:"清单编码", field:"清单编码", width:120,headerSort:false, frozen: true, formatter:"textarea" },
{title:"名称", field:"名称", width:150, headerSort:false, formatter:"textarea"}, //hide this column first
{title:"项目特征", field:"项目特征", width:150 , headerSort:false, formatter:"textarea"},
{title:"计算规则", field:"计算规则", width:250, headerSort:false, formatter:"textarea"},
{title:"单位", field:"单位", width:100, headerSort:false},
{title:"数量", field:"数量", width:100, headerSort:false, editor: "input", editable: editCheck },
{title:"综合单价", field:"综合单价", width:100, headerSort:false, formatter:"money"},
{title:"合价", field:"合价", width:100, headerSort:false, formatter:"money"},
{title:"人工费", field:"人工费", width:100, headerSort:false, formatter:"money"},
{title:"主材费", field:"主材费", width:100, headerSort:false, formatter:"money"},
{title:"设备费", field:"设备费", width:100, headerSort:false, formatter:"money"},
{title:"辅材费", field:"辅材费", width:100, headerSort:false, formatter:"money"},
{title:"材料费", field:"材料费", width:100, headerSort:false, formatter:"money"},
{title:"机械费", field:"机械费", width:100, headerSort:false, formatter:"money"},
{title:"管理费", field:"管理费", width:100, headerSort:false, formatter:"money"},
{title:"利润", field:"利润", width:100, headerSort:false, formatter:"money"},
{title:"暂估价", field:"暂估价", width:100, headerSort:false, formatter:"money"},
{title:"综合人工工日", field:"综合人工工日", width:100, headerSort:false},
]
});
myTable.current.on("cellDblClick", function(e, cell){
//e - the click event object
//cell - cell component
console.log(cell);
});
myTable.current.on("rowSelected", handleSelect);
myTable.current.on("cellEdited", function(cell){
//console.log("edited");
//console.log();
let key = cell._cell.row.data['key'];
myTable.current.deselectRow();
let [success, data] = updateShuliang_djcs(cell._cell.row.data['数量'], selectedRowKeysTable.current[0]);
if (success) {
let former = myTable.current.element.children[1].scrollTop;
let former2 = myTable.current.element.children[1].scrollLeft;
myTable.current.updateData(data.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function() {
myTable.current.element.children[1].scrollTop = former;
myTable.current.element.children[1].scrollLeft = former2;
let getRow = myTable.current.getRows(); //get array of currently selected row components.
let component = null;
for(let i = 0; i < getRow.length; i++) {
let entry = getRow[i]._row.modules.dataTree.children;
for(let j = 0; j < entry.length; j++) {
let child = entry[j];
if(child.data['key'] == key) {
//console.log(child);
component = child.component;
break;
}
}
}
component.select();
//handleSelect(component);
});
}
});
myTable.current.on("tableBuilt", () => {
Service.generateDjcs(name, bh).then(x=>{
myTable.current.replaceData(x);
});
});
}, [bh]);
React.useEffect(
() => {
beizhuFKRef.current = beizhuFK;
}, [beizhuFK]
);
React.useEffect(
() => {
//console.log(dingeclick);
//console.log(azfySelect);
if (dingeclick != null && selectedRowKeysTable.current != null && azfy_djcs_eligible(selectedRowKeysTable.current[0])) {
const [success, data, key] = azfy_djcs(selectedRowKeysTable.current[0], dingeclick, azfySelect);
myTable.current.deselectRow();
let former = myTable.current.element.children[1].scrollTop;
let former2 = myTable.current.element.children[1].scrollLeft;
myTable.current.updateData(data.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function(){
myTable.current.element.children[1].scrollTop = former;
myTable.current.element.children[1].scrollLeft = former2;
let getRow = myTable.current.getRows(); //get array of currently selected row components.
let component = null;
for(let i = 0; i < getRow.length; i++) {
let entry = getRow[i]._row.modules.dataTree.children;
for(let j = 0; j < entry.length; j++) {
let child = entry[j];
if(child.data['key'] == key) {
//console.log(child);
component = child.component;
break;
}
}
}
component.select();
//handleSelect(component);
});
}
}, [azfyConfirm]
);
React.useEffect(
() => {
//console.log(beizhu);
let result = [];
if (beizhu != null) {
let keys = Object.keys(beizhu["BZBH"]);
for(let i = 0; i < keys.length; i++) {
let key = keys[i];
result.push({'id': i+1, 'key': i+1, '序号': i+1, '编号': beizhu["BZBH"][key], '说明': beizhu["SM"][key], '数量': 1});//序号很重要
}
let newSelect = extractFuzhu(debmRef.current);
setCheckedKeys_2(newSelect.map(x=>x.split("*")[0]).map(x=>Number(x)));
for(let i = 0; i < newSelect.length; i++) {
if (newSelect[i].includes('*')) {
let xuhao = Number(newSelect[i].split('*')[0]);
let coef = Number(newSelect[i].split('*')[1]);
for(let j = 0; j < result.length; j++) {
if (result[j]['id'] == xuhao) {
result[j]['数量'] = coef;
}
}
}
}
setFuzhu(result);
}
}, [beizhu]
);
React.useEffect(
() => {
if (tuijianRef.current != null ) {
tuijianTable.current = new Tabulator(tuijianRef.current, {
index: "key",
height: 180,
data: tuijian, //link data to table
reactiveData: false, //enable data reactivity
dataTreeStartExpanded:false,
dataTree: false,
selectableRows:1, //make rows selectable
columns: [ //Define Table Columns
{title:"ID", field:"ID", width:80, headerSort:false, }, //never hide this column
{title:"定额编号", field:"定额编号", width:120,headerSort:false, formatter:"textarea" },
{title:"工程量名称", field:"工程量名称", width:150, headerSort:false, formatter:"textarea"}, //hide this column first
{title:"工作内容", field:"工作内容", width:150 , headerSort:false, formatter:"textarea"},
]
});
tuijianTable.current.on("tableBuilt", () => {
tuijianTable.current.replaceData(tuijian);
});
}
if (rcj2Ref.current != null ) {
rcj2Table.current = new Tabulator(rcj2Ref.current, {
index: "key",
height: 180,
data: rcjhl2, //link data to table
reactiveData: false, //enable data reactivity
dataTreeStartExpanded:false,
dataTree: false,
selectableRows:1, //make rows selectable
columns: [ //Define Table Columns
{title:"人材机编码", field:"人材机编码", width:120, headerSort:false, }, //never hide this column
{title:"名称", field:"名称", width:120,headerSort:false, formatter:"textarea" },
{title:"单位", field:"单位", width:150, headerSort:false, formatter:"textarea"}, //hide this column first
{title:"单价", field:"单价", width:150 , headerSort:false, formatter:"money"},
{title:"合价", field:"合价", width:150 , headerSort:false, formatter:"money"},
{title:"含量", field:"含量", width:150 , headerSort:false, formatter:"textarea"},
]
});
rcj2Table.current.on("tableBuilt", () => {
rcj2Table.current.replaceData(rcjhl2);
});
}
if (rcjRef.current != null ) {
rcjTable.current = new Tabulator(rcjRef.current, {
index: "key",
height: 180,
data: rcjhl, //link data to table
reactiveData: false, //enable data reactivity
dataTreeStartExpanded:false,
dataTree: false,
selectableRows:1, //make rows selectable
editTriggerEvent:"dblclick",
renderVertical: "basic",
columns: [ //Define Table Columns
{title:"ID", field:"ID", width:80, headerSort:false, },
{title:"人材机编码", field:"人材机编码", width:120, headerSort:false, formatter: sparklineFormatter2}, //never hide this column
{title:"名称", field:"名称", width:120,headerSort:false, formatter:"textarea", editor: "input", editable: editCheckRcj },
{title:"规格型号", field:"规格型号", width:80, headerSort:false, editor: "input", editable: editCheckRcj },
{title:"单位", field:"单位", width:80, headerSort:false, formatter:"textarea"}, //hide this column first
{title:"单价", field:"单价", width:80 , headerSort:false, formatter: sparklineFormatter, editor: "input", editable: editCheckJg },
{title:"产地", field:"产地", width:80, headerSort:false, },
{title:"供应厂商", field:"供应厂商", width:80, headerSort:false, },
{title:"人材机类别", field:"人材机类别", width:120, headerSort:false, },
{title:"甲供标志", field:"甲供标志", width:80 , headerSort:false, formatter:"textarea"},
{title:"含量", field:"含量", width:120 , headerSort:false, formatter:"money", formatterParams:{precision:4}, editor: "input", editable: editCheckRcj },
{title:"合价", field:"合价", width:80 , headerSort:false, formatter:"money"},
{title:"暂估价标志", field:"暂估价标志", width:100 , headerSort:false, formatter:"textarea"},
{title:"主要材料标志", field:"主要材料标志", width:100 , headerSort:false, formatter:"textarea"},
{title:"主材标志", field:"主材标志", width:80 , headerSort:false, formatter:"textarea"},
{title:"设备标志", field:"设备标志", width:80 , headerSort:false, formatter:"textarea"},
]
});
rcjTable.current.on("tableBuilt", () => {
rcjTable.current.replaceData(rcjhl);
});
rcjTable.current.on("cellEdited", function(cell){
let data = copy(cell._cell.table.getData());
for(let i = 0; i < data.length; i++) {
data[i]['合价'] = Number(data[i]['单价']) * Number(data[i]['含量']);
}
setRcjhl(data);
if (rcjTable.current) {
rcjTable.current.replaceData(data);
}
let data2 = [['ID', '人材机编码', '名称', '规格型号', '单位', '单价', '产地', '供应厂商', '人材机类别', '甲供标志', '含量', '合价', '暂估价标志', '主要材料标志', '主材标志', '设备标志', "key", "bc"]]
for (let i = 0; i < data.length; i++) {
data2.push([data[i]['ID'], data[i]['人材机编码'], data[i]['名称'], data[i]['规格型号'], data[i]['单位'],
data[i]['单价'], data[i]['产地'], data[i]['供应厂商'], data[i]['人材机类别'],
data[i]['甲供标志'], data[i]['含量'], data[i]['合价'], data[i]['暂估价标志'], data[i]['主要材料标志'], data[i]['主材标志'], data[i]['设备标志'], data[i]['key'], data[i]['bc']]);
}
let newData = updateDercj_djcs(selectedRowKeysTable.current[0], data2);
myTable.current.deselectRow();
let former = myTable.current.element.children[1].scrollTop;
let former2 = myTable.current.element.children[1].scrollLeft;
myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function() {
myTable.current.element.children[1].scrollTop = former;
myTable.current.element.children[1].scrollLeft = former2;
let getRow = myTable.current.getRows(); //get array of currently selected row components.
let component = null;
for(let i = 0; i < getRow.length; i++) {
let entry = getRow[i]._row.modules.dataTree.children;
for(let j = 0; j < entry.length; j++) {
let child = entry[j];
if(child.data['key'] == selectedRowKeysTable.current[0]) {
//console.log(child);
component = child.component;
break;
}
}
}
component.select();
//handleSelect(component);
});
});
}
}, [value]
);
React.useEffect(
() => {
let input = JSON.parse(dingeclick);
if (input == null) {
return;
}
if (!input.hasOwnProperty("DEBH")) {
return;
}
let bh_ = Object.values(input['DEBH'])[0];
if (bh_.includes('-F') || bh_.includes('19-19') || bh_.includes('19-20') || bh_.includes('19-21') || bh_.includes('19-22') || bh_.includes('19-23') || bh_.includes('19-24') || bh_.includes('19-25') || bh_.includes('19-26') || bh_.includes('19-27') || bh_.includes('19-28') || bh_.includes('19-29') || bh_.includes('19-30') || bh_.includes('19-31') || bh_.includes('19-32') || bh_.includes('19-33') || bh_.includes('19-34') || bh_.includes('19-35') || bh_.includes('19-36')) {
if (selectedRowKeysTable.current.length > 0 ) {
if (azfy_djcs_eligible(selectedRowKeysTable.current[0])) {
//setAzfyDe(input);
azfycallback(bh, input);
}
}
} else {
myTable.current.deselectRow();
//console.log(dingeclick);
if (selectedRowKeysTable.current.length > 0 ) {
const [success, data, key] = changguidinge_djcs(input, selectedRowKeysTable.current[0]);
if (success) {
let former = myTable.current.element.children[1].scrollTop;
let former2 = myTable.current.element.children[1].scrollLeft;
myTable.current.updateData(data.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function(){
myTable.current.element.children[1].scrollTop = former;
myTable.current.element.children[1].scrollLeft = former2;
let getRow = myTable.current.getRows(); //get array of currently selected row components.
let component = null;
for(let i = 0; i < getRow.length; i++) {
let entry = getRow[i]._row.modules.dataTree.children;
for(let j = 0; j < entry.length; j++) {
let child = entry[j];
if(child.data['key'] == key) {
//console.log(child);
component = child.component;
break;
}
}
}
component.select();
//handleSelect(component);
});
}
}
}
}, [dingeclick]//常规添加定额
);
React.useEffect(
() => {
console.log("rgde changed");
console.log(rgde);
rgdeRef.current = rgde;
jxdeRef.current = jxde;
cldeRef.current = clde;
if (isQdrcj.current) {
highlight.current = [];
} else {
let toHighlight = [];
for(let i = 0; i < rcjhl.length; i++) {
let entry = rcjhl[i];
let bianhao = entry['人材机编码'];
let rcjlb = entry['人材机类别'];
if (Number(rcjlb) == Number(1) && rgde) {
for (let j = 0; j < rgde.length; j++) {
if (rgde[j]["CLBH"] == bianhao) {
let danjia = Number(entry['单价']);
if (!number_equal(danjia , rgde[j]["YSJG"])) {
console.log(`[${i},5]danjia bu yizhi`);
toHighlight.push({row: i, col: 5});
}
let hanliang = Number(entry['含量']);
if (!number_equal(hanliang , rgde[j]["gr"])) {
console.log(`[${i}, 10]hanliang bu yizhi`);
toHighlight.push({row: i, col: 10});
}
}
}
}
if (Number(rcjlb) == Number(3) && jxde ) {
for (let j = 0; j < jxde.length; j++) {
if (jxde[j]["jxbh"] == bianhao) {
let danjia = Number(entry['单价']);
if (!number_equal(danjia , jxde[j]["tbdj"])) {
console.log(`[${i},5]danjia bu yizhi`);
toHighlight.push({row: i, col: 5, });
}
let hanliang = Number(entry['含量']);
if (!number_equal(hanliang , jxde[j]["sl"])) {
console.log(`[${i}, 10]hanliang bu yizhi`);
toHighlight.push({row: i, col: 10, });
}
}
}
}
if (Number(rcjlb) == Number(2) && clde ) {
for (let j = 0; j < clde.length; j++) {
if (clde[j]["CLBH"] == bianhao) {
let danjia = Number(entry['单价']);
if (!number_equal(danjia , clde[j]["YSJG"])) {
console.log(`[${i},5]danjia bu yizhi`);
toHighlight.push({row: i, col: 5, });
}
let hanliang = Number(entry['含量']);
if (!number_equal(hanliang ,clde[j]["SL"])) {
console.log(`[${i}, 10]hanliang bu yizhi`);
toHighlight.push({row: i, col: 10, });
}
}
}
}
}
console.log(toHighlight);
highlight.current = toHighlight;
}
let bzrcjhl = []
if (rgde)
for (let i = 0; i < rgde.length; i++) {
bzrcjhl.push({'人材机编码': rgde[i]["CLBH"], '名称': rgde[i]["CLMC"], '单位': rgde[i]["JLDW"], '单价': rgde[i]["YSJG"], '合价': rgde[i]["gf"], '含量': rgde[i]["gr"]});
}
if (clde)
for (let i = 0; i < clde.length; i++) {
bzrcjhl.push({'人材机编码': clde[i]["CLBH"], '名称': clde[i]["CLMC"], '单位': clde[i]["JLDW"], '单价': clde[i]["YSJG"], '合价': clde[i]["HJ"], '含量': clde[i]["SL"]});
}
if (jxde)
for (let i = 0; i < jxde.length; i++) {
bzrcjhl.push({'人材机编码': jxde[i]["jxbh"], '名称': jxde[i]["jxmc"], '单位': jxde[i]["DW"], '单价': jxde[i]["tbdj"], '合价': jxde[i]["hj"], '含量': jxde[i]["sl"]});
}
setRcjhl2(bzrcjhl);
if (rcj2Table.current) {
rcj2Table.current.replaceData(bzrcjhl);
}
}, [rgde, jxde, clde]
);
const handleChange = (event, newValue) => {
setValue(newValue);
};
const EditableContext = React.createContext({ editingId: null, editingKey: null });
const [editingId, setEditingId] = React.useState(null);
const [editingKey, setEditingKey] = React.useState(null);
const onEdit = (id, dataKey) => {
setEditingId(id);
setEditingKey(dataKey);
};
const onEditFinished = () => {
//console.log("edit finidhed");
setEditingId(null);
setEditingKey(null);
onSelectChange(checkedKeys);
};
const styles = `
.table-cell-editing .rs-table-cell-content {
padding: 4px;
}
.table-cell-editing .rs-input {
width: 100%;
}
.table-cell:focus {
outline: none;
box-shadow: inset 0 0 0 1px #007bff;
}
`;
const fieldMap = {
string: Input,
number: InputNumber,
};
function focus(ref) {
setTimeout(() => {
if (ref.current?.tagName === 'INPUT' || ref.current?.getAttribute('tabindex') === '0') {
ref.current.focus();
} else if (ref.current instanceof HTMLElement) {
ref.current.querySelector('input').focus();
}
}, 10);
}
const handleChangeFuzhuSL = (id, key, value) => {
const nextData = Object.assign([], fuzhu);
nextData.find(item => item.id === id)[key] = value;
setFuzhu(nextData);
};
const EditableCell = ({ rowData, dataType, dataKey, onChange, ...props }) => {
const { editingId, editingKey, onEdit, onEditFinished } = React.useContext(EditableContext);
const editing = rowData.id === editingId && dataKey === editingKey;
const Field = fieldMap[dataType];
const value = rowData[dataKey];
const text = value;
const inputRef = React.useRef();
const cellRef = React.useRef();
const handleEdit = () => {
if (fuzhuEnable) {
onEdit?.(rowData.id, dataKey);
focus(inputRef);
}
};
const handleFinished = () => {
onEditFinished();
focus(cellRef);
};
return (