xujunjie 1 jaar geleden
bovenliggende
commit
c510763d31

+ 2 - 3
src/pages/Detail/CommitAuditModal.js

@@ -740,9 +740,8 @@ function CommitAuditModal(props) {
         next_template_id: version.template_id,
       };
       if (serviceNode.node_type_psr == 3 || serviceNode.node_type_psr == 4) {
-        let project = projectList.find(item => item.id == version?.project_id);
-        let projectName = project?.project_name || '';
-        let sheetData = await uploadExcelByUrl(serviceNode.node_type_psr, version.id, projectName);
+        let project = projectList.find(item => item.id == version?.project_id)|| {};
+        let sheetData = await uploadExcelByUrl(serviceNode.node_type_psr, version.id, project);
         params.data = JSON.stringify(sheetData);
       }
       // params.data = await uploadExcelByUrl(3, version.id);

+ 20 - 42
src/pages/Detail/LuckySheet.js

@@ -629,37 +629,11 @@ class LuckySheet extends React.Component {
   }
 
   async goalSeek(type, goal, setting) {
-    let luckysheet = this.luckysheet;
+    const luckysheet = this.luckysheet;
     const sheet = this.luckysheet.getSheet({
       name: '毛利概算',
     });
-    let order = sheet.order;
-    console.log(sheet);
-
-    const fn = function(x) {
-      return new Promise(resolve => {
-        luckysheet.setCellValue(9, 2, x.toFixed(4), {
-          order,
-          success: () => {
-            luckysheet.refreshFormula(() => {
-              let row;
-              if (type == 1) {
-                row = 1;
-              } else if (type == 2) {
-                row = 4;
-              } else {
-                row = 5;
-              }
-              let data = luckysheet.getCellValue(row, 2, {
-                order,
-              });
-              console.log(data);
-              resolve(data);
-            });
-          },
-        });
-      });
-    };
+    const order = sheet.order;
 
     try {
       let defaultValue = luckysheet.getCellValue(9, 2, {
@@ -667,13 +641,15 @@ class LuckySheet extends React.Component {
       });
       const result = await GoalSeek({
         goal,
-        fn: fn2,
+        fn: fn,
         fnParams: [defaultValue, sheet.data, type],
         maxIterations: 1000,
         independentVariableIdx: 0,
         ...setting,
       });
-      console.log(result);
+      luckysheet.setCellValue(9, 2, result, {
+        order,
+      });
     } catch (error) {
       console.log(error);
     }
@@ -691,7 +667,7 @@ class LuckySheet extends React.Component {
     );
   }
 }
