gaoluyang
15 小时以前 2a500686266b8fc6dae991c799800e37083a45c2
客户拜访真机测试,bug修改
已修改4个文件
已添加1个文件
296 ■■■■■ 文件已修改
src/api/cooperativeOffice/clientVisit.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/clientVisit/detail.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/clientVisit/index.vue 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/cooperativeOffice/clientVisit/view.vue 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cooperativeOffice/clientVisit.js
@@ -18,28 +18,3 @@
        params: query
    })
}
// èŽ·å–æ‹œè®¿è®°å½•è¯¦æƒ…
export function getVisitDetail(id) {
    return request({
        url: `/cooperative/clientVisit/detail/${id}`,
        method: 'get'
    })
}
// æ›´æ–°æ‹œè®¿è®°å½•
export function updateVisitRecord(data) {
    return request({
        url: '/cooperative/clientVisit/update',
        method: 'put',
        data: data
    })
}
// åˆ é™¤æ‹œè®¿è®°å½•
export function deleteVisitRecord(id) {
    return request({
        url: `/cooperative/clientVisit/delete/${id}`,
        method: 'delete'
    })
}
src/pages.json
@@ -282,6 +282,13 @@
      }
    },
    {
      "path": "pages/cooperativeOffice/clientVisit/view",
      "style": {
        "navigationBarTitleText": "客户拜访详情",
        "navigationStyle": "custom"
      }
    },
    {
      "path": "pages/cooperativeOffice/clientVisit/detail",
      "style": {
        "navigationBarTitleText": "添加客户拜访",
src/pages/cooperativeOffice/clientVisit/detail.vue
@@ -37,7 +37,6 @@
          <u-input
            v-model="form.purposeDate"
            placeholder="请选择拜访时间"
            readonly
            @click="showTimePicker"
          />
          <template #right>
@@ -101,12 +100,10 @@
}
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 dayjs from "dayjs"
import { formatDateToYMD } from '@/utils/ruoyi'
const userStore = useUserStore()
@@ -135,6 +132,8 @@
// è¿”回上一页
const goBack = () => {
  // è¿”回时清除本地存储的ID
  uni.removeStorageSync('clientVisit')
  uni.navigateBack()
}
@@ -146,7 +145,7 @@
// ç¡®è®¤æ—¶é—´é€‰æ‹©
const onTimeConfirm = (e) => {
  console.log(e)
  form.value.purposeDate = e.value
  form.value.purposeDate = dayjs(e.value).format('YYYY-MM-DD HH:mm:ss')
    currentTime.value = e.value
    showTime.value = false;
}
@@ -240,13 +239,14 @@
    Object.keys(source).forEach((k) => {
      submitData[k] = source[k]
    })
        console.log('submitData', submitData)
  
    const { code } = await clientVisitSignIn(submitData)
    
    if (code === 200) {
      showToast('签到成功')
      setTimeout(() => {
        uni.navigateBack()
                goBack()
      }, 500)
    } else {
      loading.value = false
@@ -254,7 +254,6 @@
    }
  } catch (e) {
    loading.value = false
    showToast('签到失败,请检查网络连接')
    console.error('签到失败:', e)
  }
}
src/pages/cooperativeOffice/clientVisit/index.vue
@@ -28,35 +28,9 @@
          <view class="item-header">
            <view class="item-left">
              <view class="document-icon">
                <up-icon name="user" size="16" color="#ffffff"></up-icon>
                <up-icon name="file-text" 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>
@@ -98,18 +72,9 @@
              type="primary"
              size="small"
              class="action-btn"
              @click="viewDetail(item.id)"
              @click="viewDetail(item)"
            >
              æŸ¥çœ‹è¯¦æƒ…
            </u-button>
            <u-button
              type="error"
              size="small"
              plain
              class="action-btn"
              @click="deleteRecord(item.id)"
            >
              åˆ é™¤
            </u-button>
          </view>
        </view>
