SendPurchaseWDLY.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. <template>
  2. <div style="width: 100%; padding: 0px 15px">
  3. <el-form
  4. :model="formData.data"
  5. :rules="rules"
  6. ref="formDom"
  7. label-position="top"
  8. :disabled="judgeStatus()"
  9. >
  10. <div class="_t">基础信息</div>
  11. <el-row :gutter="10">
  12. <el-col :span="6">
  13. <el-form-item label="采购部门" prop="deptName">
  14. <el-input
  15. v-model="formData.data.deptName"
  16. placeholder="请输入"
  17. disabled
  18. >
  19. </el-input>
  20. </el-form-item>
  21. </el-col>
  22. <el-col :span="6">
  23. <el-form-item label="采购人" prop="purchaseName">
  24. <el-input
  25. v-model="formData.data.purchaseName"
  26. placeholder="请输入"
  27. disabled
  28. >
  29. </el-input>
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="6">
  33. <el-form-item label="采购时间" prop="purchaseTime">
  34. <el-date-picker
  35. v-model="formData.data.purchaseTime"
  36. type="datetime"
  37. placeholder="请选择"
  38. disabled
  39. />
  40. </el-form-item>
  41. </el-col>
  42. </el-row>
  43. <el-row :gutter="10">
  44. <el-col :span="6">
  45. <el-form-item label="供应商" prop="supplyId">
  46. <el-select
  47. v-model="formData.data.supplyId"
  48. placeholder="请选择"
  49. @change="handleChangeSupplier"
  50. filterable
  51. style="width: 100%"
  52. >
  53. <el-option
  54. v-for="item in supplierData"
  55. :label="item.name"
  56. :value="item.id"
  57. >
  58. </el-option>
  59. </el-select>
  60. </el-form-item>
  61. </el-col>
  62. <el-col :span="6">
  63. <el-form-item label="是否合同" prop="isAgreement">
  64. <el-select
  65. v-model="formData.data.isAgreement"
  66. placeholder="请选择"
  67. style="width: 100%"
  68. >
  69. <el-option label="是" value="1"> </el-option>
  70. <el-option label="否" value="0"> </el-option>
  71. </el-select>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="6">
  75. <el-form-item label="付款方式" prop="paymentMethod">
  76. <el-select
  77. v-model="formData.data.paymentMethod"
  78. placeholder="请选择"
  79. filterable
  80. style="width: 100%"
  81. >
  82. <el-option
  83. v-for="item in fundsPaymentMethod"
  84. :label="item.dictValue"
  85. :value="item.dictKey"
  86. >
  87. </el-option>
  88. </el-select>
  89. </el-form-item>
  90. </el-col>
  91. <el-col :span="6">
  92. <el-form-item label="采购单号" prop="contractCode">
  93. <el-input v-model="formData.data.contractCode" placeholder="请输入">
  94. </el-input>
  95. </el-form-item>
  96. </el-col>
  97. </el-row>
  98. <el-form-item label="采购说明" prop="purchaseContent">
  99. <el-input
  100. v-model="formData.data.purchaseContent"
  101. placeholder="请输入"
  102. type="textarea"
  103. >
  104. </el-input>
  105. </el-form-item>
  106. <div class="_t">采购明细</div>
  107. <el-form-item>
  108. <el-button
  109. type="primary"
  110. @click="openProduct = true"
  111. style="margin: 10px 0"
  112. v-if="ids.length == 0"
  113. >
  114. 添加物品
  115. </el-button>
  116. <el-table
  117. :data="formData.data.purchaseDetailList"
  118. show-summary
  119. :summary-method="getSummaries"
  120. >
  121. <el-table-column
  122. prop="productDefinition"
  123. label="物品类型"
  124. :formatter="
  125. (row) =>
  126. row.productDefinition == 1
  127. ? '产品'
  128. : row.productDefinition == 2
  129. ? '物料'
  130. : ''
  131. "
  132. />
  133. <el-table-column prop="productCustomCode" label="物品编码" />
  134. <el-table-column prop="productName" label="物品名称" />
  135. <el-table-column prop="productSpec" label="规格" />
  136. <el-table-column
  137. prop="productUnit"
  138. label="单位"
  139. :formatter="(row) => dictValueLabel(row.productUnit, productUnit)"
  140. />
  141. <el-table-column prop="subscribeCount" label="申购数量" />
  142. <el-table-column prop="purchaseCount" label="已采购数量" />
  143. <el-table-column prop="count" label="本次采购" min-width="150">
  144. <template #default="{ row, $index }">
  145. <el-form-item
  146. :prop="'purchaseDetailList.' + $index + '.count'"
  147. :rules="rules.count"
  148. :inline-message="true"
  149. >
  150. <el-input-number
  151. :model-value="formData.data.purchaseDetailList[$index].count"
  152. :precision="4"
  153. :controls="false"
  154. :min="0"
  155. onmousewheel="return false;"
  156. @change="(val) => handleChangeMoney(val, $index, 'count')"
  157. />
  158. </el-form-item>
  159. </template>
  160. </el-table-column>
  161. <el-table-column prop="price" label="单价" min-width="150">
  162. <template #default="{ row, $index }">
  163. <el-form-item
  164. :prop="'purchaseDetailList.' + $index + '.price'"
  165. :rules="rules.price"
  166. :inline-message="true"
  167. >
  168. <el-input-number
  169. :model-value="formData.data.purchaseDetailList[$index].price"
  170. :precision="4"
  171. :controls="false"
  172. :min="0"
  173. onmousewheel="return false;"
  174. @change="(val) => handleChangeMoney(val, $index, 'price')"
  175. />
  176. </el-form-item>
  177. </template>
  178. </el-table-column>
  179. <el-table-column prop="amount" label="金额" />
  180. <el-table-column prop="zip" label="操作" width="100">
  181. <template #default="{ $index }">
  182. <el-button type="primary" link @click="handleRemove($index, 20)"
  183. >删除</el-button
  184. >
  185. </template>
  186. </el-table-column>
  187. </el-table>
  188. </el-form-item>
  189. <div class="_t">其他费用</div>
  190. <el-form-item>
  191. <el-button type="primary" style="margin: 10px 0" @click="handleAdd">
  192. 添加
  193. </el-button>
  194. <el-table
  195. :data="formData.data.otherFeeList"
  196. show-summary
  197. :summary-method="getSummariesOne"
  198. >
  199. <el-table-column prop="name" label="费用名称" min-width="150">
  200. <template #default="{ row, $index }">
  201. <el-form-item
  202. :prop="'otherFeeList.' + $index + '.name'"
  203. :rules="rulesOne.name"
  204. :inline-message="true"
  205. >
  206. <el-input v-model="row.name" placeholder="请输入" />
  207. </el-form-item>
  208. </template>
  209. </el-table-column>
  210. <el-table-column prop="price" label="金额" min-width="150">
  211. <template #default="{ row, $index }">
  212. <el-form-item
  213. :prop="'otherFeeList.' + $index + '.price'"
  214. :rules="rulesOne.price"
  215. :inline-message="true"
  216. >
  217. <el-input-number
  218. v-model="row.price"
  219. :precision="4"
  220. :controls="false"
  221. onmousewheel="return false;"
  222. @change="handleChangeAmount"
  223. />
  224. </el-form-item>
  225. </template>
  226. </el-table-column>
  227. <el-table-column prop="remark" label="备注" min-width="150">
  228. <template #default="{ row, $index }">
  229. <el-form-item
  230. :prop="'otherFeeList.' + $index + '.remark'"
  231. :inline-message="true"
  232. >
  233. <el-input v-model="row.remark" placeholder="请输入" />
  234. </el-form-item>
  235. </template>
  236. </el-table-column>
  237. <el-table-column prop="zip" label="操作" width="100">
  238. <template #default="{ $index }">
  239. <el-button type="primary" link @click="handleRemove($index, 10)"
  240. >删除</el-button
  241. >
  242. </template>
  243. </el-table-column>
  244. </el-table>
  245. </el-form-item>
  246. <el-row :gutter="10">
  247. <el-col :span="4">
  248. <el-form-item label="运费" prop="freight">
  249. <el-input-number
  250. v-model="formData.data.freight"
  251. :precision="4"
  252. :min="0"
  253. :controls="false"
  254. onmousewheel="return false;"
  255. style="width: 100%"
  256. @change="handleChangeAmount"
  257. />
  258. </el-form-item>
  259. </el-col>
  260. <el-col :span="4">
  261. <el-form-item label="优惠" prop="preferential">
  262. <el-input-number
  263. v-model="formData.data.preferential"
  264. :precision="4"
  265. :controls="false"
  266. onmousewheel="return false;"
  267. style="width: 100%"
  268. @change="handleChangeAmount"
  269. />
  270. </el-form-item>
  271. </el-col>
  272. </el-row>
  273. <div class="_t" style="margin-bottom: 15px">采购总金额</div>
  274. <el-row>
  275. <el-col :span="4">
  276. <el-form-item label="采购总金额" prop="amount">
  277. <el-input
  278. v-model="formData.data.amount"
  279. placeholder="请输入"
  280. disabled
  281. />
  282. </el-form-item>
  283. </el-col>
  284. </el-row>
  285. <el-form-item label="上传附件">
  286. <div style="width: 100%">
  287. <el-upload
  288. v-model:fileList="fileList"
  289. action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
  290. :data="uploadData"
  291. multiple
  292. :before-upload="handleBeforeUpload"
  293. :on-success="handleSuccess"
  294. :on-preview="onPreviewFile"
  295. >
  296. <el-button>选择</el-button>
  297. </el-upload>
  298. </div>
  299. </el-form-item>
  300. </el-form>
  301. <el-dialog
  302. v-model="openProduct"
  303. title="选择物品"
  304. width="70%"
  305. append-to-body
  306. >
  307. <SelectGoods
  308. @cancel="openProduct = false"
  309. @pushGoods="pushGoods"
  310. ></SelectGoods>
  311. </el-dialog>
  312. </div>
  313. </template>
  314. <script setup>
  315. import SelectGoods from "@/components/product/SelectGoods";
  316. import { ElMessage, ElMessageBox } from "element-plus";
  317. import useUserStore from "@/store/modules/user";
  318. import { useRouter, useRoute } from "vue-router";
  319. const { proxy } = getCurrentInstance();
  320. const route = useRoute();
  321. let formData = reactive({
  322. data: {
  323. purchaseTime: "",
  324. purchaseDetailList: [],
  325. otherFeeList: [],
  326. },
  327. });
  328. let rules = ref({
  329. deptName: [{ required: true, message: "请输入采购部门", trigger: "blur" }],
  330. purchaseName: [
  331. { required: true, message: "请输入采购人名称", trigger: "blur" },
  332. ],
  333. purchaseTime: [
  334. { required: true, message: "请选择采购时间", trigger: "change" },
  335. ],
  336. supplyId: [{ required: true, message: "请选择供应商", trigger: "change" }],
  337. count: [{ required: true, message: "请输入本次采购数量", trigger: "blur" }],
  338. price: [{ required: true, message: "请输入单价", trigger: "blur" }],
  339. remark: [{ required: true, message: "请输入备注", trigger: "blur" }],
  340. isAgreement: [
  341. { required: true, message: "请选择是否合同", trigger: "change" },
  342. ],
  343. paymentMethod: [
  344. { required: true, message: "请选择付款方式", trigger: "change" },
  345. ],
  346. contractCode: [
  347. { required: true, message: "请输入采购单号", trigger: "blur" },
  348. ],
  349. freight: [{ required: true, message: "请输入运费", trigger: "blur" }],
  350. preferential: [{ required: true, message: "请输入优惠", trigger: "blur" }],
  351. });
  352. let rulesOne = ref({
  353. name: [{ required: true, message: "请输入费用名称", trigger: "blur" }],
  354. price: [{ required: true, message: "请输入金额", trigger: "blur" }],
  355. });
  356. const openProduct = ref(false);
  357. // 上传附件
  358. const uploadData = ref({});
  359. const fileList = ref([]);
  360. const handleBeforeUpload = async (file) => {
  361. const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
  362. uploadData.value = res.uploadBody;
  363. file.id = res.id;
  364. file.fileName = res.fileName;
  365. file.fileUrl = res.fileUrl;
  366. file.uploadState = true;
  367. return true;
  368. };
  369. const handleSuccess = (any, UploadFile) => {
  370. UploadFile.raw.uploadState = false;
  371. };
  372. const onPreviewFile = (file) => {
  373. window.open(file.raw.fileUrl, "_blank");
  374. };
  375. const handleAdd = () => {
  376. formData.data.otherFeeList.push({
  377. name: "",
  378. price: 0,
  379. remark: "",
  380. });
  381. };
  382. // 物品相应逻辑
  383. const handleRemove = (index, type) => {
  384. if (type == 10) {
  385. formData.data.otherFeeList.splice(index, 1);
  386. } else if (type == 20) {
  387. formData.data.purchaseDetailList.splice(index, 1);
  388. }
  389. handleChangeAmount();
  390. return ElMessage({
  391. message: "删除成功!",
  392. type: "success",
  393. });
  394. };
  395. const pushGoods = (goods) => {
  396. const arr = goods.map((x) => ({
  397. goodType: x.goodType,
  398. productCode: x.code,
  399. productName: x.name,
  400. productSpec: x.spec,
  401. productUnit: x.unit,
  402. count: 0,
  403. price: 0,
  404. bussinessId: x.id,
  405. amount: 0,
  406. }));
  407. formData.data.purchaseDetailList =
  408. formData.data.purchaseDetailList.concat(arr);
  409. openProduct.value = false;
  410. return ElMessage({
  411. message: "添加成功!",
  412. type: "success",
  413. });
  414. };
  415. // 提交方法
  416. const formDom = ref(null);
  417. const handleSubmit = async () => {
  418. const vaild = await formDom.value.validate();
  419. if (vaild) {
  420. if (formData.data.purchaseDetailList.length > 0) {
  421. const list = formData.data.purchaseDetailList;
  422. for (let i = 0; i < list.length; i++) {
  423. const e = list[i];
  424. if (ids.value.length > 0) {
  425. if (Number(e.subscribeCount) - Number(e.purchaseCount) > 0) {
  426. if (e.count == 0) {
  427. ElMessage({
  428. message: "本次采购数量不能为0!",
  429. type: "info",
  430. });
  431. return false;
  432. }
  433. }
  434. if (e.count + Number(e.purchaseCount) > Number(e.subscribeCount)) {
  435. ElMessage({
  436. message: "本次采购数量和已采购数量和不可大于申购数量!",
  437. type: "info",
  438. });
  439. return false;
  440. }
  441. } else {
  442. if (e.count == 0) {
  443. ElMessage({
  444. message: "本次采购数量不能为0!",
  445. type: "info",
  446. });
  447. return false;
  448. }
  449. }
  450. }
  451. if (fileList.value && fileList.value.length > 0) {
  452. for (let i = 0; i < fileList.value.length; i++) {
  453. if (fileList.value[i].raw.uploadState) {
  454. ElMessage("文件上传中,请稍后提交");
  455. return false;
  456. }
  457. }
  458. formData.data.fileList = fileList.value.map((item) => {
  459. return {
  460. id: item.raw.id,
  461. fileName: item.raw.fileName,
  462. fileUrl: item.raw.fileUrl,
  463. uploadState: item.raw.uploadState,
  464. };
  465. });
  466. } else {
  467. formData.data.fileList = [];
  468. }
  469. return true;
  470. }
  471. ElMessage({
  472. message: "请添加采购明细!",
  473. type: "info",
  474. });
  475. return false;
  476. }
  477. return false;
  478. };
  479. // 获取用户信息并赋默认值
  480. const userInfo = useUserStore().user;
  481. onMounted(() => {
  482. formData.data.purchaseTime = proxy.parseTime(new Date());
  483. formData.data.deptName = userInfo.dept.deptName;
  484. formData.data.purchaseName = userInfo.nickName;
  485. getSupplierList();
  486. if (!route.query.processType) {
  487. formData.data.freight = 0;
  488. formData.data.preferential = 0;
  489. ids.value = props.queryData.ids.split(",") || [];
  490. getDetails();
  491. } else {
  492. let val = route.query.businessId;
  493. proxy
  494. .post("/purchase/detail", {
  495. id: val,
  496. })
  497. .then((res) => {
  498. let jsonData = {};
  499. if (res.victoriatouristJson) {
  500. jsonData = JSON.parse(res.victoriatouristJson);
  501. }
  502. formData.data = { ...res, ...jsonData };
  503. formData.data.purchaseDetailList = formData.data.purchaseDetailList.map(
  504. (x) => ({
  505. ...x,
  506. subscribeCount: x.subscribeQuantity,
  507. purchaseCount: x.purchaseQuantity,
  508. })
  509. );
  510. });
  511. proxy
  512. .post("/fileInfo/getList", { businessIdList: [val] })
  513. .then((fileObj) => {
  514. formData.data.fileList = fileObj[val] || [];
  515. if (formData.data.fileList && formData.data.fileList.length > 0) {
  516. fileList.value = formData.data.fileList.map((item) => {
  517. return {
  518. raw: item,
  519. name: item.fileName,
  520. url: item.fileUrl,
  521. };
  522. });
  523. }
  524. });
  525. }
  526. });
  527. // 接收父组件的传值
  528. const props = defineProps({
  529. queryData: String,
  530. });
  531. const ids = ref([]);
  532. const getDetails = () => {
  533. proxy.post("/subscribeDetail/detail", { ids: ids.value }).then((res) => {
  534. formData.data.purchaseDetailList = res.map((x) => ({
  535. ...x,
  536. subscribeDetailId: x.id,
  537. subscribeCount: x.count,
  538. count: Number(x.count) - Number(x.purchaseCount),
  539. price: null,
  540. amount: null,
  541. }));
  542. });
  543. };
  544. // 获取用户信息并赋默认值
  545. const tenantId = userInfo.tenantId;
  546. // 获取供应商数据
  547. const supplierData = ref([]);
  548. const fundsPaymentMethod = ref([]);
  549. const getSupplierList = async (req) => {
  550. proxy
  551. .post("/supplierInfo/page", { pageNum: 1, pageSize: 9999 })
  552. .then((res) => {
  553. supplierData.value = res.rows;
  554. });
  555. proxy
  556. .post("/dictTenantData/page", {
  557. pageNum: 1,
  558. pageSize: 999,
  559. tenantId: tenantId,
  560. dictCode: "funds_payment_method",
  561. })
  562. .then((res) => {
  563. fundsPaymentMethod.value = res.rows;
  564. });
  565. };
  566. // 供应商改变逻辑
  567. const handleChangeSupplier = (val) => {
  568. const ids = formData.data.purchaseDetailList.map((x) => x.bussinessId);
  569. proxy
  570. .post("/supplierPrice/getSupplierPriceByProductIds", {
  571. supplierInfoId: val,
  572. productIdList: ids,
  573. })
  574. .then((res) => {
  575. if (res && Object.keys(res).length > 0) {
  576. for (let i = 0; i < formData.data.purchaseDetailList.length; i++) {
  577. const e = formData.data.purchaseDetailList[i];
  578. for (const key in res) {
  579. if (e.bussinessId === key) {
  580. e.price = Number(res[key]);
  581. }
  582. }
  583. }
  584. } else {
  585. for (let i = 0; i < formData.data.purchaseDetailList.length; i++) {
  586. const e = formData.data.purchaseDetailList[i];
  587. e.price = 0;
  588. }
  589. }
  590. handleChangeMoney();
  591. });
  592. };
  593. // 计算采购总金额
  594. const handleChangeAmount = () => {
  595. let sum = 0;
  596. for (let i = 0; i < formData.data.purchaseDetailList.length; i++) {
  597. const e = formData.data.purchaseDetailList[i];
  598. // e.amount = parseFloat(e.count * e.price).toFixed(4);
  599. sum += Number(e.amount);
  600. }
  601. for (let i = 0; i < formData.data.otherFeeList.length; i++) {
  602. const e = formData.data.otherFeeList[i];
  603. sum += Number(e.price);
  604. }
  605. sum += formData.data.freight;
  606. sum += formData.data.preferential;
  607. formData.data.amount = parseFloat(sum).toFixed(4);
  608. };
  609. const handleChangeMoney = (val, index, key) => {
  610. if (key) {
  611. formData.data.purchaseDetailList[index][key] = val;
  612. }
  613. for (let i = 0; i < formData.data.purchaseDetailList.length; i++) {
  614. formData.data.purchaseDetailList[i].amount = parseFloat(
  615. formData.data.purchaseDetailList[i].count *
  616. formData.data.purchaseDetailList[i].price
  617. ).toFixed(4);
  618. }
  619. handleChangeAmount();
  620. };
  621. const productUnit = ref([]);
  622. const getDict = () => {
  623. proxy.getDictOne(["unit"]).then((res) => {
  624. productUnit.value = res["unit"].map((x) => ({
  625. label: x.dictValue,
  626. value: x.dictKey,
  627. }));
  628. });
  629. };
  630. getDict();
  631. const judgeStatus = () => {
  632. if (route.query.processType == 20) {
  633. return true;
  634. }
  635. if (props.queryData.recordList && props.queryData.recordList.length > 0) {
  636. let data = props.queryData.recordList.filter(
  637. (item) => item.status === 2 && item.nodeType !== 1
  638. );
  639. if (data && data.length > 0) {
  640. return true;
  641. }
  642. }
  643. return false;
  644. };
  645. const getFormData = () => {
  646. return formData.data;
  647. };
  648. // 向父组件暴露
  649. defineExpose({
  650. // submitData: formData.data,
  651. getFormData,
  652. handleSubmit,
  653. });
  654. const getSummaries = (param) => {
  655. const { columns, data } = param; //columns是每列的信息,data是每行的信息
  656. const sums = [];
  657. columns.forEach((column, index) => {
  658. if (index === 0) {
  659. sums[index] = "合计"; //此处是在index=0的这一列显示为“合计”
  660. return;
  661. }
  662. const values = data.map((item) => Number(item[column.property]));
  663. if (
  664. column.property === "subscribeCount" ||
  665. column.property === "purchaseCount" ||
  666. column.property === "count" ||
  667. column.property === "amount"
  668. ) {
  669. sums[index] = values.reduce((prev, curr) => {
  670. const value = Number(curr);
  671. if (!isNaN(value)) {
  672. return Number(parseFloat(prev + curr).toFixed(4));
  673. } else {
  674. return prev;
  675. }
  676. }, 0);
  677. sums[index];
  678. }
  679. });
  680. return sums;
  681. };
  682. const getSummariesOne = (param) => {
  683. const { columns, data } = param; //columns是每列的信息,data是每行的信息
  684. const sums = [];
  685. columns.forEach((column, index) => {
  686. if (index === 0) {
  687. sums[index] = "合计"; //此处是在index=0的这一列显示为“合计”
  688. return;
  689. }
  690. const values = data.map((item) => Number(item[column.property]));
  691. if (column.property === "price") {
  692. sums[index] = values.reduce((prev, curr) => {
  693. const value = Number(curr);
  694. if (!isNaN(value)) {
  695. return Number(parseFloat(prev + curr).toFixed(4));
  696. } else {
  697. return prev;
  698. }
  699. }, 0);
  700. sums[index];
  701. }
  702. });
  703. return sums;
  704. };
  705. </script>
  706. <style lang="scss" scoped>
  707. ._t {
  708. margin-bottom: 5px;
  709. font-size: 14px;
  710. }
  711. </style>