feat(order): 优化订单流程

- 新增获取微信openid和生成支付订单的API接口
- 修改登录逻辑,保存公众号appid
- 优化AiDrama页面,接入新的AI生成接口
- 屏蔽商品tabbar
- 完善素材编辑页面,增加修改意见展示
This commit is contained in:
fhysy 2025-03-20 17:41:33 +08:00
parent 7946d4995d
commit c45996fdd8
12 changed files with 887 additions and 599 deletions

View File

@ -9,6 +9,7 @@
export default {
onLaunch: function() {
console.log('App Launch');
// #ifdef MP-WEIXIN
const updateManager = uni.getUpdateManager();
updateManager.onCheckForUpdate(function (res) {
@ -33,6 +34,7 @@
updateManager.onUpdateFailed(function (res) {
//
});
// #endif
},
onShow: function() {
console.log('App Show');

View File

@ -1,51 +1,14 @@
export default{
cdnImgUrl:'http://static.drgyen.com/app/hc-app-power/images',
// 正式
// baseUrl: 'https://ny-core.dieruen-iot.com',
// imgUrl: 'https://ny-core.dieruen-iot.com',
// baseUrl: 'https://platform-core.059000.xyz',
// imgUrl: 'https://platform-core.059000.xyz',
// wsUrl: 'wss://ny-core.dieruen-iot.com',
// 弃用
// iotOsBaseUrl:"https://iot.gkiiot.com/prod-api",
// 德润正式
// baseUrl: 'https://digital-core.dieruen-iot.com',
// imgUrl: 'https://digital-core.dieruen-iot.com',
// wsUrl: 'wss://digital-core.dieruen-iot.com',
// 谷云正式
// baseUrl: 'https://digital-core.drgyen.com',
// imgUrl: 'https://digital-core.drgyen.com',
// wsUrl: 'wss://digital-core.drgyen.com',
// 商城本地测试环境
baseUrl: 'http://192.168.1.17:8080',
imgUrl: 'http://192.168.1.17:8080',
wsUrl: 'wss://digital-core.drgyen.com',
// 长城
// baseUrl: 'https://zhny.snc.cn/prod-api/',
// imgUrl: 'https://zhny.snc.cn/prod-api/',
// wsUrl: 'wss://zhny.snc.cn/prod-api/',
// 线下
// baseUrl: 'http://192.168.1.17:8899',
// imgUrl: 'http://192.168.1.17:8899',
// wsUrl: 'ws://192.168.1.17:8899',
// iotOsBaseUrl:"http://192.168.18.139:8080",
// 本地
// baseUrl: 'http://192.168.18.134:9988/dev-api',
// imgUrl: 'http://192.168.18.134:9988/dev-api',
// iotOsBaseUrl:"http://iot.gkiiot.com:8080",
// #ifdef MP-WEIXIN
// mqttUrl:'wx://iot.gkiiot.com:8083/mqtt',
// mqttUrl:'wxs://iot.gkiiot.com/mqtt-ws/mqtt',
// mqttUrl:'wx://192.168.18.139:8083/mqtt',
// mqttUrl:'wx://iot.gkiiot.com:8083/mqtt',
//#endif
// #ifndef MP-WEIXIN
// mqttUrl:'ws://iot.gkiiot.com:8083/mqtt',
// mqttUrl:'ws://192.168.18.139:8083/mqtt',
// mqttUrl:'wx://iot.gkiiot.com:8083/mqtt',
// #endif
// 客户端id
clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e',
}

View File

@ -166,4 +166,26 @@ export default {
})
})
},
// 获取openid
getWxOpenid(data){
return new Promise((resolve, reject) => {
request.get('/wx/offiaccount/getAccessToken',data)
.then((res) =>{
resolve(res);
}).catch(err =>{
reject(err);
})
})
},
// 生成支付订单
addPayOrder(data){
return new Promise((resolve, reject) => {
request.post('/mall/order/pay',data)
.then((res) =>{
resolve(res);
}).catch(err =>{
reject(err);
})
})
},
}

View File

@ -122,17 +122,22 @@
"h5" : {
"devServer" : {
"https" : false,
"port" : 8055,
"disableHostCheck" : true // Host false
"port" : 8055
},
"disableHostCheck" : true, // Host false
"router" : {
"mode" : "hash",
"base" : ""
"mode" : "hash"
},
"base" : "",
// "base" : "/app/",
"optimization" : {
"treeShaking" : {
"enable" : false
"enable" : true
}
}
}
}
// "port" : 8055
// "disableHostCheck" : true, // Host false
// "base" : "/app/"

View File

@ -1,20 +1 @@
{
"name": "hc-zhyd-app",
"version": "1.0.0",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"flyio": "^0.6.14",
"mqtt": "^3.0.0"
},
"repository": {
"type": "git",
"url": "https://e.coding.net/fengsl/zhihuiyongdian/hc-app-power.git"
},
"description": ""
}
{}

View File

