|
@@ -1,8 +1,9 @@
|
|
|
import React from 'react';
|
|
import React from 'react';
|
|
|
-import { message } from 'antd';
|
|
|
|
|
|
|
+import { Button, message } from 'antd';
|
|
|
import exportExcel, { getExcelBolob } from '@/utils/exportExcl';
|
|
import exportExcel, { getExcelBolob } from '@/utils/exportExcl';
|
|
|
import LuckyExcel from 'luckyexcel';
|
|
import LuckyExcel from 'luckyexcel';
|
|
|
import { getToken, GetTokenFromUrl } from '@/utils/utils';
|
|
import { getToken, GetTokenFromUrl } from '@/utils/utils';
|
|
|
|
|
+import GoalSeek from '@/utils/GoalSeek';
|
|
|
|
|
|
|
|
const hintText = '禁止编辑!请先点击编辑按钮。';
|
|
const hintText = '禁止编辑!请先点击编辑按钮。';
|
|
|
const DIFF_COLOR = '#ff0000';
|
|
const DIFF_COLOR = '#ff0000';
|
|
@@ -64,7 +65,16 @@ class LuckySheet extends React.Component {
|
|
|
return uuid.join('');
|
|
return uuid.join('');
|
|
|
}
|
|
}
|
|
|
renderSheet(currentData) {
|
|
renderSheet(currentData) {
|
|
|
- const { onClickCell, version, getUser, onUpdate, templateId, onDelSheet } = this.props;
|
|
|
|
|
|
|
+ const {
|
|
|
|
|
+ onClickCell,
|
|
|
|
|
+ version,
|
|
|
|
|
+ getUser,
|
|
|
|
|
+ onUpdate,
|
|
|
|
|
+ templateId,
|
|
|
|
|
+ onDelSheet,
|
|
|
|
|
+ permissions,
|
|
|
|
|
+ node,
|
|
|
|
|
+ } = this.props;
|
|
|
const data = currentData || this.props.data;
|
|
const data = currentData || this.props.data;
|
|
|
const _this = this;
|
|
const _this = this;
|
|
|
if (!this.luckysheet) {
|
|
if (!this.luckysheet) {
|
|
@@ -82,6 +92,7 @@ class LuckySheet extends React.Component {
|
|
|
// forceCalculation: true,
|
|
// forceCalculation: true,
|
|
|
hook: {
|
|
hook: {
|
|
|
cellMousedown: (cell, position, sheet) => {
|
|
cellMousedown: (cell, position, sheet) => {
|
|
|
|
|
+ console.log(cell, position, sheet);
|
|
|
onClickCell && onClickCell(cell, position, sheet);
|
|
onClickCell && onClickCell(cell, position, sheet);
|
|
|
},
|
|
},
|
|
|
cellPasteBefore: cell => {
|
|
cellPasteBefore: cell => {
|
|
@@ -129,6 +140,11 @@ class LuckySheet extends React.Component {
|
|
|
this.luckysheet.setCellFormat(0, 0, 'bg', '#fff');
|
|
this.luckysheet.setCellFormat(0, 0, 'bg', '#fff');
|
|
|
}, 100);
|
|
}, 100);
|
|
|
},
|
|
},
|
|
|
|
|
+ workbookCreateAfter: options => {
|
|
|
|
|
+ setTimeout(() => {
|
|
|
|
|
+ this.luckysheet.refreshFormula();
|
|
|
|
|
+ }, 800);
|
|
|
|
|
+ },
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|
|
|
if (version) {
|
|
if (version) {
|
|
@@ -149,6 +165,7 @@ class LuckySheet extends React.Component {
|
|
|
authorityUrl: `/api/v1/purchase/bom/user/excel/col?depId=${localStorage.depId ||
|
|
authorityUrl: `/api/v1/purchase/bom/user/excel/col?depId=${localStorage.depId ||
|
|
|
0}&JWT-TOKEN=${token}`,
|
|
0}&JWT-TOKEN=${token}`,
|
|
|
getUser,
|
|
getUser,
|
|
|
|
|
+ permissions,
|
|
|
// workbookCreateBefore(luckysheet) {
|
|
// workbookCreateBefore(luckysheet) {
|
|
|
// console.log('===============================', luckysheet);
|
|
// console.log('===============================', luckysheet);
|
|
|
// let oldConfig = JSON.parse(JSON.stringify(luckysheet.getConfig()));
|
|
// let oldConfig = JSON.parse(JSON.stringify(luckysheet.getConfig()));
|
|
@@ -169,7 +186,8 @@ class LuckySheet extends React.Component {
|
|
|
option.enableAddBackTop = false;
|
|
option.enableAddBackTop = false;
|
|
|
option.showsheetbarConfig = {
|
|
option.showsheetbarConfig = {
|
|
|
add: false,
|
|
add: false,
|
|
|
- sheet: false,
|
|
|
|
|
|
|
+ menu: false,
|
|
|
|
|
+ // sheet: false,
|
|
|
};
|
|
};
|
|
|
option.cellRightClickConfig = {
|
|
option.cellRightClickConfig = {
|
|
|
copy: false, // 复制
|
|
copy: false, // 复制
|
|
@@ -208,12 +226,18 @@ class LuckySheet extends React.Component {
|
|
|
hintText: '该清单已设置为最终版本,禁止编辑!',
|
|
hintText: '该清单已设置为最终版本,禁止编辑!',
|
|
|
};
|
|
};
|
|
|
unableEdit(option);
|
|
unableEdit(option);
|
|
|
- } else if (version.audit_status != 0 || version.status == 1) {
|
|
|
|
|
|
|
+ } else if ((version.audit_status != 0 && version.audit_status != 5) || version.status == 1) {
|
|
|
option.authority = {
|
|
option.authority = {
|
|
|
sheet: true,
|
|
sheet: true,
|
|
|
hintText: '当前清单不可编辑!',
|
|
hintText: '当前清单不可编辑!',
|
|
|
};
|
|
};
|
|
|
unableEdit(option);
|
|
unableEdit(option);
|
|
|
|
|
+ } else if (node?.node_type_psr == 1 ||node?.node_type_psr == 2 || node?.node_type_psr == 5 ) {
|
|
|
|
|
+ option.authority = {
|
|
|
|
|
+ sheet: true,
|
|
|
|
|
+ hintText: '流程已完结,不可编辑!',
|
|
|
|
|
+ };
|
|
|
|
|
+ unableEdit(option);
|
|
|
}
|
|
}
|
|
|
} else if (data && data.length > 0) {
|
|
} else if (data && data.length > 0) {
|
|
|
option.data = JSON.parse(JSON.stringify(data));
|
|
option.data = JSON.parse(JSON.stringify(data));
|
|
@@ -246,7 +270,9 @@ class LuckySheet extends React.Component {
|
|
|
// 所以默认设置第一个单元格的背景色
|
|
// 所以默认设置第一个单元格的背景色
|
|
|
setTimeout(() => {
|
|
setTimeout(() => {
|
|
|
this.luckysheet.setCellFormat(0, 0, 'bg', '#fff');
|
|
this.luckysheet.setCellFormat(0, 0, 'bg', '#fff');
|
|
|
|
|
+ this.luckysheet.refreshFormula();
|
|
|
}, 500);
|
|
}, 500);
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// componentDidUpdate(prevProps) {
|
|
// componentDidUpdate(prevProps) {
|
|
@@ -614,6 +640,37 @@ class LuckySheet extends React.Component {
|
|
|
return comment;
|
|
return comment;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ async goalSeek(type, goal, setting) {
|
|
|
|
|
+ const luckysheet = this.luckysheet;
|
|
|
|
|
+ const sheet = this.luckysheet.getSheet({
|
|
|
|
|
+ name: '毛利概算',
|
|
|
|
|
+ });
|
|
|
|
|
+ const order = sheet.order;
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ let defaultValue = luckysheet.getCellValue(9, 2, {
|
|
|
|
|
+ order,
|
|
|
|
|
+ });
|
|
|
|
|
+ const result = await GoalSeek({
|
|
|
|
|
+ goal,
|
|
|
|
|
+ fn: fn,
|
|
|
|
|
+ fnParams: [defaultValue, sheet.data, type],
|
|
|
|
|
+ maxIterations: 1000,
|
|
|
|
|
+ independentVariableIdx: 0,
|
|
|
|
|
+ ...setting,
|
|
|
|
|
+ });
|
|
|
|
|
+ luckysheet.setCellValue(9, 2, result, {
|
|
|
|
|
+ order,
|
|
|
|
|
+ });
|
|
|
|
|
+ console.log(result)
|
|
|
|
|
+ luckysheet.refreshFormula()
|
|
|
|
|
+ message.success("计算成功")
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ message.error("计算失败")
|
|
|
|
|
+ console.log(error);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
render() {
|
|
render() {
|
|
|
return (
|
|
return (
|
|
|
<iframe
|
|
<iframe
|
|
@@ -626,5 +683,90 @@ class LuckySheet extends React.Component {
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+function fn(C10, data, type) {
|
|
|
|
|
+ let C50 = data[49][2].v || 0;
|
|
|
|
|
+ let C49 = data[48][2].v || 0;
|
|
|
|
|
+ let C20 = data[19][2].v || 0;
|
|
|
|
|
+ let C21 = data[20][2].v || 0;
|
|
|
|
|
+ let C9 = data[8][2].v || 0;
|
|
|
|
|
+ let C15 = data[14][2].v || 0;
|
|
|
|
|
+ let C16 = data[15][2].v || 0;
|
|
|
|
|
+ let C17 = data[16][2].v || 0;
|
|
|
|
|
+ let C18 = data[17][2].v || 0;
|
|
|
|
|
+ let C19 = data[18][2].v || 0;
|
|
|
|
|
+ let C51 = data[50][2].v || 0;
|
|
|
|
|
+
|
|
|
|
|
+ let G42 = data[41][6].v || 0;
|
|
|
|
|
+ let G12 = data[11][6].v || 0;
|
|
|
|
|
+ let G13 = data[12][6].v || 0;
|
|
|
|
|
+ let G7 = data[6][6].v || 0;
|
|
|
|
|
+ let G8 = data[7][6].v || 0;
|
|
|
|
|
+ switch (type) {
|
|
|
|
|
+ case 1:
|
|
|
|
|
+ // 净利率
|
|
|
|
|
+ return C3() / C59();
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ // 贡献毛利率
|
|
|
|
|
+ return C4() / C59();
|
|
|
|
|
+ case 3:
|
|
|
|
|
+ // 合同总价
|
|
|
|
|
+ return C59();
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ function C59() {
|
|
|
|
|
+ return C58() + C57() + C56() + C54();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function C4() {
|
|
|
|
|
+ return C3() + C50 + C49 + C48() + G42 + C43();
|
|
|
|
|
+ }
|
|
|
|
|
+ function C48() {
|
|
|
|
|
+ return C59() * G12;
|
|
|
|
|
+ }
|
|
|
|
|
+ function C58() {
|
|
|
|
|
+ return (C56() + C57()) * 0.12;
|
|
|
|
|
+ }
|
|
|
|
|
+ function C57() {
|
|
|
|
|
+ return (((C20 + C21) * C10) / (1 + G7)) * G7 - ((C20 + C21) / (1 + G8)) * G8;
|
|
|
|
|
+ }
|
|
|
|
|
+ function C56() {
|
|
|
|
|
+ return (
|
|
|
|
|
+ (((C15 + C16 + C17 + C18 + C19) * C10) / (1 + G7)) * G7 -
|
|
|
|
|
+ ((C15 + C16 + C17 + C18 + C19) / (1 + G7)) * G7
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ function C54() {
|
|
|
|
|
+ return SUM(2, [14, 20]) * C10;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function C3() {
|
|
|
|
|
+ return C55() - C53();
|
|
|
|
|
+ }
|
|
|
|
|
+ function C55() {
|
|
|
|
|
+ return C59() / (1 + G7);
|
|
|
|
|
+ }
|
|
|
|
|
+ function C53() {
|
|
|
|
|
+ return C52() - ((SUM(2, [14, 18]) / (1 + G7)) * G7 + (SUM(2, [19, 20]) / (1 + G8)) * G8);
|
|
|
|
|
+ }
|
|
|
|
|
+ function C52() {
|
|
|
|
|
+ return SUM(2, [14, 50]);
|
|
|
|
|
+ }
|
|
|
|
|
+ function C43() {
|
|
|
|
|
+ return C59() * G13;
|
|
|
|
|
+ }
|
|
|
|
|
+ function C44() {
|
|
|
|
|
+ return C59() * C9;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function SUM(x, [y1, y2]) {
|
|
|
|
|
+ let total = 0;
|
|
|
|
|
+ for (let i = y1; i < y2; i++) {
|
|
|
|
|
+ const item = data[i][x];
|
|
|
|
|
+ if (!isNaN(item.v)) {
|
|
|
|
|
+ total += item.v;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return total;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
export default LuckySheet;
|
|
export default LuckySheet;
|