gaoluyang
6 天以前 5c48ef2b8267c38bae717202615e1618074ee31c
修改组件
已修改31个文件
已添加2个文件
3831 ■■■■■ 文件已修改
src/api/cooperativeOffice/clientVisit.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/clientVisit/detail.vue 339 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/clientVisit/index.vue 406 ●●●●● 补丁 | 查看 | 原始文档 | 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 99 ●●●●● 补丁 | 查看 | 原始文档 | 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/api/cooperativeOffice/clientVisit.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
// å®¢æˆ·æ‹œè®¿ç›¸å…³æŽ¥å£
import request from '@/utils/request'
// å®¢æˆ·æ‹œè®¿ç­¾åˆ°
export function clientVisitSignIn(data) {
    return request({
        url: '/customerVisits/add',
        method: 'post',
        data: data
    })
}
// èŽ·å–æ‹œè®¿è®°å½•åˆ—è¡¨
export function getVisitRecords(query) {
    return request({
        url: '/customerVisits/listPage',
        method: 'get',
        params: query
    })
}
// èŽ·å–æ‹œè®¿è®°å½•è¯¦æƒ…
export function getVisitDetail(id) {
    return request({
        url: `/cooperative/clientVisit/detail/${id}`,
        method: 'get'
    })
}
// æ›´æ–°æ‹œè®¿è®°å½•
export function updateVisitRecord(data) {
    return request({
        url: '/cooperative/clientVisit/update',
        method: 'put',
        data: data
    })
}
// åˆ é™¤æ‹œè®¿è®°å½•
export function deleteVisitRecord(id) {
    return request({
        url: `/cooperative/clientVisit/delete/${id}`,
        method: 'delete'
    })
}
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,8 +2,9 @@
import plugins from './plugins'
import store from './store'
import uviewPlus from 'uview-plus'
import Vant from 'vant';
import 'vant/lib/index.css';
// ç§»é™¤ä»¥ä¸‹ä¸¤è¡Œ Vant ç›¸å…³å¯¼å…¥
// import Vant from 'vant';
// import 'vant/lib/index.css';
import { setupGlobalComponents } from './components'
@@ -23,7 +24,8 @@
  app.use(store)
  app.use(uviewPlus)
  app.use(plugins)
  app.use(Vant)
  // ç§»é™¤ä»¥ä¸‹è¡Œ Vant æ³¨å†Œ
  // app.use(Vant)
  
  // æ³¨å†Œå…¨å±€ç»„ä»¶
  setupGlobalComponents(app)
