uploadExcelByUrl.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. import LuckyExcel from 'luckyexcel';
  2. import { getToken } from '@/utils/utils';
  3. const uploadExcelByUrl = (nodeType, versionId, projectName) => {
  4. const TEMPLATE_URL = 'https://gt-digitization.oss-cn-hangzhou.aliyuncs.com/public/bom/psr.xlsx';
  5. return new Promise((resolve, reject) => {
  6. LuckyExcel.transformExcelToLuckyByUrl(
  7. TEMPLATE_URL,
  8. '模板.xlsx',
  9. async (exportJson, luckysheetfile) => {
  10. let [record] = await getExcel(versionId);
  11. let len = exportJson.sheets.length;
  12. const excelData = exportJson.sheets;
  13. delete record.id;
  14. record.index = len + '_' + Math.floor(Math.random() * 100);
  15. record.status = '0';
  16. record.name = '清单';
  17. // var sheets = [...excelData, record];
  18. var res = [];
  19. const category = getCategoryData(record);
  20. // 处理Estimate表
  21. // initEstimate(sheets[0], category);
  22. // 处理psr预算
  23. excelData[1].status = 1;
  24. res.push(initPSR(excelData[1], category, projectName));
  25. if (nodeType == 4) {
  26. // 处理现金流
  27. res.push(initActual(excelData[3], category, projectName));
  28. }
  29. res.push(record);
  30. // 隐藏Estimate表
  31. excelData[0].hide = 1;
  32. excelData[0].status = 0;
  33. res.push(excelData[0]);
  34. resolve(res.map((item, index) => ({ ...item, order: index })));
  35. }
  36. );
  37. });
  38. };
  39. async function getExcel(gridKey) {
  40. var formData = new FormData();
  41. formData.append('gridKey', gridKey);
  42. let res = await fetch(
  43. `/api/v1/purchase/record/sheet?gridKey=${gridKey}&JWT-TOKEN=${getToken()}`,
  44. {
  45. method: 'POST',
  46. body: formData,
  47. }
  48. ).then(response => response.text());
  49. return JSON.parse(JSON.parse(res));
  50. }
  51. function getCellValue(cell) {
  52. let v = '';
  53. if (cell.v) {
  54. v = cell.v;
  55. } else if (cell?.ct?.s) {
  56. v = cell.ct.s.map(item => item.v).join('');
  57. }
  58. return v;
  59. }
  60. function formatNumber(str) {
  61. const number = parseFloat(str);
  62. if (!isNaN(number) && number % 1 !== 0) {
  63. return number.toFixed(1);
  64. }
  65. return str;
  66. }
  67. // 根据清单获取表分类总价
  68. function getCategoryData(bom) {
  69. let bomData = [],
  70. bomTitle = {};
  71. bom.celldata.forEach(item => {
  72. let v = getCellValue(item.v);
  73. if (item.r == 0) {
  74. // 设置表头
  75. bomTitle[item.c] = v;
  76. } else {
  77. let key = bomTitle[item.c];
  78. if (!bomData[item.r - 1]) {
  79. bomData[item.r - 1] = {};
  80. }
  81. bomData[item.r - 1][key] = v;
  82. }
  83. });
  84. let category = {
  85. 'GT-UF膜': 0,
  86. 原平制造: 0,
  87. 其它膜: 0,
  88. 水泵: 0,
  89. 阀门: 0,
  90. 加药系统: 0,
  91. 过滤器: 0,
  92. 空压机: 0,
  93. 非标: 0,
  94. 仪表: 0,
  95. 电气自控: 0,
  96. 双胞胎硬件: 0,
  97. 材料: 0,
  98. 安装: 0,
  99. 土建: 0,
  100. 运输: 0,
  101. 其它: 0,
  102. };
  103. bomData.forEach(item => {
  104. if (category.hasOwnProperty(item['类别'])) {
  105. let price = parseFloat(item['总价(元)']);
  106. if (isNaN(price)) return;
  107. category[item['类别']] += price;
  108. }
  109. });
  110. return category;
  111. }
  112. // 处理现金流表
  113. function initActual(actual, category, projectName) {
  114. let actualCategory = [];
  115. actual.celldata.forEach((item, i, celldata) => {
  116. if (item.c == 0 && item.v?.v) {
  117. // 处理序号转float出现多余小数的情况
  118. item.v.v = formatNumber(item.v?.v);
  119. }
  120. if (item.c == 1 && item.r == 0) item.v.v = projectName;
  121. // 清单分类的总价填入对应预算列
  122. if (item.c == 2) {
  123. // c=2 为名称列
  124. let value = getCellValue(item.v);
  125. // 判断该行是否为类型总列
  126. if (category.hasOwnProperty(value)) {
  127. // 名称后第三列为预算列
  128. celldata[i + 3].v.v = category[value];
  129. }
  130. }
  131. });
  132. return actual;
  133. }
  134. // 处理毛利概算表
  135. function initEstimate(estimate, category) {
  136. estimate.celldata.forEach(item => {
  137. if (item.r == 15 && item.c == 2) {
  138. // 金科制造中心-UF膜
  139. item.v.v = category['GT-UF膜'];
  140. } else if (item.r == 14 && item.c == 2) {
  141. // 金科制造中心设备制造费
  142. item.v.v = category['原平制造'];
  143. } else if (item.r == 16 && item.c == 2) {
  144. // 设备购置费
  145. item.v.v =
  146. category['其它膜'] +
  147. category['水泵'] +
  148. category['阀门'] +
  149. category['加药系统'] +
  150. category['过滤器'] +
  151. category['空压机'] +
  152. category['非标'] +
  153. category['仪表'] +
  154. category['电气自控'] +
  155. category['材料'] +
  156. category['运输'] +
  157. category['其它'];
  158. } else if (item.r == 18 && item.c == 2) {
  159. // 数字双胞胎
  160. item.v.v = category['双胞胎硬件'];
  161. } else if (item.r == 19 && item.c == 2) {
  162. // 安装
  163. item.v.v = category['安装'];
  164. } else if (item.r == 20 && item.c == 2) {
  165. // 土建
  166. item.v.v = category['土建'];
  167. }
  168. });
  169. return estimate;
  170. }
  171. // 处理PSR表预算
  172. function initPSR(psr, category, projectName) {
  173. psr.celldata.forEach(item => {
  174. if (item.r == 0 && item.c == 1) {
  175. item.v.v = projectName;
  176. } else if (item.r == 38 && item.c == 2) {
  177. item.v.v = category['GT-UF膜'];
  178. } else if (item.r == 37 && item.c == 2) {
  179. item.v.v = category['原平制造'];
  180. } else if (item.r == 36 && item.c == 2) {
  181. item.v.v =
  182. category['其它膜'] +
  183. category['水泵'] +
  184. category['阀门'] +
  185. category['加药系统'] +
  186. category['过滤器'] +
  187. category['空压机'] +
  188. category['非标'] +
  189. category['仪表'] +
  190. category['电气自控'] +
  191. category['材料'] +
  192. category['运输'] +
  193. category['其它'];
  194. } else if (item.r == 39 && item.c == 2) {
  195. item.v.v = category['双胞胎硬件'];
  196. } else if (item.r == 40 && item.c == 2) {
  197. item.v.v = category['安装'];
  198. } else if (item.r == 41 && item.c == 2) {
  199. item.v.v = category['土建'];
  200. }
  201. });
  202. return psr;
  203. }
  204. export default uploadExcelByUrl;