|  | @@ -0,0 +1,220 @@
 | 
	
		
			
				|  |  | +import LuckyExcel from 'luckyexcel';
 | 
	
		
			
				|  |  | +import { getToken } from '@/utils/utils';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const uploadExcelByUrl = (nodeType, versionId, projectName) => {
 | 
	
		
			
				|  |  | +  const TEMPLATE_URL = 'https://gt-digitization.oss-cn-hangzhou.aliyuncs.com/public/bom/psr.xlsx';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return new Promise((resolve, reject) => {
 | 
	
		
			
				|  |  | +    LuckyExcel.transformExcelToLuckyByUrl(
 | 
	
		
			
				|  |  | +      TEMPLATE_URL,
 | 
	
		
			
				|  |  | +      '模板.xlsx',
 | 
	
		
			
				|  |  | +      async (exportJson, luckysheetfile) => {
 | 
	
		
			
				|  |  | +        let [record] = await getExcel(versionId);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        let len = exportJson.sheets.length;
 | 
	
		
			
				|  |  | +        const excelData = exportJson.sheets;
 | 
	
		
			
				|  |  | +        delete record.id;
 | 
	
		
			
				|  |  | +        record.index = len + '_' + Math.floor(Math.random() * 100);
 | 
	
		
			
				|  |  | +        record.status = '0';
 | 
	
		
			
				|  |  | +        record.name = '清单';
 | 
	
		
			
				|  |  | +        // var sheets = [...excelData, record];
 | 
	
		
			
				|  |  | +        var res = [];
 | 
	
		
			
				|  |  | +        const category = getCategoryData(record);
 | 
	
		
			
				|  |  | +        // 处理Estimate表
 | 
	
		
			
				|  |  | +        // initEstimate(sheets[0], category);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 处理psr预算
 | 
	
		
			
				|  |  | +        excelData[1].status = 1;
 | 
	
		
			
				|  |  | +        res.push(initPSR(excelData[1], category, projectName));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (nodeType == 4) {
 | 
	
		
			
				|  |  | +          // 处理现金流
 | 
	
		
			
				|  |  | +          res.push(initActual(excelData[3], category, projectName));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        res.push(record);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 隐藏Estimate表
 | 
	
		
			
				|  |  | +        excelData[0].hide = 1;
 | 
	
		
			
				|  |  | +        excelData[0].status = 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        res.push(excelData[0]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        resolve(res.map((item, index) => ({ ...item, order: index })));
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function getExcel(gridKey) {
 | 
	
		
			
				|  |  | +  var formData = new FormData();
 | 
	
		
			
				|  |  | +  formData.append('gridKey', gridKey);
 | 
	
		
			
				|  |  | +  let res = await fetch(
 | 
	
		
			
				|  |  | +    `/api/v1/purchase/record/sheet?gridKey=${gridKey}&JWT-TOKEN=${getToken()}`,
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +      method: 'POST',
 | 
	
		
			
				|  |  | +      body: formData,
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  ).then(response => response.text());
 | 
	
		
			
				|  |  | +  return JSON.parse(JSON.parse(res));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function getCellValue(cell) {
 | 
	
		
			
				|  |  | +  let v = '';
 | 
	
		
			
				|  |  | +  if (cell.v) {
 | 
	
		
			
				|  |  | +    v = cell.v;
 | 
	
		
			
				|  |  | +  } else if (cell?.ct?.s) {
 | 
	
		
			
				|  |  | +    v = cell.ct.s.map(item => item.v).join('');
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return v;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function formatNumber(str) {
 | 
	
		
			
				|  |  | +  const number = parseFloat(str);
 | 
	
		
			
				|  |  | +  if (!isNaN(number) && number % 1 !== 0) {
 | 
	
		
			
				|  |  | +    return number.toFixed(1);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return str;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +// 根据清单获取表分类总价
 | 
	
		
			
				|  |  | +function getCategoryData(bom) {
 | 
	
		
			
				|  |  | +  let bomData = [],
 | 
	
		
			
				|  |  | +    bomTitle = {};
 | 
	
		
			
				|  |  | +  bom.celldata.forEach(item => {
 | 
	
		
			
				|  |  | +    let v = getCellValue(item.v);
 | 
	
		
			
				|  |  | +    if (item.r == 0) {
 | 
	
		
			
				|  |  | +      // 设置表头
 | 
	
		
			
				|  |  | +      bomTitle[item.c] = v;
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      let key = bomTitle[item.c];
 | 
	
		
			
				|  |  | +      if (!bomData[item.r - 1]) {
 | 
	
		
			
				|  |  | +        bomData[item.r - 1] = {};
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      bomData[item.r - 1][key] = v;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  let category = {
 | 
	
		
			
				|  |  | +    'GT-UF膜': 0,
 | 
	
		
			
				|  |  | +    原平制造: 0,
 | 
	
		
			
				|  |  | +    其它膜: 0,
 | 
	
		
			
				|  |  | +    水泵: 0,
 | 
	
		
			
				|  |  | +    阀门: 0,
 | 
	
		
			
				|  |  | +    加药系统: 0,
 | 
	
		
			
				|  |  | +    过滤器: 0,
 | 
	
		
			
				|  |  | +    空压机: 0,
 | 
	
		
			
				|  |  | +    非标: 0,
 | 
	
		
			
				|  |  | +    仪表: 0,
 | 
	
		
			
				|  |  | +    电气自控: 0,
 | 
	
		
			
				|  |  | +    双胞胎硬件: 0,
 | 
	
		
			
				|  |  | +    材料: 0,
 | 
	
		
			
				|  |  | +    安装: 0,
 | 
	
		
			
				|  |  | +    土建: 0,
 | 
	
		
			
				|  |  | +    运输: 0,
 | 
	
		
			
				|  |  | +    其它: 0,
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +  bomData.forEach(item => {
 | 
	
		
			
				|  |  | +    if (category.hasOwnProperty(item['类别'])) {
 | 
	
		
			
				|  |  | +      let price = parseFloat(item['总价(元)']);
 | 
	
		
			
				|  |  | +      if (isNaN(price)) return;
 | 
	
		
			
				|  |  | +      category[item['类别']] += price;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  return category;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 处理现金流表
 | 
	
		
			
				|  |  | +function initActual(actual, category, projectName) {
 | 
	
		
			
				|  |  | +  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) {
 | 
	
		
			
				|  |  | +      // c=2 为名称列
 | 
	
		
			
				|  |  | +      let value = getCellValue(item.v);
 | 
	
		
			
				|  |  | +      // 判断该行是否为类型总列
 | 
	
		
			
				|  |  | +      if (category.hasOwnProperty(value)) {
 | 
	
		
			
				|  |  | +        // 名称后第三列为预算列
 | 
	
		
			
				|  |  | +        celldata[i + 3].v.v = category[value];
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  return actual;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 处理毛利概算表
 | 
	
		
			
				|  |  | +function initEstimate(estimate, category) {
 | 
	
		
			
				|  |  | +  estimate.celldata.forEach(item => {
 | 
	
		
			
				|  |  | +    if (item.r == 15 && item.c == 2) {
 | 
	
		
			
				|  |  | +      // 金科制造中心-UF膜
 | 
	
		
			
				|  |  | +      item.v.v = category['GT-UF膜'];
 | 
	
		
			
				|  |  | +    } else if (item.r == 14 && item.c == 2) {
 | 
	
		
			
				|  |  | +      // 金科制造中心设备制造费
 | 
	
		
			
				|  |  | +      item.v.v = category['原平制造'];
 | 
	
		
			
				|  |  | +    } else if (item.r == 16 && item.c == 2) {
 | 
	
		
			
				|  |  | +      // 设备购置费
 | 
	
		
			
				|  |  | +      item.v.v =
 | 
	
		
			
				|  |  | +        category['其它膜'] +
 | 
	
		
			
				|  |  | +        category['水泵'] +
 | 
	
		
			
				|  |  | +        category['阀门'] +
 | 
	
		
			
				|  |  | +        category['加药系统'] +
 | 
	
		
			
				|  |  | +        category['过滤器'] +
 | 
	
		
			
				|  |  | +        category['空压机'] +
 | 
	
		
			
				|  |  | +        category['非标'] +
 | 
	
		
			
				|  |  | +        category['仪表'] +
 | 
	
		
			
				|  |  | +        category['电气自控'] +
 | 
	
		
			
				|  |  | +        category['材料'] +
 | 
	
		
			
				|  |  | +        category['运输'] +
 | 
	
		
			
				|  |  | +        category['其它'];
 | 
	
		
			
				|  |  | +    } else if (item.r == 18 && item.c == 2) {
 | 
	
		
			
				|  |  | +      // 数字双胞胎
 | 
	
		
			
				|  |  | +      item.v.v = category['双胞胎硬件'];
 | 
	
		
			
				|  |  | +    } else if (item.r == 19 && item.c == 2) {
 | 
	
		
			
				|  |  | +      // 安装
 | 
	
		
			
				|  |  | +      item.v.v = category['安装'];
 | 
	
		
			
				|  |  | +    } else if (item.r == 20 && item.c == 2) {
 | 
	
		
			
				|  |  | +      // 土建
 | 
	
		
			
				|  |  | +      item.v.v = category['土建'];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  return estimate;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 处理PSR表预算
 | 
	
		
			
				|  |  | +function initPSR(psr, category, projectName) {
 | 
	
		
			
				|  |  | +  psr.celldata.forEach(item => {
 | 
	
		
			
				|  |  | +    if (item.r == 0 && item.c == 1) {
 | 
	
		
			
				|  |  | +      item.v.v = projectName;
 | 
	
		
			
				|  |  | +    } else if (item.r == 38 && item.c == 2) {
 | 
	
		
			
				|  |  | +      item.v.v = category['GT-UF膜'];
 | 
	
		
			
				|  |  | +    } else if (item.r == 37 && item.c == 2) {
 | 
	
		
			
				|  |  | +      item.v.v = category['原平制造'];
 | 
	
		
			
				|  |  | +    } else if (item.r == 36 && item.c == 2) {
 | 
	
		
			
				|  |  | +      item.v.v =
 | 
	
		
			
				|  |  | +        category['其它膜'] +
 | 
	
		
			
				|  |  | +        category['水泵'] +
 | 
	
		
			
				|  |  | +        category['阀门'] +
 | 
	
		
			
				|  |  | +        category['加药系统'] +
 | 
	
		
			
				|  |  | +        category['过滤器'] +
 | 
	
		
			
				|  |  | +        category['空压机'] +
 | 
	
		
			
				|  |  | +        category['非标'] +
 | 
	
		
			
				|  |  | +        category['仪表'] +
 | 
	
		
			
				|  |  | +        category['电气自控'] +
 | 
	
		
			
				|  |  | +        category['材料'] +
 | 
	
		
			
				|  |  | +        category['运输'] +
 | 
	
		
			
				|  |  | +        category['其它'];
 | 
	
		
			
				|  |  | +    } else if (item.r == 39 && item.c == 2) {
 | 
	
		
			
				|  |  | +      item.v.v = category['双胞胎硬件'];
 | 
	
		
			
				|  |  | +    } else if (item.r == 40 && item.c == 2) {
 | 
	
		
			
				|  |  | +      item.v.v = category['安装'];
 | 
	
		
			
				|  |  | +    } else if (item.r == 41 && item.c == 2) {
 | 
	
		
			
				|  |  | +      item.v.v = category['土建'];
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  return psr;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default uploadExcelByUrl;
 |