paymentPDF.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. <template>
  2. <div>
  3. <div id="pdfDom" style="font-family: 'msyh'">
  4. <div style="padding: 60px; font-size: 12px !important; color: black">
  5. <div style="font-size: 16px; text-align: center; padding: 8px">
  6. <span
  7. >采购付款(
  8. {{ dictValueLabel(printDetails.type, payMethod) }})</span
  9. >
  10. </div>
  11. <div style="padding: 8px 0">
  12. <span>创建时间: {{ printDetails.createTime }}</span>
  13. </div>
  14. <div style="border: 1px solid black">
  15. <div style="display: flex; border-bottom: 1px solid black">
  16. <div
  17. style="width: 80px; border-right: 1px solid black; padding: 8px"
  18. >
  19. 创建人
  20. </div>
  21. <div style="width: calc(100% - 80px); padding: 8px">
  22. {{ dictValueLabel(printDetails.createUser, userList) }}
  23. </div>
  24. </div>
  25. <div style="display: flex; border-bottom: 1px solid black">
  26. <div
  27. style="width: 80px; border-right: 1px solid black; padding: 8px"
  28. >
  29. 创建人部门
  30. </div>
  31. <div style="width: calc(100% - 80px); padding: 8px">
  32. {{ dictValueLabel(printDetails.deptId, deptList) }}
  33. </div>
  34. </div>
  35. <div style="display: flex; border-bottom: 1px solid black">
  36. <div
  37. style="
  38. width: 80px;
  39. border-right: 1px solid black;
  40. padding: 4px 8px;
  41. display: flex;
  42. align-items: center;
  43. "
  44. >
  45. 费用明细
  46. </div>
  47. <div style="width: calc(100% - 80px)">
  48. <div style="border-bottom: 1px solid black; display: flex">
  49. <div
  50. style="
  51. width: 120px;
  52. padding: 4px 8px;
  53. border-right: 1px solid black;
  54. text-align: center;
  55. "
  56. >
  57. 采购合同
  58. </div>
  59. <div
  60. style="
  61. width: calc(100% - 260px);
  62. padding: 4px 8px;
  63. border-right: 1px solid black;
  64. text-align: center;
  65. "
  66. >
  67. 款项说明
  68. </div>
  69. <div
  70. style="
  71. width: 60px;
  72. padding: 4px 8px;
  73. border-right: 1px solid black;
  74. text-align: center;
  75. "
  76. >
  77. 货币
  78. </div>
  79. <div style="width: 80px; padding: 4px 8px; text-align: center">
  80. 付款金额
  81. </div>
  82. </div>
  83. <template
  84. v-if="
  85. printDetails.payDetailVoList &&
  86. printDetails.payDetailVoList.length > 0
  87. "
  88. >
  89. <div
  90. v-for="(item, index) in printDetails.payDetailVoList"
  91. :key="index"
  92. >
  93. <div
  94. :style="
  95. index + 1 !== printDetails.payDetailVoList.length
  96. ? 'border-bottom: 1px solid black; display: flex'
  97. : ' display: flex'
  98. "
  99. >
  100. <div
  101. style="
  102. width: 120px;
  103. padding: 4px 8px;
  104. border-right: 1px solid black;
  105. display: flex;
  106. align-items: center;
  107. "
  108. >
  109. {{ item.purchaseCode }}
  110. </div>
  111. <div
  112. style="
  113. width: calc(100% - 260px);
  114. padding: 4px 8px;
  115. border-right: 1px solid black;
  116. display: flex;
  117. align-items: center;
  118. "
  119. >
  120. {{ item.remark }}
  121. </div>
  122. <div
  123. style="
  124. width: 60px;
  125. padding: 4px 8px;
  126. border-right: 1px solid black;
  127. display: flex;
  128. align-items: center;
  129. "
  130. >
  131. 人民币
  132. </div>
  133. <div
  134. style="
  135. width: 80px;
  136. padding: 4px 8px;
  137. display: flex;
  138. align-items: center;
  139. "
  140. >
  141. {{ item.money }}
  142. </div>
  143. </div>
  144. </div>
  145. </template>
  146. </div>
  147. </div>
  148. <div style="display: flex; border-bottom: 1px solid black">
  149. <div
  150. style="width: 80px; border-right: 1px solid black; padding: 8px"
  151. >
  152. 总报销金额
  153. </div>
  154. <div style="width: calc(100% - 80px); display: flex">
  155. <div
  156. style="
  157. width: calc(100% - 140px);
  158. padding: 8px;
  159. border-right: 1px solid black;
  160. "
  161. >
  162. {{ NumberToChinese(computeMoney()) }}
  163. </div>
  164. <div style="width: 140px; padding: 8px">{{ computeMoney() }}</div>
  165. </div>
  166. </div>
  167. <div style="display: flex; border-bottom: 1px solid black">
  168. <div
  169. style="width: 80px; border-right: 1px solid black; padding: 8px"
  170. >
  171. 单据数量
  172. </div>
  173. <div style="width: calc(100% - 80px); padding: 8px">
  174. {{ printDetails.receiptsNum }}
  175. </div>
  176. </div>
  177. <div style="display: flex; border-bottom: 1px solid black">
  178. <div
  179. style="
  180. width: 80px;
  181. border-right: 1px solid black;
  182. padding: 0 8px;
  183. display: flex;
  184. align-items: center;
  185. "
  186. >
  187. 收款信息
  188. </div>
  189. <div style="width: calc(100% - 80px)">
  190. <div style="border-bottom: 1px solid black; display: flex">
  191. <div
  192. style="
  193. width: 19%;
  194. padding: 0 8px;
  195. border-right: 1px solid black;
  196. text-align: center;
  197. "
  198. >
  199. 支付方式
  200. </div>
  201. <div
  202. style="
  203. width: 22%;
  204. padding: 0 8px;
  205. border-right: 1px solid black;
  206. text-align: center;
  207. "
  208. >
  209. 收款方户名
  210. </div>
  211. <div
  212. style="
  213. width: 20%;
  214. padding: 0 8px;
  215. border-right: 1px solid black;
  216. text-align: center;
  217. "
  218. >
  219. 开户行
  220. </div>
  221. <div style="width: 39%; padding: 0 8px; text-align: center">
  222. 收款方账号
  223. </div>
  224. </div>
  225. <div style="display: flex">
  226. <div
  227. style="
  228. width: 19%;
  229. padding: 0 8px;
  230. border-right: 1px solid black;
  231. display: flex;
  232. align-items: center;
  233. "
  234. >
  235. {{ dictValueLabel(printDetails.payType, fundsPaymentMethod) }}
  236. </div>
  237. <div
  238. style="
  239. width: 22%;
  240. padding: 0 8px;
  241. border-right: 1px solid black;
  242. display: flex;
  243. align-items: center;
  244. "
  245. >
  246. {{ printDetails.name }}
  247. </div>
  248. <div
  249. style="
  250. width: 20%;
  251. padding: 0 8px;
  252. border-right: 1px solid black;
  253. display: flex;
  254. align-items: center;
  255. "
  256. >
  257. {{ printDetails.openingBank }}
  258. </div>
  259. <div
  260. style="
  261. width: 39%;
  262. padding: 0 8px;
  263. display: flex;
  264. align-items: center;
  265. "
  266. >
  267. {{ printDetails.accountOpening }}
  268. </div>
  269. </div>
  270. </div>
  271. </div>
  272. <div style="display: flex; border-bottom: 1px solid black">
  273. <div
  274. style="width: 80px; border-right: 1px solid black; padding: 8px"
  275. >
  276. 电子发票(PDF/JPG)
  277. </div>
  278. <div style="width: calc(100% - 80px); padding: 8px">
  279. {{ printDetails.electronicInvoiceText }}
  280. </div>
  281. </div>
  282. <div style="display: flex">
  283. <div
  284. style="
  285. width: 80px;
  286. border-right: 1px solid black;
  287. padding: 4px 8px;
  288. display: flex;
  289. align-items: center;
  290. "
  291. >
  292. 审批流程
  293. </div>
  294. <div style="width: calc(100% - 80px)">
  295. <template
  296. v-if="
  297. printDetails.recordList && printDetails.recordList.length > 0
  298. "
  299. >
  300. <div
  301. v-for="(item, index) in printDetails.recordList"
  302. :key="index"
  303. >
  304. <div
  305. :style="
  306. index + 1 !== printDetails.recordList.length
  307. ? 'border-bottom: 1px solid black; padding: 4px 8px; display: flex'
  308. : 'padding: 4px 8px; display: flex'
  309. "
  310. >
  311. <div
  312. style="width: calc(100% - 120px); word-wrap: break-word"
  313. >
  314. <span>{{ item.nodeName }}: </span>
  315. <span style="padding-left: 4px">{{
  316. item.processedUser
  317. }}</span>
  318. <span style="padding-left: 4px"
  319. >{{ item.remark
  320. }}<span v-if="item.handleTypeName"
  321. >({{ item.handleTypeName }})</span
  322. ></span
  323. >
  324. </div>
  325. <div style="width: 120px">{{ item.processedDate }}</div>
  326. </div>
  327. </div>
  328. </template>
  329. </div>
  330. </div>
  331. </div>
  332. <div style="padding-top: 16px">
  333. <span>打印时间: {{ presentTime }}</span>
  334. <span style="padding-left: 32px"
  335. >打印人: {{ useUserStore().user.nickName }}</span
  336. >
  337. </div>
  338. </div>
  339. </div>
  340. </div>
  341. </template>
  342. <script setup>
  343. import useUserStore from "@/store/modules/user";
  344. import moment from "moment";
  345. import { NumberToChinese } from "@/utils/util.js";
  346. const { proxy } = getCurrentInstance();
  347. const fundsPaymentMethod = ref([]);
  348. const payMethod = ref([]);
  349. const userList = ref([]);
  350. const deptList = ref([]);
  351. const getDict = () => {
  352. proxy.getDictOne(["funds_payment_method", "pay_method"]).then((res) => {
  353. fundsPaymentMethod.value = res["funds_payment_method"].map((x) => ({
  354. label: x.dictValue,
  355. value: x.dictKey,
  356. }));
  357. payMethod.value = res["pay_method"].map((x) => ({
  358. label: x.dictValue,
  359. value: x.dictKey,
  360. }));
  361. });
  362. proxy
  363. .get("/tenantUser/list", {
  364. pageNum: 1,
  365. pageSize: 10000,
  366. tenantId: useUserStore().user.tenantId,
  367. })
  368. .then((res) => {
  369. if (res.rows && res.rows.length > 0) {
  370. userList.value = res.rows.map((item) => {
  371. return {
  372. deptId: item.deptId,
  373. label: item.nickName,
  374. value: item.userId,
  375. };
  376. });
  377. }
  378. });
  379. proxy
  380. .get("/tenantDept/list", {
  381. pageNum: 1,
  382. pageSize: 999,
  383. tenantId: useUserStore().user.tenantId,
  384. })
  385. .then((res) => {
  386. if (res.data && res.data.length > 0) {
  387. deptList.value = res.data.map((item) => {
  388. return {
  389. label: item.deptName,
  390. value: item.deptId,
  391. };
  392. });
  393. }
  394. });
  395. };
  396. getDict();
  397. const printDetails = ref({});
  398. const presentTime = ref(moment().format("yyyy-MM-DD HH:mm:ss"));
  399. const computeMoney = () => {
  400. let money = 0;
  401. if (
  402. printDetails.value.payDetailVoList &&
  403. printDetails.value.payDetailVoList.length > 0
  404. ) {
  405. for (let i = 0; i < printDetails.value.payDetailVoList.length; i++) {
  406. if (printDetails.value.payDetailVoList[i].money) {
  407. money = Number(
  408. parseFloat(
  409. Number(money) + Number(printDetails.value.payDetailVoList[i].money)
  410. ).toFixed(2)
  411. );
  412. }
  413. }
  414. }
  415. return money;
  416. };
  417. const props = defineProps({
  418. rowData: Object,
  419. });
  420. onMounted(() => {
  421. if (props.rowData && props.rowData.id) {
  422. proxy.post("/pay/detail", { id: props.rowData.id }).then((res) => {
  423. printDetails.value = res;
  424. if (printDetails.value.createUser) {
  425. let data = userList.value.filter(
  426. (item) => item.value == printDetails.value.createUser
  427. );
  428. if (data && data.length > 0) {
  429. printDetails.value.deptId = data[0].deptId;
  430. }
  431. }
  432. proxy
  433. .post("/fileInfo/getList", { businessIdList: [props.rowData.id] })
  434. .then((resFile) => {
  435. let electronicInvoiceText = "";
  436. if (
  437. resFile[props.rowData.id] &&
  438. resFile[props.rowData.id].length > 0
  439. ) {
  440. for (let i = 0; i < resFile[props.rowData.id].length; i++) {
  441. if (i === 0) {
  442. electronicInvoiceText = resFile[props.rowData.id][0].fileName;
  443. } else {
  444. electronicInvoiceText =
  445. electronicInvoiceText +
  446. ", " +
  447. resFile[props.rowData.id][i].fileName;
  448. }
  449. }
  450. }
  451. printDetails.value.electronicInvoiceText = electronicInvoiceText;
  452. });
  453. if (res.flowExampleId) {
  454. proxy
  455. .post("/flowExample/getApprovalRecord", { id: res.flowExampleId })
  456. .then((record) => {
  457. printDetails.value.recordList = record.recordList;
  458. });
  459. }
  460. });
  461. }
  462. });
  463. </script>
  464. <style lang="scss" scoped></style>