src/config.js
@@ -1,7 +1,7 @@ // 应用全局配置 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', // 应用信息 src/main.js
@@ -2,9 +2,8 @@ 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' @@ -24,8 +23,7 @@ app.use(store) app.use(uviewPlus) app.use(plugins) // 移除以下行 Vant 注册 // app.use(Vant) app.use(Vant) // 注册全局组件 setupGlobalComponents(app) src/pages.json
@@ -294,13 +294,6 @@ } }, { "path": "pages/cooperativeOffice/clientVisit/detail", "style": { "navigationBarTitleText": "客户拜访登记", "navigationStyle": "custom" } }, { "path": "pages/equipmentManagement/ledger/index", "style": { "navigationBarTitleText": "设备台账", src/pages/cooperativeOffice/clientVisit/detail.vue
@@ -1,122 +1,107 @@ <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 v-model="form.customerName" label="客户名称" placeholder="请输入客户名称" required name="customerName" clearable /> <van-field v-model="form.contact" label="联系人" placeholder="请输入联系人" name="contact" clearable /> <van-field v-model="form.contactPhone" label="联系电话" placeholder="请输入联系电话" name="contactPhone" clearable /> </van-cell-group> <u-cell-group title="客户信息"> <u-form-item label="客户名称" prop="customerName" required border-bottom> <u-input v-model="form.customerName" placeholder="请输入客户名称" readonly /> </u-form-item> <u-form-item label="联系人" prop="contactPerson" border-bottom> <u-input v-model="form.contactPerson" placeholder="请输入联系人" readonly /> </u-form-item> <u-form-item label="联系电话" prop="contactPhone" border-bottom> <u-input v-model="form.contactPhone" placeholder="请输入联系电话" readonly /> </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="拜访目的" placeholder="请输入拜访目的" name="purposeVisit" required clearable /> <van-field v-model="form.purposeDate" label="拜访时间" 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 > <template #right-icon> <van-icon name="location-o" @click.stop="getCurrentLocation" class="location-icon" /> </template> </van-field> </van-cell-group> <u-cell-group title="拜访信息"> <u-form-item label="拜访目的" prop="visitPurpose" required border-bottom> <u-input v-model="form.visitPurpose" placeholder="请输入拜访目的" /> </u-form-item> <u-form-item label="拜访时间" prop="visitTime" required border-bottom> <u-input v-model="form.visitTime" placeholder="请选择拜访时间" readonly @click="showTimePicker" /> </u-form-item> <u-form-item label="拜访地点" prop="visitLocation" required border-bottom> <u-input v-model="form.visitLocation" placeholder="请输入拜访地点" > <template #suffix> <u-icon name="map" @click.stop="getCurrentLocation" class="location-icon" /> </template> </u-input> </u-form-item> </u-cell-group> <!-- 备注信息 --> <van-cell-group title="备注信息" inset> <van-field v-model="form.remark" label="备注" name="remark" type="textarea" placeholder="请输入备注信息" rows="3" autosize clearable /> </van-cell-group> <u-cell-group title="备注信息"> <u-form-item label="备注" prop="remark" border-bottom> <u-textarea v-model="form.remark" placeholder="请输入备注信息" :maxlength="200" count :autoHeight="true" /> </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() src/pages/cooperativeOffice/clientVisit/index.vue
@@ -1,389 +1,59 @@ // 客户拜访 <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="filter-button" @click="getList"> <up-icon name="search" size="24" color="#999"></up-icon> </view> <view> <view class="page-header"> <view class="header-left"> <up-icon name="arrow-left" size="20" color="#333" @click="goBack"></up-icon> </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 class="header-center"> <text class="page-title">客户拜访</text> </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' }) } 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('删除失败') } <script> export default { data() { return { title: '客户拜访' } }) } 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 { padding: 10px 20px; background: #ffffff; } .search-bar { display: flex; align-items: center; gap: 12px; } .search-input { 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; } .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; }, methods: { goBack() { uni.navigateBack({ delta: 1 }) } } } .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%; </script> <style> .page-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 20px; background-color: #f5f5f5; position: relative; } .header-left { display: flex; align-items: center; } .header-center { flex: 1; display: flex; justify-content: center; box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3); z-index: 1000; align-items: center; position: absolute; left: 0; right: 0; pointer-events: none; } .page-title { font-size: 18px; font-weight: bold; pointer-events: auto; } </style> src/pages/cooperativeOffice/collaborativeApproval/approve.vue
@@ -516,23 +516,4 @@ display: flex; 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> </style> src/pages/cooperativeOffice/collaborativeApproval/contactSelect.vue
@@ -30,7 +30,7 @@ <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> @@ -387,56 +387,5 @@ 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> src/pages/cooperativeOffice/collaborativeApproval/detail.vue
@@ -4,61 +4,73 @@ <!-- 表单区域 --> <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 v-model="form.approveReason" placeholder="请输入申请事由" :maxlength="200" count :autoHeight="true" /> </u-form-item> </u-cell-group> <u-cell-group> <u-form-item label="申请部门" prop="approveDeptName" required> <u-input v-model="form.approveDeptName" readonly placeholder="请选择申请部门" @click="showPicker = true" /> </u-form-item> <u-form-item label="申请人" prop="approveUserName" required> <u-input v-model="form.approveUserName" placeholder="请输入申请人" readonly /> </u-form-item> <u-popup v-model="showPicker" mode="bottom"> <u-picker <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="请输入申请事由" show-word-limit required /> </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 /> <van-field v-model="form.approveUserName" name="taxPrice" label="申请人" placeholder="请输入申请人" :rules="[{ required: true, message: '申请人不能为空' }]" required readonly /> <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 v-model="form.approveTime" placeholder="请选择" readonly @click="showDatePicker" /> </u-form-item> <!-- 日期选择器 --> <u-popup v-model="showDate" mode="bottom"> <u-datetime-picker v-model="currentDate" title="选择日期" @confirm="onDateConfirm" @cancel="showDate = false" /> </u-popup> </u-cell-group> </u-form> </van-popup> <van-field v-model="form.approveTime" label="申请日期" placeholder="请选择" readonly required @click="showDatePicker" :rules="[{ required: true, message: '请选择来款日期' }]" /> <!-- 日期选择器 --> <van-popup v-model:show="showDate" position="bottom"> <van-date-picker v-model="currentDate" title="选择日期" @confirm="onDateConfirm" @cancel="showDate = false" /> </van-popup> </van-cell-group> </van-form> </view> <!-- 审核流程区域 --> <view class="approval-process"> @@ -86,13 +98,17 @@ </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> <!-- 底部按钮 --> src/pages/cooperativeOffice/collaborativeApproval/index.vue
@@ -31,27 +31,8 @@ </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> @@ -117,6 +98,7 @@ <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> @@ -479,4 +461,7 @@ .action-btn.approve { /* success 样式来自组件,这里保留钩子以便后续需要扩展 */ } :deep(.van-floating-bubble) { background: #ed8d05; } </style> src/pages/equipmentManagement/ledger/detail.vue
@@ -1,132 +1,128 @@ <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 v-model="form.deviceName" placeholder="请输入设备名称" clearable /> </u-form-item> <u-form-item label="规格型号" prop="deviceModel" required border-bottom> <u-input v-model="form.deviceModel" placeholder="请输入规格型号" 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" placeholder="请输入供应商" clearable /> </u-form-item> <u-form-item label="使用部门" prop="department" required border-bottom> <u-input v-model="form.department" placeholder="请输入使用部门" clearable /> </u-form-item> <u-form-item label="税率" prop="taxRate" required border-bottom> <u-input v-model="form.taxRate" placeholder="请选择税率" readonly @click="showTaxRatePicker" clearable /> </u-form-item> <u-form-item label="使用状态" prop="status" required border-bottom> <u-input v-model="form.status" placeholder="请输入使用状态" clearable /> </u-form-item> <u-form-item label="备注" border-bottom> <u-textarea v-model="form.remark" placeholder="请输入备注" :maxlength="200" count :autoHeight="true" /> </u-form-item> </u-cell-group> <van-cell-group title="基本信息" inset> <van-field v-model="form.deviceName" label="设备名称" placeholder="请输入设备名称" :rules="formRules.deviceName" required clearable /> <van-field v-model="form.deviceModel" label="规格型号" placeholder="请输入规格型号" :readonly="form.deviceModel != null && operationType === 'edit'" :rules="formRules.deviceModel" required clearable /> <van-field v-model="form.supplierName" label="供应商" required placeholder="请输入供应商" :rules="formRules.supplierName" clearable /> <van-field v-model="form.unit" label="单位" required placeholder="请输入单位" :rules="formRules.unit" clearable /> <van-field v-model="form.taxRate" required label="税率(%)" placeholder="请选择" readonly :rules="formRules.taxRate" @click="showTaxRatePicker" clearable /> <van-field v-model="form.number" label="数量" required type="number" placeholder="请输入数量" :rules="formRules.number" @blur="mathNum" clearable /> <van-field v-model="form.taxIncludingPriceUnit" label="含税单价" required type="number" placeholder="请输入含税单价" :rules="formRules.taxIncludingPriceUnit" @blur="mathNum" clearable /> <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'; src/pages/equipmentManagement/ledger/index.vue
@@ -78,25 +78,25 @@ </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> @@ -119,16 +119,7 @@ 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() @@ -339,7 +330,7 @@ color: #999; } // 按钮样式 // 按钮样式,参考 invoiceLedger .action-buttons { display: flex; gap: 12px; src/pages/equipmentManagement/repair/add.vue
@@ -4,83 +4,88 @@ <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 v-model="deviceNameText" placeholder="请选择设备名称" readonly @click="showDevicePicker" clearable > <template #suffix> <u-icon name="scan" @click.stop="startScan" class="scan-icon" /> </template> </u-input> </u-form-item> <u-form-item label="规格型号"> <u-input v-model="form.deviceModel" placeholder="请输入规格型号" readonly clearable /> </u-form-item> <u-form-item label="报修日期" prop="repairTime" required> <u-input v-model="form.repairTime" placeholder="请选择报修日期" readonly @click="showDatePicker" clearable /> </u-form-item> <u-form-item label="报修人" prop="repairName" required> <u-input v-model="form.repairName" placeholder="请输入报修人" clearable /> </u-form-item> <u-form-item label="故障现象" prop="remark" required> <u-textarea v-model="form.remark" placeholder="请输入故障现象" :maxlength="200" count :autoHeight="true" /> </u-form-item> </u-cell-group> <van-cell-group title="基本信息" inset> <van-field v-model="deviceNameText" label="设备名称" placeholder="请选择设备名称" :rules="formRules.deviceLedgerId" required readonly @click="showDevicePicker" clearable > <template #right-icon> <van-icon name="scan" @click.stop="startScan" class="scan-icon" /> </template> </van-field> <van-field v-model="form.deviceModel" label="规格型号" placeholder="请输入规格型号" readonly clearable /> <van-field v-model="form.repairTime" label="报修日期" placeholder="请选择报修日期" :rules="formRules.repairTime" required readonly @click="showDatePicker" clearable /> <van-field v-model="form.repairName" label="报修人" placeholder="请输入报修人" :rules="formRules.repairName" required clearable /> <van-field v-model="form.remark" label="故障现象" type="textarea" rows="3" placeholder="请输入故障现象" :rules="formRules.remark" required clearable maxlength="200" show-word-limit /> </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> @@ -91,16 +96,7 @@ 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: "设备报修表单", src/pages/equipmentManagement/repair/index.vue
@@ -33,38 +33,8 @@ <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> @@ -138,9 +108,11 @@ </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> @@ -150,16 +122,7 @@ 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() src/pages/equipmentManagement/repair/maintain.vue
@@ -1,55 +1,60 @@ <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="请输入实际维修人" clearable /> </u-form-item> <u-form-item label="实际维修日期" prop="repairDate" required border-bottom> <u-input v-model="form.repairDate" placeholder="请选择实际维修日期" 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-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 /> <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 /> </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> @@ -60,16 +65,7 @@ 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: "设备维修表单", src/pages/equipmentManagement/upkeep/add.vue
@@ -1,85 +1,75 @@ <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 v-model="deviceNameText" placeholder="请选择设备名称" readonly @click="showDevicePicker" clearable > <template #suffix> <u-icon name="scan" @click.stop="startScan" class="scan-icon" /> </template> </u-input> </u-form-item> <u-form-item label="规格型号" border-bottom> <u-input v-model="form.deviceModel" placeholder="请输入规格型号" readonly clearable /> </u-form-item> <u-form-item label="保养日期" prop="upkeepDate" required border-bottom> <u-input v-model="form.upkeepDate" placeholder="请选择保养日期" readonly @click="showDatePicker" clearable /> </u-form-item> </u-cell-group> <van-cell-group title="基本信息" inset> <van-field v-model="deviceNameText" label="设备名称" placeholder="请选择设备名称" :rules="formRules.deviceLedgerId" required readonly @click="showDevicePicker" clearable > <template #right-icon> <van-icon name="scan" @click.stop="startScan" class="scan-icon" /> </template> </van-field> <van-field v-model="form.deviceModel" label="规格型号" placeholder="请输入规格型号" readonly clearable /> <van-field v-model="form.maintenancePlanTime" label="计划保养日期" placeholder="请选择计划保养日期" :rules="formRules.maintenancePlanTime" required readonly @click="showDatePicker" 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="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'; src/pages/equipmentManagement/upkeep/index.vue
@@ -33,46 +33,8 @@ <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> @@ -152,10 +114,13 @@ <view v-else class="no-data"> <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> @@ -165,15 +130,7 @@ 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() src/pages/equipmentManagement/upkeep/maintain.vue
@@ -4,62 +4,65 @@ <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 v-model="form.maintenanceActuallyName" placeholder="请输入实际保养人" clearable /> </u-form-item> <u-form-item label="实际保养日期" prop="maintenanceActuallyTime" required> <u-input v-model="form.maintenanceActuallyTime" placeholder="请选择实际保养日期" readonly @click="showDatePicker" clearable /> </u-form-item> <u-form-item label="保养结果" prop="maintenanceResult" required> <u-input v-model="maintenanceResultText" placeholder="请选择保养结果" readonly @click="showResultPicker" clearable /> </u-form-item> </u-cell-group> <van-cell-group title="保养信息" inset> <van-field v-model="form.maintenanceActuallyName" label="实际保养人" placeholder="请输入实际保养人" :rules="formRules.maintenanceActuallyName" required clearable /> <van-field v-model="form.maintenanceActuallyTime" label="实际保养日期" placeholder="请选择实际保养日期" :rules="formRules.maintenanceActuallyTime" required readonly @click="showDatePicker" clearable /> <van-field v-model="maintenanceResultText" label="保养结果" placeholder="请选择保养结果" :rules="formRules.maintenanceResult" required readonly @click="showResultPicker" 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="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> @@ -70,16 +73,7 @@ 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: "设备保养表单", src/pages/login.vue
@@ -101,7 +101,8 @@ } function getUserLoginFacotryList() { userLoginFacotryList({userName:loginForm.value.username}).then(res => { if(loginForm.value.username){ userLoginFacotryList({userName:loginForm.value.username}).then(res => { // 检查res.data是否为数组 if (res.data && Array.isArray(res.data)) { // 重新组装数据格式:deptId变成id,deptName变成name @@ -117,6 +118,9 @@ modal.msgError('获取公司列表失败:', error) factoryList.value = [] }) }else { factoryList.value = [] } } async function handleLogin() { src/pages/procurementManagement/invoiceEntry/add.vue
@@ -540,141 +540,3 @@ } } </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> src/pages/procurementManagement/paymentEntry/add.vue
@@ -4,137 +4,115 @@ <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.purchaseContractNumber" placeholder="自动填充" readonly /> </u-form-item> <u-form-item label="销售合同号" border-bottom> <u-input v-model="form.salesContractNo" 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.invoiceNumber" placeholder="自动填充" readonly /> </u-form-item> <u-form-item label="发票金额(元)" border-bottom> <u-input v-model="form.invoiceAmount" placeholder="自动填充" readonly /> </u-form-item> <view class="tip-text">待付款金额:{{ currentNoReceiptAmount }} 元</view> <u-form-item label="本次付款金额" prop="currentPaymentAmount" required border-bottom> <u-input v-model="form.currentPaymentAmount" type="number" placeholder="请输入" @blur="changeNum" clearable /> </u-form-item> <u-form-item label="付款形式" prop="paymentMethod" required border-bottom> <u-input v-model="form.paymentMethod" 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-form-item label="登记人" border-bottom> <u-input v-model="form.registrant" placeholder="自动填充" readonly /> </u-form-item> <u-form-item label="登记日期" prop="registrationtDate" required border-bottom> <u-input v-model="form.registrationtDate" placeholder="请选择" readonly /> </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.salesContractNo" 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-field v-model="form.registrant" label="登记人" placeholder="自动填充" readonly /> <van-field v-model="form.registrationtDate" label="登记日期" placeholder="请选择" readonly :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" <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() src/pages/procurementManagement/paymentEntry/edit.vue
@@ -1,83 +1,94 @@ <template> <view class="payment-edit"> <!-- 使用通用页面头部组件 --> <PageHeader title="编辑付款" @back="onClickLeft" /> <!-- 表单内容 --> <u-form @submit="onSubmit" 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.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> <!-- 提交按钮 --> <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> </view> </u-form> <view class="account-detail"> <!-- 使用通用页面头部组件 --> <PageHeader title="新增付款" @back="onClickLeft" /> <!-- 表单内容 --> <van-form @submit="onSubmit" 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.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"> <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> </van-form> <!-- 付款方式选择器 --> <u-popup v-model="showPaymentType" mode="bottom"> <u-picker v-model="pickerValue" :columns="paymentTypeOptions" @confirm="onPaymentTypeConfirm" @cancel="showPaymentType = false" /> </u-popup> <!-- 付款方式选择器 --> <van-popup v-model:show="showPaymentType" position="bottom"> <van-picker :model-value="pickerValue" :columns="receipt_payment_type" @confirm="onPaymentTypeConfirm" @cancel="showPaymentType = false" /> </van-popup> <!-- 日期选择器 --> <u-popup v-model="showDate" mode="bottom"> <u-datetime-picker v-model="currentDate" title="选择日期" @confirm="onDateConfirm" @cancel="showDate = false" /> </u-popup> </view> <!-- 日期选择器 --> <van-popup v-model:show="showDate" position="bottom"> <van-date-picker v-model="currentDate" title="选择日期" @confirm="onDateConfirm" @cancel="showDate = false" /> </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' src/pages/procurementManagement/paymentEntry/index.vue
@@ -15,14 +15,14 @@ /> </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> @@ -35,12 +35,12 @@ <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> @@ -70,7 +70,7 @@ <!-- 操作按钮 --> <view class="action-buttons"> <u-button <van-button type="primary" size="small" class="action-btn" @@ -78,7 +78,7 @@ @click="openForm('add', item)" > 新增付款 </u-button> </van-button> </view> </view> </view> @@ -94,18 +94,9 @@ <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([]) src/pages/procurementManagement/procurementInvoiceLedger/detail.vue
@@ -3,68 +3,53 @@ <!-- 使用通用页面头部组件 --> <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() src/pages/procurementManagement/procurementLedger/detail.vue
@@ -4,57 +4,58 @@ <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 v-model="form.salesContractNo" readonly placeholder="点击选择销售合同号" @click="showPicker = true" /> </u-form-item> <u-form-item label="供应商名称" prop="supplierName" required border-bottom> <u-input v-model="form.supplierName" readonly placeholder="点击选择供应商" @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-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" /> <van-field v-model="form.supplierName" is-link readonly required name="supplierName" label="供应商名称" placeholder="点击选择供应商" :rules="[{ required: true, message: '请选择供应商' }]" @click="showCustomerPicker = true" /> <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> @@ -68,159 +69,175 @@ 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> <view class="product-actions" v-if="operationType !== 'view'"> <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 v-model="product.productCategory" readonly placeholder="请选择" @click="openCategoryPicker(idx)" /> </view> <van-field v-model="product.productCategory" is-link readonly name="productCategory" label="产品大类" required placeholder="请选择" :rules="[{ required: true, message: '请选择' }]" @click="openCategoryPicker(idx)" /> <!-- 规格型号 --> <view class="product-specificationModel" prop="specificationModel" required border-bottom> <u-input v-model="product.specificationModel" readonly placeholder="请选择" @click="openSpecificationPicker(idx)" /> </view> <van-field v-model="product.specificationModel" is-link readonly name="specificationModel" label="规格型号" required :rules="[{ required: true, message: '请选择' }]" placeholder="请选择" @click="openSpecificationPicker(idx)" /> <!-- 单位 --> <view class="product-unit" prop="unit" required border-bottom> <u-input v-model="product.unit" placeholder="请输入" /> </view> <van-field v-model="product.unit" name="unit" label="单位" required :rules="[{ required: true, message: '请输入' }]" placeholder="请输入" /> <!-- 税率 --> <view class="product-taxRate" prop="taxRate" required border-bottom> <u-input v-model="product.taxRate" readonly placeholder="请选择" @click="openTaxRatePicker(idx)" /> </view> <van-field v-model="product.taxRate" is-link readonly name="taxRate" label="税率(%)" required :rules="[{ required: true, message: '请选择' }]" placeholder="请选择" @click="openTaxRatePicker(idx)" /> <!-- 含税单价 --> <view class="product-taxInclusiveUnitPrice" prop="taxInclusiveUnitPrice" required border-bottom> <u-input v-model="product.taxInclusiveUnitPrice" type="number" placeholder="请输入" @blur="formatTaxPrice(idx)" /> </view> <van-field v-model="product.taxInclusiveUnitPrice" name="taxInclusiveUnitPrice" label="含税单价(元)" type="number" required :rules="[{ required: true, message: '请输入' }]" placeholder="请输入" @blur="formatTaxPrice(idx)" /> <!-- 数量 --> <view class="product-quantity" prop="quantity" required border-bottom> <u-input v-model="product.quantity" type="number" placeholder="请输入" @blur="formatAmount(idx)" /> </view> <van-field v-model="product.quantity" name="quantity" label="数量" type="number" :rules="[{ required: true, message: '请输入' }]" required placeholder="请输入" @blur="formatAmount(idx)" /> <!-- 含税总价 --> <view class="product-taxInclusiveTotalPrice" prop="taxInclusiveTotalPrice" required border-bottom> <u-input v-model="product.taxInclusiveTotalPrice" type="number" placeholder="请输入" @blur="formatTaxTotal(idx)" /> </view> <van-field v-model="product.taxInclusiveTotalPrice" name="taxInclusiveTotalPrice" label="含税总价(元)" type="number" :rules="[{ required: true, message: '请输入' }]" required placeholder="请输入" @blur="formatTaxTotal(idx)" /> <!-- 不含税总价 --> <view class="product-taxExclusiveTotalPrice" prop="taxExclusiveTotalPrice" required border-bottom> <u-input v-model="product.taxExclusiveTotalPrice" type="number" placeholder="请输入" @blur="formatNoTaxTotal(idx)" /> </view> <van-field v-model="product.taxExclusiveTotalPrice" name="taxExclusiveTotalPrice" label="不含税总价(元)" type="number" required :rules="[{ required: true, message: '请输入' }]" placeholder="请输入" @blur="formatNoTaxTotal(idx)" /> <!-- 发票类型 --> <view class="product-invoiceType" prop="invoiceType" required border-bottom> <u-input v-model="product.invoiceType" readonly placeholder="请选择" @click="openInvoiceTypePicker(idx)" /> </view> <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 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> @@ -720,10 +737,10 @@ .form-section { margin-top: 1rem; } .u-form-item { .van-field { height: 3.4rem; } .u-cell { .van-cell { align-items: center; } .product-section { src/pages/sales/invoiceLedger/detail.vue
@@ -1,93 +1,56 @@ <template> <view class="invoice-detail"> <view class="account-detail"> <!-- 使用通用页面头部组件 --> <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> <u-cell-group title="附件材料(仅支持 pdf)"> <u-upload <PageHeader title="编辑开票台账" @back="goBack" /> <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> <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> <!-- 提交按钮 --> <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> </van-cell-group> <!-- 开票日期选择器 --> <u-popup v-model="showInvoiceDatePicker" mode="bottom"> <u-datetime-picker v-model="invoiceDateValue" <view class="footer-btns"> <van-button class="cancel-btn" @click="goBack">取消</van-button> <van-button class="save-btn" native-type="submit" form-type="submit">保存</van-button> </view> </van-form> <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' src/pages/sales/invoicingRegistration/add.vue
@@ -4,67 +4,63 @@ <PageHeader title="新增开票登记" @back="goBack" /> <!-- 表单内容 --> <u-form @submit="submitForm" ref="formRef" label-width="110" input-align="right" error-message-align="right"> <van-form @submit="submitForm" ref="formRef" label-width="110px" input-align="right" error-message-align="right" scroll-to-error scroll-to-error-position="center"> <!-- 基本信息 --> <u-cell-group title="基本信息"> <u-form-item label="销售合同号" border-bottom> <u-input v-model="form.salesContractNo" readonly placeholder="自动填充" /> </u-form-item> <u-form-item label="客户名称" border-bottom> <u-input v-model="form.customerName" readonly placeholder="自动填充" /> </u-form-item> <u-form-item label="业务员" border-bottom> <u-input v-model="form.salesman" readonly placeholder="自动填充" /> </u-form-item> <u-form-item label="项目名称" border-bottom> <u-input v-model="form.projectName" readonly placeholder="自动填充" /> </u-form-item> <u-form-item label="录入人" border-bottom> <u-input v-model="form.createUer" readonly placeholder="请输入录入人" /> </u-form-item> <u-form-item label="录入日期" border-bottom> <u-input v-model="form.createTime" readonly placeholder="请选择录入日期" @click="showCreateTimePicker = true" /> </u-form-item> <u-form-item label="发票号码" prop="invoiceNo" required border-bottom> <u-input v-model="form.invoiceNo" placeholder="请输入发票号码" /> </u-form-item> <u-form-item label="开票日期" prop="issueDate" required border-bottom> <u-input v-model="form.issueDate" readonly placeholder="请选择开票日期" @click="showIssueDatePicker = true" /> </u-form-item> </u-cell-group> <van-cell-group title="基本信息" inset> <van-field v-model="form.salesContractNo" label="销售合同号" readonly placeholder="自动填充" /> <van-field v-model="form.customerName" label="客户名称" readonly placeholder="自动填充" /> <van-field v-model="form.salesman" label="业务员" readonly placeholder="自动填充" /> <van-field v-model="form.projectName" label="项目名称" readonly placeholder="自动填充" /> <van-field v-model="form.createUer" label="录入人" readonly placeholder="请输入录入人" /> <van-field v-model="form.createTime" label="录入日期" readonly placeholder="请选择录入日期" @click="showCreateTimePicker = true" /> <van-field v-model="form.invoiceNo" label="发票号码" required placeholder="请输入发票号码" :rules="[{ required: true, message: '请输入发票号码' }]" /> <van-field v-model="form.issueDate" label="开票日期" readonly placeholder="请选择开票日期" required @click="showIssueDatePicker = true" :rules="[{ required: true, message: '请选择开票日期' }]" /> </van-cell-group> <!-- 产品信息 --> <view class="product-section"> @@ -73,7 +69,7 @@ </view> <view v-if="productData.length === 0" class="empty-state"> <u-empty text="暂无产品数据" /> <van-empty description="暂无产品数据" /> </view> <view v-else class="product-list"> @@ -85,151 +81,120 @@ <!-- 产品头部 --> <view class="product-header"> <view class="product-title"> <u-icon name="file-text" color="#2979ff" size="15" /> <van-icon name="description" color="#2979ff" size="15" /> <text class="product-productCategory">产品 {{ index + 1 }}</text> </view> </view> <!-- 产品信息表单 --> <view class="product-form"> <u-form-item label="产品大类" border-bottom> <u-input v-model="item.productCategory" readonly /> </u-form-item> <u-form-item label="规格型号" border-bottom> <u-input v-model="item.specificationModel" readonly /> </u-form-item> <u-form-item label="单位" border-bottom> <u-input v-model="item.unit" readonly /> </u-form-item> <u-form-item label="数量" border-bottom> <u-input v-model="item.quantity" readonly /> </u-form-item> <u-form-item label="税率(%)" border-bottom> <u-input v-model="item.taxRate" readonly /> </u-form-item> <u-form-item label="含税单价(元)" border-bottom> <u-input v-model="item.taxInclusiveUnitPrice" readonly /> </u-form-item> <u-form-item label="含税总价(元)" border-bottom> <u-input v-model="item.taxInclusiveTotalPrice" readonly /> </u-form-item> <u-form-item label="不含税总价(元)" border-bottom> <u-input v-model="item.taxExclusiveTotalPrice" readonly /> </u-form-item> <van-field v-model="item.productCategory" label="产品大类" readonly /> <van-field v-model="item.specificationModel" label="规格型号" readonly /> <van-field v-model="item.unit" label="单位" readonly /> <van-field v-model="item.quantity" label="数量" readonly /> <van-field v-model="item.taxRate" label="税率(%)" readonly /> <van-field v-model="item.taxInclusiveUnitPrice" label="含税单价(元)" readonly /> <van-field v-model="item.taxInclusiveTotalPrice" label="含税总价(元)" readonly /> <van-field v-model="item.taxExclusiveTotalPrice" label="不含税总价(元)" readonly /> <!-- 本次开票信息 --> <u-form-item label="本次开票数" border-bottom> <u-input v-model="item.currentInvoiceNum" type="number" placeholder="请输入开票数量" @blur="invoiceNumBlur(item)" /> </u-form-item> <u-form-item label="本次开票金额(元)" border-bottom> <u-input v-model="item.currentInvoiceAmount" type="number" placeholder="请输入开票金额" @blur="invoiceAmountBlur(item)" /> </u-form-item> <van-field v-model="item.currentInvoiceNum" label="本次开票数" type="number" placeholder="请输入开票数量" @blur="invoiceNumBlur(item)" /> <van-field v-model="item.currentInvoiceAmount" label="本次开票金额(元)" type="number" placeholder="请输入开票金额" @blur="invoiceAmountBlur(item)" /> <!-- 未开票信息 --> <u-form-item label="未开票数" border-bottom> <u-input v-model="item.noInvoiceNum" readonly /> </u-form-item> <u-form-item label="未开票金额(元)" border-bottom> <u-input v-model="item.noInvoiceAmount" readonly /> </u-form-item> <van-field v-model="item.noInvoiceNum" label="未开票数" readonly /> <van-field v-model="item.noInvoiceAmount" label="未开票金额(元)" readonly /> </view> </view> </view> </view> <!-- 提交按钮 --> <view class="footer-btns"> <u-button class="cancel-btn" @click="goBack">取消</u-button> <u-button class="save-btn" type="primary" @click="submitForm">保存</u-button> </view> </u-form> <view class="footer-btns"> <van-button class="cancel-btn" @click="goBack">取消</van-button> <van-button class="save-btn" native-type="submit" form-type="submit">保存</van-button> </view> </van-form> <!-- 日期选择器 --> <u-popup v-model="showIssueDatePicker" mode="bottom"> <u-datetime-picker <van-popup v-model:show="showIssueDatePicker" position="bottom"> <van-date-picker v-model="currentIssueDate" title="选择开票日期" @confirm="onIssueDateConfirm" @cancel="showIssueDatePicker = false" /> </u-popup> </van-popup> <u-popup v-model="showCreateTimePicker" mode="bottom"> <u-datetime-picker <van-popup v-model:show="showCreateTimePicker" position="bottom"> <van-date-picker v-model="currentCreateTime" title="选择录入日期" @confirm="onCreateTimeConfirm" @cancel="showCreateTimePicker = false" /> </u-popup> </van-popup> </view> </template> <script setup> import { ref, reactive, onMounted } from 'vue' // 替换 Vant 的 toast 为 uni 原生或 uview-plus 的方法 // import { showToast, showLoadingToast, closeToast } from 'vant' import { showToast, showLoadingToast, closeToast } from 'vant' import { invoiceRegistrationSave } from '@/api/salesManagement/invoiceRegistration' import useUserStore from '@/store/modules/user' import {getSalesLedgerWithProducts} from "@/api/salesManagement/salesLedger"; // 替换 toast 方法 const showToast = (message) => { uni.showToast({ title: message, icon: 'none' }) } const showLoadingToast = (message) => { uni.showLoading({ title: message || '加载中...' }) } const closeToast = () => { uni.hideLoading() } const userStore = useUserStore() const editData = ref(null); src/pages/sales/invoicingRegistration/index.vue
@@ -14,7 +14,7 @@ /> </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> @@ -26,12 +26,12 @@ <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"> @@ -66,7 +66,7 @@ <!-- 操作按钮区域 --> <view class="action-buttons"> <u-button <van-button type="primary" size="small" @click="handleAddInvoice(item)" @@ -74,15 +74,15 @@ :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> src/pages/sales/receiptPayment/add.vue
@@ -4,105 +4,99 @@ <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.salesContractNo" placeholder="自动填充" readonly /> </u-form-item> <u-form-item label="客户名称" border-bottom> <u-input v-model="form.customerName" 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.invoiceTotal" placeholder="自动填充" readonly /> </u-form-item> <u-form-item label="税率" border-bottom> <u-input v-model="form.taxRate" placeholder="自动填充" readonly /> </u-form-item> <view class="tip-text">待回款金额:{{ currentNoReceiptAmount }} 元</view> <u-form-item label="本次回款金额" prop="receiptPaymentAmount" required border-bottom> <u-input v-model="form.receiptPaymentAmount" type="number" placeholder="请输入" @blur="changeNum" clearable /> </u-form-item> <u-form-item label="回款形式" prop="receiptPaymentTypeName" required border-bottom> <u-input v-model="form.receiptPaymentTypeName" placeholder="请选择" readonly @click="showPaymentTypePicker" /> </u-form-item> <u-form-item label="来款日期" prop="receiptPaymentDate" required border-bottom> <u-input v-model="form.receiptPaymentDate" placeholder="请选择" readonly @click="showDatePicker" /> </u-form-item> <u-form-item label="登记人" border-bottom> <u-input v-model="form.registrant" placeholder="自动填充" readonly /> </u-form-item> </u-cell-group> <van-cell-group title="基本信息" inset> <van-field v-model="form.salesContractNo" label="销售合同号" placeholder="自动填充" readonly /> <van-field v-model="form.customerName" label="客户名称" placeholder="自动填充" readonly /> <van-field v-model="form.invoiceNo" label="发票号" placeholder="自动填充" readonly /> <van-field v-model="form.invoiceTotal" label="发票金额(元)" placeholder="自动填充" readonly /> <van-field v-model="form.taxRate" label="税率" placeholder="自动填充" readonly /> <view class="tip-text">待回款金额:{{ currentNoReceiptAmount }} 元</view> <van-field v-model="form.receiptPaymentAmount" label="本次回款金额" type="number" placeholder="请输入" @blur="changeNum" :rules="[{ required: true, message: '请输入回款金额' }]" clearable /> <van-field v-model="form.receiptPaymentTypeName" label="回款形式" placeholder="请选择" readonly @click="showPaymentTypePicker" :rules="[{ required: true, message: '请选择回款形式' }]" /> <van-field v-model="form.receiptPaymentDate" label="来款日期" placeholder="请选择" readonly @click="showDatePicker" :rules="[{ required: true, message: '请选择来款日期' }]" /> <van-field v-model="form.registrant" label="登记人" placeholder="自动填充" readonly /> </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> @@ -110,24 +104,8 @@ 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() src/pages/sales/receiptPayment/edit.vue
@@ -4,104 +4,98 @@ <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.salesContractNo" placeholder="自动填充" readonly /> </u-form-item> <u-form-item label="客户名称" border-bottom> <u-input v-model="form.customerName" 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.invoiceTotal"--> <!-- placeholder="自动填充"--> <!-- readonly--> <!-- />--> <!-- </u-form-item>--> <!-- <u-form-item label="税率" border-bottom>--> <!-- <u-input--> <!-- v-model="form.taxRate"--> <!-- placeholder="自动填充"--> <!-- readonly--> <!-- />--> <!-- </u-form-item>--> <van-cell-group title="基本信息" inset> <van-field v-model="form.salesContractNo" label="销售合同号" placeholder="自动填充" readonly /> <van-field v-model="form.customerName" label="客户名称" placeholder="自动填充" readonly /> <!-- <van-field--> <!-- v-model="form.invoiceNo"--> <!-- label="发票号"--> <!-- placeholder="自动填充"--> <!-- readonly--> <!-- />--> <!-- <van-field--> <!-- v-model="form.invoiceTotal"--> <!-- label="发票金额(元)"--> <!-- placeholder="自动填充"--> <!-- readonly--> <!-- />--> <!-- <van-field--> <!-- v-model="form.taxRate"--> <!-- label="税率"--> <!-- placeholder="自动填充"--> <!-- readonly--> <!-- />--> <view class="tip-text">待回款金额:{{ currentNoReceiptAmount }} 元</view> <u-form-item label="本次回款金额" prop="receiptPaymentAmount" required border-bottom> <u-input v-model="form.receiptPaymentAmount" type="number" placeholder="请输入" @blur="changeNum" clearable /> </u-form-item> <u-form-item label="回款形式" prop="receiptPaymentTypeName" required border-bottom> <u-input v-model="form.receiptPaymentTypeName" placeholder="请选择" readonly @click="showPaymentTypePicker" /> </u-form-item> <u-form-item label="来款日期" prop="receiptPaymentDate" required border-bottom> <u-input v-model="form.receiptPaymentDate" placeholder="请选择" readonly /> </u-form-item> <u-form-item label="登记人" border-bottom> <u-input v-model="form.registrant" placeholder="自动填充" readonly /> </u-form-item> </u-cell-group> <van-field v-model="form.receiptPaymentAmount" label="本次回款金额" type="number" placeholder="请输入" @blur="changeNum" :rules="[{ required: true, message: '请输入回款金额' }]" clearable /> <van-field v-model="form.receiptPaymentTypeName" label="回款形式" placeholder="请选择" readonly @click="showPaymentTypePicker" :rules="[{ required: true, message: '请选择回款形式' }]" /> <van-field v-model="form.receiptPaymentDate" label="来款日期" placeholder="请选择" readonly :rules="[{ required: true, message: '请选择来款日期' }]" /> <van-field v-model="form.registrant" label="登记人" placeholder="自动填充" readonly /> </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> @@ -109,24 +103,8 @@ 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() src/pages/sales/receiptPayment/index.vue
@@ -15,14 +15,14 @@ /> </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> @@ -35,12 +35,12 @@ <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> @@ -82,7 +82,7 @@ <!-- 操作按钮 --> <view class="action-buttons"> <u-button <van-button type="primary" size="small" class="action-btn" @@ -90,7 +90,7 @@ @click="openForm(item)" > 新增回款 </u-button> </van-button> </view> </view> </view> @@ -98,7 +98,7 @@ <!-- 无数据提示 --> <view class="no-data" v-else> <text>暂无数据</text> <text>暂无回款数据</text> </view> </view> </template> src/pages/sales/salesAccount/detail.vue
@@ -4,93 +4,80 @@ <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 <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="业务员" prop="salesman" required border-bottom > <u-input v-model="form.salesman" readonly placeholder="点击选择业务员" @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 placeholder="点击选择业务员" :rules="[{ required: true, message: '请选择业务员' }]" @click="showPicker = true" /> <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="客户名称" prop="customerName" placeholder="点击选择客户" :rules="[{ required: true, message: '请选择客户' }]" @click="showCustomerPicker = true" /> <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 border-bottom > <u-input v-model="form.customerName" readonly placeholder="点击选择客户" @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 name="executionDate" label="签订日期" prop="executionDate" required border-bottom > <u-input v-model="form.executionDate" readonly placeholder="点击选择时间" @click="showDatePicker = true" /> </u-form-item> <u-popup v-model="showDatePicker" mode="bottom"> <u-datetime-picker placeholder="点击选择时间" :rules="[{ required: true, message: '签订日期不能为空' }]" @click="showDatePicker = true" /> <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> @@ -104,204 +91,175 @@ 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> <view class="product-actions" v-if="operationType !== 'view'"> <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 <van-field v-model="product.productCategory" is-link readonly name="productCategory" label="产品大类" prop="productCategory" required border-bottom > <u-input v-model="product.productCategory" readonly placeholder="请选择" @click="openCategoryPicker(idx)" /> </u-form-item> placeholder="请选择" :rules="[{ required: true, message: '请选择' }]" @click="openCategoryPicker(idx)" /> <!-- 规格型号 --> <u-form-item <van-field v-model="product.specificationModel" is-link readonly name="specificationModel" label="规格型号" prop="specificationModel" required border-bottom > <u-input v-model="product.specificationModel" readonly placeholder="请选择" @click="openSpecificationPicker(idx)" /> </u-form-item> :rules="[{ required: true, message: '请选择' }]" placeholder="请选择" @click="openSpecificationPicker(idx)" /> <!-- 单位 --> <u-form-item <van-field v-model="product.unit" name="unit" label="单位" prop="unit" required border-bottom > <u-input v-model="product.unit" placeholder="请输入" /> </u-form-item> :rules="[{ required: true, message: '请输入' }]" placeholder="请输入" /> <!-- 税率 --> <u-form-item <van-field v-model="product.taxRate" is-link readonly name="taxRate" label="税率(%)" prop="taxRate" required border-bottom > <u-input v-model="product.taxRate" readonly placeholder="请选择" @click="openTaxRatePicker(idx)" /> </u-form-item> :rules="[{ required: true, message: '请选择' }]" placeholder="请选择" @click="openTaxRatePicker(idx)" /> <!-- 含税单价 --> <u-form-item <van-field v-model="product.taxInclusiveUnitPrice" name="taxInclusiveUnitPrice" label="含税单价(元)" prop="taxInclusiveUnitPrice" type="number" required border-bottom > <u-input v-model="product.taxInclusiveUnitPrice" type="number" placeholder="请输入" @blur="formatTaxPrice(idx)" /> </u-form-item> :rules="[{ required: true, message: '请输入' }]" placeholder="请输入" @blur="formatTaxPrice(idx)" /> <!-- 数量 --> <u-form-item <van-field v-model="product.quantity" name="quantity" label="数量" prop="quantity" type="number" :rules="[{ required: true, message: '请输入' }]" required border-bottom > <u-input v-model="product.quantity" type="number" placeholder="请输入" @blur="formatAmount(idx)" /> </u-form-item> placeholder="请输入" @blur="formatAmount(idx)" /> <!-- 含税总价 --> <u-form-item <van-field v-model="product.taxInclusiveTotalPrice" name="taxInclusiveTotalPrice" label="含税总价(元)" prop="taxInclusiveTotalPrice" type="number" :rules="[{ required: true, message: '请输入' }]" required border-bottom > <u-input v-model="product.taxInclusiveTotalPrice" type="number" placeholder="请输入" @blur="formatTaxTotal(idx)" /> </u-form-item> placeholder="请输入" @blur="formatTaxTotal(idx)" /> <!-- 不含税总价 --> <u-form-item <van-field v-model="product.taxExclusiveTotalPrice" name="taxExclusiveTotalPrice" label="不含税总价(元)" prop="taxExclusiveTotalPrice" type="number" required border-bottom > <u-input v-model="product.taxExclusiveTotalPrice" type="number" placeholder="请输入" @blur="formatNoTaxTotal(idx)" /> </u-form-item> :rules="[{ required: true, message: '请输入' }]" placeholder="请输入" @blur="formatNoTaxTotal(idx)" /> <!-- 发票类型 --> <u-form-item <van-field v-model="product.invoiceType" is-link readonly name="invoiceType" label="发票类型" prop="invoiceType" :rules="[{ required: true, message: '请选择' }]" required border-bottom > <u-input v-model="product.invoiceType" readonly placeholder="请选择" @click="openInvoiceTypePicker(idx)" /> </u-form-item> placeholder="请选择" @click="openInvoiceTypePicker(idx)" /> </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> src/pages_mine/pages/info/index.vue
@@ -1,38 +1,14 @@ <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> --> @@ -78,29 +54,31 @@ .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>