@ -120,12 +120,14 @@
"text": "消息",
"iconPath": "static/images/toolbar/new.png",
"selectedIconPath": "static/images/toolbar/new-active.png"
}, {
"pagePath": "pages/tabBar/product",
"text": "商品",
"iconPath": "static/images/toolbar/product.png",
"selectedIconPath": "static/images/toolbar/product-active.png"
}, {
},
// {
// "pagePath": "pages/tabBar/product",
// "text": "商品",
// "iconPath": "static/images/toolbar/product.png",
// "selectedIconPath": "static/images/toolbar/product-active.png"
// },
{
"pagePath": "pages/tabBar/order",
"text": "订单",
"iconPath": "static/images/toolbar/order.png",

View File

@ -124,6 +124,7 @@
smsLoading:false,
loading:false,
icpLicense:'',
homePage:"/pages/tabBar/order"
}
},
computed: {
@ -161,7 +162,7 @@
console.log("userToken", userToken)
if (userToken) {
uni.switchTab({
url: "../tabBar/product"
url: this.homePage
})
} else {
// this.getCode();
@ -368,7 +369,7 @@
smsCode: this.form.smsCode,
},
header: {
UserType: this.usetTypeValue == "普通用户" ? "PERSONAL" : "TENANT",
// UserType: this.usetTypeValue == "" ? "PERSONAL" : "TENANT",
},
success: (res) => {
console.log(res);
@ -379,29 +380,29 @@
})
this.$store.dispatch('setLogin', res.data.token);
uni.setStorage({
key: 'userType',
data: this.usetTypeValue,
key: 'appIdPublic',
data: this.appConfig.appIdPublic,
}).then(res => {
return uni.setStorage({
key: 'tenantId',
data: this.form.tenantId,
})
}).then(res => {
return uni.setStorage({
key: 'phonenumber',
data: this.form.phonenumber,
})
}).then(res => {
return uni.setStorage({
key: 'smsCode',
data: this.form.smsCode,
})
}).then(res => {
setTimeout(() => {
if (this.usetTypeValue == "普通用户") {
uni.reLaunch({
url: "../oneselfUser/index"
})
} else {
// if (this.usetTypeValue == "") {
// uni.reLaunch({
// url: "../oneselfUser/index"
// })
// } else {
uni.switchTab({
url: "../tabBar/product"
url: this.homePage
})
}
// }
}, 1000)
})
} else {
@ -440,8 +441,13 @@
})
this.$store.dispatch('setLogin', res.data.data.access_token);
uni.setStorage({
key: 'userType',
data: this.usetTypeValue,
key: 'appIdPublic',
data: this.appConfig.appIdPublic,
}).then(res => {
return uni.setStorage({
key: 'tenantId',
data: this.form.tenantId,
})
}).then(res => {
return uni.setStorage({
key: 'phonenumber',
@ -449,15 +455,16 @@
})
}).then(res => {
setTimeout(() => {
if (this.usetTypeValue == "普通用户") {
uni.reLaunch({
url: "../oneselfUser/index"
})
} else {
// if (this.usetTypeValue == "") {
// uni.reLaunch({
// url: "../oneselfUser/index"
// })
// } else {
console.log("this.homePage",this.homePage)
uni.switchTab({
url: "../tabBar/product"
url: this.homePage
})
}
// }
}, 1000)
})
} else {

View File

@ -127,6 +127,7 @@
isTenant: true,
appIdMini:'',
icpLicense:'',
homePage:"/pages/tabBar/order"
}
},
computed: {
@ -159,20 +160,20 @@
if(e.mode == '1'){ //mode:1
this.form.username = e.user || '';
this.form.password = e.pwd || '';
this.autoLogin()
// this.autoLogin()
}else{
userToken = uni.getStorageSync('userToken');
console.log("userToken", userToken)
if (userToken) {
uni.switchTab({
url: "../tabBar/product"
url: this.homePage
})
} else {
// this.getCodeImageFn();
}
}
this.usetTypeValue = e.userType == "user" ? "普通用户" : "企业用户";
// this.usetTypeValue = e.userType == "user" ? "" : "";
},
onShow() {
@ -339,11 +340,11 @@
url: '/pages/tabBar/my/userPolicy'
})
},
goForgotPasswordFn() {
uni.navigateTo({
url: `./forgotPassword?userType=${this.usetTypeValue=="普通用户"?"user":"company"}`
})
},
// goForgotPasswordFn() {
// uni.navigateTo({
// url: `./forgotPassword?userType=${this.usetTypeValue==""?"user":"company"}`
// })
// },
//
getCodeImageFn() {
this.$get("/captchaImage").then((res) => {
@ -361,7 +362,7 @@
password: this.form.password,
},
header: {
UserType: this.usetTypeValue == "普通用户" ? "PERSONAL" : "TENANT",
// UserType: this.usetTypeValue == "" ? "PERSONAL" : "TENANT",
},
success: (res) => {
console.log(res);
@ -372,8 +373,8 @@
})
this.$store.dispatch('setLogin', res.data.token);
uni.setStorage({
key: 'userType',
data: this.usetTypeValue,
key: 'appIdPublic',
data: this.appConfig.appIdPublic,
}).then(res => {
return uni.setStorage({
key: 'username',
@ -386,15 +387,15 @@
})
}).then(res => {
setTimeout(() => {
if (this.usetTypeValue == "普通用户") {
uni.reLaunch({
url: "../oneselfUser/index"
})
} else {
// if (this.usetTypeValue == "") {
// uni.reLaunch({
// url: "../oneselfUser/index"
// })
// } else {
uni.switchTab({
url: "../tabBar/product"
url: this.homePage
})
}
// }
}, 1000)
})
} else {
@ -425,6 +426,7 @@
},
success: (res) => {
console.log(res);
if (res.data.code == 200 && res.data.data.access_token) {
this.$refs.uToast.show({
title: '登录成功',
@ -432,8 +434,13 @@
})
this.$store.dispatch('setLogin', res.data.data.access_token);
uni.setStorage({
key: 'tenantId',
data: this.form.tenantId,
key: 'appIdPublic',
data: this.appConfig.appIdPublic,
}).then(res => {
return uni.setStorage({
key: 'tenantId',
data: this.form.tenantId,
})
}).then(res => {
return uni.setStorage({
key: 'username',
@ -445,16 +452,17 @@
data: this.form.password,
})
}).then(res => {
setTimeout(() => {
if (this.usetTypeValue == "普通用户") {
uni.reLaunch({
url: "../oneselfUser/index"
})
} else {
// if (this.usetTypeValue == "") {
// uni.reLaunch({
// url: "../oneselfUser/index"
// })
// } else {
uni.switchTab({
url: "../tabBar/product"
url: this.homePage
})
}
// }
}, 1000)
})
} else {

View File

@ -87,6 +87,7 @@
<script>
import { renderMarkdown } from './markdown.js';
import config from "@/common/api/config.js"
export default {
data() {
@ -118,13 +119,14 @@ export default {
//
needScrollToBottom: true,
//
scrollTimer: null
scrollTimer: null,
token:''
};
},
onLoad(options) {
// URL
this.orderId = options.orderId || '';
this.token = uni.getStorageSync('userToken');
// H5
// #ifdef H5
this.isH5 = true;
@ -242,115 +244,230 @@ export default {
// 使fetch APIH5
async fetchStreamResponse(apiMessages) {
try {
// AI
this.currentAiMessageIndex = this.messages.length;
this.messages.push({
role: 'assistant',
content: '',
renderedContent: '',
time: this.formatTime(new Date()),
endStatus: false
});
try {
// AI
this.currentAiMessageIndex = this.messages.length;
this.messages.push({
role: 'assistant',
content: '',
renderedContent: '',
time: this.formatTime(new Date()),
endStatus: false
});
const response = await fetch(`${config.baseUrl}/ai/generateStream`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${this.token}`,
'clientid': config.clientId,
'Content-Type': 'application/json'
},
redirect: 'follow',
body: JSON.stringify(apiMessages)
});
if (!response.ok) {
throw new Error(`API请求失败: ${response.status}`);
}
if (!response.body) {
throw new Error('响应体为空');
}
const reader = response.body.getReader();
const decoder = new TextDecoder();
let result = '';
let buffer = ''; //
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
buffer += chunk; // chunkbuffer
console.log("buffer",buffer)
// ,buffer
const lines = buffer.split('\n');
buffer = lines.pop() || ''; // buffer,
console.log("lines",lines)
for (const line of lines.filter(l => l.trim())) {
// debugger
console.log('处理行:', line);
let data = line;
if (line.startsWith('data:')) {
data = line.substring(5).trim();
}
console.log("data",data)
if (data === '[DONE]') {
//
if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
this.messages[this.currentAiMessageIndex].endStatus = true;
//
this.throttledScrollToBottom();
}
continue;
}
// debugger
try {
result += data;
console.log("result",result)
if (this.messages && this.currentAiMessageIndex < this.messages.length) {
this.messages[this.currentAiMessageIndex].content = result;
this.messages[this.currentAiMessageIndex].renderedContent = renderMarkdown(result);
console.log("messages1",this.messages)
//
this.throttledScrollToBottom();
} else {
console.warn('无法更新消息,索引无效:', aiMessageIndex);
}
} catch (e) {
console.error('解析流数据失败:', e, line);
}
}
// buffer
if (buffer) {
try {
let data = buffer;
if (buffer.startsWith('data:')) {
data = buffer.substring(5).trim();
}
if (data && data !== '[DONE]') {
result += data;
this.messages[this.currentAiMessageIndex].content = result;
this.messages[this.currentAiMessageIndex].renderedContent = renderMarkdown(result);
this.throttledScrollToBottom();
}
} catch (e) {
console.error('处理剩余数据失败:', e, buffer);
}
}
}
return result;
} catch (error) {
console.error('调用DeepSeek流式API失败:', error);
// AI
if (this.messages.length > 0 && this.messages[this.messages.length - 1].content === '') {
this.messages.pop();
this.currentAiMessageIndex = -1;
}
throw error;
}
// try {
// // AI
// this.currentAiMessageIndex = this.messages.length;
// this.messages.push({
// role: 'assistant',
// content: '',
// renderedContent: '',
// time: this.formatTime(new Date()),
// endStatus: false
// });
const response = await fetch('https://api.siliconflow.cn/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'deepseek-ai/DeepSeek-R1-Distill-Qwen-7B',
messages: apiMessages,
stream: true,
max_tokens: 8192,
stop: '',
temperature: 0.6,
top_p: 0.7,
top_k: 50,
frequency_penalty: 0
})
});
// const response = await fetch('https://api.siliconflow.cn/v1/chat/completions', {
// method: 'POST',
// headers: {
// 'Authorization': `Bearer ${this.apiKey}`,
// 'Content-Type': 'application/json'
// },
// body: JSON.stringify({
// model: 'deepseek-ai/DeepSeek-R1-Distill-Qwen-7B',
// messages: apiMessages,
// stream: true,
// max_tokens: 8192,
// stop: '',
// temperature: 0.6,
// top_p: 0.7,
// top_k: 50,
// frequency_penalty: 0
// })
// });
if (!response.ok) {
throw new Error(`API请求失败: ${response.status}`);
}
// if (!response.ok) {
// throw new Error(`API: ${response.status}`);
// }
if (!response.body) {
throw new Error('响应体为空');
}
// if (!response.body) {
// throw new Error('');
// }
const reader = response.body.getReader();
const decoder = new TextDecoder();
let result = '';
// const reader = response.body.getReader();
// const decoder = new TextDecoder();
// let result = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
// while (true) {
// const { done, value } = await reader.read();
// if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n').filter(line => line.trim() !== '');
// const chunk = decoder.decode(value);
// const lines = chunk.split('\n').filter(line => line.trim() !== '');
for (const line of lines) {
if (line.startsWith('data: ')) {
const data = line.substring(6).trim();
if (data === '[DONE]') {
//
if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
this.messages[this.currentAiMessageIndex].endStatus = true;
//
this.throttledScrollToBottom();
}
continue;
}
// for (const line of lines) {
// if (line.startsWith('data: ')) {
// const data = line.substring(6).trim();
// if (data === '[DONE]') {
// //
// if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
// this.messages[this.currentAiMessageIndex].endStatus = true;
// //
// this.throttledScrollToBottom();
// }
// continue;
// }
try {
const parsed = JSON.parse(data);
// parsedchoices
if (!parsed || !parsed.choices || !Array.isArray(parsed.choices) || parsed.choices.length === 0) {
console.warn('无效的响应格式:', data);
continue;
}
// try {
// const parsed = JSON.parse(data);
// // parsedchoices
// if (!parsed || !parsed.choices || !Array.isArray(parsed.choices) || parsed.choices.length === 0) {
// console.warn(':', data);
// continue;
// }
// 访delta
const delta = parsed.choices[0].delta || {};
// // 访delta
// const delta = parsed.choices[0].delta || {};
//
const content = delta.content;
// reasoning_contentcontent
const reasoningContent = delta.reasoning_content || '';
// //
// const content = delta.content;
// // reasoning_contentcontent
// const reasoningContent = delta.reasoning_content || '';
// contentnullreasoningContent
const textToAdd = (content !== null && content !== undefined) ? content : reasoningContent;
// // contentnullreasoningContent
// const textToAdd = (content !== null && content !== undefined) ? content : reasoningContent;
if (textToAdd) {
result += textToAdd;
// messages[currentAiMessageIndex]
if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
this.messages[this.currentAiMessageIndex].content = result;
this.messages[this.currentAiMessageIndex].renderedContent = renderMarkdown(result);
// if (textToAdd) {
// result += textToAdd;
// // messages[currentAiMessageIndex]
// if (this.currentAiMessageIndex >= 0 && this.currentAiMessageIndex < this.messages.length) {
// this.messages[this.currentAiMessageIndex].content = result;
// this.messages[this.currentAiMessageIndex].renderedContent = renderMarkdown(result);
//
this.throttledScrollToBottom();
}
}
} catch (e) {
console.error('解析流数据失败:', e, line);
}
}
}
}
// //
// this.throttledScrollToBottom();
// }
// }
// } catch (e) {
// console.error(':', e, line);
// }
// }
// }
// }
return result;
} catch (error) {
console.error('调用DeepSeek流式API失败:', error);
// AI
if (this.messages.length > 0 && this.messages[this.messages.length - 1].content === '') {
this.messages.pop();
this.currentAiMessageIndex = -1;
}
throw error;
}
// return result;
// } catch (error) {
// console.error('DeepSeekAPI:', error);
// // AI
// if (this.messages.length > 0 && this.messages[this.messages.length - 1].content === '') {
// this.messages.pop();
// this.currentAiMessageIndex = -1;
// }
// throw error;
// }
},
// 使H5

View File

@ -9,6 +9,15 @@
</view>
</view>
<view class="form-item" v-if="commitState === 'back'">
<text class="form-label">修改意见</text>
<template>
<view class="comment-box">
{{ comment }}
</view>
</template>
</view>
<view class="form-item">
<text class="form-label">剧本 <text class="form-hint">视频的剧本</text> </text>
<!-- 文本输入 -->
@ -92,6 +101,7 @@
orderItemId: "",
//
commitState:'add',
comment:'',
materialfrom:{
id: undefined,
dictId: undefined,
@ -159,26 +169,17 @@
});
},
async getProductDetail(){
// let res = await this.$api.orderApi.getMallclientOrderProductList({ orderId: this.orderId, productId: this.productId })
let res = await this.$api.orderApi.getOrderMaterialList({ orderItemId: this.orderItemId })
console.log("res",res)
// this.materialfrom.productSn = res.rows[0].productSn;
// this.commitState = res.rows[0].commitState;
// if (this.commitState === 0) {
// this.getMaterialDictList();
// } else {
// this.getMaterialList();
// }
if(res.rows.length!=0){
this.materialfrom.flowId = res.rows[0].id;
this.commitState = res.rows[0].status;
this.comment = res.rows[0].comment || '';
this.scriptContent = res.rows[0].script || '';
this.materialTemplateList = res.rows[0].materialItems || [];
res.rows[0].materialItems.forEach(async (item,index)=>{
if(item.attrType !== 0 && item.attrValue !== ''){
let {fileUrl,fileName} = await this.getFileDetail(item.attrValue);
console.log("fileUrl,fileName",fileUrl,fileName)
// this.materialTemplateList[index].fileUrl = fileUrl;
// this.materialTemplateList[index].fileName = fileName;
this.$nextTick(()=>{
this.$set(this.materialTemplateList[index],'fileUrl',fileUrl)
this.$set(this.materialTemplateList[index],'fileName',fileName)
@ -440,13 +441,21 @@
orderId: this.orderId,
productId: this.productId,
orderItemId: this.orderItemId,
materialItems: this.materialTemplateList
materialItems: this.materialTemplateList,
script: this.scriptContent
});
this.buttonLoading = false;
this.materialfrom.flowId = res.data.id;
this.getProductDetail();
}else{
res = await this.$api.orderApi.mallMaterialUpdateBatch(this.materialTemplateList);
res = await this.$api.orderApi.EditOrderMaterial({
orderId: this.orderId,
productId: this.productId,
orderItemId: this.orderItemId,
materialItems: this.materialTemplateList,
script: this.scriptContent,
id: this.materialfrom.flowId
});
this.buttonLoading = false;
}
@ -514,6 +523,15 @@
align-items: center;
}
}
.comment-box{
background-color: rgb(254,242,242);
border: 1px solid rgb(254,226,226);
border-radius: 0.5rem;
padding: 1rem;
width: 100%;
color: red;
font-size: 36rpx;
}
.form-item {
margin-bottom: 20rpx;
@ -527,9 +545,9 @@
margin-bottom: 10rpx;
font-weight: bold;
.form-hint{
font-size: 22rpx;
color: #666;
margin-left: 10rpx;
font-size: 20rpx;
color: #999;
margin-left: 6rpx;
}
}

View File

@ -1,394 +1,556 @@
<template>
<view class="container">
<!-- 订单信息 -->
<view class="info-card">
<view class="info-item">
<text class="label">订单编号</text>
<text class="value">{{ orderInfo.orderSn }}</text>
</view>
<view class="info-item">
<text class="label">创建时间</text>
<text class="value">{{ orderInfo.createTime }}</text>
</view>
<view class="info-item">
<text class="label">客户姓名</text>
<text class="value">{{ orderInfo.memberName }}</text>
</view>
<view class="info-item">
<text class="label">客户手机</text>
<text class="value">{{ orderInfo.memberPhone }}</text>
</view>
</view>
<!-- 商品信息 -->
<view class="info-card">
<view class="card-title">商品信息</view>
<view class="">
<view v-for="(item, index) in orderInfo.orderItems" :key="index" class="product-item">
<image :src="item.productPic" mode="aspectFill" class="product-image" @click="lookPic(item.productPic)"></image>
<view class="product-info">
<text class="product-name">{{ item.productName }}</text>
<view class="product-bottom">
<text class="product-quantity">x{{ item.productQuantity }}</text>
<text class="product-price">¥{{ (item.productPrice / 100).toFixed(2) }}</text>
</view>
</view>
<view class="container">
<!-- 订单信息 -->
<view class="info-card">
<view class="info-item">
<text class="label">订单编号</text>
<text class="value">{{ orderInfo.orderSn }}</text>
</view>
<view class="info-item">
<text class="label">创建时间</text>
<text class="value">{{ orderInfo.createTime }}</text>
</view>
<view class="info-item">
<text class="label">客户姓名</text>
<text class="value">{{ orderInfo.memberName }}</text>
</view>
<view class="info-item">
<text class="label">客户手机</text>
<text class="value">{{ orderInfo.memberPhone }}</text>
</view>
</view>
<!-- 商品信息 -->
<view class="info-card">
<view class="card-title">商品信息</view>
<view class="">
<view v-for="(item, index) in orderInfo.orderItems" :key="index" class="product-item">
<image :src="item.productPic" mode="aspectFill" class="product-image" @click="lookPic(item.productPic)">
</image>
<view class="product-info">
<text class="product-name">{{ item.productName }}</text>
<view class="product-bottom">
<text class="product-quantity">x{{ item.productQuantity }}</text>
<text class="product-price">¥{{ (item.productPrice / 100).toFixed(2) }}</text>
</view>
</view>
</view>
<!-- 订单金额信息 -->
<view class="amount-info">
<view class="amount-item">
<text>总金额</text>
<text class="price">¥{{ (orderInfo.totalAmount / 100).toFixed(2) }}</text>
</view>
<view class="amount-item">
<text>已付额</text>
<text class="price paid">¥{{ orderInfo.payAmount ? (orderInfo.payAmount / 100).toFixed(2) : '0.00' }}</text>
</view>
<view class="amount-item">
<text>支付方式</text>
<view class="payment-method">
<!-- <u-icon name="weixin-fill" color="#07c160" size="28"></u-icon> -->
<text>{{getDictName('mall_pay_type',orderInfo.payType,'dictLabel')}}</text>
</view>
</view>
</view>
</view>
<!-- 订单其他信息 -->
<view class="info-card">
<view class="info-item">
<text class="label">订单来源</text>
<view class="value source">
<u-icon name="shopping-mall" size="24"></u-icon>
<text>{{getDictName('mall_source_type',orderInfo.sourceType,'dictLabel')}}</text>
</view>
</view>
<view class="info-item">
<text class="label">订单状态</text>
<text class="value status" :class="['dict-item',getDictName('mall_order_status',orderInfo.orderStatus,'listClass')]">{{getDictName('mall_order_status',orderInfo.orderStatus,'dictLabel')}}</text>
</view>
<view class="info-item">
<text class="label">订单备注</text>
<text class="value">{{ orderInfo.orderNote || '无' }}</text>
</view>
</view>
<!-- 底部购买按钮 -->
<view class="btn-box">
<u-button type="primary" style="width: 680rpx;" :loading="buttonLoading" @click="handlePay">去支付</u-button>
</view>
</view>
<!-- 订单金额信息 -->
<view class="amount-info">
<view class="amount-item">
<text>总金额</text>
<text class="price">¥{{ (orderInfo.totalAmount / 100).toFixed(2) }}</text>
</view>
<view class="amount-item">
<text>已付额</text>
<text class="price paid">¥{{ orderInfo.payAmount ? (orderInfo.payAmount / 100).toFixed(2) : '0.00' }}</text>
</view>
<view class="amount-item">
<text>支付方式</text>
<view class="payment-method">
<!-- <u-icon name="weixin-fill" color="#07c160" size="28"></u-icon> -->
<text>{{getDictName('mall_pay_type',orderInfo.payType,'dictLabel')}}</text>
</view>
</view>
</view>
</view>
<!-- 订单其他信息 -->
<view class="info-card">
<view class="info-item">
<text class="label">订单来源</text>
<view class="value source">
<u-icon name="shopping-mall" size="24"></u-icon>
<text>{{getDictName('mall_source_type',orderInfo.sourceType,'dictLabel')}}</text>
</view>
</view>
<view class="info-item">
<text class="label">订单状态</text>
<text class="value status"
:class="['dict-item',getDictName('mall_order_status',orderInfo.orderStatus,'listClass')]">{{getDictName('mall_order_status',orderInfo.orderStatus,'dictLabel')}}</text>
</view>
<view class="info-item">
<text class="label">订单备注</text>
<text class="value">{{ orderInfo.orderNote || '无' }}</text>
</view>
</view>
<!-- 底部购买按钮 -->
<view class="btn-box">
<u-button type="primary" style="width: 680rpx;" :loading="buttonLoading" @click="handlePay">去支付</u-button>
</view>
<u-toast ref="uToast" />
</view>
</template>
<script>
export default {
data() {
return {
orderId:'',
orderInfo:{
"billContent": null,
"billHeader": null,
"billReceiverEmail": null,
"billReceiverPhone": null,
"billType": 0,
"confirmStatus": 0,
"createBy": "",
"createTime": "",
"deliveryTime": null,
"finishTime": null,
"freightAmount": null,
"id": "",
"memberName": "",
"memberPhone": "",
"memberUsername": "",
"orderItems": [],
"orderNote": null,
"orderSn": "",
"orderStatus": 0,
"orderType": 0,
"payAmount": null,
"payTime": null,
"payType": 0,
"receiverCity": null,
"receiverDetailAddress": null,
"receiverName": null,
"receiverPhone": null,
"receiverPostCode": null,
"receiverProvince": null,
"receiverRegion": null,
"sourceType": 0,
"totalAmount": 0,
"updateBy": "",
"updateTime": ""
},
mall_order_status:[],
mall_source_type:[],
mall_pay_type:[],
buttonLoading:false,
officialAccount:{
appid:'',
appsecret:'ca307cfb6c94e8ac015e26cfd717a91c',
},
code:'',
openId:'',
}
},
onLoad(option) {
this.officialAccount.appid = this.$store.state.app.appConfig.appIdPublic;
this.getDictDataList('mall_order_status');
this.getDictDataList('mall_source_type');
this.getDictDataList('mall_pay_type');
console.log("option",option)
this.orderId = option.id;
this.getOrderDetail(option.id);
let res = uni.getStorageSync('openid');
if (res.length == 2) {
this.openid = res[1].data;
}else{
// #ifdef H5
let code = this.getUrlCode('code')
if(code || this.code){
this.code = code;
this.getOpenidAndUserinfo(code)
}else{
console.log("当前网址",window.location.href)
this.getH5Code()
// import WeixinJSBridge from '../../utils/jweixin-1.6.0.js';
var jweixin = require('jweixin-module');
export default {
data() {
return {
orderId: '',
orderInfo: {
"billContent": null,
"billHeader": null,
"billReceiverEmail": null,
"billReceiverPhone": null,
"billType": 0,
"confirmStatus": 0,
"createBy": "",
"createTime": "",
"deliveryTime": null,
"finishTime": null,
"freightAmount": null,
"id": "",
"memberName": "",
"memberPhone": "",
"memberUsername": "",
"orderItems": [],
"orderNote": null,
"orderSn": "",
"orderStatus": 0,
"orderType": 0,
"payAmount": null,
"payTime": null,
"payType": 0,
"receiverCity": null,
"receiverDetailAddress": null,
"receiverName": null,
"receiverPhone": null,
"receiverPostCode": null,
"receiverProvince": null,
"receiverRegion": null,
"sourceType": 0,
"totalAmount": 0,
"updateBy": "",
"updateTime": ""
},
mall_order_status: [],
mall_source_type: [],
mall_pay_type: [],
buttonLoading: false,
officialAccount: {
appid: '',
appsecret: 'ca307cfb6c94e8ac015e26cfd717a91c',
},
code: '',
openId: '',
}
// #endif
}
},
methods:{
//
getOrderDetail(id){
this.$api.orderApi.getOrderDetail(id).then((res)=>{
console.log("获取订单详情",res)
if(res.code == 200){
this.orderInfo = res.data;
}
}).catch(()=>{
})
},
getDictDataList(type){
this.$api.getDictList(type).then((res)=>{
if(res.code===200){
this[type] = res.data || [];
}
})
},
getDictName(list,value,key){
let name = ''
if(this[list]){
this[list].forEach((item)=>{
if(item.dictValue == value){
name = item[key];
onLoad(option) {
let appIdPublic = uni.getStorageSync('appIdPublic');
console.log("this.$store.state.app.appConfig.appIdPublic",this.$store.state.app.appConfig.appIdPublic)
this.officialAccount.appid = appIdPublic || '';
this.getDictDataList('mall_order_status');
this.getDictDataList('mall_source_type');
this.getDictDataList('mall_pay_type');
console.log("option", option)
this.orderId = option.id;
this.getOrderDetail(option.id);
let res = uni.getStorageSync('openId');
if (res) {
this.openId = res;
} else {
// #ifdef H5
let code = this.getUrlCode('code')
if (code || this.code) {
this.code = code;
this.getOpenidAndUserinfo(code)
// // URLcode
// const url = window.location.href;
// const newUrl = url.split('?')[0]; //
// history.replaceState({}, '', newUrl+'');
} else {
console.log("当前网址", window.location.href)
this.getH5Code()
}
// #endif
}
},
methods: {
//
getOrderDetail(id) {
this.$api.orderApi.getOrderDetail(id).then((res) => {
console.log("获取订单详情", res)
if (res.code == 200) {
this.orderInfo = res.data;
}
}).catch(() => {})
},
getDictDataList(type) {
this.$api.getDictList(type).then((res) => {
if (res.code === 200) {
this[type] = res.data || [];
}
})
return name;
}
},
lookPic(url){
uni.previewImage({
current: '', // http
urls: [url] // http
});
},
handlePay() {
//
uni.showToast({
title: '正在开发中...',
icon: 'none'
})
// openid
},
getH5Code(){
if(this.isWechat()) {
// codecodecodecodeopenId
window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+this.officialAccount.appid+'&redirect_uri=' + encodeURIComponent(window.location.href) + '&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect'
console.log("跳转授权页面")
// redirect_uriurlcodeencodeURIComponent
// code
// http://127.0.0.1/pages/views/profile/login/login?code=001BWV4J1lRzz00H4J1J1vRE4J1BWV4q&state=1
}
},
getUrlCode(name){
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1].replace(/\+/g, '%20')) || null
},
isWechat(){
return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger";
},
getOpenidAndUserinfo(code){
console.log("code换openid")
uni.request({
url: 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='+this.officialAccount.appid+'&secret='+this.officialAccount.secret +'&grant_type=authorization_code&code='+code,
success: (res) => {
console.log('通过code获取openid和accessToken', res)
// if(res.data.code === 200) {
// // token
// uni.setStorageSync('userInfo', res.data.result.userInfo)
// uni.setStorageSync('token', res.data.result.token)
// }
},
getDictName(list, value, key) {
let name = ''
if (this[list]) {
this[list].forEach((item) => {
if (item.dictValue == value) {
name = item[key];
}
})
return name;
}
},
lookPic(url) {
uni.previewImage({
current: '', // http
urls: [url] // http
});
},
handlePay() {
//
// uni.showToast({
// title: '...',
// icon: 'none'
// })
// openid
console.log("支付")
if(this.openId){
this.$api.orderApi.addPayOrder({
orderId: this.orderInfo.id,
//openid
channelExtra: JSON.stringify({'openid': this.openId}),
wayCode: 'LKL_WX_JSAPI'
}).then((res) => {
console.log("获取支付详情", res)
if (res.code == 200) {
// this.orderInfo = res.data;
}
}).catch(() => {})
// this.wxpay({
// "appId": this.officialAccount.appid, //
// "timeStamp": 'a1sd12as1d23sa1d231as2d1asd', //
// "nonceStr": 'a1sd12as1d23sa1d231as2d1asd', //
// "package": 'a1sd12as1d23sa1d231as2d1asd', //prepay_id
// "signType": 'a1sd12as1d23sa1d231as2d1asd', //RSA
// "paySign": 'a1sd12as1d23sa1d231as2d1asd', //
// "signature": 'a1sd12as1d23sa1d231as2d1asd' //
// })
}else{
this.clearUrlCode()
this.getH5Code()
this.$refs.uToast.show({
title: '获取支付信息失败,请重试',
type: 'error',
})
}
},
clearUrlCode(){
// URLcode
const url = window.location.href;
const newUrl = url.split('?')[0]; //
history.replaceState({}, '', newUrl+'/pages/order/detail?id='+this.orderId);
},
getH5Code() {
if (this.isWechat()) {
// codecodecodecodeopenId
window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + this.officialAccount
.appid + '&redirect_uri=' + encodeURIComponent(window.location.href) +
'&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect'
console.log("跳转授权页面",'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + this.officialAccount
.appid + '&redirect_uri=' + encodeURIComponent(window.location.href) +
'&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect')
// redirect_uriurlcodeencodeURIComponent
// code
// http://127.0.0.1/pages/views/profile/login/login?code=001BWV4J1lRzz00H4J1J1vRE4J1BWV4q&state=1
}
},
getUrlCode(name) {
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [,
''])[1].replace(/\+/g, '%20')) || null
},
isWechat() {
return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger";
},
getOpenidAndUserinfo(code) {
console.log("code换openid")
this.$api.orderApi.getWxOpenid({
code: code
}).then((res) => {
console.log("获取openid", res)
if (res.code == 200) {
if(res.data.openid){
this.openId = res.data.openid;
uni.setStorageSync('openId', res.data.openid)
this.clearUrlCode();
}else{
this.clearUrlCode();
this.getUrlCode();
}
// 1
// 2
}else{
}
})
}
}
}
}).catch(() => {
})
// uni.request({
// url: 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='+this.officialAccount.appid+'&secret='+this.officialAccount.secret +'&grant_type=authorization_code&code='+code,
// success: (res) => {
// console.log('codeopenidaccessToken', res)
// // if(res.data.code === 200) {
// // // token
// // uni.setStorageSync('userInfo', res.data.result.userInfo)
// // uni.setStorageSync('token', res.data.result.token)
// // }
// }
// })
},
wxpay(data) {
// if (typeof WeixinJSBridge == "undefined") {
// if (document.addEventListener) {
// document.addEventListener('WeixinJSBridgeReady', this.onBridgeReady(data), false);
// } else if (document.attachEvent) {
// document.attachEvent('WeixinJSBridgeReady', this.onBridgeReady(data));
// document.attachEvent('onWeixinJSBridgeReady', this.onBridgeReady(data));
// }
// } else {
// this.onBridgeReady(data);
// }
jweixin.config({
debug: false, // ,apialertpclogpc
appId: data.appId, //
timestamp: data.timestamp, //
nonceStr: data.nonceStr, //
signature: data.signature, //
jsApiList: ['chooseWXPay'], // JS
})
this.onBridgeReady(data);
},
onBridgeReady(data) {
// jweixin.ready(()=>{
// // configreadyconfigconfigreadyready
// jweixin.chooseWXPay({
// timestamp: data.timeStamp,
// package: data.package,
// nonceStr: data.nonceStr,
// signType: data.signType,
// paySign: data.paySign,
// success: (res) => {
// if (res.errMsg == "chooseWXPay:ok") {
// console.log('')
// } else {
// console.log('')}
// },
// fail: (res) => {
// console.log('')
// }
// });
// });
jweixin.invoke(
'getBrandWCPayRequest', {
//
"appId": data.appId, //
"timeStamp": data.timeStamp, //
"nonceStr": data.nonceStr, //
"package": data.package, //prepay_id
"signType": data.signType, //RSA
"paySign": data.paySign //
},
(res)=>{
//
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 使,
//res.err_msgok
this.$refs.uToast.show({
title: '支付成功',
type: 'success',
})
}
//
if (res.err_msg == "get_brand_wcpay_request:cancel") {
this.$refs.uToast.show({
title: '用户取消',
type: 'error',
})
}
//
if (res.err_msg == "get_brand_wcpay_request:fail") {
this.$refs.uToast.show({
title: '支付失败',
type: 'error',
})
}
/**
* 其它
* 1请检查预支付会话标识prepay_id是否已失效
* 2请求的appid与下单接口的appid是否一致
* */
if (res.err_msg == "调用支付JSAPI缺少参数total_fee") {
this.$refs.uToast.show({
title: '缺少参数',
type: 'error',
})
}
});
}
}
}
</script>
<style lang="scss" scoped>
.container {
min-height: 100vh;
background-color: #f5f5f5;
padding: 20rpx;
padding-bottom: 120rpx;
}
.container {
min-height: 100vh;
background-color: #f5f5f5;
padding: 20rpx;
padding-bottom: 120rpx;
}
.info-card {
background-color: #fff;
border-radius: 12rpx;
padding: 30rpx;
margin-bottom: 20rpx;
}
.info-card {
background-color: #fff;
border-radius: 12rpx;
padding: 30rpx;
margin-bottom: 20rpx;
}
.info-item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
&:last-child {
margin-bottom: 0;
}
.label {
color: #666;
font-size: 28rpx;
}
.value {
color: #333;
font-size: 28rpx;
}
}
.info-item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
&:last-child {
margin-bottom: 0;
}
.label {
color: #666;
font-size: 28rpx;
}
.value {
color: #333;
font-size: 28rpx;
}
}
.card-title {
font-size: 30rpx;
font-weight: 500;
margin-bottom: 20rpx;
}
.card-title {
font-size: 30rpx;
font-weight: 500;
margin-bottom: 20rpx;
}
.product-item {
display: flex;
padding: 20rpx 0;
border-bottom: 1rpx solid #eee;
display: flex;
padding: 20rpx 0;
border-bottom: 1rpx solid #eee;
&:last-child {
border-bottom: none;
}
}
.product-image {
width: 160rpx;
height: 160rpx;
border-radius: 8rpx;
margin-right: 20rpx;
}
.product-image {
width: 160rpx;
height: 160rpx;
border-radius: 8rpx;
margin-right: 20rpx;
}
.product-info {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.product-name {
font-size: 28rpx;
color: #333;
}
.product-bottom {
display: flex;
justify-content: space-between;
align-items: center;
}
.product-quantity {
font-size: 26rpx;
color: #666;
}
.product-price {
font-size: 32rpx;
color: #333;
font-weight: 500;
}
.amount-info {
margin-top: 30rpx;
padding-top: 30rpx;
border-top: 1rpx solid #eee;
}
.amount-item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
font-size: 28rpx;
&:last-child {
margin-bottom: 0;
}
.price {
font-weight: 500;
&.paid {
color: #19be6b;
}
}
}
.payment-method {
display: flex;
align-items: center;
gap: 10rpx;
color: #333;
}
.source {
display: flex;
align-items: center;
gap: 10rpx;
}
.status {
color: #19be6b;
}
.btn-box {
display: flex;
justify-content: space-around;
align-items: center;
height: 120rpx;
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
z-index: 999;
button{
width: 680rpx;
height: 85rpx;
border-radius: 10rpx;
.product-info {
flex: 1;
display: flex;
justify-content: center;
flex-direction: column;
justify-content: space-between;
}
.product-name {
font-size: 28rpx;
color: #333;
}
.product-bottom {
display: flex;
justify-content: space-between;
align-items: center;
}
}
</style>
.product-quantity {
font-size: 26rpx;
color: #666;
}
.product-price {
font-size: 32rpx;
color: #333;
font-weight: 500;
}
.amount-info {
margin-top: 30rpx;
padding-top: 30rpx;
border-top: 1rpx solid #eee;
}
.amount-item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
font-size: 28rpx;
&:last-child {
margin-bottom: 0;
}
.price {
font-weight: 500;
&.paid {
color: #19be6b;
}
}
}
.payment-method {
display: flex;
align-items: center;
gap: 10rpx;
color: #333;
}
.source {
display: flex;
align-items: center;
gap: 10rpx;
}
.status {
color: #19be6b;
}
.btn-box {
display: flex;
justify-content: space-around;
align-items: center;
height: 120rpx;
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
z-index: 999;
button {
width: 680rpx;
height: 85rpx;
border-radius: 10rpx;
display: flex;
justify-content: center;
align-items: center;
}
}
</style>

1
utils/jweixin-1.6.0.js Normal file

File diff suppressed because one or more lines are too long