This commit is contained in:
2025-09-18 21:17:44 +08:00
parent e560e90970
commit bff3d0414d
49 changed files with 1063 additions and 90 deletions

View File

@@ -0,0 +1,50 @@
<template>
<view class="page">
<view class="field"><text class="label">供应商名称</text><input class="value" v-model="form.name" placeholder="必填" /></view>
<view class="field"><text class="label">联系人</text><input class="value" v-model="form.contactName" placeholder="可选" /></view>
<view class="field"><text class="label">手机</text><input class="value" v-model="form.mobile" placeholder="可选" /></view>
<view class="field"><text class="label">电话</text><input class="value" v-model="form.phone" placeholder="可选(座机)" /></view>
<view class="field"><text class="label">经营地址</text><input class="value" v-model="form.address" placeholder="可选" /></view>
<view class="field"><text class="label">初始应付款</text><input class="value" type="digit" v-model.number="form.apOpening" placeholder="默认 0.00" /></view>
<view class="field"><text class="label">应付款</text><input class="value" type="digit" v-model.number="form.apPayable" placeholder="默认 0.00" /></view>
<view class="textarea"><textarea v-model="form.remark" maxlength="200" placeholder="备注最多200字"></textarea></view>
<view class="bottom"><button class="primary" @click="save">保存</button></view>
</view>
</template>
<script>
import { post, put } from '../../common/http.js'
export default {
data() {
return {
id: null,
form: { name:'', contactName:'', mobile:'', phone:'', address:'', apOpening:0, apPayable:0, remark:'' }
}
},
onLoad(query) { if (query && query.id) { this.id = Number(query.id) } },
methods: {
async save() {
if (!this.form.name) return uni.showToast({ title:'请填写供应商名称', icon:'none' })
try {
if (this.id) await put(`/api/suppliers/${this.id}`, this.form)
else await post('/api/suppliers', this.form)
uni.showToast({ title:'保存成功', icon:'success' })
setTimeout(() => uni.navigateBack(), 500)
} catch(e) { uni.showToast({ title: e?.message || '保存失败', icon:'none' }) }
}
}
}
</script>
<style>
.page { padding-bottom: 140rpx; }
.field { display:flex; justify-content: space-between; padding: 22rpx 24rpx; background:#fff; border-bottom:1rpx solid #eee; }
.label { color:#666; }
.value { color:#333; text-align: right; flex: 1; }
.textarea { padding: 16rpx 24rpx; background:#fff; margin-top: 12rpx; }
.bottom { position: fixed; left:0; right:0; bottom:0; background:#fff; padding: 16rpx 24rpx calc(env(safe-area-inset-bottom) + 16rpx); box-shadow: 0 -4rpx 12rpx rgba(0,0,0,0.06); }
.primary { width: 100%; background: linear-gradient(135deg, #A0E4FF 0%, #17A2C4 100%); color:#fff; border-radius: 999rpx; padding: 20rpx 0; }
</style>

View File

@@ -3,28 +3,37 @@
<view class="search">
<input v-model="kw" placeholder="搜索供应商名称/电话" @confirm="search" />
<button size="mini" @click="search">搜索</button>
<button size="mini" :type="debtOnly ? 'primary' : 'default'" @click="toggleDebtOnly">只看欠款</button>
</view>
<scroll-view scroll-y class="list">
<view class="item" v-for="s in suppliers" :key="s.id" @click="select(s)">
<view class="name">{{ s.name }}</view>
<view class="meta">{{ s.mobile || '—' }}</view>
<view class="meta">
{{ s.mobile || '—' }}
<text v-if="typeof s.apPayable === 'number'">应付¥ {{ Number(s.apPayable).toFixed(2) }}</text>
</view>
</view>
</scroll-view>
<view class="bottom">
<button class="primary" @click="createSupplier">新增供应商</button>
</view>
</view>
</template>
<script>
import { get } from '../../common/http.js'
export default {
data() { return { kw: '', suppliers: [] } },
data() { return { kw: '', debtOnly: false, suppliers: [] } },
onLoad() { this.search() },
methods: {
toggleDebtOnly() { this.debtOnly = !this.debtOnly; this.search() },
async search() {
try {
const res = await get('/api/suppliers', { kw: this.kw, page: 1, size: 50 })
const res = await get('/api/suppliers', { kw: this.kw, debtOnly: this.debtOnly, page: 1, size: 50 })
this.suppliers = Array.isArray(res?.list) ? res.list : (Array.isArray(res) ? res : [])
} catch(e) { uni.showToast({ title: '加载失败', icon: 'none' }) }
},
createSupplier() { uni.navigateTo({ url: '/pages/supplier/form' }) },
select(s) {
const opener = getCurrentPages()[getCurrentPages().length-2]
if (opener && opener.$vm) {