gaoluyang
6 天以前 7a0ffb0048adeda9ebfbca1d0b525eb224c173e3
修改组件
已修改32个文件
3642 ■■■■■ 文件已修改
src/config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/clientVisit/detail.vue 179 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/clientVisit/index.vue 418 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/collaborativeApproval/approve.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/collaborativeApproval/contactSelect.vue 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/collaborativeApproval/detail.vue 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/collaborativeApproval/index.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/ledger/detail.vue 202 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/ledger/index.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/repair/add.vue 134 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/repair/index.vue 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/repair/maintain.vue 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/upkeep/add.vue 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/upkeep/index.vue 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/equipmentManagement/upkeep/maintain.vue 90 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/login.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/invoiceEntry/add.vue 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/paymentEntry/add.vue 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/paymentEntry/edit.vue 159 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/paymentEntry/index.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/procurementInvoiceLedger/detail.vue 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/procurementLedger/detail.vue 285 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/invoiceLedger/detail.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/invoicingRegistration/add.vue 303 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/invoicingRegistration/index.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/receiptPayment/add.vue 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/receiptPayment/edit.vue 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/receiptPayment/index.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/sales/salesAccount/detail.vue 330 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages_mine/pages/info/index.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>