{"ast":null,"code":"import { getBaiduNormal, getNetocr, savePayment } from \"@/api/common\";\nimport { obsConfig, xiangyunKey } from \"@/utils/secret.js\";\nimport { numToCny } from \"@/utils/utils.js\";\nexport default {\n name: 'InvoiceDecoder',\n components: {},\n data() {\n return {\n invoiceData: {},\n filePath: '',\n loading: false,\n recognitionStatus: '',\n // 'success', 'warning', 'error', ''\n recognitionMessage: '',\n templateDialogVisible: false // 控制样板弹窗的显示\n };\n },\n computed: {\n showRecognitionStatus() {\n return this.recognitionStatus !== '';\n },\n recognitionStatusType() {\n return this.recognitionStatus;\n },\n recognitionStatusIcon() {\n const iconMap = {\n success: 'el-icon-success',\n warning: 'el-icon-warning',\n error: 'el-icon-error'\n };\n return iconMap[this.recognitionStatus] || '';\n },\n recognitionStatusMessage() {\n return this.recognitionMessage;\n }\n },\n computed: {},\n mounted() {},\n methods: {\n netocr(file) {\n // 重置识别状态\n this.recognitionStatus = '';\n this.recognitionMessage = '';\n let formData = new FormData();\n formData.append(\"file\", file);\n formData.append(\"key\", xiangyunKey.key);\n formData.append(\"secret\", xiangyunKey.secret);\n formData.append(\"typeId\", 20090);\n formData.append(\"format\", 'json');\n return getNetocr(formData).then(res => {\n const {\n data\n } = res;\n if (data && data.length > 0 && data[0]?.invoice) {\n this.invoiceData = data[0].invoice;\n this.$message.success('发票识别成功');\n this.recognitionStatus = 'success';\n this.recognitionMessage = '发票识别成功,请核对识别结果';\n } else {\n this.$message.warning('发票识别结果不完整,请确保上传清晰的发票图片');\n this.invoiceData = {};\n this.recognitionStatus = 'warning';\n this.recognitionMessage = '发票识别结果不完整,请确保上传清晰的发票图片或尝试其他格式';\n }\n }).catch(err => {\n console.log(\"🚀 ~ getNetocr ~ err:\", err);\n this.$message.error('发票识别失败,请重试');\n this.invoiceData = {};\n this.recognitionStatus = 'error';\n this.recognitionMessage = '发票识别失败,请检查网络连接或重新上传';\n });\n },\n baiduNormal(base64) {\n const params = {\n // image: base64,\n pdf_file: base64,\n verify_parameter: false,\n probability: false,\n location: false\n };\n getBaiduNormal(params).then(res => {\n console.log(\"🚀 ~ main ~ res:\", res);\n }).catch(err => {\n console.log(\"🚀 ~ main ~ err:\", err);\n });\n },\n obsFile(file) {\n const domainId = localStorage.getItem(\"domainId\") || \"default\";\n const now = new Date();\n const y = now.getFullYear();\n const m = now.getMonth() + 1 < 10 ? '0' + (now.getMonth() + 1) : now.getMonth() + 1;\n const d = now.getDate() < 10 ? '0' + now.getDate() : now.getDate();\n const md = m + '-' + d;\n const objectKey = `uploads/${y}/${md}/${domainId}/${now.getTime()}/${file.name}`;\n let _this = this;\n\n // eslint-disable-next-line no-undef\n const obs = new ObsClient({\n access_key_id: obsConfig.ak,\n secret_access_key: obsConfig.sk,\n server: obsConfig.urlserver,\n timeout: 60 * 5\n });\n obs.putObject({\n Bucket: obsConfig.BucketName,\n Key: objectKey,\n SourceFile: file //获取file文件\n }).then(function (result) {\n if (result.CommonMsg.Status < 300) {\n const httpurl = `https://${obsConfig.BucketName}.${obsConfig.urlserver}/${objectKey}`;\n _this.filePath = httpurl;\n }\n });\n },\n upload(event) {\n // 获取当前选中的文件\n const file = event.target.files[0];\n if (!file) {\n return;\n }\n\n // 验证文件类型\n const allowedTypes = ['application/pdf', 'image/jpeg', 'image/jpg', 'image/png'];\n if (!allowedTypes.includes(file.type)) {\n this.$message.error('只支持PDF、JPG和PNG格式的文件');\n this.$refs.inputRef.value = '';\n return;\n }\n\n // 显示加载状态\n this.loading = true;\n this.$message.info('文件上传中,请稍候...');\n\n // 上传文件并识别\n this.obsFile(file);\n this.netocr(file).finally(() => {\n this.loading = false;\n this.$refs.inputRef.value = '';\n });\n },\n showTemplate() {\n // 显示样板弹窗\n this.templateDialogVisible = true;\n },\n handleCloseTemplateDialog(done) {\n // 处理弹窗关闭\n done();\n },\n downloadTemplateFile() {\n // 下载样板文件\n const link = document.createElement('a');\n link.href = '/templates/invoice_template.html';\n link.download = '发票样板.html';\n link.onerror = () => {\n this.$message.error('样板文件下载失败,请联系管理员');\n };\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n this.$message.success('样板文件下载中,请查看您的下载文件夹');\n },\n validateInvoiceData() {\n const requiredFields = {\n invoiceCode: '票据代码',\n checkCode: '校验码',\n receivingCode: '执收单位编码',\n receivingName: '执收单位名称',\n invoiceNumber: '票据号码',\n billingDate: '填制日期',\n payerName: '付款人全称',\n amountTax: '金额'\n };\n for (const [field, label] of Object.entries(requiredFields)) {\n if (!this.invoiceData[field]) {\n this.$message.error(`未能识别${label},请确保上传文件清晰完整`);\n return false;\n }\n }\n if (!this.invoiceData.invoiceLists || this.invoiceData.invoiceLists.length === 0) {\n this.$message.error('未能识别收入项目信息,请确保上传文件清晰完整');\n return false;\n }\n if (!this.invoiceData.paymentCode || this.invoiceData.paymentCode.length < 20) {\n this.$message.error('缴款码长度不足20位,请确保识别无误');\n return false;\n }\n return true;\n },\n onSave() {\n if (!this.filePath) {\n return this.$message.error('请先上传文件');\n }\n if (!this.validateInvoiceData()) {\n return;\n }\n const {\n paymentCode,\n receivingCode,\n invoiceCode,\n checkCode,\n receivingName,\n invoiceNumber,\n billingDate,\n payerName,\n payerBank,\n payerNumber,\n payeeName,\n payeeNumber,\n payeeBank,\n amountTaxCN,\n amountTax,\n invoiceLists,\n sealMark,\n remarks\n } = this.invoiceData;\n const params = {\n payment_code: paymentCode,\n collection_unit_code: receivingCode,\n bill_code: invoiceCode,\n verification_code: checkCode,\n collection_unit_name: receivingName,\n bill_number: invoiceNumber,\n fill_date: billingDate,\n payer_name: payerName,\n payer_bank: payerBank,\n payer_account: payerNumber,\n payee_name: payeeName,\n payee_account: payeeNumber,\n payee_bank: payeeBank,\n amount_words: amountTaxCN || numToCny(amountTax),\n amount_figures: this.formateAmout(amountTax),\n project_code: invoiceLists[0]?.commodityNo,\n project_name: invoiceLists[0]?.commodityName,\n number: this.formateAmout(invoiceLists[0]?.quantity),\n fee_standards: this.formateAmout(invoiceLists[0]?.standard),\n sum_price: this.formateAmout(invoiceLists[0]?.amount),\n collection_unit: '',\n operator_name: sealMark,\n remark: remarks,\n file: this.filePath\n };\n savePayment(params).then(res => {\n if (res.code == 1) {\n this.$message.success(res.msg);\n setTimeout(() => {\n window.open('about:blank', '_self').close();\n }, 3000);\n } else {\n this.$message.error(res.msg);\n }\n }).catch(err => {\n console.log(\"🚀 ~ savePayment ~ err:\", err);\n });\n },\n formateAmout(num) {\n return num.replace(/,/g, '');\n },\n back() {\n // // 调用全局挂载的方法,关闭当前页\n // this.$store.dispatch(\"tagsView/delView\", this.$route);\n // // 返回上一步路由\n // this.$router.go(-1);\n window.open('about:blank', '_self').close();\n }\n }\n};","map":{"version":3,"names":["getBaiduNormal","getNetocr","savePayment","obsConfig","xiangyunKey","numToCny","name","components","data","invoiceData","filePath","loading","recognitionStatus","recognitionMessage","templateDialogVisible","computed","showRecognitionStatus","recognitionStatusType","recognitionStatusIcon","iconMap","success","warning","error","recognitionStatusMessage","mounted","methods","netocr","file","formData","FormData","append","key","secret","then","res","length","invoice","$message","catch","err","console","log","baiduNormal","base64","params","pdf_file","verify_parameter","probability","location","obsFile","domainId","localStorage","getItem","now","Date","y","getFullYear","m","getMonth","d","getDate","md","objectKey","getTime","_this","obs","ObsClient","access_key_id","ak","secret_access_key","sk","server","urlserver","timeout","putObject","Bucket","BucketName","Key","SourceFile","result","CommonMsg","Status","httpurl","upload","event","target","files","allowedTypes","includes","type","$refs","inputRef","value","info","finally","showTemplate","handleCloseTemplateDialog","done","downloadTemplateFile","link","document","createElement","href","download","onerror","body","appendChild","click","removeChild","validateInvoiceData","requiredFields","invoiceCode","checkCode","receivingCode","receivingName","invoiceNumber","billingDate","payerName","amountTax","field","label","Object","entries","invoiceLists","paymentCode","onSave","payerBank","payerNumber","payeeName","payeeNumber","payeeBank","amountTaxCN","sealMark","remarks","payment_code","collection_unit_code","bill_code","verification_code","collection_unit_name","bill_number","fill_date","payer_name","payer_bank","payer_account","payee_name","payee_account","payee_bank","amount_words","amount_figures","formateAmout","project_code","commodityNo","project_name","commodityName","number","quantity","fee_standards","standard","sum_price","amount","collection_unit","operator_name","remark","code","msg","setTimeout","window","open","close","num","replace","back"],"sources":["src/views/invoiceDecoder/index.vue"],"sourcesContent":["\n \n\n \n\n "],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}