| | |
| | | // 应用全局配置 |
| | | const config = { |
| | | // baseUrl: 'http://114.132.189.42:8089', // 测试库 |
| | | baseUrl: 'http://192.168.1.147:7003', // 本地联调 |
| | | baseUrl: 'http://114.132.189.42:8089', // 测试库 |
| | | // baseUrl: 'http://192.168.1.147:7003', // 本地联调 |
| | | //cloud后台网关地址 |
| | | // baseUrl: 'http://192.168.10.3:8080', |
| | | // 应用信息 |
| | |
| | | import plugins from './plugins' |
| | | import store from './store' |
| | | import uviewPlus from 'uview-plus' |
| | | // 移除以下两行 Vant 相关导入 |
| | | // import Vant from 'vant'; |
| | | // import 'vant/lib/index.css'; |
| | | import Vant from 'vant'; |
| | | import 'vant/lib/index.css'; |
| | | import { setupGlobalComponents } from './components' |
| | | |
| | | |
| | |
| | | app.use(store) |
| | | app.use(uviewPlus) |
| | | app.use(plugins) |
| | | // 移除以下行 Vant 注册 |
| | | // app.use(Vant) |
| | | app.use(Vant) |
| | | |
| | | // 注册全局组件 |
| | | setupGlobalComponents(app) |
| | |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/cooperativeOffice/clientVisit/detail", |
| | | "style": { |
| | | "navigationBarTitleText": "客户拜访登记", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/equipmentManagement/ledger/index", |
| | | "style": { |
| | | "navigationBarTitleText": "设备台账", |
| | |
| | | <template> |
| | | <view class="client-visit"> |
| | | <!-- 使用通用页面头部组件 --> |
| | | <PageHeader title="客户拜访登记" @back="goBack" /> |
| | | <view class="client-visit-detail"> |
| | | <PageHeader title="客户拜访详情" @back="goBack" /> |
| | | |
| | | <!-- 签到表单 --> |
| | | <van-form @submit="handleSignIn" ref="formRef" label-width="110px" input-align="right" error-message-align="right"> |
| | | <u-form @submit="handleSignIn" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <!-- 客户信息 --> |
| | | <van-cell-group title="客户信息" inset> |
| | | <van-field |
| | | <u-cell-group title="客户信息"> |
| | | <u-form-item label="客户名称" prop="customerName" required border-bottom> |
| | | <u-input |
| | | v-model="form.customerName" |
| | | label="客户名称" |
| | | placeholder="请输入客户名称" |
| | | required |
| | | name="customerName" |
| | | clearable |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="form.contact" |
| | | label="联系人" |
| | | </u-form-item> |
| | | <u-form-item label="联系人" prop="contactPerson" border-bottom> |
| | | <u-input |
| | | v-model="form.contactPerson" |
| | | placeholder="请输入联系人" |
| | | name="contact" |
| | | clearable |
| | | readonly |
| | | /> |
| | | <van-field |
| | | </u-form-item> |
| | | <u-form-item label="联系电话" prop="contactPhone" border-bottom> |
| | | <u-input |
| | | v-model="form.contactPhone" |
| | | label="联系电话" |
| | | placeholder="请输入联系电话" |
| | | name="contactPhone" |
| | | clearable |
| | | readonly |
| | | /> |
| | | </van-cell-group> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | |
| | | <!-- 拜访信息 --> |
| | | <van-cell-group title="拜访信息" inset> |
| | | <van-field |
| | | v-model="form.visitingPeople" |
| | | label="拜访人" |
| | | placeholder="拜访人" |
| | | name="visitingPeople" |
| | | readonly |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.purposeVisit" |
| | | label="拜访目的" |
| | | <u-cell-group title="拜访信息"> |
| | | <u-form-item label="拜访目的" prop="visitPurpose" required border-bottom> |
| | | <u-input |
| | | v-model="form.visitPurpose" |
| | | placeholder="请输入拜访目的" |
| | | name="purposeVisit" |
| | | required |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.purposeDate" |
| | | label="拜访时间" |
| | | </u-form-item> |
| | | <u-form-item label="拜访时间" prop="visitTime" required border-bottom> |
| | | <u-input |
| | | v-model="form.visitTime" |
| | | placeholder="请选择拜访时间" |
| | | name="purposeDate" |
| | | required |
| | | readonly |
| | | @click="showTimePicker" |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.visitAddress" |
| | | label="当前位置" |
| | | placeholder="点击获取当前位置" |
| | | name="visitAddress" |
| | | :readonly="true" |
| | | :disabled="true" |
| | | type="textarea" |
| | | @click="getCurrentLocation" |
| | | clearable |
| | | </u-form-item> |
| | | <u-form-item label="拜访地点" prop="visitLocation" required border-bottom> |
| | | <u-input |
| | | v-model="form.visitLocation" |
| | | placeholder="请输入拜访地点" |
| | | > |
| | | <template #right-icon> |
| | | <van-icon name="location-o" @click.stop="getCurrentLocation" class="location-icon" /> |
| | | <template #suffix> |
| | | <u-icon name="map" @click.stop="getCurrentLocation" class="location-icon" /> |
| | | </template> |
| | | </van-field> |
| | | </van-cell-group> |
| | | </u-input> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | |
| | | <!-- 备注信息 --> |
| | | <van-cell-group title="备注信息" inset> |
| | | <van-field |
| | | <u-cell-group title="备注信息"> |
| | | <u-form-item label="备注" prop="remark" border-bottom> |
| | | <u-textarea |
| | | v-model="form.remark" |
| | | label="备注" |
| | | name="remark" |
| | | type="textarea" |
| | | placeholder="请输入备注信息" |
| | | rows="3" |
| | | autosize |
| | | clearable |
| | | :maxlength="200" |
| | | count |
| | | :autoHeight="true" |
| | | /> |
| | | </van-cell-group> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="sign-btn" native-type="submit" form-type="submit" :loading="loading">签到</van-button> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="sign-btn" type="primary" @click="handleSignIn" :loading="loading">签到</u-button> |
| | | </view> |
| | | </van-form> |
| | | </u-form> |
| | | |
| | | <!-- 时间选择器 --> |
| | | <van-popup v-model:show="showTime" position="bottom"> |
| | | <van-date-picker |
| | | <u-popup v-model="showTime" mode="bottom"> |
| | | <u-datetime-picker |
| | | v-model="currentTime" |
| | | type="datetime" |
| | | title="选择时间" |
| | | @confirm="onTimeConfirm" |
| | | @cancel="showTime = false" |
| | | title="选择拜访时间" |
| | | /> |
| | | </van-popup> |
| | | </u-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | import { ref, onMounted } from 'vue' |
| | | import { onShow } from '@dcloudio/uni-app' |
| | | import PageHeader from '@/components/PageHeader.vue' |
| | | import { clientVisitSignIn } from '@/api/cooperativeOffice/clientVisit' |
| | | import useUserStore from "@/store/modules/user" |
| | | import { showToast } from 'vant' |
| | | import dayjs from "dayjs" |
| | | |
| | | const userStore = useUserStore() |
| | |
| | | // 客户拜访 |
| | | <template> |
| | | <view class="client-visit-list"> |
| | | <!-- 使用通用页面头部组件 --> |
| | | <PageHeader title="客户拜访" @back="goBack" /> |
| | | |
| | | <!-- 搜索和筛选区域 --> |
| | | <view class="search-filter-section"> |
| | | <view class="search-bar"> |
| | | <view class="search-input"> |
| | | <input |
| | | class="search-text" |
| | | placeholder="请输入客户名称" |
| | | v-model="customerName" |
| | | confirm-type="search" |
| | | @confirm="getList" |
| | | /> |
| | | <view> |
| | | <view class="page-header"> |
| | | <view class="header-left"> |
| | | <up-icon name="arrow-left" size="20" color="#333" @click="goBack"></up-icon> |
| | | </view> |
| | | <view class="filter-button" @click="getList"> |
| | | <up-icon name="search" size="24" color="#999"></up-icon> |
| | | <view class="header-center"> |
| | | <text class="page-title">客户拜访</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 拜访记录列表 --> |
| | | <view class="visit-list" v-if="visitList.length > 0"> |
| | | <view v-for="(item, index) in visitList" :key="index"> |
| | | <view class="visit-item"> |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | | <up-icon name="user" size="16" color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-id">客户:{{ item.customerName }}</text> |
| | | </view> |
| | | <view class="visit-status"> |
| | | <!-- 替换标签和按钮 --> |
| | | <template> |
| | | <u-tag type="success">已完成</u-tag> |
| | | |
| | | <!-- 操作按钮 --> |
| | | <view class="action-buttons"> |
| | | <u-button |
| | | type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="openDetail(item)" |
| | | > |
| | | 查看详情 |
| | | </u-button> |
| | | <u-button |
| | | type="warning" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="editVisit(item)" |
| | | > |
| | | 编辑 |
| | | </u-button> |
| | | </view> |
| | | </template> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | | |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">联系人</text> |
| | | <text class="detail-value">{{ item.contact || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">联系电话</text> |
| | | <text class="detail-value">{{ item.contactPhone || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">拜访目的</text> |
| | | <text class="detail-value">{{ item.purposeVisit || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">拜访时间</text> |
| | | <text class="detail-value">{{ item.purposeDate }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">拜访地址</text> |
| | | <text class="detail-value">{{ item.visitAddress || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">拜访人</text> |
| | | <text class="detail-value">{{ item.visitingPeople || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row" v-if="item.remark"> |
| | | <text class="detail-label">备注</text> |
| | | <text class="detail-value">{{ item.remark }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 按钮区域 --> |
| | | <view class="action-buttons"> |
| | | <van-button |
| | | type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="viewDetail(item.id)" |
| | | > |
| | | 查看详情 |
| | | </van-button> |
| | | <van-button |
| | | type="danger" |
| | | size="small" |
| | | plain |
| | | class="action-btn" |
| | | @click="deleteRecord(item.id)" |
| | | > |
| | | 删除 |
| | | </van-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-else class="no-data"> |
| | | <text>暂无拜访记录</text> |
| | | </view> |
| | | |
| | | <!-- 浮动新增按钮 --> |
| | | <view class="fab-button" @click="addVisit"> |
| | | <up-icon name="plus" size="24" color="#ffffff"></up-icon> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted } from 'vue' |
| | | import { onShow } from '@dcloudio/uni-app' |
| | | import PageHeader from '@/components/PageHeader.vue' |
| | | import { getVisitRecords, deleteVisitRecord } from '@/api/cooperativeOffice/clientVisit' |
| | | import useUserStore from "@/store/modules/user" |
| | | // 替换 Vant 的 toast |
| | | // import { showToast } from 'vant' |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | title: '客户拜访' |
| | | } |
| | | }, |
| | | methods: { |
| | | goBack() { |
| | | uni.navigateBack({ |
| | | delta: 1 |
| | | }) |
| | | } |
| | | import dayjs from "dayjs" |
| | | |
| | | const userStore = useUserStore() |
| | | |
| | | // 搜索关键词 |
| | | const customerName = ref('') |
| | | |
| | | // 拜访记录数据 |
| | | const visitList = ref([]) |
| | | |
| | | // 返回上一页 |
| | | const goBack = () => { |
| | | uni.navigateBack() |
| | | } |
| | | |
| | | // 格式化日期时间 |
| | | const formatDateTime = (dateStr) => { |
| | | if (!dateStr) return '' |
| | | return dayjs(dateStr).format("YYYY-MM-DD HH:mm") |
| | | } |
| | | |
| | | // 查询列表 |
| | | const getList = () => { |
| | | const params = { |
| | | current: -1, |
| | | size: -1, |
| | | customerName: customerName.value || undefined, |
| | | } |
| | | getVisitRecords(params) |
| | | .then((res) => { |
| | | visitList.value = res.records || res.data?.records || [] |
| | | }) |
| | | .catch(() => { |
| | | showToast('获取数据失败') |
| | | }) |
| | | } |
| | | |
| | | // 新增拜访 - 跳转到登记页面 |
| | | const addVisit = () => { |
| | | uni.navigateTo({ |
| | | url: '/pages/cooperativeOffice/clientVisit/detail' |
| | | }) |
| | | } |
| | | |
| | | // 查看详情 |
| | | const viewDetail = (id) => { |
| | | if (!id) return |
| | | uni.navigateTo({ |
| | | url: `/pages/cooperativeOffice/clientVisit/detail?id=${id}` |
| | | }) |
| | | } |
| | | |
| | | // 删除记录 |
| | | const deleteRecord = async (id) => { |
| | | if (!id) return |
| | | uni.showModal({ |
| | | title: '提示', |
| | | content: '此操作将永久删除该拜访记录, 是否继续?', |
| | | success: async (res) => { |
| | | if (!res.confirm) return |
| | | try { |
| | | await deleteVisitRecord(id) |
| | | showToast('删除成功') |
| | | getList() |
| | | } catch (e) { |
| | | showToast('删除失败') |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getList() |
| | | }) |
| | | |
| | | onShow(() => { |
| | | getList() |
| | | }) |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .u-divider { |
| | | margin: 0 !important; |
| | | } |
| | | |
| | | .client-visit-list { |
| | | min-height: 100vh; |
| | | background: #f8f9fa; |
| | | position: relative; |
| | | padding-bottom: 80px; |
| | | } |
| | | |
| | | .search-filter-section { |
| | | <style> |
| | | .page-header { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | padding: 10px 20px; |
| | | background: #ffffff; |
| | | background-color: #f5f5f5; |
| | | position: relative; |
| | | } |
| | | |
| | | .search-bar { |
| | | .header-left { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .search-input { |
| | | .header-center { |
| | | flex: 1; |
| | | background: #f5f5f5; |
| | | border-radius: 24px; |
| | | padding: 10px 16px; |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .search-text { |
| | | flex: 1; |
| | | font-size: 14px; |
| | | color: #333; |
| | | background: transparent; |
| | | border: none; |
| | | outline: none; |
| | | } |
| | | |
| | | .search-text::placeholder { |
| | | color: #999; |
| | | } |
| | | |
| | | .filter-button { |
| | | width: 40px; |
| | | height: 40px; |
| | | border-radius: 8px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .visit-list { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .visit-item { |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | margin-bottom: 16px; |
| | | overflow: hidden; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); |
| | | padding: 0 16px; |
| | | } |
| | | |
| | | .item-header { |
| | | padding: 16px 0; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | position: absolute; |
| | | left: 0; |
| | | right: 0; |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .item-left { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .document-icon { |
| | | width: 24px; |
| | | height: 24px; |
| | | background: #667eea; |
| | | border-radius: 4px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .item-id { |
| | | font-size: 14px; |
| | | color: #333; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .visit-status { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .item-details { |
| | | padding: 16px 0; |
| | | } |
| | | |
| | | .detail-row { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | justify-content: space-between; |
| | | margin-bottom: 8px; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | |
| | | .detail-label { |
| | | font-size: 12px; |
| | | color: #777777; |
| | | min-width: 60px; |
| | | } |
| | | |
| | | .detail-value { |
| | | font-size: 12px; |
| | | color: #000000; |
| | | text-align: right; |
| | | flex: 1; |
| | | margin-left: 16px; |
| | | word-break: break-all; |
| | | } |
| | | |
| | | .no-data { |
| | | padding: 40px 0; |
| | | text-align: center; |
| | | color: #999; |
| | | } |
| | | |
| | | .action-buttons { |
| | | display: flex; |
| | | gap: 12px; |
| | | padding: 0 0 16px 0; |
| | | justify-content: space-between; |
| | | } |
| | | |
| | | .action-btn { |
| | | flex: 1; |
| | | } |
| | | |
| | | .fab-button { |
| | | position: fixed; |
| | | bottom: calc(30px + env(safe-area-inset-bottom)); |
| | | right: 30px; |
| | | width: 56px; |
| | | height: 56px; |
| | | background: #667eea; |
| | | border-radius: 50%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3); |
| | | z-index: 1000; |
| | | .page-title { |
| | | font-size: 18px; |
| | | font-weight: bold; |
| | | pointer-events: auto; |
| | | } |
| | | </style> |
| | | |
| | |
| | | justify-content: flex-end; |
| | | } |
| | | </style> |
| | | |
| | | <template> |
| | | <!-- 审批意见 --> |
| | | <u-form-item label="审批意见" prop="approveComment" border-bottom> |
| | | <u-textarea |
| | | v-model="form.approveComment" |
| | | placeholder="请输入审批意见" |
| | | :maxlength="200" |
| | | count |
| | | :autoHeight="true" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 操作按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="reject-btn" type="error" @click="handleReject">驳回</u-button> |
| | | <u-button class="approve-btn" type="success" @click="handleApprove">通过</u-button> |
| | | </view> |
| | | </template> |
| | |
| | | <view class="contact-details"> |
| | | <text class="contact-name">{{ selectedContact.nickName }}</text> |
| | | </view> |
| | | <u-icon name="close" size="16" color="#999" @click="clearSelected" /> |
| | | <van-icon name="cross" size="16" color="#999" @click="clearSelected" /> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | 100% { |
| | | transform: scale(1.2); |
| | | opacity: 0; |
| | | } |
| | | } |
| | | </style> |
| | | |
| | | <style lang="scss"> |
| | | /* 更新样式类名 */ |
| | | :deep(.u-radio) { |
| | | .u-radio__icon { |
| | | width: 20px; |
| | | height: 20px; |
| | | border: 2px solid #ddd; |
| | | border-radius: 50%; |
| | | background: #fff; |
| | | position: relative; |
| | | transition: all 0.2s; |
| | | |
| | | &::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 50%; |
| | | left: 50%; |
| | | transform: translate(-50%, -50%) scale(0); |
| | | width: 8px; |
| | | height: 8px; |
| | | background: #006cfb; |
| | | border-radius: 50%; |
| | | transition: transform 0.2s; |
| | | } |
| | | } |
| | | |
| | | &.u-radio--checked { |
| | | .u-radio__icon { |
| | | border-color: #006cfb; |
| | | background: #fff; |
| | | |
| | | &::before { |
| | | transform: translate(-50%, -50%) scale(1); |
| | | } |
| | | |
| | | &::after { |
| | | content: ''; |
| | | position: absolute; |
| | | top: -2px; |
| | | left: -2px; |
| | | right: -2px; |
| | | bottom: -2px; |
| | | border: 2px solid rgba(0, 108, 251, 0.2); |
| | | border-radius: 50%; |
| | | animation: ripple 0.6s ease-out; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | |
| | | <!-- 表单区域 --> |
| | | <view class="form-section"> |
| | | <u-form ref="formRef" @submit="submitForm" input-align="right" error-message-align="right"> |
| | | <u-cell-group style="margin-bottom: 16px;"> |
| | | <u-form-item label="申请事由" prop="approveReason" required> |
| | | <u-textarea |
| | | <van-form ref="formRef" @submit="submitForm" :rules="rules" input-align="right" error-message-align="right" scroll-to-error scroll-to-error-position="center"> |
| | | <van-cell-group style="margin-bottom: 16px;"> |
| | | <van-field |
| | | v-model="form.approveReason" |
| | | name="approveReason" |
| | | rows="2" |
| | | autosize |
| | | label="申请事由" |
| | | type="textarea" |
| | | maxlength="200" |
| | | :rules="[{ required: true, message: '申请事由不能为空' }]" |
| | | placeholder="请输入申请事由" |
| | | :maxlength="200" |
| | | count |
| | | :autoHeight="true" |
| | | show-word-limit |
| | | required |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | <u-cell-group> |
| | | <u-form-item label="申请部门" prop="approveDeptName" required> |
| | | <u-input |
| | | </van-cell-group> |
| | | <van-cell-group> |
| | | <van-field |
| | | v-model="form.approveDeptName" |
| | | readonly |
| | | name="picker" |
| | | label="申请部门" |
| | | placeholder="请选择申请部门" |
| | | :rules="[{ required: true, message: '请选择申请部门' }]" |
| | | @click="showPicker = true" |
| | | required |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="申请人" prop="approveUserName" required> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.approveUserName" |
| | | name="taxPrice" |
| | | label="申请人" |
| | | placeholder="请输入申请人" |
| | | :rules="[{ required: true, message: '申请人不能为空' }]" |
| | | required |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-popup v-model="showPicker" mode="bottom"> |
| | | <u-picker |
| | | <van-popup |
| | | v-model:show="showPicker" |
| | | position="bottom" |
| | | > |
| | | <van-picker |
| | | :columns="productOptions" |
| | | v-model="pickerValue" |
| | | :model-value="pickerValue" |
| | | @confirm="onConfirm" |
| | | @cancel="showPicker = false" |
| | | /> |
| | | </u-popup> |
| | | <u-form-item label="申请日期" prop="approveTime" required> |
| | | <u-input |
| | | </van-popup> |
| | | <van-field |
| | | v-model="form.approveTime" |
| | | label="申请日期" |
| | | placeholder="请选择" |
| | | readonly |
| | | required |
| | | @click="showDatePicker" |
| | | :rules="[{ required: true, message: '请选择来款日期' }]" |
| | | /> |
| | | </u-form-item> |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showDate" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="选择日期" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </u-popup> |
| | | </u-cell-group> |
| | | </u-form> |
| | | </van-popup> |
| | | </van-cell-group> |
| | | </van-form> |
| | | </view> |
| | | <!-- 审核流程区域 --> |
| | | <view class="approval-process"> |
| | |
| | | </view> |
| | | <view v-else class="add-approver-btn" @click="addApprover(stepIndex)"> |
| | | <view class="add-circle">+</view> |
| | | <text class="add-text">添加审批人</text> |
| | | <text class="add-label">选择审批人</text> |
| | | </view> |
| | | </view> |
| | | <view class="step-line" v-if="stepIndex < approverNodes.length - 1"></view> |
| | | <view class="delete-step-btn" v-if="approverNodes.length > 1" @click="removeApprovalStep(stepIndex)">删除节点</view> |
| | | </view> |
| | | </view> |
| | | |
| | | <u-button icon="plus" plain type="primary" style="width: 100%" @click="addApprovalStep">新增节点</u-button> |
| | | <view class="add-step-btn"> |
| | | <van-button icon="plus" plain type="primary" style="width: 100%" @click="addApprovalStep">新增节点</van-button> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 底部按钮 --> |
| | |
| | | </view> |
| | | <text class="item-id">{{ item.approveId }}</text> |
| | | </view> |
| | | <!-- 审批状态标签 --> |
| | | <u-tag :type="getTagClass(item.approveStatus)" size="medium">{{ formatReceiptType(item.approveStatus) }}</u-tag> |
| | | |
| | | <!-- 操作按钮 --> |
| | | <view class="action-buttons"> |
| | | <u-button |
| | | type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="openDetail(item)" |
| | | > |
| | | 查看详情 |
| | | </u-button> |
| | | <u-button |
| | | type="success" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="approve(item)" |
| | | > |
| | | 审批 |
| | | </u-button> |
| | | <view class="item-tag"> |
| | | <van-tag :type="getTagClass(item.approveStatus)" size="medium">{{ formatReceiptType(item.approveStatus) }}</van-tag> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | |
| | | <view v-else class="no-data"> |
| | | <text>暂无审批数据</text> |
| | | </view> |
| | | <!-- <van-floating-bubble icon="plus" @click="handleAdd"/>--> |
| | | <!-- 浮动操作按钮 --> |
| | | <view class="fab-button" @click="handleAdd"> |
| | | <up-icon name="plus" size="24" color="#ffffff"></up-icon> |
| | |
| | | .action-btn.approve { |
| | | /* success 样式来自组件,这里保留钩子以便后续需要扩展 */ |
| | | } |
| | | :deep(.van-floating-bubble) { |
| | | background: #ed8d05; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <view class="equipment-detail"> |
| | | <view class="ledger-detail"> |
| | | <!-- 使用通用页面头部组件 --> |
| | | <PageHeader title="设备台账详情" @back="goBack" /> |
| | | <PageHeader :title="operationType === 'edit' ? '编辑设备台账' : '新增设备台账'" @back="goBack" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="sendForm" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <van-form @submit="sendForm" 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="设备名称" prop="deviceName" required border-bottom> |
| | | <u-input |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field |
| | | v-model="form.deviceName" |
| | | label="设备名称" |
| | | placeholder="请输入设备名称" |
| | | :rules="formRules.deviceName" |
| | | required |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="规格型号" prop="deviceModel" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.deviceModel" |
| | | label="规格型号" |
| | | placeholder="请输入规格型号" |
| | | :readonly="form.deviceModel != null && operationType === 'edit'" |
| | | :rules="formRules.deviceModel" |
| | | required |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="设备编号" prop="deviceNumber" required border-bottom> |
| | | <u-input |
| | | v-model="form.deviceNumber" |
| | | placeholder="请输入设备编号" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="购买日期" prop="purchaseDate" required border-bottom> |
| | | <u-input |
| | | v-model="form.purchaseDate" |
| | | placeholder="请选择购买日期" |
| | | readonly |
| | | @click="showDatePicker" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="购买价格" prop="purchasePrice" required border-bottom> |
| | | <u-input |
| | | v-model="form.purchasePrice" |
| | | type="number" |
| | | placeholder="请输入购买价格" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="供应商" prop="supplier" required border-bottom> |
| | | <u-input |
| | | v-model="form.supplier" |
| | | <van-field |
| | | v-model="form.supplierName" |
| | | label="供应商" |
| | | required |
| | | placeholder="请输入供应商" |
| | | :rules="formRules.supplierName" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="使用部门" prop="department" required border-bottom> |
| | | <u-input |
| | | v-model="form.department" |
| | | placeholder="请输入使用部门" |
| | | <van-field |
| | | v-model="form.unit" |
| | | label="单位" |
| | | required |
| | | placeholder="请输入单位" |
| | | :rules="formRules.unit" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="税率" prop="taxRate" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.taxRate" |
| | | placeholder="请选择税率" |
| | | required |
| | | label="税率(%)" |
| | | placeholder="请选择" |
| | | readonly |
| | | :rules="formRules.taxRate" |
| | | @click="showTaxRatePicker" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="使用状态" prop="status" required border-bottom> |
| | | <u-input |
| | | v-model="form.status" |
| | | placeholder="请输入使用状态" |
| | | <van-field |
| | | v-model="form.number" |
| | | label="数量" |
| | | required |
| | | type="number" |
| | | placeholder="请输入数量" |
| | | :rules="formRules.number" |
| | | @blur="mathNum" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="备注" border-bottom> |
| | | <u-textarea |
| | | v-model="form.remark" |
| | | placeholder="请输入备注" |
| | | :maxlength="200" |
| | | count |
| | | :autoHeight="true" |
| | | <van-field |
| | | v-model="form.taxIncludingPriceUnit" |
| | | label="含税单价" |
| | | required |
| | | type="number" |
| | | placeholder="请输入含税单价" |
| | | :rules="formRules.taxIncludingPriceUnit" |
| | | @blur="mathNum" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | <van-field |
| | | v-model="form.taxIncludingPriceTotal" |
| | | label="含税总价" |
| | | placeholder="自动生成" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="form.unTaxIncludingPriceTotal" |
| | | label="不含税总价" |
| | | placeholder="自动生成" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="form.createTime" |
| | | label="录入日期" |
| | | placeholder="请选择" |
| | | readonly |
| | | @click="showDatePicker" |
| | | required |
| | | clearable |
| | | /> |
| | | </van-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="sendForm" :loading="loading">保存</u-button> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | |
| | | <!-- 税率选择器 --> |
| | | <u-popup v-model="showTaxRate" mode="bottom"> |
| | | <u-picker |
| | | v-model="taxRatePickerValue" |
| | | <van-popup v-model:show="showTaxRate" position="bottom"> |
| | | <van-picker |
| | | :model-value="taxRatePickerValue" |
| | | :columns="taxRateOptions" |
| | | @confirm="onTaxRateConfirm" |
| | | @cancel="showTaxRate = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showDate" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="选择日期" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // 替换 Vant 的 toast |
| | | // import { showToast } from 'vant'; |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | import { ref, computed, onMounted } from 'vue'; |
| | | import { onShow } from '@dcloudio/uni-app'; |
| | | import PageHeader from '@/components/PageHeader.vue'; |
| | |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 按钮区域 - 替换为 uview-plus 按钮 --> |
| | | <!-- 按钮区域,参考 invoiceLedger 的样式 --> |
| | | <view class="action-buttons"> |
| | | <u-button |
| | | <van-button |
| | | type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="edit(item.id)" |
| | | > |
| | | 编辑 |
| | | </u-button> |
| | | <u-button |
| | | type="error" |
| | | </van-button> |
| | | <van-button |
| | | type="danger" |
| | | size="small" |
| | | plain |
| | | class="action-btn" |
| | | @click="deleteRow(item.id)" |
| | | > |
| | | 删除 |
| | | </u-button> |
| | | </van-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | import PageHeader from '@/components/PageHeader.vue' |
| | | import { getLedgerPage, delLedger } from '@/api/equipmentManagement/ledger' |
| | | import useUserStore from "@/store/modules/user" |
| | | // 替换 Vant 的 toast |
| | | // import { showToast } from 'vant'; |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | import { showToast } from 'vant'; |
| | | |
| | | const userStore = useUserStore() |
| | | |
| | |
| | | color: #999; |
| | | } |
| | | |
| | | // 按钮样式 |
| | | // 按钮样式,参考 invoiceLedger |
| | | .action-buttons { |
| | | display: flex; |
| | | gap: 12px; |
| | |
| | | <PageHeader :title="operationType === 'edit' ? '编辑报修' : '新增报修'" @back="goBack" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="sendForm" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <van-form @submit="sendForm" 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="设备名称" prop="deviceLedgerId" required> |
| | | <u-input |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field |
| | | v-model="deviceNameText" |
| | | label="设备名称" |
| | | placeholder="请选择设备名称" |
| | | :rules="formRules.deviceLedgerId" |
| | | required |
| | | readonly |
| | | @click="showDevicePicker" |
| | | clearable |
| | | > |
| | | <template #suffix> |
| | | <u-icon name="scan" @click.stop="startScan" class="scan-icon" /> |
| | | <template #right-icon> |
| | | <van-icon name="scan" @click.stop="startScan" class="scan-icon" /> |
| | | </template> |
| | | </u-input> |
| | | </u-form-item> |
| | | <u-form-item label="规格型号"> |
| | | <u-input |
| | | </van-field> |
| | | <van-field |
| | | v-model="form.deviceModel" |
| | | label="规格型号" |
| | | placeholder="请输入规格型号" |
| | | readonly |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="报修日期" prop="repairTime" required> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.repairTime" |
| | | label="报修日期" |
| | | placeholder="请选择报修日期" |
| | | :rules="formRules.repairTime" |
| | | required |
| | | readonly |
| | | @click="showDatePicker" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="报修人" prop="repairName" required> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.repairName" |
| | | label="报修人" |
| | | placeholder="请输入报修人" |
| | | :rules="formRules.repairName" |
| | | required |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="故障现象" prop="remark" required> |
| | | <u-textarea |
| | | <van-field |
| | | v-model="form.remark" |
| | | label="故障现象" |
| | | type="textarea" |
| | | rows="3" |
| | | placeholder="请输入故障现象" |
| | | :maxlength="200" |
| | | count |
| | | :autoHeight="true" |
| | | :rules="formRules.remark" |
| | | required |
| | | clearable |
| | | maxlength="200" |
| | | show-word-limit |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | </van-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="sendForm" :loading="loading">保存</u-button> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | |
| | | <!-- 设备选择器 --> |
| | | <u-popup v-model="showDevice" mode="bottom"> |
| | | <u-picker |
| | | v-model="devicePickerValue" |
| | | <van-popup v-model:show="showDevice" position="bottom"> |
| | | <van-picker |
| | | :model-value="devicePickerValue" |
| | | :columns="deviceColumns" |
| | | @confirm="onDeviceConfirm" |
| | | @cancel="showDevice = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showDate" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="选择日期" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | import { getDeviceLedger } from '@/api/equipmentManagement/ledger'; |
| | | import { addRepair, editRepair, getRepairById } from '@/api/equipmentManagement/repair'; |
| | | import dayjs from "dayjs"; |
| | | // 替换 Vant 的 toast |
| | | // import { showToast } from 'vant'; |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | import { showToast } from 'vant'; |
| | | |
| | | defineOptions({ |
| | | name: "设备报修表单", |
| | |
| | | <text class="item-id">设备名称:{{ item.deviceName }}</text> |
| | | </view> |
| | | <view class="status-tag"> |
| | | <!-- 替换标签和按钮 --> |
| | | <!-- 状态标签 --> |
| | | <u-tag v-if="item.status === 1" type="success">完结</u-tag> |
| | | <u-tag v-if="item.status === 0" type="error">待维修</u-tag> |
| | | |
| | | <!-- 操作按钮 --> |
| | | <view class="action-buttons"> |
| | | <u-button |
| | | type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="openForm('add')" |
| | | > |
| | | 新增报修 |
| | | </u-button> |
| | | <u-button |
| | | type="warning" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="openForm('edit', item)" |
| | | > |
| | | 编辑 |
| | | </u-button> |
| | | <u-button |
| | | type="success" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="maintain(item)" |
| | | > |
| | | 维修 |
| | | </u-button> |
| | | </view> |
| | | <van-tag v-if="item.status === 1" type="success">完结</van-tag> |
| | | <van-tag v-if="item.status === 0" type="danger">待维修</van-tag> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | |
| | | </view> |
| | | |
| | | <!-- 浮动气泡按钮 --> |
| | | <view class="fab-button" @click="addRepair"> |
| | | <up-icon name="plus" size="24" color="#ffffff"></up-icon> |
| | | </view> |
| | | <van-floating-bubble |
| | | axis="xy" |
| | | icon="plus" |
| | | @click="addRepair" |
| | | /> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | import PageHeader from '@/components/PageHeader.vue' |
| | | import { getRepairPage, delRepair } from '@/api/equipmentManagement/repair' |
| | | import useUserStore from "@/store/modules/user" |
| | | // 替换 Vant 的 toast |
| | | // import { showToast } from 'vant'; |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | import { showToast } from 'vant'; |
| | | |
| | | const userStore = useUserStore() |
| | | |
| | |
| | | <template> |
| | | <view class="repair-maintain"> |
| | | <!-- 使用通用页面头部组件 --> |
| | | <PageHeader title="设备维修" @back="goBack" /> |
| | | <PageHeader title="新增维修" @back="goBack" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="sendForm" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <!-- 维修信息 --> |
| | | <u-cell-group title="维修信息"> |
| | | <u-form-item label="实际维修人" prop="repairPerson" required border-bottom> |
| | | <u-input |
| | | v-model="form.repairPerson" |
| | | placeholder="请输入实际维修人" |
| | | <van-form @submit="sendForm" ref="formRef" label-width="110px" input-align="right" error-message-align="right" scroll-to-error scroll-to-error-position="center"> |
| | | <!-- 基本信息 --> |
| | | <van-cell-group title="维修信息" inset> |
| | | <van-field |
| | | v-model="form.maintenanceName" |
| | | label="维修人" |
| | | placeholder="请输入维修人" |
| | | :rules="formRules.maintenanceName" |
| | | required |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="实际维修日期" prop="repairDate" required border-bottom> |
| | | <u-input |
| | | v-model="form.repairDate" |
| | | placeholder="请选择实际维修日期" |
| | | <van-field |
| | | v-model="form.maintenanceResult" |
| | | label="维修结果" |
| | | type="textarea" |
| | | rows="3" |
| | | placeholder="请输入维修结果" |
| | | :rules="formRules.maintenanceResult" |
| | | required |
| | | clearable |
| | | maxlength="200" |
| | | show-word-limit |
| | | /> |
| | | <van-field |
| | | v-model="form.maintenanceTime" |
| | | label="维修日期" |
| | | placeholder="请选择维修日期" |
| | | :rules="formRules.maintenanceTime" |
| | | required |
| | | readonly |
| | | @click="showDatePicker" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="维修结果" prop="repairResult" required border-bottom> |
| | | <u-textarea |
| | | v-model="form.repairResult" |
| | | placeholder="请输入维修结果" |
| | | :maxlength="200" |
| | | count |
| | | :autoHeight="true" |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | </van-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="sendForm" :loading="loading">保存</u-button> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showDate" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="选择日期" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | import { addMaintain } from '@/api/equipmentManagement/repair'; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import dayjs from "dayjs"; |
| | | // 替换 Vant 的 toast |
| | | // import { showToast } from 'vant'; |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | import { showToast } from 'vant'; |
| | | |
| | | defineOptions({ |
| | | name: "设备维修表单", |
| | |
| | | <template> |
| | | <view class="upkeep-add"> |
| | | <!-- 使用通用页面头部组件 --> |
| | | <PageHeader title="新增保养" @back="goBack" /> |
| | | <PageHeader :title="operationType === 'edit' ? '编辑保养计划' : '新增保养计划'" @back="goBack" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="sendForm" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <van-form @submit="sendForm" 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="设备名称" prop="deviceName" required border-bottom> |
| | | <u-input |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field |
| | | v-model="deviceNameText" |
| | | label="设备名称" |
| | | placeholder="请选择设备名称" |
| | | :rules="formRules.deviceLedgerId" |
| | | required |
| | | readonly |
| | | @click="showDevicePicker" |
| | | clearable |
| | | > |
| | | <template #suffix> |
| | | <u-icon name="scan" @click.stop="startScan" class="scan-icon" /> |
| | | <template #right-icon> |
| | | <van-icon name="scan" @click.stop="startScan" class="scan-icon" /> |
| | | </template> |
| | | </u-input> |
| | | </u-form-item> |
| | | <u-form-item label="规格型号" border-bottom> |
| | | <u-input |
| | | </van-field> |
| | | <van-field |
| | | v-model="form.deviceModel" |
| | | label="规格型号" |
| | | placeholder="请输入规格型号" |
| | | readonly |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="保养日期" prop="upkeepDate" required border-bottom> |
| | | <u-input |
| | | v-model="form.upkeepDate" |
| | | placeholder="请选择保养日期" |
| | | <van-field |
| | | v-model="form.maintenancePlanTime" |
| | | label="计划保养日期" |
| | | placeholder="请选择计划保养日期" |
| | | :rules="formRules.maintenancePlanTime" |
| | | required |
| | | readonly |
| | | @click="showDatePicker" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | </van-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="sendForm" :loading="loading">保存</u-button> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | |
| | | <!-- 设备选择器 --> |
| | | <u-popup v-model="showDevice" mode="bottom"> |
| | | <u-picker |
| | | v-model="devicePickerValue" |
| | | <van-popup v-model:show="showDevice" position="bottom"> |
| | | <van-picker |
| | | :model-value="devicePickerValue" |
| | | :columns="deviceColumns" |
| | | @confirm="onDeviceConfirm" |
| | | @cancel="showDevice = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showDate" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="选择日期" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // 替换 Vant 的 toast |
| | | // import { showToast } from 'vant'; |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | import { ref, computed, onMounted, onUnmounted } from 'vue'; |
| | | import { onShow } from '@dcloudio/uni-app'; |
| | | import PageHeader from '@/components/PageHeader.vue'; |
| | |
| | | <text class="item-id">设备名称:{{ item.deviceName }}</text> |
| | | </view> |
| | | <view class="status-tag"> |
| | | <!-- 替换标签和按钮 --> |
| | | <!-- 状态标签 --> |
| | | <u-tag v-if="item.status === 1" type="success">完结</u-tag> |
| | | <u-tag v-if="item.status === 0" type="error">待保养</u-tag> |
| | | |
| | | <!-- 保养结果标签 --> |
| | | <u-tag v-if="item.maintenanceResult === 1" type="success"> |
| | | 完好 |
| | | </u-tag> |
| | | <u-tag v-if="item.maintenanceResult === 0" type="error"> |
| | | 维修 |
| | | </u-tag> |
| | | |
| | | <!-- 操作按钮 --> |
| | | <view class="action-buttons"> |
| | | <u-button |
| | | type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="openForm('add')" |
| | | > |
| | | 新增保养 |
| | | </u-button> |
| | | <u-button |
| | | type="warning" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="openForm('edit', item)" |
| | | > |
| | | 编辑 |
| | | </u-button> |
| | | <u-button |
| | | type="success" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="maintain(item)" |
| | | > |
| | | 保养 |
| | | </u-button> |
| | | </view> |
| | | <van-tag v-if="item.status === 1" type="success">完结</van-tag> |
| | | <van-tag v-if="item.status === 0" type="danger">待保养</van-tag> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | |
| | | <text>暂无设备保养数据</text> |
| | | </view> |
| | | |
| | | <view class="fab-button" @click="addPlan"> |
| | | <up-icon name="plus" size="24" color="#ffffff"></up-icon> |
| | | </view> |
| | | <!-- 浮动气泡按钮 --> |
| | | <van-floating-bubble |
| | | axis="xy" |
| | | icon="plus" |
| | | @click="addPlan" |
| | | /> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | import PageHeader from '@/components/PageHeader.vue' |
| | | import { getUpkeepPage, delUpkeep } from '@/api/equipmentManagement/upkeep' |
| | | import useUserStore from "@/store/modules/user" |
| | | // 替换 Vant 的 toast |
| | | // import { showToast } from 'vant'; |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | import { showToast } from 'vant'; |
| | | import dayjs from "dayjs" |
| | | |
| | | const userStore = useUserStore() |
| | |
| | | <PageHeader title="新增保养" @back="goBack" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="sendForm" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <van-form @submit="sendForm" 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="实际保养人" prop="maintenanceActuallyName" required> |
| | | <u-input |
| | | <van-cell-group title="保养信息" inset> |
| | | <van-field |
| | | v-model="form.maintenanceActuallyName" |
| | | label="实际保养人" |
| | | placeholder="请输入实际保养人" |
| | | :rules="formRules.maintenanceActuallyName" |
| | | required |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="实际保养日期" prop="maintenanceActuallyTime" required> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.maintenanceActuallyTime" |
| | | label="实际保养日期" |
| | | placeholder="请选择实际保养日期" |
| | | :rules="formRules.maintenanceActuallyTime" |
| | | required |
| | | readonly |
| | | @click="showDatePicker" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="保养结果" prop="maintenanceResult" required> |
| | | <u-input |
| | | <van-field |
| | | v-model="maintenanceResultText" |
| | | label="保养结果" |
| | | placeholder="请选择保养结果" |
| | | :rules="formRules.maintenanceResult" |
| | | required |
| | | readonly |
| | | @click="showResultPicker" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | </van-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="sendForm" :loading="loading">保存</u-button> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showDate" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="选择日期" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 保养结果选择器 --> |
| | | <u-popup v-model="showResult" mode="bottom"> |
| | | <u-picker |
| | | v-model="resultPickerValue" |
| | | <van-popup v-model:show="showResult" position="bottom"> |
| | | <van-picker |
| | | :model-value="resultPickerValue" |
| | | :columns="resultColumns" |
| | | @confirm="onResultConfirm" |
| | | @cancel="showResult = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | import { addMaintenance } from '@/api/equipmentManagement/upkeep'; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import dayjs from "dayjs"; |
| | | // 替换 Vant 的 toast |
| | | // import { showToast } from 'vant'; |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | import { showToast } from 'vant'; |
| | | |
| | | defineOptions({ |
| | | name: "设备保养表单", |
| | |
| | | } |
| | | |
| | | function getUserLoginFacotryList() { |
| | | if(loginForm.value.username){ |
| | | userLoginFacotryList({userName:loginForm.value.username}).then(res => { |
| | | // 检查res.data是否为数组 |
| | | if (res.data && Array.isArray(res.data)) { |
| | |
| | | modal.msgError('获取公司列表失败:', error) |
| | | factoryList.value = [] |
| | | }) |
| | | }else { |
| | | factoryList.value = [] |
| | | } |
| | | } |
| | | |
| | | async function handleLogin() { |
| | |
| | | } |
| | | } |
| | | </style> |
| | | |
| | | <template> |
| | | <view class="invoice-add"> |
| | | <!-- 使用通用页面头部组件 --> |
| | | <PageHeader title="新增发票" @back="goBack" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="submitForm" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <!-- 基本信息 --> |
| | | <u-cell-group title="基本信息"> |
| | | <u-form-item label="采购合同号" prop="contractNo" required border-bottom> |
| | | <u-input v-model="form.contractNo" placeholder="请输入采购合同号" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="供应商名称" prop="supplierName" required border-bottom> |
| | | <u-input v-model="form.supplierName" placeholder="请输入供应商名称" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="发票号" prop="invoiceNo" required border-bottom> |
| | | <u-input v-model="form.invoiceNo" placeholder="请输入发票号" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="发票金额" prop="invoiceAmount" required border-bottom> |
| | | <u-input v-model="form.invoiceAmount" type="number" placeholder="请输入发票金额" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="税率" prop="taxRate" required border-bottom> |
| | | <u-input v-model="form.taxRate" placeholder="请输入税率" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="开票日期" prop="issueDate" required border-bottom> |
| | | <u-input v-model="form.issueDate" placeholder="请选择开票日期" readonly @click="showIssueDatePicker = true" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="录入人" border-bottom> |
| | | <u-input v-model="form.recorder" placeholder="自动填充" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="创建时间" border-bottom> |
| | | <u-input v-model="form.createTime" placeholder="请选择创建时间" readonly @click="showCreateTimePicker = true" clearable /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | |
| | | <!-- 产品信息 --> |
| | | <view class="product-section" v-if="!productData || productData.length === 0"> |
| | | <u-empty description="暂无产品数据" /> |
| | | </view> |
| | | |
| | | <!-- 产品列表 --> |
| | | <view class="product-list" v-if="productData && productData.length > 0"> |
| | | <view class="product-card" v-for="(product, idx) in productData" :key="idx"> |
| | | <view class="product-header"> |
| | | <view class="product-title"> |
| | | <u-icon name="file-text" color="#2979ff" size="15" /> |
| | | <text class="product-name">产品 {{ idx + 1 }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 产品信息表单 --> |
| | | <view class="product-form"> |
| | | <u-form-item label="产品名称" border-bottom> |
| | | <u-input v-model="product.productName" placeholder="请输入产品名称" /> |
| | | </u-form-item> |
| | | <u-form-item label="规格型号" border-bottom> |
| | | <u-input v-model="product.specification" placeholder="请输入规格型号" /> |
| | | </u-form-item> |
| | | <u-form-item label="单位" border-bottom> |
| | | <u-input v-model="product.unit" placeholder="请输入单位" /> |
| | | </u-form-item> |
| | | <u-form-item label="数量" border-bottom> |
| | | <u-input v-model="product.quantity" type="number" placeholder="请输入数量" /> |
| | | </u-form-item> |
| | | <u-form-item label="单价" border-bottom> |
| | | <u-input v-model="product.unitPrice" type="number" placeholder="请输入单价" /> |
| | | </u-form-item> |
| | | <u-form-item label="金额" border-bottom> |
| | | <u-input v-model="product.amount" type="number" placeholder="请输入金额" /> |
| | | </u-form-item> |
| | | <u-form-item label="税率" border-bottom> |
| | | <u-input v-model="product.taxRate" placeholder="请输入税率" /> |
| | | </u-form-item> |
| | | <u-form-item label="税额" border-bottom> |
| | | <u-input v-model="product.taxAmount" type="number" placeholder="请输入税额" /> |
| | | </u-form-item> |
| | | <u-form-item label="含税金额" border-bottom> |
| | | <u-input v-model="product.totalAmount" type="number" placeholder="请输入含税金额" /> |
| | | </u-form-item> |
| | | <u-form-item label="备注" border-bottom> |
| | | <u-textarea v-model="product.remark" placeholder="请输入备注" :maxlength="200" count :autoHeight="true" /> |
| | | </u-form-item> |
| | | </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> |
| | | |
| | | <!-- 开票日期选择器 --> |
| | | <u-popup v-model="showIssueDatePicker" mode="bottom"> |
| | | <u-datetime-picker |
| | | v-model="issueDateValue" |
| | | title="选择开票日期" |
| | | @confirm="onIssueDateConfirm" |
| | | @cancel="showIssueDatePicker = false" |
| | | /> |
| | | </u-popup> |
| | | |
| | | <!-- 创建时间选择器 --> |
| | | <u-popup v-model="showCreateTimePicker" mode="bottom"> |
| | | <u-datetime-picker |
| | | v-model="createTimeValue" |
| | | title="选择创建时间" |
| | | @confirm="onCreateTimeConfirm" |
| | | @cancel="showCreateTimePicker = false" |
| | | /> |
| | | </u-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // 替换 Vant 的 toast 方法 |
| | | // import { showToast, showLoadingToast, closeToast } from 'vant' |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | const showLoadingToast = (message) => { |
| | | uni.showLoading({ |
| | | title: message || '加载中...' |
| | | }) |
| | | } |
| | | |
| | | const closeToast = () => { |
| | | uni.hideLoading() |
| | | } |
| | | </script> |
| | |
| | | <PageHeader title="新增付款" @back="onClickLeft" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="onSubmit" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <van-form @submit="onSubmit" 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 |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field |
| | | v-model="form.purchaseContractNumber" |
| | | label="采购合同号" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="销售合同号" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.salesContractNo" |
| | | label="销售合同号" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="供应商名称" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.supplierName" |
| | | label="供应商名称" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="发票号" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.invoiceNumber" |
| | | label="发票号" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="发票金额(元)" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.invoiceAmount" |
| | | label="发票金额(元)" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <view class="tip-text">待付款金额:{{ currentNoReceiptAmount }} 元</view> |
| | | <u-form-item label="本次付款金额" prop="currentPaymentAmount" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.currentPaymentAmount" |
| | | label="本次付款金额" |
| | | type="number" |
| | | placeholder="请输入" |
| | | @blur="changeNum" |
| | | :rules="[{ required: true, message: '请输入付款金额' }]" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="付款形式" prop="paymentMethod" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.paymentMethod" |
| | | label="付款形式" |
| | | placeholder="请选择" |
| | | readonly |
| | | @click="showPaymentTypePicker" |
| | | :rules="[{ required: true, message: '请选择付款形式' }]" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="付款日期" prop="paymentDate" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.paymentDate" |
| | | label="付款日期" |
| | | placeholder="请选择" |
| | | readonly |
| | | @click="showDatePicker" |
| | | :rules="[{ required: true, message: '请选择来款日期' }]" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="登记人" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.registrant" |
| | | label="登记人" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="登记日期" prop="registrationtDate" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.registrationtDate" |
| | | label="登记日期" |
| | | placeholder="请选择" |
| | | readonly |
| | | :rules="[{ required: true, message: '请选择来款日期' }]" |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | </van-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="onClickLeft">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="onSubmit" :loading="loading">保存</u-button> |
| | | <van-button class="cancel-btn" @click="onClickLeft">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | |
| | | <!-- 付款方式选择器 --> |
| | | <u-popup v-model="showPaymentType" mode="bottom"> |
| | | <u-picker |
| | | v-model="pickerValue" |
| | | <van-popup v-model:show="showPaymentType" position="bottom"> |
| | | <van-picker |
| | | :model-value="pickerValue" |
| | | :columns="receipt_payment_type" |
| | | @confirm="onPaymentTypeConfirm" |
| | | @cancel="showPaymentType = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showDate" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="选择日期" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted, computed } from 'vue' |
| | | import useUserStore from '@/store/modules/user' |
| | | // 替换 Vant 的 toast 和 notify |
| | | // import { showToast, showNotify } from 'vant' |
| | | import { showToast, showNotify } from 'vant' |
| | | import { useDict } from '@/utils/dict' |
| | | import {paymentRegistrationAdd} from "@/api/procurementManagement/paymentEntry"; |
| | | |
| | | // 替换 toast 和 notify 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | const showNotify = ({ type, message }) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: type === 'warning' ? 'none' : 'success' |
| | | }) |
| | | } |
| | | |
| | | const userStore = useUserStore() |
| | | |
| | |
| | | <template> |
| | | <view class="payment-edit"> |
| | | <view class="account-detail"> |
| | | <!-- 使用通用页面头部组件 --> |
| | | <PageHeader title="编辑付款" @back="onClickLeft" /> |
| | | <PageHeader title="新增付款" @back="onClickLeft" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="onSubmit" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <van-form @submit="onSubmit" 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.contractNo" placeholder="自动填充" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="供应商名称" border-bottom> |
| | | <u-input v-model="form.supplierName" placeholder="自动填充" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="发票号" border-bottom> |
| | | <u-input v-model="form.invoiceNo" placeholder="自动填充" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="发票金额(元)" border-bottom> |
| | | <u-input v-model="form.invoiceAmount" placeholder="自动填充" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="本次付款金额" prop="paymentAmount" required border-bottom> |
| | | <u-input v-model="form.paymentAmount" type="number" placeholder="请输入" @blur="changeNum" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="付款形式" prop="paymentType" required border-bottom> |
| | | <u-input v-model="form.paymentType" placeholder="请选择" readonly @click="showPaymentTypePicker" /> |
| | | </u-form-item> |
| | | <u-form-item label="付款日期" prop="paymentDate" required border-bottom> |
| | | <u-input v-model="form.paymentDate" placeholder="请选择" readonly @click="showDatePicker" /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field |
| | | v-model="form.purchaseContractNumber" |
| | | label="采购合同号" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="form.supplierName" |
| | | label="供应商名称" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="form.invoiceNumber" |
| | | label="发票号" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="form.invoiceAmount" |
| | | label="发票金额(元)" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | <view class="tip-text">待付款金额:{{ currentNoReceiptAmount }} 元</view> |
| | | <van-field |
| | | v-model="form.currentPaymentAmount" |
| | | label="本次付款金额" |
| | | type="number" |
| | | placeholder="请输入" |
| | | @blur="changeNum" |
| | | :rules="[{ required: true, message: '请输入付款金额' }]" |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.paymentMethod" |
| | | label="付款形式" |
| | | placeholder="请选择" |
| | | readonly |
| | | @click="showPaymentTypePicker" |
| | | :rules="[{ required: true, message: '请选择付款形式' }]" |
| | | /> |
| | | <van-field |
| | | v-model="form.paymentDate" |
| | | label="付款日期" |
| | | placeholder="请选择" |
| | | readonly |
| | | @click="showDatePicker" |
| | | :rules="[{ required: true, message: '请选择来款日期' }]" |
| | | /> |
| | | </van-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="onClickLeft">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="onSubmit" :loading="loading">保存</u-button> |
| | | <van-button class="cancel-btn" @click="onClickLeft">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | |
| | | <!-- 付款方式选择器 --> |
| | | <u-popup v-model="showPaymentType" mode="bottom"> |
| | | <u-picker |
| | | v-model="pickerValue" |
| | | :columns="paymentTypeOptions" |
| | | <van-popup v-model:show="showPaymentType" position="bottom"> |
| | | <van-picker |
| | | :model-value="pickerValue" |
| | | :columns="receipt_payment_type" |
| | | @confirm="onPaymentTypeConfirm" |
| | | @cancel="showPaymentType = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showDate" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="选择日期" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // 替换 Vant 的 toast 和 notify |
| | | // import { showToast, showNotify } from 'vant' |
| | | |
| | | // 替换 toast 和 notify 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | const showNotify = ({ type, message }) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: type === 'warning' ? 'none' : 'success' |
| | | }) |
| | | } |
| | | |
| | | import { ref, onMounted, computed } from 'vue' |
| | | import { receiptPaymentSaveOrUpdate, invoiceInfo } from '@/api/salesManagement/receiptPayment' |
| | | import useUserStore from '@/store/modules/user' |
| | |
| | | /> |
| | | </view> |
| | | <view class="filter-button" @click="getList"> |
| | | <u-icon name="search" size="24" color="#999"></u-icon> |
| | | <up-icon name="search" size="24" color="#999"></up-icon> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 筛选开关 --> |
| | | <view class="switch-row"> |
| | | <text class="switch-label">不显示待付款为0</text> |
| | | <u-switch v-model="searchForm.status" @change="getList" size="18"/> |
| | | <van-switch v-model="searchForm.status" @change="getList" size="18"/> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | | <u-icon name="file-text" size="16" color="#ffffff"></u-icon> |
| | | <up-icon name="file-text" size="16" color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-id">{{ item.purchaseContractNumber }}</text> |
| | | </view> |
| | | </view> |
| | | <u-divider></u-divider> |
| | | <up-divider></up-divider> |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">销售合同号</text> |
| | |
| | | |
| | | <!-- 操作按钮 --> |
| | | <view class="action-buttons"> |
| | | <u-button |
| | | <van-button |
| | | type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | |
| | | @click="openForm('add', item)" |
| | | > |
| | | 新增付款 |
| | | </u-button> |
| | | </van-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | <script setup> |
| | | import { ref } from 'vue' |
| | | import useUserStore from '@/store/modules/user' |
| | | // 替换 Vant 的 toast |
| | | // import { showToast } from 'vant' |
| | | import { showToast } from 'vant' |
| | | import {onShow} from "@dcloudio/uni-app"; |
| | | import {invoiceListPage} from "@/api/procurementManagement/procurementInvoiceLedger"; |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | // 响应式数据 |
| | | const tableData = ref([]) |
| | |
| | | <!-- 使用通用页面头部组件 --> |
| | | <PageHeader title="编辑来票台账" @back="goBack" /> |
| | | |
| | | <u-form @submit="submitForm" ref="formRef" label-width="120" input-align="right" error-message-align="right"> |
| | | <u-cell-group title="基本信息"> |
| | | <u-form-item label="采购合同号" border-bottom> |
| | | <u-input v-model="form.purchaseContractNumber" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="销售合同号" border-bottom> |
| | | <u-input v-model="form.salesContractNo" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="含税单价(元)" border-bottom> |
| | | <u-input v-model="form.taxInclusiveUnitPrice" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="创建时间" border-bottom> |
| | | <u-input v-model="form.createdAt" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="发票号" border-bottom> |
| | | <u-input v-model="form.invoiceNumber" placeholder="请输入" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="来票数" prop="ticketsNum" required border-bottom> |
| | | <u-input v-model="form.ticketsNum" type="number" placeholder="请输入" @change="inputTicketsNum"/> |
| | | </u-form-item> |
| | | <u-form-item label="本次来票金额(元)" prop="ticketsAmount" required border-bottom> |
| | | <u-input v-model="form.ticketsAmount" type="number" placeholder="请输入" @change="inputTicketsAmount"/> |
| | | </u-form-item> |
| | | <van-form @submit="submitForm" ref="formRef" label-width="120px" input-align="right" error-message-align="right" scroll-to-error scroll-to-error-position="center"> |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field v-model="form.purchaseContractNumber" label="采购合同号" readonly /> |
| | | <van-field v-model="form.salesContractNo" label="销售合同号" readonly /> |
| | | <van-field v-model="form.taxInclusiveUnitPrice" label="含税单价(元)" readonly /> |
| | | <van-field v-model="form.createdAt" label="创建时间" readonly /> |
| | | <van-field v-model="form.invoiceNumber" label="发票号" placeholder="请输入" readonly /> |
| | | <van-field v-model="form.ticketsNum" label="来票数" type="number" placeholder="请输入" required :rules="[{ required: true, message: '请输入来票数' }]" @change="inputTicketsNum"/> |
| | | <van-field v-model="form.ticketsAmount" label="本次来票金额(元)" type="number" placeholder="请输入" required :rules="[{ required: true, message: '请输入本次来票金额' }]" @change="inputTicketsAmount"/> |
| | | <view class="tip-text">未来票数:{{ formatAmount(form.futureTickets) }} 元</view> |
| | | </u-cell-group> |
| | | <!-- <van-field v-model="form.invoicePerson" label="未来票数" readonly />--> |
| | | </van-cell-group> |
| | | |
| | | <!-- <van-cell-group title="附件材料(仅支持 pdf)" inset>--> |
| | | <!-- <van-uploader--> |
| | | <!-- accept=".pdf"--> |
| | | <!-- multiple--> |
| | | <!-- :after-read="afterReadUpload"--> |
| | | <!-- :before-read="beforeReadPdf"--> |
| | | <!-- >--> |
| | | <!-- <van-button class="upload-btn" icon="plus" type="primary" block>上传文件</van-button>--> |
| | | <!-- </van-uploader>--> |
| | | <!-- <view class="uploaded-list" v-if="fileList.length">--> |
| | | <!-- <view class="uploaded-item" v-for="(f, idx) in fileList" :key="idx">--> |
| | | <!-- <text class="file-name">{{ f.name || getFileNameFromUrl(f.url) }}</text>--> |
| | | <!-- <van-button size="mini" type="danger" plain @click="removeUploaded(idx)">移除</van-button>--> |
| | | <!-- </view>--> |
| | | <!-- </view>--> |
| | | <!-- </van-cell-group>--> |
| | | |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="submitForm">保存</u-button> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted } from 'vue' |
| | | // 替换 Vant 的 toast 方法 |
| | | // import { showToast, showLoadingToast, closeToast } from 'vant' |
| | | import { showToast, showLoadingToast, closeToast } from 'vant' |
| | | import dayjs from 'dayjs' |
| | | import useUserStore from '@/store/modules/user' |
| | | import { getToken } from '@/utils/auth' |
| | | import { invoiceLedgerSaveOrUpdate } from '@/api/salesManagement/invoiceLedger.js' |
| | | import config from '@/config.js' |
| | | import {getProductRecordById, updateRegistration} from "@/api/procurementManagement/procurementInvoiceLedger"; |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | const showLoadingToast = (message) => { |
| | | uni.showLoading({ |
| | | title: message || '加载中...' |
| | | }) |
| | | } |
| | | |
| | | const closeToast = () => { |
| | | uni.hideLoading() |
| | | } |
| | | |
| | | const userStore = useUserStore() |
| | | |
| | |
| | | <PageHeader title="台账详情" @back="goBack" /> |
| | | |
| | | <!-- 表单区域 --> |
| | | <u-form @submit="onSubmit" label-width="110" input-align="right" style="margin-top: 10px" error-message-align="right"> |
| | | <u-form-item label="采购合同号" prop="purchaseContractNumber" required border-bottom> |
| | | <u-input v-model="form.purchaseContractNumber" placeholder="自动生成" /> |
| | | </u-form-item> |
| | | <u-form-item label="销售合同号" prop="salesContractNo" required border-bottom> |
| | | <u-input |
| | | <van-form @submit="onSubmit" label-width="110px" input-align="right" style="margin-top: 10px" error-message-align="right" scroll-to-error scroll-to-error-position="center"> |
| | | <van-field label="采购合同号" name="purchaseContractNumber" borderBottom="true" v-model="form.purchaseContractNumber" placeholder="自动生成" :rules="[{ required: true, message: '请输入' }]"> |
| | | </van-field> |
| | | <van-field |
| | | v-model="form.salesContractNo" |
| | | is-link |
| | | readonly |
| | | name="salesContractNo" |
| | | label="销售合同号" |
| | | required |
| | | placeholder="点击选择销售合同号" |
| | | :rules="[{ required: true, message: '请选择销售合同号' }]" |
| | | @click="showPicker = true" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="供应商名称" prop="supplierName" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.supplierName" |
| | | is-link |
| | | readonly |
| | | required |
| | | name="supplierName" |
| | | label="供应商名称" |
| | | placeholder="点击选择供应商" |
| | | :rules="[{ required: true, message: '请选择供应商' }]" |
| | | @click="showCustomerPicker = true" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="项目名称" prop="projectName" required border-bottom> |
| | | <u-input v-model="form.projectName" placeholder="请输入项目名称" /> |
| | | </u-form-item> |
| | | <u-form-item label="付款方式" border-bottom> |
| | | <u-input v-model="form.paymentMethod" placeholder="请输入付款方式" /> |
| | | </u-form-item> |
| | | <u-form-item label="录入人" border-bottom> |
| | | <u-input v-model="form.recorderName" placeholder="请输入" disabled /> |
| | | </u-form-item> |
| | | <u-form-item label="录入日期" border-bottom> |
| | | <u-input v-model="form.entryDate" placeholder="请输入" disabled /> |
| | | </u-form-item> |
| | | <u-popup v-model="showPicker" mode="bottom"> |
| | | <u-picker |
| | | <van-field label="项目名称" name="projectName" borderBottom="true" v-model="form.projectName" placeholder="请输入项目名称" :rules="[{ required: true, message: '项目名称不能为空' }]" required> |
| | | </van-field> |
| | | <van-field label="付款方式" name="paymentMethod" borderBottom="true" v-model="form.paymentMethod" placeholder="请输入付款方式"> |
| | | </van-field> |
| | | <van-field label="录入人" name="recorderName" borderBottom="true" v-model="form.recorderName" placeholder="请输入" disabled> |
| | | </van-field> |
| | | <van-field label="录入日期" name="entryDate" borderBottom="true" v-model="form.entryDate" placeholder="请输入" disabled> |
| | | </van-field> |
| | | <van-popup v-model:show="showPicker" destroy-on-close position="bottom"> |
| | | <van-picker |
| | | :columns="salesContractList" |
| | | v-model="pickerValue" |
| | | @confirm="onConfirm" |
| | | @cancel="showPicker = false" |
| | | /> |
| | | </u-popup> |
| | | <u-popup v-model="showCustomerPicker" mode="bottom"> |
| | | <u-picker |
| | | </van-popup> |
| | | <van-popup v-model:show="showCustomerPicker" destroy-on-close position="bottom"> |
| | | <van-picker |
| | | :columns="supplierList" |
| | | v-model="pickerCustomerValue" |
| | | @confirm="onCustomerConfirm" |
| | | @cancel="showCustomerPicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 产品大类选择器 --> |
| | | <u-popup v-model="showCategoryPicker" mode="bottom"> |
| | | <van-popup v-model:show="showCategoryPicker" destroy-on-close position="bottom"> |
| | | <!-- 头部按钮区域 --> |
| | | <view class="popup-header"> |
| | | <view @click="showCategoryPicker = false" class="cancelButton">取消</view> |
| | |
| | | check-strictly |
| | | @check-change="onCategoryConfirm" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 规格型号选择器 --> |
| | | <u-popup v-model="showSpecificationPicker" mode="bottom"> |
| | | <u-picker |
| | | <van-popup v-model:show="showSpecificationPicker" destroy-on-close position="bottom"> |
| | | <van-picker |
| | | :columns="modelOptions" |
| | | v-model="pickerSpecificationValue" |
| | | @confirm="onSpecificationConfirm" |
| | | @cancel="showSpecificationPicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 税率选择器 --> |
| | | <u-popup v-model="showTaxRatePicker" mode="bottom"> |
| | | <u-picker |
| | | <van-popup v-model:show="showTaxRatePicker" destroy-on-close position="bottom"> |
| | | <van-picker |
| | | :columns="taxRateOptions" |
| | | v-model="pickerTaxRateValue" |
| | | @confirm="onTaxRateConfirm" |
| | | @cancel="showTaxRatePicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 发票类型选择器 --> |
| | | <u-popup v-model="showInvoiceTypePicker" mode="bottom"> |
| | | <u-picker |
| | | <van-popup v-model:show="showInvoiceTypePicker" destroy-on-close position="bottom"> |
| | | <van-picker |
| | | :columns="invoiceTypeOptions" |
| | | v-model="pickerInvoiceTypeValue" |
| | | @confirm="onInvoiceTypeConfirm" |
| | | @cancel="showInvoiceTypePicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | <!-- 产品信息 --> |
| | | <view class="product-section"> |
| | | <view class="section-header"> |
| | | <text class="section-title">产品信息</text> |
| | | <u-button type="primary" size="small" @click="addProduct" class="add-btn" v-if="operationType !== 'view'"> |
| | | <u-icon name="plus" size="14" /> |
| | | 新增 |
| | | </u-button> |
| | | <van-button type="primary" size="small" @click="addProduct" class="add-btn" icon="plus" v-if="operationType !== 'view'">新增</van-button> |
| | | </view> |
| | | <view class="product-card" v-for="(product, idx) in productData" :key="idx"> |
| | | <!-- 产品类 --> |
| | | <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">产品 {{ idx + 1 }}</text> |
| | | </view> |
| | | <!-- 操作按钮 --> |
| | | <view class="product-actions" v-if="operationType !== 'view'"> |
| | | <u-button type="error" size="mini" @click="removeProduct(idx)" class="del-btn"> |
| | | <u-icon name="trash" size="12" /> |
| | | 删除 |
| | | </u-button> |
| | | <van-button type="danger" size="mini" @click="removeProduct(idx)" class="del-btn" icon="delete">删除</van-button> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 产品信息表单 --> |
| | | <view class="product-form"> |
| | | <!-- 产品大类 --> |
| | | <view class="product-category" prop="productCategory" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="product.productCategory" |
| | | is-link |
| | | readonly |
| | | name="productCategory" |
| | | label="产品大类" |
| | | required |
| | | placeholder="请选择" |
| | | :rules="[{ required: true, message: '请选择' }]" |
| | | @click="openCategoryPicker(idx)" |
| | | /> |
| | | </view> |
| | | |
| | | <!-- 规格型号 --> |
| | | <view class="product-specificationModel" prop="specificationModel" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="product.specificationModel" |
| | | is-link |
| | | readonly |
| | | name="specificationModel" |
| | | label="规格型号" |
| | | required |
| | | :rules="[{ required: true, message: '请选择' }]" |
| | | placeholder="请选择" |
| | | @click="openSpecificationPicker(idx)" |
| | | /> |
| | | </view> |
| | | |
| | | <!-- 单位 --> |
| | | <view class="product-unit" prop="unit" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="product.unit" |
| | | name="unit" |
| | | label="单位" |
| | | required |
| | | :rules="[{ required: true, message: '请输入' }]" |
| | | placeholder="请输入" |
| | | /> |
| | | </view> |
| | | |
| | | <!-- 税率 --> |
| | | <view class="product-taxRate" prop="taxRate" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="product.taxRate" |
| | | is-link |
| | | readonly |
| | | name="taxRate" |
| | | label="税率(%)" |
| | | required |
| | | :rules="[{ required: true, message: '请选择' }]" |
| | | placeholder="请选择" |
| | | @click="openTaxRatePicker(idx)" |
| | | /> |
| | | </view> |
| | | |
| | | <!-- 含税单价 --> |
| | | <view class="product-taxInclusiveUnitPrice" prop="taxInclusiveUnitPrice" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="product.taxInclusiveUnitPrice" |
| | | name="taxInclusiveUnitPrice" |
| | | label="含税单价(元)" |
| | | type="number" |
| | | required |
| | | :rules="[{ required: true, message: '请输入' }]" |
| | | placeholder="请输入" |
| | | @blur="formatTaxPrice(idx)" |
| | | /> |
| | | </view> |
| | | |
| | | <!-- 数量 --> |
| | | <view class="product-quantity" prop="quantity" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="product.quantity" |
| | | name="quantity" |
| | | label="数量" |
| | | type="number" |
| | | :rules="[{ required: true, message: '请输入' }]" |
| | | required |
| | | placeholder="请输入" |
| | | @blur="formatAmount(idx)" |
| | | /> |
| | | </view> |
| | | |
| | | <!-- 含税总价 --> |
| | | <view class="product-taxInclusiveTotalPrice" prop="taxInclusiveTotalPrice" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="product.taxInclusiveTotalPrice" |
| | | name="taxInclusiveTotalPrice" |
| | | label="含税总价(元)" |
| | | type="number" |
| | | :rules="[{ required: true, message: '请输入' }]" |
| | | required |
| | | placeholder="请输入" |
| | | @blur="formatTaxTotal(idx)" |
| | | /> |
| | | </view> |
| | | |
| | | <!-- 不含税总价 --> |
| | | <view class="product-taxExclusiveTotalPrice" prop="taxExclusiveTotalPrice" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="product.taxExclusiveTotalPrice" |
| | | name="taxExclusiveTotalPrice" |
| | | label="不含税总价(元)" |
| | | type="number" |
| | | required |
| | | :rules="[{ required: true, message: '请输入' }]" |
| | | placeholder="请输入" |
| | | @blur="formatNoTaxTotal(idx)" |
| | | /> |
| | | </view> |
| | | |
| | | <!-- 发票类型 --> |
| | | <view class="product-invoiceType" prop="invoiceType" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="product.invoiceType" |
| | | is-link |
| | | readonly |
| | | name="invoiceType" |
| | | label="发票类型" |
| | | :rules="[{ required: true, message: '请选择' }]" |
| | | required |
| | | placeholder="请选择" |
| | | @click="openInvoiceTypePicker(idx)" |
| | | /> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view class="footer-btns" v-if="operationType !== 'view'"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="onSubmit">保存</u-button> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | .form-section { |
| | | margin-top: 1rem; |
| | | } |
| | | .u-form-item { |
| | | .van-field { |
| | | height: 3.4rem; |
| | | } |
| | | .u-cell { |
| | | .van-cell { |
| | | align-items: center; |
| | | } |
| | | .product-section { |
| | |
| | | <template> |
| | | <view class="invoice-detail"> |
| | | <view class="account-detail"> |
| | | <!-- 使用通用页面头部组件 --> |
| | | <PageHeader title="发票详情" @back="goBack" /> |
| | | <PageHeader title="编辑开票台账" @back="goBack" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="submitForm" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <u-cell-group title="基本信息"> |
| | | <u-form-item label="销售合同号" border-bottom> |
| | | <u-input v-model="form.salesContractNo" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="客户名称" border-bottom> |
| | | <u-input v-model="form.customerName" readonly /> |
| | | </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="invoiceTotal" required border-bottom> |
| | | <u-input v-model="form.invoiceTotal" type="number" placeholder="请输入" /> |
| | | </u-form-item> |
| | | <u-form-item label="开票人" border-bottom> |
| | | <u-input v-model="form.invoicePerson" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="开票日期" prop="invoiceDate" required border-bottom> |
| | | <u-input v-model="form.invoiceDate" readonly placeholder="请选择" @click="showInvoiceDatePicker = true" /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | <van-form @submit="submitForm" ref="formRef" label-width="110px" input-align="right" error-message-align="right" scroll-to-error scroll-to-error-position="center"> |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field v-model="form.salesContractNo" label="销售合同号" readonly /> |
| | | <van-field v-model="form.customerName" label="客户名称" readonly /> |
| | | <van-field v-model="form.invoiceNo" label="发票号" placeholder="请输入" required :rules="[{ required: true, message: '请输入发票号' }]" /> |
| | | <van-field v-model="form.invoiceTotal" label="发票金额(元)" type="number" placeholder="请输入" required :rules="[{ required: true, message: '请输入发票金额' }]" /> |
| | | <view class="tip-text" v-if="form.taxInclusiveTotalPrice">合同总额:{{ formatAmount(form.taxInclusiveTotalPrice) }} 元</view> |
| | | <van-field v-model="form.invoicePerson" label="开票人" readonly /> |
| | | <van-field v-model="form.invoiceDate" label="开票日期" readonly placeholder="请选择" @click="showInvoiceDatePicker = true" required :rules="[{ required: true, message: '请选择开票日期' }]" /> |
| | | </van-cell-group> |
| | | |
| | | <u-cell-group title="附件材料(仅支持 pdf)"> |
| | | <u-upload |
| | | <van-cell-group title="附件材料(仅支持 pdf)" inset> |
| | | <van-uploader |
| | | accept=".pdf" |
| | | multiple |
| | | :afterRead="afterReadUpload" |
| | | :beforeRead="beforeReadPdf" |
| | | :after-read="afterReadUpload" |
| | | :before-read="beforeReadPdf" |
| | | > |
| | | <u-button class="upload-btn" type="primary"> |
| | | <u-icon name="plus" size="14" /> |
| | | 上传文件 |
| | | </u-button> |
| | | </u-upload> |
| | | <van-button class="upload-btn" icon="plus" type="primary" block>上传文件</van-button> |
| | | </van-uploader> |
| | | <view class="uploaded-list" v-if="fileList.length"> |
| | | <view class="uploaded-item" v-for="(f, idx) in fileList" :key="idx"> |
| | | <text class="file-name">{{ f.name || getFileNameFromUrl(f.url) }}</text> |
| | | <u-button size="mini" type="error" plain @click="removeUploaded(idx)">移除</u-button> |
| | | <van-button size="mini" type="danger" plain @click="removeUploaded(idx)">移除</van-button> |
| | | </view> |
| | | </view> |
| | | </u-cell-group> |
| | | </van-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="submitForm">保存</u-button> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | |
| | | <!-- 开票日期选择器 --> |
| | | <u-popup v-model="showInvoiceDatePicker" mode="bottom"> |
| | | <u-datetime-picker |
| | | v-model="invoiceDateValue" |
| | | <van-popup v-model:show="showInvoiceDatePicker" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentInvoiceDate" |
| | | title="选择开票日期" |
| | | @confirm="onInvoiceDateConfirm" |
| | | @cancel="showInvoiceDatePicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // 替换 Vant 的 toast 方法 |
| | | // import { showToast, showLoadingToast, closeToast } from 'vant' |
| | | |
| | | // 替换 toast 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | const showLoadingToast = (message) => { |
| | | uni.showLoading({ |
| | | title: message || '加载中...' |
| | | }) |
| | | } |
| | | |
| | | const closeToast = () => { |
| | | uni.hideLoading() |
| | | } |
| | | |
| | | import { ref, onMounted } from 'vue' |
| | | import { showToast, showLoadingToast, closeToast } from 'vant' |
| | | import dayjs from 'dayjs' |
| | | import useUserStore from '@/store/modules/user' |
| | | import { getToken } from '@/utils/auth' |
| | |
| | | <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 |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field |
| | | v-model="form.salesContractNo" |
| | | label="销售合同号" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="客户名称" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.customerName" |
| | | label="客户名称" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="业务员" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.salesman" |
| | | label="业务员" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="项目名称" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.projectName" |
| | | label="项目名称" |
| | | readonly |
| | | placeholder="自动填充" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="录入人" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.createUer" |
| | | label="录入人" |
| | | readonly |
| | | placeholder="请输入录入人" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="录入日期" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.createTime" |
| | | label="录入日期" |
| | | readonly |
| | | placeholder="请选择录入日期" |
| | | @click="showCreateTimePicker = true" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="发票号码" prop="invoiceNo" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.invoiceNo" |
| | | label="发票号码" |
| | | required |
| | | placeholder="请输入发票号码" |
| | | :rules="[{ required: true, message: '请输入发票号码' }]" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="开票日期" prop="issueDate" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.issueDate" |
| | | label="开票日期" |
| | | readonly |
| | | placeholder="请选择开票日期" |
| | | required |
| | | @click="showIssueDatePicker = true" |
| | | :rules="[{ required: true, message: '请选择开票日期' }]" |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | </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 |
| | | <van-field |
| | | v-model="item.productCategory" |
| | | label="产品大类" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="规格型号" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.specificationModel" |
| | | label="规格型号" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="单位" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.unit" |
| | | label="单位" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="数量" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.quantity" |
| | | label="数量" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="税率(%)" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.taxRate" |
| | | label="税率(%)" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="含税单价(元)" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.taxInclusiveUnitPrice" |
| | | label="含税单价(元)" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="含税总价(元)" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.taxInclusiveTotalPrice" |
| | | label="含税总价(元)" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="不含税总价(元)" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.taxExclusiveTotalPrice" |
| | | label="不含税总价(元)" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 本次开票信息 --> |
| | | <u-form-item label="本次开票数" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.currentInvoiceNum" |
| | | label="本次开票数" |
| | | type="number" |
| | | placeholder="请输入开票数量" |
| | | @blur="invoiceNumBlur(item)" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="本次开票金额(元)" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.currentInvoiceAmount" |
| | | label="本次开票金额(元)" |
| | | type="number" |
| | | placeholder="请输入开票金额" |
| | | @blur="invoiceAmountBlur(item)" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 未开票信息 --> |
| | | <u-form-item label="未开票数" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.noInvoiceNum" |
| | | label="未开票数" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="未开票金额(元)" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="item.noInvoiceAmount" |
| | | label="未开票金额(元)" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | </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> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </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); |
| | |
| | | /> |
| | | </view> |
| | | <view class="filter-button" @click="getList"> |
| | | <u-icon name="search" size="24" color="#999"></u-icon> |
| | | <up-icon name="search" size="24" color="#999"></up-icon> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | | <u-icon name="file-text" size="16" color="#ffffff"></u-icon> |
| | | <up-icon name="file-text" size="16" color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-id">{{ item.salesContractNo }}</text> |
| | | </view> |
| | | </view> |
| | | <u-divider></u-divider> |
| | | <up-divider></up-divider> |
| | | |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | |
| | | |
| | | <!-- 操作按钮区域 --> |
| | | <view class="action-buttons"> |
| | | <u-button |
| | | <van-button |
| | | type="primary" |
| | | size="small" |
| | | @click="handleAddInvoice(item)" |
| | |
| | | :disabled="item.noInvoiceAmountTotal == 0" |
| | | > |
| | | 新增开票 |
| | | </u-button> |
| | | <u-button |
| | | type="info" |
| | | </van-button> |
| | | <van-button |
| | | type="default" |
| | | size="small" |
| | | @click="handleViewDetail(item)" |
| | | class="action-btn" |
| | | > |
| | | 查看详情 |
| | | </u-button> |
| | | </van-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | <PageHeader title="新增回款" @back="onClickLeft" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="onSubmit" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <van-form @submit="onSubmit" 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 |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field |
| | | v-model="form.salesContractNo" |
| | | label="销售合同号" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="客户名称" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.customerName" |
| | | label="客户名称" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="发票号" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.invoiceNo" |
| | | label="发票号" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="发票金额(元)" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.invoiceTotal" |
| | | label="发票金额(元)" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="税率" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.taxRate" |
| | | label="税率" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <view class="tip-text">待回款金额:{{ currentNoReceiptAmount }} 元</view> |
| | | <u-form-item label="本次回款金额" prop="receiptPaymentAmount" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.receiptPaymentAmount" |
| | | label="本次回款金额" |
| | | type="number" |
| | | placeholder="请输入" |
| | | @blur="changeNum" |
| | | :rules="[{ required: true, message: '请输入回款金额' }]" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="回款形式" prop="receiptPaymentTypeName" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.receiptPaymentTypeName" |
| | | label="回款形式" |
| | | placeholder="请选择" |
| | | readonly |
| | | @click="showPaymentTypePicker" |
| | | :rules="[{ required: true, message: '请选择回款形式' }]" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="来款日期" prop="receiptPaymentDate" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.receiptPaymentDate" |
| | | label="来款日期" |
| | | placeholder="请选择" |
| | | readonly |
| | | @click="showDatePicker" |
| | | :rules="[{ required: true, message: '请选择来款日期' }]" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="登记人" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.registrant" |
| | | label="登记人" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | </van-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="onClickLeft">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="onSubmit" :loading="loading">保存</u-button> |
| | | <van-button class="cancel-btn" @click="onClickLeft">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | |
| | | <!-- 回款方式选择器 --> |
| | | <u-popup v-model="showPaymentType" mode="bottom"> |
| | | <u-picker |
| | | v-model="pickerValue" |
| | | <van-popup v-model:show="showPaymentType" position="bottom"> |
| | | <van-picker |
| | | :model-value="pickerValue" |
| | | :columns="receipt_payment_type" |
| | | @confirm="onPaymentTypeConfirm" |
| | | @cancel="showPaymentType = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showDate" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="选择日期" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | import { ref, onMounted, computed } from 'vue' |
| | | import { receiptPaymentSaveOrUpdate, invoiceInfo } from '@/api/salesManagement/receiptPayment' |
| | | import useUserStore from '@/store/modules/user' |
| | | // 替换 Vant 的 toast 和 notify |
| | | // import { showToast, showNotify } from 'vant' |
| | | import { showToast, showNotify } from 'vant' |
| | | import { useDict } from '@/utils/dict' |
| | | |
| | | // 替换 toast 和 notify 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | const showNotify = ({ type, message }) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: type === 'warning' ? 'none' : 'success' |
| | | }) |
| | | } |
| | | |
| | | const userStore = useUserStore() |
| | | |
| | |
| | | <PageHeader title="编辑回款" @back="onClickLeft" /> |
| | | |
| | | <!-- 表单内容 --> |
| | | <u-form @submit="onSubmit" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <van-form @submit="onSubmit" 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 |
| | | <van-cell-group title="基本信息" inset> |
| | | <van-field |
| | | v-model="form.salesContractNo" |
| | | label="销售合同号" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="客户名称" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.customerName" |
| | | label="客户名称" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | <!-- <u-form-item label="发票号" border-bottom>--> |
| | | <!-- <u-input--> |
| | | <!-- <van-field--> |
| | | <!-- v-model="form.invoiceNo"--> |
| | | <!-- label="发票号"--> |
| | | <!-- placeholder="自动填充"--> |
| | | <!-- readonly--> |
| | | <!-- />--> |
| | | <!-- </u-form-item>--> |
| | | <!-- <u-form-item label="发票金额(元)" border-bottom>--> |
| | | <!-- <u-input--> |
| | | <!-- <van-field--> |
| | | <!-- v-model="form.invoiceTotal"--> |
| | | <!-- label="发票金额(元)"--> |
| | | <!-- placeholder="自动填充"--> |
| | | <!-- readonly--> |
| | | <!-- />--> |
| | | <!-- </u-form-item>--> |
| | | <!-- <u-form-item label="税率" border-bottom>--> |
| | | <!-- <u-input--> |
| | | <!-- <van-field--> |
| | | <!-- v-model="form.taxRate"--> |
| | | <!-- label="税率"--> |
| | | <!-- placeholder="自动填充"--> |
| | | <!-- readonly--> |
| | | <!-- />--> |
| | | <!-- </u-form-item>--> |
| | | <view class="tip-text">待回款金额:{{ currentNoReceiptAmount }} 元</view> |
| | | <u-form-item label="本次回款金额" prop="receiptPaymentAmount" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.receiptPaymentAmount" |
| | | label="本次回款金额" |
| | | type="number" |
| | | placeholder="请输入" |
| | | @blur="changeNum" |
| | | :rules="[{ required: true, message: '请输入回款金额' }]" |
| | | clearable |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="回款形式" prop="receiptPaymentTypeName" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.receiptPaymentTypeName" |
| | | label="回款形式" |
| | | placeholder="请选择" |
| | | readonly |
| | | @click="showPaymentTypePicker" |
| | | :rules="[{ required: true, message: '请选择回款形式' }]" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="来款日期" prop="receiptPaymentDate" required border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.receiptPaymentDate" |
| | | label="来款日期" |
| | | placeholder="请选择" |
| | | readonly |
| | | :rules="[{ required: true, message: '请选择来款日期' }]" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="登记人" border-bottom> |
| | | <u-input |
| | | <van-field |
| | | v-model="form.registrant" |
| | | label="登记人" |
| | | placeholder="自动填充" |
| | | readonly |
| | | /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | </van-cell-group> |
| | | |
| | | <!-- 提交按钮 --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="onClickLeft">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="onSubmit" :loading="loading">保存</u-button> |
| | | <van-button class="cancel-btn" @click="onClickLeft">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | |
| | | <!-- 回款方式选择器 --> |
| | | <u-popup v-model="showPaymentType" mode="bottom"> |
| | | <u-picker |
| | | v-model="pickerValue" |
| | | <van-popup v-model:show="showPaymentType" position="bottom"> |
| | | <van-picker |
| | | :model-value="pickerValue" |
| | | :columns="receipt_payment_type" |
| | | @confirm="onPaymentTypeConfirm" |
| | | @cancel="showPaymentType = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 日期选择器 --> |
| | | <u-popup v-model="showDate" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="选择日期" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | import { ref, onMounted, computed } from 'vue' |
| | | import { receiptPaymentSaveOrUpdate, invoiceInfo } from '@/api/salesManagement/receiptPayment' |
| | | import useUserStore from '@/store/modules/user' |
| | | // 替换 Vant 的 toast 和 notify |
| | | // import { showToast, showNotify } from 'vant' |
| | | import { showToast, showNotify } from 'vant' |
| | | import { useDict } from '@/utils/dict' |
| | | |
| | | // 替换 toast 和 notify 方法 |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | const showNotify = ({ type, message }) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: type === 'warning' ? 'none' : 'success' |
| | | }) |
| | | } |
| | | |
| | | const userStore = useUserStore() |
| | | |
| | |
| | | /> |
| | | </view> |
| | | <view class="filter-button" @click="getList"> |
| | | <u-icon name="search" size="24" color="#999"></u-icon> |
| | | <up-icon name="search" size="24" color="#999"></up-icon> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 筛选开关 --> |
| | | <view class="switch-row"> |
| | | <text class="switch-label">不显示待回款为0</text> |
| | | <u-switch v-model="searchForm.status" @change="getList" size="18"/> |
| | | <van-switch v-model="searchForm.status" @change="getList" size="18"/> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | | <u-icon name="file-text" size="16" color="#ffffff"></u-icon> |
| | | <up-icon name="file-text" size="16" color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-id">{{ item.salesContractNo }}</text> |
| | | </view> |
| | | </view> |
| | | <u-divider></u-divider> |
| | | <up-divider></up-divider> |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">客户名称</text> |
| | |
| | | |
| | | <!-- 操作按钮 --> |
| | | <view class="action-buttons"> |
| | | <u-button |
| | | <van-button |
| | | type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | |
| | | @click="openForm(item)" |
| | | > |
| | | 新增回款 |
| | | </u-button> |
| | | </van-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | |
| | | <!-- 无数据提示 --> |
| | | <view class="no-data" v-else> |
| | | <text>暂无数据</text> |
| | | <text>暂无回款数据</text> |
| | | </view> |
| | | </view> |
| | | </template> |
| | |
| | | <PageHeader title="台账详情" @back="goBack" /> |
| | | |
| | | <!-- 表单区域 --> |
| | | <u-form @submit="onSubmit" label-width="110" input-align="right" style="margin-top: 10px" error-message-align="right"> |
| | | <u-form-item label="销售合同号" prop="salesContractNo" border-bottom> |
| | | <u-input v-model="form.salesContractNo" placeholder="自动生成" disabled /> |
| | | </u-form-item> |
| | | <u-form-item |
| | | label="业务员" |
| | | prop="salesman" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-form @submit="onSubmit" label-width="110px" input-align="right" style="margin-top: 10px" error-message-align="right" scroll-to-error scroll-to-error-position="center"> |
| | | <van-field label="销售合同号" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="自动生成" disabled> |
| | | </van-field> |
| | | <van-field |
| | | v-model="form.salesman" |
| | | is-link |
| | | readonly |
| | | name="salesman" |
| | | label="业务员" |
| | | required |
| | | placeholder="点击选择业务员" |
| | | :rules="[{ required: true, message: '请选择业务员' }]" |
| | | @click="showPicker = true" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="客户合同号" prop="customerContractNo" required border-bottom> |
| | | <u-input |
| | | v-model="form.customerContractNo" |
| | | placeholder="请输入客户合同号" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item |
| | | label="客户名称" |
| | | prop="customerName" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field label="客户合同号" name="customerContractNo" borderBottom="true" |
| | | v-model="form.customerContractNo" required |
| | | placeholder="请输入客户合同号" :rules="[{ required: true, message: '客户合同号不能为空' }]"> |
| | | </van-field> |
| | | <van-field |
| | | v-model="form.customerName" |
| | | is-link |
| | | readonly |
| | | required |
| | | name="customerName" |
| | | label="客户名称" |
| | | placeholder="点击选择客户" |
| | | :rules="[{ required: true, message: '请选择客户' }]" |
| | | @click="showCustomerPicker = true" |
| | | /> |
| | | </u-form-item> |
| | | <u-form-item label="项目名称" prop="projectName" required border-bottom> |
| | | <u-input v-model="form.projectName" placeholder="请输入项目名称" /> |
| | | </u-form-item> |
| | | <u-form-item |
| | | label="签订日期" |
| | | prop="executionDate" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field label="项目名称" name="projectName" borderBottom="true" v-model="form.projectName" placeholder="请输入项目名称" :rules="[{ required: true, message: '项目名称不能为空' }]" required> |
| | | </van-field> |
| | | <van-field |
| | | v-model="form.executionDate" |
| | | is-link |
| | | readonly |
| | | required |
| | | name="executionDate" |
| | | label="签订日期" |
| | | placeholder="点击选择时间" |
| | | :rules="[{ required: true, message: '签订日期不能为空' }]" |
| | | @click="showDatePicker = true" |
| | | /> |
| | | </u-form-item> |
| | | <u-popup v-model="showDatePicker" mode="bottom"> |
| | | <u-datetime-picker |
| | | <van-popup v-model:show="showDatePicker" destroy-on-close position="bottom"> |
| | | <van-date-picker |
| | | v-model="pickerDateValue" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDatePicker = false" |
| | | /> |
| | | </u-popup> |
| | | <u-form-item label="付款方式" prop="paymentMethod" border-bottom> |
| | | <u-input v-model="form.paymentMethod" placeholder="请输入付款方式" /> |
| | | </u-form-item> |
| | | <u-form-item label="录入人" prop="entryPersonName" border-bottom> |
| | | <u-input v-model="form.entryPersonName" placeholder="请输入" disabled /> |
| | | </u-form-item> |
| | | <u-form-item label="录入日期" prop="entryDate" border-bottom> |
| | | <u-input v-model="form.entryDate" placeholder="请输入" disabled /> |
| | | </u-form-item> |
| | | <u-popup v-model="showPicker" mode="bottom"> |
| | | <u-picker |
| | | </van-popup> |
| | | <van-field label="付款方式" name="paymentMethod" borderBottom="true" v-model="form.paymentMethod" placeholder="请输入付款方式"> |
| | | </van-field> |
| | | <van-field label="录入人" name="entryPersonName" borderBottom="true" v-model="form.entryPersonName" placeholder="请输入" disabled> |
| | | </van-field> |
| | | <van-field label="录入日期" name="entryDate" borderBottom="true" v-model="form.entryDate" placeholder="请输入" disabled> |
| | | </van-field> |
| | | <van-popup v-model:show="showPicker" destroy-on-close position="bottom"> |
| | | <van-picker |
| | | :columns="userList" |
| | | v-model="pickerValue" |
| | | @confirm="onConfirm" |
| | | @cancel="showPicker = false" |
| | | /> |
| | | </u-popup> |
| | | <u-popup v-model="showCustomerPicker" mode="bottom"> |
| | | <u-picker |
| | | </van-popup> |
| | | <van-popup v-model:show="showCustomerPicker" destroy-on-close position="bottom"> |
| | | <van-picker |
| | | :columns="customerOption" |
| | | v-model="pickerCustomerValue" |
| | | @confirm="onCustomerConfirm" |
| | | @cancel="showCustomerPicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 产品大类选择器 --> |
| | | <u-popup v-model="showCategoryPicker" mode="bottom"> |
| | | <van-popup v-model:show="showCategoryPicker" destroy-on-close position="bottom"> |
| | | <!-- 头部按钮区域 --> |
| | | <view class="popup-header"> |
| | | <view @click="showCategoryPicker = false" class="cancelButton">取消</view> |
| | |
| | | check-strictly |
| | | @check-change="onCategoryConfirm" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 规格型号选择器 --> |
| | | <u-popup v-model="showSpecificationPicker" mode="bottom"> |
| | | <u-picker |
| | | <van-popup v-model:show="showSpecificationPicker" destroy-on-close position="bottom"> |
| | | <van-picker |
| | | :columns="modelOptions" |
| | | v-model="pickerSpecificationValue" |
| | | @confirm="onSpecificationConfirm" |
| | | @cancel="showSpecificationPicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 税率选择器 --> |
| | | <u-popup v-model="showTaxRatePicker" mode="bottom"> |
| | | <u-picker |
| | | <van-popup v-model:show="showTaxRatePicker" destroy-on-close position="bottom"> |
| | | <van-picker |
| | | :columns="taxRateOptions" |
| | | v-model="pickerTaxRateValue" |
| | | @confirm="onTaxRateConfirm" |
| | | @cancel="showTaxRatePicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | |
| | | <!-- 发票类型选择器 --> |
| | | <u-popup v-model="showInvoiceTypePicker" mode="bottom"> |
| | | <u-picker |
| | | <van-popup v-model:show="showInvoiceTypePicker" destroy-on-close position="bottom"> |
| | | <van-picker |
| | | :columns="invoiceTypeOptions" |
| | | v-model="pickerInvoiceTypeValue" |
| | | @confirm="onInvoiceTypeConfirm" |
| | | @cancel="showInvoiceTypePicker = false" |
| | | /> |
| | | </u-popup> |
| | | </van-popup> |
| | | <!-- 产品信息 --> |
| | | <view class="product-section"> |
| | | <view class="section-header"> |
| | | <text class="section-title">产品信息</text> |
| | | <u-button type="primary" size="small" @click="addProduct" class="add-btn" v-if="operationType !== 'view'"> |
| | | <u-icon name="plus" size="14" /> |
| | | 新增 |
| | | </u-button> |
| | | <van-button type="primary" size="small" @click="addProduct" class="add-btn" icon="plus" v-if="operationType !== 'view'">新增</van-button> |
| | | </view> |
| | | <view class="product-card" v-for="(product, idx) in productData" :key="idx"> |
| | | <!-- 产品类 --> |
| | | <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">产品 {{ idx + 1 }}</text> |
| | | </view> |
| | | <!-- 操作按钮 --> |
| | | <view class="product-actions" v-if="operationType !== 'view'"> |
| | | <u-button type="error" size="mini" @click="removeProduct(idx)" class="del-btn"> |
| | | <u-icon name="trash" size="12" /> |
| | | 删除 |
| | | </u-button> |
| | | <van-button type="danger" size="mini" @click="removeProduct(idx)" class="del-btn" icon="delete">删除</van-button> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 产品信息表单 --> |
| | | <view class="product-form"> |
| | | <!-- 产品大类 --> |
| | | <u-form-item |
| | | label="产品大类" |
| | | prop="productCategory" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field |
| | | v-model="product.productCategory" |
| | | is-link |
| | | readonly |
| | | name="productCategory" |
| | | label="产品大类" |
| | | required |
| | | placeholder="请选择" |
| | | :rules="[{ required: true, message: '请选择' }]" |
| | | @click="openCategoryPicker(idx)" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 规格型号 --> |
| | | <u-form-item |
| | | label="规格型号" |
| | | prop="specificationModel" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field |
| | | v-model="product.specificationModel" |
| | | is-link |
| | | readonly |
| | | name="specificationModel" |
| | | label="规格型号" |
| | | required |
| | | :rules="[{ required: true, message: '请选择' }]" |
| | | placeholder="请选择" |
| | | @click="openSpecificationPicker(idx)" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 单位 --> |
| | | <u-form-item |
| | | label="单位" |
| | | prop="unit" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field |
| | | v-model="product.unit" |
| | | name="unit" |
| | | label="单位" |
| | | required |
| | | :rules="[{ required: true, message: '请输入' }]" |
| | | placeholder="请输入" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 税率 --> |
| | | <u-form-item |
| | | label="税率(%)" |
| | | prop="taxRate" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field |
| | | v-model="product.taxRate" |
| | | is-link |
| | | readonly |
| | | name="taxRate" |
| | | label="税率(%)" |
| | | required |
| | | :rules="[{ required: true, message: '请选择' }]" |
| | | placeholder="请选择" |
| | | @click="openTaxRatePicker(idx)" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 含税单价 --> |
| | | <u-form-item |
| | | label="含税单价(元)" |
| | | prop="taxInclusiveUnitPrice" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field |
| | | v-model="product.taxInclusiveUnitPrice" |
| | | name="taxInclusiveUnitPrice" |
| | | label="含税单价(元)" |
| | | type="number" |
| | | required |
| | | :rules="[{ required: true, message: '请输入' }]" |
| | | placeholder="请输入" |
| | | @blur="formatTaxPrice(idx)" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 数量 --> |
| | | <u-form-item |
| | | label="数量" |
| | | prop="quantity" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field |
| | | v-model="product.quantity" |
| | | name="quantity" |
| | | label="数量" |
| | | type="number" |
| | | :rules="[{ required: true, message: '请输入' }]" |
| | | required |
| | | placeholder="请输入" |
| | | @blur="formatAmount(idx)" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 含税总价 --> |
| | | <u-form-item |
| | | label="含税总价(元)" |
| | | prop="taxInclusiveTotalPrice" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field |
| | | v-model="product.taxInclusiveTotalPrice" |
| | | name="taxInclusiveTotalPrice" |
| | | label="含税总价(元)" |
| | | type="number" |
| | | :rules="[{ required: true, message: '请输入' }]" |
| | | required |
| | | placeholder="请输入" |
| | | @blur="formatTaxTotal(idx)" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 不含税总价 --> |
| | | <u-form-item |
| | | label="不含税总价(元)" |
| | | prop="taxExclusiveTotalPrice" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field |
| | | v-model="product.taxExclusiveTotalPrice" |
| | | name="taxExclusiveTotalPrice" |
| | | label="不含税总价(元)" |
| | | type="number" |
| | | required |
| | | :rules="[{ required: true, message: '请输入' }]" |
| | | placeholder="请输入" |
| | | @blur="formatNoTaxTotal(idx)" |
| | | /> |
| | | </u-form-item> |
| | | |
| | | <!-- 发票类型 --> |
| | | <u-form-item |
| | | label="发票类型" |
| | | prop="invoiceType" |
| | | required |
| | | border-bottom |
| | | > |
| | | <u-input |
| | | <van-field |
| | | v-model="product.invoiceType" |
| | | is-link |
| | | readonly |
| | | name="invoiceType" |
| | | label="发票类型" |
| | | :rules="[{ required: true, message: '请选择' }]" |
| | | required |
| | | placeholder="请选择" |
| | | @click="openInvoiceTypePicker(idx)" |
| | | /> |
| | | </u-form-item> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view class="footer-btns" v-if="operationType !== 'view'"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="onSubmit">保存</u-button> |
| | | <van-button class="cancel-btn" @click="goBack">取消</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit">保存</van-button> |
| | | </view> |
| | | </u-form> |
| | | </van-form> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | <template> |
| | | <view class="container"> |
| | | <view class="card"> |
| | | <u-cell-group> |
| | | <u-cell title="昵称" :value="user.nickName"> |
| | | <template #icon> |
| | | <u-icon name="account" size="18" /> |
| | | </template> |
| | | </u-cell> |
| | | <u-cell title="手机号码" :value="user.phonenumber"> |
| | | <template #icon> |
| | | <u-icon name="phone" size="18" /> |
| | | </template> |
| | | </u-cell> |
| | | <u-cell title="邮箱" :value="user.email"> |
| | | <template #icon> |
| | | <u-icon name="email" size="18" /> |
| | | </template> |
| | | </u-cell> |
| | | <u-cell title="岗位" :value="postGroup"> |
| | | <template #icon> |
| | | <u-icon name="star" size="18" /> |
| | | </template> |
| | | </u-cell> |
| | | <u-cell title="角色" :value="roleGroup"> |
| | | <template #icon> |
| | | <u-icon name="account-circle" size="18" /> |
| | | </template> |
| | | </u-cell> |
| | | <u-cell title="创建日期" :value="user.createTime"> |
| | | <template #icon> |
| | | <u-icon name="calendar" size="18" /> |
| | | </template> |
| | | </u-cell> |
| | | </u-cell-group> |
| | | <van-cell-group> |
| | | <van-cell icon="user" title="昵称" :value="user.nickName" /> |
| | | <van-cell icon="phone" title="手机号码" :value="user.phonenumber" /> |
| | | <van-cell icon="invitation" title="邮箱" :value="user.email" /> |
| | | <van-cell icon="medal" title="岗位" :value="postGroup" /> |
| | | <van-cell icon="friends" title="角色" :value="roleGroup" /> |
| | | <van-cell icon="notes" title="创建日期" :value="user.createTime" /> |
| | | </van-cell-group> |
| | | </view> |
| | | |
| | | <!-- <u-button @click="register()">绑定微信</u-button> --> |
| | |
| | | |
| | | .container { |
| | | min-height: 100vh; |
| | | padding: 0; |
| | | padding: 0; /* 24rpx -> 0.75rem */ |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | /* 列表卡片容器 */ |
| | | .card { |
| | | background-color: #ffffff; |
| | | box-shadow: 0 0.375rem 1rem rgba(0, 0, 0, 0.06); |
| | | box-shadow: 0 0.375rem 1rem rgba(0, 0, 0, 0.06); /* 0 12rpx 32rpx -> 0 0.375rem 1rem */ |
| | | overflow: hidden; |
| | | } |
| | | |
| | | /* 适配 uview-plus Cell */ |
| | | :deep(.u-cell) { |
| | | min-height: 3rem; |
| | | /* 适配 Vant Cell */ |
| | | :deep(.van-cell) { |
| | | min-height: 3rem; /* 92rpx -> 2.875rem */ |
| | | align-items: center; |
| | | } |
| | | |
| | | :deep(.u-cell__title) { |
| | | :deep(.van-cell__title) { |
| | | font-weight: 500; |
| | | color: #1f2937; |
| | | color: #1f2937; /* 深灰 */ |
| | | } |
| | | |
| | | :deep(.u-cell__value) { |
| | | color: #6b7280; |
| | | :deep(.van-cell__value) { |
| | | color: #6b7280; /* 次要灰 */ |
| | | } |
| | | |
| | | /* 移除不再使用的 .cell-icon 样式 */ |
| | | </style> |