From b3fedd4221b807a07058be9d5d5d8ba8998adbcb Mon Sep 17 00:00:00 2001 From: Bang Hu <hu_bang@hotmail.com> Date: 星期四, 11 九月 2025 21:35:31 +0800 Subject: [PATCH] Bug修改代码提交 --- src/views/productManage/productPriceViewer/index.vue | 197 ++++++++++++++++++++++++++++--------------------- 1 files changed, 113 insertions(+), 84 deletions(-) diff --git a/src/views/productManage/productPriceViewer/index.vue b/src/views/productManage/productPriceViewer/index.vue index b1b9b8e..4caf97c 100644 --- a/src/views/productManage/productPriceViewer/index.vue +++ b/src/views/productManage/productPriceViewer/index.vue @@ -77,15 +77,7 @@ :colspan="getColspan(priceItem)" class="feature-value" > - <div class="order-methods"> - <span - v-for="method in priceItem.priceSettings" - :key="method" - class="method-item" - > - 鉁� {{ getPriceSettingText(method) }} - </span> - </div> + {{ priceItem.priceSettings.map((m:any) => getPriceSettingText(m)).join('銆�') }} </td> </tr> <tr> @@ -96,42 +88,7 @@ :colspan="getColspan(priceItem)" class="feature-value" > - <div class="price-info"> - <div - v-if="priceItem.priceSettings.includes('POINTS') && priceItem.pointsAmount > 0" - class="price-item" - > - <div class="price-lable-icon"> - <el-icon class="price-icon points"><Coin /></el-icon> - <span class="price-label">绉垎</span> - </div> - <span class="price-value points">{{ formatNumber(priceItem.pointsAmount) }} / {{ getPriceUnitText(priceItem.priceUnit) }}</span> - </div> - <div - v-if="priceItem.priceSettings.includes('CURRENCY') && priceItem.currencyAmount > 0" - class="price-item" - > - <div class="price-lable-icon"> - <span class="price-icon currency">楼</span> - <span class="price-label">璐у竵</span> - </div> - <span class="price-value currency">{{ formatNumber(priceItem.currencyAmount) }} / {{ getPriceUnitText(priceItem.priceUnit) }}</span> - </div> - <div - v-if="priceItem.priceSettings.includes('FREE')" - class="price-item" - > - <span class="price-label">璐圭敤</span> - <span class="price-value free">鍏嶈垂</span> - </div> - <div - v-if="priceItem.priceSettings.includes('AGREEMENT')" - class="price-item" - > - <span class="price-label">鍗忚:</span> - <span class="price-value agreement">姣弡{ getPriceUnitText(priceItem.priceUnit) }}</span> - </div> - </div> + {{ renderPrice(priceItem) }} </td> </tr> <tr> @@ -250,7 +207,7 @@ :controls="true" size="large" class="quantity-input" - @change="(value) => handleQuantityChange(suite.id, value?value:1)" + @change="(value) => handleQuantityChange(suite.id,value?value:1)" /> </td> <td class="th-center"> @@ -305,23 +262,26 @@ <table class="order-info-table"> <tbody> <tr> - <td class="label">璁㈠崟缂栧彿锛�</td> - <td class="value">{{ orderStatus.id }}</td> - <td class="label">鐢宠鏃堕棿锛�</td> + <td class="label">璁㈠崟缂栧彿</td> + <td class="value"> + {{ orderStatus.id }} + <el-link type="primary" @click="goBuyerCenter" style="margin-left: 8px">鐐瑰嚮鏌ョ湅</el-link> + </td> + <td class="label">鐢宠鏃堕棿</td> <td class="value">{{ orderStatus.applyTime }}</td> </tr> <tr> - <td class="label">浜у搧鍚嶇О锛�</td> + <td class="label">浜у搧鍚嶇О</td> <td class="value">{{ orderStatus.productName }}</td> - <td class="label">鎻愪緵鑰咃細</td> + <td class="label">鎻愪緵鑰�</td> <td class="value">{{ orderStatus.provider }}</td> </tr> <tr> - <td class="label">璁㈠崟鐘舵�侊細</td> + <td class="label">璁㈠崟鐘舵��</td> <td class="value">{{ statusText(orderStatus.status) }}</td> <td></td> <td class="value link"> - <el-link type="primary" @click="viewOrder">鏌ョ湅璁㈠崟淇℃伅</el-link> +<!-- <el-link type="primary" @click="viewOrder">鏌ョ湅璁㈠崟淇℃伅</el-link>--> </td> </tr> </tbody> @@ -337,7 +297,7 @@ <div class="footer" v-if="showPricePanel"> <el-button type="primary" @click="handleOrder">绔嬪嵆璁㈣喘</el-button> </div> - <div class="footer" v-else> + <div class="footer" v-if="showOrderPanel"> <el-button @click="returnPricePanel">杩斿洖浠锋牸瀵规瘮</el-button> <el-button type="primary" @click="submitOrder">鎻愪氦鐢宠</el-button> </div> @@ -348,17 +308,19 @@ <script setup lang="ts"> import { ref, watch, computed, onMounted } from 'vue' +import { useRouter } from 'vue-router' import { ElMessage } from 'element-plus' import { useRoute } from 'vue-router' import productPricingApi from '@/api/productPricingApi' import cartApi from '@/api/cartApi' import orderApi from '@/api/orderApi' -import { ShoppingCart, Coin, Money } from '@element-plus/icons-vue' import { useUserInfo } from '@/stores/modules/userInfo' import { queryUserDetail } from '@/api/userInfo' import productApi from '@/api/productApi' +import workFlowApi from '@/api/workFlowApi' const route = useRoute() +const router = useRouter() interface PriceItem { id: number @@ -393,7 +355,7 @@ const showOrderStatus = ref(false) // 妯℃嫙鐢ㄦ埛淇℃伅锛堝疄闄呭簲浠庣敤鎴风姸鎬佽幏鍙栵級 const userStore = useUserInfo() -let currentUserId = computed(() => userStore.getUserId || userStore.getUserInfo?.userId) +const currentUserId = computed(() => userStore.getUserId || userStore.getUserInfo?.userId) const currentUnitId = computed(() => userStore.getUnitId || userStore.getUserInfo?.unitId || '') onMounted(async () => { @@ -402,7 +364,8 @@ const res: any = await queryUserDetail() if (res?.code === 200 && res.data) { userStore.updateUserDetail(res.data) - currentUserId = res.data.userId || res.data.id + // currentUserId.value = res.data.id || res.data.userId + console.log(currentUserId.value) userInfo.value = res.data } else { ElMessage.error(res?.msg || '鏃犳硶鑾峰彇鐢ㄦ埛淇℃伅锛岃鍏堢櫥褰�') @@ -416,7 +379,8 @@ }else{ userInfo.value = userStore.getUserInfos } - + // 鑾峰彇璁㈣喘淇℃伅 + fetchProductData(currentProductId.value ? currentProductId.value : '') }) type PriceTypeKey = 'POINTS' | 'CURRENCY' | 'AGREEMENT' | 'FREE' interface OrderSuite extends PriceItem { @@ -473,6 +437,10 @@ const viewOrder = () => { window.alert('杩欓噷鍙烦杞埌璁㈠崟璇︽儏椤碉紙绀轰緥锛�') +} + +const goBuyerCenter = () => { + router.push({ name: 'tradeBuyerCenter', query: { t: String(Date.now()) } }) } const selectedCount = computed(() => orderSuites.value.filter(s => s.selected).length) @@ -546,6 +514,7 @@ try { await removeFromCart(String(suite.id)) orderSuites.value.splice(index, 1) + selectedSuiteIds.value.delete(suite.id) } catch (e) { } } @@ -637,7 +606,8 @@ loading.value = true try { - const res: any = await productPricingApi.listByProductId(productId) + // 鍙煡璇㈠凡鍚敤鐨勫畾浠� + const res: any = await productPricingApi.listBycondition({ productId: productId,isActive: true }) if (res?.code === 200) { const list = Array.isArray(res.data) ? res.data : [] const mapped: PriceItem[] = list.map((it: any) => { @@ -707,6 +677,13 @@ } finally { loading.value = false } + // 淇敼activeTab 榛樿鍊� + if(priceList.value.length > 0){ + + activeTab.value = groupedPriceData.value.hasOwnProperty('enterprise') ? 'enterprise' + : groupedPriceData.value.hasOwnProperty('project') ? 'project' : 'personal' + } + } // 鐩戝惉浜у搧ID鍙樺寲 @@ -714,7 +691,7 @@ if (newProductId) { fetchProductData(newProductId) } -},{ immediate: true }) +}) // 濂椾欢閫夋嫨澶勭悊 const handleSuiteSelect = (suiteId: number, checked: any) => { @@ -786,6 +763,21 @@ }else{ paymentType = '鍗忚' } + let processdefId: string = '' + const type = hasAGREEMENT ? 'trade_agreement' : 'trade_point'; + // 鑾峰彇宸ヤ綔娴佸弬鏁� + const wkParamsRes: any = await workFlowApi.getWorkFlowParams({ + type: type, + // unitId: '1', + businessKey: type + }) + if(wkParamsRes?.code === 200 && wkParamsRes.data?.processTemplateId){ + processdefId = wkParamsRes.data.processTemplateId + }else { + ElMessage.error('鑾峰彇宸ヤ綔娴佸弬鏁板け璐�!') + return + } + // 缁勮鍒涘缓璁㈠崟鍙傛暟锛圕reateOrderDTO锛� const payload = { userId: currentUserId.value, @@ -795,6 +787,7 @@ providerId: productHeader.value.createUserId, paymentType: paymentType, buyerRemarks: '', + processdefId: processdefId, items: items.map(it => ({ pricingId: it.id, productId: it.productId, @@ -829,25 +822,35 @@ applyTime: data.applyTime ? String(data.applyTime) : new Date().toLocaleString() } // 璋冪敤宸ヤ綔娴佹帴鍙e彂璧峰鎵规祦绋嬶紝鎷垮埌娴佺▼瀹炰緥ID鍚庡洖鍐欒鍗晈orkflow_id - try { - // 鏍规嵁鏄惁鍖呭惈鍗忚鏄庣粏锛岄厤缃笉鍚屾祦绋嬪畾涔変笌涓氬姟Key锛堝厛鐢ㄩ潤鎬佸�煎崰浣嶏級 - const processdefId = hasAGREEMENT ? 'Process_Agreement_Static' : 'Process_Points_Static' - const businessKey = hasAGREEMENT ? 'agreement_biz_key' : 'points_biz_key' - const wfRes: any = await orderApi.startWorkflowAndComplete({ - processdefId, - userid: String(currentUserId.value || ''), - businessKey - }) - if (wfRes?.code === 200 && wfRes.data?.processinstId) { - await orderApi.updateWorkflowId(data.orderId, wfRes.data.processinstId) - } - } catch (e) { - console.warn('鍚姩宸ヤ綔娴佸け璐ユ垨鏇存柊workflow_id澶辫触', e) - } + // 鏀惧悗绔鐞� + // try { + // // 鏍规嵁鏄惁鍖呭惈鍗忚鏄庣粏锛岄厤缃笉鍚屾祦绋嬪畾涔変笌涓氬姟Key锛堝厛鐢ㄩ潤鎬佸�煎崰浣嶏級 + // // const processdefId = hasAGREEMENT ? 'Process_Agreement_Static' : 'Process_Points_Static' + // const businessKey = hasAGREEMENT ? 'agreement_biz_key' : 'points_biz_key' + // const type = hasAGREEMENT ? 'trade_agreement' : 'trade_point'; + // // 鑾峰彇宸ヤ綔娴佸弬鏁� + // const wkParamsRes: any = await workFlowApi.getWorkFlowParams({ + // type: type, + // unitId: '1' + // }) + // if(wkParamsRes?.code === 200 && wkParamsRes.data?.processTemplateId){ + // const wfRes: any = await workFlowApi.startWorkflowAndComplete({ + // processdefId: wkParamsRes.data.processTemplateId, + // userid: String(currentUserId.value || ''), + // businessKey: businessKey + // }) + // if (wfRes?.code === 200 && wfRes.data?.processinstId) { + // await orderApi.updateWorkflowId(data.orderId, wfRes.data.processinstId) + // } + // } + // + // } catch (e) { + // console.warn('鍚姩宸ヤ綔娴佸け璐ユ垨鏇存柊workflow_id澶辫触', e) + // } // 娓呯┖璐墿杞︼紙鍚庣 + 鏈湴鐘舵�侊級 try { - const clearRes: any = await cartApi.clearCart(currentUserId.value, currentUnitId.value) + const clearRes: any = await cartApi.clearCart(currentUserId.value, currentUnitId.value,currentProductId.value ? currentProductId.value : '') if (clearRes?.code === 200) { cartItems.value = [] orderSuites.value = [] @@ -900,7 +903,7 @@ const removeFromCart = async (pricingId: string) => { try { - const res: any = await cartApi.removeFromCart(currentUserId.value, currentUnitId.value, pricingId) + const res: any = await cartApi.removeFromCart(currentUserId.value, currentUnitId.value, currentProductId.value? currentProductId.value : '',pricingId) if (res?.code === 200) { ElMessage.success('宸蹭粠璐墿杞︾Щ闄�') } else { @@ -912,10 +915,16 @@ } } -const updateCartItem = async (pricingId: number, quantity: number, duration: number) => { +const updateCartItem = async (pricingId: number, quantity: number | null, duration: number | null) => { try { // 杩欓噷闇�瑕佹牴鎹疄闄呮帴鍙h皟鏁达紝鍙兘闇�瑕佷紶閫掓洿澶氬弬鏁� - const res: any = await cartApi.updateCartItem(currentUserId.value, currentUnitId.value, pricingId, quantity) + let res: any = {} + if(quantity){ + res = await cartApi.updateCartItem(currentUserId.value, currentUnitId.value, currentProductId.value? currentProductId.value : '', pricingId, quantity) + } + if(duration){ + res = await cartApi.updateCartItemDuration(currentUserId.value, currentUnitId.value, currentProductId.value? currentProductId.value : '', pricingId, duration) + } if (res?.code === 200) { ElMessage.success('璐墿杞﹀凡鏇存柊') } else { @@ -930,7 +939,7 @@ const fetchCartItems = async () => { cartLoading.value = true try { - const res: any = await cartApi.getCartItems(currentUserId.value, currentUnitId.value) + const res: any = await cartApi.getCartItems(currentUserId.value, currentUnitId.value, currentProductId.value? currentProductId.value : '') if (res?.code === 200) { cartItems.value = res.data || [] // 灏嗚喘鐗╄溅鏁版嵁杞崲涓鸿鍗曞浠舵牸寮� @@ -972,7 +981,7 @@ // 澶勭悊鏁伴噺鍙樺寲 const handleQuantityChange = async (pricingId: number, quantity: number) => { try { - await updateCartItem(pricingId, quantity, 1) // 鏆傛椂浼犻�掗粯璁uration涓�1 + await updateCartItem(pricingId, quantity, null) // 鏆傛椂浼犻�掗粯璁uration涓�1 } catch (error) { console.error('鏇存柊鏁伴噺澶辫触:', error) } @@ -982,7 +991,7 @@ const handleDurationChange = async (pricingId: number, duration: number) => { try { // 杩欓噷鍙兘闇�瑕佹牴鎹疄闄呮帴鍙h皟鏁达紝浼犻�抎uration鍙傛暟 - await updateCartItem(pricingId, 1, duration) // 鏆傛椂浼犻�掗粯璁uantity涓�1 + await updateCartItem(pricingId, null, duration) // 鏆傛椂浼犻�掗粯璁uantity涓�1 } catch (error) { console.error('鏇存柊骞撮檺澶辫触:', error) } @@ -996,7 +1005,9 @@ PRIVATE_INCREMENT: '绉佹湁澧為噺鍖�', PUBLIC_INCREMENT: '鍏湁澧為噺鍖�', OTA: 'OTA鏈嶅姟', - CLOUD: '浜戞湇鍔�' + CLOUD: '浜戞湇鍔�', + RESOURCE_PACKAGE: '璧勬簮鍖�', + PERSONAL: '涓汉' } return map[salesForm] || salesForm } @@ -1070,6 +1081,24 @@ YEAR: '骞�' } return map[unit] || unit +} + +// 缁熶竴娓叉煋浠锋牸锛氬幓闄も�滅Н鍒�/璐у竵/璐圭敤/鍗忚鈥濈瓑绫诲瀷鍓嶇紑锛屼粎杈撳嚭绾环鏍兼枃鏈� +const renderPrice = (priceItem: PriceItem) => { + const segments: string[] = [] + if (priceItem.priceSettings.includes('POINTS') && priceItem.pointsAmount > 0) { + segments.push(`${formatNumber(priceItem.pointsAmount)} / ${getPriceUnitText(priceItem.priceUnit)}`) + } + if (priceItem.priceSettings.includes('CURRENCY') && priceItem.currencyAmount > 0) { + segments.push(`${formatNumber(priceItem.currencyAmount)} / ${getPriceUnitText(priceItem.priceUnit)}`) + } + if (priceItem.priceSettings.includes('FREE')) { + segments.push('鍏嶈垂') + } + if (priceItem.priceSettings.includes('AGREEMENT')) { + segments.push(`姣�${getPriceUnitText(priceItem.priceUnit)}`) + } + return segments.join('锛�') } // 鑾峰彇鍒嗙粍鍚庣殑琛ㄥご鏁版嵁 @@ -1453,7 +1482,7 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - line-height: 1; + line-height: 2; } .label { color:#606266; font-weight: 500; } .value { color:#303133; } -- Gitblit v1.8.0