| | |
| | | <PageHeader title="新增开票登记" @back="goBack" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="submitForm" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <van-form @submit="submitForm" ref="formRef" label-width="110px" input-align="right" error-message-align="right" scroll-to-error scroll-to-error-position="center"> |
| | | <!-- 基本信息 --> |
| | | <u-cell-group title="基本信息"> |
| | | <u-form-item label="销售合同号" border-bottom> |
| | | <u-input |
| | | v-model="form.salesContractNo" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="客户名称" border-bottom> |
| | | <u-input |
| | | v-model="form.customerName" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="业务员" border-bottom> |
| | | <u-input |
| | | v-model="form.salesman" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="项目名称" border-bottom> |
| | | <u-input |
| | | v-model="form.projectName" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="录入人" border-bottom> |
| | | <u-input |
| | | v-model="form.createUer" |
| | | readonly |
| | | placeholder="请输入录入人" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="录入日期" border-bottom> |
| | | <u-input |
| | | v-model="form.createTime" |
| | | readonly |
| | | placeholder="请选择录入日期" |
| | | @click="showCreateTimePicker = true" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="发票号码" prop="invoiceNo" required border-bottom> |
| | | <u-input |
| | | v-model="form.invoiceNo" |
| | | placeholder="请输入发票号码" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="开票日期" prop="issueDate" required border-bottom> |
| | | <u-input |
| | | v-model="form.issueDate" |
| | | readonly |
| | | placeholder="请选择开票日期" |
| | | @click="showIssueDatePicker = true" |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field |
| | | v-model="form.salesContractNo" |
| | | label="销售合同号" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | <van-field |
| | | v-model="form.customerName" |
| | | label="客户名称" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | <van-field |
| | | v-model="form.salesman" |
| | | label="业务员" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | <van-field |
| | | v-model="form.projectName" |
| | | label="项目名称" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | <van-field |
| | | v-model="form.createUer" |
| | | label="录入人" |
| | | readonly |
| | | placeholder="请输入录入人" |
| | | /> |
| | | <van-field |
| | | v-model="form.createTime" |
| | | label="录入日期" |
| | | readonly |
| | | placeholder="请选择录入日期" |
| | | @click="showCreateTimePicker = true" |
| | | /> |
| | | <van-field |
| | | v-model="form.invoiceNo" |
| | | label="发票号码" |
| | | required |
| | | placeholder="请输入发票号码" |
| | | :rules="[{ required: true, message: '请输入发票号码' }]" |
| | | /> |
| | | <van-field |
| | | v-model="form.issueDate" |
| | | label="开票日期" |
| | | readonly |
| | | placeholder="请选择开票日期" |
| | | required |
| | | @click="showIssueDatePicker = true" |
| | | :rules="[{ required: true, message: '请选择开票日期' }]" |
| | | /> |
| | | </van-cell-group> |
| | | |
| | | <!-- 产品信息 --> |
| | | <view class="product-section"> |
| | |
| | | </view> |
| | | |
| | | <view v-if="productData.length === 0" class="empty-state"> |
| | | <u-empty text="暂无产品数据" /> |
| | | <van-empty description="暂无产品数据" /> |
| | | </view> |
| | | |
| | | <view v-else class="product-list"> |
| | |
| | | <!-- 产品头部 --> |
| | | <view class="product-header"> |
| | | <view class="product-title"> |
| | | <u-icon name="file-text" color="#2979ff" size="15" /> |
| | | <van-icon name="description" color="#2979ff" size="15" /> |
| | | <text class="product-productCategory">产品 {{ index + 1 }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 产品信息表单 --> |
| | | <view class="product-form"> |
| | | <u-form-item label="产品大类" border-bottom> |
| | | <u-input |
| | | v-model="item.productCategory" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="规格型号" border-bottom> |
| | | <u-input |
| | | v-model="item.specificationModel" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="单位" border-bottom> |
| | | <u-input |
| | | v-model="item.unit" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="数量" border-bottom> |
| | | <u-input |
| | | v-model="item.quantity" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="税率(%)" border-bottom> |
| | | <u-input |
| | | v-model="item.taxRate" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="含税单价(元)" border-bottom> |
| | | <u-input |
| | | v-model="item.taxInclusiveUnitPrice" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="含税总价(元)" border-bottom> |
| | | <u-input |
| | | v-model="item.taxInclusiveTotalPrice" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="不含税总价(元)" border-bottom> |
| | | <u-input |
| | | v-model="item.taxExclusiveTotalPrice" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <van-field |
| | | v-model="item.productCategory" |
| | | label="产品大类" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="item.specificationModel" |
| | | label="规格型号" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="item.unit" |
| | | label="单位" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="item.quantity" |
| | | label="数量" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="item.taxRate" |
| | | label="税率(%)" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="item.taxInclusiveUnitPrice" |
| | | label="含税单价(元)" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="item.taxInclusiveTotalPrice" |
| | | label="含税总价(元)" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="item.taxExclusiveTotalPrice" |
| | | label="不含税总价(元)" |
| | | readonly |
| | | /> |
| | | |
| | | <!-- 本次开票信息 --> |
| | | <u-form-item label="本次开票数" border-bottom> |
| | | <u-input |
| | | v-model="item.currentInvoiceNum" |
| | | type="number" |
| | | placeholder="请输入开票数量" |
| | | @blur="invoiceNumBlur(item)" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="本次开票金额(元)" border-bottom> |
| | | <u-input |
| | | v-model="item.currentInvoiceAmount" |
| | | type="number" |
| | | placeholder="请输入开票金额" |
| | | @blur="invoiceAmountBlur(item)" |
| | | /> |
| | | </u-form-item> |
| | | <van-field |
| | | v-model="item.currentInvoiceNum" |
| | | label="本次开票数" |
| | | type="number" |
| | | placeholder="请输入开票数量" |
| | | @blur="invoiceNumBlur(item)" |
| | | /> |
| | | <van-field |
| | | v-model="item.currentInvoiceAmount" |
| | | label="本次开票金额(元)" |
| | | type="number" |
| | | placeholder="请输入开票金额" |
| | | @blur="invoiceAmountBlur(item)" |
| | | /> |
| | | |
| | | <!-- 未开票信息 --> |
| | | <u-form-item label="未开票数" border-bottom> |
| | | <u-input |
| | | v-model="item.noInvoiceNum" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="未开票金额(元)" border-bottom> |
| | | <u-input |
| | | v-model="item.noInvoiceAmount" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <van-field |
| | | v-model="item.noInvoiceNum" |
| | | label="未开票数" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="item.noInvoiceAmount" |
| | | label="未开票金额(元)" |
| | | readonly |
| | | /> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="submitForm">保存</u-button> |
| | | </view> |
| | | </u-form> |
| | | <view class="footer-btns"> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit">保存</van-button> |
| | | </view> |
| | | </van-form> |
| | | |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showIssueDatePicker" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showIssueDatePicker" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentIssueDate" |
| | | title="选择开票日期" |
| | | @confirm="onIssueDateConfirm" |
| | | @cancel="showIssueDatePicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <u-popup v-model="showCreateTimePicker" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showCreateTimePicker" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentCreateTime" |
| | | title="选择录入日期" |
| | | @confirm="onCreateTimeConfirm" |
| | | @cancel="showCreateTimePicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted } from 'vue' |
| | | // 替换 Vant 的 toast 为 uni 原生或 uview-plus 的方法 |
| | | // import { showToast, showLoadingToast, closeToast } from 'vant' |
| | | import { showToast, showLoadingToast, closeToast } from 'vant' |
| | | import { invoiceRegistrationSave } from '@/api/salesManagement/invoiceRegistration' |
| | | import useUserStore from '@/store/modules/user' |
| | | import {getSalesLedgerWithProducts} from "@/api/salesManagement/salesLedger"; |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | const showLoadingToast = (message) => { |
| | | uni.showLoading({ |
| | | title: message || '加载中...' |
| | | }) |
| | | } |
| | | |
| | | const closeToast = () => { |
| | | uni.hideLoading() |
| | | } |
| | | |
| | | const userStore = useUserStore() |
| | | const editData = ref(null); |