-function fn2(C10, data, type) {
+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;
@@ -704,11 +680,11 @@ function fn2(C10, data, type) {
   let C19 = data[18][2].v || 0;
   let C51 = data[50][2].v || 0;
 
-  let G42 = data[41][6].v;
-  let G12 = data[11][6].v;
-  let G13 = data[12][6].v;
-  let G7 = data[6][6].v;
-  let G8 = data[7][6].v;
+  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:
       // 净利率
@@ -729,7 +705,7 @@ function fn2(C10, data, type) {
     return C3() + C50 + C49 + C48() + G42 + C43();
   }
   function C48() {
-    return C59 * G12;
+    return C59() * G12;
   }
   function C58() {
     return (C56() + C57()) * 0.12;
@@ -751,26 +727,28 @@ function fn2(C10, data, type) {
     return C55() - C53();
   }
   function C55() {
-    return C59 / (1 + G7);
+    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(C15, C51);
+    return SUM(2, [14, 50]);
   }
   function C43() {
-    return C59 * G13;
+    return C59() * G13;
   }
   function C44() {
-    return C59 * C9;
+    return C59() * C9;
   }
 
   function SUM(x, [y1, y2]) {
     let total = 0;
     for (let i = y1; i < y2; i++) {
       const item = data[i][x];
-      total += item.v;
+      if (!isNaN(item.v)) {
+        total += item.v;
+      }
     }
     return total;
   }

+ 2 - 4
src/pages/Detail/PsrControl.js

@@ -31,13 +31,11 @@ function PsrControl(props) {
     try {
       if (type == 3) {
         setting = {
-          maxStep: 0.0001,
-          customToleranceFn: res => Math.abs(res - value) < 10
+          customToleranceFn: res => Math.abs(res - value) < 1
         };
       } else {
         setting = {
-          maxStep: 0.03,
-          percentTolerance: 0.1,
+          customToleranceFn: res => Math.abs(res - value) < 0.00001
         };
       }
       sheetRef.current.goalSeek(type, value, setting);

+ 4 - 1
src/pages/Temp/index.js

@@ -20,7 +20,10 @@ function Index(props) {
   const luckysheetRef = useRef();
 
   const onClick = async type => {
-    let data = await uploadExcelByUrl(type, versionId, 'test水厂');
+    let data = await uploadExcelByUrl(type, versionId, {
+      project_name: 'test水厂',
+      project_full_code: 'TESTCODE',
+    });
     luckysheetRef.current.destroy();
     luckysheetRef.current.create({
       data,

+ 55 - 11
src/utils/uploadExcelByUrl.js

@@ -1,8 +1,12 @@
 import LuckyExcel from 'luckyexcel';
 import { getToken } from '@/utils/utils';
+import moment from 'moment';
+window.moment = moment
 
-const uploadExcelByUrl = (nodeType, versionId, projectName) => {
-  const TEMPLATE_URL = 'https://gt-digitization.oss-cn-hangzhou.aliyuncs.com/public/bom/psr0913.xlsx';
+
+const uploadExcelByUrl = (nodeType, versionId, project) => {
+  const TEMPLATE_URL =
+    'https://gt-digitization.oss-cn-hangzhou.aliyuncs.com/public/bom/psr0913.xlsx';
 
   return new Promise((resolve, reject) => {
     LuckyExcel.transformExcelToLuckyByUrl(
@@ -25,11 +29,11 @@ const uploadExcelByUrl = (nodeType, versionId, projectName) => {
 
         // 处理psr预算
         excelData[1].status = 1;
-        res.push(initPSR(excelData[1], category, projectName));
+        res.push(initPSR(excelData[1], category, project?.project_name));
 
         if (nodeType == 4) {
           // 处理现金流
-          res.push(initActual(excelData[3], category, projectName));
+          res.push(initActual(excelData[3], category, project));
         }
 
         res.push(record);
@@ -70,6 +74,7 @@ function getCellValue(cell) {
 }
 
 function formatNumber(str) {
+  if (str.length < 6) return str;
   const number = parseFloat(str);
   if (!isNaN(number) && number % 1 !== 0) {
     return number.toFixed(1);
@@ -123,16 +128,50 @@ function getCategoryData(bom) {
 }
 
 // 处理现金流表
-function initActual(actual, category, projectName) {
+function initActual(actual, category, project) {
   let actualCategory = [];
   actual.celldata.forEach((item, i, celldata) => {
     if (item.c == 0 && item.v?.v) {
-      // 处理序号转float出现多余小数的情况
-      item.v.v = formatNumber(item.v?.v);
-    }
-    if (item.c == 1 && item.r == 0) item.v.v = projectName;
-    // 清单分类的总价填入对应预算列
-    if (item.c == 2) {
+      // LuckyExcel会将序号转float后再次转回string,导致小数出现精度问题
+      // 序号后超过2位数的固定处理,不超过两位数的保留一位小数
+      switch (item.r) {
+        case 65:
+          item.v.v = '5.10';
+          break;
+        case 66:
+          item.v.v = '5.11';
+          break;
+        case 126:
+          item.v.v = '9.12';
+          break;
+        case 127:
+          item.v.v = '9.13';
+          break;
+        case 147:
+          item.v.v = '10.12';
+          break;
+        case 148:
+          item.v.v = '10.13';
+          break;
+        case 262:
+          item.v.v = '17.15';
+          break;
+        case 264:
+          item.v.v = '17.17';
+        case 266:
+          item.v.v = '17.19';
+          break;
+        default:
+          // 处理序号转float出现多余小数的情况
+          item.v.v = formatNumber(item.v?.v);
+          break;
+      }
+    } else if (item.c == 1 && item.r == 0) {
+      item.v.v = project?.project_name;
+    } else if (item.c == 1 && item.r == 1) {
+      item.v.v = project?.project_full_code;
+    } else if (item.c == 2) {
+      // 清单分类的总价填入对应预算列
       // c=2 为名称列
       let value = getCellValue(item.v);
       // 判断该行是否为类型总列
@@ -140,6 +179,11 @@ function initActual(actual, category, projectName) {
         // 名称后第三列为预算列
         celldata[i + 3].v.v = category[value];
       }
+    } else if (item.c == 12 && item.r == 5) {
+      // 设置第一个月时间
+      let start_date = moment("1900-01-01 00:00:00");
+      let end_date = moment().startOf('month')
+      item.v.v = end_date.diff(start_date, 'days');
     }
   });
   return actual;