detailsPage.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823
  1. <template>
  2. <div class="borderless">
  3. <div class="customer-head">
  4. <div class="customer-back">
  5. <el-button
  6. type="danger"
  7. style="border: none;background: none;color: red"
  8. icon="el-icon-arrow-left"
  9. @click="backToList"
  10. >返回列表
  11. </el-button>
  12. </div>
  13. <el-button type="success" class="copy-customer-btn" disabled>
  14. 复制新单
  15. </el-button>
  16. <el-button
  17. class="el-button--small-yh add-customer-btn"
  18. type="primary"
  19. :disabled="disabled"
  20. @click="editCustomer"
  21. >{{ form.id ? "确认修改" : "确认新增" }}
  22. </el-button>
  23. </div>
  24. <div style="margin-top: 60px;margin-bottom:35px">
  25. <containerTitle title="基础信息"></containerTitle>
  26. <basic-container>
  27. <avue-form ref="form" v-model="form" :option="option">
  28. <template slot="portOfLoad">
  29. <port-info
  30. v-model="form.portOfLoad"
  31. :disabled="$route.query.status == 1"
  32. />
  33. </template>
  34. <template slot="portOfDestination">
  35. <port-info
  36. v-model="form.portOfDestination"
  37. :disabled="$route.query.status == 1"
  38. />
  39. </template>
  40. <template slot="corpId">
  41. <select-component
  42. v-model="form.corpId"
  43. :configuration="configuration"
  44. :disabled="$route.query.status == 1"
  45. ></select-component>
  46. </template>
  47. <template slot="exchangeRate">
  48. <el-input
  49. size="mini"
  50. v-model="form.exchangeRate"
  51. oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'
  52. @change="rateChange"
  53. placeholder="请输入 汇率"
  54. :disabled="$route.query.status == 1"
  55. ><template slot="append">%</template></el-input
  56. >
  57. </template>
  58. </avue-form>
  59. </basic-container>
  60. <div>
  61. <containerTitle title="商品信息"></containerTitle>
  62. <basic-container>
  63. <avue-crud
  64. :ref="crud"
  65. :data="data"
  66. :option="tableOption"
  67. @row-del="rowDel"
  68. @selection-change="goodsSelectionChange"
  69. >
  70. <template slot="price" slot-scope="{ row }">
  71. <el-input
  72. v-if="row.$cellEdit"
  73. v-model="row.price"
  74. size="small"
  75. oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'
  76. @change="priceChange(row)"
  77. ></el-input>
  78. <span v-else>{{ row.price }}</span>
  79. </template>
  80. <template slot="orderQuantity" slot-scope="{ row }">
  81. <el-input
  82. v-if="row.$cellEdit"
  83. v-model="row.orderQuantity"
  84. size="small"
  85. oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'
  86. @change="quantityChange(row)"
  87. ></el-input>
  88. <span v-else>{{ row.orderQuantity }}</span>
  89. </template>
  90. <template slot="menuLeft">
  91. <el-button
  92. type="primary"
  93. icon="el-icon-plus"
  94. size="small"
  95. @click.stop="newDetails"
  96. :disabled="$route.query.status == 1"
  97. >新增明细</el-button
  98. >
  99. <el-button
  100. type="info"
  101. icon="el-icon-printer"
  102. size="small"
  103. @click.stop="openReport()"
  104. >报 表</el-button
  105. >
  106. <el-button
  107. type="warning"
  108. icon="el-icon-plus"
  109. size="small"
  110. :disabled="$route.query.status == 1 || orderItemIds.length == 0"
  111. @click="getInvoice"
  112. >生成发货单
  113. </el-button>
  114. </template>
  115. <template slot="menu" slot-scope="scope">
  116. <el-button
  117. v-if="scope.row.$cellEdit"
  118. size="small"
  119. icon="el-icon-edit"
  120. type="text"
  121. @click="rowDel(scope.row, scope.index)"
  122. >删 除</el-button
  123. >
  124. </template>
  125. </avue-crud>
  126. </basic-container>
  127. </div>
  128. <fee-info
  129. ref="feeInfo"
  130. :orderFeesList="orderFeesList"
  131. :disabled="$route.query.status == 1"
  132. feeUrl="/blade-purchase-sales/orderfees/update"
  133. />
  134. <upload-file
  135. ref="uploadFile"
  136. title="合同附件"
  137. :orderFilesList="orderFilesList"
  138. :disabled="$route.query.status == 1"
  139. delUrl="/blade-purchase-sales/orderfiles/update"
  140. />
  141. <div>
  142. <containerTitle title="银行信息"></containerTitle>
  143. <basic-container>
  144. <avue-form ref="form" v-model="form" :option="bankOption" />
  145. </basic-container>
  146. </div>
  147. <div>
  148. <containerTitle title="保险信息"></containerTitle>
  149. <basic-container>
  150. <avue-form ref="form" v-model="form" :option="insuranceOption" />
  151. </basic-container>
  152. </div>
  153. <div>
  154. <containerTitle title="唛头"></containerTitle>
  155. <basic-container>
  156. <avue-form ref="form" v-model="form" :option="markOption" />
  157. </basic-container>
  158. </div>
  159. </div>
  160. <el-dialog
  161. title="导入商品"
  162. append-to-body
  163. class="el-dialogDeep"
  164. :visible.sync="dialogVisible"
  165. width="60%"
  166. :close-on-click-modal="false"
  167. :destroy-on-close="true"
  168. :close-on-press-escape="false"
  169. @close="closeGoods"
  170. top="10vh"
  171. >
  172. <span>
  173. <el-row>
  174. <el-col :span="5">
  175. <div>
  176. <el-scrollbar>
  177. <basic-container style="margin-top:45px">
  178. <avue-tree :option="treeOption" @node-click="nodeClick" />
  179. </basic-container>
  180. </el-scrollbar>
  181. </div>
  182. </el-col>
  183. <el-col :span="19">
  184. <avue-crud
  185. :option="goodsOption"
  186. :table-loading="loading"
  187. :data="goodsList"
  188. ref="goodsCrud"
  189. @refresh-change="refreshChange"
  190. @selection-change="selectionChange"
  191. @row-click="rowClick"
  192. :page.sync="page"
  193. @on-load="onLoad"
  194. ></avue-crud>
  195. </el-col>
  196. </el-row>
  197. </span>
  198. <span slot="footer" class="dialog-footer">
  199. <el-button @click="dialogVisible = false">取 消</el-button>
  200. <el-button
  201. type="primary"
  202. @click="importGoods"
  203. :disabled="selectionList.length == 0"
  204. >导入</el-button
  205. >
  206. </span>
  207. </el-dialog>
  208. <report-dialog
  209. :switchDialog="switchDialog"
  210. :reportId="form.id"
  211. reportName="客户询价"
  212. @onClose="onClose()"
  213. ></report-dialog>
  214. </div>
  215. </template>
  216. <script>
  217. import tableOption from "./config/customerContact.json";
  218. import goodsOption from "./config/commodity.json";
  219. import feeInfo from "@/components/fee-info/main";
  220. import uploadFile from "@/components/upload-file/main";
  221. import {
  222. detail,
  223. submit,
  224. delItem,
  225. getDeptLazyTree,
  226. getGoods,
  227. deliverGoods,
  228. getPorts
  229. } from "@/api/basicData/salesContract";
  230. import _ from "lodash";
  231. import reportDialog from "@/components/report-dialog/main";
  232. import { isvalidatemobile, validatename } from "@/util/validate";
  233. export default {
  234. name: "detailsPageEdit",
  235. data() {
  236. const validatePhone = (rule, value, callback) => {
  237. if (value != "") {
  238. if (isvalidatemobile(value)[0]) {
  239. this.$message.error("手机号码格式不正确");
  240. callback(new Error(isvalidatemobile(value)[1]));
  241. } else {
  242. callback();
  243. }
  244. } else {
  245. callback();
  246. }
  247. };
  248. const validateName = (rule, value, callback) => {
  249. if (value != "") {
  250. if (validatename(value)) {
  251. this.$message.error("联系人格式不正确");
  252. callback(new Error(validatename(value)));
  253. } else {
  254. callback();
  255. }
  256. } else {
  257. callback();
  258. }
  259. };
  260. return {
  261. configuration: {
  262. multipleChoices: false,
  263. multiple: false,
  264. collapseTags: false,
  265. placeholder: "请点击右边按钮选择",
  266. dicData: []
  267. },
  268. switchDialog: false,
  269. form: {},
  270. disabled: false,
  271. dialogVisible: false,
  272. tableOption: tableOption,
  273. option: {
  274. menuBtn: false,
  275. labelWidth: 100,
  276. column: [
  277. {
  278. label: "系统号",
  279. prop: "sysNo",
  280. span: 8
  281. },
  282. {
  283. label: "订单状态",
  284. prop: "orderStatus",
  285. span: 8,
  286. type: "select",
  287. dicUrl: "/api/blade-system/dict-biz/dictionary?code=order_status",
  288. props: {
  289. label: "dictValue",
  290. value: "dictValue"
  291. }
  292. },
  293. {
  294. label: "客户名称",
  295. prop: "corpId",
  296. rules: [
  297. {
  298. required: true,
  299. message: "",
  300. trigger: "blur"
  301. }
  302. ],
  303. span: 8,
  304. slot: true
  305. },
  306. {
  307. label: "业务员",
  308. prop: "salesName",
  309. span: 8
  310. },
  311. {
  312. label: "提成标准",
  313. prop: "commissionRate",
  314. span: 8
  315. },
  316. {
  317. label: "联系人",
  318. prop: "corpAttn",
  319. span: 8,
  320. rules: [{ validator: validateName, trigger: "blur" }]
  321. },
  322. {
  323. label: "电话",
  324. prop: "corpTel",
  325. span: 8,
  326. rules: [{ validator: validatePhone, trigger: "blur" }]
  327. },
  328. {
  329. label: "起运港",
  330. prop: "portOfLoad",
  331. span: 8,
  332. type: "select",
  333. filterable: true,
  334. dicData: [],
  335. props: {
  336. label: "name",
  337. value: "name"
  338. }
  339. },
  340. {
  341. label: "目的港",
  342. prop: "portOfDestination",
  343. span: 8,
  344. type: "select",
  345. filterable: true,
  346. dicData: [],
  347. props: {
  348. label: "name",
  349. value: "name"
  350. }
  351. },
  352. {
  353. label: "运输方式",
  354. prop: "transport",
  355. span: 8,
  356. type: "select",
  357. dicUrl: "/api/blade-system/dict-biz/dictionary?code=mode_transport",
  358. props: {
  359. label: "dictValue",
  360. value: "dictValue"
  361. }
  362. },
  363. {
  364. label: "价格条款",
  365. prop: "priceTerms",
  366. span: 8,
  367. type: "select",
  368. dicUrl: "/api/blade-system/dict-biz/dictionary?code=pricing_terms",
  369. props: {
  370. label: "dictValue",
  371. value: "dictValue"
  372. }
  373. },
  374. {
  375. label: "条款说明",
  376. prop: "priceTermsDescription",
  377. span: 8
  378. },
  379. {
  380. label: "订单日期",
  381. prop: "businesDate",
  382. span: 8,
  383. type: "date",
  384. format: "yyyy-MM-dd",
  385. valueFormat: "yyyy-MM-dd 00:00:00"
  386. },
  387. {
  388. label: "有效日期",
  389. prop: "dateValidity",
  390. span: 8,
  391. type: "date",
  392. format: "yyyy-MM-dd",
  393. valueFormat: "yyyy-MM-dd 00:00:00"
  394. },
  395. {
  396. label: "收款方式",
  397. prop: "paymentType",
  398. span: 8,
  399. type: "select",
  400. dicUrl: "/api/blade-system/dict-biz/dictionary?code=payment_term",
  401. props: {
  402. label: "dictValue",
  403. value: "dictValue"
  404. }
  405. },
  406. {
  407. label: "收款说明",
  408. prop: "paymentTypeDescription",
  409. span: 8
  410. },
  411. {
  412. label: "币别",
  413. prop: "currency",
  414. span: 8,
  415. type: "select",
  416. dicUrl: "/api/blade-system/dict-biz/dictionary?code=currency",
  417. props: {
  418. label: "dictValue",
  419. value: "dictValue"
  420. }
  421. },
  422. {
  423. label: "汇率",
  424. prop: "exchangeRate",
  425. span: 8,
  426. slot: true
  427. },
  428. {
  429. label: "备注",
  430. prop: "orderRemark",
  431. type: "textarea",
  432. minRows: 2,
  433. span: 24
  434. }
  435. ]
  436. },
  437. treeOption: {
  438. nodeKey: "id",
  439. lazy: true,
  440. treeLoad: function(node, resolve) {
  441. const parentId = node.level === 0 ? 0 : node.data.id;
  442. getDeptLazyTree(parentId).then(res => {
  443. resolve(
  444. res.data.data.map(item => {
  445. return {
  446. ...item,
  447. leaf: !item.hasChildren
  448. };
  449. })
  450. );
  451. });
  452. },
  453. addBtn: false,
  454. menu: false,
  455. size: "small",
  456. props: {
  457. label: "title",
  458. value: "value",
  459. children: "children"
  460. }
  461. },
  462. bankOption: {
  463. menuBtn: false,
  464. labelWidth: 100,
  465. column: [
  466. {
  467. label: "外币银行",
  468. prop: "banks",
  469. span: 8
  470. },
  471. {
  472. label: "银行信息",
  473. prop: "banksAccountName",
  474. span: 16,
  475. type: "textarea",
  476. minRows: 2
  477. }
  478. ]
  479. },
  480. insuranceOption: {
  481. menuBtn: false,
  482. labelWidth: 100,
  483. column: [
  484. {
  485. label: "保险描述",
  486. prop: "insuranceRemarks",
  487. span: 24,
  488. type: "textarea",
  489. minRows: 2
  490. }
  491. ]
  492. },
  493. markOption: {
  494. menuBtn: false,
  495. labelWidth: 100,
  496. column: [
  497. {
  498. label: "唛头描述",
  499. prop: "marks",
  500. span: 24,
  501. type: "textarea",
  502. minRows: 2
  503. }
  504. ]
  505. },
  506. page: {
  507. pageSize: 10,
  508. currentPage: 1,
  509. total: 0
  510. },
  511. loading: false,
  512. goodsOption: goodsOption,
  513. data: [],
  514. goodsList: [],
  515. selectionList: [],
  516. treeDeptId: null,
  517. orderFeesList: [],
  518. orderFilesList: [],
  519. orderItemIds: []
  520. };
  521. },
  522. components: {
  523. reportDialog,
  524. feeInfo,
  525. uploadFile
  526. },
  527. created() {
  528. if (this.$route.query.id) {
  529. this.getDetail(JSON.parse(this.$route.query.id));
  530. }
  531. if (this.$route.query.status == 1) {
  532. this.option.disabled = true;
  533. this.bankOption.disabled = true;
  534. this.insuranceOption.disabled = true;
  535. this.markOption.disabled = true;
  536. }
  537. let _this = this;
  538. this.tableOption.column.forEach(e => {
  539. if (e.prop == "taxRate") {
  540. e.formatter = function(row) {
  541. return _this.textFormat(
  542. Number(row.taxRate ? row.taxRate : 0) / 100,
  543. "0.00%"
  544. );
  545. };
  546. }
  547. if (e.prop == "amount" || e.prop == "price") {
  548. e.formatter = function(row) {
  549. return _this.textFormat(
  550. Number(row.amount ? row.amount : 0),
  551. "#,##0.00"
  552. );
  553. };
  554. }
  555. });
  556. getPorts().then(res => {
  557. this.findObject(this.option.column, "portOfLoad").dicData = res.data;
  558. this.findObject(this.option.column, "portOfDestination").dicData =
  559. res.data;
  560. });
  561. },
  562. methods: {
  563. priceChange(row) {
  564. console.log(row);
  565. if (!row.price) {
  566. row.price = 0;
  567. } else {
  568. row.amount = _.multiply(row.price, row.orderQuantity).toFixed(2);
  569. }
  570. },
  571. quantityChange(row) {
  572. if (!row.orderQuantity) {
  573. row.orderQuantity = 0;
  574. } else {
  575. row.amount = _.multiply(row.price, row.orderQuantity).toFixed(2);
  576. }
  577. },
  578. rateChange(row) {
  579. console.log(row);
  580. if (row >= 100) {
  581. this.form.exchangeRate = 0;
  582. this.$message.error("汇率不能超过100%");
  583. }
  584. },
  585. rowSave(row) {
  586. console.log(row);
  587. this.$set(row, "$cellEdit", false);
  588. },
  589. rowDel(row, index) {
  590. this.$confirm("确定删除数据?", {
  591. confirmButtonText: "确定",
  592. cancelButtonText: "取消",
  593. type: "warning"
  594. }).then(() => {
  595. if (row.id) {
  596. delItem(row.id).then(res => {
  597. this.$message({
  598. type: "success",
  599. message: "删除成功!"
  600. });
  601. this.data.splice(index, 1);
  602. });
  603. } else {
  604. this.$message({
  605. type: "success",
  606. message: "删除成功!"
  607. });
  608. this.data.splice(index, 1);
  609. }
  610. });
  611. },
  612. importGoods() {
  613. this.selectionList.forEach(e => {
  614. this.data.push({
  615. itemId: e.id,
  616. code: e.code,
  617. cname: e.cname,
  618. priceCategory: e.goodsTypeName,
  619. itemUrl: e.url,
  620. itemProp: null,
  621. itemDescription: null,
  622. itemType: null,
  623. orderQuantity: 0,
  624. tradeTerms: null,
  625. price: 0,
  626. amount: 0,
  627. taxRate: 0,
  628. unit: e.unit,
  629. remarks: null,
  630. $cellEdit: true
  631. });
  632. });
  633. this.dialogVisible = false;
  634. },
  635. closeGoods() {
  636. this.selectionList = [];
  637. this.treeDeptId = "";
  638. },
  639. goodsSelectionChange(list) {
  640. this.orderItemIds = [];
  641. list.map(e => {
  642. this.orderItemIds.push(e.id);
  643. });
  644. console.log(this.orderItemIds);
  645. },
  646. selectionChange(list) {
  647. this.selectionList = list;
  648. },
  649. rowClick(row) {
  650. this.$refs.goodsCrud.toggleSelection([this.goodsList[row.$index]]);
  651. },
  652. nodeClick(data) {
  653. this.treeDeptId = data.id;
  654. this.page.currentPage = 1;
  655. this.onLoad(this.page);
  656. },
  657. //费用查询
  658. onLoad(page, params = {}) {
  659. this.loading = true;
  660. getGoods(page.currentPage, page.pageSize, this.treeDeptId).then(res => {
  661. const data = res.data.data;
  662. this.page.total = data.total;
  663. this.goodsList = data.records;
  664. this.loading = false;
  665. if (this.page.total) {
  666. this.goodsOption.height = window.innerHeight - 470;
  667. } else {
  668. this.goodsOption.height = window.innerHeight - 395;
  669. }
  670. });
  671. },
  672. //商品明细导入
  673. newDetails() {
  674. this.dialogVisible = !this.dialogVisible;
  675. },
  676. getDetail(id) {
  677. detail(id).then(res => {
  678. this.form = res.data.data;
  679. this.data = res.data.data.orderItemsList;
  680. this.orderFeesList = res.data.data.orderFeesList;
  681. this.orderFilesList = res.data.data.orderFilesList;
  682. this.configuration.dicData = this.form.corpName;
  683. });
  684. },
  685. //修改提交触发
  686. editCustomer() {
  687. this.$refs["form"].validate((valid, done) => {
  688. done();
  689. if (valid) {
  690. const orderFeesList = this.$refs.feeInfo.submitData();
  691. for (let i = 0; i < orderFeesList.length; i++) {
  692. if (orderFeesList[i].corpId == null) {
  693. return this.$message.error(`请输入第${i + 1}行的结算中心`);
  694. }
  695. if (orderFeesList[i].price == 0) {
  696. return this.$message.error(`请正确输入第${i + 1}行的价格`);
  697. }
  698. if (orderFeesList[i].quantity == 0) {
  699. return this.$message.error(`请正确输入第${i + 1}行的数量`);
  700. }
  701. }
  702. const orderFilesList = this.$refs.uploadFile.submitData();
  703. submit({
  704. ...this.form,
  705. orderItemsList: this.data,
  706. orderFeesList: orderFeesList,
  707. orderFilesList: orderFilesList
  708. }).then(res => {
  709. this.form = res.data.data;
  710. this.data = res.data.data.orderItemsList;
  711. this.orderFeesList = res.data.data.orderFeesList;
  712. this.orderFilesList = res.data.data.orderFilesList;
  713. this.$message.success(this.form.id ? "修改成功" : "提交成功");
  714. });
  715. } else {
  716. return false;
  717. }
  718. });
  719. },
  720. //返回列表
  721. backToList() {
  722. this.$router.$avueRouter.closeTag();
  723. this.$router.push({
  724. path: "/exportTrade/salesContract/index",
  725. query: {}
  726. });
  727. },
  728. openReport() {
  729. this.switchDialog = !this.switchDialog;
  730. },
  731. onClose(val) {
  732. this.switchDialog = val;
  733. },
  734. getInvoice() {
  735. const data = { id: this.form.id, orderItemIds: this.orderItemIds };
  736. deliverGoods(data).then(res => {
  737. if (res.data.code == 200) {
  738. this.$message.success("生成成功");
  739. if (data) {
  740. const data = res.data.data;
  741. data.orderItemsList.forEach(e => {
  742. e.actualQuantity = e.orderQuantity;
  743. delete e.id;
  744. delete e.version;
  745. delete e.status;
  746. delete e.createUser;
  747. delete e.createTime;
  748. delete e.updateUser;
  749. delete e.updateTime;
  750. delete e.isDeleted;
  751. });
  752. delete data.id;
  753. delete data.version;
  754. delete data.status;
  755. delete data.createUser;
  756. delete data.createTime;
  757. delete data.updateUser;
  758. delete data.updateTime;
  759. delete data.isDeleted;
  760. delete data.orderStatus;
  761. this.$router.push({
  762. path: "/exportInvoice_detailsPage",
  763. query: {
  764. pageType: "Generate",
  765. data: JSON.stringify(data)
  766. }
  767. });
  768. }
  769. }
  770. });
  771. }
  772. }
  773. };
  774. </script>
  775. <style lang="scss" scoped>
  776. .customer-head {
  777. position: fixed;
  778. top: 105px;
  779. width: 100%;
  780. margin-left: -10px;
  781. height: 62px;
  782. background: #ffffff;
  783. box-shadow: 0 4px 12px 0px rgba(232, 232, 235, 1);
  784. z-index: 999;
  785. }
  786. .customer-back {
  787. cursor: pointer;
  788. line-height: 62px;
  789. font-size: 16px;
  790. color: #323233;
  791. font-weight: 400;
  792. }
  793. .back-icon {
  794. line-height: 64px;
  795. font-size: 20px;
  796. margin-right: 8px;
  797. }
  798. .copy-customer-btn {
  799. position: fixed;
  800. right: 140px;
  801. top: 115px;
  802. }
  803. .add-customer-btn {
  804. position: fixed;
  805. right: 36px;
  806. top: 115px;
  807. }
  808. ::v-deep .el-form-item {
  809. margin-bottom: 8px;
  810. }
  811. ::v-deep .el-form-item__error {
  812. display: none;
  813. }
  814. ::v-deep .select-component {
  815. display: flex;
  816. }
  817. </style>