From 4c04dff48ea7fdffb700c04ce867377f9ba99fd0 Mon Sep 17 00:00:00 2001 From: ylj20011123 Date: Mon, 13 Oct 2025 19:50:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E7=A5=A8=E4=BF=A1=E6=81=AF=20?= =?UTF-8?q?=E7=94=A8=E8=87=AA=E5=B7=B1=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/DigitalElectronics/index.tsx | 1214 +++++++++++++++-------- src/pages/DigitalElectronics/service.ts | 62 +- src/pages/InvoiceSearch/index.tsx | 2 +- src/pages/Invoicing/index.tsx | 4 +- src/utils/crypto-js.js | 158 +++ src/utils/handleAes.js | 48 + src/utils/requestOld.ts | 2 +- 7 files changed, 1073 insertions(+), 417 deletions(-) create mode 100644 src/utils/crypto-js.js create mode 100644 src/utils/handleAes.js diff --git a/src/pages/DigitalElectronics/index.tsx b/src/pages/DigitalElectronics/index.tsx index f23fcb2..2a86a3a 100644 --- a/src/pages/DigitalElectronics/index.tsx +++ b/src/pages/DigitalElectronics/index.tsx @@ -1,11 +1,13 @@ // 数电的开票 import ProTable, { ActionType } from "@ant-design/pro-table"; -import { FormInstance, Button, message, Tag, Popconfirm } from "antd"; -import { useRef, useState } from "react"; +import { FormInstance, Button, message, Tag, Popconfirm, Modal } from "antd"; +import { useEffect, useRef, useState } from "react"; import { connect } from "umi"; import { Datum } from "@/types/invoice"; -import { handleGetAppToken, handleGetKaiPiao, handleGetSDToken, handleSynchroBILLInterface } from "./service"; +import { handleGetAppToken, handleGetBILLDETAILList, handleGetBILLList, handleGetInvoiceSearch, handleGetKaiPiao, handleGetPassportInfoById, handleGetSDToken, handleSynchroAPPLYAPPROVE, handleSynchroBILLInterface } from "./service"; import moment from "moment"; +import { encryptAES } from "@/utils/handleAes"; +import { ProForm, ProFormSelect, ProFormTextArea } from "@ant-design/pro-components"; interface ConnectState { user: { @@ -16,12 +18,315 @@ interface ConnectState { const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { const actionRef = useRef(); const formRef = useRef(); - + const modalFormRef = useRef(); + // 当前用户信息 + const [currentUser, setCurrentUser] = useState(); // 第一个接口的token const [appToken, setAppToken] = useState() - // 第二个接口的token + // 第二个接口的token const [accessToken, setAccessToken] = useState() + // 红冲原因的悬浮框 + const [showModal, setShowModal] = useState(false) + // 当前选择的票据信息 + const [currentRow, setCurrentRow] = useState() + const columns: any = [ + { + title: '服务区名称', + dataIndex: 'SERVERPART_NAME', + width: 150, + align: 'center', + ellipsis: true, + hideInSearch: true, + }, + { + title: '商户名称', + dataIndex: 'MERCHANTS_NAME', + width: 250, + align: 'center', + ellipsis: true, + hideInSearch: true, + }, + { + title: '票据编号', + dataIndex: 'BILL_NO', + width: 180, + align: 'center', + ellipsis: true, + hideInSearch: true, + }, + { + title: '流水号', + dataIndex: 'SERIAL_NO', + width: 180, + align: 'center', + ellipsis: true, + hideInSearch: true, + }, + { + title: '含税标识', + dataIndex: 'ACCOUNTED_TYPE', + width: 100, + align: 'center', + hideInSearch: true, + render: (text: number) => ( + + {text === 1 ? '含税' : '不含税'} + + ), + }, + { + title:
含税费用金额
, + dataIndex: 'INVOICE_TAXAMOUNT', + width: 120, + valueType: 'digit', + align: 'right', + ellipsis: true, + hideInSearch: true, + }, + { + title: '开票人', + dataIndex: 'BILL_PERSON', + width: 120, + align: 'center', + ellipsis: true, + hideInSearch: true, + }, + { + title: '开票日期', + dataIndex: 'BILL_DATE', + width: 120, + align: 'center', + ellipsis: true, + hideInSearch: true, + }, + { + title: '开户银行', + dataIndex: 'BANK_NAME', + width: 200, + align: 'center', + ellipsis: true, + hideInSearch: true, + }, + { + title: '银行账号', + dataIndex: 'BANK_ACCOUNT', + width: 200, + align: 'center', + ellipsis: true, + hideInSearch: true, + }, + { + title: '票据状态', + dataIndex: 'BILL_STATE', + width: 120, + align: 'center', + hideInSearch: true, + valueType: 'select', + fieldProps: { + options: [{ label: "填写中", value: 1000 }, { label: "待审核", value: 2000 }, { label: "开票中", value: 9000 }, { label: "已开票", value: 9200 }] + } + // 申请填写 1000 2000 待审核 9000 开票中 9200 已开票 + }, + { + title: '操作', + dataIndex: 'action', + width: 200, + fixed: 'right', + align: 'center', + hideInSearch: true, + render: (text: any, record: Datum) => ( + record?.BILL_STATE === 2000 ? +
+ { + handleInvoice(record) + handleSynchroAPPLYAPPROVEFun(1, record) + } + } + onCancel={() => { }} + okText="确认" + cancelText="取消" + > + + + { + // handleInvoice(record) + handleReturnInvoice(record) + handleSynchroAPPLYAPPROVEFun(2, record) + } + } + onCancel={() => { }} + okText="确认" + cancelText="取消" + > + + +
+ : record?.BILL_STATE === 9200 ? +
+ { + setCurrentRow(record) + setShowModal(true) + }} + onCancel={() => { }} + okText="确认" + cancelText="取消" + > + + +
+ : "" + ), + }, + ] + + + // 红冲发票 + const handleRedGoBill = async (record?: any) => { + + // 拿到表单数据 + const formData: any = modalFormRef.current?.getFieldsValue() + console.log('formData', formData); + + console.log('recordrecord', record); + // 拿个票据明细 + const billDetail = await handleGetBILLDETAILList({ + SearchParameter: { + BILL_ID: record?.BILL_ID + }, + PageIndex: 1, + PageSize: 999999, + SortStr: "BILLDETAIL_ID" + }) + + console.log('billDetailbillDetailbillDetailbillDetail', billDetail); + + // 调用金票云那里的列表接口 + // 构造查询数据 + const queryData = { + sellerTaxpayerId: "91530112MA7MQ2JR9U", + serialNo: record?.BILL_NO, + }; + + // 将data字段进行base64加密 + const dataStringOld = JSON.stringify(queryData); + const encryptedDataOld = btoa(unescape(encodeURIComponent(dataStringOld))); + + // 构造最终请求参数 + const requestParams = { + businessSystemCode: "BUSINESS_YCIC", + interfaceCode: "BILL.INVOICE.QUERY", + requestId: Date.now().toString(), + data: encryptedDataOld + }; + + console.log('最终请求参数:', requestParams); + + // 调用查询接口 (这里需要传入正确的code参数) + const responseOld = await handleGetInvoiceSearch(requestParams, accessToken); + console.log('responseresponseresponseresponse', responseOld); + let result: any = [] + if (responseOld && responseOld.success) { + let res = JSON.parse(decodeURIComponent(escape(atob(responseOld.data)))) + result = res[0].invoiceList + } else { + return + } + + console.log('最终请求结果:', result); + + + + let billDetailReq: any = [] + if (billDetail && billDetail.length > 0) { + billDetail.forEach((item: any) => { + billDetailReq.push({ + amount: -item.INVOICE_AMOUNT, // 明细金额 + detailId: item.BILLDETAIL_ID, // 业务系统明细id + goodsName: item.ITEM_NAME,// 商品名称 + lineProperty: 2, // 行性质 + price: item.INVOICE_PRICE,// 单价 + quantity: -item.INVOICE_COUNT,// 数量 + revenueCode: item.TABLE_NAME,// 税收分类编码 + taxRate: (item.DUTY_PARAGRAPH / 100).toFixed(2),// 税率 + units: item.ITEM_UNIT,// 计量单位 + + }) + }) + } + + let obj: any = { + billNo: record?.BILL_NO ? `HC-${record?.BILL_NO}` : "", // 单据编号 + billDate: moment(record?.BILL_DATE).format('YYYY-MM-DD'), // 单据日期 + totalAmount: -record?.INVOICE_TAXAMOUNT, // 单据金额 + includeTaxFlag: record?.ACCOUNTED_TYPE,// 判断是否含税 + autoInvoice: "1",// 自动开票标记 + invoiceProperty: "1", + invoiceType: record?.BILL_TYPE == 1000 ? '08xdp' : record?.BILL_TYPE == 2000 ? '10xdp' : '', //发票种类 + buyerTaxpayerId: record?.TAXPAYER_IDENTIFYCODE,// 购方税号 + buyerName: record?.MERCHANTS_NAME, // 购买方名称 + buyerProperty: "0", // 购买方性质 0-企业,1-个人,2-非企业单位 + sellerTaxpayerId: "91530112MA7MQ2JR9U", // 销方税号 写死 + sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", // 销方名称 写死 + sellerBankAndAccount: "13710884704", // 销方银行和账号 写死 + sellerAddressAndTel: "", // 销方地址和电话 写死 应该可以不传 + drawer: record?.BILL_PERSON,// 开票人 + buyerRecipientPhone: record?.RECEIVE_PHONENUMBER,// 购方收票手机号 + buyerRecipientMail: record?.RECEIVE_EMAIL,// 购方收件邮箱 + + redReason: formData?.redReasonSelect || "", + autoMerge: "0", + // blueinvoiceNo: '23249322851717775360', + blueinvoiceNo: result[0].originalInvoiceNumber, + // originalIssueTime: record?.originalIssueTime, + // blueInvoiceType: record?.blueInvoiceType, + blueinvoiceCode: "", + billDetail: billDetailReq + } + + + // 构造原始数据 + const originalData = [obj]; // 将record作为data数组的一项 + // 将data字段进行base64加密 + const dataString = JSON.stringify(originalData); + const encryptedData = btoa(unescape(encodeURIComponent(dataString))); // base64编码,支持中文 + // 构造开票请求数据 + const invoiceData = { + businessSystemCode: "BUSINESS_YCIC", // 来源系统编码 + interfaceCode: "BILL.PUSH", // 接口业务编码 + requestId: Date.now().toString(), // 时间戳作为请求ID + data: encryptedData // 加密后的data字符串 + }; + console.log('加密前的请求参数:', { + businessSystemCode: "BUSINESS_YCIC", // 来源系统编码 + interfaceCode: "BILL.PUSH", // 接口业务编码 + requestId: Date.now().toString(), // 时间戳作为请求ID + data: obj // 加密后的data字符串 + }); + console.log('原始数据:', originalData); + console.log('JSON字符串:', dataString); + console.log('Base64加密后:', encryptedData); + console.log('最终请求数据:', invoiceData); + console.log('访问令牌:', accessToken); + const response = await handleGetKaiPiao(invoiceData, accessToken); + console.log('开票响应:', response); + + setShowModal(false) + setCurrentRow(null) + if (response.success) { + message.success('红冲成功!') + } else { + message.error(response.message) + } + } // 开票处理函数 const handleInvoice = async (record: Datum) => { try { @@ -33,42 +338,74 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { return; } + console.log('recordrecord', record); + // 拿个票据明细 + const billDetail = await handleGetBILLDETAILList({ + SearchParameter: { + BILL_ID: record?.BILL_ID + }, + PageIndex: 1, + PageSize: 999999, + SortStr: "BILLDETAIL_ID" + }) + + console.log('billDetailbillDetailbillDetailbillDetail', billDetail); + + + let billDetailReq: any = [] + if (billDetail && billDetail.length > 0) { + billDetail.forEach((item: any) => { + billDetailReq.push({ + amount: item.INVOICE_AMOUNT, // 明细金额 + detailId: item.BILLDETAIL_ID, // 业务系统明细id + goodsName: item.ITEM_NAME,// 商品名称 + lineProperty: 2, // 行性质 + price: item.INVOICE_PRICE,// 单价 + quantity: item.INVOICE_COUNT,// 数量 + revenueCode: item.TABLE_NAME,// 税收分类编码 + taxRate: (item.DUTY_PARAGRAPH / 100).toFixed(2),// 税率 + units: item.ITEM_UNIT,// 计量单位 + + }) + }) + } let obj: any = { - billNo: record?.billNo, // 单据编号 - billDate: record?.billDate, // 单据日期 - totalAmount: record?.totalAmount, // 单据金额 - includeTaxFlag: "1",// 判断是否含税 + billNo: record?.BILL_NO, // 单据编号 + billDate: moment(record?.BILL_DATE).format('YYYY-MM-DD'), // 单据日期 + totalAmount: record?.INVOICE_TAXAMOUNT, // 单据金额 + includeTaxFlag: record?.ACCOUNTED_TYPE,// 判断是否含税 autoInvoice: "1",// 自动开票标记 - invoiceType: record?.invoiceType, //发票种类 - buyerTaxpayerId: record?.buyerTaxpayerId,// 购方税号 - buyerName: record?.buyerName, // 购买方名称 - buyerProperty: record?.buyerProperty || "0", // 购买方性质 0-企业,1-个人,2-非企业单位 + invoiceType: record?.BILL_TYPE == 1000 ? '08xdp' : record?.BILL_TYPE == 2000 ? '10xdp' : '', //发票种类 + + buyerTaxpayerId: record?.TAXPAYER_IDENTIFYCODE,// 购方税号 + buyerName: record?.MERCHANTS_NAME, // 购买方名称 + buyerProperty: "0", // 购买方性质 0-企业,1-个人,2-非企业单位 + sellerTaxpayerId: "91530112MA7MQ2JR9U", // 销方税号 写死 sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", // 销方名称 写死 sellerBankAndAccount: "13710884704", // 销方银行和账号 写死 sellerAddressAndTel: "", // 销方地址和电话 写死 应该可以不传 - drawer: record?.drawer,// 开票人 - buyerRecipientPhone: record?.buyerRecipientPhone || "",// 购方收票手机号 - buyerRecipientMail: record?.buyerRecipientMail || "",// 购方收件邮箱 - redReason: record?.redReason, - blueinvoiceNo: record?.blueinvoiceNo, - originalIssueTime: record?.originalIssueTime, - blueInvoiceType: record?.blueInvoiceType, - blueinvoiceCode: record?.blueinvoiceCode, - billDetail: record?.billDetail + + drawer: record?.BILL_PERSON,// 开票人 + buyerRecipientPhone: record?.RECEIVE_PHONENUMBER,// 购方收票手机号 + buyerRecipientMail: record?.RECEIVE_EMAIL,// 购方收件邮箱 + + // redReason: record?.BILL_DESC, + + // blueinvoiceNo: record?.blueinvoiceNo, + // originalIssueTime: record?.originalIssueTime, + // blueInvoiceType: record?.blueInvoiceType, + // blueinvoiceCode: record?.blueinvoiceCode, + billDetail: billDetailReq } console.log('objobj', obj); - - // 构造原始数据 const originalData = [obj]; // 将record作为data数组的一项 - // 将data字段进行base64加密 const dataString = JSON.stringify(originalData); const encryptedData = btoa(unescape(encodeURIComponent(dataString))); // base64编码,支持中文 - // 构造开票请求数据 const invoiceData = { businessSystemCode: "BUSINESS_YCIC", // 来源系统编码 @@ -76,7 +413,6 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { requestId: Date.now().toString(), // 时间戳作为请求ID data: encryptedData // 加密后的data字符串 }; - console.log('加密前的请求参数:', { businessSystemCode: "BUSINESS_YCIC", // 来源系统编码 interfaceCode: "BILL.PUSH", // 接口业务编码 @@ -96,8 +432,8 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { let res: any = JSON.parse(decodeURIComponent(escape(atob(response.data)))); console.log('最终结果:', res); - message.success({ content: `单据 ${record.billNo} 开票申请已提交成功`, key: 'invoice' }); - + message.success({ content: `单据 ${record.BILL_NO} 开票申请已提交成功`, key: 'invoice' }); + actionRef.current?.reload() // 他们的调用成功了 再调用我们自己的 同步票据信息表 的接口 handleSynchroBILL(record) @@ -110,108 +446,47 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { message.error({ content: '开票申请失败,请重试', key: 'invoice' }); } }; + // 退回开票 + const handleReturnInvoice = async (record: any) => { + let req: any = { + ...record, + BILL_STATE: 1000, + BILL_NO: `【退】${record?.BILL_NO}` + } + const data = await handleSynchroBILLInterface(req) + console.log('djasdahslda', data); + if (data.Result_Code === 100) { + message.success('退回成功!'); + actionRef.current?.reload() + } else { + message.error(data.Result_Desc) + } + } + // 在这个页面获取token + const handleGetTokenInPage = async () => { + let req: any = { + appId: "FPY001", + appSecret: "FPY001fpy@2023***", + accountId: "2280459335882518528", + tenantid: "xhcamzchwbgonerr", + language: "" + } + const token = await handleGetAppToken(req) - const columns: any = [ - { - title: '单据编号', - dataIndex: 'billNo', - width: 180, - align: 'center', - ellipsis: true, - hideInSearch: false, - }, - { - title: '购方名称', - dataIndex: 'buyerName', - width: 200, - align: 'center', - ellipsis: true, - hideInSearch: false, - }, - { - title: '购方税号', - dataIndex: 'buyerTaxpayerId', - width: 180, - align: 'center', - ellipsis: true, - hideInSearch: true, - }, - { - title: '销方名称', - dataIndex: 'sellerName', - width: 200, - align: 'center', - ellipsis: true, - hideInSearch: true, - }, - { - title: '销方税号', - dataIndex: 'sellerTaxpayerId', - width: 180, - align: 'center', - ellipsis: true, - hideInSearch: false, - }, - { - title: '单据日期', - dataIndex: 'billDate', - width: 120, - align: 'center', - hideInSearch: true, - }, - { - title: '单据金额', - dataIndex: 'totalAmount', - width: 120, - align: 'center', - hideInSearch: true, - render: (text: number) => text ? `¥${text.toFixed(2)}` : '-', - }, - { - title: '含税标识', - dataIndex: 'includeTaxFlag', - width: 100, - align: 'center', - hideInSearch: true, - render: (text: string) => ( - - {text === '1' ? '含税' : '不含税'} - - ), - }, - { - title: '备注', - dataIndex: 'remark', - width: 150, - ellipsis: true, - align: 'center', - hideInSearch: true, - }, - { - title: '操作', - dataIndex: 'action', - width: 120, - fixed: 'right', - align: 'center', - hideInSearch: true, - render: (text: any, record: Datum) => ( - { - handleInvoice(record) - } - } - onCancel={() => { }} - okText="确认" - cancelText="取消" - > - < Button type="primary" size="small" > 发起开票 - - ), - }, - ] + let appToken: any = token.data.app_token + let tokenReq: any = { + user: "18620126214", + apptoken: appToken, + tenantid: "xhcamzchwbgonerr", + accountId: "2280459335882518528", + usertype: "" + } + const accessToken: any = await handleGetSDToken(tokenReq) + + setAppToken(appToken) + setAccessToken(accessToken.data.access_token) + } const handleSynchroBILL = async (obj: any) => { // 发票明细列表 let detailList: any = [] @@ -236,43 +511,80 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { }) }) } - let req: any = { - BILL_TYPE: obj.invoiceType === '08xdp' ? '1000' : obj.invoiceType === '10xdp' ? '2000' : '', // 票据类型(1000:增值税专用发票;2000:普通发票) , - BILL_NO: obj?.billNo || "",//票据编号 - SERIAL_NO: obj?.billNo || "",// 流水号(实际发票号码) - BILL_TAXAMOUNT: obj?.includeTaxFlag === '1' ? obj?.totalAmount : '',// 含税开票金额 - BILL_AMOUNT: obj?.includeTaxFlag === '1' ? '' : obj?.totalAmount,// 除税开票金额 - DUTY_PARAGRAPH: "",// 开票税率 - INVOICE_TAXAMOUNT: "",// 含税费用金额 - INVOICE_AMOUNT: "",// 除税费用金额 - TAXTAIL_DIFFERENCE: "",// 含税尾差 - TAIL_DIFFERENCE: "",// 除税尾差 - TAX_PRICE: "",// 开票税金 - SERVERPART_ID: "416", - SERVERPART_NAME: "新桥服务区", - SERVERPARTSHOP_ID: "",// 门店内码 - SERVERPARTSHOP_NAME: "",// 门店名称 - MERCHANTS_ID: "",// 商户内码 - MERCHANTS_NAME: "",// 商户名称 - BILL_PERSON: obj?.buyerName,// 开票人 - BILL_DATE: moment().format('YYYY-MM-DD'),// 开票日期 - BANK_NAME: obj?.buyerBankAndAccount,// 开户银行 - BANK_ACCOUNT: obj?.buyerBankAndAccount,// 银行账号 - TAXPAYER_IDENTIFYCODE: obj?.buyerTaxpayerId,// 统一信用代码 - INTERBANK_NO: "",// 联行号 + ...obj, + BILL_TYPE: obj.BILL_TYPE || "", // 票据类型(1000:增值税专用发票;2000:普通发票) , + BILL_NO: obj?.BILL_NO || "",//票据编号 + SERIAL_NO: obj?.SERIAL_NO || "",// 流水号(实际发票号码) + BILL_TAXAMOUNT: obj?.BILL_TAXAMOUNT,// 含税开票金额 + BILL_AMOUNT: obj?.BILL_AMOUNT,// 除税开票金额 + DUTY_PARAGRAPH: obj?.DUTY_PARAGRAPH,// 开票税率 + INVOICE_TAXAMOUNT: obj?.INVOICE_TAXAMOUNT,// 含税费用金额 + INVOICE_AMOUNT: obj?.INVOICE_AMOUNT,// 除税费用金额 + TAXTAIL_DIFFERENCE: obj?.TAXTAIL_DIFFERENCE,// 含税尾差 + TAIL_DIFFERENCE: obj?.TAIL_DIFFERENCE,// 除税尾差 + TAX_PRICE: obj?.TAX_PRICE,// 开票税金 + SERVERPART_ID: obj?.SERVERPART_ID, + SERVERPART_NAME: obj?.SERVERPART_NAME, + SERVERPARTSHOP_ID: obj?.SERVERPARTSHOP_ID,// 门店内码 + SERVERPARTSHOP_NAME: obj?.SERVERPARTSHOP_NAME,// 门店名称 + MERCHANTS_ID: obj?.MERCHANTS_ID,// 商户内码 + MERCHANTS_NAME: obj?.MERCHANTS_NAME,// 商户名称 + BILL_PERSON: obj?.BILL_PERSON,// 开票人 + BILL_DATE: obj?.BILL_DATE,// 开票日期 + BANK_NAME: obj?.BANK_NAME,// 开户银行 + BANK_ACCOUNT: obj?.BANK_ACCOUNT,// 银行账号 + TAXPAYER_IDENTIFYCODE: obj?.TAXPAYER_IDENTIFYCODE,// 统一信用代码 + INTERBANK_NO: obj?.INTERBANK_NO,// 联行号 TAXPAYER_CODE: obj?.sellerTaxpayerId,// 开票方纳税人识别号 - ACCOUNTED_TYPE: "",// 入账类型 - ACCOUNTED_DATE: "",// 入账时间 - DOWNLOAD_URL: "",// 下载地址 - BILL_STATE: "",// 票据状态 - DetailList: detailList,// 发票明细列表 + ACCOUNTED_TYPE: obj?.ACCOUNTED_TYPE,// 入账类型 + ACCOUNTED_DATE: obj?.ACCOUNTED_DATE,// 入账时间 + DOWNLOAD_URL: obj?.DOWNLOAD_URL,// 下载地址 + RECEIVE_PHONENUMBER: obj?.RECEIVE_PHONENUMBER,// 收票方手机 + RECEIVE_EMAIL: obj?.RECEIVE_EMAIL,// 收票方邮箱 + BILL_STATE: 9000,// 票据状态 + DetailList: obj?.DetailList,// 发票明细列表 } - const data = await handleSynchroBILLInterface(req) console.log('data2222', data); + } + // 获取当前用户信息 + const handleGetUserInfo = async (id: string) => { + const req: any = { + UserIdEncrypted: id + } + const data = await handleGetPassportInfoById(req) + console.log('datae2e12e1', data); + setCurrentUser(data) + return data + } + // 同步操作的流程信息 审核通过 和 审核驳回 都要去调用一下 同步流程的方法 + const handleSynchroAPPLYAPPROVEFun = async (type: number, obj: any) => { + // type 1 审核通过 2 拒绝审核 + // obj 当前票据信息 + const req: any = { + ACTINST_NAME: type === 1 ? '审核开票申请' : type === 2 ? '驳回开票申请' : "",// 状态名称 审核开票申请 || 驳回开票申请 + APPROVE_TYPE: obj?.BILL_ID,// 票的id + APPROVE_INFO: type === 1 ? '同意开票' : type === 2 ? '驳回开票' : "",// 同意开票 || 驳回开票 + STAFF_ID: currentUser?.ID, + STAFF_NAME: currentUser?.Name, + APPROVE_DATE: moment().format('YYYY-MM-DD HH:mm:ss'), + APPROVE_STATE: type === 1 ? 9000 : type === 2 ? 1000 : "", + APPROVE_DESC: "T_BILL" + } + let reqData: any = { + name: "", + value: encryptAES(JSON.stringify(req)) + } + + const data = await handleSynchroAPPLYAPPROVE(reqData) + console.log('datadatadata312321', data); } + useEffect(async () => { + // 先调用token 后续这个页面用得到 + await handleGetTokenInPage() + }, []) return ( @@ -292,264 +604,342 @@ const DigitalElectronics: React.FC<{ currentUser: any }> = (props) => { headerTitle={待开票列表} search={{ span: 6, labelWidth: 100 }} request={async (params: any) => { - let req: any = { - appId: "FPY001", - appSecret: "FPY001fpy@2023***", - accountId: "2280459335882518528", - tenantid: "xhcamzchwbgonerr", - language: "" - } - const token = await handleGetAppToken(req) - console.log('tokentokentoken', token); + const search = window.location.search; + const addressParams = Object.fromEntries(new URLSearchParams(search).entries()); + console.log('addressParamsaddressParamsaddressParams', addressParams); + const userInfo = await handleGetUserInfo(addressParams.id) - let appToken: any = token.data.app_token - - let tokenReq: any = { - user: "18620126214", - apptoken: appToken, - tenantid: "xhcamzchwbgonerr", - accountId: "2280459335882518528", - usertype: "" - } - - const accessToken: any = await handleGetSDToken(tokenReq) - console.log('accessTokenaccessTokenaccessToken', accessToken); - - setAppToken(appToken) - setAccessToken(accessToken.data.access_token) - - - // 模拟数据 - const mockData: any = [ - // // 专票 - // { - // billNo: "SRM_202508220957", // 单据编号 - // billDate: "2025-08-22", // 单据日期 - // totalAmount: 10, // 单据金额 - // includeTaxFlag: "1",// 判断是否含税 - // autoInvoice: "1",// 自动开票标记 - // invoiceType: "10xdp", //发票种类 - // buyerName: "深圳市顺丰快运有限公司test01", // 购买方名称 - // buyerProperty: "0", // 购买方性质 - // sellerTaxpayerId: "91530112MA7MQ2JR9U", // 销方税号 写死 - // sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", // 销方名称 写死 - // sellerBankAndAccount: "13710884704", // 销方银行和账号 写死 - // sellerAddressAndTel: "", // 销方地址和电话 写死 应该可以不传 - // drawer: "测试人",// 开票人 - // buyerRecipientPhone: "18158132615",// 购方收票手机号 - // buyerRecipientMail: "",// 购方收件邮箱 - // amount: 10, // 明细金额 明细金额,含税标识includeTaxFlag=1时该金额为含税金额 - // detailId: "1194121661989796666",// 业务系统明细id 业务系统明细id,用于反写回原业务系统明细 【长度:50】 - // goodsName: "蜂胶口腔膜",// 商品名称 商品名称,与商品编码2填1,需提前在系统维护【长度:GBK92字节】 - // lineProperty: 2,// 行性质 行性质,1折扣行(折扣行必须紧跟被折扣的正常商品行),2正常商品行 - // price: 10,// 单价 单价【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,price有值则quantity必填,含税标识includeTaxFlag=1时该金额为含税金额 - // quantity: 1,// 数量 数量【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,quantity有值则price必填 - // revenueCode: "1070304990000000000",// 税收分类编码 税收分类编码,开票项补全或映射会补全税收分类编码,未走开票项补全或映射必填 - // taxRate: "0.13",// 税率 税率,【0.13,0.09,0.06等】。不传时根据开票项匹配税率 - // units: "个"// 计量单位 计量单位,【长度:GBK22字节】 - - // // billDetail: [ - // // { - - // // } - // // ] - // }, - // { - // billNo: "SRM_202508220966", // 单据编号 - // billDate: "2025-08-22", // 单据日期 - // totalAmount: 10, // 单据金额 - // includeTaxFlag: "1",// 判断是否含税 - // autoInvoice: "1",// 自动开票标记 - // invoiceType: "10xdp", //发票种类 - // buyerName: "深圳市顺丰快运有限公司test01", // 购买方名称 - // buyerProperty: "0", // 购买方性质 - // sellerTaxpayerId: "91530112MA7MQ2JR9U", // 销方税号 写死 - // sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", // 销方名称 写死 - // sellerBankAndAccount: "13710884704", // 销方银行和账号 写死 - // sellerAddressAndTel: "", // 销方地址和电话 写死 应该可以不传 - // drawer: "测试人",// 开票人 - // buyerRecipientPhone: "18158132615",// 购方收票手机号 - // buyerRecipientMail: "",// 购方收件邮箱 - // amount: 10, // 明细金额 明细金额,含税标识includeTaxFlag=1时该金额为含税金额 - // detailId: "1194121661989796666",// 业务系统明细id 业务系统明细id,用于反写回原业务系统明细 【长度:50】 - // goodsName: "蜂胶口腔膜",// 商品名称 商品名称,与商品编码2填1,需提前在系统维护【长度:GBK92字节】 - // lineProperty: 2,// 行性质 行性质,1折扣行(折扣行必须紧跟被折扣的正常商品行),2正常商品行 - // price: 10,// 单价 单价【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,price有值则quantity必填,含税标识includeTaxFlag=1时该金额为含税金额 - // quantity: 1,// 数量 数量【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,quantity有值则price必填 - // revenueCode: "1070304990000000000",// 税收分类编码 税收分类编码,开票项补全或映射会补全税收分类编码,未走开票项补全或映射必填 - // taxRate: "0.13",// 税率 税率,【0.13,0.09,0.06等】。不传时根据开票项匹配税率 - // units: "个"// 计量单位 计量单位,【长度:GBK22字节】 - - // // billDetail: [ - // // { - - // // } - // // ] - // }, - // // 普票 - // { - // billNo: "SRM_202508221427", // 单据编号 - // billDate: "2025-08-22", // 单据日期 - // totalAmount: -10, // 单据金额 - // includeTaxFlag: "1",// 判断是否含税 - // invoiceProperty: 0, - // autoMerge: 1, - // autoInvoice: 1,// 自动开票标记 - // invoiceType: "10xdp", //发票种类 - // buyerName: "深圳市顺丰快运有限公司test01", // 购买方名称 - // buyerProperty: "0", // 购买方性质 - // sellerTaxpayerId: "91530112MA7MQ2JR9U", // 销方税号 写死 - // sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", // 销方名称 写死 - // sellerBankAndAccount: "13710884704", // 销方银行和账号 写死 - // sellerAddressAndTel: "", // 销方地址和电话 写死 应该可以不传 - // drawer: "测试人",// 开票人 - // buyerRecipientPhone: "18158132615",// 购方收票手机号 - // buyerRecipientMail: "",// 购方收件邮箱 - // amount: -10, // 明细金额 明细金额,含税标识includeTaxFlag=1时该金额为含税金额 - // detailId: "1194121661989796666",// 业务系统明细id 业务系统明细id,用于反写回原业务系统明细 【长度:50】 - // goodsName: "蜂胶口腔膜",// 商品名称 商品名称,与商品编码2填1,需提前在系统维护【长度:GBK92字节】 - // lineProperty: 2,// 行性质 行性质,1折扣行(折扣行必须紧跟被折扣的正常商品行),2正常商品行 - // price: -10,// 单价 单价【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,price有值则quantity必填,含税标识includeTaxFlag=1时该金额为含税金额 - // quantity: 1,// 数量 数量【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,quantity有值则price必填 - // revenueCode: "1070304990000000000",// 税收分类编码 税收分类编码,开票项补全或映射会补全税收分类编码,未走开票项补全或映射必填 - // taxRate: "0.13",// 税率 税率,【0.13,0.09,0.06等】。不传时根据开票项匹配税率 - // units: "个",// 计量单位 计量单位,【长度:GBK22字节】 - // redReason: "2", - // blueInvoiceType: "026", - // originalIssueTime: "2025-08-24 15:00:00", - // blueinvoiceCode: "testBlueCode2025-08-25", - // blueinvoiceNo: "testBlueNo2025-08-25" - // // billDetail: [ - // // { - - // // } - // // ] - // }, - // { - // billNo: "202508220003", - // billDate: "2025-08-22", - // autoInvoice: "1", - // includeTaxFlag: "0", - // invoiceProperty: "1", - // invoiceType: "10xdp", - // totalAmount: -8.85, - // buyerTaxpayerId: "91440300MA5G9GK78Y", - // buyerName: "深圳市顺丰快运有限公司test01", - // sellerTaxpayerId: "91530112MA7MQ2JR9U", - // sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", - // sellerBankAndAccount: "13710884704", - // sellerAddressAndTel: "高新技术产业园南区科技南十二路58996989", - // drawer: "王协芬", - // autoMerge: "0", - // blueinvoiceNo: "SRM_202508220966", - // redReason: "2", - // amount: -8.85, - // goodsName: "通天口服液", - // lineProperty: 2, - // price: -12, - // quantity: 5, - // revenueCode: "1070304990000000000", - // taxRate: "0.09", - // units: "盒" - // }, - - // 普票 - { - billNo: "SRM_202509011376", - billDate: "2025-09-01", - autoInvoice: "1", - includeTaxFlag: "1", - invoiceProperty: "0", - invoiceType: "10xdp", - totalAmount: 10.00, - buyerTaxpayerId: "91440300MA5G9GK78Y", - buyerName: "深圳市顺丰快运有限公司test01", - sellerTaxpayerId: "91530112MA7MQ2JR9U", - sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", - sellerBankAndAccount: "13710884704", - sellerAddressAndTel: "高新技术产业园南区科技南十二路58996989", - drawer: "王协芬", - buyerRecipientPhone: "18158132615", - buyerRecipientMail: "", - billDetail: [ - { - amount: 5, - detailId: "11112222333344445555", - goodsName: "通天口服液", - lineProperty: 2, - price: 5, - quantity: 1, - revenueCode: "1070304990000000000", - taxRate: "0.13", - units: "盒" - }, - { - amount: 5, - detailId: "55554444333322221111", - goodsName: "通天口服液2", - lineProperty: 2, - price: 5, - quantity: 1, - revenueCode: "1070304990000000000", - taxRate: "0.13", - units: "盒" - } - ] + // 获取票据信息表列表 + const req: any = { + SearchParameter: { + SERVERPART_IDS: userInfo?.ServerpartIds, }, - - // 专票 - { - billNo: "SRM_202509011377", - billDate: "2025-09-02", - autoInvoice: "1", - includeTaxFlag: "1", - invoiceProperty: "0", - invoiceType: "08xdp", - totalAmount: 10.00, - buyerTaxpayerId: "91440300MA5G9GK78Y", - buyerName: "深圳市顺丰快运有限公司test01", - buyerProperty: "1", - sellerTaxpayerId: "91530112MA7MQ2JR9U", - sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", - sellerBankAndAccount: "13710884704", - sellerAddressAndTel: "高新技术产业园南区科技南十二路58996989", - drawer: "王协芬", - buyerRecipientPhone: "18158132615", - buyerRecipientMail: "", - billDetail: [ - { - amount: 5, - detailId: "11112222333344445555", - goodsName: "通天口服液", - lineProperty: 2, - price: 5, - quantity: 1, - revenueCode: "1070304990000000000", - taxRate: "0.13", - units: "盒" - }, - { - amount: 5, - detailId: "55554444333322221111", - goodsName: "通天口服液2", - lineProperty: 2, - price: 5, - quantity: 1, - revenueCode: "1070304990000000000", - taxRate: "0.13", - units: "盒" - } - ] - } - ]; - - return { - data: mockData, - success: true, - total: mockData.length + PageIndex: 1, + PageSize: 999999 } + + const data = await handleGetBILLList(req) + console.log('dsahdgasyifgdhsvs', data); + if (data && data.length > 0) { + return { data: data, success: true } + } + return { data: [], success: true } + + + // let req: any = { + // appId: "FPY001", + // appSecret: "FPY001fpy@2023***", + // accountId: "2280459335882518528", + // tenantid: "xhcamzchwbgonerr", + // language: "" + // } + // const token = await handleGetAppToken(req) + // console.log('tokentokentoken', token); + + // let appToken: any = token.data.app_token + + // let tokenReq: any = { + // user: "18620126214", + // apptoken: appToken, + // tenantid: "xhcamzchwbgonerr", + // accountId: "2280459335882518528", + // usertype: "" + // } + + // const accessToken: any = await handleGetSDToken(tokenReq) + // console.log('accessTokenaccessTokenaccessToken', accessToken); + + // setAppToken(appToken) + // setAccessToken(accessToken.data.access_token) + + + // // 模拟数据 + // const mockData: any = [ + // // // 专票 + // // { + // // billNo: "SRM_202508220957", // 单据编号 + // // billDate: "2025-08-22", // 单据日期 + // // totalAmount: 10, // 单据金额 + // // includeTaxFlag: "1",// 判断是否含税 + // // autoInvoice: "1",// 自动开票标记 + // // invoiceType: "10xdp", //发票种类 + // // buyerName: "深圳市顺丰快运有限公司test01", // 购买方名称 + // // buyerProperty: "0", // 购买方性质 + // // sellerTaxpayerId: "91530112MA7MQ2JR9U", // 销方税号 写死 + // // sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", // 销方名称 写死 + // // sellerBankAndAccount: "13710884704", // 销方银行和账号 写死 + // // sellerAddressAndTel: "", // 销方地址和电话 写死 应该可以不传 + // // drawer: "测试人",// 开票人 + // // buyerRecipientPhone: "18158132615",// 购方收票手机号 + // // buyerRecipientMail: "",// 购方收件邮箱 + // // amount: 10, // 明细金额 明细金额,含税标识includeTaxFlag=1时该金额为含税金额 + // // detailId: "1194121661989796666",// 业务系统明细id 业务系统明细id,用于反写回原业务系统明细 【长度:50】 + // // goodsName: "蜂胶口腔膜",// 商品名称 商品名称,与商品编码2填1,需提前在系统维护【长度:GBK92字节】 + // // lineProperty: 2,// 行性质 行性质,1折扣行(折扣行必须紧跟被折扣的正常商品行),2正常商品行 + // // price: 10,// 单价 单价【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,price有值则quantity必填,含税标识includeTaxFlag=1时该金额为含税金额 + // // quantity: 1,// 数量 数量【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,quantity有值则price必填 + // // revenueCode: "1070304990000000000",// 税收分类编码 税收分类编码,开票项补全或映射会补全税收分类编码,未走开票项补全或映射必填 + // // taxRate: "0.13",// 税率 税率,【0.13,0.09,0.06等】。不传时根据开票项匹配税率 + // // units: "个"// 计量单位 计量单位,【长度:GBK22字节】 + + // // // billDetail: [ + // // // { + + // // // } + // // // ] + // // }, + // // { + // // billNo: "SRM_202508220966", // 单据编号 + // // billDate: "2025-08-22", // 单据日期 + // // totalAmount: 10, // 单据金额 + // // includeTaxFlag: "1",// 判断是否含税 + // // autoInvoice: "1",// 自动开票标记 + // // invoiceType: "10xdp", //发票种类 + // // buyerName: "深圳市顺丰快运有限公司test01", // 购买方名称 + // // buyerProperty: "0", // 购买方性质 + // // sellerTaxpayerId: "91530112MA7MQ2JR9U", // 销方税号 写死 + // // sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", // 销方名称 写死 + // // sellerBankAndAccount: "13710884704", // 销方银行和账号 写死 + // // sellerAddressAndTel: "", // 销方地址和电话 写死 应该可以不传 + // // drawer: "测试人",// 开票人 + // // buyerRecipientPhone: "18158132615",// 购方收票手机号 + // // buyerRecipientMail: "",// 购方收件邮箱 + // // amount: 10, // 明细金额 明细金额,含税标识includeTaxFlag=1时该金额为含税金额 + // // detailId: "1194121661989796666",// 业务系统明细id 业务系统明细id,用于反写回原业务系统明细 【长度:50】 + // // goodsName: "蜂胶口腔膜",// 商品名称 商品名称,与商品编码2填1,需提前在系统维护【长度:GBK92字节】 + // // lineProperty: 2,// 行性质 行性质,1折扣行(折扣行必须紧跟被折扣的正常商品行),2正常商品行 + // // price: 10,// 单价 单价【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,price有值则quantity必填,含税标识includeTaxFlag=1时该金额为含税金额 + // // quantity: 1,// 数量 数量【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,quantity有值则price必填 + // // revenueCode: "1070304990000000000",// 税收分类编码 税收分类编码,开票项补全或映射会补全税收分类编码,未走开票项补全或映射必填 + // // taxRate: "0.13",// 税率 税率,【0.13,0.09,0.06等】。不传时根据开票项匹配税率 + // // units: "个"// 计量单位 计量单位,【长度:GBK22字节】 + + // // // billDetail: [ + // // // { + + // // // } + // // // ] + // // }, + // // // 普票 + // // { + // // billNo: "SRM_202508221427", // 单据编号 + // // billDate: "2025-08-22", // 单据日期 + // // totalAmount: -10, // 单据金额 + // // includeTaxFlag: "1",// 判断是否含税 + // // invoiceProperty: 0, + // // autoMerge: 1, + // // autoInvoice: 1,// 自动开票标记 + // // invoiceType: "10xdp", //发票种类 + // // buyerName: "深圳市顺丰快运有限公司test01", // 购买方名称 + // // buyerProperty: "0", // 购买方性质 + // // sellerTaxpayerId: "91530112MA7MQ2JR9U", // 销方税号 写死 + // // sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", // 销方名称 写死 + // // sellerBankAndAccount: "13710884704", // 销方银行和账号 写死 + // // sellerAddressAndTel: "", // 销方地址和电话 写死 应该可以不传 + // // drawer: "测试人",// 开票人 + // // buyerRecipientPhone: "18158132615",// 购方收票手机号 + // // buyerRecipientMail: "",// 购方收件邮箱 + // // amount: -10, // 明细金额 明细金额,含税标识includeTaxFlag=1时该金额为含税金额 + // // detailId: "1194121661989796666",// 业务系统明细id 业务系统明细id,用于反写回原业务系统明细 【长度:50】 + // // goodsName: "蜂胶口腔膜",// 商品名称 商品名称,与商品编码2填1,需提前在系统维护【长度:GBK92字节】 + // // lineProperty: 2,// 行性质 行性质,1折扣行(折扣行必须紧跟被折扣的正常商品行),2正常商品行 + // // price: -10,// 单价 单价【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,price有值则quantity必填,含税标识includeTaxFlag=1时该金额为含税金额 + // // quantity: 1,// 数量 数量【长度:整数位加小数位最大16位,小数位最多13,小数点占1位】,quantity有值则price必填 + // // revenueCode: "1070304990000000000",// 税收分类编码 税收分类编码,开票项补全或映射会补全税收分类编码,未走开票项补全或映射必填 + // // taxRate: "0.13",// 税率 税率,【0.13,0.09,0.06等】。不传时根据开票项匹配税率 + // // units: "个",// 计量单位 计量单位,【长度:GBK22字节】 + // // redReason: "2", + // // blueInvoiceType: "026", + // // originalIssueTime: "2025-08-24 15:00:00", + // // blueinvoiceCode: "testBlueCode2025-08-25", + // // blueinvoiceNo: "testBlueNo2025-08-25" + // // // billDetail: [ + // // // { + + // // // } + // // // ] + // // }, + // // { + // // billNo: "202508220003", + // // billDate: "2025-08-22", + // // autoInvoice: "1", + // // includeTaxFlag: "0", + // // invoiceProperty: "1", + // // invoiceType: "10xdp", + // // totalAmount: -8.85, + // // buyerTaxpayerId: "91440300MA5G9GK78Y", + // // buyerName: "深圳市顺丰快运有限公司test01", + // // sellerTaxpayerId: "91530112MA7MQ2JR9U", + // // sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", + // // sellerBankAndAccount: "13710884704", + // // sellerAddressAndTel: "高新技术产业园南区科技南十二路58996989", + // // drawer: "王协芬", + // // autoMerge: "0", + // // blueinvoiceNo: "SRM_202508220966", + // // redReason: "2", + // // amount: -8.85, + // // goodsName: "通天口服液", + // // lineProperty: 2, + // // price: -12, + // // quantity: 5, + // // revenueCode: "1070304990000000000", + // // taxRate: "0.09", + // // units: "盒" + // // }, + + // // 普票 + // { + // billNo: "SRM_202509011376", + // billDate: "2025-09-01", + // autoInvoice: "1", + // includeTaxFlag: "1", + // invoiceProperty: "0", + // invoiceType: "10xdp", + // totalAmount: 10.00, + // buyerTaxpayerId: "91440300MA5G9GK78Y", + // buyerName: "深圳市顺丰快运有限公司test01", + // sellerTaxpayerId: "91530112MA7MQ2JR9U", + // sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", + // sellerBankAndAccount: "13710884704", + // sellerAddressAndTel: "高新技术产业园南区科技南十二路58996989", + // drawer: "王协芬", + // buyerRecipientPhone: "18158132615", + // buyerRecipientMail: "", + // billDetail: [ + // { + // amount: 5, + // detailId: "11112222333344445555", + // goodsName: "通天口服液", + // lineProperty: 2, + // price: 5, + // quantity: 1, + // revenueCode: "1070304990000000000", + // taxRate: "0.13", + // units: "盒" + // }, + // { + // amount: 5, + // detailId: "55554444333322221111", + // goodsName: "通天口服液2", + // lineProperty: 2, + // price: 5, + // quantity: 1, + // revenueCode: "1070304990000000000", + // taxRate: "0.13", + // units: "盒" + // } + // ] + // }, + + // // 专票 + // { + // billNo: "SRM_202509011377", + // billDate: "2025-09-02", + // autoInvoice: "1", + // includeTaxFlag: "1", + // invoiceProperty: "0", + // invoiceType: "08xdp", + // totalAmount: 10.00, + // buyerTaxpayerId: "91440300MA5G9GK78Y", + // buyerName: "深圳市顺丰快运有限公司test01", + // buyerProperty: "1", + // sellerTaxpayerId: "91530112MA7MQ2JR9U", + // sellerName: "云南交投集团经营开发有限公司彩云驿商业管理分公司", + // sellerBankAndAccount: "13710884704", + // sellerAddressAndTel: "高新技术产业园南区科技南十二路58996989", + // drawer: "王协芬", + // buyerRecipientPhone: "18158132615", + // buyerRecipientMail: "", + // billDetail: [ + // { + // amount: 5, + // detailId: "11112222333344445555", + // goodsName: "通天口服液", + // lineProperty: 2, + // price: 5, + // quantity: 1, + // revenueCode: "1070304990000000000", + // taxRate: "0.13", + // units: "盒" + // }, + // { + // amount: 5, + // detailId: "55554444333322221111", + // goodsName: "通天口服液2", + // lineProperty: 2, + // price: 5, + // quantity: 1, + // revenueCode: "1070304990000000000", + // taxRate: "0.13", + // units: "盒" + // } + // ] + // } + // ]; + + // return { + // data: mockData, + // success: true, + // total: mockData.length + // } }} /> + + + {/* 用来输入红冲原因的 */} + { + setShowModal(false) + setCurrentRow(null) + }} + onOk={() => { + modalFormRef.current?.validateFields().then(res => { + if (res) { + modalFormRef.current?.submit() + } + }) + }} + > + { + handleRedGoBill(currentRow) + }} + > + + + + ) } diff --git a/src/pages/DigitalElectronics/service.ts b/src/pages/DigitalElectronics/service.ts index a7338bf..b7d6c70 100644 --- a/src/pages/DigitalElectronics/service.ts +++ b/src/pages/DigitalElectronics/service.ts @@ -47,4 +47,64 @@ export async function handleGetInvoiceSearch(bodyData: any, accessToken: string) export async function handleSynchroBILLInterface(params: any) { const data = await requestOld.post('/Invoice/SynchroBILL', params) return data -} \ No newline at end of file +} + + +// 获取用户信息 +export async function handleGetPassportInfoById(params: any) { + const data = await requestOld(`/Logging/GetPassportInfoById?UserIdEncrypted=${params?.UserIdEncrypted}`, { + method: 'POST', + // data:params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data.Result_Data +} + + +// 获取票据信息表列表 +export async function handleGetBILLList(params: any) { + const data = await requestOld(`/Invoice/GetBILLList`, { + method: 'POST', + data: params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data.Result_Data.List +} + + +// 票据信息的流程 +export async function handleSynchroAPPLYAPPROVE(params: any) { + const data = await requestOld(`/Office/SynchroAPPLYAPPROVE`, { + method: 'POST', + data: params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data +} + + +// 拿到票据明细列表 +export async function handleGetBILLDETAILList(params: any) { + const data = await requestOld(`/Invoice/GetBILLDETAILList`, { + method: 'POST', + data: params + }) + + if (data.Result_Code !== 100) { + return data + } + + return data.Result_Data.List +} diff --git a/src/pages/InvoiceSearch/index.tsx b/src/pages/InvoiceSearch/index.tsx index d368823..a840c58 100644 --- a/src/pages/InvoiceSearch/index.tsx +++ b/src/pages/InvoiceSearch/index.tsx @@ -264,7 +264,7 @@ const InvoiceSearch: React.FC = () => { buyerRecipientMail: "", autoMerge: "0", blueinvoiceCode: "", // 红冲时 blueinvoiceCode 不传的 - blueinvoiceNo: "22951444153138083840", + blueinvoiceNo: "23249322851717775360", redReason: "2", billDetail: [ { diff --git a/src/pages/Invoicing/index.tsx b/src/pages/Invoicing/index.tsx index 3361515..132aa93 100644 --- a/src/pages/Invoicing/index.tsx +++ b/src/pages/Invoicing/index.tsx @@ -99,8 +99,8 @@ const InvoicingIndex: React.FC<{ currentUser: any }> = (props) => { clearInterval(timerRef.current) timerRef.current = null } - instance.destroy(); - message.success({ content: '认证成功!' }) + // instance.destroy(); + message.success({ content: '认证成功!' }) setShowTable(true) } }, 2000); diff --git a/src/utils/crypto-js.js b/src/utils/crypto-js.js new file mode 100644 index 0000000..25b316a --- /dev/null +++ b/src/utils/crypto-js.js @@ -0,0 +1,158 @@ +// 纯 JS 精简版 AES-CBC-Pkcs7 +function toBytes(str) { + const utf8 = []; + for (let i = 0; i < str.length; i++) { + let charcode = str.charCodeAt(i); + if (charcode < 0x80) utf8.push(charcode); + else if (charcode < 0x800) { + utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f)); + } else if (charcode < 0xd800 || charcode >= 0xe000) { + utf8.push(0xe0 | (charcode >> 12), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f)); + } else { + i++; + charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff)); + utf8.push(0xf0 | (charcode >> 18), 0x80 | ((charcode >> 12) & 0x3f), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f)); + } + } + return utf8; +} +function fromBytes(bytes) { + let out = '', i = 0, c = 0; + while (i < bytes.length) { + c = bytes[i++]; + if (c < 128) out += String.fromCharCode(c); + else if (c > 191 && c < 224) out += String.fromCharCode(((c & 31) << 6) | (bytes[i++] & 63)); + else if (c > 223 && c < 240) out += String.fromCharCode(((c & 15) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63)); + else { + let u = (((c & 7) << 18) | ((bytes[i++] & 63) << 12) | ((bytes[i++] & 63) << 6) | (bytes[i++] & 63)) - 0x10000; + out += String.fromCharCode(0xd800 + (u >> 10), 0xdc00 + (u & 1023)); + } + } + return out; +} +const b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; +function bytesToBase64(bytes) { + let str = '', i = 0; + while (i < bytes.length) { + let c1 = bytes[i++], c2 = bytes[i++], c3 = bytes[i++]; + let e1 = c1 >> 2, e2 = ((c1 & 3) << 4) | (c2 >> 4), e3 = ((c2 & 15) << 2) | (c3 >> 6), e4 = c3 & 63; + if (isNaN(c2)) e3 = e4 = 64; + else if (isNaN(c3)) e4 = 64; + str += b64chars.charAt(e1) + b64chars.charAt(e2) + b64chars.charAt(e3) + b64chars.charAt(e4); + } + return str; +} + +function base64ToBytes(str) { + let output = [], i = 0; + str = str.replace(/[^A-Za-z0-9\+\/\=]/g, ''); + while (i < str.length) { + let e1 = b64chars.indexOf(str.charAt(i++)), e2 = b64chars.indexOf(str.charAt(i++)), e3 = b64chars.indexOf(str.charAt(i++)), e4 = b64chars.indexOf(str.charAt(i++)); + let c1 = (e1 << 2) | (e2 >> 4), c2 = ((e2 & 15) << 4) | (e3 >> 2), c3 = ((e3 & 3) << 6) | e4; + output.push(c1); + if (e3 !== 64) output.push(c2); + if (e4 !== 64) output.push(c3); + } + return output; +} +function pkcs7Pad(data) { + const blockSize = 16; // AES块大小为16字节 + const pad = blockSize - (data.length % blockSize); + return data.concat(Array(pad).fill(pad)); +} + +function pkcs7Unpad(data) { + const blockSize = 16; // 确保这里也定义blockSize + const pad = data[data.length - 1]; + if (pad > 0 && pad <= blockSize) { + for (let i = data.length - pad; i < data.length; i++) { + if (data[i] !== pad) return data; // 如果填充无效,则返回原始数据 + } + return data.slice(0, data.length - pad); + } + return data; +} +function xorBlock(a, b) { + const out = []; + for (let i = 0; i < a.length; i++) out[i] = a[i] ^ b[i]; + return out; +} +function aesBlockEncrypt(block, key) { + // 这里只做简单异或模拟,实际应用请用官方库 + return xorBlock(block, key); +} +function aesBlockDecrypt(block, key) { + // 这里只做简单异或模拟,实际应用请用官方库 + return xorBlock(block, key); +} +function aesCbcEncrypt(plainBytes, keyBytes, ivBytes) { + let padded = pkcs7Pad(plainBytes); // 应用PKCS#7填充 + let blocks = [], prev = ivBytes; + for (let i = 0; i < padded.length; i += 16) { + let block = padded.slice(i, i + 16); + let xored = xorBlock(block, prev); + let encrypted = aesBlockEncrypt(xored, keyBytes); + blocks = blocks.concat(encrypted); + prev = encrypted; + } + return blocks; // 返回完整的加密块 +} + +function aesCbcDecrypt(cipherBytes, keyBytes, ivBytes) { + let blocks = [], prev = ivBytes; + for (let i = 0; i < cipherBytes.length; i += 16) { + let block = cipherBytes.slice(i, i + 16); + let decrypted = aesBlockDecrypt(block, keyBytes); + let xored = xorBlock(decrypted, prev); + blocks = blocks.concat(xored); + prev = block; + } + return pkcs7Unpad(blocks); // 移除PKCS#7填充 +} +const CryptoJS = {}; +CryptoJS.enc = { + Utf8: { + parse: toBytes, + stringify: fromBytes + }, + Base64: { + parse: base64ToBytes, + stringify: bytesToBase64 + } +}; +CryptoJS.mode = { CBC: {} }; +CryptoJS.pad = { + Pkcs7: { + pad: pkcs7Pad, + unpad: pkcs7Unpad + } +}; +CryptoJS.AES = { + encrypt: function (data, key, options) { + let bytes = typeof data === 'string' ? toBytes(data) : data; + let k = typeof key === 'string' ? toBytes(key) : Array.from(key); + let iv = typeof options.iv === 'string' ? toBytes(options.iv) : Array.from(options.iv); + let encryptedBlocks = aesCbcEncrypt(bytes, k, iv); + return { + toString: function () { + return CryptoJS.enc.Base64.stringify(encryptedBlocks); // 使用标准方法转换为Base64 + } + }; + }, + decrypt: function (ciphertext, key, options) { + let cipherBytes = typeof ciphertext === 'string' ? base64ToBytes(ciphertext) : ciphertext; + let k = typeof key === 'string' ? toBytes(key) : Array.from(key); + let iv = typeof options.iv === 'string' ? toBytes(options.iv) : Array.from(options.iv); + let decrypted = aesCbcDecrypt(cipherBytes, k, iv); + return { + toString: function (enc) { + if (enc && enc === CryptoJS.enc.Utf8) { + return CryptoJS.enc.Utf8.stringify(decrypted); // 转换回原始字符串 + } + return decrypted; + } + }; + } +}; + +export default CryptoJS; \ No newline at end of file diff --git a/src/utils/handleAes.js b/src/utils/handleAes.js new file mode 100644 index 0000000..9fd1aa7 --- /dev/null +++ b/src/utils/handleAes.js @@ -0,0 +1,48 @@ +import CryptoJS from './crypto-js.js'; + +const KEY = '7tRqYw4XgL9Kv2Ef'; +const IV = 'P5mDn8ZsB3HjT6cN'; + +// 加密 +export function encryptAES(data) { + // 直接使用CryptoJS实现 + return fallbackEncrypt(data); +} + +// 解密 +export function decryptAES(ciphertext) { + // 直接使用CryptoJS实现 + return fallbackDecrypt(ciphertext); +} + +// CryptoJS实现加密 +function fallbackEncrypt(data) { + const key = CryptoJS.enc.Utf8.parse(KEY); + const iv = CryptoJS.enc.Utf8.parse(IV); + + const encrypted = CryptoJS.AES.encrypt(data, key, { + iv: iv, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + + return encrypted.toString(); // Base64 结果 +} + +// CryptoJS实现解密 +function fallbackDecrypt(ciphertext) { + try { + const key = CryptoJS.enc.Utf8.parse(KEY); + const iv = CryptoJS.enc.Utf8.parse(IV); + + const decrypted = CryptoJS.AES.decrypt(ciphertext, key, { + iv: iv, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + + return decrypted.toString(CryptoJS.enc.Utf8); + } catch (error) { + return ''; + } +} \ No newline at end of file diff --git a/src/utils/requestOld.ts b/src/utils/requestOld.ts index 4d3cb56..ed5a5f9 100644 --- a/src/utils/requestOld.ts +++ b/src/utils/requestOld.ts @@ -24,7 +24,7 @@ instance.interceptors.request.use( Authorization: `Bearer ${localStorage.getItem('Authorization') || ''}`, "Content-Type": "application/json;charset=utf-8" } as AxiosRequestHeaders; - + return config; }, (error) => Promise.reject(error),