src/pages.json
@@ -294,6 +294,13 @@
      }
    },
    {
      "path": "pages/cooperativeOffice/clientVisit/detail",
      "style": {
        "navigationBarTitleText": "客户拜访登记",
        "navigationStyle": "custom"
      }
    },
    {
      "path": "pages/equipmentManagement/ledger/index",
      "style": {
        "navigationBarTitleText": "设备台账",
src/pages/cooperativeOffice/clientVisit/detail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,339 @@
<template>
  <view class="client-visit">
    <!-- ä½¿ç”¨é€šç”¨é¡µé¢å¤´éƒ¨ç»„ä»¶ -->
    <PageHeader title="客户拜访登记" @back="goBack" />
    <!-- ç­¾åˆ°è¡¨å• -->
    <van-form @submit="handleSignIn" ref="formRef" label-width="110px" 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>
      <!-- æ‹œè®¿ä¿¡æ¯ -->
      <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>
      <!-- å¤‡æ³¨ä¿¡æ¯ -->
      <van-cell-group title="备注信息" inset>
        <van-field
          v-model="form.remark"
          label="备注"
          name="remark"
          type="textarea"
          placeholder="请输入备注信息"
          rows="3"
          autosize
          clearable
        />
      </van-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>
      </view>
    </van-form>
    <!-- æ—¶é—´é€‰æ‹©å™¨ -->
    <van-popup v-model:show="showTime" position="bottom">
      <van-date-picker
        v-model="currentTime"
        type="datetime"
        @confirm="onTimeConfirm"
        @cancel="showTime = false"
        title="选择拜访时间"
      />
    </van-popup>
  </view>
</template>
<script setup>
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()
// è¡¨å•数据
const form = ref({
  customerName: '',
  contact: '',
  contactPhone: '',
  visitingPeople: '',
  purposeVisit: '',
  purposeDate: '',
  visitAddress: '',
  latitude: '',
  longitude: '',
  locationAddress: '',
  remark: ''
})
// é¡µé¢çŠ¶æ€
const loading = ref(false)
const formRef = ref(null)
// æ—¶é—´ç›¸å…³
const currentTime = ref(new Date())
const showTime = ref(false)
// è¿”回上一页
const goBack = () => {
  uni.navigateBack()
}
// æ˜¾ç¤ºæ—¶é—´é€‰æ‹©å™¨
const showTimePicker = () => {
  showTime.value = true
}
// ç¡®è®¤æ—¶é—´é€‰æ‹©
const onTimeConfirm = ({ selectedValues }) => {
  form.value.purposeDate = selectedValues.join('-')
  currentTime.value = selectedValues.join('-')
  showTime.value = false
}
// èŽ·å–å½“å‰ä½ç½®
const getCurrentLocation = () => {
  uni.showLoading({ title: '获取位置中...' })
  uni.getLocation({
    type: 'gcj02',
    success: (res) => {
      form.value.latitude = res.latitude
      form.value.longitude = res.longitude
      // ä½¿ç”¨é€†åœ°ç†ç¼–码获取地址信息
      uni.request({
        url: `https://restapi.amap.com/v3/geocode/regeo?key=c120a5dc69a9f61839f7763e6057005f&location=${res.longitude},${res.latitude}&radius=1000&extensions=all`,
        success: (geoRes) => {
          uni.hideLoading()
          if (geoRes.data.status === '1' && geoRes.data.regeocode) {
            const regeocode = geoRes.data.regeocode
            const address = regeocode.formatted_address
            // ä¼˜å…ˆæ˜¾ç¤ºè¯¦ç»†åœ°å€
            if (address) {
              form.value.visitAddress = address
              showToast('位置获取成功')
            } else {
              // å¦‚果没有详细地址,尝试组合地址信息
              const addressComponent = regeocode.addressComponent
              const combinedAddress = `${addressComponent.province}${addressComponent.city}${addressComponent.district}${addressComponent.township}`
              form.value.visitAddress = combinedAddress
              showToast('位置获取成功')
            }
          } else {
            // API调用成功但没有返回地址信息
            const fallbackAddress = `位置: ${res.latitude.toFixed(4)}, ${res.longitude.toFixed(4)}`
            form.value.visitAddress = fallbackAddress
            showToast('获取到位置,但地址解析失败')
          }
        },
        fail: (err) => {
          uni.hideLoading()
          console.error('逆地理编码失败:', err)
          // é€†åœ°ç†ç¼–码失败时,显示简化的位置信息
          const fallbackAddress = `位置: ${res.latitude.toFixed(4)}, ${res.longitude.toFixed(4)}`
          form.value.visitAddress = fallbackAddress
          showToast('位置获取成功,但地址解析失败')
        }
      })
    },
    fail: (err) => {
      uni.hideLoading()
      showToast('获取位置失败,请检查定位权限')
      console.error('获取位置失败:', err)
      // å¤±è´¥æ—¶æ˜¾ç¤ºé”™è¯¯ä¿¡æ¯
      form.value.visitAddress = '位置获取失败'
    }
  })
}
// æäº¤ç­¾åˆ°
const handleSignIn = async () => {
    console.log('form.value----', form.value);
  if (!form.value.customerName) {
    showToast('请输入客户名称')
    return
  }
  if (!form.value.purposeVisit) {
    showToast('请输入拜访目的')
    return
  }
  if (!form.value.purposeDate) {
    showToast('请选择拜访时间')
    return
  }
  if (!form.value.visitAddress) {
    showToast('请获取当前位置')
    return
  }
  try {
    loading.value = true
    // ä½¿ç”¨å®‰å…¨æµ…拷贝,避免对象展开在某些运行时抛错
    const source = (form.value && typeof form.value === 'object') ? form.value : {}
    const submitData = {}
    Object.keys(source).forEach((k) => {
      submitData[k] = source[k]
    })
    console.log('提交数据:', submitData)
    const { code } = await clientVisitSignIn(submitData)
    console.log('code----', code);
    if (code === 200) {
      showToast('签到成功')
      setTimeout(() => {
        uni.navigateBack()
      }, 500)
    } else {
      loading.value = false
      showToast('签到失败,请重试')
    }
  } catch (e) {
    loading.value = false
    showToast('签到失败,请检查网络连接')
    console.error('签到失败:', e)
  }
}
// åˆå§‹åŒ–页面数据
const initPageData = () => {
  // è®¾ç½®é»˜è®¤æ‹œè®¿æ—¶é—´ä¸ºå½“前时间
  form.value.purposeDate = dayjs().format('YYYY-MM-DD HH:mm:ss')
  currentTime.value = new Date()
  // è®¾ç½®æ‹œè®¿äººä¸ºå½“前登录用户的昵称
  form.value.visitingPeople = userStore.nickName || ''
}
onMounted(() => {
  initPageData()
})
</script>
<style scoped lang="scss">
.client-visit {
  min-height: 100vh;
  background: #f8f9fa;
  padding-bottom: 5rem;
}
.footer-btns {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  background: #fff;
  display: flex;
  justify-content: space-around;
  align-items: center;
  padding: 0.75rem 0;
  box-shadow: 0 -0.125rem 0.5rem rgba(0,0,0,0.05);
  z-index: 1000;
}
.cancel-btn {
  font-weight: 400;
  font-size: 1rem;
  color: #666;
  background: #f5f5f5;
  border: 1px solid #ddd;
  width: 45%;
  height: 2.5rem;
  border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
}
.sign-btn {
  font-weight: 500;
  font-size: 1rem;
  color: #fff;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  border: none;
  width: 45%;
  height: 2.5rem;
  border-radius: 2.5rem 2.5rem 2.5rem 2.5rem;
}
.location-icon {
  color: #1989fa;
  font-size: 1.2rem;
}
</style>
src/pages/cooperativeOffice/clientVisit/index.vue
@@ -1,59 +1,389 @@
// å®¢æˆ·æ‹œè®¿
<template>
  <view>
    <view class="page-header">
      <view class="header-left">
        <up-icon name="arrow-left" size="20" color="#333" @click="goBack"></up-icon>
  <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="header-center">
        <text class="page-title">客户拜访</text>
    </view>
    <!-- æ‹œè®¿è®°å½•列表 -->
    <view class="visit-list" v-if="visitList.length > 0">
      <view v-for="(item, index) in visitList" :key="index">
        <view class="visit-item">
          <view class="item-header">
            <view class="item-left">
              <view class="document-icon">
                <up-icon name="user" size="16" color="#ffffff"></up-icon>
              </view>
              <text class="item-id">客户:{{ item.customerName }}</text>
            </view>
            <view class="visit-status">
              <!-- æ›¿æ¢æ ‡ç­¾å’ŒæŒ‰é’® -->
              <template>
                <u-tag type="success">已完成</u-tag>
                <!-- æ“ä½œæŒ‰é’® -->
                <view class="action-buttons">
                  <u-button
                    type="primary"
                    size="small"
                    class="action-btn"
                    @click="openDetail(item)"
                  >
                    æŸ¥çœ‹è¯¦æƒ…
                  </u-button>
                  <u-button
                    type="warning"
                    size="small"
                    class="action-btn"
                    @click="editVisit(item)"
                  >
                    ç¼–辑
                  </u-button>
                </view>
              </template>
            </view>
          </view>
          <up-divider></up-divider>
          <view class="item-details">
            <view class="detail-row">
              <text class="detail-label">联系人</text>
              <text class="detail-value">{{ item.contact || '-' }}</text>
            </view>
            <view class="detail-row">
              <text class="detail-label">联系电话</text>
              <text class="detail-value">{{ item.contactPhone || '-' }}</text>
            </view>
            <view class="detail-row">
              <text class="detail-label">拜访目的</text>
              <text class="detail-value">{{ item.purposeVisit || '-' }}</text>
            </view>
            <view class="detail-row">
              <text class="detail-label">拜访时间</text>
              <text class="detail-value">{{ item.purposeDate }}</text>
            </view>
            <view class="detail-row">
              <text class="detail-label">拜访地址</text>
              <text class="detail-value">{{ item.visitAddress || '-' }}</text>
            </view>
            <view class="detail-row">
              <text class="detail-label">拜访人</text>
              <text class="detail-value">{{ item.visitingPeople || '-' }}</text>
            </view>
            <view class="detail-row" v-if="item.remark">
              <text class="detail-label">备注</text>
              <text class="detail-value">{{ item.remark }}</text>
            </view>
          </view>
          <!-- æŒ‰é’®åŒºåŸŸ -->
          <view class="action-buttons">
            <van-button
              type="primary"
              size="small"
              class="action-btn"
              @click="viewDetail(item.id)"
            >
              æŸ¥çœ‹è¯¦æƒ…
            </van-button>
            <van-button
              type="danger"
              size="small"
              plain
              class="action-btn"
              @click="deleteRecord(item.id)"
            >
              åˆ é™¤
            </van-button>
          </view>
        </view>
      </view>
    </view>
    <view v-else class="no-data">
      <text>暂无拜访记录</text>
    </view>
    <!-- æµ®åŠ¨æ–°å¢žæŒ‰é’® -->
    <view class="fab-button" @click="addVisit">
      <up-icon name="plus" size="24" color="#ffffff"></up-icon>
    </view>
  </view>
</template>
<script>
export default {
  data() {
    return {
      title: '客户拜访'
    }
  },
  methods: {
    goBack() {
      uni.navigateBack({
        delta: 1
      })
    }
  }
<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('删除失败')
      }
    }
  })
}
onMounted(() => {
  getList()
})
onShow(() => {
  getList()
})
</script>
<style>
.page-header {
<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;
  padding: 10px 20px;
  background-color: #f5f5f5;
  position: relative;
}
.header-left {
.item-left {
  display: flex;
  align-items: center;
  gap: 8px;
}
.header-center {
  flex: 1;
.document-icon {
  width: 24px;
  height: 24px;
  background: #667eea;
  border-radius: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  align-items: center;
  position: absolute;
  left: 0;
  right: 0;
  pointer-events: none;
}
.page-title {
  font-size: 18px;
  font-weight: bold;
  pointer-events: auto;
.item-id {
  font-size: 14px;
  color: #333;
  font-weight: 500;
}
.visit-status {
  display: flex;
  align-items: center;
}
.item-details {
  padding: 16px 0;
}
.detail-row {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  margin-bottom: 8px;
  &:last-child {
    margin-bottom: 0;
  }
}
.detail-label {
  font-size: 12px;
  color: #777777;
  min-width: 60px;
}
.detail-value {
  font-size: 12px;
  color: #000000;
  text-align: right;
  flex: 1;
  margin-left: 16px;
  word-break: break-all;
}
.no-data {
  padding: 40px 0;
  text-align: center;
  color: #999;
}
.action-buttons {
  display: flex;
  gap: 12px;
  padding: 0 0 16px 0;
  justify-content: space-between;
}
.action-btn {
  flex: 1;
}
.fab-button {
  position: fixed;
  bottom: calc(30px + env(safe-area-inset-bottom));
  right: 30px;
  width: 56px;
  height: 56px;
  background: #667eea;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3);
  z-index: 1000;
}
</style>
src/pages/cooperativeOffice/collaborativeApproval/approve.vue
@@ -516,4 +516,23 @@
  display: flex;
  justify-content: flex-end;
}
</style>
</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>
src/pages/cooperativeOffice/collaborativeApproval/contactSelect.vue
@@ -30,7 +30,7 @@
        <view class="contact-details">
          <text class="contact-name">{{ selectedContact.nickName }}</text>
        </view>
        <van-icon name="cross" size="16" color="#999" @click="clearSelected" />
        <u-icon name="close" size="16" color="#999" @click="clearSelected" />
      </view>
    </view>
@@ -388,4 +388,55 @@
    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,73 +4,61 @@
    <!-- è¡¨å•区域 -->
    <view class="form-section">
      <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
      <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
              :columns="productOptions"
              :model-value="pickerValue"
              v-model="pickerValue"
              @confirm="onConfirm"
              @cancel="showPicker = false"
            />
          </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>
          </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>
    </view>
    <!-- å®¡æ ¸æµç¨‹åŒºåŸŸ -->
    <view class="approval-process">
@@ -98,17 +86,13 @@
            </view>
            <view v-else class="add-approver-btn" @click="addApprover(stepIndex)">
              <view class="add-circle">+</view>
              <text class="add-label">选择审批人</text>
              <text class="add-text">添加审批人</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>
      <view class="add-step-btn">
                <van-button icon="plus" plain type="primary" style="width: 100%" @click="addApprovalStep">新增节点</van-button>
      </view>
      <u-button icon="plus" plain type="primary" style="width: 100%" @click="addApprovalStep">新增节点</u-button>
    </view>
    <!-- åº•部按钮 -->
src/pages/cooperativeOffice/collaborativeApproval/index.vue
@@ -31,8 +31,27 @@
                            </view>
                            <text class="item-id">{{ item.approveId }}</text>
                        </view>
                        <view class="item-tag">
                            <van-tag :type="getTagClass(item.approveStatus)" size="medium">{{ formatReceiptType(item.approveStatus) }}</van-tag>
                        <!-- å®¡æ‰¹çŠ¶æ€æ ‡ç­¾ -->
                        <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>
                    </view>
                    <up-divider></up-divider>
@@ -98,7 +117,6 @@
        <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>
@@ -460,8 +478,5 @@
    }
    .action-btn.approve {
        /* success æ ·å¼æ¥è‡ªç»„件,这里保留钩子以便后续需要扩展 */
    }
    :deep(.van-floating-bubble) {
        background: #ed8d05;
    }
</style>
src/pages/equipmentManagement/ledger/detail.vue
@@ -1,128 +1,132 @@
<template>
    <view class="ledger-detail">
    <view class="equipment-detail">
        <!-- ä½¿ç”¨é€šç”¨é¡µé¢å¤´éƒ¨ç»„ä»¶ -->
        <PageHeader :title="operationType === 'edit' ? '编辑设备台账' : '新增设备台账'" @back="goBack" />
        <PageHeader title="设备台账详情" @back="goBack" />
        
        <!-- è¡¨å•内容 -->
        <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-form @submit="sendForm" ref="formRef" label-width="110" input-align="right" error-message-align="right">
            <!-- åŸºæœ¬ä¿¡æ¯ -->
            <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>
            <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>
            
            <!-- æäº¤æŒ‰é’® -->
            <view class="footer-btns">
                <van-button class="cancel-btn" @click="goBack">取消</van-button>
                <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button>
                <u-button class="cancel-btn" @click="goBack">取消</u-button>
                <u-button class="save-btn" type="primary" @click="sendForm" :loading="loading">保存</u-button>
            </view>
        </van-form>
        </u-form>
        <!-- ç¨ŽçŽ‡é€‰æ‹©å™¨ -->
        <van-popup v-model:show="showTaxRate" position="bottom">
            <van-picker
                :model-value="taxRatePickerValue"
        <u-popup v-model="showTaxRate" mode="bottom">
            <u-picker
                v-model="taxRatePickerValue"
                :columns="taxRateOptions"
                @confirm="onTaxRateConfirm"
                @cancel="showTaxRate = false"
            />
        </van-popup>
        </u-popup>
        <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
        <van-popup v-model:show="showDate" position="bottom">
            <van-date-picker
        <u-popup v-model="showDate" mode="bottom">
            <u-datetime-picker
                v-model="currentDate"
                title="选择日期"
                @confirm="onDateConfirm"
                @cancel="showDate = false"
            />
        </van-popup>
        </u-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>
          
          <!-- æŒ‰é’®åŒºåŸŸï¼Œå‚考 invoiceLedger çš„æ ·å¼ -->
          <!-- æŒ‰é’®åŒºåŸŸ - æ›¿æ¢ä¸º uview-plus æŒ‰é’® -->
          <view class="action-buttons">
            <van-button
            <u-button
              type="primary"
              size="small"
              class="action-btn"
              @click="edit(item.id)"
            >
              ç¼–辑
            </van-button>
            <van-button
              type="danger"
            </u-button>
            <u-button
              type="error"
              size="small"
              plain
              class="action-btn"
              @click="deleteRow(item.id)"
            >
              åˆ é™¤
            </van-button>
            </u-button>
          </view>
        </view>
      </view>
@@ -119,7 +119,16 @@
import PageHeader from '@/components/PageHeader.vue'
import { getLedgerPage, delLedger } from '@/api/equipmentManagement/ledger'
import useUserStore from "@/store/modules/user"
import { showToast } from 'vant';
// æ›¿æ¢ Vant çš„ toast
// import { showToast } from 'vant';
// æ›¿æ¢ toast æ–¹æ³•
const showToast = (message) => {
  uni.showToast({
    title: message,
    icon: 'none'
  })
}
const userStore = useUserStore()
@@ -330,7 +339,7 @@
  color: #999;
}
// æŒ‰é’®æ ·å¼ï¼Œå‚考 invoiceLedger
// æŒ‰é’®æ ·å¼
.action-buttons {
  display: flex;
  gap: 12px;
src/pages/equipmentManagement/repair/add.vue
@@ -4,88 +4,83 @@
        <PageHeader :title="operationType === 'edit' ? '编辑报修' : '新增报修'" @back="goBack" />
        
        <!-- è¡¨å•内容 -->
        <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-form @submit="sendForm" ref="formRef" label-width="110" input-align="right" error-message-align="right">
            <!-- åŸºæœ¬ä¿¡æ¯ -->
            <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>
            <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>
            
            <!-- æäº¤æŒ‰é’® -->
            <view class="footer-btns">
                <van-button class="cancel-btn" @click="goBack">取消</van-button>
                <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button>
                <u-button class="cancel-btn" @click="goBack">取消</u-button>
                <u-button class="save-btn" type="primary" @click="sendForm" :loading="loading">保存</u-button>
            </view>
        </van-form>
        </u-form>
        <!-- è®¾å¤‡é€‰æ‹©å™¨ -->
        <van-popup v-model:show="showDevice" position="bottom">
            <van-picker
                :model-value="devicePickerValue"
        <u-popup v-model="showDevice" mode="bottom">
            <u-picker
                v-model="devicePickerValue"
                :columns="deviceColumns"
                @confirm="onDeviceConfirm"
                @cancel="showDevice = false"
            />
        </van-popup>
        </u-popup>
        <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
        <van-popup v-model:show="showDate" position="bottom">
            <van-date-picker
        <u-popup v-model="showDate" mode="bottom">
            <u-datetime-picker
                v-model="currentDate"
                title="选择日期"
                @confirm="onDateConfirm"
                @cancel="showDate = false"
            />
        </van-popup>
        </u-popup>
    </view>
</template>
@@ -96,7 +91,16 @@
import { getDeviceLedger } from '@/api/equipmentManagement/ledger';
import { addRepair, editRepair, getRepairById } from '@/api/equipmentManagement/repair';
import dayjs from "dayjs";
import { showToast } from 'vant';
// æ›¿æ¢ Vant çš„ toast
// import { showToast } from 'vant';
// æ›¿æ¢ toast æ–¹æ³•
const showToast = (message) => {
  uni.showToast({
    title: message,
    icon: 'none'
  })
}
defineOptions({
    name: "设备报修表单",
src/pages/equipmentManagement/repair/index.vue
@@ -33,8 +33,38 @@
              <text class="item-id">设备名称:{{ item.deviceName }}</text>
            </view>
            <view class="status-tag">
              <van-tag v-if="item.status === 1" type="success">完结</van-tag>
              <van-tag v-if="item.status === 0" type="danger">待维修</van-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>
            </view>
          </view>
          <up-divider></up-divider>
@@ -108,11 +138,9 @@
    </view>
    
    <!-- æµ®åŠ¨æ°”æ³¡æŒ‰é’® -->
    <van-floating-bubble
      axis="xy"
      icon="plus"
      @click="addRepair"
    />
    <view class="fab-button" @click="addRepair">
            <up-icon name="plus" size="24" color="#ffffff"></up-icon>
        </view>
  </view>
</template>
@@ -122,7 +150,16 @@
import PageHeader from '@/components/PageHeader.vue'
import { getRepairPage, delRepair } from '@/api/equipmentManagement/repair'
import useUserStore from "@/store/modules/user"
import { showToast } from 'vant';
// æ›¿æ¢ Vant çš„ toast
// import { showToast } from 'vant';
// æ›¿æ¢ toast æ–¹æ³•
const showToast = (message) => {
  uni.showToast({
    title: message,
    icon: 'none'
  })
}
const userStore = useUserStore()
src/pages/equipmentManagement/repair/maintain.vue
@@ -1,60 +1,55 @@
<template>
    <view class="repair-maintain">
        <!-- ä½¿ç”¨é€šç”¨é¡µé¢å¤´éƒ¨ç»„ä»¶ -->
        <PageHeader title="新增维修" @back="goBack" />
        <PageHeader title="设备维修" @back="goBack" />
        
        <!-- è¡¨å•内容 -->
        <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>
        <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>
            
            <!-- æäº¤æŒ‰é’® -->
            <view class="footer-btns">
                <van-button class="cancel-btn" @click="goBack">取消</van-button>
                <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button>
                <u-button class="cancel-btn" @click="goBack">取消</u-button>
                <u-button class="save-btn" type="primary" @click="sendForm" :loading="loading">保存</u-button>
            </view>
        </van-form>
        </u-form>
        <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
        <van-popup v-model:show="showDate" position="bottom">
            <van-date-picker
        <u-popup v-model="showDate" mode="bottom">
            <u-datetime-picker
                v-model="currentDate"
                title="选择日期"
                @confirm="onDateConfirm"
                @cancel="showDate = false"
            />
        </van-popup>
        </u-popup>
    </view>
</template>
@@ -65,7 +60,16 @@
import { addMaintain } from '@/api/equipmentManagement/repair';
import useUserStore from "@/store/modules/user";
import dayjs from "dayjs";
import { showToast } from 'vant';
// æ›¿æ¢ Vant çš„ toast
// import { showToast } from 'vant';
// æ›¿æ¢ toast æ–¹æ³•
const showToast = (message) => {
  uni.showToast({
    title: message,
    icon: 'none'
  })
}
defineOptions({
    name: "设备维修表单",
src/pages/equipmentManagement/upkeep/add.vue
@@ -1,75 +1,85 @@
<template>
    <view class="upkeep-add">
        <!-- ä½¿ç”¨é€šç”¨é¡µé¢å¤´éƒ¨ç»„ä»¶ -->
        <PageHeader :title="operationType === 'edit' ? '编辑保养计划' : '新增保养计划'" @back="goBack" />
        <PageHeader title="新增保养" @back="goBack" />
        
        <!-- è¡¨å•内容 -->
        <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-form @submit="sendForm" ref="formRef" label-width="110" input-align="right" error-message-align="right">
            <!-- åŸºæœ¬ä¿¡æ¯ -->
            <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>
            <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>
            
            <!-- æäº¤æŒ‰é’® -->
            <view class="footer-btns">
                <van-button class="cancel-btn" @click="goBack">取消</van-button>
                <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button>
                <u-button class="cancel-btn" @click="goBack">取消</u-button>
                <u-button class="save-btn" type="primary" @click="sendForm" :loading="loading">保存</u-button>
            </view>
        </van-form>
        </u-form>
        <!-- è®¾å¤‡é€‰æ‹©å™¨ -->
        <van-popup v-model:show="showDevice" position="bottom">
            <van-picker
                :model-value="devicePickerValue"
        <u-popup v-model="showDevice" mode="bottom">
            <u-picker
                v-model="devicePickerValue"
                :columns="deviceColumns"
                @confirm="onDeviceConfirm"
                @cancel="showDevice = false"
            />
        </van-popup>
        </u-popup>
        <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
        <van-popup v-model:show="showDate" position="bottom">
            <van-date-picker
        <u-popup v-model="showDate" mode="bottom">
            <u-datetime-picker
                v-model="currentDate"
                title="选择日期"
                @confirm="onDateConfirm"
                @cancel="showDate = false"
            />
        </van-popup>
        </u-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,8 +33,46 @@
              <text class="item-id">设备名称:{{ item.deviceName }}</text>
            </view>
            <view class="status-tag">
              <van-tag v-if="item.status === 1" type="success">完结</van-tag>
              <van-tag v-if="item.status === 0" type="danger">待保养</van-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>
            </view>
          </view>
          <up-divider></up-divider>
@@ -114,13 +152,10 @@
    <view v-else class="no-data">
      <text>暂无设备保养数据</text>
    </view>
    <!-- æµ®åŠ¨æ°”æ³¡æŒ‰é’® -->
    <van-floating-bubble
      axis="xy"
      icon="plus"
      @click="addPlan"
    />
    <view class="fab-button" @click="addPlan">
            <up-icon name="plus" size="24" color="#ffffff"></up-icon>
        </view>
  </view>
</template>
@@ -130,7 +165,15 @@
import PageHeader from '@/components/PageHeader.vue'
import { getUpkeepPage, delUpkeep } from '@/api/equipmentManagement/upkeep'
import useUserStore from "@/store/modules/user"
import { showToast } from 'vant';
// æ›¿æ¢ Vant çš„ toast
// import { showToast } from 'vant';
// æ›¿æ¢ toast æ–¹æ³•
const showToast = (message) => {
  uni.showToast({
    title: message,
    icon: 'none'
  })
}
import dayjs from "dayjs"
const userStore = useUserStore()
src/pages/equipmentManagement/upkeep/maintain.vue
@@ -4,65 +4,62 @@
        <PageHeader title="新增保养" @back="goBack" />
        
        <!-- è¡¨å•内容 -->
        <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-form @submit="sendForm" ref="formRef" label-width="110" input-align="right" error-message-align="right">
            <!-- åŸºæœ¬ä¿¡æ¯ -->
            <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>
            <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>
            
            <!-- æäº¤æŒ‰é’® -->
            <view class="footer-btns">
                <van-button class="cancel-btn" @click="goBack">取消</van-button>
                <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">保存</van-button>
                <u-button class="cancel-btn" @click="goBack">取消</u-button>
                <u-button class="save-btn" type="primary" @click="sendForm" :loading="loading">保存</u-button>
            </view>
        </van-form>
        </u-form>
        <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
        <van-popup v-model:show="showDate" position="bottom">
            <van-date-picker
        <u-popup v-model="showDate" mode="bottom">
            <u-datetime-picker
                v-model="currentDate"
                title="选择日期"
                @confirm="onDateConfirm"
                @cancel="showDate = false"
            />
        </van-popup>
        </u-popup>
        <!-- ä¿å…»ç»“果选择器 -->
        <van-popup v-model:show="showResult" position="bottom">
            <van-picker
                :model-value="resultPickerValue"
        <u-popup v-model="showResult" mode="bottom">
            <u-picker
                v-model="resultPickerValue"
                :columns="resultColumns"
                @confirm="onResultConfirm"
                @cancel="showResult = false"
            />
        </van-popup>
        </u-popup>
    </view>
</template>
@@ -73,7 +70,16 @@
import { addMaintenance } from '@/api/equipmentManagement/upkeep';
import useUserStore from "@/store/modules/user";
import dayjs from "dayjs";
import { showToast } from 'vant';
// æ›¿æ¢ Vant çš„ toast
// import { showToast } from 'vant';
// æ›¿æ¢ toast æ–¹æ³•
const showToast = (message) => {
  uni.showToast({
    title: message,
    icon: 'none'
  })
}
defineOptions({
    name: "设备保养表单",
src/pages/login.vue
@@ -101,8 +101,7 @@
}
function getUserLoginFacotryList() {
    if(loginForm.value.username){
        userLoginFacotryList({userName:loginForm.value.username}).then(res => {
    userLoginFacotryList({userName:loginForm.value.username}).then(res => {
            // æ£€æŸ¥res.data是否为数组
            if (res.data && Array.isArray(res.data)) {
                // é‡æ–°ç»„装数据格式:deptId变成id,deptName变成name
@@ -118,9 +117,6 @@
            modal.msgError('获取公司列表失败:', error)
            factoryList.value = []
        })
    }else {
        factoryList.value = []
    }
}
async function handleLogin() {
src/pages/procurementManagement/invoiceEntry/add.vue
@@ -540,3 +540,141 @@
  }
}
</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,116 +4,138 @@
    <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">
    <u-form @submit="onSubmit" ref="formRef" label-width="110" input-align="right" error-message-align="right">
      <!-- åŸºæœ¬ä¿¡æ¯ -->
      <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>
      <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>
      
      <!-- æäº¤æŒ‰é’® -->
      <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>
        <u-button class="cancel-btn" @click="onClickLeft">取消</u-button>
        <u-button class="save-btn" type="primary" @click="onSubmit" :loading="loading">保存</u-button>
      </view>
    </van-form>
    </u-form>
    <!-- ä»˜æ¬¾æ–¹å¼é€‰æ‹©å™¨ -->
    <van-popup v-model:show="showPaymentType" position="bottom">
      <van-picker
                :model-value="pickerValue"
    <u-popup v-model="showPaymentType" mode="bottom">
      <u-picker
        v-model="pickerValue"
        :columns="receipt_payment_type"
        @confirm="onPaymentTypeConfirm"
        @cancel="showPaymentType = false"
      />
    </van-popup>
    </u-popup>
    <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
    <van-popup v-model:show="showDate" position="bottom">
      <van-date-picker
    <u-popup v-model="showDate" mode="bottom">
      <u-datetime-picker
        v-model="currentDate"
        title="选择日期"
        @confirm="onDateConfirm"
        @cancel="showDate = false"
      />
    </van-popup>
    </u-popup>
  </view>
</template>
<script setup>
import { ref, onMounted, computed } from 'vue'
import useUserStore from '@/store/modules/user'
import { showToast, showNotify } from 'vant'
// æ›¿æ¢ Vant çš„ toast å’Œ notify
// 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,94 +1,83 @@
<template>
  <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>
    <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>
    <!-- ä»˜æ¬¾æ–¹å¼é€‰æ‹©å™¨ -->
    <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="showPaymentType" mode="bottom">
            <u-picker
                v-model="pickerValue"
                :columns="paymentTypeOptions"
                @confirm="onPaymentTypeConfirm"
                @cancel="showPaymentType = false"
            />
        </u-popup>
    <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
    <van-popup v-model:show="showDate" position="bottom">
      <van-date-picker
        v-model="currentDate"
        title="选择日期"
        @confirm="onDateConfirm"
        @cancel="showDate = false"
      />
    </van-popup>
  </view>
        <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
        <u-popup v-model="showDate" mode="bottom">
            <u-datetime-picker
                v-model="currentDate"
                title="选择日期"
                @confirm="onDateConfirm"
                @cancel="showDate = false"
            />
        </u-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">
                    <up-icon name="search" size="24" color="#999"></up-icon>
                    <u-icon name="search" size="24" color="#999"></u-icon>
                </view>
            </view>
            
            <!-- ç­›é€‰å¼€å…³ -->
            <view class="switch-row">
                <text class="switch-label">不显示待付款为0</text>
                <van-switch v-model="searchForm.status" @change="getList" size="18"/>
                <u-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">
                                <up-icon name="file-text" size="16" color="#ffffff"></up-icon>
                                <u-icon name="file-text" size="16" color="#ffffff"></u-icon>
                            </view>
                            <text class="item-id">{{ item.purchaseContractNumber }}</text>
                        </view>
                    </view>
                    <up-divider></up-divider>
                    <u-divider></u-divider>
                    <view class="item-details">
                        <view class="detail-row">
                            <text class="detail-label">销售合同号</text>
@@ -70,7 +70,7 @@
                    
                    <!-- æ“ä½œæŒ‰é’® -->
                    <view class="action-buttons">
                        <van-button
                        <u-button
                            type="primary"
                            size="small"
                            class="action-btn"
@@ -78,7 +78,7 @@
                            @click="openForm('add', item)"
                        >
                            æ–°å¢žä»˜æ¬¾
                        </van-button>
                        </u-button>
                    </view>
                </view>
            </view>
@@ -94,10 +94,19 @@
<script setup>
import { ref } from 'vue'
import useUserStore from '@/store/modules/user'
import { showToast } from 'vant'
// æ›¿æ¢ Vant çš„ toast
// 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([])
const tableLoading = ref(false)
src/pages/procurementManagement/procurementInvoiceLedger/detail.vue
@@ -3,47 +3,44 @@
        <!-- ä½¿ç”¨é€šç”¨é¡µé¢å¤´éƒ¨ç»„ä»¶ -->
        <PageHeader title="编辑来票台账" @back="goBack" />
        <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"/>
        <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>
                <view class="tip-text">未来票数:{{ formatAmount(form.futureTickets) }} å…ƒ</view>
<!--                <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>-->
            </u-cell-group>
            <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>
                <u-button class="cancel-btn" @click="goBack">取消</u-button>
                <u-button class="save-btn" type="primary" @click="submitForm">保存</u-button>
            </view>
        </van-form>
        </u-form>
    </view>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { showToast, showLoadingToast, closeToast } from 'vant'
// æ›¿æ¢ Vant çš„ toast æ–¹æ³•
// import { showToast, showLoadingToast, closeToast } from 'vant'
import dayjs from 'dayjs'
import useUserStore from '@/store/modules/user'
import { getToken } from '@/utils/auth'
@@ -51,6 +48,24 @@
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()
const formRef = ref()
src/pages/procurementManagement/procurementLedger/detail.vue
@@ -4,58 +4,57 @@
        <PageHeader title="台账详情" @back="goBack" />
         <!-- è¡¨å•区域 -->
        <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
        <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
                    :columns="salesContractList"
                    v-model="pickerValue"
                    @confirm="onConfirm"
                    @cancel="showPicker = false"
                />
            </van-popup>
            <van-popup v-model:show="showCustomerPicker" destroy-on-close position="bottom">
                <van-picker
            </u-popup>
            <u-popup v-model="showCustomerPicker" mode="bottom">
                <u-picker
                    :columns="supplierList"
                    v-model="pickerCustomerValue"
                    @confirm="onCustomerConfirm"
                    @cancel="showCustomerPicker = false"
                />
            </van-popup>
            </u-popup>
            
            <!-- äº§å“å¤§ç±»é€‰æ‹©å™¨ -->
            <van-popup v-model:show="showCategoryPicker" destroy-on-close position="bottom">
            <u-popup v-model="showCategoryPicker" mode="bottom">
                <!-- å¤´éƒ¨æŒ‰é’®åŒºåŸŸ -->
                <view class="popup-header">
                    <view @click="showCategoryPicker = false" class="cancelButton">取消</view>
@@ -69,175 +68,159 @@
                    check-strictly
                    @check-change="onCategoryConfirm"
                />
            </van-popup>
            </u-popup>
            
            <!-- è§„格型号选择器 -->
            <van-popup v-model:show="showSpecificationPicker" destroy-on-close position="bottom">
                <van-picker
            <u-popup v-model="showSpecificationPicker" mode="bottom">
                <u-picker
                    :columns="modelOptions"
                    v-model="pickerSpecificationValue"
                    @confirm="onSpecificationConfirm"
                    @cancel="showSpecificationPicker = false"
                />
            </van-popup>
            </u-popup>
            
            <!-- ç¨ŽçŽ‡é€‰æ‹©å™¨ -->
            <van-popup v-model:show="showTaxRatePicker" destroy-on-close position="bottom">
                <van-picker
            <u-popup v-model="showTaxRatePicker" mode="bottom">
                <u-picker
                    :columns="taxRateOptions"
                    v-model="pickerTaxRateValue"
                    @confirm="onTaxRateConfirm"
                    @cancel="showTaxRatePicker = false"
                />
            </van-popup>
            </u-popup>
            
            <!-- å‘票类型选择器 -->
            <van-popup v-model:show="showInvoiceTypePicker" destroy-on-close position="bottom">
                <van-picker
            <u-popup v-model="showInvoiceTypePicker" mode="bottom">
                <u-picker
                    :columns="invoiceTypeOptions"
                    v-model="pickerInvoiceTypeValue"
                    @confirm="onInvoiceTypeConfirm"
                    @cancel="showInvoiceTypePicker = false"
                />
            </van-popup>
            </u-popup>
            <!-- äº§å“ä¿¡æ¯ -->
            <view class="product-section">
                <view class="section-header">
                    <text class="section-title">产品信息</text>
                    <van-button type="primary" size="small" @click="addProduct" class="add-btn" icon="plus"  v-if="operationType !== 'view'">新增</van-button>
                    <u-button type="primary" size="small" @click="addProduct" class="add-btn" v-if="operationType !== 'view'">
                        <u-icon name="plus" size="14" />
                        æ–°å¢ž
                    </u-button>
                </view>
                <view class="product-card" v-for="(product, idx) in productData" :key="idx">
                    <!-- äº§å“ç±» -->
                    <view class="product-header">
                        <view class="product-title">
                            <van-icon name="description" color="#2979ff" size="15" />
                            <u-icon name="file-text" color="#2979ff" size="15" />
                            <text class="product-productCategory">产品 {{ idx + 1 }}</text>
                        </view>
                        <!-- æ“ä½œæŒ‰é’® -->
                        <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 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>
                    </view>
                    
                    <!-- äº§å“ä¿¡æ¯è¡¨å• -->
                    <view class="product-form">
                        <!-- äº§å“å¤§ç±» -->
                        <van-field
                            v-model="product.productCategory"
                            is-link
                            readonly
                            name="productCategory"
                            label="产品大类"
                            required
                            placeholder="请选择"
                            :rules="[{ required: true, message: '请选择' }]"
                            @click="openCategoryPicker(idx)"
                        />
                        <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.specificationModel"
                            is-link
                            readonly
                            name="specificationModel"
                            label="规格型号"
                            required
                            :rules="[{ required: true, message: '请选择' }]"
                            placeholder="请选择"
                            @click="openSpecificationPicker(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.unit"
                            name="unit"
                            label="单位"
                            required
                            :rules="[{ required: true, message: '请输入' }]"
                            placeholder="请输入"
                        />
                        <view class="product-unit" prop="unit" required border-bottom>
                            <u-input
                                v-model="product.unit"
                                placeholder="请输入"
                            />
                        </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-taxRate" prop="taxRate" required border-bottom>
                            <u-input
                                v-model="product.taxRate"
                                readonly
                                placeholder="请选择"
                                @click="openTaxRatePicker(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-taxInclusiveUnitPrice" prop="taxInclusiveUnitPrice" required border-bottom>
                            <u-input
                                v-model="product.taxInclusiveUnitPrice"
                                type="number"
                                placeholder="请输入"
                                @blur="formatTaxPrice(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-quantity" prop="quantity" required border-bottom>
                            <u-input
                                v-model="product.quantity"
                                type="number"
                                placeholder="请输入"
                                @blur="formatAmount(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-taxInclusiveTotalPrice" prop="taxInclusiveTotalPrice" required border-bottom>
                            <u-input
                                v-model="product.taxInclusiveTotalPrice"
                                type="number"
                                placeholder="请输入"
                                @blur="formatTaxTotal(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-taxExclusiveTotalPrice" prop="taxExclusiveTotalPrice" required border-bottom>
                            <u-input
                                v-model="product.taxExclusiveTotalPrice"
                                type="number"
                                placeholder="请输入"
                                @blur="formatNoTaxTotal(idx)"
                            />
                        </view>
                        
                        <!-- å‘票类型 -->
                        <van-field
                            v-model="product.invoiceType"
                            is-link
                            readonly
                            name="invoiceType"
                            label="发票类型"
                            :rules="[{ required: true, message: '请选择' }]"
                            required
                            placeholder="请选择"
                            @click="openInvoiceTypePicker(idx)"
                        />
                        <view class="product-invoiceType" prop="invoiceType" required border-bottom>
                            <u-input
                                v-model="product.invoiceType"
                                readonly
                                placeholder="请选择"
                                @click="openInvoiceTypePicker(idx)"
                            />
                        </view>
                    </view>
                </view>
            </view>
            <view class="footer-btns" v-if="operationType !== 'view'">
                <van-button class="cancel-btn" @click="goBack">取消</van-button>
                <van-button class="save-btn" native-type="submit" form-type="submit">保存</van-button>
                <u-button class="cancel-btn" @click="goBack">取消</u-button>
                <u-button class="save-btn" type="primary" @click="onSubmit">保存</u-button>
            </view>
        </van-form>
        </u-form>
  </view>
</template>
@@ -737,10 +720,10 @@
.form-section {
    margin-top: 1rem;
}
.van-field {
.u-form-item {
    height: 3.4rem;
}
.van-cell {
.u-cell {
    align-items: center;
}
.product-section {
src/pages/sales/invoiceLedger/detail.vue
@@ -1,56 +1,93 @@
<template>
    <view class="account-detail">
    <view class="invoice-detail">
        <!-- ä½¿ç”¨é€šç”¨é¡µé¢å¤´éƒ¨ç»„ä»¶ -->
        <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
        <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
                    accept=".pdf"
                    multiple
                    :after-read="afterReadUpload"
                    :before-read="beforeReadPdf"
                    :afterRead="afterReadUpload"
                    :beforeRead="beforeReadPdf"
                >
                    <van-button class="upload-btn" icon="plus" type="primary" block>上传文件</van-button>
                </van-uploader>
                    <u-button class="upload-btn" type="primary">
                        <u-icon name="plus" size="14" />
                        ä¸Šä¼ æ–‡ä»¶
                    </u-button>
                </u-upload>
                <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>
                        <u-button size="mini" type="error" plain @click="removeUploaded(idx)">移除</u-button>
                    </view>
                </view>
            </van-cell-group>
            </u-cell-group>
            <!-- æäº¤æŒ‰é’® -->
            <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>
                <u-button class="cancel-btn" @click="goBack">取消</u-button>
                <u-button class="save-btn" type="primary" @click="submitForm">保存</u-button>
            </view>
        </van-form>
        </u-form>
        <van-popup v-model:show="showInvoiceDatePicker" position="bottom">
            <van-date-picker
                v-model="currentInvoiceDate"
        <!-- å¼€ç¥¨æ—¥æœŸé€‰æ‹©å™¨ -->
        <u-popup v-model="showInvoiceDatePicker" mode="bottom">
            <u-datetime-picker
                v-model="invoiceDateValue"
                title="选择开票日期"
                @confirm="onInvoiceDateConfirm"
                @cancel="showInvoiceDatePicker = false"
            />
        </van-popup>
        </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()
}
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,63 +4,67 @@
    <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">
    <u-form @submit="submitForm" ref="formRef" label-width="110" input-align="right" error-message-align="right">
      <!-- åŸºæœ¬ä¿¡æ¯ -->
      <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>
      <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>
      <!-- äº§å“ä¿¡æ¯ -->
      <view class="product-section">
@@ -69,7 +73,7 @@
        </view>
        
        <view v-if="productData.length === 0" class="empty-state">
          <van-empty description="暂无产品数据" />
          <u-empty text="暂无产品数据" />
        </view>
        
        <view v-else class="product-list">
@@ -81,121 +85,152 @@
            <!-- äº§å“å¤´éƒ¨ -->
            <view class="product-header">
              <view class="product-title">
                <van-icon name="description" color="#2979ff" size="15" />
                <u-icon name="file-text" color="#2979ff" size="15" />
                <text class="product-productCategory">产品 {{ index + 1 }}</text>
              </view>
            </view>
            
            <!-- äº§å“ä¿¡æ¯è¡¨å• -->
            <view class="product-form">
              <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.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.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.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.noInvoiceNum"
                label="未开票数"
                readonly
              />
              <van-field
                v-model="item.noInvoiceAmount"
                label="未开票金额(元)"
                readonly
              />
              <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>
            </view>
          </view>
        </view>
      </view>
      <!-- æäº¤æŒ‰é’® -->
            <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>
      <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-popup v-model:show="showIssueDatePicker" position="bottom">
      <van-date-picker
    <u-popup v-model="showIssueDatePicker" mode="bottom">
      <u-datetime-picker
        v-model="currentIssueDate"
        title="选择开票日期"
        @confirm="onIssueDateConfirm"
        @cancel="showIssueDatePicker = false"
      />
    </van-popup>
    </u-popup>
    <van-popup v-model:show="showCreateTimePicker" position="bottom">
      <van-date-picker
    <u-popup v-model="showCreateTimePicker" mode="bottom">
      <u-datetime-picker
        v-model="currentCreateTime"
        title="选择录入日期"
        @confirm="onCreateTimeConfirm"
        @cancel="showCreateTimePicker = false"
      />
    </van-popup>
    </u-popup>
  </view>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { showToast, showLoadingToast, closeToast } from 'vant'
// æ›¿æ¢ Vant çš„ toast ä¸º uni åŽŸç”Ÿæˆ– uview-plus çš„æ–¹æ³•
// 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">
                    <up-icon name="search" size="24" color="#999"></up-icon>
                    <u-icon name="search" size="24" color="#999"></u-icon>
                </view>
            </view>
        </view>
@@ -26,12 +26,12 @@
                    <view class="item-header">
                        <view class="item-left">
                            <view class="document-icon">
                                <up-icon name="file-text" size="16" color="#ffffff"></up-icon>
                                <u-icon name="file-text" size="16" color="#ffffff"></u-icon>
                            </view>
                            <text class="item-id">{{ item.salesContractNo }}</text>
                        </view>
                    </view>
                    <up-divider></up-divider>
                    <u-divider></u-divider>
                    
                    <view class="item-details">
                        <view class="detail-row">
@@ -66,7 +66,7 @@
                    
                    <!-- æ“ä½œæŒ‰é’®åŒºåŸŸ -->
                    <view class="action-buttons">
                        <van-button
                        <u-button
                            type="primary"
                            size="small"
                            @click="handleAddInvoice(item)"
@@ -74,15 +74,15 @@
                            :disabled="item.noInvoiceAmountTotal == 0"
                        >
                            æ–°å¢žå¼€ç¥¨
                        </van-button>
                        <van-button
                            type="default"
                        </u-button>
                        <u-button
                            type="info"
                            size="small"
                            @click="handleViewDetail(item)"
                            class="action-btn"
                        >
                            æŸ¥çœ‹è¯¦æƒ…
                        </van-button>
                        </u-button>
                    </view>
                </view>
            </view>
src/pages/sales/receiptPayment/add.vue
@@ -4,99 +4,105 @@
    <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">
    <u-form @submit="onSubmit" ref="formRef" label-width="110" input-align="right" error-message-align="right">
      <!-- åŸºæœ¬ä¿¡æ¯ -->
      <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>
      <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>
      
      <!-- æäº¤æŒ‰é’® -->
      <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>
        <u-button class="cancel-btn" @click="onClickLeft">取消</u-button>
        <u-button class="save-btn" type="primary" @click="onSubmit" :loading="loading">保存</u-button>
      </view>
    </van-form>
    </u-form>
    <!-- å›žæ¬¾æ–¹å¼é€‰æ‹©å™¨ -->
    <van-popup v-model:show="showPaymentType" position="bottom">
      <van-picker
                :model-value="pickerValue"
    <u-popup v-model="showPaymentType" mode="bottom">
      <u-picker
        v-model="pickerValue"
        :columns="receipt_payment_type"
        @confirm="onPaymentTypeConfirm"
        @cancel="showPaymentType = false"
      />
    </van-popup>
    </u-popup>
    <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
    <van-popup v-model:show="showDate" position="bottom">
      <van-date-picker
    <u-popup v-model="showDate" mode="bottom">
      <u-datetime-picker
        v-model="currentDate"
        title="选择日期"
        @confirm="onDateConfirm"
        @cancel="showDate = false"
      />
    </van-popup>
    </u-popup>
  </view>
</template>
@@ -104,9 +110,25 @@
import { ref, onMounted, computed } from 'vue'
import { receiptPaymentSaveOrUpdate, invoiceInfo } from '@/api/salesManagement/receiptPayment'
import useUserStore from '@/store/modules/user'
import { showToast, showNotify } from 'vant'
// æ›¿æ¢ Vant çš„ toast å’Œ notify
// 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,98 +4,104 @@
        <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">
        <u-form @submit="onSubmit" ref="formRef" label-width="110" input-align="right" error-message-align="right">
            <!-- åŸºæœ¬ä¿¡æ¯ -->
            <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-->
<!--                />-->
            <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>
                <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>
                <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>
            
            <!-- æäº¤æŒ‰é’® -->
            <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>
                <u-button class="cancel-btn" @click="onClickLeft">取消</u-button>
                <u-button class="save-btn" type="primary" @click="onSubmit" :loading="loading">保存</u-button>
            </view>
        </van-form>
        </u-form>
        
        <!-- å›žæ¬¾æ–¹å¼é€‰æ‹©å™¨ -->
        <van-popup v-model:show="showPaymentType" position="bottom">
            <van-picker
                :model-value="pickerValue"
        <u-popup v-model="showPaymentType" mode="bottom">
            <u-picker
                v-model="pickerValue"
                :columns="receipt_payment_type"
                @confirm="onPaymentTypeConfirm"
                @cancel="showPaymentType = false"
            />
        </van-popup>
        </u-popup>
        
        <!-- æ—¥æœŸé€‰æ‹©å™¨ -->
        <van-popup v-model:show="showDate" position="bottom">
            <van-date-picker
        <u-popup v-model="showDate" mode="bottom">
            <u-datetime-picker
                v-model="currentDate"
                title="选择日期"
                @confirm="onDateConfirm"
                @cancel="showDate = false"
            />
        </van-popup>
        </u-popup>
    </view>
</template>
@@ -103,9 +109,25 @@
import { ref, onMounted, computed } from 'vue'
import { receiptPaymentSaveOrUpdate, invoiceInfo } from '@/api/salesManagement/receiptPayment'
import useUserStore from '@/store/modules/user'
import { showToast, showNotify } from 'vant'
// æ›¿æ¢ Vant çš„ toast å’Œ notify
// 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">
                    <up-icon name="search" size="24" color="#999"></up-icon>
                    <u-icon name="search" size="24" color="#999"></u-icon>
                </view>
            </view>
            
            <!-- ç­›é€‰å¼€å…³ -->
            <view class="switch-row">
                <text class="switch-label">不显示待回款为0</text>
                <van-switch v-model="searchForm.status" @change="getList" size="18"/>
                <u-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">
                                <up-icon name="file-text" size="16" color="#ffffff"></up-icon>
                                <u-icon name="file-text" size="16" color="#ffffff"></u-icon>
                            </view>
                            <text class="item-id">{{ item.salesContractNo }}</text>
                        </view>
                    </view>
                    <up-divider></up-divider>
                    <u-divider></u-divider>
                    <view class="item-details">
                        <view class="detail-row">
                            <text class="detail-label">客户名称</text>
@@ -82,7 +82,7 @@
                    
                    <!-- æ“ä½œæŒ‰é’® -->
                    <view class="action-buttons">
                        <van-button
                        <u-button
                            type="primary"
                            size="small"
                            class="action-btn"
@@ -90,7 +90,7 @@
                            @click="openForm(item)"
                        >
                            æ–°å¢žå›žæ¬¾
                        </van-button>
                        </u-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,80 +4,93 @@
        <PageHeader title="台账详情" @back="goBack" />
         <!-- è¡¨å•区域 -->
        <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"
        <u-form @submit="onSubmit" label-width="110" input-align="right" style="margin-top: 10px" error-message-align="right">
            <u-form-item label="销售合同号" prop="salesContractNo" border-bottom>
                <u-input v-model="form.salesContractNo" placeholder="自动生成" disabled />
            </u-form-item>
            <u-form-item
                label="业务员"
                prop="salesman"
                required
                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"
                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
                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
                v-model="form.executionDate"
                is-link
                readonly
                prop="customerName"
                required
                name="executionDate"
                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
                label="签订日期"
                placeholder="点击选择时间"
                :rules="[{ required: true, message: '签订日期不能为空' }]"
                @click="showDatePicker = true"
            />
            <van-popup v-model:show="showDatePicker" destroy-on-close position="bottom">
                <van-date-picker
                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
                    v-model="pickerDateValue"
                    @confirm="onDateConfirm"
                    @cancel="showDatePicker = false"
                />
            </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
            </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
                    :columns="userList"
                    v-model="pickerValue"
                    @confirm="onConfirm"
                    @cancel="showPicker = false"
                />
            </van-popup>
            <van-popup v-model:show="showCustomerPicker" destroy-on-close position="bottom">
                <van-picker
            </u-popup>
            <u-popup v-model="showCustomerPicker" mode="bottom">
                <u-picker
                    :columns="customerOption"
                    v-model="pickerCustomerValue"
                    @confirm="onCustomerConfirm"
                    @cancel="showCustomerPicker = false"
                />
            </van-popup>
            </u-popup>
            
            <!-- äº§å“å¤§ç±»é€‰æ‹©å™¨ -->
            <van-popup v-model:show="showCategoryPicker" destroy-on-close position="bottom">
            <u-popup v-model="showCategoryPicker" mode="bottom">
                <!-- å¤´éƒ¨æŒ‰é’®åŒºåŸŸ -->
                <view class="popup-header">
                    <view @click="showCategoryPicker = false" class="cancelButton">取消</view>
@@ -91,175 +104,204 @@
                    check-strictly
                    @check-change="onCategoryConfirm"
                />
            </van-popup>
            </u-popup>
            
            <!-- è§„格型号选择器 -->
            <van-popup v-model:show="showSpecificationPicker" destroy-on-close position="bottom">
                <van-picker
            <u-popup v-model="showSpecificationPicker" mode="bottom">
                <u-picker
                    :columns="modelOptions"
                    v-model="pickerSpecificationValue"
                    @confirm="onSpecificationConfirm"
                    @cancel="showSpecificationPicker = false"
                />
            </van-popup>
            </u-popup>
            
            <!-- ç¨ŽçŽ‡é€‰æ‹©å™¨ -->
            <van-popup v-model:show="showTaxRatePicker" destroy-on-close position="bottom">
                <van-picker
            <u-popup v-model="showTaxRatePicker" mode="bottom">
                <u-picker
                    :columns="taxRateOptions"
                    v-model="pickerTaxRateValue"
                    @confirm="onTaxRateConfirm"
                    @cancel="showTaxRatePicker = false"
                />
            </van-popup>
            </u-popup>
            
            <!-- å‘票类型选择器 -->
            <van-popup v-model:show="showInvoiceTypePicker" destroy-on-close position="bottom">
                <van-picker
            <u-popup v-model="showInvoiceTypePicker" mode="bottom">
                <u-picker
                    :columns="invoiceTypeOptions"
                    v-model="pickerInvoiceTypeValue"
                    @confirm="onInvoiceTypeConfirm"
                    @cancel="showInvoiceTypePicker = false"
                />
            </van-popup>
            </u-popup>
            <!-- äº§å“ä¿¡æ¯ -->
            <view class="product-section">
                <view class="section-header">
                    <text class="section-title">产品信息</text>
                    <van-button type="primary" size="small" @click="addProduct" class="add-btn" icon="plus"  v-if="operationType !== 'view'">新增</van-button>
                    <u-button type="primary" size="small" @click="addProduct" class="add-btn" v-if="operationType !== 'view'">
                        <u-icon name="plus" size="14" />
                        æ–°å¢ž
                    </u-button>
                </view>
                <view class="product-card" v-for="(product, idx) in productData" :key="idx">
                    <!-- äº§å“ç±» -->
                    <view class="product-header">
                        <view class="product-title">
                            <van-icon name="description" color="#2979ff" size="15" />
                            <u-icon name="file-text" color="#2979ff" size="15" />
                            <text class="product-productCategory">产品 {{ idx + 1 }}</text>
                        </view>
                        <!-- æ“ä½œæŒ‰é’® -->
                        <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 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>
                    </view>
                    
                    <!-- äº§å“ä¿¡æ¯è¡¨å• -->
                    <view class="product-form">
                        <!-- äº§å“å¤§ç±» -->
                        <van-field
                            v-model="product.productCategory"
                            is-link
                            readonly
                            name="productCategory"
                        <u-form-item
                            label="产品大类"
                            prop="productCategory"
                            required
                            placeholder="请选择"
                            :rules="[{ required: true, message: '请选择' }]"
                            @click="openCategoryPicker(idx)"
                        />
                            border-bottom
                        >
                            <u-input
                                v-model="product.productCategory"
                                readonly
                                placeholder="请选择"
                                @click="openCategoryPicker(idx)"
                            />
                        </u-form-item>
                        
                        <!-- è§„格型号 -->
                        <van-field
                            v-model="product.specificationModel"
                            is-link
                            readonly
                            name="specificationModel"
                        <u-form-item
                            label="规格型号"
                            prop="specificationModel"
                            required
                            :rules="[{ required: true, message: '请选择' }]"
                            placeholder="请选择"
                            @click="openSpecificationPicker(idx)"
                        />
                            border-bottom
                        >
                            <u-input
                                v-model="product.specificationModel"
                                readonly
                                placeholder="请选择"
                                @click="openSpecificationPicker(idx)"
                            />
                        </u-form-item>
                        
                        <!-- å•位 -->
                        <van-field
                            v-model="product.unit"
                            name="unit"
                        <u-form-item
                            label="单位"
                            prop="unit"
                            required
                            :rules="[{ required: true, message: '请输入' }]"
                            placeholder="请输入"
                        />
                            border-bottom
                        >
                            <u-input
                                v-model="product.unit"
                                placeholder="请输入"
                            />
                        </u-form-item>
                        
                        <!-- ç¨Žçއ -->
                        <van-field
                            v-model="product.taxRate"
                            is-link
                            readonly
                            name="taxRate"
                        <u-form-item
                            label="税率(%)"
                            prop="taxRate"
                            required
                            :rules="[{ required: true, message: '请选择' }]"
                            placeholder="请选择"
                            @click="openTaxRatePicker(idx)"
                        />
                            border-bottom
                        >
                            <u-input
                                v-model="product.taxRate"
                                readonly
                                placeholder="请选择"
                                @click="openTaxRatePicker(idx)"
                            />
                        </u-form-item>
                        
                        <!-- å«ç¨Žå•ä»· -->
                        <van-field
                            v-model="product.taxInclusiveUnitPrice"
                            name="taxInclusiveUnitPrice"
                        <u-form-item
                            label="含税单价(元)"
                            type="number"
                            prop="taxInclusiveUnitPrice"
                            required
                            :rules="[{ required: true, message: '请输入' }]"
                            placeholder="请输入"
                            @blur="formatTaxPrice(idx)"
                        />
                            border-bottom
                        >
                            <u-input
                                v-model="product.taxInclusiveUnitPrice"
                                type="number"
                                placeholder="请输入"
                                @blur="formatTaxPrice(idx)"
                            />
                        </u-form-item>
                        
                        <!-- æ•°é‡ -->
                        <van-field
                            v-model="product.quantity"
                            name="quantity"
                        <u-form-item
                            label="数量"
                            type="number"
                            :rules="[{ required: true, message: '请输入' }]"
                            prop="quantity"
                            required
                            placeholder="请输入"
                            @blur="formatAmount(idx)"
                        />
                            border-bottom
                        >
                            <u-input
                                v-model="product.quantity"
                                type="number"
                                placeholder="请输入"
                                @blur="formatAmount(idx)"
                            />
                        </u-form-item>
                        
                        <!-- å«ç¨Žæ€»ä»· -->
                        <van-field
                            v-model="product.taxInclusiveTotalPrice"
                            name="taxInclusiveTotalPrice"
                        <u-form-item
                            label="含税总价(元)"
                            type="number"
                            :rules="[{ required: true, message: '请输入' }]"
                            prop="taxInclusiveTotalPrice"
                            required
                            placeholder="请输入"
                            @blur="formatTaxTotal(idx)"
                        />
                            border-bottom
                        >
                            <u-input
                                v-model="product.taxInclusiveTotalPrice"
                                type="number"
                                placeholder="请输入"
                                @blur="formatTaxTotal(idx)"
                            />
                        </u-form-item>
                        
                        <!-- ä¸å«ç¨Žæ€»ä»· -->
                        <van-field
                            v-model="product.taxExclusiveTotalPrice"
                            name="taxExclusiveTotalPrice"
                        <u-form-item
                            label="不含税总价(元)"
                            type="number"
                            prop="taxExclusiveTotalPrice"
                            required
                            :rules="[{ required: true, message: '请输入' }]"
                            placeholder="请输入"
                            @blur="formatNoTaxTotal(idx)"
                        />
                            border-bottom
                        >
                            <u-input
                                v-model="product.taxExclusiveTotalPrice"
                                type="number"
                                placeholder="请输入"
                                @blur="formatNoTaxTotal(idx)"
                            />
                        </u-form-item>
                        
                        <!-- å‘票类型 -->
                        <van-field
                            v-model="product.invoiceType"
                            is-link
                            readonly
                            name="invoiceType"
                        <u-form-item
                            label="发票类型"
                            :rules="[{ required: true, message: '请选择' }]"
                            prop="invoiceType"
                            required
                            placeholder="请选择"
                            @click="openInvoiceTypePicker(idx)"
                        />
                            border-bottom
                        >
                            <u-input
                                v-model="product.invoiceType"
                                readonly
                                placeholder="请选择"
                                @click="openInvoiceTypePicker(idx)"
                            />
                        </u-form-item>
                    </view>
                </view>
            </view>
            <view class="footer-btns" v-if="operationType !== 'view'">
                <van-button class="cancel-btn" @click="goBack">取消</van-button>
                <van-button class="save-btn" native-type="submit" form-type="submit">保存</van-button>
                <u-button class="cancel-btn" @click="goBack">取消</u-button>
                <u-button class="save-btn" type="primary" @click="onSubmit">保存</u-button>
            </view>
        </van-form>
        </u-form>
  </view>
</template>
src/pages_mine/pages/info/index.vue
@@ -1,14 +1,38 @@
<template>
  <view class="container">
    <view class="card">
      <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>
      <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>
    </view>
    <!-- <u-button @click="register()">绑定微信</u-button> -->
@@ -54,31 +78,29 @@
.container {
  min-height: 100vh;
  padding: 0; /* 24rpx -> 0.75rem */
  padding: 0;
  box-sizing: border-box;
}
/* åˆ—表卡片容器 */
.card {
  background-color: #ffffff;
  box-shadow: 0 0.375rem 1rem rgba(0, 0, 0, 0.06); /* 0 12rpx 32rpx -> 0 0.375rem 1rem */
  box-shadow: 0 0.375rem 1rem rgba(0, 0, 0, 0.06);
  overflow: hidden;
}
/* é€‚配 Vant Cell */
:deep(.van-cell) {
  min-height: 3rem; /* 92rpx -> 2.875rem */
/* é€‚配 uview-plus Cell */
:deep(.u-cell) {
  min-height: 3rem;
    align-items: center;
}
:deep(.van-cell__title) {
:deep(.u-cell__title) {
  font-weight: 500;
  color: #1f2937; /* æ·±ç° */
  color: #1f2937;
}
:deep(.van-cell__value) {
  color: #6b7280; /* æ¬¡è¦ç° */
:deep(.u-cell__value) {
  color: #6b7280;
}
/* ç§»é™¤ä¸å†ä½¿ç”¨çš„ .cell-icon æ ·å¼ */
</style>