detail.vue 6.47 KB
<template>
  <view class="page">
    <scroll-view class="scroll" scroll-y>
      <view class="detail-page">
        <view class="section">
          <text class="row company">{{ form.name }}</text>
          <view class="row"><text class="label">编号</text><text class="value">{{ form.code }}</text></view>
          <view class="row"><text class="label">状态</text><text class="value">{{ form.available ? '启用' : '停用' }}</text>
          </view>
          <view class="row"><text class="label">联系人</text><text class="value">{{ form.contact }}</text></view>
          <view class="row"><text class="label">联系电话</text><text class="value">{{ form.telephone }}</text></view>
          <view class="row"><text class="label">电子邮箱</text><text class="value">{{ form.email }}</text></view>
          <view class="row"><text class="label">邮编</text><text class="value">{{ form.zipCode }}</text></view>
          <view class="row"><text class="label">传真</text><text class="value">{{ form.fax }}</text></view>
          <view class="row"><text class="label">地区</text><text class="value">{{ form.cityName }}</text></view>
          <view class="row"><text class="label">地址</text><text class="value">{{ form.address }}</text></view>
        </view>

        <view class="title-header">
          <image class="title-header_icon" src="/static/images/title.png" />
          <span>详细信息</span>
        </view>
        <view class="section">
          <view class="row"><text class="label">统一社会信用代码</text><text class="value">{{ form.creditCode }}</text></view>
          <view class="row"><text class="label">纳税人识别号</text><text class="value">{{ form.taxIdentifyNo }}</text></view>
          <view class="row"><text class="label">开户银行</text><text class="value">{{ form.bankName }}</text></view>
          <view class="row"><text class="label">户名</text><text class="value">{{ form.accountName }}</text></view>
          <view class="row"><text class="label">银行账号</text><text class="value">{{ form.accountNo }}</text></view>
        </view>

        <view class="title-header">
          <image class="title-header_icon" src="/static/images/title.png" />
          <span>其他信息</span>
        </view>
        <view class="section">
          <view class="row"><text class="label">备注</text><text class="value">{{ form.description }}</text></view>
        </view>

      </view>
    </scroll-view>
    <detail-buttons :buttons="displayButtons" @click="handleButtonClick" />
  </view>
</template>

<script>
import { getDetailApi, unableApi, enableApi } from '@/api/customer.js'
import DetailButtons from '@/components/detail-buttons/index.vue'

export default {
  name: 'CustomerDetail',
  components: { DetailButtons },
  data() {
    return {
      form: {},
      buttons: [
        { text: '编辑', visible: true, variant: 'primary', event: 'edit' },
        { text: '启用', visible: true, variant: 'outline', event: 'enable' },
        { text: '停用', visible: true, variant: 'outline', event: 'disable', style: { color: 'rgba(0,0,0,0.9)', border: '1px solid #DCDCDC' } },
      ]
    }
  },
  computed: {
    displayButtons() {
      const available = this.form.available
      return [
        { ...this.buttons[0], visible: this.$auth.hasPermi('base-data:customer:modify') },
        { ...this.buttons[1], visible: !available },
        { ...this.buttons[2], visible: !!available }
      ]
    }
  },
  onLoad(query) {
    const id = (query && (query.id || query.code)) || ''
    if (id) this.loadDetail(id)
  },
  methods: {
    async loadDetail(id) {
      try {
        const res = await getDetailApi(id)
        this.form = res.data || {}
      } catch (e) {
        this.form = {}
      }
    },
    handleButtonClick(btn) {
      if (!btn || btn.disabled) return
      const map = {
        edit: () => this.onEdit(),
        enable: () => this.onEnable(),
        disable: () => this.onDisable()
      }
      const fn = map[btn.event]
      if (typeof fn === 'function') fn()
    },
    onEdit() {
      const id = this.form.id || this.form.code
      if (!id) return
      const query = '?id=' + encodeURIComponent(id)
      uni.navigateTo({ url: '/pages/customer/modify' + query })
    },
    onEnable() {
      const id = this.form.id
      if (!id) return
      uni.showModal({
        title: '系统提示',
        content: '是否确定启用?',
        success: (res) => {
          if (res.confirm) {
            enableApi(id).then(() => {
              uni.showToast({ title: '已启用', icon: 'success' })
              setTimeout(() => { uni.redirectTo({ url: '/pages/customer/index' }) }, 300)
            }).catch(() => {
              uni.showToast({ title: '启用失败', icon: 'none' })
            })
          }
        }
      })
    },
    onDisable() {
      const id = this.form.id
      if (!id) return
      uni.showModal({
        title: '系统提示',
        content: '是否确定停用?',
        success: (res) => {
          if (res.confirm) {
            unableApi(id).then(() => {
              uni.showToast({ title: '已停用', icon: 'success' })
              setTimeout(() => { uni.redirectTo({ url: '/pages/customer/index' }) }, 300)
            }).catch(() => {
              uni.showToast({ title: '停用失败', icon: 'none' })
            })
          }
        }
      })
    }
  }
}
</script>

<style lang="scss" scoped>
.page {
  display: flex;
  flex-direction: column;
  height: 100vh;
}

.scroll {
  flex: 1;
  background: #f3f3f3;
}

.detail-page {
  padding-bottom: 144rpx;
}

.section {
  padding: 32rpx;
  background: #fff;
  margin-bottom: 20rpx;
  position: relative;
}

.row {
  display: flex;
  margin-bottom: 28rpx;

  &:last-child {
    margin-bottom: 0;
  }

  &.company {
    font-size: 36rpx;
    font-weight: 600;
    color: rgba(0, 0, 0, 0.9);
    padding-top: 10rpx;
    margin-bottom: 32rpx;
    line-height: 50rpx;
  }

  .label {
    width: 240rpx;
    line-height: 32rpx;
    font-size: 28rpx;
    color: rgba(0, 0, 0, 0.6);
  }

  .value {
    flex: 1;
    line-height: 32rpx;
    font-size: 28rpx;
    color: rgba(0, 0, 0, 0.9);
    text-align: right;
    word-break: break-all;
  }
}

.title-header {
  background-color: #fff;
  display: flex;
  align-items: center;
  padding: 32rpx 32rpx 22rpx;
  border-bottom: 1rpx dashed #f0f0f0;

  &_icon {
    width: 32rpx;
    height: 28rpx;
    margin-right: 16rpx;
  }

  span {
    color: rgba(0, 0, 0, 0.9);
    font-size: 32rpx;
    line-height: 44rpx;
    font-weight: 600;
  }
}
</style>