移动端
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 

519 satır
22 KiB

  1. <template>
  2. <div class="app-container">
  3. <van-nav-bar
  4. left-arrow
  5. fixed
  6. placeholder
  7. @click-left="$router.back(-1)"
  8. >
  9. <template #title>
  10. <p style="font-weight: bold;">查看银行卡转账申请</p>
  11. </template>
  12. <template #right>
  13. <van-icon name="../../../static/images/icon/icon_flow.png" size="20" @click="goFlow"/>
  14. </template>
  15. </van-nav-bar>
  16. <p class="main_title">基础信息</p>
  17. <div class="main_box">
  18. <van-field readonly label="申请时间" v-model="form.applyDate" input-align="right" />
  19. <van-field readonly label="资金支出类别" v-model="capitalExpenditureType" input-align="right" label-width="auto" />
  20. <van-field readonly label="支出总金额" v-model="form.expenditureAmount" input-align="right" label-width="auto"/>
  21. <van-field name="radio" label="审批模式" input-align="right" autocomplete="off" readonly>
  22. <template #input>
  23. <van-radio-group v-model="form.approvalMode" direction="horizontal">
  24. <van-radio name="1">线上审批</van-radio>
  25. <van-radio name="2">线下审批</van-radio>
  26. </van-radio-group>
  27. </template>
  28. </van-field>
  29. <van-field v-if="form.approvalMode==1" readonly label="审批流程" :value="tempalteFormat(form.approvalTemplateId)" input-align="right" label-width="auto"/>
  30. </div>
  31. <div class="main_box" style="margin-top: 10px;">
  32. <van-field readonly label="转账附言" v-model="form.remark" type="textarea" input-align="right" rows="3" label-width="auto"/>
  33. </div>
  34. <div class="main_box" style="margin-top: 10px;">
  35. <van-field readonly label="说明情况" v-model="form.explainSituation" type="textarea" input-align="right" rows="3" label-width="auto"/>
  36. </div>
  37. <p class="main_title">付款方信息</p>
  38. <div class="main_box">
  39. <van-field readonly label="付款方" v-model="form.payer" input-align="right" label-width="auto"/>
  40. <van-field readonly label="付款方账户" v-model="form.payerAccount" input-align="right" label-width="auto"/>
  41. <van-field readonly label="余额" v-model="form.balance" input-align="right" label-width="auto"/>
  42. </div>
  43. <div class="main_box" v-if="capitalExpenditureOpen" style="margin-bottom: 10px;margin-top: 10px;position:relative;">
  44. <van-field readonly label="项目名称" v-model="projectForm.projectName" input-align="right" />
  45. <van-field readonly label="承建单位" v-model="projectForm.projectContractor" input-align="right" label-width="auto"/>
  46. <van-field readonly label="合同价款(元)" v-model="projectForm.projectAmount" input-align="right" label-width="auto"/>
  47. <van-field readonly label="工程款类型" v-model="projectFundType" input-align="right" />
  48. <van-field readonly label="工程发票号" v-model="projectForm.projectBillNum" input-align="right" label-width="auto"/>
  49. </div>
  50. <div class="main_box" v-if="contractOpen" style="margin-bottom: 10px;margin-top: 10px;position:relative;">
  51. <van-field readonly label="合同名称" v-model="infoForm.name" input-align="right" />
  52. <van-field readonly label="合同编码" v-model="infoForm.code" input-align="right" label-width="auto"/>
  53. <van-field readonly label="合同价款(元)" v-model="infoForm.totalAmount" input-align="right" label-width="auto"/>
  54. </div>
  55. <p class="main_title">收款方信息</p>
  56. <div class="main_box" style="margin-bottom: 15px;">
  57. <van-field readonly label="收款账户类型" v-if="form.bankType==1" v-model="form.accountType == 1 ? '公户':'私户'" input-align="right" label-width="auto" />
  58. <van-field readonly label="行内转账" v-if="form.bankType==2||form.bankType==3||form.bankType==4" v-model="form.isPeers == 'Y' ? '是':'否'" input-align="right" label-width="auto" />
  59. </div>
  60. <div style="position:relative;" >
  61. <div class="main_box" style="margin-bottom: 10px;position:relative;" v-for="(item, index) in chargeItme" :key="index" v-if="index<listLength">
  62. <van-field readonly label="收款方" v-model="item.payee" input-align="right" />
  63. <van-field readonly label="收款账户" v-model="item.payeeAccount" input-align="right" label-width="auto"/>
  64. <van-field readonly label="开户银行" v-model="item.bankDeposit" input-align="right" label-width="auto"/>
  65. <van-field readonly label="收入金额" v-model="item.incomeAmount" input-align="right" label-width="auto"/>
  66. <van-field readonly label="所属银行" v-model="item.bankTypeText" input-align="right" />
  67. <van-field v-if="item.transferStatus=='成功'||item.transferStatus=='失败'" readonly label="转账状态" v-model="item.transferStatus" input-align="right" />
  68. <van-field v-if="item.transferStatus=='成功'||item.transferStatus=='失败'" readonly label="交易结果描述" v-model="item.causeFailure" type="textarea" input-align="right" rows="3" label-width="auto" />
  69. </div>
  70. <p class="main_more" v-if="chargeItme.length>1 && showbtn" @click="listLength = chargeItme.length,showbtn=false">查看更多</p>
  71. <p class="main_more" v-if="chargeItme.length>1 && !showbtn" @click="listLength = 1,showbtn=true">收起列表</p>
  72. </div>
  73. <p class="main_title">上传附件</p>
  74. <div class="main_box" style="padding: 5px 0 0 0;">
  75. <van-cell value="收据" />
  76. <van-uploader v-model="fileList1" v-if="fileList1==null||fileList1.length==0" :deletable="false" disabled :upload-text="'未上传附件'" style="margin-left:8px;"></van-uploader>
  77. <van-uploader v-model="fileList1" v-if="fileList1!=null&&fileList1.length>0" :deletable="false" @click-preview="previewPreview" :max-count="fileList1.length" style="margin-left:8px;">
  78. <template #preview-cover="file">
  79. <div class="preview-cover">
  80. <img src="../../../../assets/images/sunVillage_info/WORD.png" width="75" v-if="file.type == 'docx' || file.type == 'doc'"/>
  81. <img src="../../../../assets/images/sunVillage_info/ECEL.png" width="75" v-if="file.type == 'xlsx' || file.type == 'xls'" />
  82. <img src="../../../../assets/images/sunVillage_info/PDF.png" width="75" v-if="file.type == 'pdf'" />
  83. <img src="../../../../assets/images/sunVillage_info/PPT.png" width="75" v-if="file.type == 'ppt'" />
  84. <img src="../../../../assets/images/sunVillage_info/RAR.png" width="75" v-if="file.type == 'zip' || file.type == 'rar'" />
  85. </div>
  86. </template>
  87. </van-uploader>
  88. <van-cell value="发票" />
  89. <van-uploader v-model="fileList2" v-if="fileList2==null||fileList2.length==0" :deletable="false" disabled :upload-text="'未上传附件'" style="margin-left:8px;"></van-uploader>
  90. <van-uploader v-model="fileList2" v-if="fileList2!=null&&fileList2.length>0" :deletable="false" @click-preview="previewPreview" :max-count="fileList2.length" style="margin-left:8px;">
  91. <template #preview-cover="file">
  92. <div class="preview-cover">
  93. <img src="../../../../assets/images/sunVillage_info/WORD.png" width="75" v-if="file.type == 'docx' || file.type == 'doc'"/>
  94. <img src="../../../../assets/images/sunVillage_info/ECEL.png" width="75" v-if="file.type == 'xlsx' || file.type == 'xls'" />
  95. <img src="../../../../assets/images/sunVillage_info/PDF.png" width="75" v-if="file.type == 'pdf'" />
  96. <img src="../../../../assets/images/sunVillage_info/PPT.png" width="75" v-if="file.type == 'ppt'" />
  97. <img src="../../../../assets/images/sunVillage_info/RAR.png" width="75" v-if="file.type == 'zip' || file.type == 'rar'" />
  98. </div>
  99. </template>
  100. </van-uploader>
  101. <van-cell value="其他" />
  102. <van-uploader v-model="fileList3" v-if="fileList3==null||fileList3.length==0" :deletable="false" disabled :upload-text="'未上传附件'" style="margin-left:8px;"></van-uploader>
  103. <van-uploader v-model="fileList3" v-if="fileList3!=null&&fileList3.length>0" :deletable="false" @click-preview="previewPreview" :max-count="fileList3.length" style="margin-left:8px;" >
  104. <template #preview-cover="file">
  105. <div class="preview-cover">
  106. <img src="../../../../assets/images/sunVillage_info/WORD.png" width="75" v-if="file.type == 'docx' || file.type == 'doc'"/>
  107. <img src="../../../../assets/images/sunVillage_info/ECEL.png" width="75" v-if="file.type == 'xlsx' || file.type == 'xls'" />
  108. <img src="../../../../assets/images/sunVillage_info/PDF.png" width="75" v-if="file.type == 'pdf'" />
  109. <img src="../../../../assets/images/sunVillage_info/PPT.png" width="75" v-if="file.type == 'ppt'" />
  110. <img src="../../../../assets/images/sunVillage_info/RAR.png" width="75" v-if="file.type == 'zip' || file.type == 'rar'" />
  111. </div>
  112. </template>
  113. </van-uploader>
  114. </div>
  115. </div>
  116. </template>
  117. <script>
  118. import { getCashierAccount,getTransfer , queryTransferDetail , listPayee , updateTransfer , getProjectto , listProject , addProjectto , customSubmit,getInfoto,listTemplate} from "@/api/onlineHome/bankAgriculture/paymentApproval";
  119. import request from '@/utils/request'
  120. import {
  121. attachmentList,
  122. commonAttach,
  123. systemAttachment
  124. } from "../../../../api/onlineHome/bankAgriculture/paymentApproval";
  125. export default {
  126. name: "approvalDetail",
  127. data() {
  128. return {
  129. showcapital:false,
  130. showpayee:false,
  131. showlasj:false,
  132. showbankType:false,
  133. showproject:false,
  134. showFundType:false,
  135. showbtn:true,
  136. listLength:1,
  137. minDate: new Date(),
  138. maxDate: new Date(2025, 10, 1),
  139. currentDate: new Date(),
  140. form:{},
  141. fileList1:[],
  142. fileList2:[],
  143. fileList3:[],
  144. capitalExpenditureType:'',
  145. payee:'',
  146. bankType:'',
  147. wfydlxDictionaries:[],
  148. jglxDictionaries:[],
  149. sysDictionaries:[],
  150. capitalExpenditureTypeOptions:[],
  151. bankTypeDictionaries:[],
  152. projectList:[],
  153. projectFundTypeOptions:[],
  154. transferStatusOptions:[],
  155. projectFundTypeDictionaries:[],
  156. projectList:[],
  157. chargeItme:[],
  158. chargeItmeShow:[],
  159. payeeList:[],
  160. // 查询参数
  161. queryParams: {
  162. transferType:"",
  163. orderByColumn: "id",
  164. isAsc: "desc",
  165. },
  166. capitalExpenditureOpen:false,
  167. contractOpen:false,
  168. projectForm:{
  169. projectId:null,
  170. projectName:null,
  171. projectContractor:null,
  172. projectAmount:null,
  173. projectBillNum:null,
  174. projectFundType:'1',
  175. outId:null,
  176. ynType:'1'
  177. },
  178. infoForm:{
  179. infoId:null,
  180. name:null,
  181. code:null,
  182. totalAmount:null,
  183. contractionId:null,
  184. transferId:null
  185. },
  186. projectFundType:'',
  187. templateList:[],
  188. };
  189. },
  190. created() {
  191. this.getDicts("project_fund_type").then((response) => {
  192. for (var i = 0; i < response.data.length; i++) {
  193. this.projectFundTypeOptions.push({text: response.data[i].dictLabel, value: response.data[i].dictValue});
  194. }
  195. this.projectFundTypeDictionaries = response.data;
  196. });
  197. this.getDicts("transfer_status").then((response) => {
  198. this.transferStatusOptions = response.data;
  199. });
  200. this.getDictionaries();
  201. this.getFileList();
  202. this.getTemplateList();
  203. },
  204. methods: {
  205. getTemplateList(){
  206. let templateQueryParams = {
  207. // 分页
  208. pageNum: 1,
  209. pageSize: 999,
  210. };
  211. listTemplate(templateQueryParams).then(response => {
  212. this.templateList = response.rows;
  213. });
  214. },
  215. tempalteFormat(id){
  216. let name = ""
  217. this.templateList.map(res => {
  218. if(res.id==id){
  219. console.log(res.name)
  220. name = res.name
  221. }
  222. })
  223. return name
  224. },
  225. goFlow(){
  226. window.location='approvalProcess?id='+this.$route.query.id+'&auditbatchNo='+this.$route.query.auditbatchNo;
  227. },
  228. previewPreview(file, index, len) {
  229. const baseImgUrl = this.$store.getters.baseRoutingUrl;
  230. if (file.url) {
  231. //已上传文件
  232. let fileName = file.file.name || file.url;
  233. let subIndex = fileName.lastIndexOf(".");
  234. let ext = fileName.substring(subIndex + 1, fileName.length);
  235. let imgi = file.listIndex
  236. //console.log(ext)
  237. let allUrl = file.url;
  238. if(ext !== 'jpg' && ext !== 'png' && ext !== 'gif' && ext !== 'svg' && ext !== 'ico' && ext !== 'bmp'){
  239. const link = document.createElement("a");
  240. link.style.display = "none";
  241. link.target = "_blank"
  242. link.href = allUrl;
  243. document.body.appendChild(link);
  244. link.click();
  245. document.body.removeChild(link);
  246. }
  247. } else {
  248. //新上传文件
  249. let fileName = file.file.name;
  250. // console.info(file.file.name)
  251. let subIndex = fileName.lastIndexOf(".");
  252. let ext = fileName.substring(subIndex + 1, fileName.length);
  253. if(ext !== 'jpg' && ext !== 'png' && ext !== 'gif' && ext !== 'svg' && ext !== 'ico' && ext !== 'bmp'){
  254. let type = this.getfileType(ext);
  255. // 将文件转换为base64编码
  256. this.fileToBase64(file.file, ext).then(res => {
  257. this.downloadFile(res, fileName, ext, type);
  258. })
  259. }
  260. }
  261. },
  262. getfileType(type) {
  263. switch (type) {
  264. case 'txt':
  265. return 'text/plain';
  266. case 'doc':
  267. return 'application/msword';
  268. case 'docx':
  269. return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
  270. case 'xls':
  271. return 'application/vnd.ms-excel';
  272. case 'xlsx':
  273. return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
  274. case 'pdf':
  275. return 'application/pdf';
  276. case 'pptx':
  277. return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
  278. case 'png':
  279. return 'image/png';
  280. case 'jpg':
  281. return 'image/jpeg';
  282. case 'gif':
  283. return 'image/gif';
  284. case 'svg':
  285. return 'image/svg+xml';
  286. case 'ico':
  287. return 'image/x-icon';
  288. case 'bmp':
  289. return 'image/bmp,';
  290. }
  291. },
  292. downloadFile(base64, fileName, fileType, mimetype) {
  293. const typeHeader = 'data:application/' + fileType + ';base64,';
  294. const blob = this.base64ToBlob(base64, mimetype);
  295. this.downloadFileDownload(blob, fileName, fileType);
  296. },
  297. base64ToBlob(base64, mime) {
  298. //解码base64得到二进制字符串
  299. let raw = window.atob(base64.substring(base64.indexOf(',') + 1));
  300. let rawLength = raw.length
  301. //创建8位无符号整数值的类型化数组
  302. let uInt8Array = new Uint8Array(rawLength)
  303. for (let i = 0; i < rawLength; ++i) {
  304. uInt8Array[i] = raw.charCodeAt(i);
  305. }
  306. return new Blob([uInt8Array], {type: mime})
  307. },
  308. downloadFileDownload(blob, fileName, fileType) {
  309. const downloadElement = document.createElement('a');
  310. let href = blob;
  311. if (typeof blob === 'string') {
  312. downloadElement.target = '_blank'
  313. } else {
  314. href = window.URL.createObjectURL(blob)
  315. }
  316. downloadElement.href = href;
  317. downloadElement.download = fileName + '.' + fileType;//下载后文件名
  318. document.body.appendChild(downloadElement);
  319. downloadElement.click();
  320. document.body.removeChild(downloadElement)
  321. if (typeof blob !== 'string') {
  322. window.URL.revokeObjectURL(href)
  323. }
  324. },
  325. fileToBase64(file,fileType){
  326. return new Promise((resolve,reject)=>{
  327. //创建一个新的FileReader 对象
  328. const reader = new FileReader();
  329. //读取file对象
  330. reader.readAsDataURL(file);
  331. reader.onload=function () {
  332. const base64String = reader.result.split(",")[1];
  333. resolve('data:application/' + fileType + ';base64,'+base64String);
  334. }
  335. reader.onerror=function () {
  336. reject(new Error("Failed to load file") )
  337. }
  338. })
  339. },
  340. getDictionaries(){
  341. getTransfer(this.$route.query.id).then((response) => {
  342. getCashierAccount(response.data.cashierId).then(res => {
  343. this.form.balance = res.data.balance
  344. })
  345. this.getDicts("capital_expenditure_type").then((res) => {
  346. for (var i = 0; i < res.data.length; i++) {
  347. this.capitalExpenditureTypeOptions.push({text: res.data[i].dictLabel, value: res.data[i].dictValue});
  348. }
  349. this.capitalExpenditureType = this.selectDictLabel(res.data, response.data.capitalExpenditureType);
  350. });
  351. if(response.data.capitalExpenditureType==2){
  352. this.capitalExpenditureOpen = true
  353. let param={
  354. 'outId' : response.data.id,
  355. 'ynType' : '1'
  356. }
  357. getProjectto(param).then(res => {
  358. this.projectFundType = this.selectDictLabel(this.projectFundTypeDictionaries, res.data.projectFundType);
  359. this.projectForm = res.data
  360. })
  361. }else if(response.data.capitalExpenditureType==4) {
  362. this.contractOpen = true
  363. let param = {
  364. 'transferId': response.data.id
  365. }
  366. getInfoto(param).then(res => {
  367. this.infoForm = res.data
  368. })
  369. }else{
  370. this.showproject = false
  371. }
  372. this.form = response.data;
  373. });
  374. queryTransferDetail(this.$route.query.id).then((response) => {
  375. this.getDicts("bank_type_all").then(res => {
  376. for (var i = 0; i < res.data.length; i++) {
  377. this.bankTypeDictionaries.push({text: res.data[i].dictLabel, value: res.data[i].dictValue});
  378. }
  379. for (var j = 0 ; j < response.rows.length ; j++){
  380. response.rows[j].bankTypeText = this.selectDictLabel(res.data, response.rows[j].bankType);
  381. response.rows[j].transferStatus = this.selectDictLabel(this.transferStatusOptions, response.rows[j].transferStatus);
  382. }
  383. this.chargeItme = response.rows;
  384. });
  385. this.getPayeeList();
  386. });
  387. },
  388. getPayeeList() {
  389. //普通转账
  390. this.queryParams.accountType = this.form.accountType
  391. this.queryParams.status = "0"
  392. listPayee(this.queryParams).then((response) => {
  393. for (var i = 0; i < response.rows.length; i++) {
  394. this.payeeList.push({text: response.rows[i].payee, value: response.rows[i].id});
  395. }
  396. });
  397. },
  398. getFileList(){
  399. let oData1= {
  400. tableId: this.$route.query.id,
  401. tableName: "t_yinnong_transfer",
  402. bizPath: "transfer",
  403. fileType: "1",
  404. }
  405. attachmentList(oData1).then(res => {
  406. res.rows.map(r => {
  407. let baseUrl = location.protocol+"//"+location.host+request.defaults.baseURL
  408. let subIndex = r.fileName.lastIndexOf(".");
  409. let ext = r.fileName.substring(subIndex + 1, r.fileName.length);
  410. this.fileList1.push({"url": baseUrl + r.fileUrl, "file": new File([], r.fileName, {}), "id": r.id,"type":ext})
  411. })
  412. })
  413. let oData2= {
  414. tableId: this.$route.query.id,
  415. tableName: "t_yinnong_transfer",
  416. bizPath: "transfer",
  417. fileType: "2",
  418. }
  419. attachmentList(oData2).then(res => {
  420. res.rows.map(r => {
  421. let baseUrl = location.protocol+"//"+location.host+request.defaults.baseURL
  422. let subIndex = r.fileName.lastIndexOf(".");
  423. let ext = r.fileName.substring(subIndex + 1, r.fileName.length);
  424. this.fileList2.push({"url": baseUrl + r.fileUrl, "file": new File([], r.fileName, {}), "id": r.id,"type":ext})
  425. })
  426. })
  427. let oData3= {
  428. tableId: this.$route.query.id,
  429. tableName: "t_yinnong_transfer",
  430. bizPath: "transfer",
  431. fileType: "3",
  432. }
  433. attachmentList(oData3).then(res => {
  434. res.rows.map(r => {
  435. let baseUrl = location.protocol+"//"+location.host+request.defaults.baseURL
  436. let subIndex = r.fileName.lastIndexOf(".");
  437. let ext = r.fileName.substring(subIndex + 1, r.fileName.length);
  438. this.fileList3.push({"url": baseUrl + r.fileUrl, "file": new File([], r.fileName, {}), "id": r.id,"type":ext})
  439. })
  440. })
  441. },
  442. goBack(){
  443. window.history.go(-1)
  444. },
  445. //删除家庭成员
  446. deleteChargeItme(index){
  447. this.chargeItme.splice(index,1)
  448. },
  449. },
  450. }
  451. </script>
  452. <style scoped lang="scss">
  453. .app-container {
  454. padding: 2% 0;
  455. }
  456. .main_more{
  457. width: 96%;
  458. margin: 0 auto;
  459. margin-top: 10px;
  460. border-radius: 6px;
  461. box-shadow: 0px 3px 6px 0px rgba(0,0,0,0.16);
  462. overflow: hidden;
  463. background-color: #FFF;
  464. text-align: center;
  465. padding: 10PX 0;
  466. }
  467. .main_title{
  468. font-size: 0.4rem;
  469. color: #1D6FE9;
  470. margin: 0.2rem 6%;
  471. position: relative;
  472. }
  473. .main_box{
  474. width: 96%;
  475. margin: 0 auto;
  476. border-radius: 6px;
  477. box-shadow: 0px 3px 6px 0px rgba(0,0,0,0.16);
  478. overflow: hidden;
  479. background-color: #FFF;
  480. }
  481. .submitButton{
  482. width: 80%;
  483. margin: 0 auto;
  484. background-color: #1D6FE9;
  485. }
  486. .addFamily{
  487. position: absolute;
  488. top: -2px;
  489. right: 0;
  490. border-radius: 50%;
  491. }
  492. .deleteFamily{
  493. position: absolute;
  494. top: 0rem;
  495. right: 6%;
  496. z-index: 9;
  497. border-radius: 50%;
  498. }
  499. </style>