|
|
@@ -1,99 +1,49 @@
|
|
|
<template>
|
|
|
<view class="container">
|
|
|
+ <Watermark />
|
|
|
<Step :step="currentStep" :stepsData="currentText" />
|
|
|
|
|
|
<scroll-view class="content" scroll-y>
|
|
|
- <!-- 客户积分设置列表 -->
|
|
|
- <view class="integral-section">
|
|
|
- <view class="section-header">
|
|
|
- <view class="section-title">客户姓名</view>
|
|
|
- <view class="section-subtitle">积分数值</view>
|
|
|
+ <!-- 搜索栏 -->
|
|
|
+ <view class="search-section">
|
|
|
+ <view class="search-input-wrapper">
|
|
|
+ <image class="search-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_search.png"></image>
|
|
|
+ <input class="search-input" type="text" placeholder="输入客户名称" v-model="searchKeyword"
|
|
|
+ @input="handleSearch" />
|
|
|
+ <image class="clear-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_clear.png" v-if="searchKeyword"
|
|
|
+ @click="clearSearch"></image>
|
|
|
</view>
|
|
|
-
|
|
|
- <view class="integral-list">
|
|
|
- <view class="integral-item" v-for="(customer, index) in customerList" :key="customer.id">
|
|
|
- <view class="customer-info">
|
|
|
- <view class="customer-name">{{ customer.doctorName }}</view>
|
|
|
- </view>
|
|
|
- <view class="integral-input-wrapper">
|
|
|
- <input class="integral-input" type="number" :placeholder="customer.placeholder"
|
|
|
- v-model="customer.integral" :disabled="customer.disabled"
|
|
|
- @input="onIntegralInput(customer)" />
|
|
|
- <view v-if="customer.integral" class="clear-icon-wrapper"
|
|
|
- @click.stop="clearIntegral(customer)">
|
|
|
- <image class="clear-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_clear.png"></image>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
+ <view class="section-title">已选择 {{ selectedCustomers.length||'0' }} 人:</view>
|
|
|
+ <view class="selected-tags">
|
|
|
+ <view class="selected-tag" v-for="(customer, index) in selectedCustomers" :key="customer.id">
|
|
|
+ <text class="tag-name">{{ customer.doctorName||'-' }}</text>
|
|
|
+ <text class="tag-remove" @click="removeCustomer(customer.id)">×</text>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
- </scroll-view>
|
|
|
|
|
|
-
|
|
|
- <!-- 概览弹窗 -->
|
|
|
- <!-- :show="showOverview" -->
|
|
|
- <u-popup :show="showOverview" mode="bottom" @close="closeOverviewPopup" round="20" :safeAreaInsetBottom="true">
|
|
|
- <view class="overview-popup">
|
|
|
- <!-- 弹窗头部 -->
|
|
|
- <view class="popup-header">
|
|
|
- <text class="popup-title">概览</text>
|
|
|
- <view class="close-btn" @click="closeOverviewPopup">
|
|
|
- <image class="close-icon" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_close.png"></image>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 任务信息 -->
|
|
|
- <view class="overview-section">
|
|
|
- <view class="row">
|
|
|
- <text class="line"></text>
|
|
|
- <view class="section-title">任务信息</view>
|
|
|
- </view>
|
|
|
- <view class="info-list">
|
|
|
- <view class="info-item">
|
|
|
- <view class="info-label">项目归属:</view>
|
|
|
- <view class="info-value">湖南省药学服务公司</view>
|
|
|
- </view>
|
|
|
- <view class="info-item">
|
|
|
- <view class="info-label">项目任务:</view>
|
|
|
- <view class="info-value">科普文章</view>
|
|
|
- </view>
|
|
|
- <view class="info-item">
|
|
|
- <view class="info-label">项目时间:</view>
|
|
|
- <view class="info-value">2025/11/19 14:12~2025/11/19 14:12</view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 客户信息 -->
|
|
|
- <view class="overview-section">
|
|
|
- <view class="row">
|
|
|
- <text class="line"></text>
|
|
|
- <view class="section-title">客户信息</view>
|
|
|
- </view>
|
|
|
- <view class="customer-table">
|
|
|
- <!-- 表头 -->
|
|
|
- <view class="table-header">
|
|
|
- <view class="table-cell" style="flex: 1.5;">姓名</view>
|
|
|
- <view class="table-cell" style="flex: 1;">级别</view>
|
|
|
- <view class="table-cell" style="flex: 1;">积分</view>
|
|
|
- <view class="table-cell" style="flex: 2;">联系方式</view>
|
|
|
- </view>
|
|
|
-
|
|
|
- <!-- 表格内容 -->
|
|
|
- <view class="table-body">
|
|
|
- <view class="table-row" v-for="(customer, index) in customerList" :key="customer.id">
|
|
|
- <view class="table-cell" style="flex: 1.5;">{{ customer.doctorName }}</view>
|
|
|
- <view class="table-cell" style="flex: 1;">一级</view>
|
|
|
- <view class="table-cell" style="flex: 1;">{{ customer.integral || '0' }}</view>
|
|
|
- <view class="table-cell" style="flex: 2;">177****4235</view>
|
|
|
+ <!-- 客户列表 -->
|
|
|
+ <view class="customer-list">
|
|
|
+ <view class="customer-item" :class="{ active: isSelected(customer.id) }"
|
|
|
+ v-for="(customer, index) in filteredCustomers" :key="customer.id" @click="toggleCustomer(customer)">
|
|
|
+ <view class="left">
|
|
|
+ <image class="head" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/my_heads_icon.png"></image>
|
|
|
+ <view class="customer-info">
|
|
|
+ <view class="customer-header">
|
|
|
+ <view class="customer-name">{{ customer.doctorName ||'-'}}</view>
|
|
|
+ <view class="customer-level" v-if="customer.jobTitle">{{ customer.jobTitle }}</view>
|
|
|
+ </view>
|
|
|
+ <view class="customer-details">
|
|
|
+ <view class="customer-hospital">{{ customer.cityName||'-' }}</view>
|
|
|
+ <view class="customer-department">{{ customer.department ||'-'}}</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
+ <checkbox :value="customer.id" :checked="isSelected(customer.id)" @click.stop="toggleCustomer(customer)"
|
|
|
+ color="#388BFF" />
|
|
|
</view>
|
|
|
- <!-- 安全区域占位 -->
|
|
|
- <view class="safe-area"></view>
|
|
|
</view>
|
|
|
- </u-popup>
|
|
|
+ </scroll-view>
|
|
|
|
|
|
<!-- 底部操作栏 -->
|
|
|
<view class="bottom-bar">
|
|
|
@@ -103,86 +53,73 @@
|
|
|
</view>
|
|
|
<view class="action-buttons">
|
|
|
<view class="btn btn-cancel" @click="handlePrev">上一步</view>
|
|
|
- <view class="btn btn-submit" @click="submit">提交</view>
|
|
|
+ <view class="btn btn-submit" @click="handleNext">下一步</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
</view>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
- import { speakerList } from '@/api/speaker.js'
|
|
|
-import{editAudit} from '@/api/task.js'
|
|
|
+import { getAppliedList } from '@/api/task.js'
|
|
|
import Step from '@/pages_task/components/step.vue'
|
|
|
export default {
|
|
|
components: {
|
|
|
Step
|
|
|
},
|
|
|
data() {
|
|
|
- return {
|
|
|
- currentText: [{
|
|
|
- id: 1,
|
|
|
- stepNumber: 1,
|
|
|
- title: '填写任务'
|
|
|
- },
|
|
|
- {
|
|
|
- id: 2,
|
|
|
- stepNumber: 2,
|
|
|
- title: '积分设置'
|
|
|
- }
|
|
|
- ],
|
|
|
- currentStep: 2,
|
|
|
- showOverview: false, // 控制概览弹窗显示
|
|
|
- customerList: [],
|
|
|
- doctorId: '',
|
|
|
- fillTaskFormData: {} // 存储从 fillTask.vue 页面传递的表单数据
|
|
|
- }
|
|
|
- },
|
|
|
- onLoad: function(options) {
|
|
|
- console.log("编辑任务积分接受数据",options);
|
|
|
- if (options.doctorId) {
|
|
|
- this.doctorId = options.doctorId;
|
|
|
-
|
|
|
- }
|
|
|
- // 从本地存储中获取 fillTask.vue 页面传递的表单数据
|
|
|
- const fillTaskFormDataStr = uni.getStorageSync('fillTaskFormData');
|
|
|
- if (fillTaskFormDataStr) {
|
|
|
- this.fillTaskFormData = JSON.parse(fillTaskFormDataStr);
|
|
|
- console.log('获取到 fillTask 表单数据:', this.fillTaskFormData);
|
|
|
+ return {
|
|
|
+ currentText: [{
|
|
|
+ id: 1,
|
|
|
+ stepNumber: 1,
|
|
|
+ title: '编辑任务'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 2,
|
|
|
+ stepNumber: 2,
|
|
|
+ title: '选择客户'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 3,
|
|
|
+ stepNumber: 3,
|
|
|
+ title: '积分设置'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ currentStep: 2,
|
|
|
+ searchKeyword: '',
|
|
|
+ selectedCustomers: [],
|
|
|
+ customerList: [],
|
|
|
+ loading: false,
|
|
|
+ debounceTimer: null
|
|
|
}
|
|
|
+ },
|
|
|
+ onLoad() {
|
|
|
this.loadCustomerData()
|
|
|
-
|
|
|
+ this.loadSelectedCustomers()
|
|
|
},
|
|
|
computed: {
|
|
|
- totalIntegral() {
|
|
|
- let total = 0
|
|
|
- this.customerList.forEach(customer => {
|
|
|
- const integral = parseInt(customer.integral) || 0
|
|
|
- total += integral
|
|
|
- })
|
|
|
- return total
|
|
|
+ filteredCustomers() {
|
|
|
+ if (!this.searchKeyword.trim()) {
|
|
|
+ return this.customerList
|
|
|
+ }
|
|
|
+ const keyword = this.searchKeyword.toLowerCase()
|
|
|
+ return this.customerList.filter(customer =>
|
|
|
+ (customer.doctorName && customer.doctorName.toLowerCase().includes(keyword)) ||
|
|
|
+ (customer.cityName && customer.cityName.toLowerCase().includes(keyword)) ||
|
|
|
+ (customer.department && customer.department.toLowerCase().includes(keyword))
|
|
|
+ )
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
-
|
|
|
async loadCustomerData() {
|
|
|
try {
|
|
|
this.loading = true
|
|
|
- // 调用speakerList接口获取数据
|
|
|
- const res = await speakerList({})
|
|
|
+ let companyId=uni.getStorageSync('userInfo').companyId
|
|
|
+
|
|
|
+ // getAppliedList 查询到 定义审核通过了的医生
|
|
|
+ const res = await getAppliedList(companyId)
|
|
|
if (res.code === 200 && res.rows) {
|
|
|
// 将接口返回的数据映射为页面需要的格式
|
|
|
- this.customerList = res.rows.map(item => ({
|
|
|
- id: item.id,
|
|
|
- doctorName: item.doctorName,
|
|
|
- integral: '',
|
|
|
- placeholder: '请输入积分',
|
|
|
- disabled: false
|
|
|
- }));
|
|
|
-
|
|
|
- // 如果有 doctorId 参数,只显示对应 ID 的医生
|
|
|
- if (this.doctorId) {
|
|
|
- this.customerList = this.customerList.filter(item => item.id == this.doctorId);
|
|
|
- }
|
|
|
+ this.customerList = res.rows;
|
|
|
}
|
|
|
} catch (error) {
|
|
|
console.error('获取客户数据失败:', error)
|
|
|
@@ -194,171 +131,98 @@ import{editAudit} from '@/api/task.js'
|
|
|
this.loading = false
|
|
|
}
|
|
|
},
|
|
|
- // 根据 doctorId 获取客户信息
|
|
|
- getCustomerInfo(doctorId) {
|
|
|
- // 这里应该调用接口获取客户信息
|
|
|
- // 暂时使用模拟数据
|
|
|
- this.customerList = [{
|
|
|
- id: doctorId,
|
|
|
- doctorName: '客户' + doctorId,
|
|
|
- integral: '',
|
|
|
- placeholder: '请输入积分',
|
|
|
- disabled: false
|
|
|
- }];
|
|
|
+ loadSelectedCustomers() {
|
|
|
+ // 从本地存储获取已选择的客户
|
|
|
+ const selectedCustomers = uni.getStorageSync('editSelectedCustomers')
|
|
|
+ if (selectedCustomers) {
|
|
|
+ this.selectedCustomers = JSON.parse(selectedCustomers)
|
|
|
+ }
|
|
|
},
|
|
|
-
|
|
|
-
|
|
|
- // 显示概览弹窗
|
|
|
- showOverviewPopup() {
|
|
|
- this.showOverview = true
|
|
|
+ handleSearch() {
|
|
|
+ // 清除之前的定时器
|
|
|
+ if (this.debounceTimer) {
|
|
|
+ clearTimeout(this.debounceTimer)
|
|
|
+ }
|
|
|
+ // 设置新的定时器,500毫秒后执行搜索
|
|
|
+ this.debounceTimer = setTimeout(() => {
|
|
|
+ // 搜索逻辑已经在computed中处理,这里可以添加额外的搜索逻辑
|
|
|
+ console.log('执行搜索:', this.searchKeyword)
|
|
|
+ }, 500)
|
|
|
},
|
|
|
-
|
|
|
- // 关闭概览弹窗
|
|
|
- closeOverviewPopup() {
|
|
|
- this.showOverview = false
|
|
|
+ clearSearch() {
|
|
|
+ this.searchKeyword = ''
|
|
|
},
|
|
|
-
|
|
|
- clearIntegral(customer) {
|
|
|
- // 使用 $set 确保响应式更新
|
|
|
- this.$set(customer, 'integral', '')
|
|
|
+ isSelected(customerId) {
|
|
|
+ return this.selectedCustomers.some(customer => customer.id === customerId)
|
|
|
},
|
|
|
- onIntegralInput(customer) {
|
|
|
- // 积分输入验证
|
|
|
- if (customer.integral && parseInt(customer.integral) < 0) {
|
|
|
- this.$set(customer, 'integral', '0')
|
|
|
+ toggleCustomer(customer) {
|
|
|
+ const index = this.selectedCustomers.findIndex(item => item.id === customer.id)
|
|
|
+ if (index > -1) {
|
|
|
+ // 已选中,移除
|
|
|
+ this.selectedCustomers.splice(index, 1)
|
|
|
+ } else {
|
|
|
+ // 未选中,添加
|
|
|
+ this.selectedCustomers.push(customer)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ removeCustomer(customerId) {
|
|
|
+ const index = this.selectedCustomers.findIndex(item => item.id === customerId)
|
|
|
+ if (index > -1) {
|
|
|
+ this.selectedCustomers.splice(index, 1)
|
|
|
}
|
|
|
},
|
|
|
- handlePrev() {
|
|
|
- uni.navigateBack()
|
|
|
- },
|
|
|
- submit() {
|
|
|
- // 验证所有客户积分是否已填写
|
|
|
- const emptyCustomers = this.customerList.filter(customer => !customer.integral || customer.integral === '')
|
|
|
- if (emptyCustomers.length > 0) {
|
|
|
- uni.showToast({
|
|
|
- icon: 'none',
|
|
|
- title: '请为所有客户设置积分'
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 验证积分是否为数字
|
|
|
- const invalidCustomers = this.customerList.filter(customer => {
|
|
|
- const integral = parseInt(customer.integral)
|
|
|
- return isNaN(integral) || integral < 0
|
|
|
- })
|
|
|
-
|
|
|
- if (invalidCustomers.length > 0) {
|
|
|
- uni.showToast({
|
|
|
- icon: 'none',
|
|
|
- title: '请输入有效的积分数值'
|
|
|
- })
|
|
|
- return
|
|
|
- }
|
|
|
- // 获取用户信息
|
|
|
- const userInfoStr = uni.getStorageSync('userInfo')
|
|
|
- const userInfo = userInfoStr ? JSON.parse(userInfoStr) : {}
|
|
|
-
|
|
|
- // 构建提交数据
|
|
|
- const taskFormData = this.fillTaskFormData
|
|
|
- const taskData = {
|
|
|
- // 任务基本信息
|
|
|
- id: taskFormData.id || 0,
|
|
|
- taskNo: taskFormData.taskNo || '',
|
|
|
- taskName: taskFormData.taskName || '',
|
|
|
- deptId: taskFormData.deptId || 0,
|
|
|
- projectId: taskFormData.projectId || 0,
|
|
|
- costShareId: taskFormData.costShareId || 0,
|
|
|
- taskType: taskFormData.taskType || 0,
|
|
|
- taskIntegral: this.totalIntegral || 0,
|
|
|
- taskCount: taskFormData.taskCount || 0,
|
|
|
- taskUnit: taskFormData.taskUnit || 0,
|
|
|
- taskStatus: taskFormData.taskStatus || 0,
|
|
|
- productId: taskFormData.productId || 0,
|
|
|
- doctorId: this.doctorId || 0,
|
|
|
- planStartTime: taskFormData.planStartTime || '',
|
|
|
- planEndTime: taskFormData.planEndTime || '',
|
|
|
- applyTime: taskFormData.applyTime || '',
|
|
|
- serviceConfirmStatus: taskFormData.serviceConfirmStatus || 0,
|
|
|
- finishStatus: taskFormData.finishStatus || 0,
|
|
|
- belongType: taskFormData.belongType || 0,
|
|
|
- isSpotCheck: taskFormData.isSpotCheck || 0,
|
|
|
- spotCheckUserId: taskFormData.spotCheckUserId || 0,
|
|
|
- spotCheckTime: taskFormData.spotCheckTime || '',
|
|
|
- auditStatus: taskFormData.auditStatus || 0,
|
|
|
- companyId: userInfo.companyId || 0,
|
|
|
- companyUserId: userInfo.id || 0
|
|
|
- }
|
|
|
- // deptId: taskFormData.deptId || 0,
|
|
|
- // projectId: taskFormData.projectId || 0,
|
|
|
- // costShareId: taskFormData.costShareId || 0,
|
|
|
- // taskType: taskFormData.taskType || 0,
|
|
|
- // taskIntegral: this.totalIntegral || 0,
|
|
|
- // taskUnit: taskFormData.taskUnit || 0,
|
|
|
- // productId: taskFormData.productId || 0,
|
|
|
- // planStartTime: taskFormData.planStartTime || '',
|
|
|
- // planEndTime: taskFormData.planEndTime || '',
|
|
|
- // belongType: taskFormData.belongType || 0,
|
|
|
- // companyId: userInfo.companyId || 0,
|
|
|
- // companyUserId: userInfo.id || 0,
|
|
|
- // doctorId: this.doctorId || 0,
|
|
|
-
|
|
|
- console.log('提交的任务数据:', taskData)
|
|
|
-
|
|
|
- // 调用addInfo接口提交表单
|
|
|
- uni.showLoading({
|
|
|
- title: '提交中...'
|
|
|
- })
|
|
|
- editAudit(taskData).then(res => {
|
|
|
- uni.hideLoading()
|
|
|
- if (res.code === 200) {
|
|
|
- // 清除本地存储的表单数据
|
|
|
- uni.removeStorageSync('fillTaskFormData');
|
|
|
- // 显示提交成功提示
|
|
|
- uni.showToast({
|
|
|
- title: '任务创建成功',
|
|
|
- success: () => {
|
|
|
- // 延迟跳转,让用户看到成功提示
|
|
|
- setTimeout(() => {
|
|
|
- uni.navigateTo({
|
|
|
- url: '/pages_task/taskList'
|
|
|
- })
|
|
|
- }, 1500)
|
|
|
- }
|
|
|
- })
|
|
|
- } else {
|
|
|
- uni.showToast({
|
|
|
- icon: 'none',
|
|
|
- title:res.msg|| res.message || '提交失败'
|
|
|
- })
|
|
|
- }
|
|
|
- }).catch(err => {
|
|
|
- uni.hideLoading()
|
|
|
- uni.showToast({
|
|
|
- icon: 'none',
|
|
|
- title: '网络错误,请重试'
|
|
|
- })
|
|
|
- })
|
|
|
- },
|
|
|
deleteSelected() {
|
|
|
- // 删除所有客户数据
|
|
|
+ if (this.selectedCustomers.length === 0) {
|
|
|
+ uni.showToast({
|
|
|
+ icon: 'none',
|
|
|
+ title: '请先选择要删除的客户'
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 这里可以添加删除逻辑,比如从列表中移除已选中的客户
|
|
|
uni.showModal({
|
|
|
title: '提示',
|
|
|
- content: '确定要删除所有客户数据吗?删除后不可恢复。',
|
|
|
+ content: `确定要删除选中的 ${this.selectedCustomers.length} 个客户吗?`,
|
|
|
success: (res) => {
|
|
|
if (res.confirm) {
|
|
|
- // 清空所有客户的积分数据
|
|
|
- this.customerList.forEach(customer => {
|
|
|
- this.$set(customer, 'integral', '')
|
|
|
- })
|
|
|
-
|
|
|
+ // 从客户列表中移除已选中的客户
|
|
|
+ const selectedIds = this.selectedCustomers.map(item => item.id)
|
|
|
+ this.customerList = this.customerList.filter(
|
|
|
+ customer => !selectedIds.includes(customer.id)
|
|
|
+ )
|
|
|
+ // 清空已选中的客户
|
|
|
+ this.selectedCustomers = []
|
|
|
uni.showToast({
|
|
|
- title: '已清空所有客户积分',
|
|
|
- icon: 'success'
|
|
|
+ title: '删除成功'
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
})
|
|
|
+ },
|
|
|
+ handlePrev() {
|
|
|
+ uni.navigateBack()
|
|
|
+ },
|
|
|
+ handleNext() {
|
|
|
+ if (this.selectedCustomers.length === 0) {
|
|
|
+ uni.showToast({
|
|
|
+ icon: 'none',
|
|
|
+ title: '请至少选择一个客户'
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存选中的客户到本地存储,以便pointsSettings.vue获取
|
|
|
+ const enhanced = this.selectedCustomers.map(item => ({
|
|
|
+ ...item,
|
|
|
+ mobile: item.mobile||''
|
|
|
+ }))
|
|
|
+ uni.setStorageSync('editSelectedCustomers', JSON.stringify(enhanced))
|
|
|
+
|
|
|
+ // 跳转到下一步(积分设置)
|
|
|
+ uni.navigateTo({
|
|
|
+ url: '/pages_task/pointsSettings'
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -388,281 +252,156 @@ import{editAudit} from '@/api/task.js'
|
|
|
padding: 24rpx;
|
|
|
box-sizing: border-box;
|
|
|
padding-bottom: 200rpx;
|
|
|
- position: relative;
|
|
|
}
|
|
|
|
|
|
- .integral-section {
|
|
|
+ .search-section {
|
|
|
background-color: #ffffff;
|
|
|
- border-radius: 24rpx;
|
|
|
- padding: 32rpx 24rpx;
|
|
|
+ border-radius: 24rpx 24rpx 24rpx 24rpx;
|
|
|
+ padding: 24rpx;
|
|
|
margin-bottom: 24rpx;
|
|
|
|
|
|
- .section-header {
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
- margin-bottom: 32rpx;
|
|
|
- padding: 32rpx 0;
|
|
|
- background: #F5F9FF;
|
|
|
- border-radius: 16rpx;
|
|
|
- font-size: 28rpx;
|
|
|
- color: #666666;
|
|
|
- text-align: center;
|
|
|
- font-weight: 600;
|
|
|
-
|
|
|
- .section-title {
|
|
|
- flex: 1;
|
|
|
- }
|
|
|
-
|
|
|
- .section-subtitle {
|
|
|
- flex: 1;
|
|
|
- }
|
|
|
+ .section-title {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #999999;
|
|
|
+ margin-bottom: 24rpx;
|
|
|
}
|
|
|
|
|
|
- .integral-list {
|
|
|
- .integral-item {
|
|
|
+ .selected-tags {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 16rpx;
|
|
|
+
|
|
|
+ .selected-tag {
|
|
|
display: flex;
|
|
|
- justify-content: space-between;
|
|
|
align-items: center;
|
|
|
- padding: 32rpx 0;
|
|
|
- border-bottom: 1rpx solid #F2F3F5;
|
|
|
+ border-radius: 76rpx 76rpx 76rpx 76rpx;
|
|
|
+ border: 2rpx solid #F5F5F5;
|
|
|
+ padding: 12rpx 24rpx;
|
|
|
+ font-size: 28rpx;
|
|
|
|
|
|
- &:last-child {
|
|
|
- border-bottom: none;
|
|
|
+ .tag-name {
|
|
|
+ color: #333;
|
|
|
+ margin-right: 8rpx;
|
|
|
}
|
|
|
|
|
|
- .customer-info {
|
|
|
- flex: 1;
|
|
|
- text-align: center;
|
|
|
-
|
|
|
- .customer-name {
|
|
|
- font-size: 32rpx;
|
|
|
- font-weight: 500;
|
|
|
- color: #333333;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- .integral-input-wrapper {
|
|
|
- flex: 1;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- position: relative;
|
|
|
-
|
|
|
- .integral-input {
|
|
|
- width: 100%;
|
|
|
- font-size: 32rpx;
|
|
|
- color: #333333;
|
|
|
- text-align: center;
|
|
|
- padding: 12rpx 60rpx 12rpx 16rpx;
|
|
|
- background: #F7F8FA;
|
|
|
- border-radius: 8rpx;
|
|
|
-
|
|
|
- &::placeholder {
|
|
|
- color: #C8C9CC;
|
|
|
- font-size: 28rpx;
|
|
|
- text-align: center;
|
|
|
- }
|
|
|
-
|
|
|
- &:disabled {
|
|
|
- background: transparent;
|
|
|
- opacity: 0.8;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- .clear-icon-wrapper {
|
|
|
- position: absolute;
|
|
|
- right: 8rpx;
|
|
|
- width: 48rpx;
|
|
|
- height: 48rpx;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- z-index: 10;
|
|
|
- cursor: pointer;
|
|
|
-
|
|
|
- &:active {
|
|
|
- opacity: 0.6;
|
|
|
- }
|
|
|
-
|
|
|
- .clear-icon {
|
|
|
- width: 28rpx;
|
|
|
- height: 28rpx;
|
|
|
- }
|
|
|
- }
|
|
|
+ .tag-remove {
|
|
|
+ color: #C8C9CC;
|
|
|
+ font-size: 36rpx;
|
|
|
+ line-height: 1;
|
|
|
+ cursor: pointer;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- /* 概览弹窗样式 */
|
|
|
- .overview-popup {
|
|
|
- background-color: #fff;
|
|
|
- border-radius: 32rpx 32rpx 0 0;
|
|
|
- max-height: 80vh;
|
|
|
- overflow-y: auto;
|
|
|
- padding-bottom: env(safe-area-inset-bottom);
|
|
|
- }
|
|
|
|
|
|
- .popup-header {
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- padding: 32rpx 40rpx;
|
|
|
- .popup-title {
|
|
|
- font-weight: 500;
|
|
|
- font-size: 32rpx;
|
|
|
- color: #333333;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- .close-btn {
|
|
|
- width: 48rpx;
|
|
|
- height: 48rpx;
|
|
|
+ .search-input-wrapper {
|
|
|
+ background: #F7F8FA;
|
|
|
+ border-radius: 38rpx 38rpx 38rpx 38rpx;
|
|
|
+ position: relative;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- justify-content: center;
|
|
|
- cursor: pointer;
|
|
|
- position: absolute;
|
|
|
- right: 0;
|
|
|
+ padding: 0 28rpx;
|
|
|
+ height: 72rpx;
|
|
|
+ margin-bottom: 24rpx;
|
|
|
|
|
|
- .close-icon {
|
|
|
- width: 44rpx;
|
|
|
- height: 44rpx;
|
|
|
- margin-right: 32rpx;
|
|
|
- flex-shrink: 0;
|
|
|
+ .search-icon {
|
|
|
+ width: 36rpx;
|
|
|
+ height: 36rpx;
|
|
|
+ margin-right: 16rpx;
|
|
|
}
|
|
|
|
|
|
- &:active {
|
|
|
- opacity: 0.6;
|
|
|
+ .search-input {
|
|
|
+ flex: 1;
|
|
|
+ height: 100%;
|
|
|
+ font-size: 28rpx;
|
|
|
+ color: #333;
|
|
|
+ }
|
|
|
+
|
|
|
+ .clear-icon {
|
|
|
+ width: 32rpx;
|
|
|
+ height: 32rpx;
|
|
|
+ margin-left: 16rpx;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- .overview-section {
|
|
|
- padding: 32rpx 40rpx;
|
|
|
-
|
|
|
- .row {
|
|
|
+ .customer-list {
|
|
|
+ .customer-item {
|
|
|
+ border-radius: 24rpx 24rpx 24rpx 24rpx;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- margin-bottom: 24rpx;
|
|
|
-
|
|
|
- &:last-child {
|
|
|
- border-bottom: none;
|
|
|
- }
|
|
|
+ justify-content: space-between;
|
|
|
+ padding: 32rpx;
|
|
|
+ margin-bottom: 12rpx;
|
|
|
+ background-color: #ffffff;
|
|
|
+ cursor: pointer;
|
|
|
+ transition: all 0.3s;
|
|
|
|
|
|
- .line {
|
|
|
- width: 6rpx;
|
|
|
- height: 32rpx;
|
|
|
- background: #388BFF;
|
|
|
- border-radius: 36rpx;
|
|
|
- margin-right: 20rpx;
|
|
|
+ &.active {
|
|
|
+ background: rgba(56,139,255,0.06);
|
|
|
}
|
|
|
|
|
|
- .section-title {
|
|
|
- font-size: 28rpx;
|
|
|
- font-weight: 600;
|
|
|
- color: #333333;
|
|
|
+ &:last-child {
|
|
|
+ margin-bottom: 0;
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
|
|
|
-
|
|
|
-
|
|
|
- .info-list {
|
|
|
- .info-item {
|
|
|
+ .left {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
- margin-bottom: 16rpx;
|
|
|
|
|
|
- .info-label {
|
|
|
- color: #999999;
|
|
|
- flex-shrink: 0;
|
|
|
- width: 140rpx;
|
|
|
+ .head {
|
|
|
+ width: 88rpx;
|
|
|
+ height: 88rpx;
|
|
|
+ border-radius: 50%;
|
|
|
+ margin-right: 24rpx;
|
|
|
}
|
|
|
|
|
|
- .info-value {
|
|
|
- color: #333333;
|
|
|
+ .customer-info {
|
|
|
flex: 1;
|
|
|
- line-height: 1.4;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- .customer-table {
|
|
|
- .table-header {
|
|
|
- display: flex;
|
|
|
- background: #F5F9FF;
|
|
|
- border-radius: 8rpx;
|
|
|
- padding: 20rpx 16rpx;
|
|
|
- margin-bottom: 8rpx;
|
|
|
-
|
|
|
- .table-cell {
|
|
|
- font-size: 24rpx;
|
|
|
- font-weight: 600;
|
|
|
- color: #666666;
|
|
|
- text-align: center;
|
|
|
- }
|
|
|
- }
|
|
|
+ .customer-header {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: 12rpx;
|
|
|
|
|
|
- .table-body {
|
|
|
- .table-row {
|
|
|
- display: flex;
|
|
|
- padding: 20rpx 16rpx;
|
|
|
- border-bottom: 1rpx solid #F2F3F5;
|
|
|
+ .customer-name {
|
|
|
+ font-weight: 500;
|
|
|
+ font-size: 32rpx;
|
|
|
+ color: #333333;
|
|
|
+ margin-right: 16rpx;
|
|
|
+ }
|
|
|
|
|
|
- &:last-child {
|
|
|
- border-bottom: none;
|
|
|
+ .customer-level {
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #C89743;
|
|
|
+ background: #FFF6E5;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ padding: 4rpx 12rpx;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- .table-cell {
|
|
|
- font-size: 28rpx;
|
|
|
- color: #333333;
|
|
|
- text-align: center;
|
|
|
+ .customer-details {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
|
|
|
- &:first-child {
|
|
|
- font-weight: 500;
|
|
|
+ .customer-hospital {
|
|
|
+ font-size: 28rpx;
|
|
|
+ color: #666;
|
|
|
+ margin-right: 24rpx;
|
|
|
+ border-right: 2rpx solid #EAEBEE;
|
|
|
+ padding-right: 24rpx;
|
|
|
+ }
|
|
|
+
|
|
|
+ .customer-department {
|
|
|
+ font-size: 28rpx;
|
|
|
+ color: #666;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- .total-section {
|
|
|
- padding: 32rpx 40rpx;
|
|
|
- background: #F5F9FF;
|
|
|
- border-radius: 16rpx;
|
|
|
- margin: 24rpx 40rpx 40rpx;
|
|
|
-
|
|
|
- .total-item {
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
- margin-bottom: 16rpx;
|
|
|
-
|
|
|
- &:last-child {
|
|
|
- margin-bottom: 0;
|
|
|
- }
|
|
|
-
|
|
|
- .total-label {
|
|
|
- font-size: 28rpx;
|
|
|
- color: #666666;
|
|
|
- }
|
|
|
-
|
|
|
- .total-value {
|
|
|
- font-size: 28rpx;
|
|
|
- font-weight: 600;
|
|
|
- color: #388BFF;
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- .safe-area {
|
|
|
- height: env(safe-area-inset-bottom);
|
|
|
- }
|
|
|
-
|
|
|
.bottom-bar {
|
|
|
position: fixed;
|
|
|
bottom: 0;
|
|
|
@@ -683,10 +422,6 @@ import{editAudit} from '@/api/task.js'
|
|
|
color: #666666;
|
|
|
margin-right: 32rpx;
|
|
|
cursor: pointer;
|
|
|
-
|
|
|
- &:active {
|
|
|
- opacity: 0.6;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
.action-buttons {
|
|
|
@@ -718,12 +453,4 @@ import{editAudit} from '@/api/task.js'
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- .w40 {
|
|
|
- width: 40rpx;
|
|
|
- }
|
|
|
-
|
|
|
- .h40 {
|
|
|
- height: 40rpx;
|
|
|
- }
|
|
|
</style>
|