修改密码

master
xiaoning 1 month ago
parent b06e6fe0de
commit d62bba89c1

@ -1,5 +1,4 @@
## B站讲解视频
https://www.bilibili.com/video/BV16N4y1d7MM
默认账号admin 密码123
## node 推荐版本
16.13.1
@ -24,6 +23,7 @@ npm run dev
npm run build:stage
# 构建生产环境
配置路由router -- index.js -- new Router添加: base: '/yoga/manager',
npm run build:prod
```
## 项目地址
@ -31,13 +31,8 @@ npm run build:prod
|:---------:|:-------------------------------------------|:---------------------------------------------|
| service | https://gitee.com/zccbbg/RuoYi-Mall | https://github.com/zccbbg/ruoyi-mall |
| h5 uniapp | https://gitee.com/zccbbg/ruoyi-mall-uniapp | https://github.com/zccbbg/ruoyi-mall-uniapp |
| mall vue | https://gitee.com/zccbbg/ruoyi-mall-vue.git|
## 在线体验
### 管理后台演示地址
http://mall.ichengle.top
### 小程序和h5
<img src="doc/小程序演示.jpg" width="200px">
<img src="doc/h5演示.png" width="200px">
## CSDN若依技术专栏
- 常见问题https://blog.csdn.net/qq_27575627/category_12336113.html
@ -45,13 +40,7 @@ http://mall.ichengle.top
- 前端技术https://blog.csdn.net/qq_27575627/category_12331867.html
- 运维https://blog.csdn.net/qq_27575627/category_12332546.html
## 若依mall简介
若依是一套全部开源的快速开发平台毫无保留给个人及企业免费使用。我们在此基础上开发了ruoyi-mall。希望能给做商城的朋友减轻工作量。
* 前端采用Vue、Element UIant design 正在开发中)。
* 后端采用Spring Boot、Spring Security、Redis & Jwt。
* 权限认证使用Jwt支持多终端认证系统。
* 支持加载动态权限菜单,多方式轻松权限控制。
* 高效率开发,使用代码生成器可以一键生成前后端代码。
## 若依mall功能
1. 首页:
@ -61,15 +50,3 @@ http://mall.ichengle.top
5. SMS营销管理
6. CMS内容管理
## 关于我们
* 开发团队成立5年我们前端开发、后端架构有一颗热爱开源的心致力于打造企业级的通用产品设计UI体系让项目 或者更直观更高效、更简单未来将持续关注UI交互持续推出高质量的交互产品。
* 这五年我主要做isv对接淘宝、拼多多、抖音、美团等平台的订单处理应用日处理订单300w条因为要熟悉业务也开过淘宝和拼多多店铺运营了一个网易严选的品牌。我们的公众号会陆续更新一些我一边撸代码一边做客服的经历。也会更新一些我的读书笔记以及编程、创业、生活中踩坑的文章。另外还会开放一些米哈游、博世、企查查、同程、阿里、京东、拼多多等大厂、中厂或外企的内推岗位
## 加群/技术支持
| 公众号 |
|:------------------------------------------:|
| <img src="doc/datacall.jpg" width="200px"> |
扫公众号二维码,关注后回复:“支持”或者“加群”
admin
123

@ -0,0 +1,54 @@
import request from '@/utils/request'
// 查询快递管理列表
export function listPmsExpress(query, pageReq) {
return request({
url: '/pms/express/list',
method: 'post',
data: query,
params: pageReq
})
}
export function allExpress(query, pageReq) {
return request({
url: '/pms/express/all',
method: 'post',
data: query,
params: pageReq
})
}
// 查询快递管理详细
export function getPmsExpress(id) {
return request({
url: '/pms/express/' + id,
method: 'get'
})
}
// 新增快递管理
export function addPmsExpress(data) {
return request({
url: '/pms/express',
method: 'post',
data: data
})
}
// 修改快递管理
export function updatePmsExpress(data) {
return request({
url: '/pms/express',
method: 'put',
data: data
})
}
// 删除快递管理
export function delPmsExpress(id) {
return request({
url: '/pms/express/' + id,
method: 'delete'
})
}

@ -8,6 +8,13 @@ export function list(data) {
})
}
export function listAll() {
return request({
url: '/commissionPlans/listAll',
method: 'get'
})
}
export function saveOrEdit(data) {
return request({
url: '/commissionPlans/saveOrEdit',

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询省市区列表
export function areaSelect(query) {
return request({
url: '/common/area',
url: '/com/common/area',
method: 'get',
params: query
})

@ -60,4 +60,9 @@ export function exportTenant(query) {
})
}
export function nowTenantInfo() {
return request({
url: '/api/system/tenant/info/nowTenantInfo',
method: 'get'
})
}

@ -10,6 +10,7 @@
</template>
<script>
import pathToRegexp from 'path-to-regexp'
export default {
data() {
return {
@ -47,6 +48,12 @@ export default {
}
return name.trim() === 'Index'
},
pathCompile(path) {
// To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
const { params } = this.$route
var toPath = pathToRegexp.compile(path)
return toPath(params)
},
handleLink(item) {
const { redirect, path } = item
if (redirect) {

@ -1,16 +1,16 @@
<template>
<el-dialog title="扫描解锁" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
<p>使用微信扫描下方二维码观看完广告获取验证码</p>
<p class="red f13">如果第一次扫码未弹出广告请重新扫码进入</p>
<div class="flex-center">
<el-image class="qr-code"
:src="'data:image/png;base64,'+ miniImg"
fit="fill"
></el-image>
<el-input v-model="qrCode" class="left-input"/>
<el-button @click="asyncOk" class="right-btn" type="primary" :disabled="!qrCode">提交</el-button>
</div>
</el-dialog>
<!-- <el-dialog title="扫描解锁" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">-->
<!-- <p>使用微信扫描下方二维码观看完广告获取验证码</p>-->
<!-- <p class="red f13">如果第一次扫码未弹出广告请重新扫码进入</p>-->
<!-- <div class="flex-center">-->
<!-- <el-image class="qr-code"-->
<!-- :src="'data:image/png;base64,'+ miniImg"-->
<!-- fit="fill"-->
<!-- ></el-image>-->
<!-- <el-input v-model="qrCode" class="left-input"/>-->
<!-- <el-button @click="asyncOk" class="right-btn" type="primary" :disabled="!qrCode">提交</el-button>-->
<!-- </div>-->
<!-- </el-dialog>-->
</template>
<script>
import {getMiniWechatImg, judgeQrCode} from "@/api/ums/member";

@ -0,0 +1,97 @@
<template>
<el-select
v-model="plansId"
v-select-load-more="loadStaff"
filterable
:clearable="clearable"
:placeholder="placeholder"
default-first-option
size="small"
@change="handleSelect"
>
<el-option
v-for="item in staffList"
:key="item.id"
:label="item.planName"
:value="item.id"
>
<div>
<div class="inline-block item">
<!-- <span class="title">名称:</span>-->
<span class="option">{{ item.planName }}</span>
</div>
<!-- <div class="inline-block item">-->
<!-- <span class="title">联系电话:</span>-->
<!-- <span class="option">{{ item.phonenumber }}</span>-->
<!-- </div>-->
</div>
</el-option>
</el-select>
</template>
<script>
import { listAll } from '@/api/school/salary/commissionPlans'
export default {
props: {
clearable: {
type: Boolean,
default: false
},
teacher: {
type: String,
default: undefined
},
placeholder: {
type: String,
default: '选择方案'
},
value: {
type: Number,
default: undefined
}
},
data() {
return {
plansId: this.value,
staffList: [],
pageNum: 1,
hasMoreData: false
}
},
watch: {
value: {
handler(newValue, oldValue) {
this.plansId = newValue
},
immediate: true
}
},
created() {
this.loadStaff()
},
methods: {
loadStaff: function() {
listAll().then(response => {
if (response.code === 200) {
this.staffList = response.data
} else {
this.msgError(response.msg)
}
})
},
handleSelect: function(val) {
this.$emit('input', val)
this.$emit('change', val)
}
}
}
</script>
<style ref="stylesheet/scss" lang="scss" scoped>
.option{
padding-right: 15px;
color: #333;
font-weight: normal;
}
</style>

@ -51,7 +51,7 @@ export default {
default: undefined
},
deptId: {
type: String,
// type: Long,
default: undefined
},
value: {

@ -0,0 +1,113 @@
<template>
<el-select
v-model="userId"
v-select-load-more="loadStaff"
filterable
:clearable="clearable"
:placeholder="placeholder"
default-first-option
size="small"
@change="handleSelect"
>
<el-option
v-for="item in staffList"
:key="item.userId"
:label="item.nickName"
:value="item.userId"
>
<div>
<div class="inline-block item">
<span class="title">姓名:</span>
<span class="option">{{ item.nickName }}</span>
</div>
<div class="inline-block item">
<span class="title">联系电话:</span>
<span class="option">{{ item.phonenumber }}</span>
</div>
</div>
</el-option>
</el-select>
</template>
<script>
import { listAll } from '@/api/system/user'
export default {
props: {
clearable: {
type: Boolean,
default: false
},
teacher: {
type: String,
default: undefined
},
placeholder: {
type: String,
default: '选择员工'
},
value: {
type: String,
default: undefined
}
},
data() {
return {
userId: this.value,
staffList: [],
pageNum: 1,
hasMoreData: false
}
},
watch: {
value: {
handler(newValue, oldValue) {
this.userId = newValue
},
immediate: true
}
},
created() {
this.loadStaff()
},
methods: {
loadStaff: function() {
if (this.pageNum === 1) {
listAll({
pageNum: this.pageNum
}).then(response => {
if (response.code === 200) {
this.staffList = response.rows
console.log(this.staffList)
this.hasMoreData = response.rows.length > 0
this.pageNum = this.pageNum + 1
} else {
this.msgError(response.msg)
}
})
} else if (this.hasMoreData) {
listAll({
pageNum: this.pageNum
}).then(response => {
if (response.code === 200) {
this.staffList = this.staffList.concat(response.rows)
this.hasMoreData = response.rows.length > 0
this.pageNum = this.pageNum + 1
} else {
this.msgError(response.msg)
}
})
}
},
handleSelect: function(val) {
this.$emit('input', val)
this.$emit('change', val)
}
}
}
</script>
<style ref="stylesheet/scss" lang="scss" scoped>
.option{
padding-right: 15px;
color: #333;
font-weight: normal;
}
</style>

@ -3,5 +3,7 @@ export const dict_types = ["sys_user_sex",
"sys_oper_type", "sys_common_status", "wms_item_type", "wms_carrier_level", "wms_supplier_level", "wms_receipt_type", "wms_receipt_status",
"wms_shipment_type", "wms_shipment_status", "wms_movement_type", "wms_movement_status",'coupon_use_scope','coupon_exchange_type','activity_coupon_status',
"pms_publish_status", 'sku_sort_list',
'sys_show_status','oms_pay_type','oms_order_status','oms_aftersale_status','oms_aftersale_type',"pms_is_course"
'sys_show_status','oms_pay_type','oms_order_status','oms_aftersale_status','oms_aftersale_type',"pms_is_course",
'course_order_type', 'course_order_status','course_order_detail_tag'
,'charge_type','date_unit'
];

@ -5,6 +5,7 @@ import dialogDragWidth from './dialog/dragWidth'
import dialogDragHeight from './dialog/dragHeight'
import clipboard from './module/clipboard'
import selectLoadMore from "@/directive/select/selectLoadMore";
import tableLoadMore from './table/tableLoadMore'
const install = function(Vue) {
Vue.directive('hasRole', hasRole)
@ -14,6 +15,7 @@ const install = function(Vue) {
Vue.directive('dialogDragWidth', dialogDragWidth)
Vue.directive('dialogDragHeight', dialogDragHeight)
Vue.directive('selectLoadMore', selectLoadMore)
Vue.directive('tableLoadMore', tableLoadMore)
}
if (window.Vue) {

@ -0,0 +1,14 @@
export default {
inserted(el, binding, vnode) {
// 获取element-ui定义好的scroll盒子
const SELECTWRAP_DOM = el.querySelector('.el-table__body-wrapper')
SELECTWRAP_DOM.addEventListener('scroll', function() {
const sign = 100
const scrollDistance = this.scrollHeight - this.scrollTop - this.clientHeight
if (scrollDistance <= sign) {
binding.value()
}
})
}
}

@ -2,8 +2,8 @@
<div class="navbar">
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" />
<!-- <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>-->
<div class="right-menu">
<template v-if="device!=='mobile'">
@ -104,7 +104,8 @@ export default {
type: 'warning'
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
location.href = '/index';
// location.href = '/index';
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
})
}).catch(() => {});
}

@ -33,7 +33,7 @@ export default {
},
data() {
return {
title: 'ruoyi-mall商城管理系统',
title: 'yoga后台管理系统',
logo: logoImg
}
}

@ -1,6 +1,6 @@
<template>
<div id="tags-view-container" class="tags-view-container">
<scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll">
<scroll-pane ref="scrollPane" class="tags-view-wrapper">
<router-link
v-for="tag in visitedViews"
ref="tag"
@ -9,21 +9,18 @@
:to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }"
tag="span"
class="tags-view-item"
:style="activeStyle(tag)"
@click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''"
@click.middle.native="closeSelectedTag(tag)"
@contextmenu.prevent.native="openMenu(tag,$event)"
>
{{ tag.title }}
<span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
<div style="display: inline-block;">{{ tag.title }}</div>
<i v-if="!tag.meta.affix" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" />
</router-link>
</scroll-pane>
<ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu">
<li @click="refreshSelectedTag(selectedTag)"><i class="el-icon-refresh-right"></i> 刷新页面</li>
<li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)"><i class="el-icon-close"></i> </li>
<li @click="closeOthersTags"><i class="el-icon-circle-close"></i> 关闭其他</li>
<li v-if="!isFirstView()" @click="closeLeftTags"><i class="el-icon-back"></i> </li>
<li v-if="!isLastView()" @click="closeRightTags"><i class="el-icon-right"></i> </li>
<li @click="closeAllTags(selectedTag)"><i class="el-icon-circle-close"></i> 全部关闭</li>
<li @click="refreshSelectedTag(selectedTag)"></li>
<li v-if="!(selectedTag.meta&&selectedTag.meta.affix)" @click="closeSelectedTag(selectedTag)"></li>
<li @click="closeOthersTags"></li>
<li @click="closeAllTags(selectedTag)"></li>
</ul>
</div>
</template>
@ -48,10 +45,7 @@ export default {
return this.$store.state.tagsView.visitedViews
},
routes() {
return this.$store.state.permission.routes
},
theme() {
return this.$store.state.settings.theme;
return this.$store.state.user.menuList
}
},
watch: {
@ -75,30 +69,6 @@ export default {
isActive(route) {
return route.path === this.$route.path
},
activeStyle(tag) {
if (!this.isActive(tag)) return {};
return {
"background-color": this.theme,
"border-color": this.theme
};
},
isAffix(tag) {
return tag.meta && tag.meta.affix
},
isFirstView() {
try {
return this.selectedTag.fullPath === this.visitedViews[1].fullPath || this.selectedTag.fullPath === '/index'
} catch (err) {
return false
}
},
isLastView() {
try {
return this.selectedTag.fullPath === this.visitedViews[this.visitedViews.length - 1].fullPath
} catch (err) {
return false
}
},
filterAffixTags(routes, basePath = '/') {
let tags = []
routes.forEach(route => {
@ -152,38 +122,31 @@ export default {
})
},
refreshSelectedTag(view) {
this.$tab.refreshPage(view);
this.$store.dispatch('tagsView/delCachedView', view).then(() => {
const { fullPath } = view
this.$nextTick(() => {
this.$router.replace({
path: '/redirect' + fullPath
})
})
})
},
closeSelectedTag(view) {
this.$tab.closePage(view).then(({ visitedViews }) => {
this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => {
if (this.isActive(view)) {
this.toLastView(visitedViews, view)
}
})
},
closeRightTags() {
this.$tab.closeRightPage(this.selectedTag).then(visitedViews => {
if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) {
this.toLastView(visitedViews)
}
})
},
closeLeftTags() {
this.$tab.closeLeftPage(this.selectedTag).then(visitedViews => {
if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) {
this.toLastView(visitedViews)
}
})
},
closeOthersTags() {
this.$router.push(this.selectedTag).catch(()=>{});
this.$tab.closeOtherPage(this.selectedTag).then(() => {
this.$router.push(this.selectedTag)
this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => {
this.moveToCurrentTag()
})
},
closeAllTags(view) {
this.$tab.closeAllPage().then(({ visitedViews }) => {
if (this.affixTags.some(tag => tag.path === this.$route.path)) {
this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => {
if (this.affixTags.some(tag => tag.path === view.path)) {
return
}
this.toLastView(visitedViews, view)
@ -192,7 +155,7 @@ export default {
toLastView(visitedViews, view) {
const latestView = visitedViews.slice(-1)[0]
if (latestView) {
this.$router.push(latestView.fullPath)
this.$router.push(latestView)
} else {
// now the default is to redirect to the home page if there is no tags-view,
// you can adjust it according to your needs.
@ -223,35 +186,31 @@ export default {
},
closeMenu() {
this.visible = false
},
handleScroll() {
this.closeMenu()
}
}
}
</script>
<style lang="scss" scoped>
@import '~@/styles/variables.scss';
.tags-view-container {
height: 34px;
padding: 6px 0px;
height: 44px;
width: 100%;
background: #fff;
border-bottom: 1px solid #d8dce5;
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04);
background: $bgColorGrey;
.tags-view-wrapper {
.tags-view-item {
display: inline-block;
position: relative;
cursor: pointer;
height: 26px;
line-height: 26px;
border: 1px solid #d8dce5;
color: #495060;
padding: 5px 30px 4px 16px;
height: 32px;
line-height: 23px;
color: #808695;
background: #fff;
padding: 0 8px;
font-size: 12px;
border-radius: 3px;
font-size: 14px;
margin-left: 5px;
margin-top: 4px;
&:first-of-type {
margin-left: 15px;
}
@ -259,18 +218,28 @@ export default {
margin-right: 15px;
}
&.active {
background-color: #42b983;
color: #fff;
border-color: #42b983;
&::before {
content: '';
background: #fff;
color: #409EFF;
.el-icon-close{
color: #808695;
}
}
.el-icon-close {
position: absolute;
right: 6px;
top: 1px;
font-size: 24px;
vertical-align: 2px;
border-radius: 50%;
text-align: center;
transition: all .3s cubic-bezier(.645, .045, .355, 1);
transform-origin: 100% 50%;
&:before {
transform: scale(.6);
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
position: relative;
margin-right: 2px;
vertical-align: -3px;
}
&:hover {
color: #333;
}
}
}
@ -283,7 +252,7 @@ export default {
list-style-type: none;
padding: 5px 0;
border-radius: 4px;
font-size: 12px;
font-size: 14px;
font-weight: 400;
color: #333;
box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);
@ -298,29 +267,3 @@ export default {
}
}
</style>
<style lang="scss">
//reset element css of el-icon-close
.tags-view-wrapper {
.tags-view-item {
.el-icon-close {
width: 16px;
height: 16px;
vertical-align: 2px;
border-radius: 50%;
text-align: center;
transition: all .3s cubic-bezier(.645, .045, .355, 1);
transform-origin: 100% 50%;
&:before {
transform: scale(.6);
display: inline-block;
vertical-align: -3px;
}
&:hover {
background-color: #b4bccc;
color: #fff;
}
}
}
}
</style>

@ -5,7 +5,7 @@
<div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container">
<div :class="{'fixed-header':fixedHeader}">
<navbar />
<!-- <tags-view v-if="needTagsView" />-->
<tags-view />
</div>
<app-main />
<right-panel>

@ -7,6 +7,14 @@ import './assets/styles/element-variables.scss'
import '@/assets/styles/index.scss' // global css
import '@/assets/styles/ruoyi.scss' // ruoyi css
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import locale from 'element-ui/lib/locale/lang/zh-CN' // lang i18n
import 'normalize.css/normalize.css' // A modern alternative to CSS resets
import '@/styles/index.scss' // global css
import App from './App'
import store from './store'
import router from './router'
@ -124,6 +132,8 @@ DictData.install()
Vue.use(Element, {
size: Cookies.get('size') || 'medium' // set element-ui default size
})
// set ElementUI lang to EN
Vue.use(ElementUI, { locale })
Vue.config.productionTip = false

@ -176,34 +176,54 @@ export const dynamicRoutes = [
}
]
},
// {
// path: '/order',
// component: Layout,
// hidden: true,
// permissions: ['oms:order:query'],
// children: [
// {
// path: 'detail',
// component: () => import('@/views/oms/order/detail'),
// name: 'orderDetail',
// meta: { title: '订单详情' }
// }
// ]
// },
// {
// path: '/aftersale',
// component: Layout,
// hidden: true,
// permissions: ['oms:aftersale:query'],
// children: [
// {
// path: 'detail',
// component: () => import('@/views/oms/aftersale/detail'),
// name: 'aftersaleOrderDetail',
// meta: { title: '售后订单详情' }
// }
// ]
// }
{
path: '/order',
component: Layout,
hidden: true,
permissions: ['oms:order:query'],
children: [
{
path: 'detail',
component: () => import('@/views/oms/order/detail'),
name: 'orderDetail',
meta: { title: '订单详情' }
}
]
},
{
path: '/aftersale',
component: Layout,
hidden: true,
permissions: ['oms:aftersale:query'],
children: [
{
path: 'detail',
component: () => import('@/views/oms/aftersale/detail'),
name: 'aftersaleOrderDetail',
meta: { title: '售后订单详情' }
}
]
},
{
path: '/courseOrder/signUp',
component: Layout,
hidden: true,
permissions: ['sc:order:handleSignUp'],
children: [
{
path: 'signUp',
component: () => import('@/views/courseOrder/signUp'),
name: 'signUp',
meta: { title: '新报' }
},
{
path: 'orderPrint',
component: () => import('@/views/courseOrder/orderPrint'),
name: 'orderPrint',
meta: { title: '新报' }
},
]
}
]
// 防止连续点击多次路由报错
@ -214,6 +234,7 @@ Router.prototype.push = function push(location) {
export default new Router({
mode: 'history', // 去掉url中的#
// base: '/yoga/manager/',
scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes
})

@ -1,5 +1,7 @@
import { login, logout, getInfo } from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { listMenu } from "@/api/system/menu";
import Vue from 'vue'
const user = {
state: {
@ -9,6 +11,7 @@ const user = {
roles: [],
permissions: [],
userId: null,
menuList: [],
},
mutations: {
@ -29,7 +32,10 @@ const user = {
},
SET_PERMISSIONS: (state, permissions) => {
state.permissions = permissions
}
},
SET_MENU: (state, menuList) => {
Vue.set(state, 'menuList', menuList)
},
},
actions: {
@ -66,10 +72,14 @@ const user = {
commit('SET_NAME', user.userName)
commit('SET_USERID', user.userId)
commit('SET_AVATAR', avatar)
resolve(res)
}).catch(error => {
reject(error)
})
listMenu().then(response=>{
commit('SET_MENU', response.data)
})
})
},

@ -1,218 +0,0 @@
// 用于检测用户是否 star 了仓库,如果没有 star将弹窗提示用户 star 。
import { Message, MessageBox } from 'element-ui'
// 使用axios代替$.ajax
import axios from 'axios'
// 应用参数
const client_id = '9addfce3712d04898b5a3dbb223db38b8d6495d2e66d07e3c0af71a708ee3b54'
const client_secret = '1f73096ce60406eba8fb297a16245eadf2777540abdf531266b406b2479e25fe'
// 检查成功后,多少天不再检查
const allowDisparity = 1000 * 60 * 60 * 24 * 7
/**
* 判断当前是否已 star
* @param owner 仓库所属空间地址(企业组织或个人的地址path)
* @param repo 仓库路径(path)
* @param userId
* @param redirectUrl
* @param productName 开源项目名
* @param productLink 开源链接
*/
export function isStarRepo(owner, repo, userId, redirectUrl,productName,productLink) {
const judge = process.env.VUE_APP_JUDGE_STAR
if (!judge || judge == 0) {
return true;
}
const key = userId + '_' + owner + '_' + repo
console.log(key)
// 判断是否近期已经判断过了
try {
if (typeof window !== 'undefined') {
const isStarRepo = localStorage.getItem(key)
if (isStarRepo) {
// 记录 star 的时间,和当前时间的差距
const disparity = new Date().getTime() - parseInt(isStarRepo)
// 差距小于一月,不再检测,大于一月,再检测一下
if (disparity < allowDisparity) {
console.log('checked ...')
return true;
}
}
}
} catch (e) {
console.error(e)
}
return getCode(owner, repo, key, redirectUrl,productName,productLink)
}
// 去请求授权
function getCode(owner, repo, key, redirectUrl,productName,productLink) {
// 检查url中是否有code
const code = getParam('code')
if (code) {
// 有 code进一步去请求 access_token
getAccessToken(code, redirectUrl, owner, repo, key,productName,productLink)
} else {
// 不存在code弹窗提示询问
confirmStar(redirectUrl,productName,productLink)
return false;
}
}
// 弹窗提示点 star
function confirmStar(redirectUrl,productName,productLink) {
// 弹窗提示文字
const tipStr = `
<div>
<p><b>同学来支持一下 ${productName} 为项目点个 star </b></p>
<div>仅需两步即可完成<br>
<div>1打开 ${productName} <a href=${productLink} target="_blank" style="color: red">${productName}</a> star </div>
<div>2点击下方 [ 同意授权检测 ] 按钮同意 ${productName} 获取 API 权限进行检测</div>
</div>
<p><b>本页面将在 star 后正常开放展示</b></p>
</div>
`
// 弹窗提示
MessageBox.alert(tipStr, '温馨提示', {
// if you want to disable its autofocus
// autofocus: false,
confirmButtonText: '同意授权检测',
showClose: false,
dangerouslyUseHTMLString: true,
callback: (action) => {
if (action === 'confirm') {
// 用户点了确认,去 gitee 官方请求授权获取
goAuth(redirectUrl)
}
}
})
}
function toStar(redirectUrl,productName,productLink,accessToken,owner,repo,key,code) {
// 弹窗提示文字
const tipStr = `
<div>
<p><b>同学来支持一下 ${productName} 为项目点个 star </b></p>
<div>点击去Star按钮进入${productName} 开源项目主页在右上角点个 star </div>
<p><b>本页面将在 star 后正常开放展示</b></p>
</div>
`
MessageBox.confirm(tipStr, '温馨提示', {
// if you want to disable its autofocus
// autofocus: false,
closeOnClickModal: false,
confirmButtonText: '去Star',
cancelButtonText: '我已Star',
showClose: false,
dangerouslyUseHTMLString: true,
callback: (action) => {
if (action === 'confirm') {
// 用户点了确认,去 gitee 官方请求授权获取
window.open(productLink)
toStar(redirectUrl,productName,productLink,accessToken,owner,repo,key,code)
}
if (action === 'cancel') {
//检测
judgeStar(accessToken,owner,repo,key,productName,productLink,redirectUrl,code)
}
}
})
}
// 跳转到 gitee 授权界面
function goAuth(redirectUrl) {
location.href = 'https://gitee.com/oauth/authorize' +
'?client_id=' + client_id +
'&redirect_uri=' + redirectUrl +
'&response_type=code' +
'&scope=user_info'
}
// 获取 access_token
function getAccessToken(code, redirectUrl, owner, repo, key,productName,productLink) {
// 根据 code 获取 access_token
axios.post('https://gitee.com/oauth/token', {
grant_type: 'authorization_code',
code: code,
client_id: client_id,
redirect_uri: redirectUrl,
client_secret: client_secret
})
.then(res => {
// 拿到 access_token
const accessToken = res.data.access_token
judgeStar(accessToken,owner, repo, key,productName,productLink,redirectUrl,code)
})
.catch(e => {
console.log('请求错误 ', e)
// 如果请求地址有错,可能是服务器宕机了,暂停一天检测
if (e.response && (e.response.status === 0 || e.response.status === 502)) {
// 一天内不再检查
const ygTime = allowDisparity - (1000 * 60 * 60 * 24)
if (typeof window !== 'undefined') {
localStorage.setItem(key, new Date().getTime() - ygTime)
}
// 刷新 url去掉 code 参数
location.href = location.href.replace('?code=' + code, '')
}
// 无效授权,可能是 code 无效
const errorMsg = (e.response && e.response.data.error) || JSON.stringify(e)
if (errorMsg === 'invalid_grant') {
console.log('无效code', code)
let url = location.href.replace('?code=' + code, '')
url = url.replace('&code=' + code, '')
location.href = url
}
})
}
function judgeStar(accessToken,owner, repo, key,productName,productLink,redirectUrl,code){
// 根据 access_token 判断是否 star 了仓库
axios.get(`https://gitee.com/api/v5/user/starred/${owner}/${repo}`, {
params: { access_token: accessToken }
})
.then(res => {
// success 回调即代表已经 stargitee API 请求体不返回任何数据
console.log('-> stared ...')
// 记录本次检查时间
if (typeof window !== 'undefined') {
localStorage.setItem(key, new Date().getTime())
}
Message.success('感谢你的支持 ❤️ ❤️ ❤️ ,我们将努力变得更加完善!')
setTimeout(()=>{
location.href = location.href.replace('?code=' + code, '')
},1000)
})
.catch(e => {
// console.log('ff请求错误 ', e);
// 如下返回,代表没有 star
if (e.response && e.response.status === 404) {
console.log('not star ...')
toStar(redirectUrl,productName,productLink,accessToken,owner,repo,key,code);
}
})
}
// 获取 url 携带的参数
function getParam(name) {
const urls = window.location.href.split('?')
if (urls.length < 2) {
return null
}
let url = urls[1]
let obj = {} // 声明参数对象
let arr = url.split('&') // 以&符号分割为数组
for (let i = 0; i < arr.length; i++) {
let arrNew = arr[i].split('=') // 以"="分割为数组
obj[arrNew[0]] = arrNew[1]
}
return obj[name]
}

