cpQuote.ts 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248
  1. import { ref, reactive, toRefs } from "vue";
  2. import * as Exceljs from "exceljs";
  3. import { saveAs } from "file-saver";
  4. import { formatTime, formatAmount3, floatAdd } from "@/utils/index";
  5. import { cloneDeep } from "lodash-es";
  6. import { isFunction } from "@/utils/is";
  7. import { useUserStore } from "@/stores/modules/user";
  8. import { ElButton, ElMessage, ElPopconfirm, ElMessageBox } from "element-plus";
  9. import { CommonDynamicSelect } from "@/api/modules/common";
  10. import { useHooks } from "@/views/quote/bednetQuote/hooks/index";
  11. import { use } from "vxe-table";
  12. interface WidgetTableItem {
  13. label: string;
  14. dscrp: any;
  15. qty?: number | string;
  16. costamt?: number | string;
  17. useqty?: number | string;
  18. price?: number | string;
  19. [key: string]: any;
  20. }
  21. interface defaultState {
  22. tableData: any;
  23. oriTableData: WidgetTableItem[];
  24. enumMap: any;
  25. }
  26. interface wfQingdanProps {
  27. data: any;
  28. mxdata?: any;
  29. /**
  30. * @description 属性枚举
  31. */
  32. enumMap?: any;
  33. /**
  34. * @description 面料tab分类
  35. */
  36. fabricMx?: any;
  37. formulakindenum?: any;
  38. }
  39. export const useHooksCpQuote = (t?: any) => {
  40. const { userInfo } = useUserStore();
  41. const state = reactive<defaultState>({
  42. tableData: [],
  43. oriTableData: [
  44. {
  45. label: "床垫编码",
  46. dscrp: data => data.mattresscode,
  47. qty: "",
  48. costamt: "",
  49. useqty: "",
  50. price: ""
  51. },
  52. {
  53. label: "床垫名称",
  54. dscrp: data => data.mattressname,
  55. qty: "",
  56. costamt: "",
  57. useqty: "",
  58. price: ""
  59. },
  60. {
  61. label: "床垫类别",
  62. dscrp: data => {
  63. let _enum = state.enumMap.get("mattresstypeid");
  64. let result = "";
  65. if (_enum) {
  66. result = _enum.find(t => t.value == data.mattresstypeid).label ?? "";
  67. }
  68. return result;
  69. },
  70. qty: "",
  71. costamt: "",
  72. useqty: "",
  73. price: ""
  74. },
  75. {
  76. label: "床垫规格",
  77. dscrp: data => {
  78. return `${data.mattress_width} * ${data.mattress_length} * ${data.mattress_height}`;
  79. },
  80. qty: "",
  81. costamt: "",
  82. useqty: "",
  83. price: ""
  84. },
  85. {
  86. label: "拆装、布套",
  87. dscrp: data => {
  88. let arr = [];
  89. if (Number(data.if_m_chai) == 1) {
  90. arr.push("面拆");
  91. }
  92. if (Number(data.if_z_chai) == 1) {
  93. arr.push("中拆");
  94. }
  95. if (Number(data.if_d_chai) == 1) {
  96. arr.push("底拆");
  97. }
  98. if (Number(data.if_n_butao) == 1) {
  99. arr.push("内布套");
  100. }
  101. if (Number(data.if_w_butao) == 1) {
  102. arr.push("外布套");
  103. }
  104. return arr.join(" ");
  105. },
  106. qty: "",
  107. costamt: "",
  108. useqty: "",
  109. price: ""
  110. }
  111. ],
  112. enumMap: null
  113. });
  114. const isFilterPrice = data => {
  115. return formatAmount3({ val: data });
  116. };
  117. const wf_retrieve_qingdan_bednet = async (data: any) => {
  118. const { getDataMxAdd, getDataMxSpring, dataCallbackMx } = useHooks(t);
  119. let s_bednet_qingdan = [];
  120. // let bednetMxData = [];
  121. // let bednetMxSpringData = [];
  122. console.log("data :>> ", data);
  123. let res = await getDataMxAdd({ arg_bednetid: data.list[0].bednetid });
  124. let mxResult = dataCallbackMx(res);
  125. console.log("wf_retrieve_qingdan_bednet mxResult :>> ", mxResult);
  126. let ls_床网名称,
  127. ls_区区,
  128. ls_卷包,
  129. ls_规格,
  130. ls_排列,
  131. ls_床网高度,
  132. ls_弹簧,
  133. ls_边铁,
  134. ls_底面无纺布,
  135. ls_上垫层物料,
  136. ls_下垫层物料,
  137. ls_入袋无纺布,
  138. ls_四周加硬排数,
  139. ls_弹叉,
  140. ls_海绵包边物料,
  141. ls_填充海绵物料 = "";
  142. let item: any = {};
  143. let res2 = await getDataMxSpring({ arg_bednetid: data.list[0].bednetid });
  144. let springResult = dataCallbackMx(res2);
  145. console.log("springResult :>> ", springResult);
  146. //床网名称
  147. s_bednet_qingdan.push({
  148. pzname: "床网名称"
  149. });
  150. let enumItem = data.tableinfo.columns.find((item: any) => item.field == "bednettypeid");
  151. console.log("bednettypeid enumItem :>> ", enumItem);
  152. let _pznamemx = "";
  153. if (enumItem) {
  154. _pznamemx = enumItem.enum.find((item: any) => item.value == data.list[0].bednettypeid)?.label;
  155. }
  156. //床网类型
  157. s_bednet_qingdan.push({
  158. pzname: "床网类型",
  159. pznamemx: _pznamemx,
  160. amt: 0,
  161. useqty: 0
  162. });
  163. ls_床网名称 = s_bednet_qingdan[1].pznamemx;
  164. //规格
  165. s_bednet_qingdan.push({
  166. pzname: "规格",
  167. pznamemx: data.list[0].mattress_width + "*" + data.list[0].mattress_length + "*" + data.list[0].mattress_height,
  168. amt: 0,
  169. useqty: 0
  170. });
  171. ls_规格 = data.list[0].mattress_width + "*" + data.list[0].mattress_length;
  172. //排列
  173. s_bednet_qingdan.push({
  174. pzname: "排列",
  175. pznamemx: mxResult.list[0].spring_qty_width + "*" + mxResult.list[0].spring_qty_length,
  176. amt: 0,
  177. useqty: 0
  178. });
  179. ls_排列 = mxResult.list[0].spring_qty_width + "*" + mxResult.list[0].spring_qty_length;
  180. //床网高度
  181. s_bednet_qingdan.push({
  182. pzname: "床网高度",
  183. pznamemx: mxResult.list[0].bednet_height + "高",
  184. amt: 0,
  185. useqty: 0
  186. });
  187. ls_床网高度 = mxResult.list[0].bednet_height;
  188. item = {
  189. pzname: "弹簧线径/高度/口径/中心直径/圈数",
  190. pznamemx: "",
  191. amt: 0,
  192. useqty: 0
  193. };
  194. //弹簧线径/高度/口径/中心直径/圈数
  195. if (Number(mxResult.list[0].if_part) == 0) {
  196. item.pznamemx = mxResult.list[0].springname;
  197. ls_弹簧 = mxResult.list[0].springname;
  198. } else {
  199. let ls_left, ls_right, ls_t_temp;
  200. if (springResult.list.length > 0) {
  201. //提取 / 之前的字符串
  202. ls_left = springResult.list[1].springname.split("/")[0];
  203. //提取 / 之后的字符串
  204. ls_right = springResult.list[1].springname.split("/")[1];
  205. ls_t_temp = ls_left;
  206. springResult.list.map((t, i) => {
  207. if (i >= 1 && !ls_t_temp) {
  208. //提取 / 之前的字符串
  209. ls_left = t.springname.split("/")[0];
  210. //提取 / 之后的字符串
  211. ls_t_temp = ls_t_temp + "+" + ls_left;
  212. }
  213. });
  214. }
  215. ls_弹簧 = ls_t_temp + "/" + ls_right;
  216. }
  217. s_bednet_qingdan.push(item);
  218. //多区弹簧/高度/口径/中心直径/圈数
  219. // springResult.list.map((t, i) => {
  220. // s_bednet_qingdan.push({
  221. // pzname: `多区弹簧${i + 1}/高度/口径/中心直径/圈数`,
  222. // pznamemx: t.springname,
  223. // amt: 0,
  224. // useqty: 0
  225. // });
  226. // });
  227. for (let i = 0; i < 5; i++) {
  228. s_bednet_qingdan.push({
  229. pzname: `多区弹簧${i + 1}/高度/口径/中心直径/圈数`,
  230. pznamemx: springResult.list[i]?.springname ?? "",
  231. amt: 0,
  232. useqty: 0
  233. });
  234. }
  235. //边铁条数
  236. item = {
  237. pzname: "边铁条数",
  238. pznamemx: "",
  239. amt: 0,
  240. useqty: 0
  241. };
  242. if (Number(mxResult.list[0].side_iron_qty) > 0) {
  243. item.pznamemx = mxResult.list[0].side_iron_qty + "条";
  244. ls_边铁 = Number(mxResult.list[0].side_iron_qty) + "条边铁";
  245. } else {
  246. ls_边铁 = "无边铁";
  247. }
  248. s_bednet_qingdan.push(item);
  249. //底面无纺布
  250. item = {
  251. pzname: "底面无纺布",
  252. pznamemx: "",
  253. amt: 0,
  254. useqty: 0
  255. };
  256. if (Number(mxResult.list[0].fabrics2_mtrlid) > 0) {
  257. let enumItem = mxResult.tableinfo.columns.find((item: any) => item.field == "fabrics2_mtrlid");
  258. let _pznamemx = "";
  259. if (enumItem) {
  260. _pznamemx = enumItem.enum.find((item: any) => item.value == mxResult.list[0].fabrics2_mtrlid)?.label;
  261. }
  262. item.pznamemx = _pznamemx;
  263. ls_底面无纺布 = _pznamemx;
  264. } else {
  265. ls_底面无纺布 = "";
  266. }
  267. s_bednet_qingdan.push(item);
  268. //入袋无纺布
  269. item = {
  270. pzname: "入袋无纺布",
  271. pznamemx: "",
  272. amt: 0,
  273. useqty: 0
  274. };
  275. if (Number(mxResult.list[0].fabrics1_mtrlid) > 0) {
  276. let enumItem = mxResult.tableinfo.columns.find((item: any) => item.field == "fabrics1_mtrlid");
  277. let _pznamemx = "";
  278. if (enumItem) {
  279. _pznamemx = enumItem.enum.find((item: any) => item.value == mxResult.list[0].fabrics1_mtrlid)?.label;
  280. }
  281. item.pznamemx = _pznamemx;
  282. ls_入袋无纺布 = _pznamemx;
  283. } else {
  284. ls_入袋无纺布 = "";
  285. }
  286. s_bednet_qingdan.push(item);
  287. //上垫层物料
  288. item = {
  289. pzname: "上垫层物料",
  290. pznamemx: "",
  291. amt: 0,
  292. useqty: 0
  293. };
  294. if (data.list[0].mtrl_felt_name) {
  295. item.pznamemx = data.list[0].mtrl_felt_name;
  296. ls_上垫层物料 = data.list[0].mtrl_felt_name;
  297. } else {
  298. ls_上垫层物料 = "";
  299. }
  300. s_bednet_qingdan.push(item);
  301. //下垫层物料
  302. item = {
  303. pzname: "下垫层物料",
  304. pznamemx: "",
  305. amt: 0,
  306. useqty: 0
  307. };
  308. if (data.list[0].mtrl_felt_x_name) {
  309. item.pznamemx = data.list[0].mtrl_felt_x_name;
  310. ls_下垫层物料 = data.list[0].mtrl_felt_x_name;
  311. } else {
  312. ls_下垫层物料 = "";
  313. }
  314. s_bednet_qingdan.push(item);
  315. //四周加硬排数
  316. item = {
  317. pzname: "四周加硬排数",
  318. pznamemx: "",
  319. amt: 0,
  320. useqty: 0
  321. };
  322. if (Number(mxResult.list[0].hard_around_row) > 0) {
  323. item.pznamemx = mxResult.list[0].hard_around_row + "排" + mxResult.list[0].hard_around_springname;
  324. ls_四周加硬排数 = "四周加硬" + mxResult.list[0].hard_around_row + "排" + mxResult.list[0].hard_around_springname;
  325. } else {
  326. ls_四周加硬排数 = "";
  327. }
  328. s_bednet_qingdan.push(item);
  329. //四周加硬弹簧线径/高度/口径/中心直径/圈数
  330. item = {
  331. pzname: "四周加硬弹簧线径/高度/口径/中心直径/圈数",
  332. pznamemx: "",
  333. amt: 0,
  334. useqty: 0
  335. };
  336. if (Number(mxResult.list[0].if_hard_around) > 0) {
  337. item.pznamemx = mxResult.list[0].hard_around_springname;
  338. }
  339. s_bednet_qingdan.push(item);
  340. //海绵包边物料
  341. item = {
  342. pzname: "海绵包边物料",
  343. pznamemx: "",
  344. amt: 0,
  345. useqty: 0
  346. };
  347. if (data.list[0].mtrl_sponge_name) {
  348. item.pznamemx = data.list[0].mtrl_sponge_name;
  349. ls_海绵包边物料 = data.list[0].sponge_thickness + "分" + data.list[0].sponge_height + "高" + data.list[0].mtrl_sponge_name;
  350. } else {
  351. ls_海绵包边物料 = "";
  352. }
  353. s_bednet_qingdan.push(item);
  354. //海绵包边物料厚度
  355. item = {
  356. pzname: "海绵包边物料厚度",
  357. pznamemx: "",
  358. amt: 0,
  359. useqty: 0
  360. };
  361. if (Number(data.list[0].sponge_thickness) > 0) {
  362. item.pznamemx = data.list[0].sponge_thickness + "分";
  363. }
  364. s_bednet_qingdan.push(item);
  365. //填充海绵物料
  366. item = {
  367. pzname: "填充海绵物料",
  368. pznamemx: "",
  369. amt: 0,
  370. useqty: 0
  371. };
  372. if (data.list[0].mtrl_sponge_tc_name) {
  373. item.pznamemx = data.list[0].mtrl_sponge_tc_name;
  374. ls_填充海绵物料 =
  375. data.list[0].sponge_tc_thickness + "分" + data.list[0].sponge_tc_height + "高" + data.list[0].mtrl_sponge_tc_name;
  376. } else {
  377. ls_填充海绵物料 = "";
  378. }
  379. s_bednet_qingdan.push(item);
  380. //填充包边物料厚度
  381. item = {
  382. pzname: "填充包边物料厚度",
  383. pznamemx: "",
  384. amt: 0,
  385. useqty: 0
  386. };
  387. if (Number(data.list[0].sponge_tc_thickness) > 0) {
  388. item.pznamemx =
  389. data.list[0].sponge_tc_thickness + "分厚," + data.list[0].sponge_tc_height + "分高," + data.list[0].mtrl_sponge_tc_name;
  390. }
  391. s_bednet_qingdan.push(item);
  392. //封边物料
  393. item = {
  394. pzname: "封边物料",
  395. pznamemx: "",
  396. amt: 0,
  397. useqty: 0
  398. };
  399. if (data.list[0].mtrl_edge_name) {
  400. item.pznamemx = data.list[0].mtrl_edge_name;
  401. }
  402. s_bednet_qingdan.push(item);
  403. //封边高度
  404. item = {
  405. pzname: "封边高度",
  406. pznamemx: "",
  407. amt: 0,
  408. useqty: 0
  409. };
  410. if (Number(data.list[0].edge_height) > 0) {
  411. item.pznamemx = data.list[0].edge_height + "高";
  412. }
  413. s_bednet_qingdan.push(item);
  414. //胶条包角
  415. item = {
  416. pzname: "胶条包角",
  417. pznamemx: "",
  418. amt: 0,
  419. useqty: 0
  420. };
  421. if (Number(data.list[0].if_rsorwa) > 0) {
  422. item.pznamemx = "有";
  423. }
  424. s_bednet_qingdan.push(item);
  425. //海绵打孔
  426. item = {
  427. pzname: "海绵打孔",
  428. pznamemx: "",
  429. amt: 0,
  430. useqty: 0
  431. };
  432. if (Number(data.list[0].if_sponge_drilling) > 0) {
  433. item.pznamemx = "有";
  434. }
  435. s_bednet_qingdan.push(item);
  436. //弹叉数量
  437. item = {
  438. pzname: "弹叉数量",
  439. pznamemx: "",
  440. amt: 0,
  441. useqty: 0
  442. };
  443. if (Number(data.list[0].fork_qty) > 0) {
  444. item.pznamemx = data.list[0].fork_qty + "只弹叉";
  445. ls_弹叉 = data.list[0].fork_qty + "只弹叉";
  446. }
  447. s_bednet_qingdan.push(item);
  448. //15分布条
  449. item = {
  450. pzname: "15分布条",
  451. pznamemx: "",
  452. amt: 0,
  453. useqty: 0
  454. };
  455. if (Number(data.list[0].if_15strip) > 0) {
  456. item.pznamemx = "有";
  457. }
  458. s_bednet_qingdan.push(item);
  459. //蛇线线径
  460. item = {
  461. pzname: "蛇线线径",
  462. pznamemx: "",
  463. amt: 0,
  464. useqty: 0
  465. };
  466. if (Number(data.list[0].snake_wire_diameter) > 0) {
  467. item.pznamemx = data.list[0].snake_wire_diameter;
  468. }
  469. s_bednet_qingdan.push(item);
  470. //四周口袋弹簧排数
  471. item = {
  472. pzname: "四周口袋弹簧排数",
  473. pznamemx: "",
  474. amt: 0,
  475. useqty: 0
  476. };
  477. if (Number(mxResult.list[0].pocket_around_row) > 0) {
  478. item.pznamemx = mxResult.list[0].pocket_around_row + "排";
  479. }
  480. s_bednet_qingdan.push(item);
  481. //四周口袋弹簧线径/高度/口径/中心直径/圈数
  482. item = {
  483. pzname: "四周口袋弹簧线径/高度/口径/中心直径/圈数",
  484. pznamemx: "",
  485. amt: 0,
  486. useqty: 0
  487. };
  488. if (Number(mxResult.list[0].if_pocket_around) > 0) {
  489. item.pznamemx = mxResult.list[0].pocket_around_springname;
  490. }
  491. s_bednet_qingdan.push(item);
  492. //设置床网名称
  493. //床网类型丨规格丨排列丨高度丨单/多区丨线径丨边铁丨海绵包边丨四周加硬丨弹叉丨底面物料
  494. let ls_temp_name = s_bednet_qingdan[1].pznamemx + "丨" + s_bednet_qingdan[3].pznamemx + "丨" + s_bednet_qingdan[4].pznamemx; // + s_bednet_qingdan[3].pznamemx + '丨'
  495. if (Number(mxResult.list[0].if_part) > 0) {
  496. ls_temp_name += "丨" + data.list[0].duo_qv_str + "区";
  497. } else {
  498. if (s_bednet_qingdan[5].pznamemx != "") {
  499. ls_temp_name += "丨" + "单区";
  500. } else {
  501. ls_temp_name += "丨" + "多区";
  502. }
  503. }
  504. if (Number(mxResult.list[0].if_part) > 0) {
  505. ls_区区 = data.list[0].duo_qv_str + "区";
  506. } else {
  507. ls_区区 = "单区";
  508. }
  509. if (s_bednet_qingdan[5].pznamemx != "") {
  510. ls_temp_name += "丨" + s_bednet_qingdan[5].pznamemx;
  511. } else {
  512. if (s_bednet_qingdan[6].pznamemx != "") {
  513. ls_temp_name += "丨" + s_bednet_qingdan[6].pznamemx.split("/")[0];
  514. }
  515. if (s_bednet_qingdan[7].pznamemx != "") {
  516. ls_temp_name += "丨" + s_bednet_qingdan[7].pznamemx.split("/")[0];
  517. }
  518. if (s_bednet_qingdan[8].pznamemx != "") {
  519. ls_temp_name += "丨" + s_bednet_qingdan[8].pznamemx.split("/")[0];
  520. }
  521. if (s_bednet_qingdan[9].pznamemx != "") {
  522. ls_temp_name += "丨" + s_bednet_qingdan[9].pznamemx.split("/")[0];
  523. }
  524. if (s_bednet_qingdan[10].pznamemx != "") {
  525. ls_temp_name += "丨" + s_bednet_qingdan[10].pznamemx.split("/")[0];
  526. }
  527. }
  528. if (s_bednet_qingdan[11].pznamemx != "") {
  529. ls_temp_name += "|" + "有边铁";
  530. } else {
  531. ls_temp_name += "|" + "无边铁";
  532. }
  533. if (s_bednet_qingdan[19].pznamemx != "") {
  534. ls_temp_name += "|" + +s_bednet_qingdan[19].pznamemx + s_bednet_qingdan[18].pznamemx + "有海绵包边";
  535. }
  536. if (s_bednet_qingdan[16].pznamemx != "") {
  537. ls_temp_name += "丨" + "四周加硬" + s_bednet_qingdan[16].pznamemx;
  538. }
  539. if (s_bednet_qingdan[26].pznamemx != "") {
  540. ls_temp_name += "丨" + s_bednet_qingdan[26].pznamemx;
  541. }
  542. if (s_bednet_qingdan[12].pznamemx != "") {
  543. ls_temp_name += "丨" + "底面" + s_bednet_qingdan[12].pznamemx;
  544. } else {
  545. if (s_bednet_qingdan[14].pznamemx == "") {
  546. ls_temp_name += "丨" + "底一张" + s_bednet_qingdan[15].pznamemx;
  547. } else {
  548. if (s_bednet_qingdan[15].pznamemx == "") {
  549. ls_temp_name += "丨" + "面一张" + s_bednet_qingdan[14].pznamemx;
  550. } else {
  551. ls_temp_name += "丨" + "面底各一张" + s_bednet_qingdan[14].pznamemx;
  552. }
  553. }
  554. }
  555. if (s_bednet_qingdan[21].pznamemx != "") {
  556. ls_temp_name += "丨" + s_bednet_qingdan[21].pzname + +s_bednet_qingdan[21].pznamemx;
  557. }
  558. ls_卷包 = Number(data.list[0].if_jb) > 0 ? "卷包" : "";
  559. //20231128修改
  560. //名称: 袋装网丨单区丨卷包丨90*180丨12*31丨20高丨2.0/16.0/5.70/6.70/5.00丨2条无边铁丨底面75g白色无纺布丨上垫层1张1100g黑毡丨下垫层物料1张100g黑毡丨入袋70g白色无纺布丨四周加硬2排丨10弹叉丨8.分20高HA3070海绵包边丨8.分20高HA3070填充海绵|erp编码:
  561. if (ls_床网名称.indexOf("袋装") > -1) {
  562. ls_temp_name =
  563. ls_床网名称 +
  564. "丨" +
  565. ls_区区 +
  566. "丨" +
  567. ls_卷包 +
  568. "丨" +
  569. ls_规格 +
  570. "丨" +
  571. ls_排列 +
  572. "丨" +
  573. ls_床网高度 +
  574. "丨" +
  575. ls_弹簧 +
  576. "丨" +
  577. ls_边铁 +
  578. "丨" +
  579. ls_底面无纺布 +
  580. "丨" +
  581. ls_上垫层物料 +
  582. "丨" +
  583. ls_下垫层物料 +
  584. "丨" +
  585. ls_入袋无纺布 +
  586. "丨" +
  587. ls_四周加硬排数 +
  588. "丨" +
  589. ls_弹叉 +
  590. "丨" +
  591. ls_海绵包边物料 +
  592. "丨" +
  593. ls_填充海绵物料;
  594. }
  595. s_bednet_qingdan[0].pzname = "床网名称";
  596. s_bednet_qingdan[0].pznamemx = ls_temp_name;
  597. s_bednet_qingdan[0].amt = data.list[0].nottax_factory_cost;
  598. s_bednet_qingdan[0].useqty = 0;
  599. return s_bednet_qingdan;
  600. };
  601. const f_get_bednet_qingdan = async (bednetid: any) => {
  602. if (!Number(bednetid)) return [];
  603. let _params = {
  604. dsname: "web_bednet",
  605. queryparams: {
  606. arg_bednetid: bednetid
  607. }
  608. };
  609. let res = await CommonDynamicSelect(_params);
  610. let _data: any = {};
  611. if (res?.datatable?.length) {
  612. _data = res?.datatable[0];
  613. }
  614. let result = {
  615. list: res?.datatable,
  616. tableinfo: res?.tableinfo
  617. };
  618. console.log("f_get_bednet_qingdan _data:>> ", _data);
  619. if (!Number(_data.deptid)) {
  620. throw new Error(_data.bednetcode + ", deptid错误!");
  621. return [];
  622. }
  623. let deptEnum = state.enumMap.get("deptid");
  624. let _pricelistid = 0;
  625. if (deptEnum) {
  626. let depItem = deptEnum.find((item: any) => item.value == _data.deptid);
  627. console.log("depItem :>> ", depItem);
  628. if (depItem) {
  629. _pricelistid = Number(depItem.pricelistid);
  630. }
  631. }
  632. if (!Number(_data.bednettypeid)) {
  633. throw new Error(_data.bednetcode + ", bednettypeid错误!");
  634. }
  635. if (!Number(_pricelistid)) {
  636. throw new Error(_data.bednetcode + ", pricelistid错误!");
  637. }
  638. let rtStr = await wf_retrieve_qingdan_bednet(result);
  639. //带上erpcode?
  640. return rtStr;
  641. };
  642. /**
  643. * @description 刷新报价清单
  644. */
  645. const wf_retrieve_qingdan = (params: wfQingdanProps) => {
  646. let { data, mxdata, fabricMx, formulakindenum, enumMap } = params;
  647. state.enumMap = enumMap;
  648. state.tableData = [];
  649. let _tData = cloneDeep(state.oriTableData);
  650. state.tableData = _tData.map(item => {
  651. for (const key in item) {
  652. if (isFunction(item[key])) {
  653. item[key] = item[key](data);
  654. }
  655. }
  656. return item;
  657. });
  658. console.log("mxdata data:>> ", mxdata, data);
  659. let _mxitm = null;
  660. mxdata.map(async (item, index) => {
  661. switch (item.field) {
  662. case "tabpage_8":
  663. case "tabpage_9":
  664. case "tabpage_10":
  665. case "tabpage_11":
  666. case "tabpage_12":
  667. _mxitm = fabricMx.find(t => t.name == item.field);
  668. item.data.map(itm => {
  669. if ((Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0) && _mxitm.type.includes(Number(itm.formulakind))) {
  670. let result: any = {};
  671. result.label = itm.chastr != "" ? itm.chastr : item.label;
  672. let _formulaName = "";
  673. if (formulakindenum) {
  674. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  675. }
  676. _formulaName = _formulaName.replace(item.replace, "");
  677. // console.log("_formulaName rp:>> ", _formulaName, item.replace);
  678. result.dscrp = `${_formulaName}:${itm.mtrlname}`;
  679. if (Number(itm.thickness) > 0) {
  680. result.dscrp += ` 厚度:${isFilterPrice(itm.thickness)}`;
  681. }
  682. result.qty = Number(itm.qty);
  683. if (userInfo.usermode == 0) {
  684. result.costamt = isFilterPrice(itm.costamt ?? 0);
  685. result.useqty = Number(itm.useqty ?? 0);
  686. result.price = isFilterPrice(itm.price ?? 0);
  687. }
  688. result.index = index;
  689. state.tableData.push(result);
  690. }
  691. });
  692. break;
  693. case "tabpage_13":
  694. _mxitm = fabricMx.find(t => t.name == item.field);
  695. item.data.map(itm => {
  696. if (
  697. (Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0) &&
  698. !_mxitm.type.includes(Number(itm.formulakind))
  699. ) {
  700. let result: any = {};
  701. // result.label = itm.label;
  702. result.label = "其他工艺";
  703. let _formulaName = "";
  704. if (formulakindenum) {
  705. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  706. }
  707. _formulaName = _formulaName.replace(item.replace, "");
  708. result.dscrp = `${_formulaName}:${itm.mtrlname}`;
  709. if (Number(itm.thickness) > 0) {
  710. result.dscrp += ` 厚度:${isFilterPrice(itm.thickness)}`;
  711. }
  712. result.qty = Number(itm.qty);
  713. if (userInfo.usermode == 0) {
  714. result.costamt = isFilterPrice(itm.costamt ?? 0);
  715. result.useqty = Number(itm.useqty ?? 0);
  716. result.price = isFilterPrice(itm.price ?? 0);
  717. }
  718. result.index = index;
  719. state.tableData.push(result);
  720. }
  721. });
  722. break;
  723. case "cushions": // 垫层
  724. let _index = index;
  725. console.log("cushions item.data.bednet :>> ", item.data.bednet);
  726. console.log("cushions item.data.cushions :>> ", item.data.cushions);
  727. item.data.cushions.map(async itm => {
  728. if (Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0 || [999].includes(Number(itm.formulakind))) {
  729. let result: any = {};
  730. let _formulaName = "";
  731. if (formulakindenum) {
  732. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  733. }
  734. result.label = _formulaName;
  735. result.dscrp = itm.mtrlname;
  736. if (![999].includes(Number(itm.formulakind))) {
  737. if (Number(itm.thickness) > 0) {
  738. result.dscrp += ` 厚度:${isFilterPrice(itm.thickness)}`;
  739. }
  740. result.qty = Number(itm.qty);
  741. if (userInfo.usermode == 0) {
  742. result.costamt = isFilterPrice(itm.costamt ?? 0);
  743. result.useqty = Number(itm.useqty ?? 0);
  744. result.price = isFilterPrice(itm.price ?? 0);
  745. }
  746. result.index = _index;
  747. state.tableData.push(result);
  748. } else {
  749. // 999是床网
  750. console.log("itm.formulakind 9999:>> ", itm.formulakind);
  751. let ll_bednetid = 0;
  752. let ld_bednet_height = 0;
  753. let s_bednet_qingdan = [];
  754. // let arg_temp_msg;
  755. if (item.data.bednet.length && item.data.bednet[0].mtrlid > 0) {
  756. if (item.data.bednet.length == 1) {
  757. //单床网
  758. ll_bednetid = item.data.bednet[0].mtrlid;
  759. let s_bednet_qingdan = await f_get_bednet_qingdan(ll_bednetid);
  760. console.log("cushions item.data.bednet s_bednet_qingdan :>> ", s_bednet_qingdan);
  761. if (s_bednet_qingdan.length) {
  762. result.dscrp = s_bednet_qingdan[0].pznamemx;
  763. result.qty = 1;
  764. if (userInfo.usermode == 0) {
  765. result.costamt = isFilterPrice(s_bednet_qingdan[0]?.amt ?? 0);
  766. }
  767. }
  768. } else {
  769. //多床网
  770. item.data.bednet.map(async t => {
  771. ll_bednetid = item.data.bednet[0].mtrlid;
  772. let s_bednet_qingdan = await f_get_bednet_qingdan(ll_bednetid);
  773. if (s_bednet_qingdan.length) {
  774. result.dscrp = s_bednet_qingdan[0].pznamemx;
  775. result.qty = 1;
  776. if (userInfo.usermode == 0) {
  777. result.costamt = isFilterPrice(s_bednet_qingdan[0]?.amt ?? 0);
  778. }
  779. }
  780. });
  781. }
  782. result.index = _index;
  783. // 查找数组中,从结尾数起最后出现的index=_index的元素的索引,在起后面插入result
  784. let _arrData = cloneDeep(state.tableData);
  785. let _last = _arrData.reverse().findIndex(t => t.index == _index);
  786. if (_last == -1) {
  787. state.tableData.push(result);
  788. } else {
  789. state.tableData.splice(state.tableData.length - _last, 0, result);
  790. }
  791. }
  792. }
  793. }
  794. });
  795. break;
  796. case "accessories": // 辅料
  797. item.data.map(itm => {
  798. if (Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0) {
  799. let result: any = {};
  800. result.label = itm.label;
  801. let _formulaName = "";
  802. if (formulakindenum) {
  803. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  804. }
  805. result.label = _formulaName;
  806. result.dscrp = itm.mtrlname;
  807. if (Number(itm.thickness) > 0) {
  808. result.dscrp += ` 厚度:${isFilterPrice(itm.thickness)}`;
  809. }
  810. result.qty = Number(itm.qty);
  811. if (userInfo.usermode == 0) {
  812. result.costamt = isFilterPrice(itm.costamt ?? 0);
  813. result.useqty = Number(itm.useqty ?? 0);
  814. result.price = isFilterPrice(itm.price ?? 0);
  815. }
  816. result.index = index;
  817. state.tableData.push(result);
  818. }
  819. });
  820. break;
  821. case "packag":
  822. console.log("packag item.data :>> ", item.data, formulakindenum);
  823. item.data.map(itm => {
  824. console.log("(Number(itm.mtrlid) > 0 |:>> ", Number(itm.mtrlid) > 0);
  825. console.log(
  826. "(N Number(itm.costamt) != 0) :>> ",
  827. Number(itm.costamt) != 0,
  828. Number(itm.costamt),
  829. itm.costamt,
  830. Number(itm?.costamt),
  831. Number(itm?.costamt) != 0
  832. );
  833. console.log(
  834. "(Number(itm.mtrlid) > 0 || Number(itm.costamt) != 0) :>> ",
  835. Number(itm.mtrlid) > 0 || Number(itm.costamt) != 0
  836. );
  837. if (Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0) {
  838. let result: any = {};
  839. result.label = itm.label;
  840. let _formulaName = "";
  841. if (formulakindenum) {
  842. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  843. }
  844. result.label = _formulaName;
  845. result.dscrp = Number(itm.mtrlid) > 0 ? itm.mtrlname : _formulaName;
  846. if (Number(itm.thickness) > 0) {
  847. result.dscrp += ` 厚度:${isFilterPrice(itm.thickness)}`;
  848. }
  849. result.qty = Number(itm.qty);
  850. if (userInfo.usermode == 0) {
  851. result.costamt = isFilterPrice(itm.costamt ?? 0);
  852. result.useqty = Number(itm.useqty ?? 0);
  853. result.price = isFilterPrice(itm.price ?? 0);
  854. }
  855. result.index = index;
  856. state.tableData.push(result);
  857. }
  858. });
  859. break;
  860. }
  861. });
  862. console.log("wf_retrieve_qingdan state.tableData :>> ", state.tableData);
  863. state.tableData.push({
  864. label: "地区",
  865. dscrp: data.area ?? "",
  866. qty: "",
  867. costamt: "",
  868. useqty: "",
  869. price: ""
  870. });
  871. state.tableData.push({
  872. label: "柜型",
  873. dscrp: data.cabinet_type ?? "",
  874. qty: "",
  875. costamt: "",
  876. useqty: "",
  877. price: ""
  878. });
  879. };
  880. const formatAmount = (value: any) => {
  881. return Number(value).toFixed(2);
  882. // console.log("formatAmount value :>> ", value, formatAmount3({ val: value }));
  883. // let t = formatAmount3({ val: value })
  884. // if (t % 1 === 0) {
  885. // console.log(t);
  886. // return t
  887. // } else {
  888. // return t.toFixed(2)
  889. // }
  890. };
  891. const getSummaries = (data: any, field) => {
  892. // const { columns, data } = param;
  893. // console.log("getSummaries param :>> ", param);
  894. let sums = "";
  895. const values = data.map(item => Number(item[field]?.toString().replace(/,/g, "")));
  896. if (!values.every(value => Number.isNaN(value))) {
  897. // console.log("values :>> ", values);
  898. sums = `${values.reduce((prev, curr) => {
  899. // console.log("prev,curr :>> ", prev, curr);
  900. const value = Number(curr);
  901. if (!Number.isNaN(value)) {
  902. return floatAdd(prev, curr);
  903. } else {
  904. return prev;
  905. }
  906. }, 0)}`;
  907. }
  908. return sums;
  909. };
  910. const toExcelQuote = (params: wfQingdanProps, fileName: string) => {
  911. const { data, mxdata } = params;
  912. console.log("mainData :>> ", data);
  913. let default_font = { size: 12, name: "宋体" };
  914. let default_alignment: any = {
  915. vertical: "middle", // 垂直居中
  916. horizontal: "left", // 水平居左
  917. wrapText: true // 自动换行
  918. };
  919. const workbook = new Exceljs.Workbook(); // 创建工作簿
  920. const worksheet = workbook.addWorksheet("sheet1"); // 创建工作表(sheet1)
  921. // 冻结前7行
  922. worksheet.views = [{ state: "frozen", xSplit: 0, ySplit: 7 }];
  923. // // 设置整个工作表的背景颜色为白色
  924. // worksheet.eachRow(row => {
  925. // // row.eachCell(cell => {
  926. // // cell.fill = {
  927. // // type: "pattern",
  928. // // pattern: "solid",
  929. // // bgColor: { argb: "FFFFFFFF" } // 白色
  930. // // };
  931. // // });
  932. // row.eachCell({ includeEmpty: true }, function (cell, rowNumber) {
  933. // cell.fill = {
  934. // type: "pattern",
  935. // pattern: "solid",
  936. // bgColor: { argb: "FFFFFF" } // 白色
  937. // };
  938. // });
  939. // });
  940. // 宽度设置
  941. const ACol = worksheet.getColumn("A");
  942. ACol.width = 0.78;
  943. const BCol = worksheet.getColumn("B");
  944. BCol.width = 13.55;
  945. BCol.key = "label";
  946. BCol.style = {
  947. font: default_font,
  948. alignment: { ...default_alignment, vertical: "top" }
  949. };
  950. const CCol = worksheet.getColumn("C");
  951. CCol.width = 49.33;
  952. CCol.key = "dscrp";
  953. CCol.style = {
  954. font: default_font,
  955. alignment: default_alignment
  956. };
  957. const DCol = worksheet.getColumn("D");
  958. DCol.width = 5.69;
  959. DCol.key = "qty";
  960. DCol.style = {
  961. font: default_font,
  962. alignment: { ...default_alignment, horizontal: "center" }
  963. };
  964. const ECol = worksheet.getColumn("E");
  965. ECol.width = 10;
  966. ECol.key = "costamt";
  967. ECol.style = {
  968. font: default_font,
  969. alignment: { ...default_alignment, horizontal: "right" }
  970. };
  971. const FCol = worksheet.getColumn("F");
  972. FCol.width = 13;
  973. FCol.key = "useqty";
  974. FCol.style = {
  975. font: default_font,
  976. alignment: { ...default_alignment, horizontal: "right" }
  977. };
  978. const GCol = worksheet.getColumn("G");
  979. GCol.width = 12.48;
  980. GCol.key = "price";
  981. GCol.style = {
  982. font: default_font,
  983. alignment: { ...default_alignment, horizontal: "right" }
  984. };
  985. //======================================= 第一行 =================================
  986. // 合并A1到L1的单元格 (大标题)
  987. worksheet.mergeCells("B1:F1");
  988. const cellB1 = worksheet.getCell("B1");
  989. let foreign_cost = formatAmount(data?.foreign_cost);
  990. let currency = Number(data?.moneyrate) != 1 ? "美金" : "人民币";
  991. cellB1.value = `报价日期:${formatTime(data.createtime, "{y}-{m}-{d}", false)} 报价金额:${foreign_cost}${currency}报价清单`;
  992. // 设置第一行的单元格样式
  993. cellB1.font = { size: 15, bold: true, name: "宋体" };
  994. cellB1.alignment = default_alignment;
  995. worksheet.getRow(1).height = 26; // 设置行高
  996. //======================================= 第二行 =================================
  997. worksheet.mergeCells("B2:F2");
  998. const cellB2 = worksheet.getCell("B2");
  999. cellB2.value = `财务底价:${formatAmount(data.nottax_dept_cost)} 佣金点数:${formatAmount(
  1000. data.commission
  1001. )} 税率:${formatAmount(data.taxrate)} `;
  1002. cellB2.font = default_font;
  1003. cellB2.alignment = default_alignment;
  1004. worksheet.getRow(2).height = 39;
  1005. //======================================= 第三行 =================================
  1006. worksheet.mergeCells("B3:F3");
  1007. const cellB3 = worksheet.getCell("B3");
  1008. cellB3.value = `额外点数:${formatAmount(data.other_rate)} 额外费用:${formatAmount(
  1009. data.extras_cost
  1010. )} 汇率:${formatAmount(data.moneyrate)} `;
  1011. cellB3.font = default_font;
  1012. cellB3.alignment = default_alignment;
  1013. worksheet.getRow(3).height = 18;
  1014. //======================================= 第四行 =================================
  1015. worksheet.mergeCells("B4:F4");
  1016. const cellB4 = worksheet.getCell("B4");
  1017. cellB4.value = `款式费用:${formatAmount(data.hrcost)} 边带费用:${formatAmount(
  1018. data.biandaicost
  1019. )} 总成本:${formatAmount(data.total_cost)} `;
  1020. cellB4.font = default_font;
  1021. cellB4.alignment = default_alignment;
  1022. worksheet.getRow(4).height = 18;
  1023. //======================================= 第五行 =================================
  1024. worksheet.mergeCells("B5:F5");
  1025. const cellB5 = worksheet.getCell("B5");
  1026. cellB5.value = `工厂利润率${formatAmount(data.profitrate)} 工艺点数:${formatAmount(
  1027. data.profitrate_point
  1028. )} 不含税出厂价:${formatAmount(data.nottax_factory_cost)} `;
  1029. cellB5.font = default_font;
  1030. cellB5.alignment = default_alignment;
  1031. worksheet.getRow(5).height = 18;
  1032. //======================================= 第六行 =================================
  1033. worksheet.mergeCells("B6:F6");
  1034. const cellB6 = worksheet.getCell("B6");
  1035. cellB6.value = `部门利润率:${formatAmount(data.dept_profitrate)} FOB费用:${formatAmount(
  1036. data.fob
  1037. )} 部门售价:${formatAmount(data.nottax_dept_cost)} `;
  1038. cellB6.font = default_font;
  1039. cellB6.alignment = default_alignment;
  1040. worksheet.getRow(6).height = 18;
  1041. //======================================= 第七行 =================================
  1042. worksheet.mergeCells("B7:F7");
  1043. const cellB7 = worksheet.getCell("B7");
  1044. cellB7.value = `让利点数:${formatAmount(data.dept_profitrate_rangli)} 海绵款扣点:${formatAmount(data.haimian_point)} `;
  1045. cellB7.font = default_font;
  1046. cellB7.alignment = default_alignment;
  1047. worksheet.getRow(7).height = 18;
  1048. //======================================= 第八行 =================================
  1049. wf_retrieve_qingdan(params);
  1050. const headerRows = worksheet.insertRow(
  1051. 8,
  1052. { label: "项目", dscrp: "内容", qty: "数量", costamt: "金额", useqty: "用量", price: "单价" },
  1053. "n"
  1054. );
  1055. const insertedRows = worksheet.insertRows(9, state.tableData, "n");
  1056. // const cellBSum = worksheet.getCell(`B${9 + state.tableData.length}`);
  1057. // cellBSum.value = "材料合计:";
  1058. // const cellESum = worksheet.getCell(`E${9 + state.tableData.length}`);
  1059. // cellESum.value = getSummaries(state.tableData, "costamt");
  1060. const footerRows = worksheet.insertRow(
  1061. 9 + state.tableData.length,
  1062. { label: "材料合计:", dscrp: "", qty: "", costamt: getSummaries(state.tableData, "costamt"), useqty: "", price: "" },
  1063. "n"
  1064. );
  1065. // 设置单元格边框
  1066. let default_border: any = {
  1067. top: { style: "thin", color: { argb: "FF000000" } },
  1068. left: { style: "thin", color: { argb: "FF000000" } },
  1069. bottom: { style: "thin", color: { argb: "FF000000" } },
  1070. right: { style: "thin", color: { argb: "FF000000" } }
  1071. };
  1072. headerRows.eachCell(cell => {
  1073. cell.border = default_border;
  1074. });
  1075. footerRows.eachCell(cell => {
  1076. cell.border = default_border;
  1077. });
  1078. insertedRows.map(row => {
  1079. row.eachCell(cell => {
  1080. cell.border = default_border;
  1081. });
  1082. });
  1083. // label列内容相同时合并单元格
  1084. let same = 0;
  1085. state.tableData.map((t, i) => {
  1086. // label列内容相同的时候,多行合并单元格
  1087. if (i > 0 && t.label === state.tableData[i - 1].label) {
  1088. same++;
  1089. } else {
  1090. if (same > 0) {
  1091. worksheet.mergeCells(`B${9 + i - 1}:B${9 + i - 1 - same}`);
  1092. }
  1093. same = 0;
  1094. }
  1095. });
  1096. // insertedRows.values = {
  1097. // fill: {
  1098. // type: 'pattern',
  1099. // pattern:'darkVertical',
  1100. // fgColor:{argb:'FFFF0000'}
  1101. // }
  1102. // };
  1103. // let rows = [];
  1104. // state.tableData.map(t => {
  1105. // let arr = [];
  1106. // for (const key in t) {
  1107. // arr.push(t[key]);
  1108. // }
  1109. // rows.push(arr);
  1110. // });
  1111. // // 将表格添加到工作表
  1112. // worksheet.addTable({
  1113. // name: "MyTable",
  1114. // ref: "B8",
  1115. // style: {
  1116. // theme: "",
  1117. // },
  1118. // headerRow: true,
  1119. // totalsRow: true,
  1120. // columns: [
  1121. // { name: "项目", totalsRowLabel: "材料合计:" },
  1122. // { name: "内容" },
  1123. // { name: "数量" },
  1124. // { name: "金额", totalsRowFunction: "sum", },
  1125. // { name: "用量" },
  1126. // { name: "单价" }
  1127. // ],
  1128. // rows: rows
  1129. // });
  1130. // 下载工作簿
  1131. workbook.xlsx.writeBuffer().then(buffer => {
  1132. saveAs(new Blob([buffer], { type: "application/octet-stream" }), fileName + ".xlsx");
  1133. });
  1134. };
  1135. return {
  1136. ...toRefs(state),
  1137. wf_retrieve_qingdan,
  1138. toExcelQuote
  1139. };
  1140. };