¶Ô±ÈÐÂÎļþ |
| | |
| | | // å®¢æ·æè®¿ç¸å
³æ¥å£ |
| | | 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' |
| | | }) |
| | | } |
| | |
| | | // åºç¨å
¨å±é
ç½® |
| | | const config = { |
| | | baseUrl: 'http://114.132.189.42:8089', // æµè¯åº |
| | | // baseUrl: 'http://192.168.1.147:7003', // æ¬å°èè° |
| | | // baseUrl: 'http://114.132.189.42:8089', // æµè¯åº |
| | | baseUrl: 'http://192.168.1.147:7003', // æ¬å°èè° |
| | | //cloudåå°ç½å
³å°å |
| | | // baseUrl: 'http://192.168.10.3:8080', |
| | | // åºç¨ä¿¡æ¯ |
| | |
| | | import plugins from './plugins' |
| | | import store from './store' |
| | | import uviewPlus from 'uview-plus' |
| | | import Vant from 'vant'; |
| | | import 'vant/lib/index.css'; |
| | | // ç§»é¤ä»¥ä¸ä¸¤è¡ Vant ç¸å
³å¯¼å
¥ |
| | | // import Vant from 'vant'; |
| | | // import 'vant/lib/index.css'; |
| | | import { setupGlobalComponents } from './components' |
| | | |
| | | |
| | |
| | | app.use(store) |
| | | app.use(uviewPlus) |
| | | app.use(plugins) |
| | | app.use(Vant) |
| | | // ç§»é¤ä»¥ä¸è¡ Vant 注å |
| | | // app.use(Vant) |
| | | |
| | | // 注åå
¨å±ç»ä»¶ |
| | | setupGlobalComponents(app) |
| | |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/cooperativeOffice/clientVisit/detail", |
| | | "style": { |
| | | "navigationBarTitleText": "å®¢æ·æè®¿ç»è®°", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/equipmentManagement/ledger/index", |
| | | "style": { |
| | | "navigationBarTitleText": "设å¤å°è´¦", |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="client-visit"> |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="å®¢æ·æè®¿ç»è®°" @back="goBack" /> |
| | | |
| | | <!-- ç¾å°è¡¨å --> |
| | | <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> |
| | |
| | | // å®¢æ·æè®¿ |
| | | <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> |
| | | |
| | |
| | | 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> |
| | |
| | | <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> |
| | | |
| | |
| | | opacity: 0; |
| | | } |
| | | } |
| | | </style> |
| | | |
| | | <style lang="scss"> |
| | | /* æ´æ°æ ·å¼ç±»å */ |
| | | :deep(.u-radio) { |
| | | .u-radio__icon { |
| | | width: 20px; |
| | | height: 20px; |
| | | border: 2px solid #ddd; |
| | | border-radius: 50%; |
| | | background: #fff; |
| | | position: relative; |
| | | transition: all 0.2s; |
| | | |
| | | &::before { |
| | | content: ''; |
| | | position: absolute; |
| | | top: 50%; |
| | | left: 50%; |
| | | transform: translate(-50%, -50%) scale(0); |
| | | width: 8px; |
| | | height: 8px; |
| | | background: #006cfb; |
| | | border-radius: 50%; |
| | | transition: transform 0.2s; |
| | | } |
| | | } |
| | | |
| | | &.u-radio--checked { |
| | | .u-radio__icon { |
| | | border-color: #006cfb; |
| | | background: #fff; |
| | | |
| | | &::before { |
| | | transform: translate(-50%, -50%) scale(1); |
| | | } |
| | | |
| | | &::after { |
| | | content: ''; |
| | | position: absolute; |
| | | top: -2px; |
| | | left: -2px; |
| | | right: -2px; |
| | | bottom: -2px; |
| | | border: 2px solid rgba(0, 108, 251, 0.2); |
| | | border-radius: 50%; |
| | | animation: ripple 0.6s ease-out; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | |
| | | <!-- 表ååºå --> |
| | | <view class="form-section"> |
| | | <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"> |
| | |
| | | </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> |
| | | |
| | | <!-- åºé¨æé® --> |
| | |
| | | </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> |
| | |
| | | <view v-else class="no-data"> |
| | | <text>ææ å®¡æ¹æ°æ®</text> |
| | | </view> |
| | | <!-- <van-floating-bubble icon="plus" @click="handleAdd"/>--> |
| | | <!-- æµ®å¨æä½æé® --> |
| | | <view class="fab-button" @click="handleAdd"> |
| | | <up-icon name="plus" size="24" color="#ffffff"></up-icon> |
| | |
| | | } |
| | | .action-btn.approve { |
| | | /* success æ ·å¼æ¥èªç»ä»¶ï¼è¿éä¿çé©å以便åç»éè¦æ©å± */ |
| | | } |
| | | :deep(.van-floating-bubble) { |
| | | background: #ed8d05; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <view class="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'; |
| | |
| | | </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> |
| | |
| | | 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() |
| | | |
| | |
| | | color: #999; |
| | | } |
| | | |
| | | // æé®æ ·å¼ï¼åè invoiceLedger |
| | | // æé®æ ·å¼ |
| | | .action-buttons { |
| | | display: flex; |
| | | gap: 12px; |
| | |
| | | <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> |
| | | |
| | |
| | | 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: "è®¾å¤æ¥ä¿®è¡¨å", |
| | |
| | | <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> |
| | |
| | | </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> |
| | | |
| | |
| | | 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() |
| | | |
| | |
| | | <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> |
| | | |
| | |
| | | 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: "设å¤ç»´ä¿®è¡¨å", |
| | |
| | | <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'; |
| | |
| | | <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> |
| | |
| | | <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> |
| | | |
| | |
| | | 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() |
| | |
| | | <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> |
| | | |
| | |
| | | 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: "设å¤ä¿å
»è¡¨å", |
| | |
| | | } |
| | | |
| | | 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 |
| | |
| | | modal.msgError('è·åå
¬å¸å表失败:', error) |
| | | factoryList.value = [] |
| | | }) |
| | | }else { |
| | | factoryList.value = [] |
| | | } |
| | | } |
| | | |
| | | async function handleLogin() { |
| | |
| | | } |
| | | } |
| | | </style> |
| | | |
| | | <template> |
| | | <view class="invoice-add"> |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="æ°å¢å票" @back="goBack" /> |
| | | |
| | | <!-- 表åå
容 --> |
| | | <u-form @submit="submitForm" ref="formRef" label-width="110" input-align="right" error-message-align="right"> |
| | | <!-- åºæ¬ä¿¡æ¯ --> |
| | | <u-cell-group title="åºæ¬ä¿¡æ¯"> |
| | | <u-form-item label="éè´ååå·" prop="contractNo" required border-bottom> |
| | | <u-input v-model="form.contractNo" placeholder="请è¾å
¥éè´ååå·" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="ä¾åºååç§°" prop="supplierName" required border-bottom> |
| | | <u-input v-model="form.supplierName" placeholder="请è¾å
¥ä¾åºååç§°" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="å票å·" prop="invoiceNo" required border-bottom> |
| | | <u-input v-model="form.invoiceNo" placeholder="请è¾å
¥å票å·" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="å票éé¢" prop="invoiceAmount" required border-bottom> |
| | | <u-input v-model="form.invoiceAmount" type="number" placeholder="请è¾å
¥å票éé¢" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="ç¨ç" prop="taxRate" required border-bottom> |
| | | <u-input v-model="form.taxRate" placeholder="请è¾å
¥ç¨ç" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="å¼ç¥¨æ¥æ" prop="issueDate" required border-bottom> |
| | | <u-input v-model="form.issueDate" placeholder="è¯·éæ©å¼ç¥¨æ¥æ" readonly @click="showIssueDatePicker = true" clearable /> |
| | | </u-form-item> |
| | | <u-form-item label="å½å
¥äºº" border-bottom> |
| | | <u-input v-model="form.recorder" placeholder="èªå¨å¡«å
" readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="å建æ¶é´" border-bottom> |
| | | <u-input v-model="form.createTime" placeholder="è¯·éæ©å建æ¶é´" readonly @click="showCreateTimePicker = true" clearable /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | |
| | | <!-- 产åä¿¡æ¯ --> |
| | | <view class="product-section" v-if="!productData || productData.length === 0"> |
| | | <u-empty description="ææ äº§åæ°æ®" /> |
| | | </view> |
| | | |
| | | <!-- 产åå表 --> |
| | | <view class="product-list" v-if="productData && productData.length > 0"> |
| | | <view class="product-card" v-for="(product, idx) in productData" :key="idx"> |
| | | <view class="product-header"> |
| | | <view class="product-title"> |
| | | <u-icon name="file-text" color="#2979ff" size="15" /> |
| | | <text class="product-name">产å {{ idx + 1 }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 产åä¿¡æ¯è¡¨å --> |
| | | <view class="product-form"> |
| | | <u-form-item label="产ååç§°" border-bottom> |
| | | <u-input v-model="product.productName" placeholder="请è¾å
¥äº§ååç§°" /> |
| | | </u-form-item> |
| | | <u-form-item label="è§æ ¼åå·" border-bottom> |
| | | <u-input v-model="product.specification" placeholder="请è¾å
¥è§æ ¼åå·" /> |
| | | </u-form-item> |
| | | <u-form-item label="åä½" border-bottom> |
| | | <u-input v-model="product.unit" placeholder="请è¾å
¥åä½" /> |
| | | </u-form-item> |
| | | <u-form-item label="æ°é" border-bottom> |
| | | <u-input v-model="product.quantity" type="number" placeholder="请è¾å
¥æ°é" /> |
| | | </u-form-item> |
| | | <u-form-item label="åä»·" border-bottom> |
| | | <u-input v-model="product.unitPrice" type="number" placeholder="请è¾å
¥åä»·" /> |
| | | </u-form-item> |
| | | <u-form-item label="éé¢" border-bottom> |
| | | <u-input v-model="product.amount" type="number" placeholder="请è¾å
¥éé¢" /> |
| | | </u-form-item> |
| | | <u-form-item label="ç¨ç" border-bottom> |
| | | <u-input v-model="product.taxRate" placeholder="请è¾å
¥ç¨ç" /> |
| | | </u-form-item> |
| | | <u-form-item label="ç¨é¢" border-bottom> |
| | | <u-input v-model="product.taxAmount" type="number" placeholder="请è¾å
¥ç¨é¢" /> |
| | | </u-form-item> |
| | | <u-form-item label="å«ç¨éé¢" border-bottom> |
| | | <u-input v-model="product.totalAmount" type="number" placeholder="请è¾å
¥å«ç¨éé¢" /> |
| | | </u-form-item> |
| | | <u-form-item label="夿³¨" border-bottom> |
| | | <u-textarea v-model="product.remark" placeholder="请è¾å
¥å¤æ³¨" :maxlength="200" count :autoHeight="true" /> |
| | | </u-form-item> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- æäº¤æé® --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" @click="goBack">åæ¶</u-button> |
| | | <u-button class="save-btn" type="primary" @click="submitForm">ä¿å</u-button> |
| | | </view> |
| | | </u-form> |
| | | |
| | | <!-- å¼ç¥¨æ¥æéæ©å¨ --> |
| | | <u-popup v-model="showIssueDatePicker" mode="bottom"> |
| | | <u-datetime-picker |
| | | v-model="issueDateValue" |
| | | title="éæ©å¼ç¥¨æ¥æ" |
| | | @confirm="onIssueDateConfirm" |
| | | @cancel="showIssueDatePicker = false" |
| | | /> |
| | | </u-popup> |
| | | |
| | | <!-- å建æ¶é´éæ©å¨ --> |
| | | <u-popup v-model="showCreateTimePicker" mode="bottom"> |
| | | <u-datetime-picker |
| | | v-model="createTimeValue" |
| | | title="éæ©å建æ¶é´" |
| | | @confirm="onCreateTimeConfirm" |
| | | @cancel="showCreateTimePicker = false" |
| | | /> |
| | | </u-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // æ¿æ¢ Vant ç toast æ¹æ³ |
| | | // import { showToast, showLoadingToast, closeToast } from 'vant' |
| | | |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | const showToast = (message) => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: 'none' |
| | | }) |
| | | } |
| | | |
| | | const showLoadingToast = (message) => { |
| | | uni.showLoading({ |
| | | title: message || 'å è½½ä¸...' |
| | | }) |
| | | } |
| | | |
| | | const closeToast = () => { |
| | | uni.hideLoading() |
| | | } |
| | | </script> |
| | |
| | | <PageHeader title="æ°å¢ä»æ¬¾" @back="onClickLeft" /> |
| | | |
| | | <!-- 表åå
容 --> |
| | | <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() |
| | | |
| | | // 表åå¼ç¨ |
| | |
| | | <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' |
| | |
| | | /> |
| | | </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> |
| | | |
| | |
| | | <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> |
| | |
| | | |
| | | <!-- æä½æé® --> |
| | | <view class="action-buttons"> |
| | | <van-button |
| | | <u-button |
| | | type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | |
| | | @click="openForm('add', item)" |
| | | > |
| | | æ°å¢ä»æ¬¾ |
| | | </van-button> |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | <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) |
| | |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <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' |
| | |
| | | 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() |
| | |
| | | <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> |
| | |
| | | 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> |
| | | |
| | |
| | | .form-section { |
| | | margin-top: 1rem; |
| | | } |
| | | .van-field { |
| | | .u-form-item { |
| | | height: 3.4rem; |
| | | } |
| | | .van-cell { |
| | | .u-cell { |
| | | align-items: center; |
| | | } |
| | | .product-section { |
| | |
| | | <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' |
| | |
| | | <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"> |
| | |
| | | </view> |
| | | |
| | | <view v-if="productData.length === 0" class="empty-state"> |
| | | <van-empty description="ææ äº§åæ°æ®" /> |
| | | <u-empty text="ææ äº§åæ°æ®" /> |
| | | </view> |
| | | |
| | | <view v-else class="product-list"> |
| | |
| | | <!-- 产åå¤´é¨ --> |
| | | <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); |
| | | |
| | |
| | | /> |
| | | </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> |
| | |
| | | <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"> |
| | |
| | | |
| | | <!-- æä½æé®åºå --> |
| | | <view class="action-buttons"> |
| | | <van-button |
| | | <u-button |
| | | type="primary" |
| | | size="small" |
| | | @click="handleAddInvoice(item)" |
| | |
| | | :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> |
| | |
| | | <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> |
| | | |
| | |
| | | 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() |
| | | |
| | | // 表åå¼ç¨ |
| | |
| | | <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> |
| | | |
| | |
| | | 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() |
| | | |
| | | // 表åå¼ç¨ |
| | |
| | | /> |
| | | </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> |
| | | |
| | |
| | | <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> |
| | |
| | | |
| | | <!-- æä½æé® --> |
| | | <view class="action-buttons"> |
| | | <van-button |
| | | <u-button |
| | | type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | |
| | | @click="openForm(item)" |
| | | > |
| | | æ°å¢å款 |
| | | </van-button> |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | |
| | | <!-- æ æ°æ®æç¤º --> |
| | | <view class="no-data" v-else> |
| | | <text>ææ åæ¬¾æ°æ®</text> |
| | | <text>ææ æ°æ®</text> |
| | | </view> |
| | | </view> |
| | | </template> |
| | |
| | | <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> |
| | |
| | | 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> |
| | | |
| | |
| | | <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> --> |
| | |
| | | |
| | | .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> |