| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- <template>
- <view class="order-detail-container">
- <!-- 顶部导航栏 -->
- <u-navbar :autoBack="true" :placeholder="true" v-hideNav>
- <template slot="center">
- <view class="navbar-center">
- <text class="navbar-item" @click="handleBrandClick">{{ topInfo.brand }}</text>
- <text class="navbar-divider">|</text>
- <text class="navbar-item" @click="handleModelClick">{{ topInfo.model }}</text>
- <text class="navbar-divider">|</text>
- <text class="navbar-item price" @click="handlePriceClick">¥{{ topInfo.price }}</text>
- </view>
- </template>
- <template slot="right">
- <view class="navbar-right" @click="handleAddClick">
- <image src="/static/icons/plus.png" mode="scaleToFill" class="add-icon" />
- <text class="add-text">加一单</text>
- </view>
- </template>
- </u-navbar>
- <!-- 收单列表切换 -->
- <u-tabs keyName="brand" :list="receiptList" @click="handleReceiptClick" class="receipt-tabs" />
- <!-- 订单详情视图 -->
- <OrderDetailView :order-detail="orderDetail" :top-info="topInfo" :order-id="orderId"
- :current-receipt="currentReceipt" @price-updated="refreshCurrentReceipt" />
- <!-- 加一单模态窗 -->
- <u-modal :show="addOneModalVisible" title="加一单" showCancelButton @cancel="handleAddOneCancel"
- @confirm="handleAddOneConfirm">
- <view class="add-one-modal-content">
- <view class="add-one-form-item">
- <text class="form-label">品牌<text class="required">*</text></text>
- <u-button type="primary" plain @click="showBrandSelector = true" class="brand-select-btn">
- {{ currentAddBrand.dictLabel || '点击请选择品牌' }}
- </u-button>
- </view>
- <view class="add-one-form-item">
- <text class="form-label">型号</text>
- <u-input v-model="currentAddModel" placeholder="请输入型号" class="form-input" />
- </view>
- <view class="add-one-form-item">
- <text class="form-label">价格</text>
- <u-input v-model="currentAddPrice" placeholder="请输入价格" type="number" class="form-input" />
- </view>
- </view>
- </u-modal>
- <!-- 品牌选择器 -->
- <u-picker :show="showBrandSelector" :columns="brandColumns" keyName="dictLabel" @confirm="handleBrandConfirm"
- @cancel="showBrandSelector = false" />
- <!-- 编辑品牌选择器 -->
- <u-picker :show="editBrandSelectorVisible" :columns="brandColumns" keyName="dictLabel"
- @confirm="handleEditBrandConfirm" @cancel="editBrandSelectorVisible = false" />
- <!-- 修改型号/价格弹窗 -->
- <CustomModal :visible="modalVisible" :title="modalConfig.title" :value="modalConfig.value"
- :placeholder="modalConfig.placeholder" @cancel="handleModalCancel" @confirm="handleModalConfirm" />
- </view>
- </template>
- <script>
- import OrderDetailView from './components/OrderDetailView.vue'
- import CustomModal from './components/CustomModal.vue'
- export default {
- name: 'OrderDetailIndex',
- components: {
- OrderDetailView,
- CustomModal
- },
- data() {
- return {
- // 顶部信息
- topInfo: {
- brand: '',
- model: '',
- price: ''
- },
- // 路由参数
- orderId: '',
- clueId: '',
- item: '',
- type: '',
- // 订单详情
- orderDetail: {},
- // 收单列表
- receiptList: [],
- // 当前选中的收单
- currentReceipt: {},
- // 模态窗状态
- addOneModalVisible: false,
- showBrandSelector: false,
- editBrandSelectorVisible: false,
- modalVisible: false,
- // 品牌选择相关
- brandColumns: [[]],
- currentAddBrand: {},
- currentAddModel: '',
- currentAddPrice: '',
- // 模态窗配置
- modalConfig: {
- title: '',
- value: '',
- placeholder: ''
- },
- currentEditField: ''
- }
- },
- onLoad(options) {
- this.initParams(options)
- this.loadOrderDetail()
- this.loadReceiptList()
- },
- onPullDownRefresh() {
- // 下拉刷新时重新加载所有数据
- Promise.all([
- this.loadOrderDetail(),
- this.loadReceiptList()
- ]).finally(() => {
- uni.stopPullDownRefresh()
- uni.$u.toast('刷新成功')
- })
- },
- methods: {
- /**
- * 初始化参数
- */
- initParams(options) {
- const { item, orderId, type, clueId } = options
- this.item = item || ''
- this.orderId = orderId || ''
- this.type = type || ''
- this.clueId = clueId || ''
- },
- /**
- * 加载订单详情
- */
- async loadOrderDetail() {
- try {
- const res = await uni.$u.api.getClueSendFormVoByOrderId({
- id: this.orderId
- })
- if (res.code === 200) {
- this.orderDetail = res.data || {}
- }
- } catch (error) {
- console.error('加载订单详情失败:', error)
- uni.$u.toast('加载订单详情失败')
- }
- },
- /**
- * 加载收单列表
- */
- async loadReceiptList() {
- try {
- const res = await uni.$u.api.clueReceiptFormListByOrderId(this.orderId)
- if (res.code === 200) {
- this.receiptList = res.data || []
- // 默认选择第一个收单
- if (this.receiptList.length > 0) {
- this.handleReceiptClick(this.receiptList[0])
- }
- }
- } catch (error) {
- console.error('加载收单列表失败:', error)
- uni.$u.toast('加载收单列表失败')
- }
- },
- /**
- * 刷新当前收单(用于价格等修改后同步顶部信息)
- */
- async refreshCurrentReceipt() {
- if (!this.currentReceipt || !this.currentReceipt.id) return
- try {
- const res = await uni.$u.api.getReceiptForm(this.currentReceipt.id)
- if (res.code === 200 && res.data) {
- this.currentReceipt = res.data
- this.topInfo.brand = res.data.brand || '暂无'
- this.topInfo.model = res.data.model || '暂无'
- this.topInfo.price = res.data.sellingPrice ?? '暂无'
- }
- } catch (error) {
- console.error('刷新当前收单失败:', error)
- }
- },
- /**
- * 点击收单项
- */
- async handleReceiptClick(item) {
- console.log('点击了收单', item)
- //获取当前的收单form详情
- const res = await uni.$u.api.getReceiptForm(item.id)
- console.log('收单详情', res)
- if (res.code === 200) {
- this.currentReceipt = res.data || {}
- this.topInfo.brand = res.data.brand || '暂无'
- this.topInfo.model = res.data.model || '暂无'
- this.topInfo.price = res.data.sellingPrice || '暂无'
- }
- },
- /**
- * 点击品牌
- */
- handleBrandClick() {
- this.editBrandSelectorVisible = true
- this.loadBrandList()
- },
- /**
- * 点击型号
- */
- handleModelClick() {
- this.modalConfig = {
- title: '修改型号',
- value: this.currentReceipt.model || '',
- placeholder: '请输入型号'
- }
- this.currentEditField = 'model'
- this.modalVisible = true
- },
- /**
- * 点击价格
- */
- handlePriceClick() {
- this.modalConfig = {
- title: '修改价格',
- value: this.currentReceipt.sellingPrice?.toString() || '',
- placeholder: '请输入价格'
- }
- this.currentEditField = 'price'
- this.modalVisible = true
- },
- /**
- * 点击加一单
- */
- handleAddClick() {
- this.addOneModalVisible = true
- this.loadBrandList()
- },
- /**
- * 加载品牌列表
- */
- async loadBrandList() {
- try {
- const res = await this.$getDicts('crm_form_brand')
- this.brandColumns = [res]
- } catch (error) {
- console.error('加载品牌列表失败:', error)
- }
- },
- /**
- * 确认修改模态窗
- */
- async handleModalConfirm(value) {
- try {
- if (this.currentEditField === 'model') {
- await uni.$u.api.updateReceiptForm({
- model: value,
- id: this.currentReceipt.id
- })
- } else if (this.currentEditField === 'price') {
- await uni.$u.api.updateReceiptForm({
- sellingPrice: value,
- id: this.currentReceipt.id
- })
- }
- uni.$u.toast('修改成功')
- this.loadReceiptList()
- } catch (error) {
- console.error('修改失败:', error)
- uni.$u.toast('修改失败')
- } finally {
- this.modalVisible = false
- }
- },
- /**
- * 取消修改模态窗
- */
- handleModalCancel() {
- this.modalVisible = false
- },
- /**
- * 确认编辑品牌
- */
- async handleEditBrandConfirm(data) {
- try {
- await uni.$u.api.updateReceiptForm({
- brand: data.value[0].dictValue,
- id: this.currentReceipt.id
- })
- uni.$u.toast('修改成功')
- this.loadReceiptList()
- } catch (error) {
- console.error('修改品牌失败:', error)
- uni.$u.toast('修改失败')
- } finally {
- this.editBrandSelectorVisible = false
- }
- },
- /**
- * 确认选择品牌(加一单)
- */
- handleBrandConfirm(data) {
- this.currentAddBrand = data.value[0]
- this.showBrandSelector = false
- },
- /**
- * 确认加一单
- */
- async handleAddOneConfirm() {
- // 验证品牌是否已选择(必选)
- if (!this.currentAddBrand.dictValue) {
- uni.$u.toast('请选择品牌')
- return
- }
- try {
- await uni.$u.api.addReceiptForm({
- brand: this.currentAddBrand.dictValue,
- model: this.currentAddModel || '',
- sellingPrice: this.currentAddPrice || '',
- sendFormId: this.orderId,
- clueId: this.clueId
- })
- uni.$u.toast('添加成功')
- this.loadReceiptList()
- } catch (error) {
- console.error('添加失败:', error)
- uni.$u.toast('添加失败')
- } finally {
- this.addOneModalVisible = false
- this.currentAddBrand = {}
- this.currentAddModel = ''
- this.currentAddPrice = ''
- }
- },
- /**
- * 取消加一单
- */
- handleAddOneCancel() {
- this.addOneModalVisible = false
- this.currentAddBrand = {}
- this.currentAddModel = ''
- this.currentAddPrice = ''
- }
- }
- }
- </script>
- <style scoped lang="scss">
- .order-detail-container {
- min-height: 100vh;
- background-color: #f9fafb;
- }
- .navbar-center {
- display: flex;
- align-items: center;
- background-color: #fff;
- border-radius: 40rpx;
- padding: 10rpx 20rpx;
- box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
- }
- .navbar-item {
- font-weight: bold;
- color: #333;
- font-size: 28rpx;
- &.price {
- color: blueviolet;
- }
- }
- .navbar-divider {
- margin: 0 15rpx;
- color: #ddd;
- font-size: 28rpx;
- }
- .navbar-right {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: 20rpx;
- color: blueviolet;
- }
- .add-icon {
- width: 30rpx;
- height: 30rpx;
- }
- .add-text {
- margin-top: 4rpx;
- }
- .receipt-tabs {
- background-color: #fff;
- }
- .add-one-modal-content {
- padding: 20rpx 0;
- }
- .add-one-form-item {
- margin-bottom: 30rpx;
- &:last-child {
- margin-bottom: 0;
- }
- }
- .form-label {
- display: block;
- font-size: 28rpx;
- color: #333;
- margin-bottom: 15rpx;
- font-weight: 500;
- }
- .required {
- color: #f56c6c;
- margin-left: 4rpx;
- }
- .brand-select-btn {
- width: 100%;
- }
- .form-input {
- width: 100%;
- border: 2rpx solid #e0e0e0;
- border-radius: 10rpx;
- padding: 20rpx;
- font-size: 28rpx;
- }
- </style>
|