accountDetailTable.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. <template>
  2. <div class="account-detail-table">
  3. <el-form ref="detailForm" :model="{ flatList }">
  4. <ele-pro-table
  5. ref="detailTable"
  6. row-key="id"
  7. :needPage="false"
  8. :columns="columns"
  9. max-height="500px"
  10. :datasource="flatList"
  11. :cache-key="cacheKeyUrl"
  12. class="time-form"
  13. >
  14. <template v-slot:toolbar>
  15. <div class="detail-toolbar">
  16. <el-button
  17. v-if="!isView"
  18. type="primary"
  19. size="small"
  20. @click="batchSetTaxRate"
  21. >批量设置税率</el-button
  22. >
  23. <el-button
  24. v-if="!isView"
  25. type="primary"
  26. size="small"
  27. @click="batchSetPrice"
  28. >批量设置单价</el-button
  29. >
  30. <el-button
  31. v-if="!isView"
  32. type="primary"
  33. size="small"
  34. @click="batchSetDiscount"
  35. >批量设置折让比例</el-button
  36. >
  37. <!-- <div class="summary-info">
  38. <span
  39. >本次总对账金额:<b>{{ totalStatementAmount }}</b> 元</span
  40. >
  41. <span
  42. >本次总对账数量:<b>{{ totalStatementCount }}</b></span
  43. >
  44. </div> -->
  45. </div>
  46. </template>
  47. <template v-slot:statementCount="scope">
  48. <el-form-item
  49. :prop="'flatList.' + scope.$index + '.statementCount'"
  50. :rules="{
  51. validator: (rule, value, cb) =>
  52. validateStatementCount(rule, value, cb, scope.row),
  53. trigger: 'change'
  54. }"
  55. >
  56. <el-input
  57. v-model="scope.row.statementCount"
  58. type="number"
  59. :disabled="isView || queryDimension == 1"
  60. @input="handleCountChange(scope.row, scope.$index)"
  61. />
  62. </el-form-item>
  63. </template>
  64. <template v-slot:technologyRouteName="scope">
  65. <el-input
  66. v-model="scope.row.technologyRouteName"
  67. placeholder="请选择"
  68. :disabled="isView"
  69. @click.native="openVersion(scope.$index)"
  70. />
  71. </template>
  72. <template v-slot:singlePrice="scope">
  73. <el-form-item
  74. :prop="'flatList.' + scope.$index + '.singlePrice'"
  75. :rules="{
  76. required: true,
  77. message: '请输入单价',
  78. trigger: 'change'
  79. }"
  80. >
  81. <el-input
  82. v-model="scope.row.singlePrice"
  83. type="number"
  84. :disabled="isView"
  85. @input="handlePriceChange(scope.row, scope.$index)"
  86. />
  87. <!-- <div v-if="isPriceInvalid(scope.row)" class="price-warning">
  88. 单价无效,请核对商品价格
  89. </div> -->
  90. </el-form-item>
  91. </template>
  92. <template v-slot:taxRate="scope">
  93. <el-form-item
  94. :prop="'flatList.' + scope.$index + '.taxRate'"
  95. :rules="{
  96. required: isTaxRate == 1,
  97. message: '请输入税率',
  98. trigger: 'change'
  99. }"
  100. >
  101. <el-input
  102. v-model="scope.row.taxRate"
  103. type="number"
  104. :disabled="isView"
  105. @input="handleTaxChange(scope.row, scope.$index)"
  106. />
  107. </el-form-item>
  108. </template>
  109. <template v-slot:discountRatio="scope">
  110. <el-form-item
  111. :prop="'flatList.' + scope.$index + '.discountRatio'"
  112. :rules="{
  113. required: true,
  114. message: '请输入折让比例',
  115. trigger: 'change'
  116. }"
  117. >
  118. <el-input
  119. v-model="scope.row.discountRatio"
  120. type="number"
  121. :min="0"
  122. :max="100"
  123. :disabled="isView"
  124. @input="handleDiscountChange(scope.row, scope.$index)"
  125. />
  126. </el-form-item>
  127. </template>
  128. <template v-slot:statementAmount="scope">
  129. <span>{{ scope.row.statementAmount }}</span>
  130. </template>
  131. <template v-slot:headerRequired="{ column }">
  132. <span class="is-required">{{ column.label }}</span>
  133. </template>
  134. <template v-slot:action="scope">
  135. <el-link
  136. v-if="!isView && queryDimension == 2"
  137. type="danger"
  138. :underline="false"
  139. icon="el-icon-delete"
  140. @click="removeRow(scope.$index)"
  141. >删除</el-link
  142. >
  143. <span v-else>--</span>
  144. </template>
  145. </ele-pro-table>
  146. </el-form>
  147. <!-- 批量设置弹窗 -->
  148. <el-dialog
  149. :visible.sync="batchDialogVisible"
  150. title="批量设置"
  151. width="400px"
  152. append-to-body
  153. >
  154. <el-form label-width="100px">
  155. <el-form-item :label="batchLabel">
  156. <el-input v-model="batchValue" type="number" />
  157. </el-form-item>
  158. </el-form>
  159. <div slot="footer">
  160. <el-button @click="batchDialogVisible = false">取消</el-button>
  161. <el-button type="primary" @click="confirmBatchSet">确定</el-button>
  162. </div>
  163. </el-dialog>
  164. <!-- 工艺路线选择弹窗 -->
  165. <ProductionVersion
  166. ref="versionRefs"
  167. @changeProduct="changeProduct"
  168. ></ProductionVersion>
  169. </div>
  170. </template>
  171. <script>
  172. import { parameterGetByCode } from '@/api/main/index.js';
  173. import { pricingWayList } from '@/enum/dict.js';
  174. import ProductionVersion from '@/components/ProductionVersion2/index.vue';
  175. export default {
  176. name: 'accountDetailTable',
  177. components: {
  178. ProductionVersion
  179. },
  180. props: {
  181. datasource: {
  182. type: Array,
  183. default: () => []
  184. },
  185. dialogType: {
  186. type: String,
  187. default: 'add'
  188. },
  189. queryDimension: {
  190. type: Number,
  191. default: 1
  192. },
  193. tableTitle: {
  194. type: String,
  195. default: ''
  196. }
  197. },
  198. data() {
  199. return {
  200. cacheKeyUrl: 'eom-202608171423-account-detail-table',
  201. isTaxRate: 0,
  202. flatList: [],
  203. totalStatementAmount: 0,
  204. totalStatementCount: 0,
  205. batchDialogVisible: false,
  206. batchType: '',
  207. batchValue: '',
  208. batchLabel: '',
  209. columnsVersion: 1,
  210. };
  211. },
  212. computed: {
  213. isView() {
  214. return this.dialogType === 'view';
  215. },
  216. columns() {
  217. let columnsVersion = this.columnsVersion;
  218. return [
  219. {
  220. width: 60,
  221. label: '序号',
  222. type: 'index',
  223. columnKey: 'index',
  224. align: 'center',
  225. fixed: 'left'
  226. },
  227. {
  228. minWidth: 140,
  229. prop: 'orderNo',
  230. label: this.tableTitle || '销售订单编码',
  231. align: 'center',
  232. showOverflowTooltip: true
  233. },
  234. {
  235. minWidth: 140,
  236. prop: this.queryDimension == 1 ? 'statementSubOrderCode' : 'statementSubOrderNo',
  237. label: this.queryDimension == 1 ? '发货单编码' : '调拨单编码',
  238. align: 'center',
  239. showOverflowTooltip: true,
  240. },
  241. {
  242. minWidth: 120,
  243. prop: 'productOperateTime',
  244. label: this.queryDimension == 1 ? '发货日期' : '调拨单日期',
  245. align: 'center',
  246. showOverflowTooltip: true,
  247. show: this.queryDimension == 1 ? false : true,
  248. },
  249. {
  250. minWidth: 120,
  251. prop: 'productCode',
  252. label: '产品编码',
  253. align: 'center',
  254. showOverflowTooltip: true
  255. },
  256. {
  257. minWidth: 140,
  258. prop: 'productName',
  259. label: '产品名称',
  260. align: 'center',
  261. showOverflowTooltip: true
  262. },
  263. {
  264. minWidth: 120,
  265. prop: 'batchNo',
  266. label: '批次号',
  267. align: 'center',
  268. showOverflowTooltip: true
  269. },
  270. // {
  271. // minWidth: 110,
  272. // prop: 'historicalStatementCount',
  273. // label: '已对账数量',
  274. // align: 'center'
  275. // },
  276. {
  277. minWidth: 140,
  278. headerSlot: 'headerRequired',
  279. prop: 'statementCount',
  280. label: '本次对账数量',
  281. align: 'center',
  282. slot: 'statementCount'
  283. },
  284. {
  285. minWidth: 120,
  286. headerSlot: 'headerRequired',
  287. prop: 'statementAmount',
  288. label: '本次对账金额',
  289. align: 'center',
  290. slot: 'statementAmount'
  291. },
  292. {
  293. minWidth: 120,
  294. prop: 'totalCount',
  295. label: this.queryDimension == 1 ? '发货数量' : '调拨数量',
  296. align: 'center',
  297. },
  298. {
  299. minWidth: 140,
  300. prop: 'technologyRouteName',
  301. label: '工艺路线',
  302. align: 'center',
  303. slot: 'technologyRouteName',
  304. showOverflowTooltip: true
  305. },
  306. {
  307. minWidth: 120,
  308. prop: 'singlePrice',
  309. label: '单价',
  310. align: 'center',
  311. slot: 'singlePrice'
  312. },
  313. {
  314. minWidth: 100,
  315. prop: 'taxRate',
  316. label: '税率',
  317. align: 'center',
  318. slot: 'taxRate'
  319. },
  320. {
  321. minWidth: 100,
  322. prop: 'noTaxSinglePrice',
  323. label: '不含税单价',
  324. align: 'center',
  325. },
  326. {
  327. minWidth: 100,
  328. prop: 'totalPrice',
  329. label: '合计',
  330. align: 'center',
  331. },
  332. {
  333. minWidth: 120,
  334. headerSlot: 'headerRequired',
  335. prop: 'discountRatio',
  336. label: '折让比例',
  337. align: 'center',
  338. slot: 'discountRatio'
  339. },
  340. {
  341. minWidth: 120,
  342. prop: 'discountSinglePrice',
  343. label: '折让单价',
  344. align: 'center',
  345. },
  346. {
  347. minWidth: 120,
  348. prop: 'discountTotalPrice',
  349. label: '折让合计',
  350. align: 'center',
  351. },
  352. {
  353. minWidth: 100,
  354. prop: 'specification',
  355. label: '规格',
  356. align: 'center',
  357. showOverflowTooltip: true
  358. },
  359. {
  360. minWidth: 100,
  361. prop: 'modelType',
  362. label: '型号',
  363. align: 'center',
  364. showOverflowTooltip: true
  365. },
  366. {
  367. minWidth: 80,
  368. prop: 'color',
  369. label: '颜色',
  370. align: 'center',
  371. showOverflowTooltip: true
  372. },
  373. {
  374. minWidth: 120,
  375. prop: 'outInCount',
  376. label: '出库数量',
  377. align: 'center',
  378. },
  379. {
  380. minWidth: 120,
  381. prop: 'measuringUnit',
  382. label: '计量单位',
  383. align: 'center',
  384. },
  385. {
  386. minWidth: 120,
  387. prop: 'sendTotalWeight',
  388. label: '出库重量',
  389. align: 'center',
  390. },
  391. {
  392. minWidth: 120,
  393. prop: 'weightUnit',
  394. label: '重量单位',
  395. align: 'center',
  396. },
  397. {
  398. minWidth: 120,
  399. prop: 'pricingWay',
  400. label: '计价方式',
  401. align: 'center',
  402. formatter: (row, column) => {
  403. return pricingWayList.find((item) => item.id == row.pricingWay)
  404. ?.name;
  405. }
  406. },
  407. ]
  408. }
  409. },
  410. watch: {
  411. datasource: {
  412. handler(newVal, oldVal) {
  413. this.$nextTick(() => {
  414. // 直接基于原始 productList 扁平行初始化派生字段(单价/税率/折让比例默认值及本次对账金额)
  415. const list = (newVal || []).map((item) => this.buildRow(item, item.orderNo || '', false));
  416. this.flatList = list;
  417. console.log(this.flatList)
  418. this.calcTotals();
  419. });
  420. },
  421. immediate: true
  422. },
  423. queryDimension() {
  424. // this.buildFlatList();
  425. this.calcTotals();
  426. }
  427. },
  428. created() {
  429. parameterGetByCode({ code: 'eom_saleOrder_order-taxRate' }).then(
  430. (res) => {
  431. this.isTaxRate = res.value;
  432. }
  433. );
  434. },
  435. methods: {
  436. buildRow(item, orderNo, isReturn) {
  437. const outboundCount = +item.totalCount || 0;
  438. // 退货单数量为负
  439. const count = isReturn ? -Math.abs(outboundCount) : outboundCount;
  440. const statemented = +item.statementedCount || 0;
  441. // 发货单:本次对账数量=出库数量(不可改);调拨单:默认=出库数量(可改)
  442. let statementCount = item.statementCount;
  443. if (
  444. statementCount === undefined ||
  445. statementCount === null ||
  446. statementCount === ''
  447. ) {
  448. statementCount = count;
  449. }
  450. const singlePrice = +item.singlePrice || 0;
  451. const discountRatio =
  452. item.discountRatio === undefined ||
  453. item.discountRatio === null ||
  454. item.discountRatio === ''
  455. ? 100
  456. : +item.discountRatio;
  457. const taxRate =
  458. item.taxRate === undefined || item.taxRate === null
  459. ? 0
  460. : +item.taxRate;
  461. const amount =
  462. Math.round(
  463. statementCount * singlePrice * (discountRatio / 100) * 100
  464. ) / 100;
  465. const noTaxSinglePrice =
  466. singlePrice && taxRate
  467. ? +((singlePrice / (1 + taxRate / 100)).toFixed(4))
  468. : '';
  469. const totalPrice = Math.round(statementCount * singlePrice * 100) / 100;
  470. const discountSinglePrice =
  471. Math.round(singlePrice * (discountRatio / 100) * 100) / 100;
  472. const discountTotalPrice =
  473. Math.round(totalPrice * (discountRatio / 100) * 100) / 100;
  474. // 直接修改原 item,保证编辑同步回 datasource
  475. // this.$set(item, 'id', item.id || Math.random().toString(36).slice(2));
  476. this.$set(item, 'saleOrderNo', orderNo);
  477. this.$set(
  478. item,
  479. 'statementSubOrderNo',
  480. item.statementSubOrderNo || item.subOrderNo || ''
  481. );
  482. this.$set(
  483. item,
  484. 'productOperateTime',
  485. item.productOperateTime || item.deliveryDate || ''
  486. );
  487. this.$set(item, 'outboundCount', count);
  488. this.$set(item, 'statementedCount', statemented);
  489. this.$set(item, 'statementCount', statementCount);
  490. this.$set(item, 'singlePrice', singlePrice);
  491. this.$set(item, 'taxRate', taxRate);
  492. this.$set(item, 'discountRatio', discountRatio);
  493. this.$set(item, 'statementAmount', amount);
  494. this.$set(item, 'noTaxSinglePrice', noTaxSinglePrice);
  495. this.$set(item, 'totalPrice', totalPrice);
  496. this.$set(item, 'discountSinglePrice', discountSinglePrice);
  497. this.$set(item, 'discountTotalPrice', discountTotalPrice);
  498. this.$set(item, 'isReturn', isReturn);
  499. this.$set(item, 'processRouteName', item.processRouteName || '');
  500. return item;
  501. },
  502. initDefaultValues() {
  503. this.datasource.forEach((item) => {
  504. if (item.singlePrice === undefined)
  505. this.$set(item, 'singlePrice', 0);
  506. if (item.taxRate === undefined) this.$set(item, 'taxRate', 0);
  507. if (item.discountRatio === undefined)
  508. this.$set(item, 'discountRatio', 100);
  509. });
  510. },
  511. buildFlatList() {
  512. const list = [];
  513. // this.datasource.forEach((order) => {
  514. // const orderNo = order.orderNo || '';
  515. // (order.deliveryProducts || []).forEach((item) => {
  516. // list.push(this.buildRow(item, orderNo, false));
  517. // });
  518. // (order.returnProducts || []).forEach((item) => {
  519. // list.push(this.buildRow(item, orderNo, true));
  520. // });
  521. // });
  522. // this.flatList = list;
  523. },
  524. calcTotals() {
  525. const amount =
  526. this.flatList.reduce(
  527. (pre, cur) => pre + Math.round((+cur.statementAmount || 0) * 100),
  528. 0
  529. ) / 100;
  530. const count = this.flatList.reduce(
  531. (pre, cur) => pre + (+cur.statementCount || 0),
  532. 0
  533. );
  534. this.totalStatementAmount = amount;
  535. this.totalStatementCount = count;
  536. this.$emit('totalChange', amount);
  537. this.$emit('countChange', count);
  538. // 按销售订单编码(saleOrderNo)汇总本次对账金额,供应收信息同步
  539. this.emitStatementAmountChange();
  540. },
  541. // 按销售订单编码汇总本次对账金额并抛出
  542. emitStatementAmountChange() {
  543. const summaryMap = {};
  544. this.flatList.forEach((row) => {
  545. const key = row.saleOrderNo;
  546. if (!key) return;
  547. summaryMap[key] =
  548. Math.round(
  549. ((summaryMap[key] || 0) + (+row.statementAmount || 0)) * 100
  550. ) / 100;
  551. });
  552. this.$emit('statementAmountChange', summaryMap);
  553. },
  554. // 重算某一行金额(参考 inventoryTable.vue 价格计算链)
  555. calcRow(row) {
  556. const count = +row.statementCount || 0;
  557. const price = +row.singlePrice || 0;
  558. // 折让比例未填写时按 100(不打折)计,避免金额被算成 0
  559. const ratio = row.discountRatio === '' ||
  560. row.discountRatio === null ||
  561. row.discountRatio === undefined ||
  562. isNaN(+row.discountRatio)
  563. ? 100
  564. : +row.discountRatio;
  565. const taxRate = +row.taxRate || 0;
  566. // 本次对账金额
  567. const amount = Math.round(count * price * (ratio / 100) * 100) / 100;
  568. this.$set(row, 'statementAmount', amount);
  569. // 不含税单价 = 单价 / (1 + 税率/100) (与 inventoryTable.getNotaxSinglePrice 一致)
  570. if (price && taxRate) {
  571. this.$set(
  572. row,
  573. 'noTaxSinglePrice',
  574. +((price / (1 + taxRate / 100)).toFixed(4))
  575. );
  576. } else {
  577. this.$set(row, 'noTaxSinglePrice', '');
  578. }
  579. // 合计 = 对账数量 * 单价
  580. this.$set(row, 'totalPrice', Math.round(count * price * 100) / 100);
  581. // 折让单价 = 单价 * 折让比例/100
  582. this.$set(
  583. row,
  584. 'discountSinglePrice',
  585. Math.round(price * (ratio / 100) * 100) / 100
  586. );
  587. // 折让合计 = 合计 * 折让比例/100
  588. this.$set(
  589. row,
  590. 'discountTotalPrice',
  591. Math.round(row.totalPrice * (ratio / 100) * 100) / 100
  592. );
  593. },
  594. handleCountChange(row, index) {
  595. this.calcRow(row);
  596. this.calcTotals();
  597. this.emitChange();
  598. },
  599. handlePriceChange(row, index) {
  600. this.calcRow(row);
  601. this.calcTotals();
  602. this.emitChange();
  603. },
  604. handleTaxChange(row, index) {
  605. // 税率变化需重算不含税单价、合计及折让相关字段
  606. this.calcRow(row);
  607. this.calcTotals();
  608. this.emitChange();
  609. },
  610. handleDiscountChange(row, index) {
  611. this.calcRow(row);
  612. this.calcTotals();
  613. this.emitChange();
  614. },
  615. emitChange() {
  616. // 表格实际编辑的是 flatList,直接以其为新数据源回写父组件
  617. this.$emit('update:datasource', [...this.flatList]);
  618. },
  619. // 单价校验:单价缺失或为 0 视为无效(需结合商品价目表有效期进一步校验)
  620. isPriceInvalid(row) {
  621. const price = +row.singlePrice || 0;
  622. return price <= 0;
  623. },
  624. validateStatementCount(rule, value, callback, row) {
  625. const val = +value || 0;
  626. const max = Math.abs(row.outboundCount || 0);
  627. if (Math.abs(val) > max) {
  628. callback(new Error('不能超出库数量'));
  629. } else if (this.queryDimension == 1 && val != row.outboundCount) {
  630. callback(new Error('按发货单查询时不可修改'));
  631. } else {
  632. callback();
  633. }
  634. },
  635. // 批量设置
  636. batchSetTaxRate() {
  637. this.batchType = 'taxRate';
  638. this.batchLabel = '税率';
  639. this.batchValue = '';
  640. this.batchDialogVisible = true;
  641. },
  642. batchSetPrice() {
  643. this.batchType = 'singlePrice';
  644. this.batchLabel = '单价';
  645. this.batchValue = '';
  646. this.batchDialogVisible = true;
  647. },
  648. batchSetDiscount() {
  649. this.batchType = 'discountRatio';
  650. this.batchLabel = '折让比例';
  651. this.batchValue = '';
  652. this.batchDialogVisible = true;
  653. },
  654. confirmBatchSet() {
  655. // flatList 为表格实际渲染的扁平行数据,直接逐行设置并重新计算
  656. this.flatList.forEach((item) => {
  657. this.$set(item, this.batchType, +this.batchValue);
  658. this.calcRow(item);
  659. });
  660. this.calcTotals();
  661. this.batchDialogVisible = false;
  662. this.emitChange();
  663. },
  664. removeRow(index) {
  665. // 调拨单模式下允许删除行,基于扁平行数组操作,保持数据格式一致
  666. if (index < 0 || index >= this.flatList.length) return;
  667. const list = [...this.flatList];
  668. list.splice(index, 1);
  669. this.flatList = list;
  670. this.calcTotals();
  671. this.emitChange();
  672. },
  673. getValidForm() {
  674. return new Promise((resolve, reject) => {
  675. this.$refs.detailForm.validate((valid) => {
  676. if (valid) resolve(true);
  677. else {
  678. this.$message.error('对账明细未填写完整');
  679. reject(false);
  680. }
  681. });
  682. });
  683. },
  684. // 打开工艺路线选择弹窗(参考 inventoryTable.openVersion)
  685. openVersion(index) {
  686. this.$refs.versionRefs.open(index);
  687. },
  688. // 工艺路线选择回调(参考 inventoryTable.changeProduct)
  689. changeProduct(data, index) {
  690. if (this.flatList[index]) {
  691. this.$set(this.flatList[index], 'technologyRouteName', data.name);
  692. this.$set(this.flatList[index], 'technologyRouteId', data.id);
  693. this.$set(this.flatList[index], 'technologyRouteVersion', data.version);
  694. this.emitChange();
  695. }
  696. }
  697. }
  698. };
  699. </script>
  700. <style scoped lang="scss">
  701. .account-detail-table {
  702. .detail-toolbar {
  703. display: flex;
  704. justify-content: flex-start;
  705. align-items: center;
  706. margin-bottom: 10px;
  707. .summary-info {
  708. span {
  709. margin-left: 20px;
  710. b {
  711. color: #f56c6c;
  712. }
  713. }
  714. }
  715. }
  716. .time-form .el-form-item {
  717. margin-bottom: 0 !important;
  718. }
  719. .price-warning {
  720. color: #f56c6c;
  721. font-size: 12px;
  722. line-height: 1.4;
  723. margin-top: 2px;
  724. }
  725. }
  726. </style>