index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. <template>
  2. <div class="tenant">
  3. <div class="content">
  4. <byTable
  5. :source="sourceList.data"
  6. :pagination="sourceList.pagination"
  7. :config="config"
  8. :loading="loading"
  9. :selectConfig="selectConfig"
  10. highlight-current-row
  11. :action-list="[
  12. {
  13. text: '创建合同',
  14. action: () => newContract(),
  15. },
  16. ]"
  17. @get-list="getList">
  18. <template #code="{ item }">
  19. <div style="width: 100%">
  20. <a style="color: #409eff; cursor: pointer; word-break: break-all" @click="pushProcessApproval(item)">{{ item.code }}</a>
  21. </div>
  22. </template>
  23. <template #amount="{ item }">
  24. <div>
  25. <span style="padding-right: 4px">{{ item.currency }}</span>
  26. <span>{{ moneyFormat(item.amount, 2) }}</span>
  27. </div>
  28. </template>
  29. <template #sumClaimMoney="{ item }">
  30. <div>
  31. <span style="padding-right: 4px">{{ item.currency }}</span>
  32. <span>{{ moneyFormat(item.sumClaimMoney, 2) }}</span>
  33. </div>
  34. </template>
  35. <template #scale="{ item }">
  36. <div>
  37. {{ computeScale(item) }}
  38. </div>
  39. </template>
  40. <template #refundStatusNew="{ item }">
  41. <div>
  42. <span v-if="item.refundStatus && item.refundStatus !== 0">
  43. {{ dictValueLabel(item.refundStatus, refundStatusNew) }}
  44. </span>
  45. <span v-else>{{ dictValueLabel(item.refundStatusNew, refundStatusNew) }}</span>
  46. </div>
  47. </template>
  48. </byTable>
  49. </div>
  50. <el-dialog title="打印" v-if="openPrint" v-model="openPrint" width="860">
  51. <div id="printMe">
  52. <div id="pdfDom" style="width: 800px; padding: 16px; font-size: 12px !important">
  53. <div style="font-size: 18px; text-align: center">
  54. {{ printDetails.sellCorporationNameEn }}
  55. </div>
  56. <div style="text-align: center">
  57. {{ printDetails.sellCountryName }},{{ printDetails.sellProvinceName }},{{ printDetails.sellCityName }},{{ printDetails.sellDetailedAddress }}
  58. </div>
  59. <div style="font-size: 14px; color: #409eff; text-align: center; padding-top: 16px">PROFORMA INVOICE</div>
  60. <div style="padding-top: 8px">
  61. <div>PI NO. : {{ printDetails.contractCode }}</div>
  62. <div>PI DATE: {{ printDetails.createTimeEn }}</div>
  63. </div>
  64. <div style="border: 1px solid black; display: flex">
  65. <div style="width: 50%; border-right: 1px solid black">
  66. <div style="color: #409eff">VENDOR:</div>
  67. <div>{{ printDetails.sellCorporationNameEn }}</div>
  68. <div style="padding: 16px 0">
  69. {{ printDetails.sellCountryName }},{{ printDetails.sellProvinceName }},{{ printDetails.sellCityName }},{{ printDetails.sellDetailedAddress }}
  70. </div>
  71. <div>CONTACT: {{ printDetails.sellContactName }}</div>
  72. <div>TEL.: {{ printDetails.sellContactNumber }}</div>
  73. </div>
  74. <div style="width: 50%">
  75. <div style="color: #409eff">BUYER:</div>
  76. <div>{{ printDetails.buyCorporationName }}</div>
  77. <div style="padding: 16px 0">
  78. {{ printDetails.buyDetailedAddress }},{{ printDetails.buyCityName }},{{ printDetails.buyProvinceName }},{{ printDetails.buyCountryName }}
  79. </div>
  80. <div>CONTACT: {{ printDetails.buyContactName }}</div>
  81. <div>TEL.: {{ printDetails.buyContactNumber }}</div>
  82. </div>
  83. </div>
  84. <div style="height: 16px"></div>
  85. <div style="border: 1px solid black">
  86. <div style="display: flex; width: 100%">
  87. <div style="width: 33%; border-bottom: 1px solid black; border-right: 1px solid black">
  88. <div style="color: #409eff">COUNTRY OF ORIGIN:</div>
  89. <div>{{ printDetails.sellCountryName }}</div>
  90. </div>
  91. <div style="width: 34%; border-bottom: 1px solid black; border-right: 1px solid black">
  92. <div style="color: #409eff">COUNTRY OF DESTINATION:</div>
  93. <div>{{ printDetails.buyCountryName }}</div>
  94. </div>
  95. <div style="width: 33%; border-bottom: 1px solid black">
  96. <div style="color: #409eff">PLACE OF DISCHARGE:</div>
  97. <div>{{ printDetails.transportRemark }}</div>
  98. </div>
  99. </div>
  100. <div style="display: flex; width: 100%">
  101. <div style="width: 33%; border-bottom: 1px solid black; border-right: 1px solid black">
  102. <div style="color: #409eff">TERMS OF DELIVERY:</div>
  103. <div>
  104. {{ dictValueLabel(printDetails.tradeMethods, tradeMethods) }}
  105. </div>
  106. </div>
  107. <div style="width: 34%; border-bottom: 1px solid black; border-right: 1px solid black">
  108. <div style="color: #409eff">CURRENCY:</div>
  109. <div>
  110. {{ printDetails.currency }}
  111. </div>
  112. </div>
  113. <div style="width: 33%; border-bottom: 1px solid black">
  114. <div style="color: #409eff">EXPORT BY/VIA:</div>
  115. <div>
  116. {{ dictValueLabel(printDetails.transportMethod, shippingMethod) }}
  117. </div>
  118. </div>
  119. </div>
  120. <div style="display: flex; width: 100%">
  121. <div style="width: 33%; border-right: 1px solid black">
  122. <div style="color: #409eff">DELIVERY TIME:</div>
  123. <div>{{ printDetails.deliveryTime }}</div>
  124. </div>
  125. <div style="width: 67%">
  126. <div style="color: #409eff">TERMS OF PAYMENT:</div>
  127. <div>{{ printDetails.remark }}</div>
  128. </div>
  129. </div>
  130. </div>
  131. <div style="height: 16px"></div>
  132. <div class="baseRow" style="display: flex; color: #409eff">
  133. <div class="contentRow" style="width: 50px; text-align: center">NO.</div>
  134. <div class="contentRow" style="width: calc(100% - 450px); text-align: center">COMMODITY, SPECIFICATION</div>
  135. <div class="contentRow" style="width: 100px; text-align: center">UNIT</div>
  136. <div class="contentRow" style="width: 100px; text-align: center">QUANTITY</div>
  137. <div class="contentRow" style="width: 100px; text-align: center">UNIT PRICE</div>
  138. <div class="contentRow" style="width: 100px; text-align: center">TOTAL PRICE</div>
  139. </div>
  140. <div v-if="printDetails.productInfoList && printDetails.productInfoList.length > 0">
  141. <div class="baseRow" style="display: flex" v-for="(item, index) in printDetails.productInfoList" :key="item.productId">
  142. <div class="contentRow" style="width: 50px; text-align: center">
  143. {{ index + 1 }}
  144. </div>
  145. <div class="contentRow" style="width: calc(100% - 450px); text-align: center">
  146. {{ item.productName }}
  147. </div>
  148. <div class="contentRow" style="width: 100px; text-align: center">
  149. {{ dictValueLabel(item.productUnit, productUnit) }}
  150. </div>
  151. <div class="contentRow" style="width: 100px; text-align: center">
  152. {{ item.productQuantity }}
  153. </div>
  154. <div class="contentRow" style="width: 100px; text-align: center">
  155. {{ item.productPrice }}
  156. </div>
  157. <div class="contentRow" style="width: 100px; text-align: center">
  158. {{ item.amount }}
  159. </div>
  160. </div>
  161. </div>
  162. <div class="baseRow" style="display: flex; color: #409eff">
  163. <div class="contentRow" style="width: calc(100% - 400px); text-align: center">SUBTOTAL:</div>
  164. <div class="contentRow" style="width: 100px; text-align: center"></div>
  165. <div class="contentRow" style="width: 100px; text-align: center">
  166. {{ statistics("productQuantity", 0) }}
  167. </div>
  168. <div class="contentRow" style="width: 100px; text-align: center"></div>
  169. <div class="contentRow" style="width: 100px; text-align: center">
  170. {{ statistics("amount", 2) }}
  171. </div>
  172. </div>
  173. <!-- <div v-if="printDetails.quotationPayList && printDetails.quotationPayList.length > 0">
  174. <div class="baseRow" style="display: flex" v-for="(item, index) in printDetails.quotationPayList" :key="index">
  175. <div class="contentRow" style="width: calc(100% - 100px); text-align: right; color: #409eff">{{ item.payName }}:</div>
  176. <div class="contentRow" style="width: 100px; text-align: center">{{ item.amount }}</div>
  177. </div>
  178. </div> -->
  179. <div class="baseRow" style="display: flex">
  180. <div class="contentRow" style="width: calc(100% - 100px); text-align: right; color: #409eff">FREIGHT COST:</div>
  181. <div class="contentRow" style="width: 100px; text-align: center">
  182. {{ statisticsTwo("amount", 2) }}
  183. </div>
  184. </div>
  185. <div class="baseRow" style="display: flex">
  186. <div class="contentRow" style="width: calc(100% - 100px); text-align: right; color: #409eff">TOTAL PRICE:</div>
  187. <div class="contentRow" style="width: 100px; text-align: center">
  188. {{ printDetails.totalAmount }}
  189. </div>
  190. </div>
  191. <div class="baseRow" style="display: flex; border-bottom: 1px solid black">
  192. <div class="contentRow" style="width: 100%">
  193. {{ translateIntoEnglish(printDetails.totalAmount, printDetails.currency) }}
  194. </div>
  195. </div>
  196. <div style="height: 16px"></div>
  197. <div class="baseRow" style="color: #409eff">
  198. <div class="contentRow" style="width: 100%">ACCOUNT INFORMATION:</div>
  199. </div>
  200. <div class="baseRow" style="border-bottom: 1px solid black">
  201. <div class="contentRow" style="width: 100%">
  202. <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">
  203. Beneficiary Name: {{ printDetails.beneficiaryName }}
  204. </div>
  205. <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">
  206. Beneficiary Bank: {{ printDetails.beneficiaryBank }}
  207. </div>
  208. <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">
  209. Beneficiary Bank Address: {{ printDetails.beneficiaryBankAddress }}
  210. </div>
  211. <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">
  212. Beneficiary Account Number: {{ printDetails.beneficiaryAccountNumber }}
  213. </div>
  214. <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">Swift Code: {{ printDetails.swiftCode }}</div>
  215. <div style="line-height: 24px; padding-left: 4px; word-break: break-all; word-wrap: break-word">
  216. Beneficiary Address: {{ printDetails.beneficiaryAddress }}
  217. </div>
  218. </div>
  219. </div>
  220. <div style="height: 32px"></div>
  221. <div style="display: flex">
  222. <div style="width: 50%">
  223. <div style="color: #409eff">CONFIRMED BY VENDOR:</div>
  224. <div>{{ printDetails.sellCorporationNameEn }}</div>
  225. </div>
  226. <div style="width: 50%">
  227. <div style="color: #409eff">CONFIRMED BY BUYER:</div>
  228. <div>{{ printDetails.buyCorporationName }}</div>
  229. </div>
  230. </div>
  231. </div>
  232. </div>
  233. <template #footer>
  234. <el-button @click="openPrint = false" size="large">取消</el-button>
  235. <el-button v-print="printObj" size="large">打印</el-button>
  236. <el-button type="primary" @click="clickDownload()" size="large">下载PDF</el-button>
  237. </template>
  238. </el-dialog>
  239. </div>
  240. </template>
  241. <script setup>
  242. import { computed, ref } from "vue";
  243. import byTable from "@/components/byTable/index";
  244. import useUserStore from "@/store/modules/user";
  245. import { ElMessage, ElMessageBox } from "element-plus";
  246. const route = useRoute();
  247. const { proxy } = getCurrentInstance();
  248. const contractType = ref([]);
  249. const accountCurrency = ref([]);
  250. const tradeMethods = ref([]);
  251. const corporationList = ref([]);
  252. const customerList = ref([]);
  253. const shippingMethod = ref([]);
  254. const productUnit = ref([]);
  255. const userList = ref([]);
  256. const status = ref([
  257. {
  258. label: "草稿",
  259. value: 0,
  260. },
  261. {
  262. label: "审批中",
  263. value: 10,
  264. },
  265. {
  266. label: "驳回",
  267. value: 20,
  268. },
  269. {
  270. label: "审批通过",
  271. value: 30,
  272. },
  273. {
  274. label: "作废",
  275. value: 70,
  276. },
  277. {
  278. label: "终止",
  279. value: 99,
  280. },
  281. ]);
  282. const refundStatusNew = ref([
  283. {
  284. label: "未到款",
  285. value: 0,
  286. },
  287. {
  288. label: "部分到款",
  289. value: 10,
  290. },
  291. {
  292. label: "已到款",
  293. value: 20,
  294. },
  295. ]);
  296. const sourceList = ref({
  297. data: [],
  298. pagination: {
  299. total: 0,
  300. pageNum: 1,
  301. pageSize: 10,
  302. keyword: "",
  303. status: "",
  304. sellCorporationId: "",
  305. },
  306. });
  307. const loading = ref(false);
  308. const selectConfig = computed(() => {
  309. return [
  310. {
  311. label: "审批状态",
  312. prop: "status",
  313. data: status.value,
  314. },
  315. {
  316. label: "到款状态",
  317. prop: "refundStatusNew",
  318. data: refundStatusNew.value,
  319. },
  320. {
  321. label: "合同类型",
  322. prop: "contractType",
  323. data: contractType.value,
  324. },
  325. ];
  326. });
  327. const config = computed(() => {
  328. return [
  329. {
  330. attrs: {
  331. label: "归属公司",
  332. prop: "sellCorporationId",
  333. "min-width": 160,
  334. },
  335. render(type) {
  336. return proxy.dictValueLabel(type, corporationList.value);
  337. },
  338. },
  339. {
  340. attrs: {
  341. label: "合同类型",
  342. prop: "contractType",
  343. width: 120,
  344. },
  345. render(type) {
  346. return proxy.dictValueLabel(type, contractType.value);
  347. },
  348. },
  349. {
  350. attrs: {
  351. label: "合同编码",
  352. slot: "code",
  353. width: 180,
  354. },
  355. },
  356. {
  357. attrs: {
  358. label: "客户",
  359. prop: "buyCorporationId",
  360. "min-width": 180,
  361. },
  362. render(type) {
  363. return proxy.dictValueLabel(type, customerList.value);
  364. },
  365. },
  366. {
  367. attrs: {
  368. label: "版本号",
  369. prop: "version",
  370. width: 80,
  371. },
  372. },
  373. {
  374. attrs: {
  375. label: "合同金额",
  376. slot: "amount",
  377. width: 120,
  378. },
  379. },
  380. {
  381. attrs: {
  382. label: "已到账金额",
  383. slot: "sumClaimMoney",
  384. width: 120,
  385. },
  386. },
  387. {
  388. attrs: {
  389. label: "到账比例",
  390. slot: "scale",
  391. width: 100,
  392. },
  393. },
  394. {
  395. attrs: {
  396. label: "业务员",
  397. prop: "createUser",
  398. width: 140,
  399. },
  400. render(type) {
  401. return proxy.dictValueLabel(type, userList.value);
  402. },
  403. },
  404. {
  405. attrs: {
  406. label: "创建时间",
  407. prop: "createTime",
  408. width: 160,
  409. },
  410. },
  411. {
  412. attrs: {
  413. label: "审批状态",
  414. prop: "status",
  415. width: 120,
  416. },
  417. render(type) {
  418. return proxy.dictValueLabel(type, status.value);
  419. },
  420. },
  421. {
  422. attrs: {
  423. label: "到款状态",
  424. slot: "refundStatusNew",
  425. width: 120,
  426. },
  427. },
  428. {
  429. attrs: {
  430. label: "操作",
  431. width: "180",
  432. align: "center",
  433. fixed: "right",
  434. },
  435. renderHTML(row) {
  436. return [
  437. !row.refundStatus && row.refundStatusNew == 10
  438. ? {
  439. attrs: {
  440. label: "到款完成",
  441. type: "primary",
  442. text: true,
  443. },
  444. el: "button",
  445. click() {
  446. clickAccomplish(row);
  447. },
  448. }
  449. : {},
  450. row.status == 30
  451. ? {
  452. attrs: {
  453. label: "变更",
  454. type: "primary",
  455. text: true,
  456. },
  457. el: "button",
  458. click() {
  459. clickAlteration(row);
  460. },
  461. }
  462. : {},
  463. {
  464. attrs: {
  465. label: "打印",
  466. type: "primary",
  467. text: true,
  468. },
  469. el: "button",
  470. click() {
  471. clickPrint(row);
  472. },
  473. },
  474. {
  475. attrs: {
  476. label: "作废",
  477. type: "primary",
  478. text: true,
  479. },
  480. el: "button",
  481. click() {
  482. ElMessageBox.confirm("此操作将永久删除该数据, 是否继续?", "提示", {
  483. confirmButtonText: "确定",
  484. cancelButtonText: "取消",
  485. type: "warning",
  486. }).then(() => {
  487. proxy
  488. .post("/contract/edit", {
  489. id: row.id,
  490. status: 88,
  491. })
  492. .then(() => {
  493. ElMessage({
  494. message: "作废成功",
  495. type: "success",
  496. });
  497. getList();
  498. });
  499. });
  500. },
  501. },
  502. ];
  503. },
  504. },
  505. ];
  506. });
  507. const getDict = () => {
  508. proxy.getDictOne(["contract_type", "account_currency", "trade_mode", "shipping_method", "unit"]).then((res) => {
  509. if (res.contract_type && res.contract_type.length > 0) {
  510. contractType.value = res.contract_type.map((x) => ({
  511. label: x.dictValue,
  512. value: x.dictKey,
  513. }));
  514. }
  515. if (res.account_currency && res.account_currency.length > 0) {
  516. accountCurrency.value = res.account_currency.map((x) => ({
  517. label: x.dictValue,
  518. value: x.dictKey,
  519. }));
  520. }
  521. if (res.trade_mode && res.trade_mode.length > 0) {
  522. tradeMethods.value = res.trade_mode.map((x) => ({
  523. label: x.dictValue,
  524. value: x.dictKey,
  525. }));
  526. }
  527. if (res.shipping_method && res.shipping_method.length > 0) {
  528. shippingMethod.value = res.shipping_method.map((x) => ({
  529. label: x.dictValue,
  530. value: x.dictKey,
  531. }));
  532. }
  533. if (res.unit && res.unit.length > 0) {
  534. productUnit.value = res.unit.map((x) => ({
  535. label: x.dictValue,
  536. value: x.dictKey,
  537. }));
  538. }
  539. });
  540. proxy.post("/corporation/page", { pageNum: 1, pageSize: 999 }).then((res) => {
  541. corporationList.value = res.rows.map((item) => {
  542. return {
  543. ...item,
  544. label: item.name,
  545. value: item.id,
  546. };
  547. });
  548. });
  549. proxy.post("/customer/page", { pageNum: 1, pageSize: 999 }).then((res) => {
  550. customerList.value = res.rows.map((item) => {
  551. return {
  552. ...item,
  553. label: item.name,
  554. value: item.id,
  555. };
  556. });
  557. });
  558. proxy
  559. .get("/tenantUser/list", {
  560. pageNum: 1,
  561. pageSize: 10000,
  562. tenantId: useUserStore().user.tenantId,
  563. })
  564. .then((res) => {
  565. userList.value = res.rows.map((item) => {
  566. return {
  567. label: item.nickName,
  568. value: item.userId,
  569. };
  570. });
  571. });
  572. };
  573. const getList = async (req) => {
  574. sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
  575. loading.value = true;
  576. proxy.post("/contract/page", sourceList.value.pagination).then((res) => {
  577. sourceList.value.data = res.rows;
  578. sourceList.value.pagination.total = res.total;
  579. setTimeout(() => {
  580. loading.value = false;
  581. }, 200);
  582. });
  583. };
  584. getDict();
  585. if (route.query.code) {
  586. sourceList.value.pagination.keyword = route.query.code;
  587. }
  588. getList();
  589. const newContract = () => {
  590. proxy.$router.replace({
  591. path: "/platform_manage/process/processApproval",
  592. query: {
  593. flowKey: "contract_flow",
  594. flowName: "销售合同审批流程",
  595. random: proxy.random(),
  596. },
  597. });
  598. };
  599. const openPrint = ref(false);
  600. const printDetails = ref({});
  601. const clickPrint = (row) => {
  602. printDetails.value = {};
  603. openPrint.value = true;
  604. proxy.post("/contract/getContractPdfInfo", { id: row.id }).then((res) => {
  605. printDetails.value = res;
  606. });
  607. };
  608. const clickDownload = () => {
  609. proxy.getPdf("外销合同PDF文件");
  610. };
  611. const statistics = (label, index) => {
  612. let num = 0;
  613. if (printDetails.value.productInfoList && printDetails.value.productInfoList.length > 0) {
  614. printDetails.value.productInfoList.map((item) => {
  615. if (item[label]) {
  616. num = parseFloat(Number(num) + Number(item[label])).toFixed(index);
  617. }
  618. });
  619. }
  620. return num;
  621. };
  622. const statisticsTwo = (label, index) => {
  623. let num = 0;
  624. if (printDetails.value.contractProjectList && printDetails.value.contractProjectList.length > 0) {
  625. printDetails.value.contractProjectList.map((item) => {
  626. if (item[label]) {
  627. num = parseFloat(Number(num) + Number(item[label])).toFixed(index);
  628. }
  629. });
  630. }
  631. return num;
  632. };
  633. const computeScale = (item) => {
  634. let text = 0;
  635. if (item.sumClaimMoney && Number(item.sumClaimMoney) > 0 && item.amount && Number(item.amount) > 0) {
  636. text = parseFloat((Number(item.sumClaimMoney) / Number(item.amount)) * 100).toFixed(2);
  637. }
  638. return text + "%";
  639. };
  640. const clickAccomplish = (row) => {
  641. proxy.post("/contract/toTheAccount", { id: row.id }).then(() => {
  642. getList();
  643. });
  644. };
  645. const pushProcessApproval = (row) => {
  646. proxy.$router.push({
  647. path: "/platform_manage/process/processApproval",
  648. query: {
  649. flowKey: "contract_flow",
  650. id: row.flowId,
  651. processType: 20,
  652. random: proxy.random(),
  653. flowName: "销售合同详情",
  654. },
  655. });
  656. return;
  657. };
  658. const printObj = ref({
  659. id: "printMe",
  660. popTitle: "",
  661. extraCss: "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css, https://cdn.bootcdn.net/ajax/libs/hover.css/2.3.1/css/hover-min.css",
  662. extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
  663. });
  664. const clickAlteration = (row) => {
  665. proxy.$router.push({
  666. path: "/platform_manage/process/processApproval",
  667. query: {
  668. flowKey: "contract_update_flow",
  669. flowName: "销售合同变更流程",
  670. contractId: row.id,
  671. random: proxy.random(),
  672. },
  673. });
  674. };
  675. </script>
  676. <style lang="scss" scoped>
  677. .tenant {
  678. padding: 20px;
  679. }
  680. ::v-deep(.el-input-number .el-input__inner) {
  681. text-align: left;
  682. }
  683. .baseRow {
  684. min-height: 24px;
  685. border-top: 1px solid black;
  686. border-left: 1px solid black;
  687. }
  688. .contentRow {
  689. border-right: 1px solid black;
  690. line-height: 24px;
  691. padding-left: 4px;
  692. }
  693. </style>