@@ -131,7 +96,7 @@
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 { getVisitRecords } from '@/api/cooperativeOffice/clientVisit'
import useUserStore from "@/store/modules/user"
// æ›¿æ¢ toast æ–¹æ³•
defineOptions({name: 'client-visit-index'})
@@ -157,19 +122,13 @@
  uni.navigateBack()
}
// æ ¼å¼åŒ–日期时间
const formatDateTime = (dateStr) => {
  if (!dateStr) return ''
  return dayjs(dateStr).format("YYYY-MM-DD HH:mm")
}
// æŸ¥è¯¢åˆ—表
const getList = () => {
  showLoadingToast('加载中...')
  const params = {
    current: -1,
    size: -1,
    customerName: customerName.value || undefined,
    customerName: customerName.value,
  }
  getVisitRecords(params)
    .then((res) => {
@@ -203,29 +162,11 @@
}
// æŸ¥çœ‹è¯¦æƒ…
const viewDetail = (id) => {
  if (!id) return
const viewDetail = (item) => {
  uni.setStorageSync('clientVisit', item)
  // æŸ¥çœ‹è¯¦æƒ…跳转到只读展示页面
  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('删除失败')
      }
    }
    url: '/pages/cooperativeOffice/clientVisit/view'
  })
}
src/pages/cooperativeOffice/clientVisit/view.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,178 @@
<template>
  <view class="client-visit-detail">
    <PageHeader title="客户拜访详情" @back="goBack" />
    <!-- å†…容容器 -->
    <view class="content-container">
      <!-- å®¢æˆ·ä¿¡æ¯ -->
      <view class="section">
        <view class="section-title">客户信息</view>
        <view class="info-item">
          <text class="info-label">客户名称</text>
          <text class="info-value">{{ form.customerName || '-' }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">联系人</text>
          <text class="info-value">{{ form.contact || '-' }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">联系电话</text>
          <text class="info-value">{{ form.contactPhone || '-' }}</text>
        </view>
      </view>
      <!-- æ‹œè®¿ä¿¡æ¯ -->
      <view class="section">
        <view class="section-title">拜访信息</view>
        <view class="info-item">
          <text class="info-label">拜访目的</text>
          <text class="info-value">{{ form.purposeVisit || '-' }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">拜访时间</text>
          <text class="info-value">{{ form.purposeDate || '-' }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">拜访地点</text>
          <text class="info-value multi-line">{{ form.visitAddress || '-' }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">拜访人</text>
          <text class="info-value">{{ form.visitingPeople || '-' }}</text>
        </view>
        <view class="info-item" v-if="form.latitude && form.longitude">
          <text class="info-label">经纬度</text>
          <text class="info-value">{{ form.latitude }}, {{ form.longitude }}</text>
        </view>
      </view>
      <!-- å¤‡æ³¨ä¿¡æ¯ -->
      <view class="section">
        <view class="section-title">备注信息</view>
        <view class="info-item remark-item">
          <text class="info-label">备注</text>
          <text class="info-value multi-line">{{ form.remark }}</text>
        </view>
      </view>
    </view>
  </view>
</template>
<script setup>
// æ›¿æ¢ toast æ–¹æ³•
const showToast = (message) => {
  uni.showToast({
    title: message,
    icon: 'none'
  })
}
import { ref, onMounted } from 'vue'
import PageHeader from '@/components/PageHeader.vue'
import useUserStore from "@/store/modules/user"
const userStore = useUserStore()
// è¡¨å•数据
const form = ref({
  customerName: '',
  contact: '',
  contactPhone: '',
  visitingPeople: '',
  purposeVisit: '',
  purposeDate: '',
  visitAddress: '',
  latitude: '',
  longitude: '',
  locationAddress: '',
  remark: ''
})
// è¿”回上一页
const goBack = () => {
  // è¿”回时清除本地存储的ID
  uni.removeStorageSync('clientVisit')
  uni.navigateBack()
}
// åˆå§‹åŒ–页面数据
const initPageData = () => {
  // ä»Žæœ¬åœ°å­˜å‚¨èŽ·å–æ‹œè®¿è®°å½•è¯¦æƒ…
  const row = uni.getStorageSync('clientVisit')
  if (row) {
    form.value = { ...row }
  } else {
    showToast('暂无拜访记录数据')
  }
}
onMounted(() => {
  initPageData()
})
</script>
<style scoped lang="scss">
@import '@/static/scss/form-common.scss';
.client-visit-detail {
  min-height: 100vh;
  background-color: #f8f9fa;
}
.content-container {
  padding: 16px;
}
.section {
  background-color: #ffffff;
  border-radius: 12px;
  margin-bottom: 16px;
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
.section-title {
  font-size: 16px;
  font-weight: 600;
  color: #333333;
  padding: 16px 16px 12px;
  border-bottom: 1px solid #f0f0f0;
}
.info-item {
  display: flex;
  padding: 14px 16px;
  border-bottom: 1px solid #f8f8f8;
  align-items: flex-start;
}
.info-item:last-child {
  border-bottom: none;
}
.info-label {
  font-size: 14px;
  color: #666666;
  min-width: 80px;
  flex-shrink: 0;
  line-height: 22px;
}
.info-value {
  font-size: 14px;
  color: #333333;
  flex: 1;
  line-height: 22px;
  text-align: right;
}
.multi-line {
  text-align: left;
  word-break: break-all;
  line-height: 1.6;
}
.remark-item {
  padding-bottom: 16px;
}
</style>