@ -86,7 +86,8 @@ service.interceptors.response.use(res => {
).then(() => {
isRelogin.show = false;
store.dispatch('LogOut').then(() => {
location.href = '/index';
// location.href = '/index';
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
})
}).catch(() => {
isRelogin.show = false;

@ -0,0 +1,309 @@
<template>
<div class="app-container">
<el-form ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
<el-form-item label="订单类型" prop="orderType">
<el-select v-model="queryParams.orderType" placeholder="请选择订单类型" clearable size="small">
<el-option
v-for="dict in dict.type.course_order_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="校区:" prop="deptId">
<dept-select v-model="queryParams.deptId" />
</el-form-item>
<el-form-item label="课程:" prop="courseId">
<course-select v-model="queryParams.courseId" :dept-id="queryParams.deptId" clearable mounted-load-all />
</el-form-item>
<el-form-item label="订单状态" prop="orderStatus">
<el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable size="small">
<el-option
v-for="dict in dict.type.course_order_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="经办日期" prop="handleDateArray">
<el-date-picker
v-model="handleDateArray"
clearable
size="small"
style="width: 230px"
type="daterange"
value-format="yyyy-MM-dd"
placeholder="选择经办日期"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-dropdown>
<el-button type="primary" size="mini">
业务办理 <i class="el-icon-arrow-down el-icon--right" />
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-has-permi="['sc:order:handleSignUp']" icon="el-icon-plus" @click.native="signUp">报名</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-col>
<el-col :span="1.5">
<el-button
v-hasPermi="['sc:order:batchInvalid']"
v-loading="loadingChange"
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="batchInvalidOrder"
>批量作废订单
</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column prop="orderId" width="170" align="center" label="订单编号" fixed="left">
<template slot-scope="scope">
<span style="text-decoration: underline;cursor: pointer;" @click="handleOrderDetail(scope.row)">{{ scope.row.orderId }}</span>
</template>
</el-table-column>
<el-table-column prop="orderType" align="center" label="订单类型" :formatter="orderTypeFormat" fixed="left" />
<el-table-column prop="orderStatus" align="center" label="订单状态" fixed="left">
<template slot-scope="scope">
<el-tag v-if="scope.row.orderStatus === '1'" size="medium" type="info"></el-tag>
<el-tag v-if="scope.row.orderStatus === '2'" size="medium"></el-tag>
<el-tag v-if="scope.row.orderStatus === '3'" size="medium" type="danger"></el-tag>
</template>
</el-table-column>
<el-table-column prop="studentName" align="center" label="学生" />
<el-table-column prop="phone" width="110" align="center" label="联系电话" />
<el-table-column prop="orderDetail" width="200" align="center" label="销售内容">
<template slot-scope="scope">
<el-tooltip effect="dark" placement="left">
<template slot="content">
<div v-for="item in scope.row.orderDetail.split(';')" :key="item">
<span>{{ item }}</span>
</div>
</template>
<span style="display:inline-block;width: 180px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;"> {{ scope.row.orderDetail }} </span>
</el-tooltip>
</template>
</el-table-column>
<el-table-column prop="actualTotalFee" align="center" label="应付(元)" />
<el-table-column prop="receiptFee" align="center" label="实收(元)" />
<el-table-column prop="balanceFee" width="120" align="center" label="余额支付(元)" />
<el-table-column prop="saleStaffName" align="center" label="销售员" />
<el-table-column prop="orderTag" align="center" label="订单标签" show-overflow-tooltip />
<el-table-column prop="handleDeptName" align="center" label="经办校区" show-overflow-tooltip />
<el-table-column prop="handleDate" width="100" align="center" label="经办日期" />
<el-table-column prop="createUserName" width="100" align="center" label="经办人" />
<el-table-column prop="memo" align="center" label="办理备注" show-overflow-tooltip />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<template slot-scope="scope">
<el-dropdown trigger="click">
<span style="cursor: pointer;color: #409EFF;outline: none;">
操作<i class="el-icon-arrow-down el-icon--right" style="font-size: 12px;" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item icon="el-icon-document" @click.native="handleOrderDetail(scope.row)">详情</el-dropdown-item>
<el-dropdown-item icon="el-icon-delete" @click.native="invalidOrder(scope.row)">作废</el-dropdown-item>
<!-- <el-dropdown-item v-has-permi="['sc:order:print']" icon="el-icon-printer" @click.native="handlePrintOrder(scope.row)">打印</el-dropdown-item>-->
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<order-detail ref="orderDetail" />
</div>
</template>
<script>
import { listOrder, invalidById } from '@/api/school/sc/order'
import orderDetail from '@/components/sc/order/orderDetail'
import deptSelect from '@/components/system/dept/deptSelect'
import courseSelect from '@/components/sc/course/courseSelect'
import moment from 'moment'
export default {
name: 'courseOrder',
dicts: ['course_order_type', 'course_order_status'],
components: {
orderDetail,
deptSelect,
courseSelect
},
data() {
return {
//
loading: true,
loadingChange: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
total: 0,
//
dataList: [],
//
open: false,
//
studentIdOptions: [],
// 1
orderTypeOptions: [],
//
orderStatusOptions: [],
handleDateArray: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
studentId: undefined,
orderType: undefined,
handleDate: undefined
},
//
form: {},
//
rules: {
}
}
},
created() {
const handleDate = this.$route.query.handleDate
if (handleDate !== undefined && handleDate === 'thisMonth') {
//
const startDate = moment().month(moment().month()).startOf('month').format('YYYY-MM-DD')
const endDate = moment().month(moment().month()).endOf('month').format('YYYY-MM-DD')
this.handleDateArray = [startDate, endDate]
}
this.getList()
this.getDictListByDictType('order_type').then(response => {
this.orderTypeOptions = response.data
})
this.getDictListByDictType('order_status').then(response => {
this.orderStatusOptions = response.data
})
},
methods: {
getList() {
this.loading = true
listOrder(this.queryParams).then(response => {
this.dataList = response.data.rows
this.total = response.data.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
}
this.resetForm('form')
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
if (this.handleDateArray !== undefined && this.handleDateArray !== null && this.handleDateArray.length === 2) {
this.queryParams.handleDate = this.handleDateArray.toString()
} else {
this.queryParams.handleDate = undefined
}
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm('queryForm')
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.orderId)
this.single = selection.length !== 1
this.multiple = !selection.length
},
//
signUp() {
this.$router.push({
path: '/courseOrder/signUp/signUp'
})
},
orderTypeFormat(row, column) {
return this.selectDictLabel(this.orderTypeOptions, row.orderType)
},
//
invalidOrder(row) {
const that = this
this.$confirm('确定作废本订单?', '提示').then(() => {
that.loading = true
invalidById(row.orderId).then(response => {
that.loading = false
if (response.respCode === '0000') {
that.msgSuccess('作废成功')
that.getList()
} else {
that.msgError(response.respMsg)
}
}).catch(() => {
that.loading = false
})
})
},
//
batchInvalidOrder(row) {
const that = this
const id = this.ids
this.$confirm('确定作废已选择订单?', '提示').then(() => {
that.loading = true
invalidById(id).then(response => {
that.loading = false
if (response.respCode === '0000') {
that.msgSuccess('作废成功')
that.getList()
} else {
that.msgError(response.respMsg)
}
}).catch(() => {
that.loading = false
that.getList()
})
})
},
//
handleOrderDetail(row) {
this.$refs.orderDetail.loadOrderDetail(row.orderId)
},
//
handlePrintOrder(row) {
this.$router.push({
path: '/courseOrder/signUp/orderPrint/' + row.orderId
})
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
</style>

@ -0,0 +1,280 @@
<template>
<div ref="print" class="print-container">
<div class="print-title">
<span>{{ tenantInfo.tenantName }}</span>
<span>业务凭证</span>
</div>
<div class="header-info">
<div class="left-info">
<div class="header-item">学员姓名: {{ orderInfo.studentName }}</div>
<div class="header-item">经办日期: {{ orderInfo.handleDate }}</div>
<div v-if="orderInfo.orderType === '1'" class="header-item">: </div>
<div v-else class="header-item">类型: {{ orderInfo.orderType }}</div>
</div>
<div class="right-info">订单: {{ orderInfo.orderId }}</div>
</div>
<div class="print-content">
<div v-for="item in orderDetailArray" :key="item.orderDetailId">
<div class="header">
<div class="top-title w150">课程信息</div>
<div class="top-title w150">班级</div>
<div class="top-title w150">收费方式</div>
<div class="top-title w50">数量</div>
<div class="top-title w80">原价</div>
<div class="top-title w150">折扣/减免</div>
<div class="top-title w80">实际价格</div>
<div class="top-title flex1">备注</div>
</div>
<div class="content">
<div class="value w150">{{ item.courseName }}({{ item.deptName }})</div>
<div class="value w150">{{ item.claName||'' }}</div>
<div class="value w150">{{ item.chargeName }}</div>
<div class="value w50">{{ item.buyCount }}</div>
<div class="value w80">¥{{ item.originalFee }}</div>
<div class="value w150">
<span v-if="item.directDiscount && item.directDiscount !== 10">{{ item.directDiscount }} </span>
<span v-if="item.directReduceFee && item.directReduceFee !== 0"> :¥{{ item.directReduceFee }}</span>
</div>
<div class="value w80">¥{{ item.actualFee }}</div>
<div class="value flex1">{{ item.outsideMemo }}</div>
</div>
</div>
<div class="content">
<div class="value flex1">备注: {{ orderInfo.memo||'' }}</div>
</div>
<div class="content">
<div class="value flex1">
<span class="span-title">原价总计:</span>
<span>¥{{ orderInfo.originalTotalFee }}</span>
</div>
<div class="value flex1">
<span class="span-title">实际价格:</span>
<span>¥{{ orderInfo.actualTotalFee }}</span>
</div>
<div class="value flex1">
<span class="span-title">实收:</span>
<span>¥{{ orderInfo.receiptFee }}</span>
</div>
<div class="value flex1">
<span class="span-title">余额支付:</span>
<span>¥{{ orderInfo.balanceFee }}</span>
</div>
</div>
<div class="content">
<div class="value flex1">
<span class="span-title">收款方式:</span>
<span v-for="(item, index) in orderAccountArray" :key="index">
<span style="margin-right: 15px;">{{ item.accountName }}: {{ item.fee }}</span>
</span>
</div>
</div>
<div class="content">
<div class="value flex1">
<div>地址:</div>
<div>{{ tenantInfo.contactAddress }}</div>
</div>
<div class="value flex1">
<div>联系电话:</div>
<div>{{ tenantInfo.contactPhone }}</div>
</div>
<div class="value flex1">
<div>经办人:</div>
<div>{{ orderInfo.handleStaffName }}</div>
</div>
<div class="value flex1">
<div>打印时间:</div>
<div>{{ now }}</div>
</div>
<div class="value flex1">
<div>经办签名:</div>
<div>&nbsp;</div>
</div>
<div class="value flex1">
<div>客户签名:</div>
<div>&nbsp;</div>
</div>
</div>
</div>
<div class="bottom-memo">开课后不予办理退费请妥善保管您的收据,丢失不予补办</div>
<div class="no-print bottom-btn-container">
<el-button v-if="canPrint" type="primary" @click="handlePrint"> </el-button>
<el-button v-else type="info">订单已作废,无法打印</el-button>
</div>
</div>
</template>
<script>
import { getOrder } from '@/api/school/sc/order'
import { nowTenantInfo } from '@/api/system/tenant'
import moment from 'moment'
export default {
data() {
return {
orderId: undefined,
loading: false,
orderInfo: {},
orderDetailArray: [],
orderAccountArray: [],
tenantInfo: {}
}
},
computed: {
now() {
return moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
},
//
canPrint() {
//
return this.orderInfo.orderStatus && this.orderInfo.orderStatus !== '3'
}
},
watch: {
orderId: {
handler(newValue) {
if (newValue) {
this.loadOrderDetail(newValue)
this.loadTenantInfo()
}
},
immediate: true
}
},
created(param) {
const orderId = this.$route.params && this.$route.params.orderId
if (orderId) {
this.orderId = orderId
}
},
methods: {
loadOrderDetail(orderId) {
this.loading = true
getOrder(orderId).then(response => {
this.loading = false
this.orderInfo = response.data.orderInfo
this.orderDetailArray = response.data.orderDetail
this.orderAccountArray = response.data.orderAccountList
}).catch(() => {
this.loading = false
})
},
loadTenantInfo() {
nowTenantInfo().then(response => {
this.tenantInfo = response.data
}).catch(() => {
this.loading = false
})
},
handlePrint() {
this.$print(this.$refs.print)
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.main-container.print {
.print-container {
zoom: 0.7;
}
}
.print-container {
width: 900px;
margin: auto;
.print-title {
margin-top: 25px;
font-size: 16px;
color: #000;
font-weight: 800;
text-align: center;
}
.header-info {
padding: 10px 0;
font-size: 12px;
display: flex;
justify-content: space-between;
align-items: center;
.left-info {
display: flex;
justify-content: flex-start;
align-items: center;
.header-item {
margin-right: 15px;
}
}
}
.print-content {
border-top: 1px solid #737373;
border-left: 1px solid #737373;
font-size: 14px;
text-align: left;
.flex1 {
flex: 1;
}
.w150 {
width: 150px;
}
.w180 {
width: 180px;
}
.w50 {
width: 50px;
}
.w100 {
width: 100px;
}
.w80 {
width: 80px;
}
.header {
display: flex;
justify-content: flex-start;
align-items: inherit;
.top-title {
border-right: 1px solid #737373;
border-bottom: 1px solid #737373;
font-weight: 600;
color: #000;
padding: 5px;
}
}
.content {
display: flex;
justify-content: flex-start;
align-items: inherit;
.value {
border-right: 1px solid #737373;
border-bottom: 1px solid #737373;
font-weight: normal;
color: #000;
padding: 5px;
.span-title {
font-weight: 600;
color: #000;
}
}
}
}
.bottom-memo {
margin-top: 5px;
font-size: 12px;
}
/*底部按钮*/
.bottom-btn-container {
padding: 15px 20px;
text-align: center;
}
}
</style>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,246 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="状态" prop="status">
<DictRadio v-model="queryParams.status" @change="handleQuery" size="small"
:radioData="dict.type.sys_normal_disable" :showAll="'all'"/>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input
v-model="queryParams.expressName"
placeholder="名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="pmsExpressList" @selection-change="handleSelectionChange" border>
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="品牌logo" prop="logo">
<template slot-scope="{ row }">
<el-image v-if="row.logo" :src="row.logo" :preview-src-list="[row.logo]" class="small-img circle-img"/>
</template>
</el-table-column>
<el-table-column label="名称" prop="name"/>
<el-table-column label="排序" prop="sort"/>
<el-table-column label="状态" prop="showStatus">
<template slot-scope="{ row }">
<dict-tag :value="row.showStatus" prop-name="sys_normal_disable"/>
</template>
</el-table-column>
<el-table-column label="操作" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<InBody v-show="total>0">
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</InBody>
<!-- 添加或修改品牌管理对话框 -->
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="108px" inline class="dialog-form-one">
<el-form-item label="状态">
<DictRadio v-model="form.showStatus" size="small"
:radioData="dict.type.sys_normal_disable"/>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="名称" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="logo" prop="logo">
<oss-image-upload v-model="form.logo" :limit="1" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {listPmsExpress,allExpress,getPmsExpress,addPmsExpress,updatePmsExpress,delPmsExpress} from "@/api/pms/express";
export default {
name: "PmsExpress",
dicts: ['sys_normal_disable'],
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
pmsExpressList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
nameLike: null,
sort: null,
showStatus: null,
},
//
form: {},
//
rules: {
},
};
},
created() {
this.getList();
},
methods: {
/** 查询品牌管理列表 */
getList() {
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listPmsExpress(query, pageReq).then(response => {
const { content, totalElements } = response
this.pmsExpressList = content;
this.total = totalElements;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
expressName: null,
expressCode: null,
status: 0,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加快递品牌";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getPmsExpress(id).then(response => {
this.form = response;
this.open = true;
this.title = "修改快递品牌";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updatePmsExpress(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addPmsExpress(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除快递编号为"' + ids + '"的数据项?').then(function() {
return delPmsExpress(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
}
};
</script>

@ -6,10 +6,23 @@
<span>基本信息</span>
</div>
<el-row>
<el-col :span="8">
<el-form-item label="是否为课程">
<DictRadio v-model="form.isCourse" size="small"
:radioData="dict.type.pms_is_course" @change="findCourse"/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="课程名称" prop="courseName">
<el-input v-model="form.courseName" placeholder="" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="课程ID" prop="courseId">
<el-input v-model="form.courseId" placeholder="" disabled></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
@ -153,7 +166,7 @@
</div>
</el-form>
<CourseSelect ref="courseSelect"/>
<CourseSelect ref="courseSelect" @onComplete="handleConfirm" />
</div>
</template>
@ -178,6 +191,8 @@ export default {
publishStatus: 0,
sort: 1000,
isCourse:'0',
courseName:null,
courseId:null
},
skuAttr:[],
albumPics:null,
@ -200,9 +215,16 @@ export default {
}
},
methods: {
handleConfirm(value){
this.form.courseName=value.courseName
this.form.courseId =value.courseId
},
findCourse(){
if (this.form.isCourse=='1'){
this.$refs.courseSelect.chooseCourseObj.open = true
}else {
this.form.courseName =null
this.form.courseId =null
}
},
refreshSku(){
@ -318,7 +340,7 @@ export default {
});
},
cancel() {
this.$tab.closeOpenPage({ path: '/pms/product' })
this.$tab.closeOpenPage({ path: '/mall/product' })
},
changeName(s, idx, val) {
s.options[idx].name = val;

@ -1,5 +1,5 @@
<template>
<el-dialog :title="chooseCourseObj.title" :visible.sync="chooseCourseObj.open" :width="chooseCourseObj.width" append-to-body>
<el-dialog :title="chooseCourseObj.title" :visible.sync="chooseCourseObj.open" :width="chooseCourseObj.width" @open="init()" append-to-body>
<el-form ref="auditForm" inline :model="chooseCourseObj.queryParams" label-width="80px">
<el-form-item label="课程名称" prop="courseName">
<el-input
@ -9,24 +9,32 @@
clearable
/>
</el-form-item>
<el-form-item label="课程分类" prop="courseTypeId">
<product-category-select v-model="chooseCourseObj.queryParams.courseTypeId"></product-category-select>
<el-form-item label="课程类型:" prop="courseTypeId">
<el-select
v-model="chooseCourseObj.queryParams.courseTypeId"
placeholder="请选择课程类别"
clearable
size="small"
filterable
default-first-option
:loading="loadingSelect"
>
<el-option
v-for="item in courseTypeOptions"
:key="item.courseTypeId"
:label="item.courseType"
:value="item.courseTypeId"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="getCourseList"></el-button>
</el-form-item>
</el-form>
<el-table class="mt20" :data="chooseCourseObj.list" ref="table" v-loading="chooseCourseObj.loading" max-height="500" border
row-key="id" @selection-change="handleSelectionChange">
row-key="courseId" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"/>
<el-table-column label="课程名称" prop="courseName">
<template v-slot="{row}">
<div class="flex-center">
<el-image v-if="row.pic" :src="row.pic" :preview-src-list="[row.pic]" class="small-img circle-img"/>
<span class="ml5">{{ row.name }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="课程名称" prop="courseName"/>
<el-table-column label="课程类型" prop="courseTypeName"/>
<el-table-column label="课程状态" prop="sale"/>
<el-table-column label="授课模式" prop="teachingMode"/>
@ -40,7 +48,7 @@
@pagination="getCourseList"
/>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"></el-button>
<el-button type="primary" @click="submitForm"></el-button>
<el-button @click="chooseCourseObj.open=false"> </el-button>
</div>
</el-dialog>
@ -48,14 +56,18 @@
<script>
import ProductCategorySelect from "@/views/components/ProductCategorySelect.vue";
import {listCourseForProduct} from "@/api/pms/product";
import {select as courseTypeSelect} from "@/api/school/sc/course/courseType";
export default {
components: {ProductCategorySelect},
name: "CourseSelect",
data() {
return {
loadingSelect: false,
//
courseTypeOptions: [],
selectCourseIds: [],
selectProducts: [],
selectCourse: [],
chooseCourseObj: {
loading: false,
open: false,
@ -74,14 +86,25 @@ export default {
}
},
methods: {
courseTypeList() {
courseTypeSelect({}).then(response => {
this.courseTypeOptions = response.data
})
},
submitForm() {
this.$emit('onComplete', this.selectProducts)
if (this.selectCourse.length>1){
this.$message.warning('请选择一条记录进行提交');
}
if (this.selectCourse.length==1){
this.$emit('onComplete', this.selectCourse[0])
}
this.chooseCourseObj.open = false
},
async init(chooseProductId) {
this.chooseCourseObj.queryParams.excludeProductIds = chooseProductId;
async init(chooseCourseId) {
this.chooseCourseObj.queryParams.pageNum = 1;
this.chooseCourseObj.queryParams.courseId=chooseCourseId
await this.getCourseList();
await this.courseTypeList();
this.chooseCourseObj.open = true
this.$nextTick(()=>{
this.$refs.table.clearSelection()
@ -90,7 +113,7 @@ export default {
judge() {
this.$nextTick(()=>{
this.chooseCourseObj.list.forEach(ele => {
if (this.selectProducts.some(item => item.id === ele.id)) {
if (this.selectCourse.some(item => item.id === ele.id)) {
this.$refs.table.toggleRowSelection(ele, true)
} else {
this.$refs.table.toggleRowSelection(ele, false)
@ -99,20 +122,16 @@ export default {
})
},
handleSelectionChange(selection) {
this.selectProducts = selection
this.selectCourse = selection
},
async getCourseList() {
this.chooseCourseObj.loading = true;
const query = {...this.chooseCourseObj.queryParams, pageNum: undefined, pageSize: undefined};
if (query.categoryId && Array.isArray(query.categoryId)) {
query.categoryId = query.categoryId.pop()
}
const {pageNum, pageSize} = this.chooseCourseObj.queryParams;
const pageReq = {page: pageNum - 1, size: pageSize};
await listCourseForProduct(query, pageReq).then(response => {
const {content, totalElements} = response
this.chooseCourseObj.list = [...content];
this.chooseCourseObj.total = totalElements;
this.chooseCourseObj.list = response.rows;
this.chooseCourseObj.total = response.total;
this.chooseCourseObj.loading = false;
});
},

@ -205,10 +205,13 @@ export default {
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listPmsProduct(query, pageReq).then(response => {
const { content, totalElements } = response
this.pmsProductList = content;
this.total = totalElements;
console.log(content)
this.loading = false;
});
},

@ -1,10 +1,10 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="PRODUCT_ID" prop="productId">
<el-form-item label="商品编码" prop="outProductId">
<el-input
v-model="queryParams.productId"
placeholder="请输入PRODUCT_ID"
v-model="queryParams.outProductId"
placeholder="请输入商品编码"
clearable
size="small"
@keyup.enter.native="handleQuery"
@ -28,15 +28,7 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="展示图片" prop="pic">
<el-input
v-model="queryParams.pic"
placeholder="请输入展示图片"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
@ -54,7 +46,7 @@
v-hasPermi="['pms:sku:add']"
>新增</el-button>
</el-col>
</el-col>
</el-row>
<el-table v-loading="loading" :data="pmsSkuList" @selection-change="handleSelectionChange">
@ -83,7 +75,7 @@
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"

@ -0,0 +1,275 @@
<template>
<div class="order_detail_wrapper">
<el-main v-loading="loading">
<el-card>
<el-descriptions title="订单信息" :column="2" border label-class-name="my-label" contentClassName="my-content">
<template slot="extra">
<el-button size="small" @click="$router.back()"></el-button>
</template>
<el-descriptions-item label="订单号">{{ orderDetail.orderSn }}</el-descriptions-item>
<el-descriptions-item label="用户昵称">{{ orderDetail.nickName }}</el-descriptions-item>
<el-descriptions-item label="用户手机号">{{ orderDetail.phone }}</el-descriptions-item>
<el-descriptions-item label="下单时间">{{ parseTime(orderDetail.createTime, '')
}}</el-descriptions-item>
<el-descriptions-item label="支付方式">{{ getPayType(orderDetail) }}</el-descriptions-item>
<el-descriptions-item label="支付时间">{{ parseTime(orderDetail.payTime, '')
}}</el-descriptions-item>
<el-descriptions-item label="订单状态">{{ getOrderStatus(orderDetail) }}</el-descriptions-item>
</el-descriptions>
</el-card>
<el-card>
<div slot="header" style="font-size: 16px;font-weight: bold;">售后信息</div>
<el-table :data="refundInfoList">
<el-table-column label="售后单号" prop="id" width="150"></el-table-column>
<el-table-column label="售后类型" prop="applyRefundType" width="80">
<template slot-scope="{row}">
<span>{{ getAftersaleType(row) }}</span>
</template>
</el-table-column>
<el-table-column label="申请售后时间" prop="applyRefundTime" width="180">
<template slot-scope="{row}">
<span>
{{ parseTime(row.applyRefundTime, '') }}
</span>
</template>
</el-table-column>
<el-table-column label="退款金额" prop="refundAmount">
<template v-slot="scope">
<span>{{ scope.row.refundAmount }}</span>
</template>
</el-table-column>
<el-table-column label="申请原因" prop="reason"></el-table-column>
<el-table-column label="凭证" prop="proofPics">
<template slot-scope="{row}">
<el-image class="small-img circle-img" :src="row.proofPics"
:preview-src-list="[row.proofPics]" />
</template>
</el-table-column>
<el-table-column label="申请状态" prop="refundStatus" width="110">
<template slot-scope="{row}">
<span>{{ getAftersaleStatus(row) }}</span>
</template>
</el-table-column>
<el-table-column label="平台拒绝理由" prop="remark"></el-table-column>
<el-table-column label="退货快递号" prop="refundWaybillCode"></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit"
@click="handleWatch(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-card>
<el-descriptions title="收货信息" :column="2" border label-class-name="my-label" contentClassName="my-content">
<el-descriptions-item label="收货人姓名">{{ addressInfo.name }}</el-descriptions-item>
<el-descriptions-item label="收货人手机号">{{ addressInfo.userPhone }}</el-descriptions-item>
<el-descriptions-item label="收货区域">{{ addressInfo.area }}</el-descriptions-item>
<el-descriptions-item label="详细地址">{{ getHiddenDetailAddress(addressInfo.address) }}</el-descriptions-item>
</el-descriptions>
</el-card>
<el-card>
<div slot="header" style="font-size: 16px;font-weight: bold;">商品信息</div>
<el-table :data="products">
<el-table-column label="商品图片" prop="pic">
<template slot-scope="{row}"><el-image class="small-img circle-img" :src="row.pic"
:preview-src-list="[row.pic]" /></template>
</el-table-column>
<el-table-column label="商品ID" prop="productId"></el-table-column>
<el-table-column label="商品名称" prop="productName"></el-table-column>
<el-table-column label="商品规格" align="center" prop="spData" width="180">
<template slot-scope="scope">
<div v-for="(item,key) in JSON.parse(scope.row.spData)">{{ key }}{{ item }}</div>
</template>
</el-table-column>
<el-table-column label="价格" prop="salePrice"></el-table-column>
<el-table-column label="购买数量" prop="buyNum"></el-table-column>
</el-table>
</el-card>
<el-card>
<el-descriptions title="物流信息" :column="3" border label-class-name="my-label" contentClassName="my-content">
<el-descriptions-item label="发货时间">{{ parseTime(orderDetail.deliveryTime, '')
}}</el-descriptions-item>
<el-descriptions-item label="快递单号">{{ orderDetail.expressNo }}</el-descriptions-item>
<el-descriptions-item label="物流公司">{{ orderDetail.expressNo ? '顺丰速运' : '' }}</el-descriptions-item>
<!-- <el-descriptions-item label="物流公司">{{ orderDetail.expressName }}</el-descriptions-item>-->
</el-descriptions>
</el-card>
<!-- 售后详细信息 -->
<el-dialog title="售后详细信息" :visible.sync="open" width="1100px" append-to-body>
<el-descriptions :column="2" border label-class-name="my-label" contentClassName="my-content">
<el-descriptions-item label="售后单号">{{ refundInfoDetail.id }}</el-descriptions-item>
<el-descriptions-item label="售后类型">{{ getAftersaleType(refundInfoDetail) }}</el-descriptions-item>
<el-descriptions-item label="申请售后时间">{{ parseTime(refundInfoDetail.applyRefundTime,'') }}</el-descriptions-item>
<el-descriptions-item label="退款金额">{{ refundInfoDetail.refundAmount }}</el-descriptions-item>
<el-descriptions-item label="申请原因">{{ refundInfoDetail.reason }}</el-descriptions-item>
<el-descriptions-item label="具体描述">{{ refundInfoDetail.description }}</el-descriptions-item>
<el-descriptions-item label="凭证">
<el-image class="small-img circle-img" :src="refundInfoDetail.proofPics"
:preview-src-list="[refundInfoDetail.proofPics]" />
</el-descriptions-item>
<el-descriptions-item label="申请状态">{{ getAftersaleStatus(refundInfoDetail) }}</el-descriptions-item>
<el-descriptions-item label="平台拒绝理由">{{ refundInfoDetail.remark }}</el-descriptions-item>
<el-descriptions-item label="退货快递号">{{ refundInfoDetail.refundWaybillCode }}</el-descriptions-item>
<el-descriptions-item label="物流公司">{{ getExpressName(refundInfoDetail.refundWpCode) }}</el-descriptions-item>
<el-descriptions-item label="物流进度">
<el-popover placement="left" width="300" trigger="hover" popper-class="popperOptions">
<el-timeline-item v-for="(activity, index) in aliLogisticsInfoList" :key="index"
:timestamp="activity.time">
{{ activity.context }}
</el-timeline-item>
<span slot="reference">{{ refundInfoDetail.logistics }}</span>
</el-popover>
</el-descriptions-item>
</el-descriptions>
</el-dialog>
</el-main>
</div>
</template>
<script>
import { getOmsAftersale } from "@/api/oms/aftersale";
import {getConfigKey2} from "@/api/system/config";
export default {
name: "OmsAftersaleDetail",
dicts: ['oms_order_status', 'oms_pay_type', "oms_aftersale_type", "oms_aftersale_status"],
data() {
return {
products: [],
orderDetail: {},
addressInfo: {},
// aliLogisticsInfoList: [],
refundInfoList: [],
loading: false,
experssList: [],
open: false,
refundInfoDetail: {},
aliLogisticsInfoList: []
}
},
created() {
this.getExpressData()
const { id } = this.$route.query
this.queryDetail(id).then((expressNo) => {
// this.getLogistic(expressNo)
})
},
computed: {
orderStatusMap() {
let obj = this.dict.type.oms_order_status.map(item => [item.value, item.label])
let map = new Map(obj)
return map;
},
payTypeMap() {
let obj = this.dict.type.oms_pay_type.map(item => [item.value, item.label])
let map = new Map(obj)
return map
},
aftersaleTypeMap() {
let obj = this.dict.type.oms_aftersale_type.map(item => [item.value, item.label])
let map = new Map(obj)
return map;
},
aftersaleStatusMap() {
let obj = this.dict.type.oms_aftersale_status.map(item => [item.value, item.label])
let map = new Map(obj)
return map;
},
expressMap() {
let obj = this.experssList.map(item => [item.expressCode, item.expressName])
return new Map(obj)
}
},
methods: {
getExpressData() {
getConfigKey2('express-set-key').then(res => {
if (res.data && res.data.configValue) {
this.experssList = JSON.parse(res.data.configValue)
} else {
this.experssList = []
}
})
},
queryDetail(id) {
this.loading = true
return new Promise(resolve =>
getOmsAftersale(id).then(res => {
const { productList, addressInfo, refundInfoList } = res;
this.orderDetail = res;
this.products = productList
this.refundInfoList = refundInfoList
this.addressInfo = addressInfo || {}
this.loading = false
})
)
},
getOrderStatus(row) {
return this.orderStatusMap.get(row.status + '')
},
getPayType(row) {
return this.payTypeMap.get(row.payType + '')
},
getAftersaleType(row) {
return this.aftersaleTypeMap.get(row.applyRefundType + '')
},
getAftersaleStatus(row) {
return this.aftersaleStatusMap.get(row.refundStatus + '')
},
getExpressName(name) {
return this.expressMap.get(name)
},
handleWatch(row) {
this.refundInfoDetail = row
if(this.refundInfoDetail.allLogistics){
this.aliLogisticsInfoList = JSON.parse(refundInfoDetail.allLogistics)
}
this.open = true
},
cancel() {
this.open = false;
this.refundInfoDetail = {};
}
}
}
</script>
<style lang="stylus">
.order_detail_wrapper
> .el-card + .el-card
margin-top 1rem
.el-form-item
margin-bottom 0
.el-form-item__content, .el-form-item__label
line-height 2
.my-label
width 100px
.my-content
width 400px
.popperOptions[x-placement^=left] .popper__arrow::after{
border-left-color: #565D6B;
}
.popperOptions[x-placement^=right] .popper__arrow::after{
border-right-color: #565D6B;
}
.popperOptions[x-placement^=bottom] .popper__arrow::after{
border-bottom-color: #565D6B;
}
.popperOptions[x-placement^=top] .popper__arrow::after{
border-top-color: #565D6B;
}
.popperOptions{
background-color: #565D6B;
color: #FFFFFF;
border: #565D6B;
}
.el-timeline-item__content {
color: #fff;
}
.el-timeline-item__timestamp {
color: #fff;
}
</style>

@ -0,0 +1,492 @@
<template>
<div class="app-container">
<div v-show="show">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="申请状态" prop="status">
<DictRadio v-model="queryParams.status" :radioData="dict.type.oms_aftersale_status" size="small" :show-all="'all'" @change="handleQuery"></DictRadio>
</el-form-item>
<el-form-item label="售后类型" prop="type">
<DictRadio v-model="queryParams.type" :radioData="dict.type.oms_aftersale_type" size="small" :show-all="'all'" @change="handleQuery"></DictRadio>
</el-form-item>
<el-form-item label="订单号" prop="orderSn">
<el-input v-model.trim="queryParams.orderSn" placeholder="请输入订单号" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="售后单号" prop="id">
<el-input v-model.trim="queryParams.id" placeholder="请输入售后单号" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="会员手机号" prop="userPhone">
<el-input v-model.trim="queryParams.userPhone" placeholder="请输入会员手机号" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="创建时间" prop="Time">
<el-date-picker v-model="queryParams.Time" type="datetimerange" :picker-options="pickerOptions"
range-separator="至" size="small" format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"
align="right"
@change="handleChange">
</el-date-picker>
</el-form-item>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="omsAftersaleList" @selection-change="handleSelectionChange" border>
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="售后单号" prop="id" width="160"/>
<el-table-column label="申请状态" prop="aftersaleStatus" width="80">
<template v-slot="scope">
<el-tag effect="plain" size="medium" :type="getAftersaleStatusTag(scope.row)">{{
getAftersaleStatusText(scope.row)
}}
</el-tag>
</template>
</el-table-column>
<el-table-column label="用户信息" prop="nickName" width="120">
<template v-slot="scope">
<div>{{ scope.row.nickName }}</div>
<div>{{ scope.row.phone }}</div>
<div>{{ scope.row.mark }}</div>
</template>
</el-table-column>
<el-table-column label="退款金额" prop="applyReturnAmount" width="120"/>
<el-table-column label="售后类型" prop="applyRefundType" width="120">
<template v-slot="scope">
<el-tag effect="plain" size="medium" :type="getAftersaleTypeTag(scope.row)">{{
getAftersaleTypeText(scope.row)
}}
</el-tag>
</template>
</el-table-column>
<el-table-column label="申请时间" prop="applyRefundTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.applyRefundTime, '') }}</span>
</template>
</el-table-column>
<el-table-column label="处理时间" prop="handleTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.handleTime, '') }}</span>
</template>
</el-table-column>
<el-table-column label="原因" prop="reason" width="220"/>
<el-table-column label="处理备注" prop="note" width="150"/>
<el-table-column label="处理人员" prop="handleMan" width="200"/>
<el-table-column label="订单编号/操作" class-name="small-padding fixed-width" width="250" fixed="right">
<template slot-scope="scope">
<div>
{{ scope.row.orderSn }}
<el-link @click="copy(scope.row.orderSn)" :underline="false"><i
class="el-icon-document-copy el-icon--right"></i></el-link>
</div>
<el-button size="mini" type="text" @click="handleDetail(scope.row.orderId)"
v-hasPermi="['oms:aftersale:query']">详情
</el-button>
<el-button size="mini" type="text" @click="showLog(scope.row.orderId)"
v-hasPermi="['oms:aftersale:log']">日志
</el-button>
<el-button size="mini" type="text" @click="approve(scope.row, 1)"
v-if="scope.row.aftersaleStatus == 0" v-hasPermi="['manager:oms:aftersale:update']">同意
</el-button>
<el-button size="mini" type="text" @click="handleOpen(scope.row, 2)" class="red"
v-if="scope.row.aftersaleStatus == 0" v-hasPermi="['manager:oms:aftersale:update']">拒绝
</el-button>
<el-button size="mini" type="text" @click="confirmReceive(scope.row, 3)"
v-if="scope.row.aftersaleStatus == 1 && scope.row.applyRefundType == 2"
v-hasPermi="['manager:oms:aftersale:update']">确认收货
</el-button>
</template>
</el-table-column>
</el-table>
<InBody v-show="total>0">
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</InBody>
</div>
<!-- <SeeAdsComponent ref="seeAdsComponentRef" v-if="!show" @confirmOk="confirmOk"/>-->
<!-- 拒绝对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="updateForm" :model="updateOrderForm" label-width="100px" :rules="rules">
<el-form-item label="拒绝理由" prop="remark">
<el-input v-model="updateOrderForm.remark" placeholder="请输入拒绝理由" controls-position="right" :min="0" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitUpdate('updateForm')"></el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<!-- 日志 -->
<el-dialog :title="logObj.title" :visible.sync="logObj.open" width="500px" append-to-body>
<el-timeline>
<el-timeline-item v-for="item in logObj.logList" placement="top" :timestamp="parseTime(item.createTime, '')">
<el-card>
<h4>{{ getLogEvent(item.orderStatus) }}</h4>
<br>
<h4>操作人{{ item.operateMan }}</h4>
<br v-if="item.note">
<h4 v-if="item.note">{{ item.note }}</h4>
</el-card>
</el-timeline-item>
</el-timeline>
</el-dialog>
</div>
</template>
<script>
import {
addOmsAftersale,
dealWithAftersale,
delOmsAftersale,
exportOmsAftersale,
getOmsAftersale,
listOmsAftersale,
updateOmsAftersale,
viewLog
} from "@/api/oms/aftersale";
import dateUtil from '@/utils/DateUtil';
import SeeAdsComponent from "@/components/SeeAdsComponent.vue";
export default {
name: "OmsAftersale",
components: {SeeAdsComponent},
dicts: ["oms_aftersale_type", "oms_aftersale_status"],
data() {
return {
show: true,
pickerOptions: {
shortcuts: dateUtil.getTimeShort2()
},
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
omsAftersaleList: [],
//
title: "拒绝售后",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: null,
type: null,
status: null,
userPhone: null,
Time: [],
startTime: null,
endTime: null
},
//
form: {},
showMoreCondition: false,
updateOrderForm: {
orderId: null,
optType: null,
remark: null,
id: null,
},
rules: {
remark: [
{required: true, message: '请输入拒绝理由', trigger: 'blur'}
]
},
logObj: {
title: '日志',
logList: null,
open: false,
loading: false
}
};
},
created() {
const { status } = this.$route.query
if (status){
this.queryParams.status = status
}
this.getList();
},
methods: {
confirmOk(success) {
if (success) {
this.show = true
this.getList();
}
},
copy(data) {
let url = data;
let oInput = document.createElement('input');
oInput.value = url;
document.body.appendChild(oInput);
oInput.select(); // ;
console.log(oInput.value)
document.execCommand("Copy"); //
this.$modal.msgSuccess('复制成功');
oInput.remove()
},
/** 查询订单售后列表 */
getList() {
if (this.queryParams.Time) {
this.queryParams.startTime = this.queryParams.Time[0]
this.queryParams.endTime = this.queryParams.Time[1]
}
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listOmsAftersale(query, pageReq).then(response => {
const { content, totalElements } = response
this.omsAftersaleList = content;
this.total = totalElements;
this.loading = false;
});
},
//
reset() {
this.form = {
id: null,
memberId: null,
orderId: null,
returnAmount: null,
type: null,
status: 0,
handleTime: null,
quantity: null,
reason: null,
description: null,
proofPics: null,
handleNote: null,
handleMan: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加订单售后";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getOmsAftersale(id).then(response => {
this.form = response;
this.open = true;
this.title = "修改订单售后";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateOmsAftersale(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addOmsAftersale(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除订单售后编号为"' + ids + '"的数据项?').then(function() {
return delOmsAftersale(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有订单售后数据项?').then(() => {
this.exportLoading = true;
return exportOmsAftersale(queryParams);
}).then(response => {
this.$download.download(response);
this.exportLoading = false;
}).catch(() => {});
},
/** 售后详情 */
handleDetail(orderId){
const id = orderId
this.$router.push({ path: '/aftersale/detail', query: { id } })
},
/** 同意售后 */
approve(order, type) {
this.$confirm(`您确定要同意售后单号为【${order.id}】的售后申请吗?`, '温馨提示', {type: 'warning'}).then(
() => {
this.updateOrderForm.orderId = order.orderId
this.updateOrderForm.optType = type
dealWithAftersale(this.updateOrderForm).then((response) => {
this.cancel()
this.$message.success('操作成功')
this.getList()
})
}
)
},
/** 拒绝 */
handleOpen(order, type) {
this.updateOrderForm.orderId = order.orderId
this.updateOrderForm.optType = type
this.updateOrderForm.id = order.id
this.open = true
},
confirmReceive(orderId, type) {
this.$confirm(`您确认收到售后单号为【${order.id}】的货物了吗?`, '温馨提示', {type: 'warning'}).then(
() => {
this.updateOrderForm.orderId = orderId
this.updateOrderForm.optType = type
dealWithAftersale(this.updateOrderForm).then((response) => {
this.cancel()
this.$message.success('操作成功')
this.getList()
})
})
},
getAftersaleStatusTag(row) {
switch (row.aftersaleStatus) {
case 0:
return 'info'
case 1:
return 'primary'
case 2:
return 'success'
case 3:
return 'danger'
case 4:
return 'warning'
}
},
getAftersaleStatusText(row) {
switch (row.aftersaleStatus) {
case 0:
return '待处理'
case 1:
return '退货中'
case 2:
return '已完成'
case 3:
return '已拒绝'
case 4:
return '已关闭'
}
},
getAftersaleTypeTag(row) {
switch (row.applyRefundType) {
case 1:
return 'primary'
case 2:
return 'warning'
}
},
getAftersaleTypeText(row) {
switch (row.applyRefundType) {
case 1:
return '退款'
case 2:
return '退货退款'
}
},
cancel() {
this.open = false;
this.updateOrderForm = {
orderId: null,
optType: null,
remark: null,
plansId: null,
}
},
submitUpdate(formName){
this.$refs[formName].validate(valid => {
if (valid) {
this.$confirm(`您确定要拒绝售后单号为【${this.updateOrderForm.id}】的售后申请了吗?`, '温馨提示', {type: 'warning'}).then(
() => {
dealWithAftersale(this.updateOrderForm).then((response) => {
this.cancel()
this.$message.success('操作成功')
this.getList()
})
})
}
})
},
handleChange(value) {
if (!value) {
this.queryParams.startTime = null;
this.queryParams.endTime = null;
}
},
showLog(orderId){
this.logObj.loading = true
viewLog(orderId).then((response) => {
this.logObj.logList = response
this.logObj.open = true
this.logObj.loading = false
})
},
getLogEvent(status){
switch (status){
case 11:
return '用户申请售后';
case 12:
return '平台同意售后申请';
case 13:
return '售后完成';
case 14:
return '平台拒绝售后';
}
},
}
};
</script>

@ -0,0 +1,291 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="MEMBER_ID" prop="memberId">
<el-input
v-model="queryParams.memberId"
placeholder="请输入MEMBER_ID"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="订单id" prop="orderId">
<el-input
v-model="queryParams.orderId"
placeholder="请输入订单id"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="子订单id" prop="orderItemId">
<el-input
v-model="queryParams.orderItemId"
placeholder="请输入子订单id"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="退款金额" prop="returnAmount">
<el-input
v-model="queryParams.returnAmount"
placeholder="请输入退款金额"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="退货数量" prop="quantity">
<el-input
v-model="queryParams.quantity"
placeholder="请输入退货数量"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['oms:aftersaleItem:add']"
>新增</el-button>
</el-col>
</el-col>
</el-row>
<el-table v-loading="loading" :data="omsAftersaleItemList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="MEMBER_ID" align="center" prop="memberId" />
<el-table-column label="订单id" align="center" prop="orderId" />
<el-table-column label="子订单id" align="center" prop="orderItemId" />
<el-table-column label="退款金额" align="center" prop="returnAmount" />
<el-table-column label="退货数量" align="center" prop="quantity" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['oms:aftersaleItem:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['oms:aftersaleItem:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改订单售后对话框 -->
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="108px" inline class="dialog-form-two">
<el-form-item label="MEMBER_ID" prop="memberId">
<el-input v-model="form.memberId" placeholder="请输入MEMBER_ID" />
</el-form-item>
<el-form-item label="订单id" prop="orderId">
<el-input v-model="form.orderId" placeholder="请输入订单id" />
</el-form-item>
<el-form-item label="子订单id" prop="orderItemId">
<el-input v-model="form.orderItemId" placeholder="请输入子订单id" />
</el-form-item>
<el-form-item label="退款金额" prop="returnAmount">
<el-input v-model="form.returnAmount" placeholder="请输入退款金额" />
</el-form-item>
<el-form-item label="退货数量" prop="quantity">
<el-input v-model="form.quantity" placeholder="请输入退货数量" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listOmsAftersaleItem, getOmsAftersaleItem, delOmsAftersaleItem, addOmsAftersaleItem, updateOmsAftersaleItem, exportOmsAftersaleItem } from "@/api/oms/aftersaleItem";
export default {
name: "OmsAftersaleItem",
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
omsAftersaleItemList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
memberId: null,
orderId: null,
orderItemId: null,
returnAmount: null,
quantity: null,
},
//
form: {},
//
rules: {
memberId: [
{ required: true, message: "MEMBER_ID不能为空", trigger: "blur" }
],
},
};
},
created() {
this.getList();
},
methods: {
/** 查询订单售后列表 */
getList() {
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listOmsAftersaleItem(query, pageReq).then(response => {
const { content, totalElements } = response
this.omsAftersaleItemList = content;
this.total = totalElements;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
memberId: null,
orderId: null,
orderItemId: null,
returnAmount: null,
quantity: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加订单售后";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getOmsAftersaleItem(id).then(response => {
this.form = response;
this.open = true;
this.title = "修改订单售后";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateOmsAftersaleItem(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addOmsAftersaleItem(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除订单售后编号为"' + ids + '"的数据项?').then(function() {
return delOmsAftersaleItem(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有订单售后数据项?').then(() => {
this.exportLoading = true;
return exportOmsAftersaleItem(queryParams);
}).then(response => {
this.$download.download(response);
this.exportLoading = false;
}).catch(() => {});
}
}
};
</script>

@ -0,0 +1,206 @@
<template>
<div class="order_detail_wrapper">
<el-main v-loading="loading">
<el-card class="mt10">
<div slot="header" class="clearfix">
<span style="font-size: 16px;font-weight: bold">订单进程</span>
<el-button style="float: right;" size="small" @click="$router.back()"></el-button>
</div>
<el-steps :active="active" align-center>
<el-step title="买家下单" :description="parseTime(orderDetail.createTime, '')"></el-step>
<el-step title="买家付款" :description="parseTime(orderDetail.payTime, '')"></el-step>
<el-step title="商家发货" :description="parseTime(orderDetail.deliveryTime, '')"></el-step>
<el-step title="买家收货" :description="parseTime(orderDetail.receiveTime, '')"></el-step>
</el-steps>
</el-card>
<el-card class="mt10">
<el-descriptions title="订单信息" :column="2" border label-class-name="my-label" contentClassName="my-content">
<!-- <template slot="extra">-->
<!-- <el-button size="small" @click="$router.back()"></el-button>-->
<!-- </template>-->
<el-descriptions-item label="订单编号">{{ orderDetail.orderSn }}</el-descriptions-item>
<el-descriptions-item label="用户名称">{{ orderDetail.userName }}</el-descriptions-item>
<el-descriptions-item label="用户手机号">{{ orderDetail.userPhone }}</el-descriptions-item>
<el-descriptions-item label="下单时间">{{ parseTime(orderDetail.createTime, '') }}</el-descriptions-item>
<el-descriptions-item label="支付方式">{{ getPayType(orderDetail) }}</el-descriptions-item>
<el-descriptions-item label="支付时间">{{ parseTime(orderDetail.payTime, '')
}}</el-descriptions-item>
<el-descriptions-item label="订单状态">{{ getOrderStatus(orderDetail) }}</el-descriptions-item>
</el-descriptions>
</el-card>
<el-card class="mt10">
<el-descriptions title="收货信息" :column="2" border label-class-name="my-label" contentClassName="my-content">
<el-descriptions-item label="收货人姓名">{{ getHiddenName(addressInfo.name) }}</el-descriptions-item>
<el-descriptions-item label="收货人手机号">{{ addressInfo.userPhone }}</el-descriptions-item>
<el-descriptions-item label="收货区域">{{ addressInfo.area }}</el-descriptions-item>
<el-descriptions-item label="详细地址">{{ getHiddenDetailAddress(addressInfo.address) }}</el-descriptions-item>
</el-descriptions>
</el-card>
<el-card class="mt10">
<div slot="header" style="font-size: 16px;font-weight: bold;">商品信息</div>
<el-table :data="products">
<el-table-column label="商品图片" prop="pic">
<template slot-scope="{row}"><el-image class="small-img circle-img" :src="row.pic"
:preview-src-list="[row.pic]" /></template>
</el-table-column>
<el-table-column label="商品ID" prop="productId"></el-table-column>
<el-table-column label="商品名称" prop="productName"></el-table-column>
<el-table-column label="商品规格" align="center" prop="spData" width="180">
<template slot-scope="scope">
<div v-for="(item,key) in JSON.parse(scope.row.spData)">{{ key }}{{ item }}</div>
</template>
</el-table-column>
<el-table-column label="购买数量" prop="buyNum"></el-table-column>
<el-table-column label="实付金额" prop="payAmount">
<template slot-scope="scope">
<span>{{ orderDetail.payAmount }}</span>
</template>
</el-table-column>
</el-table>
</el-card>
<el-card class="mt10">
<el-descriptions title="物流信息" :column="3" border label-class-name="my-label" contentClassName="my-content">
<el-descriptions-item label="发货时间">{{ parseTime(orderDetail.deliveryTime, '')
}}</el-descriptions-item>
<el-descriptions-item label="快递单号">{{ orderDetail.expressNo }}</el-descriptions-item>
<el-descriptions-item label="物流公司">{{ orderDetail.expressName }}</el-descriptions-item>
<!-- <el-descriptions-item label="物流进度">-->
<!-- <el-popover placement="top" width="300" trigger="hover" popper-class="popperOptions">-->
<!-- <el-timeline-item v-for="(activity, index) in aliLogisticsInfoList" :key="index"-->
<!-- :timestamp="activity.time">-->
<!-- {{ activity.context }}-->
<!-- </el-timeline-item>-->
<!-- <span slot="reference">{{ orderDetail.logistics }}</span>-->
<!-- </el-popover>-->
<!-- </el-descriptions-item>-->
</el-descriptions>
</el-card>
</el-main>
</div>
</template>
<script>
import { getOmsOrder } from "@/api/oms/order";
import { getConfigKey } from "@/api/system/config";
const key = "express-set-key"
export default {
name: "OrderDetail",
dicts: ['oms_order_status', 'oms_pay_type'],
data() {
return {
products: [],
orderDetail: {},
addressInfo: {},
aliLogisticsInfoList: [],
loading: false,
experssList: [],
active: 1
}
},
created() {
// this.getExpressData()
const { id } = this.$route.query
this.queryDetail(id).then((expressNo) => {
})
},
computed: {
orderStatusMap() {
let obj = this.dict.type.oms_order_status.map(item => [item.value, item.label])
let map = new Map(obj)
return map;
},
payTypeMap() {
let obj = this.dict.type.oms_pay_type.map(item => [item.value, item.label])
let map = new Map(obj)
return map
},
// expressMap() {
// let obj = this.experssList.map(item => [item.expressCode, item.expressName])
// let map = new Map(obj)
// return map
// }
},
methods: {
queryDetail(id) {
this.loading = true
return new Promise(resolve =>
getOmsOrder(id).then(res => {
const { productInfo, addressInfo } = res;
this.orderDetail = res;
// if (allLogistics) {
// this.aliLogisticsInfoList = JSON.parse(allLogistics)
// }
this.products = productInfo
this.addressInfo = addressInfo
if (this.orderDetail.orderStatus <= 3){
this.active = this.orderDetail.orderStatus + 1
}else {
this.active = 1
}
this.loading = false
})
)
},
getOrderStatus(row) {
return this.orderStatusMap.get(row.orderStatus + '')
},
getPayType(row) {
return this.payTypeMap.get(row.payType + '')
},
// getExpressName(row) {
// return this.expressMap.get(row.expressName + '')
// },
// getExpressData() {
// getConfigKey(key).then(res => {
// if (res.msg) {
// this.experssList = JSON.parse(res.msg)
// } else {
// // this.list = [...defaultList]
// }
// })
// }
}
}
</script>
<style lang="stylus">
.order_detail_wrapper
> .el-card + .el-card
margin-top 1rem
.el-form-item
margin-bottom 0
.el-form-item__content, .el-form-item__label
line-height 2
.my-label
width 100px
.my-content
width 400px
.popperOptions[x-placement^=left] .popper__arrow::after{
border-left-color: #565D6B;
}
.popperOptions[x-placement^=right] .popper__arrow::after{
border-right-color: #565D6B;
}
.popperOptions[x-placement^=bottom] .popper__arrow::after{
border-bottom-color: #565D6B;
}
.popperOptions[x-placement^=top] .popper__arrow::after{
border-top-color: #565D6B;
}
.popperOptions{
background-color: #565D6B;
color: #FFFFFF;
border: #565D6B;
}
.el-timeline-item__content {
color: #fff;
}
.el-timeline-item__timestamp {
color: #fff;
}
</style>

@ -0,0 +1,807 @@
<template>
<div class="app-container" v-if="show">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium"
class="ry_form">
<el-form-item label="订单状态" prop="status">
<DictRadio v-model="queryParams.status" :radioData="dict.type.oms_order_status" size="small" :show-all="'all'"
:filter="['11', '12', '13', '14']" @change="handleQuery"></DictRadio>
</el-form-item>
<el-form-item label="订单编号" prop="orderSn">
<el-input v-model.trim="queryParams.orderSn" placeholder="请输入订单编号" clearable size="small"
@keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="客户手机号" prop="userPhone">
<el-input v-model.trim="queryParams.userPhone" placeholder="请输入会员手机号" clearable size="small"
@keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="省市区" prop="provinces">
<address-selector v-model="queryParams.provinces" size="small"></address-selector>
</el-form-item>
<el-form-item label="下单时间" prop="Time">
<el-date-picker v-model="queryParams.Time" type="datetimerange" :picker-options="pickerOptions"
range-separator="至" size="small" format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']"
align="right"
@change="handleChange">
</el-date-picker>
</el-form-item>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="omsOrderList" border @selection-change="handleSelectionChange"
cell-class-name="my-cell">
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="收件信息" prop="receiverName" width="280">
<template v-slot="scope">
<div>
<!-- <span>{{ // scope.row.decrypt?scope.row.receiverName:getHiddenName(scope.row.receiverName) }} {{ scope.row.receiverPhone }}</span>-->
<span>{{ scope.row.receiverName }} {{ scope.row.receiverPhone }} </span>
<!-- <el-button-->
<!-- size="mini"-->
<!-- type="text"-->
<!-- @click="handleWatch(scope.row)"-->
<!-- style="margin-left: 10px"-->
<!-- >查看-->
<!-- </el-button>-->
<!-- <el-button-->
<!-- size="mini"-->
<!-- type="text"-->
<!-- @click="handleUpdate(scope.row)"-->
<!-- >修改-->
<!-- </el-button>-->
</div>
<div>
<span>{{ scope.row.receiverProvince }}{{ scope.row.receiverCity }}{{ scope.row.receiverDistrict }}</span>
<span>{{ scope.row.decrypt?scope.row.receiverDetailAddress:getHiddenDetailAddress(scope.row.receiverDetailAddress) }}</span>
</div>
</template>
</el-table-column>
<el-table-column label="客户信息" prop="receiverName" width="200">
<template v-slot="scope">
<p>{{ scope.row.nickName }}</p>
<p>{{ scope.row.mark }}</p>
</template>
</el-table-column>
<el-table-column label="备注留言" prop="note" width="160">
<template v-slot="scope">
<div>
<span v-if="scope.row.merchantNote" class="note-title" style="margin-right: 10px"></span>
<el-button
size="mini"
type="text"
@click="handleSaveNote(scope.row)"
>{{ scope.row.merchantNote ? '修改' : '添加平台备注' }}
</el-button>
</div>
<div v-if="scope.row.merchantNote">{{ scope.row.merchantNote }}</div>
<div v-if="scope.row.note" class="note-title"></div>
<div v-if="scope.row.note">{{ scope.row.note }}</div>
</template>
</el-table-column>
<el-table-column label="下单时间/支付时间" prop="payTime" width="180">
<template slot-scope="scope">
<div v-if="scope.row.createTime">{{ parseTime(scope.row.createTime, '{mm}-{dd} {hh}:{ii}') }} </div>
<div v-if="scope.row.payTime">{{ parseTime(scope.row.payTime, '{mm}-{dd} {hh}:{ii}') }} </div>
</template>
</el-table-column>
<!-- <el-table-column label="优惠券" prop="couponAmount" width="80">-->
<!-- <template v-slot="scope">-->
<!-- <div v-if="scope.row.couponAmount">{{ scope.row.couponAmount }}</div>-->
<!-- <div v-else></div>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="合计" prop="totalAmount" width="140">
<template v-slot="scope">
<div>
<span>总数 </span>
<span style="color: red;">{{ scope.row.buyNum }}</span>
</div>
<div>实付 {{ scope.row.payAmount }}</div>
</template>
</el-table-column>
<el-table-column label="商品规格" prop="productList" width="280">
<template v-slot="scope">
<div v-for="item in scope.row.productList" class="product-container">
<el-popover
placement="right"
trigger="hover">
<el-image :src="item.pic" style="width: 350px;height: 350px"/>
<el-image slot="reference" class="small-img product-item" :src="item.pic"
style="width: 40px;height: 40px"/>
</el-popover>
<div class="product-item" style="margin-left: 5px">
<div>
<span>商品名{{ item.productName }}</span>
</div>
<div class="sp-data">
<span v-for="(value, key) in JSON.parse(item.spData)">{{ key }}{{ value }}&nbsp;</span>
</div>
<div class="product-item quantity">
<span style="margin-right: 10px">{{ item.salePrice }}</span>
<span>x{{ item.buyNum }}</span>
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="订单状态" prop="status" width="160">
<template v-slot="scope">
<div>
<el-tag :type="getOrderStatusTag(scope.row.status)" style="margin-right: 10px">
{{ getOrderStatusText(scope.row.status) }}
</el-tag>
</div>
<div v-if="scope.row.deliverySn">{{ scope.row.deliverySn }}
<el-link @click="copy(scope.row.deliverySn)" :underline="false"><i
class="el-icon-document-copy el-icon--right"></i></el-link>
</div>
<div v-if="scope.row.deliveryTime">{{ parseTime(scope.row.deliveryTime, '') }}</div>
</template>
</el-table-column>
<el-table-column label="订单编号/操作" class-name="small-padding fixed-width" width="220" fixed="right" >
<template slot-scope="scope" >
<div style="float: right">
{{ scope.row.orderSn }}
<!-- <el-link-->
<!-- size="mini"-->
<!-- icon="el-icon-document-copy"-->
<!-- @click="copyOrderSn(scope.row.orderSn)"-->
<!-- ></el-link>-->
<el-link @click="copy(scope.row.orderSn)" :underline="false"><i
class="el-icon-document-copy el-icon--right"></i></el-link>
</div>
<div style="float: right">
<el-button
size="mini"
type="text"
@click="goDetail(scope.row)"
v-hasPermi="['oms:order:query']"
>详情
</el-button>
<el-button
size="mini"
type="text"
@click="showLog(scope.row.id)"
v-hasPermi="['oms:order:log']"
>日志
</el-button>
<el-button
size="mini"
type="text"
@click="handleDelivery(scope.row)"
:disabled="scope.row.status !== 1"
>发货
</el-button>
</div>
</template>
</el-table-column>
</el-table>
<InBody v-show="total>0">
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</InBody>
<!-- 发货对话框 -->
<el-dialog :title="deliveryObj.title" :visible.sync="deliveryObj.open" width="500px" append-to-body>
<el-form ref="deliveryForm" :model="deliveryObj.form" :rules="deliveryObj.rules" label-width="100px">
<el-form-item label="快递公司" prop="expressName">
<el-input v-model.trim="deliveryObj.form.expressName" placeholder="请输入快递公司名" clearable size="small"
/>
<!-- <el-select v-model="deliveryObj.form.expressName" placeholder="请选择快递公司" clearable size="small"-->
<!-- filterable>-->
<!-- <el-option v-for="(item, index) in experssList" :label="item.expressName" :value="item.expressName"/>-->
<!-- <el-option label="顺丰速运" value="1"/>-->
<!-- <el-option label="申通快递" value="2"/>-->
<!-- <el-option label="圆通快递" value="2"/>-->
<!-- </el-select>-->
</el-form-item>
<el-form-item label="快递单号" prop="expressSn">
<el-input v-model="deliveryObj.form.expressSn" placeholder="请输入快递单号" controls-position="right"
:min="0"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitDelivery('deliveryForm')">
</el-button>
<el-button @click="cancelDelivery"> </el-button>
</div>
</el-dialog>
<!-- 保存商家备注对话框 -->
<el-dialog :title="noteObj.title" :visible.sync="noteObj.open" width="500px" append-to-body>
<el-form ref="noteForm" :model="noteObj.form" label-width="100px">
<el-form-item label="备注" prop="merchantNote">
<el-input type="textarea" v-model="noteObj.form.merchantNote" controls-position="right" :min="0" :rows="3"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" size="small" @click="submitNoteForm()">
确认修改
</el-button>
<el-button size="small" @click="cancelNote"> </el-button>
</div>
</el-dialog>
<!-- 日志 -->
<el-dialog :title="logObj.title" :visible.sync="logObj.open" width="500px" append-to-body>
<el-timeline>
<el-timeline-item v-for="item in logObj.logList" :key="item.id" placement="top" :timestamp="parseTime(item.createTime, '')">
<el-card>
<h4>{{ getLogEvent(item.orderStatus) }}</h4>
<br>
<h4>操作人{{ item.operateMan }}</h4>
<br v-if="item.note">
<h4 v-if="item.note">{{ item.note }}</h4>
</el-card>
</el-timeline-item>
</el-timeline>
</el-dialog>
<el-dialog title="修改收件信息" :visible.sync="modifyReceiverInfo.open" width="500px" append-to-body
:close-on-click-modal="false">
<el-form ref="modifyReceiverInfoForm" :model="modifyReceiverInfo.form" label-width="100px"
:rules="modifyReceiverInfo.rules">
<el-form-item label="收件人姓名" prop="receiverName">
<el-input v-model="modifyReceiverInfo.form.receiverName"/>
</el-form-item>
<el-form-item label="收件人电话" prop="receiverPhone">
<el-input v-model="modifyReceiverInfo.form.receiverPhone"/>
</el-form-item>
<el-form-item label="省市区" prop="fullArea">
<AddressSelector v-model="modifyReceiverInfo.form.fullArea" style="width: 100%"/>
</el-form-item>
<el-form-item label="详细地址" prop="receiverDetailAddress">
<el-input v-model="modifyReceiverInfo.form.receiverDetailAddress"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" size="small" @click="asyncOk">
确认修改
</el-button>
<el-button size="small" @click="modifyReceiverInfo.open = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {
addOmsOrder,
deliverProduct,
delOmsOrder,
exportOmsOrder,
getDecryptPhone,
listOmsOrder,
saveMerchantNote,
updateOmsOrder,
updateReceiverAddress,
viewLog
} from '@/api/oms/order'
import {allExpress} from "@/api/pms/express";
import AddressSelector from "@/views/components/AddressSelector/index.vue";
import dateUtil, {dateFormat} from '@/utils/DateUtil';
// import {isStarRepo} from "@/utils/is-star-plugin"
import {mapGetters} from "vuex";
export default {
computed:{
...mapGetters(['userId']),
},
name: "OmsOrder",
dicts: ["oms_order_status", "oms_pay_type"],
components: {
AddressSelector
},
data() {
const validArea = (rule, value, callback) => {
const fullArea = this.modifyReceiverInfo.form.fullArea
if (fullArea.length < 3) {
callback(new Error("请选择省市区"));
} else {
callback();
}
};
return {
experssList:[],
show: true,
//
loading: true,
pickerOptions: {
shortcuts: dateUtil.getTimeShort2()
},
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
omsOrderList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
payType: null,
status: null,
Time: [],
provinces: [],
receiverProvince: null,
receiverCity: null,
receiverDistrict: null,
orderSn: null,
productName: null,
userPhone: null,
startTime: null,
endTime: null
},
//
form: {},
//
rules: {
memberId: [
{required: true, message: "MEMBER_ID不能为空", trigger: "blur"}
],
receiverName: [
{required: true, message: "收货人姓名不能为空", trigger: "blur"}
],
receiverPhone: [
{required: true, message: "收货人电话不能为空", trigger: "blur"}
],
},
showMoreCondition: false,
deliveryObj: {
title: '订单发货',
form: {
orderId: null,
expressName: null,
expressSn: null
},
open: false,
rules: {
expressName: [
{required: true, message: "快递公司不能为空", trigger: "change"}
],
expressSn: [
{required: true, message: "快递单号不能为空", trigger: "blur"}
]
}
},
noteObj: {
title: null,
form: {
id: null,
merchantNote: null
},
open: false
},
logObj: {
title: '日志',
logList: null,
open: false,
loading: false
},
modifyReceiverInfo: {
open: false,
form: {},
rules: {
receiverName: [
{required: true, message: "收件人姓名不能为空", trigger: "blur"}
],
receiverPhone: [
{required: true, message: "收件人电话不能为空", trigger: "blur"}
], fullArea: [
{required: true, validator: validArea, trigger: "change"}
], receiverDetailAddress: [
{required: true, message: "详细地址不能为空", trigger: "blur"}
],
}
}
};
},
created() {
this.getList();
},
// async created() {
// const res = await isStarRepo('zccbbg', 'RuoYi-Mall', this.userId, 'https://mall.ichengle.top/order/order', 'ruoyi-mall-', 'https://gitee.com/zccbbg/RuoYi-Mall')
// this.show = res;
// if (res) {
// const {phone, status, today} = this.$route.query
// if (phone) {
// this.queryParams.userPhone = phone
// }
// if (status) {
// this.queryParams.status = status
// }
// if (today) {
// this.setToday()
// }
// this.getList();
// }
// },
methods: {
/** 日期组件设置为今天 */
setToday() {
const temp = new Date();
this.queryParams.Time[0] = dateFormat(new Date(temp.setHours(0, 0, 0, 0)), "yyyy-MM-dd hh:mm:ss")
this.queryParams.Time[1] = dateFormat(new Date(temp.setHours(23, 59, 59, 0)), "yyyy-MM-dd hh:mm:ss")
},
/** 查询订单表列表 */
getList() {
if (this.queryParams.Time) {
this.queryParams.startTime = this.queryParams.Time[0]
this.queryParams.endTime = this.queryParams.Time[1]
}
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
if (query.provinces) {
const [receiverProvince, receiverCity, receiverDistrict] = query.provinces
query.receiverProvince = receiverProvince
query.receiverCity = receiverCity
query.receiverDistrict = receiverDistrict
} else {
query.receiverProvince = null
query.receiverCity = null
query.receiverDistrict = null
}
const pageReq = {page: pageNum - 1, size: pageSize};
listOmsOrder(query, pageReq).then(response => {
const {content, totalElements} = response
this.omsOrderList = content;
this.total = totalElements;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
memberId: null,
memberUsername: null,
totalAmount: null,
purchasePrice: null,
payAmount: null,
freightAmount: null,
payType: null,
status: 0,
aftersaleStatus: 0,
deliveryCompany: null,
deliverySn: null,
autoConfirmDay: null,
receiverName: null,
receiverPhone: null,
receiverPostCode: null,
receiverProvince: null,
receiverCity: null,
receiverDistrict: null,
receiverDetailAddress: null,
note: null,
confirmStatus: 0,
deleteStatus: 0,
paymentTime: null,
deliveryTime: null,
receiveTime: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加订单表";
},
/** 修改按钮操作 */
async handleUpdate(row) {
await this.handleWatch(row)
const {receiverCity, receiverDistrict, receiverProvince} = row
row.fullArea = [receiverProvince, receiverCity, receiverDistrict]
this.modifyReceiverInfo.form = row
this.modifyReceiverInfo.open = true
},
handleWatch(row) {
getDecryptPhone(row.id).then(response =>{
row.receiverPhone=response;
row.decrypt=true;
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateOmsOrder(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addOmsOrder(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除订单表编号为"' + ids + '"的数据项?').then(function () {
return delOmsOrder(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {
});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有订单表数据项?').then(() => {
this.exportLoading = true;
return exportOmsOrder(queryParams);
}).then(response => {
this.$download.download(response);
this.exportLoading = false;
}).catch(() => {
});
},
//change
handleChange(value) {
if (!value) {
this.queryParams.startTime = null;
this.queryParams.endTime = null;
}
},
getOrderStatusTag(status) {
switch (status) {
case 0:
case 1:
return 'info';
case 2:
return 'primary';
case 3:
return 'success';
case 4:
return 'warning';
case 5:
return 'danger';
}
},
getOrderStatusText(status) {
switch (status) {
case 0:
return '待付款';
case 1:
return '待发货';
case 2:
return '已发货';
case 3:
return '已完成';
case 4:
return '已关闭';
case 5:
return '无效订单';
}
},
getLogEvent(status) {
switch (status) {
case 0:
return '用户下单';
case 1:
return '用户支付成功';
case 2:
return '平台发货';
case 3:
return '用户确认收货';
case 4:
return '取消订单';
case 5:
return '无效订单';
}
},
getPayTypeTag(type) {
switch (type) {
case 0:
return 'info';
case 1:
return 'primary';
case 2:
return 'success';
}
},
getPayTypeText(type) {
switch (type) {
case 0:
return '未支付';
case 1:
return '支付宝';
case 2:
return '微信';
}
},
goDetail(row) {
const id = row.id
this.$router.push({path: '/order/detail', query: {id}})
},
copy(data) {
let url = data;
let oInput = document.createElement('input');
oInput.value = url;
document.body.appendChild(oInput);
oInput.select(); // ;
console.log(oInput.value)
document.execCommand("Copy"); //
this.$modal.msgSuccess('复制成功');
oInput.remove()
},
handleDelivery(row) {
allExpress({}).then((res)=>{
this.experssList=res
})
this.deliveryObj.form.orderId = row.id
this.deliveryObj.open = true
},
submitDelivery() {
this.$refs['deliveryForm'].validate((valid) => {
if (valid) {
deliverProduct(this.deliveryObj.form).then(resp => {
this.$modal.msgSuccess('发货成功')
this.cancelDelivery()
this.getList()
})
}
})
},
cancelDelivery() {
this.deliveryObj.open = false
this.deliveryObj.form.orderId = null
this.deliveryObj.form.expressName = null
this.deliveryObj.form.expressSn = null
},
handleSaveNote(row) {
const merchantNote = row.merchantNote
if (merchantNote) {
this.noteObj.title = '修改平台备注'
} else {
this.noteObj.title = '添加平台备注'
}
this.noteObj.form.id = row.id
this.noteObj.form.merchantNote = row.merchantNote
this.noteObj.open = true
},
//
submitNoteForm() {
saveMerchantNote(this.noteObj.form).then(resp => {
if (resp > 0) {
this.$modal.msgSuccess('修改成功')
this.cancelNote()
this.getList()
}
})
},
cancelNote() {
this.noteObj.open = false
this.noteObj.form.id = null
this.noteObj.form.merchantNote = null
},
showLog(orderId) {
this.logObj.loading = true
viewLog(orderId).then((response) => {
this.logObj.logList = response
this.logObj.open = true
this.logObj.loading = false
})
},
asyncOk() {
this.$refs['modifyReceiverInfoForm'].validate((valid) => {
if (valid) {
const {id, receiverName, fullArea, receiverPhone, receiverDetailAddress} = this.modifyReceiverInfo.form
const [receiverProvince, receiverCity, receiverDistrict] = fullArea
updateReceiverAddress({
id,
receiverCity,
receiverDetailAddress,
receiverDistrict,
receiverName,
receiverPhone,
receiverProvince
}).then(resp => {
this.$modal.msgSuccess('修改成功')
this.getList()
this.modifyReceiverInfo.open = false
})
}
})
}
},
};
</script>
<style lang="scss">
.product-container {
display: flex;
flex-direction: row;
align-items: center;
width: 340px;
.product-item {
margin: auto;
width: 290px;
.sp-data {
font-size: 13px;
}
.quantity {
font-weight: bold;
font-size: 13px;
}
}
}
.note-title {
font-weight: bold;
}
.el-table .my-cell {
vertical-align: top
}
.el-link.el-link--default {
color: #409eff;
}
.el-select {
width: 100%;
}
</style>

@ -0,0 +1,258 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="订单id" prop="orderId">
<el-input
v-model="queryParams.orderId"
placeholder="请输入订单id"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="物流公司(配送方式)" prop="deliveryCompany">
<el-input
v-model="queryParams.deliveryCompany"
placeholder="请输入物流公司(配送方式)"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="物流单号" prop="deliverySn">
<el-input
v-model="queryParams.deliverySn"
placeholder="请输入物流单号"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['oms:orderDeliveryHistory:add']"
>新增</el-button>
</el-col>
</el-col>
</el-row>
<el-table v-loading="loading" :data="omsOrderDeliveryHistoryList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="订单id" align="center" prop="orderId" />
<el-table-column label="物流公司(配送方式)" align="center" prop="deliveryCompany" />
<el-table-column label="物流单号" align="center" prop="deliverySn" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['oms:orderDeliveryHistory:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['oms:orderDeliveryHistory:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改订单发货记录对话框 -->
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="108px" inline class="dialog-form-two">
<el-form-item label="订单id" prop="orderId">
<el-input v-model="form.orderId" placeholder="请输入订单id" />
</el-form-item>
<el-form-item label="物流公司(配送方式)" prop="deliveryCompany">
<el-input v-model="form.deliveryCompany" placeholder="请输入物流公司(配送方式)" />
</el-form-item>
<el-form-item label="物流单号" prop="deliverySn">
<el-input v-model="form.deliverySn" placeholder="请输入物流单号" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listOmsOrderDeliveryHistory, getOmsOrderDeliveryHistory, delOmsOrderDeliveryHistory, addOmsOrderDeliveryHistory, updateOmsOrderDeliveryHistory, exportOmsOrderDeliveryHistory } from "@/api/oms/orderDeliveryHistory";
export default {
name: "OmsOrderDeliveryHistory",
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
omsOrderDeliveryHistoryList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
orderId: null,
deliveryCompany: null,
deliverySn: null,
},
//
form: {},
//
rules: {
},
};
},
created() {
this.getList();
},
methods: {
/** 查询订单发货记录列表 */
getList() {
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listOmsOrderDeliveryHistory(query, pageReq).then(response => {
const { content, totalElements } = response
this.omsOrderDeliveryHistoryList = content;
this.total = totalElements;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
orderId: null,
deliveryCompany: null,
deliverySn: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加订单发货记录";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getOmsOrderDeliveryHistory(id).then(response => {
this.form = response;
this.open = true;
this.title = "修改订单发货记录";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateOmsOrderDeliveryHistory(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addOmsOrderDeliveryHistory(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除订单发货记录编号为"' + ids + '"的数据项?').then(function() {
return delOmsOrderDeliveryHistory(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有订单发货记录数据项?').then(() => {
this.exportLoading = true;
return exportOmsOrderDeliveryHistory(queryParams);
}).then(response => {
this.$download.download(response);
this.exportLoading = false;
}).catch(() => {});
}
}
};
</script>

@ -0,0 +1,424 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="订单id" prop="orderId">
<el-input
v-model="queryParams.orderId"
placeholder="请输入订单id"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="PRODUCT_ID" prop="productId">
<el-input
v-model="queryParams.productId"
placeholder="请输入PRODUCT_ID"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="商品编码" prop="outProductId">
<el-input
v-model="queryParams.outProductId"
placeholder="请输入商品编码"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="商品sku id" prop="skuId">
<el-input
v-model="queryParams.skuId"
placeholder="请输入商品sku id"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="sku编码" prop="outSkuId">
<el-input
v-model="queryParams.outSkuId"
placeholder="请输入sku编码"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="商品快照id" prop="productSnapshotId">
<el-input
v-model="queryParams.productSnapshotId"
placeholder="请输入商品快照id"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="sku快照id" prop="skuSnapshotId">
<el-input
v-model="queryParams.skuSnapshotId"
placeholder="请输入sku快照id"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<template v-if="showMoreCondition">
<el-form-item label="展示图片" prop="pic">
<el-input
v-model="queryParams.pic"
placeholder="请输入展示图片"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="PRODUCT_NAME" prop="productName">
<el-input
v-model="queryParams.productName"
placeholder="请输入PRODUCT_NAME"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="销售价格" prop="salePrice">
<el-input
v-model="queryParams.salePrice"
placeholder="请输入销售价格"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="采购价" prop="purchasePrice">
<el-input
v-model="queryParams.purchasePrice"
placeholder="请输入采购价"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="购买数量" prop="quantity">
<el-input
v-model="queryParams.quantity"
placeholder="请输入购买数量"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="商品分类id" prop="productCategoryId">
<el-input
v-model="queryParams.productCategoryId"
placeholder="请输入商品分类id"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
</template>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
<el-button :icon="showMoreCondition ? 'el-icon-arrow-up' : 'el-icon-arrow-down'" size="mini" @click="showMoreCondition = !showMoreCondition">{{showMoreCondition ? '收起条件' : '展开条件'}}</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['oms:orderItem:add']"
>新增</el-button>
</el-col>
</el-col>
</el-row>
<el-table v-loading="loading" :data="omsOrderItemList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="订单id" align="center" prop="orderId" />
<el-table-column label="PRODUCT_ID" align="center" prop="productId" />
<el-table-column label="商品编码" align="center" prop="outProductId" />
<el-table-column label="商品sku id" align="center" prop="skuId" />
<el-table-column label="sku编码" align="center" prop="outSkuId" />
<el-table-column label="商品快照id" align="center" prop="productSnapshotId" />
<el-table-column label="sku快照id" align="center" prop="skuSnapshotId" />
<el-table-column label="展示图片" align="center" prop="pic" />
<el-table-column label="PRODUCT_NAME" align="center" prop="productName" />
<el-table-column label="销售价格" align="center" prop="salePrice" />
<el-table-column label="采购价" align="center" prop="purchasePrice" />
<el-table-column label="购买数量" align="center" prop="quantity" />
<el-table-column label="商品分类id" align="center" prop="productCategoryId" />
<el-table-column label="商品sku属性:[{"key":"","value":""},{"key":"","value":"4G"}]" align="center" prop="spData" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['oms:orderItem:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['oms:orderItem:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改订单中所包含的商品对话框 -->
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="108px" inline class="dialog-form-two">
<el-form-item label="订单id" prop="orderId">
<el-input v-model="form.orderId" placeholder="请输入订单id" />
</el-form-item>
<el-form-item label="PRODUCT_ID" prop="productId">
<el-input v-model="form.productId" placeholder="请输入PRODUCT_ID" />
</el-form-item>
<el-form-item label="商品编码" prop="outProductId">
<el-input v-model="form.outProductId" placeholder="请输入商品编码" />
</el-form-item>
<el-form-item label="商品sku id" prop="skuId">
<el-input v-model="form.skuId" placeholder="请输入商品sku id" />
</el-form-item>
<el-form-item label="sku编码" prop="outSkuId">
<el-input v-model="form.outSkuId" placeholder="请输入sku编码" />
</el-form-item>
<el-form-item label="商品快照id" prop="productSnapshotId">
<el-input v-model="form.productSnapshotId" placeholder="请输入商品快照id" />
</el-form-item>
<el-form-item label="sku快照id" prop="skuSnapshotId">
<el-input v-model="form.skuSnapshotId" placeholder="请输入sku快照id" />
</el-form-item>
<el-form-item label="展示图片" prop="pic">
<el-input v-model="form.pic" placeholder="请输入展示图片" />
</el-form-item>
<el-form-item label="PRODUCT_NAME" prop="productName">
<el-input v-model="form.productName" placeholder="请输入PRODUCT_NAME" />
</el-form-item>
<el-form-item label="销售价格" prop="salePrice">
<el-input v-model="form.salePrice" placeholder="请输入销售价格" />
</el-form-item>
<el-form-item label="采购价" prop="purchasePrice">
<el-input v-model="form.purchasePrice" placeholder="请输入采购价" />
</el-form-item>
<el-form-item label="购买数量" prop="quantity">
<el-input v-model="form.quantity" placeholder="请输入购买数量" />
</el-form-item>
<el-form-item label="商品分类id" prop="productCategoryId">
<el-input v-model="form.productCategoryId" placeholder="请输入商品分类id" />
</el-form-item>
<el-form-item label="商品sku属性:[{"key":"","value":""},{"key":"","value":"4G"}]" prop="spData">
<el-input v-model="form.spData" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listOmsOrderItem, getOmsOrderItem, delOmsOrderItem, addOmsOrderItem, updateOmsOrderItem, exportOmsOrderItem } from "@/api/oms/orderItem";
export default {
name: "OmsOrderItem",
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
omsOrderItemList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
orderId: null,
productId: null,
outProductId: null,
skuId: null,
outSkuId: null,
productSnapshotId: null,
skuSnapshotId: null,
pic: null,
productName: null,
salePrice: null,
purchasePrice: null,
quantity: null,
productCategoryId: null,
spData: null,
},
//
form: {},
//
rules: {
outProductId: [
{ required: true, message: "商品编码不能为空", trigger: "blur" }
],
outSkuId: [
{ required: true, message: "sku编码不能为空", trigger: "blur" }
],
},
showMoreCondition: false
};
},
created() {
this.getList();
},
methods: {
/** 查询订单中所包含的商品列表 */
getList() {
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listOmsOrderItem(query, pageReq).then(response => {
const { content, totalElements } = response
this.omsOrderItemList = content;
this.total = totalElements;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
orderId: null,
productId: null,
outProductId: null,
skuId: null,
outSkuId: null,
productSnapshotId: null,
skuSnapshotId: null,
pic: null,
productName: null,
salePrice: null,
purchasePrice: null,
quantity: null,
productCategoryId: null,
spData: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加订单中所包含的商品";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getOmsOrderItem(id).then(response => {
this.form = response;
this.open = true;
this.title = "修改订单中所包含的商品";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateOmsOrderItem(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addOmsOrderItem(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除订单中所包含的商品编号为"' + ids + '"的数据项?').then(function() {
return delOmsOrderItem(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有订单中所包含的商品数据项?').then(() => {
this.exportLoading = true;
return exportOmsOrderItem(queryParams);
}).then(response => {
this.$download.download(response);
this.exportLoading = false;
}).catch(() => {});
}
}
};
</script>

@ -0,0 +1,287 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="订单号" prop="orderId">
<el-input
v-model="queryParams.orderSn"
placeholder="请输入订单号"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="订单状态" prop="status">
<DictRadio v-model="queryParams.status" :radioData="dict.type.oms_order_status" size="small" :show-all="'all'"></DictRadio>
</el-form-item>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="omsOrderOperateHistoryList" @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column label="订单号" align="center" prop="orderSn" />
<el-table-column label="订单状态" align="center" prop="orderStatus">
<template v-slot="scope">
<el-tag :type="getOrderTypeTag(scope.row.orderStatus)" style="margin-right: 10px">
{{ getOrderTypeText(scope.row.orderStatus) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="note" />
<el-table-column label="操作时间" align="center" prop="createTime">
<template v-slot="scope">
<div>{{ parseTime(scope.row.createTime, '')}}</div>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<!-- <el-button-->
<!-- size="mini"-->
<!-- type="text"-->
<!-- icon="el-icon-edit"-->
<!-- @click="handleUpdate(scope.row)"-->
<!-- v-hasPermi="['oms:orderOperateHistory:edit']"-->
<!-- >修改</el-button>-->
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['oms:orderOperateHistory:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改订单操作历史记录对话框 -->
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="108px" inline class="dialog-form-two">
<el-form-item label="订单id" prop="orderId">
<el-input v-model="form.orderId" placeholder="请输入订单id" />
</el-form-item>
<el-form-item label="操作人:用户;系统;后台管理员" prop="operateMan">
<el-input v-model="form.operateMan" placeholder="请输入操作人:用户;系统;后台管理员" />
</el-form-item>
<el-form-item label="订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单">
<el-radio-group v-model="form.orderStatus">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="note">
<el-input v-model="form.note" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listOmsOrderOperateHistory, getOmsOrderOperateHistory, delOmsOrderOperateHistory, addOmsOrderOperateHistory, updateOmsOrderOperateHistory, exportOmsOrderOperateHistory } from "@/api/oms/orderOperateHistory";
export default {
name: "OmsOrderOperateHistory",
dicts: ["oms_order_status"],
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
omsOrderOperateHistoryList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
orderSn: null,
operateMan: null,
orderStatus: null,
note: null,
},
//
form: {},
//
rules: {
},
};
},
created() {
this.getList();
},
methods: {
/** 查询订单操作历史记录列表 */
getList() {
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listOmsOrderOperateHistory(query, pageReq).then(response => {
const { content, totalElements } = response
this.omsOrderOperateHistoryList = content;
this.total = totalElements;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
orderId: null,
operateMan: null,
orderStatus: 0,
note: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加订单操作历史记录";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getOmsOrderOperateHistory(id).then(response => {
this.form = response;
this.open = true;
this.title = "修改订单操作历史记录";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateOmsOrderOperateHistory(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addOmsOrderOperateHistory(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除订单操作历史记录编号为"' + ids + '"的数据项?').then(function() {
return delOmsOrderOperateHistory(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有订单操作历史记录数据项?').then(() => {
this.exportLoading = true;
return exportOmsOrderOperateHistory(queryParams);
}).then(response => {
this.$download.download(response);
this.exportLoading = false;
}).catch(() => {});
},
getOrderTypeTag(status){
switch (status){
case 0:
case 1:
return 'info';
case 2:
return 'primary';
case 3:
return 'success';
case 4:
return 'warning';
case 5:
return 'danger';
}
},
getOrderTypeText(status){
switch (status){
case 0:
return '待付款';
case 1:
return '待发货';
case 2:
return '已发货';
case 3:
return '已完成';
case 4:
return '已关闭';
case 5:
return '无效订单';
case 11:
return '售后待处理';
case 12:
return '退货中';
case 13:
return '售后已完成';
case 14:
return '售后已拒绝';
}
}
}
};
</script>

@ -0,0 +1,395 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="payment_id" prop="paymentId">
<el-input
v-model="queryParams.paymentId"
placeholder="请输入payment_id"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="用户 ID" prop="memberId">
<el-input
v-model="queryParams.memberId"
placeholder="请输入用户 ID"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="OPENID" prop="openid">
<el-input
v-model="queryParams.openid"
placeholder="请输入OPENID"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="真实姓名,提现需要" prop="realName">
<el-input
v-model="queryParams.realName"
placeholder="请输入真实姓名,提现需要"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标题|商品名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入标题|商品名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="订单号 支付时是payId 其他为orderId" prop="orderId">
<el-input
v-model="queryParams.orderId"
placeholder="请输入订单号 支付时是payId 其他为orderId"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="金额,单位分" prop="money">
<el-input
v-model="queryParams.money"
placeholder="请输入金额,单位分"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<template v-if="showMoreCondition">
<el-form-item label="交易类型" prop="opType">
<el-select v-model="queryParams.opType" placeholder="请选择交易类型" clearable size="small">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="paymentStatus">
<el-select v-model="queryParams.paymentStatus" placeholder="请选择状态" clearable size="small">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="附加数据" prop="attach">
<el-input
v-model="queryParams.attach"
placeholder="请输入附加数据"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
</template>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
<el-button :icon="showMoreCondition ? 'el-icon-arrow-up' : 'el-icon-arrow-down'" size="mini" @click="showMoreCondition = !showMoreCondition">{{showMoreCondition ? '收起条件' : '展开条件'}}</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['pms:wechatPaymentHistory:add']"
>新增</el-button>
</el-col>
</el-col>
</el-row>
<el-table v-loading="loading" :data="omsWechatPaymentHistoryList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="payment_id" align="center" prop="paymentId" />
<el-table-column label="用户 ID" align="center" prop="memberId" />
<el-table-column label="OPENID" align="center" prop="openid" />
<el-table-column label="真实姓名,提现需要" align="center" prop="realName" />
<el-table-column label="标题|商品名称" align="center" prop="title" />
<el-table-column label="订单号 支付时是payId 其他为orderId" align="center" prop="orderId" />
<el-table-column label="金额,单位分" align="center" prop="money" />
<el-table-column label="交易类型" align="center" prop="opType" />
<el-table-column label="状态" align="center" prop="paymentStatus" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="附加数据" align="center" prop="attach" />
<el-table-column label="响应内容" align="center" prop="responseBody" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['pms:wechatPaymentHistory:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['pms:wechatPaymentHistory:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改微信订单表对话框 -->
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="108px" inline class="dialog-form-two">
<el-form-item label="payment_id" prop="paymentId">
<el-input v-model="form.paymentId" placeholder="请输入payment_id" />
</el-form-item>
<el-form-item label="用户 ID" prop="memberId">
<el-input v-model="form.memberId" placeholder="请输入用户 ID" />
</el-form-item>
<el-form-item label="OPENID" prop="openid">
<el-input v-model="form.openid" placeholder="请输入OPENID" />
</el-form-item>
<el-form-item label="真实姓名,提现需要" prop="realName">
<el-input v-model="form.realName" placeholder="请输入真实姓名,提现需要" />
</el-form-item>
<el-form-item label="标题|商品名称" prop="title">
<el-input v-model="form.title" placeholder="请输入标题|商品名称" />
</el-form-item>
<el-form-item label="订单号 支付时是payId 其他为orderId" prop="orderId">
<el-input v-model="form.orderId" placeholder="请输入订单号 支付时是payId 其他为orderId" />
</el-form-item>
<el-form-item label="金额,单位分" prop="money">
<el-input v-model="form.money" placeholder="请输入金额,单位分" />
</el-form-item>
<el-form-item label="交易类型" prop="opType">
<el-select v-model="form.opType" placeholder="请选择交易类型">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="状态">
<el-radio-group v-model="form.paymentStatus">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="附加数据" prop="attach">
<el-input v-model="form.attach" placeholder="请输入附加数据" />
</el-form-item>
<el-form-item label="响应内容" prop="responseBody">
<el-input v-model="form.responseBody" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listOmsWechatPaymentHistory, getOmsWechatPaymentHistory, delOmsWechatPaymentHistory, addOmsWechatPaymentHistory, updateOmsWechatPaymentHistory, exportOmsWechatPaymentHistory } from "@/api/oms/wechatPaymentHistory";
export default {
name: "OmsWechatPaymentHistory",
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
omsWechatPaymentHistoryList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
paymentId: null,
memberId: null,
openid: null,
realName: null,
title: null,
orderId: null,
money: null,
opType: null,
paymentStatus: null,
attach: null,
responseBody: null,
},
//
form: {},
//
rules: {
memberId: [
{ required: true, message: "用户 ID不能为空", trigger: "blur" }
],
openid: [
{ required: true, message: "OPENID不能为空", trigger: "blur" }
],
title: [
{ required: true, message: "标题|商品名称不能为空", trigger: "blur" }
],
orderId: [
{ required: true, message: "订单号 支付时是payId 其他为orderId不能为空", trigger: "blur" }
],
money: [
{ required: true, message: "金额,单位分不能为空", trigger: "blur" }
],
opType: [
{ required: true, message: "交易类型不能为空", trigger: "change" }
],
paymentStatus: [
{ required: true, message: "状态不能为空", trigger: "blur" }
],
},
showMoreCondition: false
};
},
created() {
this.getList();
},
methods: {
/** 查询微信订单表列表 */
getList() {
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
const query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
listOmsWechatPaymentHistory(query, pageReq).then(response => {
const { content, totalElements } = response
this.omsWechatPaymentHistoryList = content;
this.total = totalElements;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
paymentId: null,
memberId: null,
openid: null,
realName: null,
title: null,
orderId: null,
money: null,
opType: null,
paymentStatus: 0,
remark: null,
attach: null,
responseBody: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加微信订单表";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getOmsWechatPaymentHistory(id).then(response => {
this.form = response;
this.open = true;
this.title = "修改微信订单表";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateOmsWechatPaymentHistory(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addOmsWechatPaymentHistory(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除微信订单表编号为"' + ids + '"的数据项?').then(function() {
return delOmsWechatPaymentHistory(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有微信订单表数据项?').then(() => {
this.exportLoading = true;
return exportOmsWechatPaymentHistory(queryParams);
}).then(response => {
this.$download.download(response);
this.exportLoading = false;
}).catch(() => {});
}
}
};
</script>

@ -1,7 +1,7 @@
<template>
<div class="register">
<el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
<h3 class="title">ruoyi-mall商城管理系统</h3>
<h3 class="title">yoga后台管理系统</h3>
<el-form-item prop="username">
<el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />

@ -57,7 +57,8 @@ export default {
updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
this.$modal.msgSuccess("修改成功,请重新登录");
this.$store.dispatch('LogOut').then(() => {
location.href = '/index';
// location.href = '/index';
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
})
});
}

@ -64,7 +64,8 @@ export default {
updateUserProfile(this.user).then(response => {
this.$modal.msgSuccess("修改成功,请重新登陆");
this.$store.dispatch('LogOut').then(() => {
location.href = '/index';
// location.href = '/index';
this.$router.push(`/login?redirect=${this.$route.fullPath}`)
})
});
}

Loading…
Cancel
Save