cpQuote.ts 83 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455
  1. import { ref, reactive, toRefs } from "vue";
  2. import * as Exceljs from "exceljs";
  3. import { saveAs } from "file-saver";
  4. import { formatTime, formatAmount3, floatAdd, formatCutNumber, floatMul } 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. interface WidgetTableItem {
  12. label: string;
  13. dscrp: any;
  14. qty?: number | string;
  15. costamt?: number | string;
  16. useqty?: number | string;
  17. price?: number | string;
  18. [key: string]: any;
  19. }
  20. interface defaultState {
  21. tableData: any;
  22. oriTableData: WidgetTableItem[];
  23. newTableData: WidgetTableItem[];
  24. enumMap: any;
  25. // tabldId: number;
  26. bednet_qingdan: any;
  27. default_font: any;
  28. default_alignment: any;
  29. /**
  30. * @description 默认边框样式
  31. */
  32. default_border: any;
  33. /**
  34. * @description 默认表头样式
  35. */
  36. defalut_header_style: any;
  37. variables: variablesProps[];
  38. /**
  39. * @description 表头统计单元格
  40. */
  41. headerDannumCost: any[];
  42. }
  43. interface wfQingdanProps {
  44. data: any;
  45. mxdata?: any;
  46. /**
  47. * @description 属性枚举
  48. */
  49. enumMap?: any;
  50. /**
  51. * @description 面料tab分类
  52. */
  53. fabricMx?: any;
  54. formulakindenum?: any;
  55. dannum_type?: number;
  56. formula?: any;
  57. replace?: any;
  58. // replace?: any;
  59. // formula_ori?: any;
  60. differ?: any;
  61. /**
  62. * @description 表头字段
  63. */
  64. fields?: any;
  65. }
  66. interface variablesProps {
  67. /**
  68. * @description 单元格变量
  69. */
  70. cell: string;
  71. /**
  72. * @description 变量名称
  73. */
  74. field: string;
  75. }
  76. export const useHooksCpQuote = (t?: any) => {
  77. const { userInfo } = useUserStore();
  78. const state = reactive<defaultState>({
  79. // tabldId: 0,
  80. tableData: [],
  81. bednet_qingdan: [],
  82. oriTableData: [
  83. {
  84. label: "核价编码",
  85. dscrp: data => data.mattresscode,
  86. qty: "",
  87. costamt: "",
  88. useqty: "",
  89. price: ""
  90. },
  91. {
  92. label: "核价名称",
  93. dscrp: data => data.mattressname,
  94. qty: "",
  95. costamt: "",
  96. useqty: "",
  97. price: ""
  98. },
  99. {
  100. label: "床垫类别",
  101. dscrp: data => {
  102. let _enum = state.enumMap.get("mattresstypeid");
  103. let result = "";
  104. if (_enum) {
  105. result = _enum.find(t => t.value == data.mattresstypeid).label ?? "";
  106. }
  107. return result;
  108. },
  109. qty: "",
  110. costamt: "",
  111. useqty: "",
  112. price: ""
  113. },
  114. {
  115. label: "床垫规格",
  116. dscrp: data => {
  117. return `${data.mattress_width} * ${data.mattress_length} * ${data.mattress_height}`;
  118. },
  119. qty: "",
  120. costamt: "",
  121. useqty: "",
  122. price: ""
  123. },
  124. {
  125. label: "拆装、布套",
  126. dscrp: data => {
  127. let arr = [];
  128. if (Number(data.if_m_chai) == 1) {
  129. arr.push("面拆");
  130. }
  131. if (Number(data.if_z_chai) == 1) {
  132. arr.push("中拆");
  133. }
  134. if (Number(data.if_d_chai) == 1) {
  135. arr.push("底拆");
  136. }
  137. if (Number(data.if_n_butao) == 1) {
  138. arr.push("内布套");
  139. }
  140. if (Number(data.if_w_butao) == 1) {
  141. arr.push("外布套");
  142. }
  143. return arr.join(" ");
  144. },
  145. qty: "",
  146. costamt: "",
  147. useqty: "",
  148. price: ""
  149. }
  150. ],
  151. newTableData: [],
  152. enumMap: null,
  153. default_font: { size: 12, name: "宋体" },
  154. default_alignment: {
  155. vertical: "middle", // 垂直居中
  156. horizontal: "left", // 水平居左
  157. wrapText: true // 自动换行
  158. },
  159. defalut_header_style: {
  160. font: { size: 15, bold: true, name: "宋体" },
  161. alignment: { horizontal: "right" },
  162. height: 26
  163. },
  164. default_border: {
  165. top: { style: "thin", color: { argb: "FF000000" } },
  166. left: { style: "thin", color: { argb: "FF000000" } },
  167. bottom: { style: "thin", color: { argb: "FF000000" } },
  168. right: { style: "thin", color: { argb: "FF000000" } }
  169. },
  170. variables: [],
  171. headerDannumCost: [
  172. {
  173. level: "部门不含税价",
  174. level1: "小计",
  175. cellCol: "J",
  176. rowIndex: 0,
  177. showCell: "G1",
  178. field: "dannum_cost2"
  179. },
  180. {
  181. level: "部门不含税价",
  182. level1: "小计",
  183. cellCol: "K",
  184. rowIndex: 0,
  185. showCell: "I1",
  186. field: "dannum_cost1"
  187. },
  188. {
  189. level: "部门不含税价",
  190. level1: "小计",
  191. cellCol: "L",
  192. rowIndex: 0,
  193. showCell: "K1",
  194. field: "dannum_cost4"
  195. },
  196. {
  197. level: "部门不含税价",
  198. level1: "小计",
  199. cellCol: "M",
  200. rowIndex: 0,
  201. showCell: "M1",
  202. field: "dannum_cost3"
  203. }
  204. ]
  205. });
  206. const isFilterPrice = data => {
  207. return formatAmount3({ val: data });
  208. };
  209. const setResultData = (target: any, label: string, value: any) => {
  210. let result = cloneDeep(target);
  211. let _value = formatCutNumber({ val: value });
  212. result.label = label;
  213. if (userInfo.usermode == 0) {
  214. result.costamt = _value;
  215. result.costamt_1 = _value;
  216. result.costamt_2 = _value;
  217. result.costamt_3 = _value;
  218. result.costamt_4 = _value;
  219. }
  220. return result;
  221. };
  222. const wf_retrieve_qingdan_bednet = async (data: any, index: any, isNew = false) => {
  223. const { getDataMxAdd, getDataMxSpring, dataCallback } = useHooks(t);
  224. const bednet = data.list[0];
  225. let s_bednet_qingdan = [];
  226. let bednet_qingdan_item = [];
  227. let default_bednet_qingdan = {
  228. level: "车间成本",
  229. level1: "总床网车间成本",
  230. level2: `床网${index + 1} - 总材料成本`
  231. };
  232. // let bednetMxData = [];
  233. // let bednetMxSpringData = [];
  234. console.log("wf_retrieve_qingdan_bednet data :>> ", data);
  235. let res = await getDataMxAdd({ arg_bednetid: bednet.bednetid });
  236. let mxResult = dataCallback(res);
  237. console.log("wf_retrieve_qingdan_bednet mxResult :>> ", mxResult);
  238. let ls_床网名称,
  239. ls_区区,
  240. ls_卷包,
  241. ls_规格,
  242. ls_排列,
  243. ls_床网高度,
  244. ls_弹簧,
  245. ls_边铁,
  246. ls_底面无纺布,
  247. ls_上垫层物料,
  248. ls_下垫层物料,
  249. ls_入袋无纺布,
  250. ls_四周加硬排数 = "",
  251. ls_弹叉 = "",
  252. ls_海绵包边物料 = "",
  253. ls_填充海绵物料 = "";
  254. let item: any = {};
  255. let res2 = await getDataMxSpring({ arg_bednetid: bednet.bednetid });
  256. let springResult = dataCallback(res2);
  257. console.log("springResult :>> ", springResult);
  258. //床网名称
  259. s_bednet_qingdan.push({
  260. pzname: "床网名称"
  261. });
  262. let enumItem = data.tableinfo.columns.find((item: any) => item.field == "bednettypeid");
  263. console.log("bednettypeid enumItem :>> ", enumItem);
  264. let _pznamemx = "";
  265. if (enumItem) {
  266. _pznamemx = enumItem.enum.find((item: any) => item.value == bednet.bednettypeid)?.label;
  267. }
  268. //床网类型
  269. s_bednet_qingdan.push({
  270. pzname: "床网类型",
  271. pznamemx: _pznamemx,
  272. amt: 0,
  273. useqty: 0
  274. });
  275. ls_床网名称 = s_bednet_qingdan[1].pznamemx;
  276. //规格
  277. s_bednet_qingdan.push({
  278. pzname: "规格",
  279. pznamemx: bednet.mattress_width + "*" + bednet.mattress_length + "*" + bednet.mattress_height,
  280. amt: 0,
  281. useqty: 0
  282. });
  283. ls_规格 = bednet.mattress_width + "*" + bednet.mattress_length;
  284. //排列
  285. s_bednet_qingdan.push({
  286. pzname: "排列",
  287. pznamemx: mxResult.list[0].spring_qty_width + "*" + mxResult.list[0].spring_qty_length,
  288. amt: 0,
  289. useqty: 0
  290. });
  291. ls_排列 = mxResult.list[0].spring_qty_width + "*" + mxResult.list[0].spring_qty_length;
  292. //床网高度
  293. s_bednet_qingdan.push({
  294. pzname: "床网高度",
  295. pznamemx: mxResult.list[0].bednet_height + "高",
  296. amt: 0,
  297. useqty: 0
  298. });
  299. ls_床网高度 = mxResult.list[0].bednet_height + "高";
  300. item = {
  301. pzname: "弹簧线径/高度/口径/中心直径/圈数",
  302. pznamemx: "",
  303. amt: 0,
  304. useqty: 0
  305. };
  306. //弹簧线径/高度/口径/中心直径/圈数
  307. if (Number(mxResult.list[0].if_part) == 0) {
  308. item.pznamemx = mxResult.list[0].springname;
  309. ls_弹簧 = mxResult.list[0].springname;
  310. let result = cloneDeep(default_bednet_qingdan);
  311. result.label = "弹簧";
  312. result.dscrp = ls_弹簧;
  313. if (userInfo.usermode == 0) {
  314. result.costamt = bednet.spring_mtrl_cost;
  315. result.costamt_1 = isFilterPrice(
  316. formatCutNumber({ val: floatMul(mxResult.list[0].spring_mtrl_cost ?? 0, 1 + mxResult.list[0].dannum1_rate) })
  317. );
  318. result.costamt_2 = isFilterPrice(
  319. formatCutNumber({ val: floatMul(mxResult.list[0].spring_mtrl_cost ?? 0, 1 + mxResult.list[0].dannum2_rate) })
  320. );
  321. result.costamt_3 = isFilterPrice(
  322. formatCutNumber({ val: floatMul(mxResult.list[0].spring_mtrl_cost ?? 0, 1 + mxResult.list[0].dannum3_rate) })
  323. );
  324. result.costamt_4 = isFilterPrice(
  325. formatCutNumber({ val: floatMul(mxResult.list[0].spring_mtrl_cost ?? 0, 1 + mxResult.list[0].dannum4_rate) })
  326. );
  327. }
  328. bednet_qingdan_item.push(result);
  329. } else {
  330. let ls_left, ls_right, ls_t_temp, ls_t_name;
  331. if (springResult.list.length > 0) {
  332. ls_t_name = springResult.list[0].springname;
  333. ls_left = ls_t_name.substring(0, ls_t_name.indexOf("/"));
  334. ls_right = ls_t_name.substring(ls_t_name.indexOf("/") + 1);
  335. // //提取 / 之前的字符串
  336. // ls_left = springResult.list[0].springname.split("/")[0];
  337. // //提取 / 之后的字符串
  338. // ls_right = springResult.list[0].springname.split("/")[1];
  339. ls_t_temp = ls_left;
  340. springResult.list.map((t, i) => {
  341. console.log("springResult.list t, i :>> ", t, i, i >= 1 && ls_t_temp);
  342. if (i >= 1 && ls_t_temp) {
  343. //提取 / 之前的字符串
  344. ls_left = t.springname.substring(0, t.springname.indexOf("/"));
  345. // ls_left = t.springname.split("/")[0];
  346. //提取 / 之后的字符串
  347. ls_t_temp = ls_t_temp + "+" + ls_left;
  348. console.log("ls_t_temp :>> ", ls_t_temp);
  349. }
  350. let result = cloneDeep(default_bednet_qingdan);
  351. result.label = "弹簧";
  352. result.dscrp = t.springname;
  353. if (userInfo.usermode == 0) {
  354. result.costamt = t.spring_mtrl_cost;
  355. result.costamt_1 = isFilterPrice(
  356. formatCutNumber({ val: floatMul(t.spring_mtrl_cost ?? 0, 1 + mxResult.list[0].dannum1_rate) })
  357. );
  358. result.costamt_2 = isFilterPrice(
  359. formatCutNumber({ val: floatMul(t.spring_mtrl_cost ?? 0, 1 + mxResult.list[0].dannum2_rate) })
  360. );
  361. result.costamt_3 = isFilterPrice(
  362. formatCutNumber({ val: floatMul(t.spring_mtrl_cost ?? 0, 1 + mxResult.list[0].dannum3_rate) })
  363. );
  364. result.costamt_4 = isFilterPrice(
  365. formatCutNumber({ val: floatMul(t.spring_mtrl_cost ?? 0, 1 + mxResult.list[0].dannum4_rate) })
  366. );
  367. }
  368. bednet_qingdan_item.push(result);
  369. });
  370. }
  371. ls_弹簧 = ls_t_temp + "/" + ls_right;
  372. }
  373. s_bednet_qingdan.push(item);
  374. console.log("s_bednet_qingdan ls_弹簧:>> ", ls_弹簧);
  375. //多区弹簧/高度/口径/中心直径/圈数
  376. // springResult.list.map((t, i) => {
  377. // s_bednet_qingdan.push({
  378. // pzname: `多区弹簧${i + 1}/高度/口径/中心直径/圈数`,
  379. // pznamemx: t.springname,
  380. // amt: 0,
  381. // useqty: 0
  382. // });
  383. // });
  384. for (let i = 0; i < 5; i++) {
  385. s_bednet_qingdan.push({
  386. pzname: `多区弹簧${i + 1}/高度/口径/中心直径/圈数`,
  387. pznamemx: springResult.list[i]?.springname ?? "",
  388. amt: 0,
  389. useqty: 0
  390. });
  391. }
  392. //边铁条数
  393. item = {
  394. pzname: "边铁条数",
  395. pznamemx: "",
  396. amt: 0,
  397. useqty: 0
  398. };
  399. if (Number(mxResult.list[0].side_iron_qty) > 0) {
  400. item.pznamemx = mxResult.list[0].side_iron_qty + "条";
  401. ls_边铁 = Number(mxResult.list[0].side_iron_qty) + "条边铁";
  402. let result = cloneDeep(default_bednet_qingdan);
  403. result.label = "边铁";
  404. result.dscrp = ls_边铁;
  405. if (userInfo.usermode == 0) {
  406. result.costamt = mxResult.list[0].side_iron_mtrl_cost;
  407. result.costamt_1 = mxResult.list[0].side_iron_mtrl_cost;
  408. result.costamt_2 = mxResult.list[0].side_iron_mtrl_cost;
  409. result.costamt_3 = mxResult.list[0].side_iron_mtrl_cost;
  410. result.costamt_4 = mxResult.list[0].side_iron_mtrl_cost;
  411. }
  412. bednet_qingdan_item.push(result);
  413. } else {
  414. ls_边铁 = "无边铁";
  415. }
  416. s_bednet_qingdan.push(item);
  417. //底面无纺布
  418. item = {
  419. pzname: "底面无纺布",
  420. pznamemx: "",
  421. amt: 0,
  422. useqty: 0
  423. };
  424. if (Number(mxResult.list[0].fabrics2_mtrlid) > 0) {
  425. let enumItem = mxResult.tableinfo.columns.find((item: any) => item.field == "fabrics2_mtrlid");
  426. let _pznamemx = "";
  427. let enumItem_enum = null;
  428. console.log("fabrics2_mtrlid enumItem :>> ", enumItem);
  429. if (enumItem) {
  430. enumItem_enum = enumItem.enum.find((item: any) => item.value == mxResult.list[0].fabrics2_mtrlid);
  431. _pznamemx = enumItem_enum?.label;
  432. }
  433. item.pznamemx = _pznamemx;
  434. ls_底面无纺布 = _pznamemx;
  435. let result = cloneDeep(default_bednet_qingdan);
  436. result.label = "底面无纺布";
  437. result.dscrp = ls_底面无纺布;
  438. if (userInfo.usermode == 0) {
  439. result.costamt = mxResult.list[0].fabrics2_mtrl_cost;
  440. result.costamt_1 = isFilterPrice(
  441. formatCutNumber({ val: floatMul(mxResult.list[0].fabrics2_mtrl_cost ?? 0, 1 + enumItem_enum?.dannum1_rate) })
  442. );
  443. result.costamt_2 = isFilterPrice(
  444. formatCutNumber({ val: floatMul(mxResult.list[0].fabrics2_mtrl_cost ?? 0, 1 + enumItem_enum?.dannum2_rate) })
  445. );
  446. result.costamt_3 = isFilterPrice(
  447. formatCutNumber({ val: floatMul(mxResult.list[0].fabrics2_mtrl_cost ?? 0, 1 + enumItem_enum?.dannum3_rate) })
  448. );
  449. result.costamt_4 = isFilterPrice(
  450. formatCutNumber({ val: floatMul(mxResult.list[0].fabrics2_mtrl_cost ?? 0, 1 + enumItem_enum?.dannum4_rate) })
  451. );
  452. }
  453. bednet_qingdan_item.push(result);
  454. } else {
  455. ls_底面无纺布 = "";
  456. }
  457. console.log("ls_底面无纺布 :>> ", ls_底面无纺布);
  458. s_bednet_qingdan.push(item);
  459. //入袋无纺布
  460. item = {
  461. pzname: "入袋无纺布",
  462. pznamemx: "",
  463. amt: 0,
  464. useqty: 0
  465. };
  466. console.log("Number(bednet.fabrics1_mtrlid) :>> ", Number(mxResult.list[0].fabrics1_mtrlid), mxResult.list[0]);
  467. if (Number(mxResult.list[0].fabrics1_mtrlid) > 0) {
  468. let enumItem = mxResult.tableinfo.columns.find((item: any) => item.field == "fabrics1_mtrlid");
  469. let enumItem_enum = null;
  470. let _pznamemx = "";
  471. if (enumItem) {
  472. enumItem_enum = enumItem.enum.find((item: any) => item.value == mxResult.list[0].fabrics1_mtrlid);
  473. _pznamemx = enumItem_enum?.label;
  474. }
  475. item.pznamemx = _pznamemx;
  476. ls_入袋无纺布 = _pznamemx;
  477. let result = cloneDeep(default_bednet_qingdan);
  478. result.label = "入袋无纺布";
  479. result.dscrp = ls_入袋无纺布;
  480. if (userInfo.usermode == 0) {
  481. result.costamt = mxResult.list[0].fabrics1_mtrl_cost;
  482. result.costamt_1 = isFilterPrice(
  483. formatCutNumber({ val: floatMul(mxResult.list[0].fabrics1_mtrl_cost ?? 0, 1 + enumItem_enum?.dannum1_rate) })
  484. );
  485. result.costamt_2 = isFilterPrice(
  486. formatCutNumber({ val: floatMul(mxResult.list[0].fabrics1_mtrl_cost ?? 0, 1 + enumItem_enum?.dannum2_rate) })
  487. );
  488. result.costamt_3 = isFilterPrice(
  489. formatCutNumber({ val: floatMul(mxResult.list[0].fabrics1_mtrl_cost ?? 0, 1 + enumItem_enum?.dannum3_rate) })
  490. );
  491. result.costamt_4 = isFilterPrice(
  492. formatCutNumber({ val: floatMul(mxResult.list[0].fabrics1_mtrl_cost ?? 0, 1 + enumItem_enum?.dannum4_rate) })
  493. );
  494. }
  495. bednet_qingdan_item.push(result);
  496. } else {
  497. ls_入袋无纺布 = "";
  498. }
  499. s_bednet_qingdan.push(item);
  500. //上垫层物料
  501. item = {
  502. pzname: "上垫层物料",
  503. pznamemx: "",
  504. amt: 0,
  505. useqty: 0
  506. };
  507. if (Number(bednet.felt_mtrlid) > 0) {
  508. item.pznamemx = bednet.mtrl_felt_name;
  509. ls_上垫层物料 = bednet.mtrl_felt_name;
  510. let result = cloneDeep(default_bednet_qingdan);
  511. result.label = "上垫层物料";
  512. result.dscrp = ls_上垫层物料;
  513. if (userInfo.usermode == 0) {
  514. result.costamt = bednet.felt_mtrl_cost;
  515. result.costamt_1 = bednet.felt_mtrl_cost;
  516. result.costamt_2 = bednet.felt_mtrl_cost;
  517. result.costamt_3 = bednet.felt_mtrl_cost;
  518. result.costamt_4 = bednet.felt_mtrl_cost;
  519. }
  520. bednet_qingdan_item.push(result);
  521. } else {
  522. ls_上垫层物料 = "";
  523. }
  524. s_bednet_qingdan.push(item);
  525. //下垫层物料
  526. item = {
  527. pzname: "下垫层物料",
  528. pznamemx: "",
  529. amt: 0,
  530. useqty: 0
  531. };
  532. if (Number(bednet.felt_x_mtrlid) > 0) {
  533. item.pznamemx = bednet.mtrl_felt_x_name;
  534. ls_下垫层物料 = bednet.mtrl_felt_x_name;
  535. let result = cloneDeep(default_bednet_qingdan);
  536. result.label = "下垫层物料";
  537. result.dscrp = ls_下垫层物料;
  538. if (userInfo.usermode == 0) {
  539. result.costamt = bednet.felt_mtrl_x_cost;
  540. result.costamt_1 = bednet.felt_mtrl_x_cost;
  541. result.costamt_2 = bednet.felt_mtrl_x_cost;
  542. result.costamt_3 = bednet.felt_mtrl_x_cost;
  543. result.costamt_4 = bednet.felt_mtrl_x_cost;
  544. }
  545. bednet_qingdan_item.push(result);
  546. } else {
  547. ls_下垫层物料 = "";
  548. }
  549. s_bednet_qingdan.push(item);
  550. //四周加硬排数
  551. item = {
  552. pzname: "四周加硬排数",
  553. pznamemx: "",
  554. amt: 0,
  555. useqty: 0
  556. };
  557. if (Number(mxResult.list[0].hard_around_row) > 0) {
  558. item.pznamemx = mxResult.list[0].hard_around_row + "排" + mxResult.list[0].hard_around_springname;
  559. ls_四周加硬排数 = "四周加硬" + mxResult.list[0].hard_around_row + "排" + mxResult.list[0].hard_around_springname;
  560. }
  561. console.log("ls_四周加硬排数 :>> ", ls_四周加硬排数);
  562. s_bednet_qingdan.push(item);
  563. //四周加硬弹簧线径/高度/口径/中心直径/圈数
  564. item = {
  565. pzname: "四周加硬弹簧线径/高度/口径/中心直径/圈数",
  566. pznamemx: "",
  567. amt: 0,
  568. useqty: 0
  569. };
  570. if (Number(mxResult.list[0].if_hard_around) > 0) {
  571. item.pznamemx = mxResult.list[0].hard_around_springname;
  572. let result = cloneDeep(default_bednet_qingdan);
  573. result.label = "四周加硬弹簧";
  574. result.dscrp = mxResult.list[0].hard_around_springname;
  575. if (userInfo.usermode == 0) {
  576. result.costamt = mxResult.list[0].hard_around_mtrl_cost;
  577. result.costamt_1 = mxResult.list[0].hard_around_mtrl_cost;
  578. result.costamt_2 = mxResult.list[0].hard_around_mtrl_cost;
  579. result.costamt_3 = mxResult.list[0].hard_around_mtrl_cost;
  580. result.costamt_4 = mxResult.list[0].hard_around_mtrl_cost;
  581. }
  582. bednet_qingdan_item.push(result);
  583. }
  584. s_bednet_qingdan.push(item);
  585. //海绵包边物料
  586. item = {
  587. pzname: "海绵包边物料",
  588. pznamemx: "",
  589. amt: 0,
  590. useqty: 0
  591. };
  592. if (bednet.mtrl_sponge_name) {
  593. item.pznamemx = bednet.mtrl_sponge_name;
  594. ls_海绵包边物料 = bednet.sponge_thickness + "分" + bednet.sponge_height + "高" + bednet.mtrl_sponge_name;
  595. let result = cloneDeep(default_bednet_qingdan);
  596. result.label = "海绵包边物料:" + bednet.mtrl_sponge_name;
  597. result.dscrp = ls_海绵包边物料;
  598. if (userInfo.usermode == 0) {
  599. result.costamt = bednet.sponge_mtrl_cost;
  600. result.costamt_1 = bednet.sponge_mtrl_cost;
  601. result.costamt_2 = bednet.sponge_mtrl_cost;
  602. result.costamt_3 = bednet.sponge_mtrl_cost;
  603. result.costamt_4 = bednet.sponge_mtrl_cost;
  604. }
  605. bednet_qingdan_item.push(result);
  606. }
  607. s_bednet_qingdan.push(item);
  608. //海绵包边物料厚度
  609. item = {
  610. pzname: "海绵包边物料厚度",
  611. pznamemx: "",
  612. amt: 0,
  613. useqty: 0
  614. };
  615. if (Number(bednet.sponge_thickness) > 0) {
  616. item.pznamemx = bednet.sponge_thickness + "分";
  617. }
  618. s_bednet_qingdan.push(item);
  619. //填充海绵物料
  620. item = {
  621. pzname: "填充海绵物料",
  622. pznamemx: "",
  623. amt: 0,
  624. useqty: 0
  625. };
  626. if (bednet.mtrl_sponge_tc_name) {
  627. item.pznamemx = bednet.mtrl_sponge_tc_name;
  628. ls_填充海绵物料 = bednet.sponge_tc_thickness + "分" + bednet.sponge_tc_height + "高" + bednet.mtrl_sponge_tc_name;
  629. let result = cloneDeep(default_bednet_qingdan);
  630. result.label = "填充海绵物料:" + bednet.mtrl_sponge_tc_name;
  631. result.dscrp = ls_填充海绵物料;
  632. if (userInfo.usermode == 0) {
  633. result.costamt = bednet.sponge_mtrl_tc_cost;
  634. result.costamt_1 = bednet.sponge_mtrl_tc_cost;
  635. result.costamt_2 = bednet.sponge_mtrl_tc_cost;
  636. result.costamt_3 = bednet.sponge_mtrl_tc_cost;
  637. result.costamt_4 = bednet.sponge_mtrl_tc_cost;
  638. }
  639. bednet_qingdan_item.push(result);
  640. } else {
  641. ls_填充海绵物料 = "";
  642. }
  643. s_bednet_qingdan.push(item);
  644. //填充包边物料厚度
  645. item = {
  646. pzname: "填充包边物料厚度",
  647. pznamemx: "",
  648. amt: 0,
  649. useqty: 0
  650. };
  651. if (Number(bednet.sponge_tc_thickness) > 0) {
  652. item.pznamemx = bednet.sponge_tc_thickness + "分厚," + bednet.sponge_tc_height + "分高," + bednet.mtrl_sponge_tc_name;
  653. }
  654. s_bednet_qingdan.push(item);
  655. //封边物料
  656. item = {
  657. pzname: "封边物料",
  658. pznamemx: "",
  659. amt: 0,
  660. useqty: 0
  661. };
  662. if (bednet.mtrl_edge_name) {
  663. item.pznamemx = bednet.mtrl_edge_name;
  664. }
  665. s_bednet_qingdan.push(item);
  666. //封边高度
  667. item = {
  668. pzname: "封边高度",
  669. pznamemx: "",
  670. amt: 0,
  671. useqty: 0
  672. };
  673. if (Number(bednet.edge_height) > 0) {
  674. item.pznamemx = bednet.edge_height + "高";
  675. }
  676. s_bednet_qingdan.push(item);
  677. //胶条包角
  678. item = {
  679. pzname: "胶条包角",
  680. pznamemx: "",
  681. amt: 0,
  682. useqty: 0
  683. };
  684. if (Number(bednet.if_rsorwa) > 0) {
  685. item.pznamemx = "有";
  686. }
  687. s_bednet_qingdan.push(item);
  688. //海绵打孔
  689. item = {
  690. pzname: "海绵打孔",
  691. pznamemx: "",
  692. amt: 0,
  693. useqty: 0
  694. };
  695. if (Number(bednet.if_sponge_drilling) > 0) {
  696. item.pznamemx = "有";
  697. }
  698. s_bednet_qingdan.push(item);
  699. //弹叉数量
  700. item = {
  701. pzname: "弹叉数量",
  702. pznamemx: "",
  703. amt: 0,
  704. useqty: 0
  705. };
  706. console.log("ls_弹叉 bf:>> ", ls_弹叉, bednet.fork_qty);
  707. if (Number(bednet.fork_qty) > 0) {
  708. item.pznamemx = bednet.fork_qty + "只弹叉";
  709. ls_弹叉 = bednet.fork_qty + "只弹叉";
  710. }
  711. console.log("ls_弹叉 :>> ", ls_弹叉);
  712. s_bednet_qingdan.push(item);
  713. //15分布条
  714. item = {
  715. pzname: "15分布条",
  716. pznamemx: "",
  717. amt: 0,
  718. useqty: 0
  719. };
  720. if (Number(bednet.if_15strip) > 0) {
  721. item.pznamemx = "有";
  722. }
  723. s_bednet_qingdan.push(item);
  724. //蛇线线径
  725. item = {
  726. pzname: "蛇线线径",
  727. pznamemx: "",
  728. amt: 0,
  729. useqty: 0
  730. };
  731. if (Number(bednet.snake_wire_diameter) > 0) {
  732. item.pznamemx = bednet.snake_wire_diameter;
  733. }
  734. s_bednet_qingdan.push(item);
  735. //四周口袋弹簧排数
  736. item = {
  737. pzname: "四周口袋弹簧排数",
  738. pznamemx: "",
  739. amt: 0,
  740. useqty: 0
  741. };
  742. if (Number(bednet.pocket_around_row) > 0) {
  743. item.pznamemx = bednet.pocket_around_row + "排";
  744. }
  745. s_bednet_qingdan.push(item);
  746. //四周口袋弹簧线径/高度/口径/中心直径/圈数
  747. item = {
  748. pzname: "四周口袋弹簧线径/高度/口径/中心直径/圈数",
  749. pznamemx: "",
  750. amt: 0,
  751. useqty: 0
  752. };
  753. if (Number(bednet.if_pocket_around) > 0) {
  754. item.pznamemx = bednet.pocket_around_springname;
  755. }
  756. s_bednet_qingdan.push(item);
  757. //设置床网名称
  758. //床网类型丨规格丨排列丨高度丨单/多区丨线径丨边铁丨海绵包边丨四周加硬丨弹叉丨底面物料
  759. let ls_temp_name = s_bednet_qingdan[1].pznamemx + "丨" + s_bednet_qingdan[3].pznamemx + "丨" + s_bednet_qingdan[4].pznamemx; // + s_bednet_qingdan[3].pznamemx + '丨'
  760. if (Number(bednet.if_part) > 0) {
  761. ls_temp_name += "丨" + bednet.duo_qv_str + "区";
  762. } else {
  763. if (s_bednet_qingdan[5].pznamemx != "") {
  764. ls_temp_name += "丨" + "单区";
  765. } else {
  766. ls_temp_name += "丨" + "多区";
  767. }
  768. }
  769. if (Number(bednet.if_part) > 0) {
  770. ls_区区 = bednet.duo_qv_str + "区";
  771. } else {
  772. ls_区区 = "单区";
  773. }
  774. if (s_bednet_qingdan[5].pznamemx != "") {
  775. ls_temp_name += "丨" + s_bednet_qingdan[5].pznamemx;
  776. } else {
  777. if (s_bednet_qingdan[6].pznamemx != "") {
  778. ls_temp_name += "丨" + s_bednet_qingdan[6].pznamemx.split("/")[0];
  779. }
  780. if (s_bednet_qingdan[7].pznamemx != "") {
  781. ls_temp_name += "丨" + s_bednet_qingdan[7].pznamemx.split("/")[0];
  782. }
  783. if (s_bednet_qingdan[8].pznamemx != "") {
  784. ls_temp_name += "丨" + s_bednet_qingdan[8].pznamemx.split("/")[0];
  785. }
  786. if (s_bednet_qingdan[9].pznamemx != "") {
  787. ls_temp_name += "丨" + s_bednet_qingdan[9].pznamemx.split("/")[0];
  788. }
  789. if (s_bednet_qingdan[10].pznamemx != "") {
  790. ls_temp_name += "丨" + s_bednet_qingdan[10].pznamemx.split("/")[0];
  791. }
  792. }
  793. if (s_bednet_qingdan[11].pznamemx != "") {
  794. ls_temp_name += "|" + "有边铁";
  795. } else {
  796. ls_temp_name += "|" + "无边铁";
  797. }
  798. if (s_bednet_qingdan[19].pznamemx != "") {
  799. ls_temp_name += "|" + +s_bednet_qingdan[19].pznamemx + s_bednet_qingdan[18].pznamemx + "有海绵包边";
  800. }
  801. if (s_bednet_qingdan[16].pznamemx != "") {
  802. ls_temp_name += "丨" + "四周加硬" + s_bednet_qingdan[16].pznamemx;
  803. }
  804. if (s_bednet_qingdan[26].pznamemx != "") {
  805. ls_temp_name += "丨" + s_bednet_qingdan[26].pznamemx;
  806. }
  807. if (s_bednet_qingdan[12].pznamemx != "") {
  808. ls_temp_name += "丨" + "底面" + s_bednet_qingdan[12].pznamemx;
  809. } else {
  810. if (s_bednet_qingdan[14].pznamemx == "") {
  811. ls_temp_name += "丨" + "底一张" + s_bednet_qingdan[15].pznamemx;
  812. } else {
  813. if (s_bednet_qingdan[15].pznamemx == "") {
  814. ls_temp_name += "丨" + "面一张" + s_bednet_qingdan[14].pznamemx;
  815. } else {
  816. ls_temp_name += "丨" + "面底各一张" + s_bednet_qingdan[14].pznamemx;
  817. }
  818. }
  819. }
  820. if (s_bednet_qingdan[21].pznamemx != "") {
  821. ls_temp_name += "丨" + s_bednet_qingdan[21].pzname + +s_bednet_qingdan[21].pznamemx;
  822. }
  823. console.log("wfqingdan data.list[0].if_jb :>> ", data, bednet.if_jb);
  824. ls_卷包 = Number(bednet.if_jb) > 0 ? "卷包" : "";
  825. //20231128修改
  826. //名称: 袋装网丨单区丨卷包丨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编码:
  827. if (ls_床网名称.indexOf("袋装") > -1) {
  828. ls_temp_name =
  829. ls_床网名称 +
  830. "丨" +
  831. ls_区区 +
  832. "丨" +
  833. ls_卷包 +
  834. "丨" +
  835. ls_规格 +
  836. "丨" +
  837. ls_排列 +
  838. "丨" +
  839. ls_床网高度 +
  840. "丨" +
  841. ls_弹簧 +
  842. "丨" +
  843. ls_边铁 +
  844. "丨" +
  845. ls_底面无纺布 +
  846. "丨" +
  847. ls_上垫层物料 +
  848. "丨" +
  849. ls_下垫层物料 +
  850. "丨" +
  851. ls_入袋无纺布 +
  852. "丨" +
  853. ls_四周加硬排数 +
  854. "丨" +
  855. ls_弹叉 +
  856. "丨" +
  857. ls_海绵包边物料 +
  858. "丨" +
  859. ls_填充海绵物料;
  860. }
  861. s_bednet_qingdan[0].pzname = "床网名称";
  862. s_bednet_qingdan[0].pznamemx = ls_temp_name;
  863. s_bednet_qingdan[0].amt = bednet.nottax_factory_cost;
  864. s_bednet_qingdan[0].useqty = 0;
  865. // 新公式补充显示旧公式缺失的明细
  866. if (isNew) {
  867. //蛇线材料成本
  868. if (bednet.snake_wire_mtrl_cost > 0) {
  869. bednet_qingdan_item.push(setResultData(default_bednet_qingdan, "蛇线材料成本", bednet.snake_wire_mtrl_cost));
  870. }
  871. //四周口袋弹簧成本
  872. if (bednet.pocket_around_spring_cost > 0) {
  873. bednet_qingdan_item.push(setResultData(default_bednet_qingdan, "四周口袋弹簧成本", bednet.pocket_around_spring_cost));
  874. }
  875. //四周口袋无纺布成本
  876. if (bednet.pocket_around_fabrics_cost > 0) {
  877. bednet_qingdan_item.push(setResultData(default_bednet_qingdan, "四周口袋无纺布成本", bednet.pocket_around_fabrics_cost));
  878. }
  879. //胶水材料成本
  880. if (bednet.glue_mtrl_cost > 0) {
  881. bednet_qingdan_item.push(setResultData(default_bednet_qingdan, "胶水材料成本", bednet.glue_mtrl_cost));
  882. }
  883. //C钉/夹码材料
  884. if (bednet.cnail_mtrl_cost > 0) {
  885. bednet_qingdan_item.push(setResultData(default_bednet_qingdan, "C钉/夹码材料", bednet.cnail_mtrl_cost));
  886. }
  887. //封边材料成本
  888. if (bednet.edge_mtrl_cost > 0) {
  889. bednet_qingdan_item.push(setResultData(default_bednet_qingdan, "封边材料成本", bednet.edge_mtrl_cost));
  890. }
  891. //弹叉材料成本
  892. if (bednet.fork_mtrl_cost > 0) {
  893. bednet_qingdan_item.push(setResultData(default_bednet_qingdan, "弹叉材料成本", bednet.fork_mtrl_cost));
  894. }
  895. //胶条/包角材料成本
  896. if (bednet.rsorwa_mtrl_cost > 0) {
  897. bednet_qingdan_item.push(setResultData(default_bednet_qingdan, "胶条/包角材料成本", bednet.rsorwa_mtrl_cost));
  898. }
  899. //包装总成本
  900. if (bednet.packet_mtrl_cost > 0) {
  901. bednet_qingdan_item.push(setResultData(default_bednet_qingdan, "包装总成本", bednet.packet_mtrl_cost));
  902. }
  903. }
  904. state.bednet_qingdan.push(bednet_qingdan_item);
  905. console.log("s_bednet_qingdan :>> ", s_bednet_qingdan);
  906. console.log("bednet_qingdan_item :>> ", bednet_qingdan_item);
  907. return s_bednet_qingdan;
  908. };
  909. const f_get_bednet_qingdan = async (bednetid: any, index: any, isNew = false) => {
  910. if (!Number(bednetid)) return [];
  911. let _params = {
  912. dsname: "web_bednet_define",
  913. queryparams: {
  914. arg_bednetid: bednetid
  915. }
  916. };
  917. let res = await CommonDynamicSelect(_params);
  918. let _data: any = {};
  919. if (res?.datatable?.length) {
  920. _data = res?.datatable[0];
  921. }
  922. let result = {
  923. list: res?.datatable,
  924. tableinfo: res?.tableinfo
  925. };
  926. console.log("f_get_bednet_qingdan _data:>> ", _data);
  927. if (!Number(_data.deptid)) {
  928. throw new Error(_data.bednetcode + ", deptid错误!");
  929. return [];
  930. }
  931. let deptEnum = state.enumMap.get("deptid");
  932. let _pricelistid = 0;
  933. if (deptEnum) {
  934. let depItem = deptEnum.find((item: any) => item.value == _data.deptid);
  935. console.log("depItem :>> ", depItem);
  936. if (depItem) {
  937. _pricelistid = Number(depItem.pricelistid);
  938. }
  939. }
  940. if (!Number(_data.bednettypeid)) {
  941. throw new Error(_data.bednetcode + ", bednettypeid错误!");
  942. }
  943. if (!Number(_pricelistid)) {
  944. throw new Error(_data.bednetcode + ", pricelistid错误!");
  945. }
  946. let rtStr = await wf_retrieve_qingdan_bednet(result, index, isNew);
  947. //带上erpcode?
  948. return rtStr;
  949. };
  950. /**
  951. * @description 新报价清单列
  952. * @param data
  953. */
  954. const set_new_table_data = (params: any) => {
  955. let { data, mxdata, formula, fabricMx, formulakindenum, enumMap } = params;
  956. console.log("set_new_table_data params :>> ", params);
  957. let arr = [];
  958. /**
  959. * @description 车间成本
  960. */
  961. arr = arr.concat(init_new_formula_item(params, "【车间成本】"));
  962. // let cushionsItem = mxdata.find((itm: any) => itm.field == "cushions");
  963. // if (cushionsItem) {
  964. // if (cushionsItem.data.bednet.length > 0) {
  965. // cushionsItem.data.bednet.map((itm: any, index: any) => {
  966. // if (itm.mtrlid > 0) {
  967. // arr = arr.concat(
  968. // init_new_formula_item(
  969. // { ...params, formula: params.formula_bednet },
  970. // "【车间成本】",
  971. // `床网${index + 1}-`,
  972. // "replace_bednet"
  973. // )
  974. // );
  975. // }
  976. // });
  977. // }
  978. // }
  979. // arr = arr.concat(
  980. // init_new_formula_item({ ...params, formula: params.formula_bednet }, "【车间成本】", "床网-", "replace_bednet")
  981. // );
  982. arr = arr.concat(init_new_formula_item(params, "【不含税出厂价】"));
  983. arr = arr.concat(init_new_formula_item(params, "【部门不含税价】"));
  984. arr = arr.concat(init_new_formula_item(params, "【部门含税价】"));
  985. arr = arr.concat(init_new_formula_item(params, "【外币价】"));
  986. arr = arr.concat(init_new_formula_item(params, "【佣金】"));
  987. console.log("set_new_table_data arr :>> ", arr);
  988. return arr;
  989. };
  990. const init_new_formula_item = (
  991. { formula, differ, dannum_type, formula_bednet, mxdata }: any,
  992. target: string,
  993. prefix = "",
  994. replaceKey = "replace"
  995. ) => {
  996. let formulaItem = formula.find((item: any) => item.label == target);
  997. console.log("init_new_formula_item formulaItem :>> ", formulaItem);
  998. let arr = [];
  999. let item = {
  1000. level: target.replace("【", "").replace("】", ""),
  1001. level1: "",
  1002. level2: "",
  1003. label: "",
  1004. dscrp: "",
  1005. qty: "",
  1006. costamt: "",
  1007. costamt_1: "",
  1008. costamt_2: "",
  1009. costamt_3: "",
  1010. costamt_4: "",
  1011. useqty: "",
  1012. price: ""
  1013. };
  1014. if (formulaItem) {
  1015. let reg = /\【(.*?)\】/g;
  1016. let formulaItemArr = formulaItem.value.match(reg);
  1017. console.log("init_new_formula_item formulaItemArr :>> ", formulaItemArr);
  1018. if (target == "【车间成本】") {
  1019. // 过滤重复的文本
  1020. formulaItemArr = formulaItemArr.filter((item, index, arr) => {
  1021. return arr.indexOf(item) === index;
  1022. });
  1023. }
  1024. if (formulaItemArr.length) {
  1025. formulaItemArr.map(fName => {
  1026. let _item = {
  1027. level: target.replace("【", "").replace("】", ""),
  1028. level1: prefix + fName.replace("【", "").replace("】", ""),
  1029. level2: "",
  1030. label: "",
  1031. dscrp: "",
  1032. qty: "",
  1033. costamt: "",
  1034. costamt_1: "",
  1035. costamt_2: "",
  1036. costamt_3: "",
  1037. costamt_4: "",
  1038. useqty: "",
  1039. price: ""
  1040. };
  1041. if (target == "【车间成本】") {
  1042. /**
  1043. * @description 总床垫车间成本明细
  1044. */
  1045. if (fName.indexOf("床垫车间成本") > -1) {
  1046. let _formulaItem = formula.find((item: any) => item.label == fName);
  1047. if (_formulaItem) {
  1048. let _formulaItemArr = _formulaItem.value.match(reg);
  1049. if (_formulaItemArr.length) {
  1050. console.log("formulaMattressMx _formulaItemArr:>> ", _formulaItem, _formulaItemArr);
  1051. _formulaItemArr.map(_fName => {
  1052. let _itemMattress = cloneDeep(_item);
  1053. _itemMattress.level2 = _fName.replace("【", "").replace("】", "");
  1054. if (userInfo.usermode == 0) {
  1055. differ.map((itm: any) => {
  1056. let _valueReplace = itm[replaceKey].find((t: any) => t.label == _fName);
  1057. _itemMattress["costamt_" + itm.type] = _valueReplace?.value ?? 0;
  1058. if (dannum_type == itm.type) {
  1059. _itemMattress.costamt = _valueReplace?.value ?? 0;
  1060. }
  1061. });
  1062. }
  1063. console.log("init_new_formula_item _itemMattress item :>> ", _itemMattress, differ);
  1064. arr.push(_itemMattress);
  1065. });
  1066. }
  1067. }
  1068. } else if (fName.indexOf("床网车间成本") > -1) {
  1069. /**
  1070. * @description 总床网车间成本明细
  1071. */
  1072. let _formulaBendnet = formula_bednet.find((item: any) => item.label == target);
  1073. if (_formulaBendnet) {
  1074. let _formulaItemArr = _formulaBendnet.value.match(reg);
  1075. if (_formulaItemArr.length) {
  1076. let cushionsItem = mxdata.find((itm: any) => itm.field == "cushions");
  1077. console.log("formulaMattressMx _formulaItemArr cushionsItem:>> ", _formulaItemArr, cushionsItem);
  1078. if (cushionsItem) {
  1079. if (cushionsItem.data.bednet.length > 0) {
  1080. cushionsItem.data.bednet
  1081. .filter(item => item.mtrlid > 0)
  1082. .map((o: any, index: any) => {
  1083. _formulaItemArr.map(_fName => {
  1084. let _itemBednet = cloneDeep(_item);
  1085. _itemBednet.level2 = `床网${index + 1} - ` + _fName.replace("【", "").replace("】", "");
  1086. if (userInfo.usermode == 0) {
  1087. differ.map((itm: any) => {
  1088. let _valueReplace = itm.replace_bednet[index][replaceKey].find((t: any) => t.label == _fName);
  1089. console.log("formulaMattressMx _valueReplace :>> ", itm, index, _valueReplace);
  1090. _itemBednet["costamt_" + itm.type] = _valueReplace?.value ?? 0;
  1091. if (dannum_type == itm.type) {
  1092. _itemBednet.costamt = _valueReplace?.value ?? 0;
  1093. }
  1094. });
  1095. }
  1096. arr.push(_itemBednet);
  1097. });
  1098. });
  1099. }
  1100. }
  1101. }
  1102. }
  1103. }
  1104. _item.level2 = "小计";
  1105. }
  1106. if (userInfo.usermode == 0) {
  1107. differ.map((itm: any) => {
  1108. let _valueReplace = itm[replaceKey].find((t: any) => t.label == fName);
  1109. _item["costamt_" + itm.type] = _valueReplace?.value ?? 0;
  1110. if (dannum_type == itm.type) {
  1111. _item.costamt = _valueReplace?.value ?? 0;
  1112. }
  1113. });
  1114. }
  1115. console.log("init_new_formula_item 小计 item :>> ", item);
  1116. arr.push(_item);
  1117. });
  1118. }
  1119. if (userInfo.usermode == 0) {
  1120. differ.map((itm: any) => {
  1121. let _valueReplace = itm[replaceKey].find((t: any) => t.label == target);
  1122. item["costamt_" + itm.type] = _valueReplace?.value ?? 0;
  1123. if (dannum_type == itm.type) {
  1124. item.costamt = _valueReplace?.value ?? 0;
  1125. }
  1126. });
  1127. }
  1128. item.level1 = "小计";
  1129. console.log("item :>> ", item);
  1130. arr.push(item);
  1131. }
  1132. return arr;
  1133. };
  1134. /**
  1135. * @description 刷新报价清单
  1136. */
  1137. const wf_retrieve_qingdan = async (params: wfQingdanProps, isNew?: boolean, ifExpandAll?: boolean) => {
  1138. let { data, mxdata, fabricMx, formulakindenum, enumMap } = params;
  1139. state.bednet_qingdan = [];
  1140. let _isNew = isNew ?? false;
  1141. let _ifExpandAll = ifExpandAll ?? false;
  1142. state.enumMap = enumMap;
  1143. state.tableData = [];
  1144. let _tData = cloneDeep(state.oriTableData);
  1145. state.tableData = _tData.map(item => {
  1146. for (const key in item) {
  1147. if (isFunction(item[key])) {
  1148. item[key] = item[key](data);
  1149. }
  1150. }
  1151. return item;
  1152. });
  1153. console.log("wf_retrieve_qingdan isNew :>> ", isNew);
  1154. if (_isNew) {
  1155. state.tableData = set_new_table_data(params);
  1156. }
  1157. console.log("mxdata data:>> ", mxdata, data);
  1158. let _mxitm = null;
  1159. let level_mattress = "车间成本";
  1160. let level1_mattress = "总床垫车间成本";
  1161. let level2_mattress = "总材料成本";
  1162. let result_default: any = {
  1163. level: level_mattress,
  1164. level1: level1_mattress,
  1165. level2: level2_mattress
  1166. };
  1167. let mattressArr: any = [];
  1168. for (let index = 0; index < mxdata.length; index++) {
  1169. let item = mxdata[index];
  1170. switch (item.field) {
  1171. case "tabpage_8":
  1172. case "tabpage_9":
  1173. case "tabpage_10":
  1174. case "tabpage_11":
  1175. case "tabpage_12":
  1176. _mxitm = fabricMx.find(t => t.name == item.field);
  1177. item.data.map(itm => {
  1178. if ((Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0) && _mxitm.type.includes(Number(itm.formulakind))) {
  1179. let result: any = cloneDeep(result_default);
  1180. result.label = itm.chastr != "" ? itm.chastr : item.label;
  1181. let _formulaName = "";
  1182. if (formulakindenum) {
  1183. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  1184. }
  1185. _formulaName = _formulaName.replace(item.replace, "");
  1186. // console.log("_formulaName rp:>> ", _formulaName, item.replace);
  1187. result.dscrp = `${_formulaName}:${itm.mtrlname}`;
  1188. if (Number(itm.thickness) > 0) {
  1189. result.dscrp += ` 厚度:${itm.thickness}`;
  1190. }
  1191. result.qty = Number(itm.qty);
  1192. if (userInfo.usermode == 0) {
  1193. result.costamt = itm.costamt ?? 0;
  1194. result.costamt_1 = floatMul(itm.costamt ?? 0, 1 + itm.dannum1_rate);
  1195. result.costamt_2 = floatMul(itm.costamt ?? 0, 1 + itm.dannum2_rate);
  1196. result.costamt_3 = floatMul(itm.costamt ?? 0, 1 + itm.dannum3_rate);
  1197. result.costamt_4 = floatMul(itm.costamt ?? 0, 1 + itm.dannum4_rate);
  1198. result.price = isFilterPrice(itm.price ?? 0);
  1199. }
  1200. result.useqty = Number(itm.useqty ?? 0);
  1201. result.index = index;
  1202. mattressArr.push(result);
  1203. }
  1204. });
  1205. break;
  1206. case "tabpage_13":
  1207. _mxitm = fabricMx.find(t => t.name == item.field);
  1208. item.data.map(itm => {
  1209. if (
  1210. (Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0) &&
  1211. !_mxitm.type.includes(Number(itm.formulakind))
  1212. ) {
  1213. let result: any = cloneDeep(result_default);
  1214. // result.label = itm.label;
  1215. result.label = "其他工艺";
  1216. let _formulaName = "";
  1217. if (formulakindenum) {
  1218. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  1219. }
  1220. _formulaName = _formulaName.replace(item.replace, "");
  1221. result.dscrp = `${_formulaName}:${itm.mtrlname}`;
  1222. if (Number(itm.thickness) > 0) {
  1223. result.dscrp += ` 厚度:${isFilterPrice(itm.thickness)}`;
  1224. }
  1225. result.qty = Number(itm.qty);
  1226. if (userInfo.usermode == 0) {
  1227. result.costamt = itm.costamt ?? 0;
  1228. result.costamt_1 = floatMul(itm.costamt ?? 0, 1 + itm.dannum1_rate);
  1229. result.costamt_2 = floatMul(itm.costamt ?? 0, 1 + itm.dannum2_rate);
  1230. result.costamt_3 = floatMul(itm.costamt ?? 0, 1 + itm.dannum3_rate);
  1231. result.costamt_4 = floatMul(itm.costamt ?? 0, 1 + itm.dannum4_rate);
  1232. result.price = isFilterPrice(itm.price ?? 0);
  1233. }
  1234. result.useqty = Number(itm.useqty ?? 0);
  1235. result.index = index;
  1236. mattressArr.push(result);
  1237. }
  1238. });
  1239. break;
  1240. case "cushions": // 垫层
  1241. let _index = index;
  1242. console.log("cushions item.data.bednet :>> ", item.data.bednet);
  1243. console.log("cushions item.data.cushions :>> ", item.data.cushions);
  1244. // 记录床位索引
  1245. let bendet999Index = 0;
  1246. // item.data.cushions.map(async itm => {
  1247. for (let k = 0; k < item.data.cushions.length; k++) {
  1248. let itm = item.data.cushions[k];
  1249. if (Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0 || [999].includes(Number(itm.formulakind))) {
  1250. let result: any = cloneDeep(result_default);
  1251. let _formulaName = "";
  1252. if (formulakindenum) {
  1253. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  1254. }
  1255. result.label = _formulaName;
  1256. result.dscrp = itm.mtrlname;
  1257. if (![999].includes(Number(itm.formulakind))) {
  1258. if (Number(itm.thickness) > 0) {
  1259. result.dscrp += ` 厚度:${isFilterPrice(itm.thickness)}`;
  1260. }
  1261. result.qty = Number(itm.qty);
  1262. if (userInfo.usermode == 0) {
  1263. result.costamt = itm.costamt ?? 0;
  1264. result.costamt_1 = floatMul(itm.costamt ?? 0, 1 + itm.dannum1_rate);
  1265. result.costamt_2 = floatMul(itm.costamt ?? 0, 1 + itm.dannum2_rate);
  1266. result.costamt_3 = floatMul(itm.costamt ?? 0, 1 + itm.dannum3_rate);
  1267. result.costamt_4 = floatMul(itm.costamt ?? 0, 1 + itm.dannum4_rate);
  1268. result.price = isFilterPrice(itm.price ?? 0);
  1269. }
  1270. result.useqty = Number(itm.useqty ?? 0);
  1271. result.index = _index;
  1272. mattressArr.push(result);
  1273. } else {
  1274. // 999是床网
  1275. console.log("itm.formulakind 9999:>> ", itm.formulakind);
  1276. let ll_bednetid = 0;
  1277. let ld_bednet_height = 0;
  1278. let s_bednet_qingdan = [];
  1279. // let arg_temp_msg;
  1280. if (item.data.bednet.length && item.data.bednet[0].mtrlid > 0) {
  1281. if (item.data.bednet.length == 1) {
  1282. //单床网
  1283. ll_bednetid = item.data.bednet[0].mtrlid;
  1284. let s_bednet_qingdan = await f_get_bednet_qingdan(ll_bednetid, 0, _isNew);
  1285. console.log("cushions item.data.bednet s_bednet_qingdan :>> ", s_bednet_qingdan);
  1286. if (s_bednet_qingdan.length) {
  1287. result.dscrp = s_bednet_qingdan[0].pznamemx;
  1288. result.qty = 1;
  1289. if (userInfo.usermode == 0) {
  1290. result.costamt = isFilterPrice(s_bednet_qingdan[0]?.amt ?? 0);
  1291. result.price = "";
  1292. }
  1293. result.useqty = "";
  1294. }
  1295. } else {
  1296. //多床网
  1297. ll_bednetid = item.data.bednet[bendet999Index].mtrlid;
  1298. console.log("f_get_bednet_qingdan t ll_bednetid:>> ", bendet999Index, item.data.bednet[bendet999Index]);
  1299. let s_bednet_qingdan = await f_get_bednet_qingdan(ll_bednetid, bendet999Index, _isNew);
  1300. if (s_bednet_qingdan.length) {
  1301. result.dscrp = s_bednet_qingdan[0].pznamemx;
  1302. result.qty = 1;
  1303. if (userInfo.usermode == 0) {
  1304. result.costamt = isFilterPrice(s_bednet_qingdan[0]?.amt ?? 0);
  1305. result.price = "";
  1306. }
  1307. result.useqty = "";
  1308. }
  1309. console.log("f_get_bednet_qingdan t s_bednet_qingdan :>> ", s_bednet_qingdan);
  1310. bendet999Index++;
  1311. }
  1312. // 旧公式添加,新公式已分离显示
  1313. if (!_isNew) {
  1314. result.index = _index;
  1315. // 查找数组中,从结尾数起最后出现的index=_index的元素的索引,在起后面插入result
  1316. let _arrData = cloneDeep(mattressArr);
  1317. let _last = _arrData.reverse().findIndex(t => t.index == _index);
  1318. if (_last == -1) {
  1319. mattressArr.push(result);
  1320. } else {
  1321. mattressArr.splice(mattressArr.length - _last, 0, result);
  1322. }
  1323. }
  1324. }
  1325. }
  1326. }
  1327. // });
  1328. }
  1329. break;
  1330. case "accessories": // 辅料
  1331. item.data.map(itm => {
  1332. if (Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0) {
  1333. let result: any = cloneDeep(result_default);
  1334. result.label = itm.label;
  1335. let _formulaName = "";
  1336. if (formulakindenum) {
  1337. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  1338. }
  1339. result.label = _formulaName;
  1340. result.dscrp = itm.mtrlname;
  1341. if (Number(itm.thickness) > 0) {
  1342. result.dscrp += ` 厚度:${isFilterPrice(itm.thickness)}`;
  1343. }
  1344. result.qty = Number(itm.qty);
  1345. if (userInfo.usermode == 0) {
  1346. result.costamt = itm.costamt ?? 0;
  1347. result.costamt_1 = floatMul(itm.costamt ?? 0, 1 + itm.dannum1_rate);
  1348. result.costamt_2 = floatMul(itm.costamt ?? 0, 1 + itm.dannum2_rate);
  1349. result.costamt_3 = floatMul(itm.costamt ?? 0, 1 + itm.dannum3_rate);
  1350. result.costamt_4 = floatMul(itm.costamt ?? 0, 1 + itm.dannum4_rate);
  1351. result.price = isFilterPrice(itm.price ?? 0);
  1352. }
  1353. result.useqty = Number(itm.useqty ?? 0);
  1354. result.index = index;
  1355. mattressArr.push(result);
  1356. }
  1357. });
  1358. break;
  1359. case "packag":
  1360. console.log("packag item.data :>> ", item.data, formulakindenum);
  1361. item.data.map(itm => {
  1362. console.log("(Number(itm.mtrlid) > 0 |:>> ", Number(itm.mtrlid) > 0);
  1363. console.log(
  1364. "(N Number(itm.costamt) != 0) :>> ",
  1365. Number(itm.costamt) != 0,
  1366. Number(itm.costamt),
  1367. itm.costamt,
  1368. Number(itm?.costamt),
  1369. Number(itm?.costamt) != 0
  1370. );
  1371. console.log(
  1372. "(Number(itm.mtrlid) > 0 || Number(itm.costamt) != 0) :>> ",
  1373. Number(itm.mtrlid) > 0 || Number(itm.costamt) != 0
  1374. );
  1375. if (Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0) {
  1376. let result: any = cloneDeep(result_default);
  1377. result.label = itm.label;
  1378. let _formulaName = "";
  1379. if (formulakindenum) {
  1380. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  1381. }
  1382. result.label = _formulaName;
  1383. result.dscrp = Number(itm.mtrlid) > 0 ? itm.mtrlname : _formulaName;
  1384. if (Number(itm.thickness) > 0) {
  1385. result.dscrp += ` 厚度:${isFilterPrice(itm.thickness)}`;
  1386. }
  1387. result.qty = Number(itm.qty);
  1388. if (userInfo.usermode == 0) {
  1389. result.costamt = itm.costamt ?? 0;
  1390. result.costamt_1 = floatMul(itm.costamt ?? 0, 1 + itm.dannum1_rate);
  1391. result.costamt_2 = floatMul(itm.costamt ?? 0, 1 + itm.dannum2_rate);
  1392. result.costamt_3 = floatMul(itm.costamt ?? 0, 1 + itm.dannum3_rate);
  1393. result.costamt_4 = floatMul(itm.costamt ?? 0, 1 + itm.dannum4_rate);
  1394. result.price = isFilterPrice(itm.price ?? 0);
  1395. }
  1396. result.useqty = Number(itm.useqty ?? 0);
  1397. result.index = index;
  1398. mattressArr.push(result);
  1399. }
  1400. });
  1401. break;
  1402. case "innerClothLayerMx":
  1403. case "topCottonMx":
  1404. console.log("innerClothLayer item.data :>> ", item.data, formulakindenum);
  1405. item.data.map(itm => {
  1406. if (Number(itm.mtrlid ?? 0) > 0 || Number(itm.costamt ?? 0) != 0) {
  1407. let result: any = cloneDeep(result_default);
  1408. result.label = itm.chastr != "" ? itm.chastr : item.label;
  1409. let _formulaName = "";
  1410. if (formulakindenum) {
  1411. _formulaName = formulakindenum.find(t => t.value == itm.formulakind)?.label ?? "";
  1412. }
  1413. _formulaName = _formulaName.replace(item.replace, "");
  1414. // console.log("_formulaName rp:>> ", _formulaName, item.replace);
  1415. result.dscrp = `${_formulaName}:${itm.mtrlname}`;
  1416. if (Number(itm.thickness) > 0) {
  1417. result.dscrp += ` 厚度:${isFilterPrice(itm.thickness)}`;
  1418. }
  1419. result.qty = Number(itm.qty);
  1420. if (userInfo.usermode == 0) {
  1421. result.costamt = itm.costamt ?? 0;
  1422. result.costamt_1 = floatMul(itm.costamt ?? 0, 1 + itm.dannum1_rate);
  1423. result.costamt_2 = floatMul(itm.costamt ?? 0, 1 + itm.dannum2_rate);
  1424. result.costamt_3 = floatMul(itm.costamt ?? 0, 1 + itm.dannum3_rate);
  1425. result.costamt_4 = floatMul(itm.costamt ?? 0, 1 + itm.dannum4_rate);
  1426. result.price = isFilterPrice(itm.price ?? 0);
  1427. }
  1428. result.useqty = Number(itm.useqty ?? 0);
  1429. result.index = index;
  1430. mattressArr.push(result);
  1431. }
  1432. });
  1433. break;
  1434. }
  1435. }
  1436. if (!isNew) {
  1437. state.tableData = state.tableData.concat(mattressArr);
  1438. state.tableData.push({
  1439. label: "地区",
  1440. dscrp: data.area ?? "",
  1441. qty: "",
  1442. costamt: "",
  1443. useqty: "",
  1444. price: ""
  1445. });
  1446. state.tableData.push({
  1447. label: "柜型",
  1448. dscrp: data.cabinet_type ?? "",
  1449. qty: "",
  1450. costamt: "",
  1451. useqty: "",
  1452. price: ""
  1453. });
  1454. } else {
  1455. if (_ifExpandAll) {
  1456. console.log("state.tableData bf:>> ", state.tableData);
  1457. console.log("smattressArr bf:>> ", mattressArr);
  1458. // 插入床垫车间成本-总材料成本明细
  1459. let _idx = state.tableData.findIndex(t => t.level1.indexOf("床垫车间成本") > -1 && t.level2 === "总材料成本");
  1460. if (_idx > -1) {
  1461. state.tableData[_idx].label = "小计";
  1462. state.tableData.splice(_idx, 0, ...mattressArr);
  1463. }
  1464. // 插入床网车间成本-总材料成本明细
  1465. let cushionsItem = mxdata.find((itm: any) => itm.field == "cushions");
  1466. if (cushionsItem) {
  1467. if (cushionsItem.data.bednet.length > 0) {
  1468. cushionsItem.data.bednet.map((itm: any, index: any) => {
  1469. if (itm.mtrlid > 0) {
  1470. let _idx = state.tableData.findIndex(
  1471. t => t.level1.indexOf("床网车间成本") > -1 && t.level2 === `床网${index + 1} - 总材料成本`
  1472. );
  1473. console.log("smattressArr smattressArr _idx :>> ", _idx, index, state.bednet_qingdan, state.tableData);
  1474. if (_idx > -1) {
  1475. state.tableData[_idx].label = "小计";
  1476. state.tableData[_idx].dscrp = `弹簧排列:宽${itm.spring_qty_width} 长${itm.spring_qty_length}`;
  1477. state.bednet_qingdan[index] && state.tableData.splice(_idx, 0, ...state.bednet_qingdan[index]);
  1478. }
  1479. }
  1480. });
  1481. }
  1482. }
  1483. }
  1484. }
  1485. // state.tableData = state.tableData.map(item => {
  1486. // item.id = item.id ?? null;
  1487. // item.parentId = item.parentId ?? null;
  1488. // return item;
  1489. // });
  1490. console.log("state.tableData state.tableData:>> ", state.tableData);
  1491. };
  1492. const formatAmount = (value: any) => {
  1493. return Number(value).toFixed(2);
  1494. // console.log("formatAmount value :>> ", value, formatAmount3({ val: value }));
  1495. // let t = formatAmount3({ val: value })
  1496. // if (t % 1 === 0) {
  1497. // console.log(t);
  1498. // return t
  1499. // } else {
  1500. // return t.toFixed(2)
  1501. // }
  1502. };
  1503. const getSummaries = (data: any, field) => {
  1504. // const { columns, data } = param;
  1505. // console.log("getSummaries param :>> ", param);
  1506. let sums = "";
  1507. const values = data.map(item => Number(item[field]?.toString().replace(/,/g, "")));
  1508. if (!values.every(value => Number.isNaN(value))) {
  1509. // console.log("values :>> ", values);
  1510. sums = `${values.reduce((prev, curr) => {
  1511. // console.log("prev,curr :>> ", prev, curr);
  1512. const value = Number(curr);
  1513. if (!Number.isNaN(value)) {
  1514. return floatAdd(prev, curr);
  1515. } else {
  1516. return prev;
  1517. }
  1518. }, 0)}`;
  1519. }
  1520. return sums;
  1521. };
  1522. /**
  1523. * @description 旧核价格式
  1524. * @param params
  1525. * @param fileName
  1526. */
  1527. const toExcelQuote = async (params: wfQingdanProps, fileName: string) => {
  1528. const { data, mxdata } = params;
  1529. console.log("mainData :>> ", params);
  1530. const workbook = new Exceljs.Workbook(); // 创建工作簿
  1531. const worksheet = workbook.addWorksheet("sheet1"); // 创建工作表(sheet1)
  1532. // 冻结前7行
  1533. worksheet.views = [{ state: "frozen", xSplit: 0, ySplit: 7 }];
  1534. // // 设置整个工作表的背景颜色为白色
  1535. // worksheet.eachRow(row => {
  1536. // // row.eachCell(cell => {
  1537. // // cell.fill = {
  1538. // // type: "pattern",
  1539. // // pattern: "solid",
  1540. // // bgColor: { argb: "FFFFFFFF" } // 白色
  1541. // // };
  1542. // // });
  1543. // row.eachCell({ includeEmpty: true }, function (cell, rowNumber) {
  1544. // cell.fill = {
  1545. // type: "pattern",
  1546. // pattern: "solid",
  1547. // bgColor: { argb: "FFFFFF" } // 白色
  1548. // };
  1549. // });
  1550. // });
  1551. // 宽度设置
  1552. const ACol = worksheet.getColumn("A");
  1553. ACol.width = 0.78;
  1554. const BCol = worksheet.getColumn("B");
  1555. BCol.width = 13.55;
  1556. BCol.key = "label";
  1557. BCol.style = {
  1558. font: state.default_font,
  1559. alignment: { ...state.default_alignment, vertical: "top" }
  1560. };
  1561. const CCol = worksheet.getColumn("C");
  1562. CCol.width = 49.33;
  1563. CCol.key = "dscrp";
  1564. CCol.style = {
  1565. font: state.default_font,
  1566. alignment: state.default_alignment
  1567. };
  1568. const DCol = worksheet.getColumn("D");
  1569. DCol.width = 5.69;
  1570. DCol.key = "qty";
  1571. DCol.style = {
  1572. font: state.default_font,
  1573. alignment: { ...state.default_alignment, horizontal: "center" }
  1574. };
  1575. const ECol = worksheet.getColumn("E");
  1576. ECol.width = 10;
  1577. ECol.key = "costamt";
  1578. ECol.style = {
  1579. font: state.default_font,
  1580. alignment: { ...state.default_alignment, horizontal: "right" }
  1581. };
  1582. const FCol = worksheet.getColumn("F");
  1583. FCol.width = 13;
  1584. FCol.key = "useqty";
  1585. FCol.style = {
  1586. font: state.default_font,
  1587. alignment: { ...state.default_alignment, horizontal: "right" }
  1588. };
  1589. const GCol = worksheet.getColumn("G");
  1590. GCol.width = 12.48;
  1591. GCol.key = "price";
  1592. GCol.style = {
  1593. font: state.default_font,
  1594. alignment: { ...state.default_alignment, horizontal: "right" }
  1595. };
  1596. //======================================= 第一行 =================================
  1597. // 合并A1到L1的单元格 (大标题)
  1598. worksheet.mergeCells("B1:F1");
  1599. const cellB1 = worksheet.getCell("B1");
  1600. let foreign_cost = formatAmount(data?.foreign_cost);
  1601. let currency = Number(data?.moneyrate) != 1 ? "美金" : "人民币";
  1602. cellB1.value = `报价日期:${formatTime(data.createtime, "{y}-{m}-{d}", false)} 报价金额:${foreign_cost}${currency}报价清单`;
  1603. // 设置第一行的单元格样式
  1604. cellB1.font = { size: 15, bold: true, name: "宋体" };
  1605. cellB1.alignment = state.default_alignment;
  1606. worksheet.getRow(1).height = 26; // 设置行高
  1607. //======================================= 第二行 =================================
  1608. worksheet.mergeCells("B2:F2");
  1609. const cellB2 = worksheet.getCell("B2");
  1610. cellB2.value = `财务底价:${formatAmount(data.nottax_dept_cost)} 佣金点数:${formatAmount(
  1611. data.commission
  1612. )} 税率:${formatAmount(data.taxrate)} `;
  1613. cellB2.font = state.default_font;
  1614. cellB2.alignment = state.default_alignment;
  1615. worksheet.getRow(2).height = 39;
  1616. //======================================= 第三行 =================================
  1617. worksheet.mergeCells("B3:F3");
  1618. const cellB3 = worksheet.getCell("B3");
  1619. cellB3.value = `额外点数:${formatAmount(data.other_rate)} 额外费用:${formatAmount(
  1620. data.extras_cost
  1621. )} 汇率:${formatAmount(data.moneyrate)} `;
  1622. cellB3.font = state.default_font;
  1623. cellB3.alignment = state.default_alignment;
  1624. worksheet.getRow(3).height = 18;
  1625. //======================================= 第四行 =================================
  1626. worksheet.mergeCells("B4:F4");
  1627. const cellB4 = worksheet.getCell("B4");
  1628. cellB4.value = `款式费用:${formatAmount(data.hrcost)} 边带费用:${formatAmount(
  1629. data.biandaicost
  1630. )} 总成本:${formatAmount(data.total_cost)} `;
  1631. cellB4.font = state.default_font;
  1632. cellB4.alignment = state.default_alignment;
  1633. worksheet.getRow(4).height = 18;
  1634. //======================================= 第五行 =================================
  1635. worksheet.mergeCells("B5:F5");
  1636. const cellB5 = worksheet.getCell("B5");
  1637. cellB5.value = `工厂利润率${formatAmount(data.profitrate)} 工艺点数:${formatAmount(
  1638. data.profitrate_point
  1639. )} 不含税出厂价:${formatAmount(data.nottax_factory_cost)} `;
  1640. cellB5.font = state.default_font;
  1641. cellB5.alignment = state.default_alignment;
  1642. worksheet.getRow(5).height = 18;
  1643. //======================================= 第六行 =================================
  1644. worksheet.mergeCells("B6:F6");
  1645. const cellB6 = worksheet.getCell("B6");
  1646. cellB6.value = `部门利润率:${formatAmount(data.dept_profitrate)} FOB费用:${formatAmount(
  1647. data.fob
  1648. )} 部门售价:${formatAmount(data.nottax_dept_cost)} `;
  1649. cellB6.font = state.default_font;
  1650. cellB6.alignment = state.default_alignment;
  1651. worksheet.getRow(6).height = 18;
  1652. //======================================= 第七行 =================================
  1653. worksheet.mergeCells("B7:F7");
  1654. const cellB7 = worksheet.getCell("B7");
  1655. cellB7.value = `让利点数:${formatAmount(data.dept_profitrate_rangli)} 海绵款扣点:${formatAmount(data.haimian_point)} `;
  1656. cellB7.font = state.default_font;
  1657. cellB7.alignment = state.default_alignment;
  1658. worksheet.getRow(7).height = 18;
  1659. //======================================= 第八行 =================================
  1660. console.log("百分 state.tableData :>> ", state.tableData);
  1661. await wf_retrieve_qingdan(params);
  1662. console.log("af state.tableData :>> ", JSON.stringify(state.tableData));
  1663. const headerRows = worksheet.insertRow(
  1664. 8,
  1665. { label: "项目", dscrp: "内容", qty: "数量", costamt: "金额", useqty: "用量", price: "单价" },
  1666. "n"
  1667. );
  1668. const insertedRows = worksheet.insertRows(9, state.tableData, "n");
  1669. // const cellBSum = worksheet.getCell(`B${9 + state.tableData.length}`);
  1670. // cellBSum.value = "材料合计:";
  1671. // const cellESum = worksheet.getCell(`E${9 + state.tableData.length}`);
  1672. // cellESum.value = getSummaries(state.tableData, "costamt");
  1673. const footerRows = worksheet.insertRow(
  1674. 9 + state.tableData.length,
  1675. {
  1676. label: "材料合计:",
  1677. dscrp: "",
  1678. qty: "",
  1679. costamt: getSummaries(state.tableData, "costamt"),
  1680. costamt_1: getSummaries(state.tableData, "costamt_1"),
  1681. costamt_2: getSummaries(state.tableData, "costamt_2"),
  1682. costamt_3: getSummaries(state.tableData, "costamt_3"),
  1683. costamt_4: getSummaries(state.tableData, "costamt_4"),
  1684. useqty: "",
  1685. price: ""
  1686. },
  1687. "n"
  1688. );
  1689. // 设置单元格边框
  1690. let default_border: any = {
  1691. top: { style: "thin", color: { argb: "FF000000" } },
  1692. left: { style: "thin", color: { argb: "FF000000" } },
  1693. bottom: { style: "thin", color: { argb: "FF000000" } },
  1694. right: { style: "thin", color: { argb: "FF000000" } }
  1695. };
  1696. headerRows.eachCell(cell => {
  1697. cell.border = default_border;
  1698. });
  1699. footerRows.eachCell(cell => {
  1700. cell.border = default_border;
  1701. });
  1702. insertedRows.map(row => {
  1703. row.eachCell(cell => {
  1704. cell.border = default_border;
  1705. });
  1706. });
  1707. // label列内容相同时合并单元格
  1708. let same = 0;
  1709. state.tableData.map((t, i) => {
  1710. // label列内容相同的时候,多行合并单元格
  1711. if (i > 0 && t.label === state.tableData[i - 1].label) {
  1712. same++;
  1713. } else {
  1714. if (same > 0) {
  1715. worksheet.mergeCells(`B${9 + i - 1}:B${9 + i - 1 - same}`);
  1716. }
  1717. same = 0;
  1718. }
  1719. });
  1720. console.log("wf_retrieve_qingdan tableData :>> ", state.tableData);
  1721. // insertedRows.values = {
  1722. // fill: {
  1723. // type: 'pattern',
  1724. // pattern:'darkVertical',
  1725. // fgColor:{argb:'FFFF0000'}
  1726. // }
  1727. // };
  1728. // let rows = [];
  1729. // state.tableData.map(t => {
  1730. // let arr = [];
  1731. // for (const key in t) {
  1732. // arr.push(t[key]);
  1733. // }
  1734. // rows.push(arr);
  1735. // });
  1736. // // 将表格添加到工作表
  1737. // worksheet.addTable({
  1738. // name: "MyTable",
  1739. // ref: "B8",
  1740. // style: {
  1741. // theme: "",
  1742. // },
  1743. // headerRow: true,
  1744. // totalsRow: true,
  1745. // columns: [
  1746. // { name: "项目", totalsRowLabel: "材料合计:" },
  1747. // { name: "内容" },
  1748. // { name: "数量" },
  1749. // { name: "金额", totalsRowFunction: "sum", },
  1750. // { name: "用量" },
  1751. // { name: "单价" }
  1752. // ],
  1753. // rows: rows
  1754. // });
  1755. // 下载工作簿
  1756. workbook.xlsx.writeBuffer().then(buffer => {
  1757. saveAs(new Blob([buffer], { type: "application/octet-stream" }), fileName + ".xlsx");
  1758. });
  1759. };
  1760. /**
  1761. * @description 新核价格式
  1762. * @param params
  1763. * @param fileName 文件名
  1764. * @param ifShowDetail 是否显示明细
  1765. */
  1766. const toExcelQuoteNew = async (params: wfQingdanProps, fileName: string, ifShowDetail = true) => {
  1767. const { data, fields, formula, replace } = params;
  1768. console.log("toExcelQuoteNew mainData :>> ", params);
  1769. let variableCellArr = [];
  1770. const workbook = new Exceljs.Workbook(); // 创建工作簿
  1771. const worksheet = workbook.addWorksheet("sheet1"); // 创建工作表(sheet1)
  1772. // 宽度设置
  1773. const ACol = worksheet.getColumn("A");
  1774. ACol.width = 0.78;
  1775. ACol.key = "";
  1776. getColumnStyle(worksheet, "B", "level", 13.55, { vertical: "top" });
  1777. getColumnStyle(worksheet, "C", "level1", 13.55, { vertical: "top" });
  1778. getColumnStyle(worksheet, "D", "level2", 13.55);
  1779. // let mergeCellName = "K";
  1780. let _val = "";
  1781. /**
  1782. * @description 头部大小大结果坐标
  1783. */
  1784. if (ifShowDetail) {
  1785. // 展开明细
  1786. getColumnStyle(worksheet, "E", "label", 13.55, { horizontal: "center" });
  1787. getColumnStyle(worksheet, "F", "dscrp", 26, { horizontal: "right" });
  1788. getColumnStyle(worksheet, "G", "qty", 13.55, { horizontal: "right" });
  1789. getColumnStyle(worksheet, "H", "useqty", 13.55, { horizontal: "right" });
  1790. getColumnStyle(worksheet, "I", "price", 13.55, { horizontal: "right" });
  1791. getColumnStyle(worksheet, "J", "costamt_2", 13.55, { horizontal: "right" });
  1792. getColumnStyle(worksheet, "K", "costamt_1", 13.55, { horizontal: "right" });
  1793. getColumnStyle(worksheet, "L", "costamt_4", 13.55, { horizontal: "right" });
  1794. getColumnStyle(worksheet, "M", "costamt_3", 13.55, { horizontal: "right" });
  1795. // mergeCellName = "K";
  1796. } else {
  1797. getColumnStyle(worksheet, "E", "costamt_2", 13.55, { horizontal: "right" });
  1798. getColumnStyle(worksheet, "F", "costamt_1", 13.55, { horizontal: "right" });
  1799. getColumnStyle(worksheet, "G", "costamt_4", 13.55, { horizontal: "right" });
  1800. getColumnStyle(worksheet, "H", "costamt_3", 13.55, { horizontal: "right" });
  1801. // mergeCellName = "G";
  1802. state.headerDannumCost = [
  1803. {
  1804. level: "部门不含税价",
  1805. level1: "小计",
  1806. cellCol: "E",
  1807. rowIndex: 0,
  1808. showCell: "G1"
  1809. },
  1810. {
  1811. level: "部门不含税价",
  1812. level1: "小计",
  1813. cellCol: "F",
  1814. rowIndex: 0,
  1815. showCell: "I1"
  1816. },
  1817. {
  1818. level: "部门不含税价",
  1819. level1: "小计",
  1820. cellCol: "G",
  1821. rowIndex: 0,
  1822. showCell: "K1"
  1823. },
  1824. {
  1825. level: "部门不含税价",
  1826. level1: "小计",
  1827. cellCol: "H",
  1828. rowIndex: 0,
  1829. showCell: "M1"
  1830. }
  1831. ];
  1832. }
  1833. //======================================= 第一行 =================================
  1834. // 合并A1到L1的单元格 (大标题)
  1835. // worksheet.mergeCells(`B1:${mergeCellName}1`);
  1836. // const cellB1 = worksheet.getCell("B1");
  1837. let foreign_cost = formatAmount(data?.foreign_cost);
  1838. let currency = Number(data?.moneyrate) != 1 ? "美金" : "人民币";
  1839. let _val1 = `报价日期:${formatTime(data.createtime, "{y}-{m}-{d}", false)}`;
  1840. setCellOrMergeCell(worksheet, 1, `B1:E1`, { value: _val1, font: { size: 15, bold: true, name: "宋体" }, height: 26 });
  1841. // setCellOrMergeCell(worksheet, 1, `E1:G1`, "报价清单", 26, { size: 15, bold: true, name: "宋体" }, { horizontal: "center" });
  1842. setCellOrMergeCell(worksheet, 1, `F1`, { value: "标准金额:", ...state.defalut_header_style });
  1843. setCellOrMergeCell(worksheet, 1, `H1`, { value: "散单金额:", ...state.defalut_header_style });
  1844. setCellOrMergeCell(worksheet, 1, `J1`, { value: "小单金额:", ...state.defalut_header_style });
  1845. setCellOrMergeCell(worksheet, 1, `L1`, { value: "大单金额:", ...state.defalut_header_style });
  1846. //======================================= 第二行 =================================
  1847. let rowIndex = 2;
  1848. if (fields.length > 0) {
  1849. _val = "";
  1850. let rowArr = [
  1851. {
  1852. sCell: "B",
  1853. eCell: "E"
  1854. },
  1855. {
  1856. sCell: "F",
  1857. eCell: "I"
  1858. },
  1859. {
  1860. sCell: "J",
  1861. eCell: "M"
  1862. }
  1863. ];
  1864. fields
  1865. .filter(t => t.type != "variable")
  1866. .forEach((t, i) => {
  1867. let rowItem = rowArr[i % 3];
  1868. let _cell = `${rowItem.sCell + rowIndex}:${rowItem.eCell + rowIndex}`;
  1869. _val = `${t.label}: ${t.value}`;
  1870. setCellOrMergeCell(worksheet, rowIndex, _cell, { value: _val.trim() });
  1871. // 每三个一行
  1872. if ((i + 1) % 3 == 0) {
  1873. rowIndex = (i + 1) / 3 + 2;
  1874. }
  1875. });
  1876. if (userInfo.usermode == 0) {
  1877. fields
  1878. .filter(t => t.type == "variable")
  1879. .forEach((t, i) => {
  1880. // 每三个一行
  1881. if (i % 3 == 0) {
  1882. rowIndex++;
  1883. }
  1884. let rowItem = rowArr[i % 3];
  1885. let _cell = `${rowItem.sCell + rowIndex}:${getPreLetter(rowItem.eCell) + rowIndex}`;
  1886. let _cellname_var = rowItem.eCell + rowIndex;
  1887. state.variables.push({
  1888. cell: _cellname_var,
  1889. field: t.field
  1890. });
  1891. _val = `${t.label}:`;
  1892. setCellOrMergeCell(worksheet, rowIndex, _cell, { value: _val });
  1893. const _cellVar = worksheet.getCell(_cellname_var);
  1894. _cellVar.value = t.value;
  1895. _cellVar.font = state.default_font;
  1896. _cellVar.alignment = state.default_alignment;
  1897. _cellVar.fill = {
  1898. type: "pattern",
  1899. pattern: "darkTrellis",
  1900. fgColor: { argb: "FF90c5ff" },
  1901. bgColor: { argb: "FF90c5ff" }
  1902. };
  1903. variableCellArr.push({
  1904. cell: _cellname_var,
  1905. label: t?.jointo ?? t.label,
  1906. jointo: t?.jointo
  1907. });
  1908. });
  1909. }
  1910. }
  1911. console.log("表格内容 bf rowIndex :>> ", rowIndex);
  1912. rowIndex++;
  1913. const headerRows = worksheet.insertRow(
  1914. rowIndex,
  1915. {
  1916. level: "类目",
  1917. level1: "一级项目",
  1918. level2: "二级项目",
  1919. label: "项目",
  1920. dscrp: "内容",
  1921. qty: "数量",
  1922. useqty: "用量",
  1923. price: "单价",
  1924. costamt_2: "标准金额",
  1925. costamt_1: "散单金额",
  1926. costamt_4: "小单金额",
  1927. costamt_3: "大单金额"
  1928. },
  1929. "n"
  1930. );
  1931. // 冻结前7行
  1932. console.log("冻结行数rowIndex :>> ", rowIndex);
  1933. worksheet.views = [{ state: "frozen", xSplit: 0, ySplit: rowIndex }];
  1934. console.log("冻结行数rowIndex end:>> ", rowIndex);
  1935. //======================================= 表格内容 =================================
  1936. console.log("百分 state.tableData :>> ", state.tableData);
  1937. await wf_retrieve_qingdan(params, true, ifShowDetail);
  1938. console.log("af state.tableData :>> ", state.tableData);
  1939. console.log("表格内容 ed rowIndex :>> ", rowIndex);
  1940. rowIndex++;
  1941. const insertedRows = worksheet.insertRows(rowIndex, state.tableData, "n");
  1942. //======================================= 替换单元格方法 =================================
  1943. console.log("替换单元格方法 insertedRows :>> ", insertedRows);
  1944. // insertedRows[0]._cells[4]._value.model.value
  1945. headerRows.eachCell(cell => {
  1946. cell.border = state.default_border;
  1947. });
  1948. // footerRows.eachCell(cell => {
  1949. // cell.border = default_border;
  1950. // });
  1951. let _formula = cloneDeep(formula);
  1952. let _replace = cloneDeep(replace);
  1953. // 记录哪些行有小计
  1954. state.tableData.map((o, i) => {
  1955. if ([o.level1, o.level2, o.label].includes("小计")) {
  1956. switch (true) {
  1957. case o.label === "小计":
  1958. _formula.forEach(itm => {
  1959. if (isFilterLabel(itm.label) === o.level2) {
  1960. itm.rowIndex = i + rowIndex;
  1961. }
  1962. });
  1963. break;
  1964. case o.level2 === "小计":
  1965. _formula.forEach(itm => {
  1966. if (isFilterLabel(itm.label) === o.level1) {
  1967. itm.rowIndex = i + rowIndex;
  1968. }
  1969. });
  1970. break;
  1971. case o.level1 === "小计":
  1972. console.log("object :>> ", _formula);
  1973. _formula.forEach(itm => {
  1974. if (isFilterLabel(itm.label) === o.level) {
  1975. itm.rowIndex = i + rowIndex;
  1976. }
  1977. });
  1978. break;
  1979. }
  1980. state.headerDannumCost.forEach(itm => {
  1981. let matchArr = [];
  1982. for (const key in itm) {
  1983. if (["level", "level1", "level2", "label"].includes(key)) {
  1984. console.log("object :>> ", itm[key], o[key]);
  1985. if (itm[key] === o[key]) {
  1986. matchArr.push(true);
  1987. } else {
  1988. matchArr.push(false);
  1989. }
  1990. }
  1991. }
  1992. if (matchArr.every(itm => itm)) {
  1993. itm.rowIndex = i + rowIndex;
  1994. }
  1995. });
  1996. } else {
  1997. let key = "";
  1998. switch (true) {
  1999. case o.label != "":
  2000. key = o.label;
  2001. break;
  2002. case o.level2 != "":
  2003. key = o.level2;
  2004. break;
  2005. case o.level1 != "":
  2006. key = o.level1;
  2007. break;
  2008. case o.level2 != "":
  2009. key = o.level2;
  2010. break;
  2011. default:
  2012. key = o.level;
  2013. break;
  2014. }
  2015. _replace.forEach(itm => {
  2016. if (isFilterLabel(itm.label) === key) {
  2017. if (!itm.hasOwnProperty("rowArr")) {
  2018. itm.rowArr = [];
  2019. }
  2020. itm.rowArr.push(i + rowIndex);
  2021. }
  2022. });
  2023. // if (_replaceMap.has(o.label)) {
  2024. // let _row = _replaceMap.get(o.level);
  2025. // if (!_row.hasOwnProperty("rowArr")) {
  2026. // _row.rowArr = [];
  2027. // }
  2028. // _row.rowArr.push(i + rowIndex);
  2029. // _replaceMap.set(o.level, _row);
  2030. // }
  2031. }
  2032. });
  2033. // 替换公式中出现的单元格
  2034. console.log("记录哪些行有 _formulaMap :>> ", _formula);
  2035. console.log("记录哪些行有 _replaceMap :>> ", _replace);
  2036. // insertedRows.map(row => {
  2037. // row.eachCell(cell => {
  2038. // console.log('cell.value :>> ', cell.value);
  2039. // if (cell.value === "小计")
  2040. // });
  2041. // })
  2042. insertedRows.map(row => {
  2043. row.eachCell((cell: any) => {
  2044. console.log("insertedRows row cell :>> ", cell, cell.value, cell._column._key);
  2045. let _cellCol = cell.address.match(/[a-zA-Z]+/g)[0];
  2046. let _cellRow = Number(cell.address.match(/[0-9]+/g)[0]);
  2047. let oriValue = cell.value;
  2048. // if (cell.value == "小计") {
  2049. if (["costamt_2", "costamt_1", "costamt_3", "costamt_4"].includes(cell._column._key) && userInfo.usermode == 0) {
  2050. // 只取字符串中出现的数字
  2051. console.log("_cellRow :>> ", _cellRow);
  2052. let _formulaItem = _formula.find(o => o.rowIndex == _cellRow);
  2053. console.log("_formulaItem :>> ", _formulaItem);
  2054. if (_formulaItem) {
  2055. // 公式替换
  2056. let ifNotMatch = false;
  2057. let formulaArr = funcFormulaToArray(_formulaItem.value);
  2058. formulaArr = formulaArr.map((o: any) => {
  2059. if (o.indexOf("[") === 0) {
  2060. let _rItem = _replace.find(itm => isFilterLabel(itm.label) === o.slice(1, -1));
  2061. // let _fItem = _formula.find(itm => isFilterLabel(itm.label) === o.slice(1, -1));
  2062. // if (_fItem && _fItem?.rowIndex) {
  2063. // console.log("公式替换_fItem", _fItem);
  2064. // return _cellCol + _fItem?.rowIndex;
  2065. // } else
  2066. if (_rItem) {
  2067. if (_rItem.hasOwnProperty("rowArr")) {
  2068. let idx = _rItem.rowArr.find(item => item < _cellRow);
  2069. if (!idx) {
  2070. idx = _rItem.rowArr[0];
  2071. }
  2072. return _cellCol + idx;
  2073. } else {
  2074. console.log("_rItem.value ,oriv :>> ", _rItem.value, oriValue);
  2075. ifNotMatch = true;
  2076. return _rItem.value;
  2077. }
  2078. }
  2079. }
  2080. return o;
  2081. });
  2082. if (!ifNotMatch) {
  2083. cell.value = {
  2084. formula: `=${formulaArr.join("")}`
  2085. };
  2086. cell.numFmt = "0.00";
  2087. }
  2088. } else {
  2089. // 指向公式
  2090. let _rItem = _replace.find(itm => itm?.rowArr && itm?.rowArr.includes(_cellRow));
  2091. if (_rItem) {
  2092. let _formulaItem = _formula.find(o => o.label == _rItem.label && o.rowIndex < _cellRow);
  2093. if (_formulaItem) {
  2094. cell.value = {
  2095. formula: `=${_cellCol + _formulaItem.rowIndex}`
  2096. };
  2097. cell.numFmt = "0.00";
  2098. }
  2099. // 替换特殊单元格
  2100. let _variable = variableCellArr.find(itm => itm.label === isFilterLabel(_rItem.label));
  2101. console.log("_variable _rItem:>> ", _variable, _rItem, variableCellArr, isFilterLabel(_rItem.label));
  2102. if (_variable) {
  2103. if (_variable?.jointo) {
  2104. cell.value = {
  2105. formula: `=${_variable.cell} + ${oriValue}`
  2106. };
  2107. } else {
  2108. cell.value = {
  2109. formula: `=${_variable.cell}`
  2110. };
  2111. }
  2112. }
  2113. }
  2114. }
  2115. cell.numFmt = "0.00";
  2116. // let _formulaItem = _formulaMap.get(cell.value);
  2117. // console.log("_formulaItem :>> ", _formulaItem);
  2118. }
  2119. cell.border = state.default_border;
  2120. });
  2121. });
  2122. // 结果显示在头部
  2123. state.headerDannumCost.forEach(o => {
  2124. let _val = data[o.field];
  2125. if (userInfo.usermode == 0) {
  2126. _val = {
  2127. formula: `=${o.cellCol + o.rowIndex}`
  2128. };
  2129. }
  2130. setCellOrMergeCell(worksheet, 1, o.showCell, {
  2131. value: _val,
  2132. numFmt: "0.00",
  2133. ...state.defalut_header_style
  2134. });
  2135. });
  2136. toMergeCells(worksheet, "level", "B", rowIndex);
  2137. toMergeCells(worksheet, "level1", "C", rowIndex);
  2138. toMergeCells(worksheet, "level2", "D", rowIndex);
  2139. ifShowDetail && toMergeCells(worksheet, "label", "E", rowIndex);
  2140. //======================================= 下载工作簿 =================================
  2141. workbook.xlsx.writeBuffer().then(buffer => {
  2142. saveAs(new Blob([buffer], { type: "application/octet-stream" }), fileName + ".xlsx");
  2143. });
  2144. };
  2145. const getColumnStyle = (worksheet: any, colNuame: string, key: string, width: number, style: any = {}) => {
  2146. const col = worksheet.getColumn(colNuame);
  2147. col.width = width;
  2148. col.key = key;
  2149. col.style = {
  2150. font: state.default_font,
  2151. alignment: { ...state.default_alignment, ...style }
  2152. };
  2153. };
  2154. /**
  2155. * @description 设置或合并单元格
  2156. * @param worksheet
  2157. * @param rowIndex 当前行索引
  2158. * @param mergeCellName 单元格名称,有“:”则合并单元格
  2159. * @param option 单元格样式参数
  2160. * @param value String=>内容, Object=>表达式
  2161. * @param font 字体样式
  2162. * @param alignment 单元格样式
  2163. * @param height 行高度默认18
  2164. */
  2165. const setCellOrMergeCell = (worksheet: any, rowIndex: Number, mergeCellName: string, option: any = {}) => {
  2166. let colName = mergeCellName;
  2167. let { value, font = state.default_font, alignment = {}, height = 18, numFmt } = option;
  2168. if (mergeCellName.indexOf(":") > -1) {
  2169. worksheet.mergeCells(mergeCellName);
  2170. worksheet.getRow(rowIndex).height = height; // 设置行高
  2171. colName = mergeCellName.split(":")[0];
  2172. }
  2173. const cellB1 = worksheet.getCell(colName);
  2174. cellB1.value = value;
  2175. // 设置第一行的单元格样式
  2176. cellB1.font = font;
  2177. cellB1.alignment = { ...state.default_alignment, ...alignment };
  2178. if (numFmt) {
  2179. cellB1.numFmt = numFmt;
  2180. }
  2181. };
  2182. /**
  2183. * @description 取上一个字母(从A到Z)
  2184. * @param letter 当前字母
  2185. * @returns, z -> y, a -> z, b -> a
  2186. */
  2187. const getPreLetter = letter => {
  2188. let code = letter.charCodeAt(0);
  2189. if (code === 65) {
  2190. return String.fromCharCode(code + 25);
  2191. } else {
  2192. return String.fromCharCode(code - 1);
  2193. }
  2194. };
  2195. /**
  2196. * @description 合并单元格
  2197. */
  2198. const toMergeCells = (worksheet: any, field: string, cellname: string, startRowIndex: number) => {
  2199. // label列内容相同时合并单元格
  2200. let same = 0;
  2201. state.tableData.map((t, i) => {
  2202. // label列内容相同的时候,多行合并单元格
  2203. if (i > 0 && t[field] && t[field] === state.tableData[i - 1][field]) {
  2204. same++;
  2205. } else {
  2206. if (same > 0) {
  2207. worksheet.mergeCells(`${cellname}${startRowIndex + i - 1 - same}:${cellname}${startRowIndex + i - 1}`);
  2208. }
  2209. same = 0;
  2210. }
  2211. });
  2212. if (same > 0) {
  2213. worksheet.mergeCells(
  2214. `${cellname}${startRowIndex + state.tableData.length - 1 - same}:${cellname}${startRowIndex + state.tableData.length - 1}`
  2215. );
  2216. }
  2217. };
  2218. const isFilterLabel = (val: any) => {
  2219. return val.replace(/【/g, "").replace(/】/g, "");
  2220. };
  2221. const funcFormulaToArray = (formula: string) => {
  2222. if (!formula) return [];
  2223. let result = [];
  2224. let lastIndex = 0;
  2225. let _formula = formula;
  2226. _formula = formula.replace(/【/g, "[").replace(/】/g, "]");
  2227. let fArr = _formula.match(/\[(.*?)\]/g); //匹配方括号及其内容。
  2228. fArr.forEach((match, index) => {
  2229. let start = _formula.indexOf(match, lastIndex);
  2230. let end = start + match.length;
  2231. // 添加匹配前的部分
  2232. result.push(_formula.slice(lastIndex, start));
  2233. // 添加匹配到的内容
  2234. result.push(match);
  2235. // 更新 lastIndex
  2236. lastIndex = end;
  2237. });
  2238. // 添加最后一部分
  2239. result.push(formula.slice(lastIndex));
  2240. return result.filter(t => t);
  2241. };
  2242. return {
  2243. ...toRefs(state),
  2244. wf_retrieve_qingdan,
  2245. toExcelQuote,
  2246. toExcelQuoteNew
  2247. };
  2248. };