拉取DEV代码

This commit is contained in:
duan
2024-08-01 15:50:15 +08:00
14 changed files with 954 additions and 139 deletions

14
src/api/homes/record.js Normal file
View File

@@ -0,0 +1,14 @@
import request from '@/utils/request'
/**
* 查询交班记录
* @returns
*/
export function tbHandoverGet(leng) {
return request({
url: leng,
method: 'get'
})
}

View File

@@ -1,35 +1,30 @@
import request from '@/utils/request' import request from "@/utils/request";
export function login(username, password, code, uuid) { export function login(data) {
return request({ return request({
url: 'auth/login', url: "auth/login",
method: 'post', method: "post",
data: { data
username, });
password,
code,
uuid
}
})
} }
export function getInfo() { export function getInfo() {
return request({ return request({
url: 'auth/info', url: "auth/info",
method: 'get' method: "get"
}) });
} }
export function getCodeImg(header) { export function getCodeImg(header) {
return request({ return request({
url: 'auth/code', url: "auth/code",
method: 'get' method: "get"
}) });
} }
export function logout() { export function logout() {
return request({ return request({
url: 'auth/logout', url: "auth/logout",
method: 'delete' method: "delete"
}) });
} }

View File

@@ -465,7 +465,6 @@ export function queryAllShopInfo(params) {
}); });
} }
/** /**
* 修改商品排序 * 修改商品排序
* @returns * @returns
@@ -502,7 +501,6 @@ export function upCategorySort(data) {
}); });
} }
/** /**
* 查询店铺充值记录 * 查询店铺充值记录
* @returns * @returns
@@ -526,10 +524,86 @@ export function downloadTableRecharge(data) {
return request({ return request({
url: `/api/tbShopUser/recharge/download`, url: `/api/tbShopUser/recharge/download`,
method: "post", method: "post",
data:{ data: {
shopId: localStorage.getItem("shopId"), shopId: localStorage.getItem("shopId"),
...data ...data
}, },
responseType: "blob" responseType: "blob"
}); });
} }
/**
* 员工列表
* @returns
*/
export function tbPlussShopStaffGet(params) {
return request({
url: `/api/tbPlussShopStaff`,
method: "get",
params: {
shopId: localStorage.getItem("shopId"),
...params
}
});
}
/**
* 角色列表
* @returns
*/
export function rolesGet() {
return request({
url: `/api/roles`,
method: "get"
});
}
/**
* 增加员工
* @returns
*/
export function tbPlussShopStaff(data) {
return request({
url: `/api/tbPlussShopStaff`,
method: data.id ? "put" : "post",
data: {
shopId: localStorage.getItem("shopId"),
...data
}
});
}
/**
* 通过id获取员工信息
* @returns
*/
export function tbPlussShopStaffDetail(id) {
return request({
url: `/api/tbPlussShopStaff/${id}`,
method: "get"
});
}
/**
* 更改员工状态
* @returns
*/
export function updateStatus(data) {
return request({
url: `/api/tbPlussShopStaff/updateStatus`,
method: "put",
data
});
}
/**
* 员工删除
* @returns
*/
export function shopStaffDelete(data) {
return request({
url: `/api/tbPlussShopStaff`,
method: "delete",
data
});
}

View File

@@ -58,6 +58,12 @@ export const constantRouterMap = [
component: (resolve) => require(['@/views/home/data_tables'], resolve), component: (resolve) => require(['@/views/home/data_tables'], resolve),
name: 'data_tables', name: 'data_tables',
meta: { title: '桌台统计' } meta: { title: '桌台统计' }
},
{
path: 'data_record',
component: (resolve) => require(['@/views/home/data_record'], resolve),
name: 'data_record',
meta: { title: '交班记录' }
} }
] ]
}, },

View File

@@ -1,5 +1,5 @@
import { login, getInfo, logout } from '@/api/login' import { login, getInfo, logout } from "@/api/login";
import { getToken, setToken, removeToken } from '@/utils/auth' import { getToken, setToken, removeToken } from "@/utils/auth";
const user = { const user = {
state: { state: {
@@ -13,91 +13,97 @@ const user = {
mutations: { mutations: {
// 是否为手动退出登录 // 是否为手动退出登录
SD_LOGOUT: (state, f) => { SD_LOGOUT: (state, f) => {
state.sdLogout = f state.sdLogout = f;
}, },
SET_TOKEN: (state, token) => { SET_TOKEN: (state, token) => {
state.token = token state.token = token;
}, },
SET_USER: (state, user) => { SET_USER: (state, user) => {
state.user = user state.user = user;
}, },
SET_ROLES: (state, roles) => { SET_ROLES: (state, roles) => {
state.roles = roles state.roles = roles;
}, },
SET_LOAD_MENUS: (state, loadMenus) => { SET_LOAD_MENUS: (state, loadMenus) => {
state.loadMenus = loadMenus state.loadMenus = loadMenus;
} }
}, },
actions: { actions: {
// 登录 // 登录
Login({ commit }, userInfo) { Login({ commit }, userInfo) {
const rememberMe = userInfo.rememberMe const rememberMe = userInfo.rememberMe;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
login(userInfo.username, userInfo.password, userInfo.code, userInfo.uuid).then(res => { login(userInfo)
// console.log('登录成功后返回===', res) .then(res => {
localStorage.setItem('logoutHandle', false) // console.log('登录成功后返回===', res)
localStorage.setItem('shopId', res.shopId) localStorage.setItem("logoutHandle", false);
localStorage.setItem('shopName', res.shopName) localStorage.setItem("shopId", res.shopId);
localStorage.setItem('logo', res.logo) localStorage.setItem("shopName", res.shopName);
setToken(res.token, rememberMe) localStorage.setItem("logo", res.logo);
commit('SET_TOKEN', res.token) setToken(res.token, rememberMe);
setUserInfo(res.user, commit) commit("SET_TOKEN", res.token);
// 第一次加载菜单时用到, 具体见 src 目录下的 permission.js setUserInfo(res.user, commit);
commit('SET_LOAD_MENUS', true) // 第一次加载菜单时用到, 具体见 src 目录下的 permission.js
resolve() commit("SET_LOAD_MENUS", true);
}).catch(error => { resolve();
reject(error) })
}) .catch(error => {
}) reject(error);
});
});
}, },
// 获取用户信息 // 获取用户信息
GetInfo({ commit }) { GetInfo({ commit }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getInfo().then(res => { getInfo()
setUserInfo(res, commit) .then(res => {
resolve(res) setUserInfo(res, commit);
}).catch(error => { resolve(res);
reject(error) })
}) .catch(error => {
}) reject(error);
});
});
}, },
// 登出 // 登出
LogOut({ commit }) { LogOut({ commit }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
logout().then(res => { logout()
logOut(commit) .then(res => {
resolve() logOut(commit);
}).catch(error => { resolve();
logOut(commit) })
reject(error) .catch(error => {
}) logOut(commit);
}) reject(error);
});
});
}, },
updateLoadMenus({ commit }) { updateLoadMenus({ commit }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
commit('SET_LOAD_MENUS', false) commit("SET_LOAD_MENUS", false);
}) });
} }
} }
} };
export const logOut = (commit) => { export const logOut = commit => {
commit('SET_TOKEN', '') commit("SET_TOKEN", "");
commit('SET_ROLES', []) commit("SET_ROLES", []);
removeToken() removeToken();
} };
export const setUserInfo = (res, commit) => { export const setUserInfo = (res, commit) => {
// 如果没有任何权限,则赋予一个默认的权限,避免请求死循环 // 如果没有任何权限,则赋予一个默认的权限,避免请求死循环
if (res.roles.length === 0) { if (res.roles.length === 0) {
commit('SET_ROLES', ['ROLE_SYSTEM_DEFAULT']) commit("SET_ROLES", ["ROLE_SYSTEM_DEFAULT"]);
} else { } else {
commit('SET_ROLES', res.roles) commit("SET_ROLES", res.roles);
} }
commit('SET_USER', res.user) commit("SET_USER", res.user);
} };
export default user export default user;

View File

@@ -0,0 +1,340 @@
<template>
<div class="app-container">
<div class="head-container">
<el-form :model="query" inline label-position="left">
<el-radio-group v-model="timeValue" @change="timeChange">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="0">今天</el-radio-button>
<el-radio-button label="-1">昨天</el-radio-button>
<el-radio-button label="-7">最近7天</el-radio-button>
<el-radio-button label="-30">最近30天</el-radio-button>
<el-radio-button label="week">本周</el-radio-button>
<el-radio-button label="month">本月</el-radio-button>
<el-radio-button label="custom">自定义</el-radio-button>
</el-radio-group>
<el-date-picker v-model="query.createdAt" type="daterange" range-separator="至" start-placeholder="开始日期"
end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" value-format="yyyyMMdd">
</el-date-picker>
<el-form-item>
<el-button type="primary" @click="getTableData">查询</el-button>
<el-button @click="resetHandle">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="head-container">
<el-table :data="tableData.data" v-loading="tableData.loading" v-if="orderType == 1">
<el-table-column type="index" width="50">
</el-table-column>
<el-table-column label="商户名称" prop="merchantName"> </el-table-column>
<el-table-column label="打印机编号" prop="printNo"></el-table-column>
<el-table-column label="职员名称" prop="staffName"></el-table-column>
<el-table-column label="订单数量" prop="orderNum"></el-table-column>
<el-table-column label="应交金额" prop="payable"></el-table-column>
<el-table-column label="上交金额" prop="handIn"></el-table-column>
<el-table-column label="快捷收款金额" prop="quickAmount"></el-table-column>
<el-table-column label="退款金额" prop="returnAmount"></el-table-column>
<el-table-column label="总收入" prop="totalAmount"></el-table-column>
<el-table-column label="备用金" prop="imprest"></el-table-column>
<el-table-column label="开始时间" prop="createTime">
<template v-slot="scope">
<div>
{{ scope.row.createTime }}
</div>
</template>
</el-table-column>
<el-table-column label="交班时间" prop="endTime">
<template v-slot="scope">
<div>
{{ scope.row.createTime }}
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-container">
<el-pagination :total="tableData.total" :current-page="tableData.page + 1" :page-size="tableData.size"
@current-change="paginationChange" @size-change="sizeChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
</div>
</div>
</template>
<script>
import { tbHandoverGet } from '@/api/homes/record.js'
import dayjs from "dayjs";
export default {
data() {
return {
timeValue: "",
resetQuery: null,
orderType: "1",
categorys: [],
query: {
createdAt: [],
proName: '',
cateId: ''
},
tableData: {
data: [],
page: 0,
size: 10,
loading: false,
total: 0
},
payCountList: "",
payCountTotal: 0
};
},
filters: {
timeFilter(s) {
return dayjs(s).format("YYYY-MM-DD");
}
},
mounted() {
this.resetQuery = { ...this.query };
this.getTableData();
},
methods: {
//携带table id跳转到订单列表页面
toTableOrderList(data) {
console.log(data)
this.$router.push({
path: '/order_manage/order_list',
query: {
tableName: data.tableName
}
})
},
// 重置查询
resetHandle() {
this.timeValue = "";
this.query = { ...this.resetQuery };
this.page = 0;
this.getTableData();
},
// 分页大小改变
sizeChange(e) {
this.tableData.size = e;
this.getTableData();
},
// 分页回调
paginationChange(e) {
this.tableData.page = e - 1;
this.getTableData();
},
async getTableData() {
this.tableData.loading = true;
try {
let urlData = null
if (this.query.createdAt.length == 0) { // 为什么这么写 因为后端让我有时候传key值有时候不传 为啥不按照框架走后端处理起来太麻烦 前端处理 -- 魏文政 2024.7.30 15:50
urlData = `/api/tbHandover?page=${this.tableData.page + 1}&size=${this.tableData.size}&shopId=${localStorage.getItem("shopId")}`
} else {
urlData = `/api/tbHandover?page=${this.tableData.page + 1}&size=${this.tableData.size}&shopId=${localStorage.getItem("shopId")}&tradeDay=${this.query.createdAt[0] ? this.query.createdAt[0] : ''}&tradeDay=${this.query.createdAt[1] ? this.query.createdAt[1] : ''}`
}
const res = await tbHandoverGet(urlData);
this.tableData.loading = false;
this.tableData.data = res.content;
this.tableData.total = res.totalElements;
} catch (error) {
console.log(error);
}
},
// 切换时间
timeChange(e) {
// const format = ["YYYY-MM-DD 00:00:00", "YYYY-MM-DD 23:59:59"];
const format = ["YYYYMMDD", "YYYYMMDD"];
switch (e) {
case "":
// 全部
this.query.createdAt = [];
break;
case "0":
// 今天
this.query.createdAt = [
dayjs().format(format[0]),
dayjs().format(format[1])
];
break;
case "-1":
// 昨天
this.query.createdAt = [
dayjs()
.add(-1, "d")
.format(format[0]),
dayjs()
.add(-1, "d")
.format(format[1])
];
break;
case "-7":
// 最近7天
this.query.createdAt = [
dayjs()
.add(-7, "d")
.format(format[0]),
dayjs().format(format[1])
];
break;
case "-30":
// 最近7天
this.query.createdAt = [
dayjs()
.add(-30, "d")
.format(format[0]),
dayjs().format(format[1])
];
break;
case "week":
// 本周
this.query.createdAt = [
dayjs()
.startOf("week")
.format(format[0]),
dayjs()
.endOf("week")
.format(format[1])
];
break;
case "month":
// 本周
this.query.createdAt = [
dayjs()
.startOf("month")
.format(format[0]),
dayjs()
.endOf("month")
.format(format[1])
];
break;
case "custom":
// 自定义
this.query.createdAt = [];
break;
default:
break;
}
}
}
};
</script>
<style scoped lang="scss">
.cursor-pointer {
cursor: pointer;
color: #1890ff;
transition: all 0.3s;
}
.cursor-pointer:hover {
opacity: .7;
}
.collect_wrap {
display: flex;
gap: 14px;
.item {
flex: 1;
display: flex;
align-items: center;
background-color: #f5f5f5;
padding: 20px;
.icon_wrap {
$size: 34px;
$border: 6px;
width: $size;
height: $size;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--bg-color);
border-radius: 50%;
position: relative;
&::after {
content: "";
width: $size + $border;
height: $size + $border;
border-radius: 50%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: var(--bg-color);
opacity: 0.3;
}
.icon {
font-size: 16px;
color: #fff;
}
.img {
width: 20px;
height: 20px;
}
}
.info {
flex: 1;
display: flex;
flex-direction: column;
padding-left: 10px;
.m {
font-weight: bold;
}
.t {
font-size: 12px;
color: #999;
padding-top: 4px;
}
}
}
}
.refund {
color: #ff9731;
font-weight: bold;
}
.table_order_info {
.order_no {
color: #999;
}
.type {
color: #e6a23c;
}
}
.goods_info {
.row {
display: flex;
&:not(:first-child) {
margin-top: 10px;
}
.cover {
width: 40px;
height: 40px;
}
.info {
flex: 1;
display: flex;
flex-direction: column;
padding-left: 10px;
.sku {
color: #999;
}
}
}
}
</style>

View File

@@ -24,6 +24,11 @@
</div> </div>
<div class="head-container"> <div class="head-container">
<el-table :data="tableData.list" v-loading="tableData.loading"> <el-table :data="tableData.list" v-loading="tableData.loading">
<el-table-column label="规格名称" prop="specSnap" v-if="goods.specSnap">
<template v-slot="scope">
<span v-if="scope.row.specSnap"> {{ scope.row.specSnap }}</span>
</template>
</el-table-column>
<el-table-column label="类型"> <el-table-column label="类型">
<template v-slot="scope"> <template v-slot="scope">
<el-tag type="info">{{ scope.row.type }}</el-tag> <el-tag type="info">{{ scope.row.type }}</el-tag>
@@ -134,6 +139,7 @@ export default {
async show(obj) { async show(obj) {
this.dialogVisible = true this.dialogVisible = true
this.goods = obj this.goods = obj
console.log(obj)
this.tbProductStockDetailSum() this.tbProductStockDetailSum()
await this.getTableData() await this.getTableData()
}, },

View File

@@ -33,6 +33,7 @@
<script> <script>
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { formatDecimal } from '@/utils/index.js'
import { tbProductStockOperateDetail } from '@/api/invoicing' import { tbProductStockOperateDetail } from '@/api/invoicing'
export default { export default {
data() { data() {
@@ -54,12 +55,11 @@ export default {
methods: { methods: {
//返回现有库存数量 //返回现有库存数量
returnNowHasNumbr(row) { returnNowHasNumbr(row) {
const subType=this.tableData.detail.subType||1 const subType = this.tableData.detail.subType || 1
console.log(row) if (!row.hasOwnProperty('number')) {
if(!row.hasOwnProperty('number')){
return '' return ''
} }
return row.stockNumber * 1 + row.number * subType + row.unitName return formatDecimal(parseFloat(row.stockNumber * 1 + row.number * subType + row.unitName), 2, true)
}, },
show(row) { show(row) {
this.dialogVisible = true this.dialogVisible = true
@@ -72,7 +72,7 @@ export default {
const res = await tbProductStockOperateDetail(id) const res = await tbProductStockOperateDetail(id)
this.tableData.loading = false this.tableData.loading = false
this.tableData.detail = res this.tableData.detail = res
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }

View File

@@ -304,7 +304,6 @@ export default {
this.inTabValue = value this.inTabValue = value
this.shopTypesActive = 0 this.shopTypesActive = 0
this.resetHandle() this.resetHandle()
this.queryForm.type = type
}, },
// 计算耗材总价 // 计算耗材总价
consCountTotal(cvalue, row, key1, key2 = undefined) { consCountTotal(cvalue, row, key1, key2 = undefined) {
@@ -415,6 +414,11 @@ export default {
resetHandle() { resetHandle() {
this.showResult = false this.showResult = false
this.queryForm = { ...this.resetForm } this.queryForm = { ...this.resetForm }
if (this.inTabValue == 'goods') {
this.queryForm.type = this.shopTypes[this.shopTypesActive].value
} else {
this.queryForm.type = this.inTabs.find(item => item.value == this.inTabValue).type
}
this.tableData.list = [] this.tableData.list = []
this.$refs.queryForm.resetFields() this.$refs.queryForm.resetFields()
}, },

View File

@@ -409,6 +409,11 @@ export default {
resetHandle() { resetHandle() {
this.showResult = false this.showResult = false
this.queryForm = { ...this.resetForm } this.queryForm = { ...this.resetForm }
if (this.inTabValue == 'goods') {
this.queryForm.type = this.shopTypes[this.shopTypesActive].value
} else {
this.queryForm.type = this.inTabs.find(item => item.value == this.inTabValue).type
}
this.tableData.list = [] this.tableData.list = []
this.$refs.queryForm.resetFields() this.$refs.queryForm.resetFields()
}, },

View File

@@ -5,6 +5,17 @@
<h3 class="title"> <h3 class="title">
银收客后台管理 银收客后台管理
</h3> </h3>
<el-form-item>
<el-radio-group v-model="loginForm.loginType">
<el-radio-button label="merchant">商户</el-radio-button>
<el-radio-button label="staff">员工</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item prop="merchantName" v-if="loginForm.loginType == 'staff'">
<el-input v-model="loginForm.merchantName" type="text" auto-complete="off" placeholder="商户号">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
</el-input>
</el-form-item>
<el-form-item prop="username"> <el-form-item prop="username">
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号"> <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" /> <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
@@ -27,9 +38,11 @@
</div> </div>
</div> </div>
</el-form-item> </el-form-item>
<el-checkbox v-model="loginForm.rememberMe" style="margin:0 0 25px 0;"> <!-- <el-form-item>
记住我 <el-checkbox v-model="loginForm.rememberMe">
</el-checkbox> 记住我
</el-checkbox>
</el-form-item> -->
<el-form-item style="width:100%;"> <el-form-item style="width:100%;">
<el-button :loading="loading" size="medium" type="primary" style="width:100%;" <el-button :loading="loading" size="medium" type="primary" style="width:100%;"
@click.native.prevent="handleLogin"> @click.native.prevent="handleLogin">
@@ -66,12 +79,15 @@ export default {
password: '', password: '',
rememberMe: false, rememberMe: false,
code: '', code: '',
uuid: '' uuid: '',
merchantName: '',
loginType: 'merchant'
}, },
loginRules: { loginRules: {
username: [{ required: true, trigger: 'blur', message: '用户名不能为空' }], username: [{ required: true, trigger: 'blur', message: '用户名不能为空' }],
password: [{ required: true, trigger: 'blur', message: '密码不能为空' }], password: [{ required: true, trigger: 'blur', message: '密码不能为空' }],
code: [{ required: true, trigger: 'change', message: '验证码不能为空' }] code: [{ required: true, trigger: 'change', message: '验证码不能为空' }],
merchantName: [{ required: true, trigger: 'change', message: '商户号不能为空' }]
}, },
loading: false, loading: false,
redirect: undefined redirect: undefined
@@ -95,10 +111,10 @@ export default {
created() { created() {
// 获取验证码 // 获取验证码
this.getCode() this.getCode()
// 获取用户名密码等Cookie // // 获取用户名密码等Cookie
this.getCookie() // this.getCookie()
// token 过期提示 // // token 过期提示
this.point() // this.point()
}, },
methods: { methods: {
getCode() { getCode() {
@@ -119,32 +135,39 @@ export default {
username: username === undefined ? this.loginForm.username : username, username: username === undefined ? this.loginForm.username : username,
password: password, password: password,
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe), rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
code: '' code: '',
merchantName: '',
loginType: 'merchant'
} }
}, },
handleLogin() { handleLogin() {
this.$refs.loginForm.validate(valid => { this.$refs.loginForm.validate(valid => {
const user = { // const user = {
username: this.loginForm.username, // username: this.loginForm.username,
password: this.loginForm.password, // password: this.loginForm.password,
rememberMe: this.loginForm.rememberMe, // rememberMe: this.loginForm.rememberMe,
code: this.loginForm.code, // code: this.loginForm.code,
uuid: this.loginForm.uuid // uuid: this.loginForm.uuid,
} // merchantName: this.loginForm.merchantName,
if (user.password !== this.cookiePass) { // loginType: this.loginForm.loginType
user.password = encrypt(user.password) // }
} // if (user.password !== this.cookiePass) {
// user.password = encrypt(user.password)
// }
if (valid) { if (valid) {
this.loading = true this.loading = true
if (user.rememberMe) { // if (user.rememberMe) {
Cookies.set('username', user.username, { expires: Config.passCookieExpires }) // Cookies.set('username', user.username, { expires: Config.passCookieExpires })
Cookies.set('password', user.password, { expires: Config.passCookieExpires }) // Cookies.set('password', user.password, { expires: Config.passCookieExpires })
Cookies.set('rememberMe', user.rememberMe, { expires: Config.passCookieExpires }) // Cookies.set('rememberMe', user.rememberMe, { expires: Config.passCookieExpires })
} else { // } else {
Cookies.remove('username') // Cookies.remove('username')
Cookies.remove('password') // Cookies.remove('password')
Cookies.remove('rememberMe') // Cookies.remove('rememberMe')
} // }
// console.log(user);
const user = { ...this.loginForm }
user.password = encrypt(user.password)
this.$store.dispatch('Login', user).then(() => { this.$store.dispatch('Login', user).then(() => {
this.loading = false this.loading = false
this.$router.push({ path: this.redirect || '/' }) this.$router.push({ path: this.redirect || '/' })
@@ -217,10 +240,12 @@ export default {
text-align: center; text-align: center;
color: #bfbfbf; color: #bfbfbf;
} }
.code_wrap { .code_wrap {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
.login-code { .login-code {
width: 33%; width: 33%;
display: inline-block; display: inline-block;

View File

@@ -16,6 +16,9 @@
<el-form-item label="商品名称" prop="name"> <el-form-item label="商品名称" prop="name">
<el-input v-model="form.name" placeholder="请输入商品名称" style="width: 500px;"></el-input> <el-input v-model="form.name" placeholder="请输入商品名称" style="width: 500px;"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="商品介绍" prop="shortTitle">
<el-input v-model="form.shortTitle" type="textarea" placeholder="请输入商品介绍" style="width: 500px;"></el-input>
</el-form-item>
<el-form-item label="单位" prop="unitId"> <el-form-item label="单位" prop="unitId">
<el-select v-model="form.unitId" placeholder="请选择单位" style="width: 500px;" @change="selectUnitt"> <el-select v-model="form.unitId" placeholder="请选择单位" style="width: 500px;" @change="selectUnitt">
<el-option :label="item.name" :value="item.id" v-for="item in units" :key="item.id"></el-option> <el-option :label="item.name" :value="item.id" v-for="item in units" :key="item.id"></el-option>
@@ -89,38 +92,48 @@
<el-table :data="form.skuList" border> <el-table :data="form.skuList" border>
<el-table-column label="售价" prop="salePrice"> <el-table-column label="售价" prop="salePrice">
<template v-slot="scope"> <template v-slot="scope">
<el-input-number @change="priceFormat(scope.row,'salePrice')" @blur="priceFormat(scope.row,'salePrice')" v-model="scope.row.salePrice" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'salePrice')" @blur="priceFormat(scope.row, 'salePrice')"
v-model="scope.row.salePrice" controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="会员价" prop="memberPrice"> <el-table-column label="会员价" prop="memberPrice">
<template v-slot="scope"> <template v-slot="scope">
<el-input-number @change="priceFormat(scope.row,'memberPrice')" @blur="priceFormat(scope.row,'memberPrice')" v-model="scope.row.memberPrice" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'memberPrice')"
@blur="priceFormat(scope.row, 'memberPrice')" v-model="scope.row.memberPrice"
controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="成本价" prop="costPrice"> <el-table-column label="成本价" prop="costPrice">
<template v-slot="scope"> <template v-slot="scope">
<el-input-number @change="priceFormat(scope.row,'costPrice')" @blur="priceFormat(scope.row,'costPrice')" v-model="scope.row.costPrice" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'costPrice')" @blur="priceFormat(scope.row, 'costPrice')"
v-model="scope.row.costPrice" controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="原价" prop="originPrice"> <el-table-column label="原价" prop="originPrice">
<template v-slot="scope"> <template v-slot="scope">
<el-input-number @change="priceFormat(scope.row,'originPrice')" @blur="priceFormat(scope.row,'originPrice')" v-model="scope.row.originPrice" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'originPrice')"
@blur="priceFormat(scope.row, 'originPrice')" v-model="scope.row.originPrice"
controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="起售数量" prop="suit"> <el-table-column label="起售数量" prop="suit">
<template slot-scope="scope"> <template slot-scope="scope">
<el-input-number @change="priceFormat(scope.row,'suit')" @blur="priceFormat(scope.row,'suit')" v-model="scope.row.suit" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'suit')" @blur="priceFormat(scope.row, 'suit')"
v-model="scope.row.suit" controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="库存数量" prop="stockNumber"> <el-table-column label="库存数量" prop="stockNumber">
<template v-slot="scope"> <template v-slot="scope">
<el-input-number @change="priceFormat(scope.row,'stockNumber')" @blur="priceFormat(scope.row,'stockNumber')" v-model="scope.row.stockNumber" :disabled="!!form.id" <el-input-number @change="priceFormat(scope.row, 'stockNumber')"
@blur="priceFormat(scope.row, 'stockNumber')" v-model="scope.row.stockNumber" :disabled="!!form.id"
controls-position="right"></el-input-number> controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="分销金额" prop="firstShared"> <el-table-column label="分销金额" prop="firstShared">
<template v-slot="scope"> <template v-slot="scope">
<el-input-number @change="priceFormat(scope.row,'firstShared')" @blur="priceFormat(scope.row,'firstShared')" v-model="scope.row.firstShared" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'firstShared')"
@blur="priceFormat(scope.row, 'firstShared')" v-model="scope.row.firstShared"
controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="商品条码"> <el-table-column label="商品条码">
@@ -201,7 +214,8 @@
<i class="icon el-icon-edit" @click="batchNumber('salePrice')"></i> <i class="icon el-icon-edit" @click="batchNumber('salePrice')"></i>
</template> </template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input-number @change="priceFormat(scope.row,'salePrice')" @blur="priceFormat(scope.row,'salePrice')" v-model="scope.row.salePrice" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'salePrice')" @blur="priceFormat(scope.row, 'salePrice')"
v-model="scope.row.salePrice" controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="会员价" prop="memberPrice"> <el-table-column label="会员价" prop="memberPrice">
@@ -210,7 +224,9 @@
<i class="icon el-icon-edit" @click="batchNumber('memberPrice')"></i> <i class="icon el-icon-edit" @click="batchNumber('memberPrice')"></i>
</template> </template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input-number @change="priceFormat(scope.row,'memberPrice')" @blur="priceFormat(scope.row,'memberPrice')" v-model="scope.row.memberPrice" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'memberPrice')"
@blur="priceFormat(scope.row, 'memberPrice')" v-model="scope.row.memberPrice"
controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="成本价" prop="costPrice"> <el-table-column label="成本价" prop="costPrice">
@@ -219,7 +235,8 @@
<i class="icon el-icon-edit" @click="batchNumber('costPrice')"></i> <i class="icon el-icon-edit" @click="batchNumber('costPrice')"></i>
</template> </template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input-number @change="priceFormat(scope.row,'costPrice')" @blur="priceFormat(scope.row,'costPrice')" v-model="scope.row.costPrice" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'costPrice')" @blur="priceFormat(scope.row, 'costPrice')"
v-model="scope.row.costPrice" controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="原价" prop="originPrice"> <el-table-column label="原价" prop="originPrice">
@@ -228,7 +245,9 @@
<i class="icon el-icon-edit" @click="batchNumber('originPrice')"></i> <i class="icon el-icon-edit" @click="batchNumber('originPrice')"></i>
</template> </template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input-number @change="priceFormat(scope.row,'originPrice')" @blur="priceFormat(scope.row,'originPrice')" v-model="scope.row.originPrice" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'originPrice')"
@blur="priceFormat(scope.row, 'originPrice')" v-model="scope.row.originPrice"
controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="起售数量" prop="suit"> <el-table-column label="起售数量" prop="suit">
@@ -237,7 +256,8 @@
<i class="icon el-icon-edit" @click="batchNumber('suit')"></i> <i class="icon el-icon-edit" @click="batchNumber('suit')"></i>
</template> </template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input-number @change="priceFormat(scope.row,'originsuitrice')" @blur="priceFormat(scope.row,'suit')" v-model="scope.row.suit" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'originsuitrice')" @blur="priceFormat(scope.row, 'suit')"
v-model="scope.row.suit" controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="库存数量" prop="stockNumber"> <el-table-column label="库存数量" prop="stockNumber">
@@ -246,7 +266,8 @@
<i class="icon el-icon-edit" @click="batchNumber('stockNumber')" v-if="!form.id"></i> <i class="icon el-icon-edit" @click="batchNumber('stockNumber')" v-if="!form.id"></i>
</template> </template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input-number @change="priceFormat(scope.row,'stockNumber')" @blur="priceFormat(scope.row,'stockNumber')" v-model="scope.row.stockNumber" :disabled="!!scope.row.id" <el-input-number @change="priceFormat(scope.row, 'stockNumber')"
@blur="priceFormat(scope.row, 'stockNumber')" v-model="scope.row.stockNumber" :disabled="!!scope.row.id"
controls-position="right"></el-input-number> controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
@@ -256,7 +277,9 @@
<i class="icon el-icon-edit" @click="batchNumber('firstShared')"></i> <i class="icon el-icon-edit" @click="batchNumber('firstShared')"></i>
</template> </template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input-number @change="priceFormat(scope.row,'firstShared')" @blur="priceFormat(scope.row,'firstShared')" v-model="scope.row.firstShared" controls-position="right"></el-input-number> <el-input-number @change="priceFormat(scope.row, 'firstShared')"
@blur="priceFormat(scope.row, 'firstShared')" v-model="scope.row.firstShared"
controls-position="right"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="商品条码"> <el-table-column label="商品条码">
@@ -304,13 +327,15 @@
<div class="tips">开启后: 收银完成后会自动打印对应数量的标签数</div> <div class="tips">开启后: 收银完成后会自动打印对应数量的标签数</div>
</el-form-item> </el-form-item>
<el-form-item label="打包费"> <el-form-item label="打包费">
<el-input-number @change="priceFormat(form,'packFee')" @blur="priceFormat(form,'packFee')" v-model="form.packFee" controls-position="right" ></el-input-number> <el-input-number @change="priceFormat(form, 'packFee')" @blur="priceFormat(form, 'packFee')"
v-model="form.packFee" controls-position="right"></el-input-number>
<div class="tips"> <div class="tips">
单份商品打包费店铺开启外卖模式下该数据才生效 单份商品打包费店铺开启外卖模式下该数据才生效
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="虚拟销量"> <el-form-item label="虚拟销量">
<el-input-number @change="priceFormat(form,'baseSalesNumber')" @blur="priceFormat(form,'baseSalesNumber')" v-model="form.baseSalesNumber" controls-position="right" ></el-input-number> <el-input-number @change="priceFormat(form, 'baseSalesNumber')" @blur="priceFormat(form, 'baseSalesNumber')"
v-model="form.baseSalesNumber" controls-position="right"></el-input-number>
</el-form-item> </el-form-item>
</template> </template>
<el-form-item label="排序" v-if="form.id"> <el-form-item label="排序" v-if="form.id">
@@ -324,8 +349,9 @@
<el-dialog title="批量修改" width="400px" :visible.sync="showBatchModal"> <el-dialog title="批量修改" width="400px" :visible.sync="showBatchModal">
<el-form :model="batchNumberForm"> <el-form :model="batchNumberForm">
<el-form-item> <el-form-item>
<el-input-number v-model="batchNumberForm.batchNumber" :min="0" controls-position="right" <el-input-number @change="priceFormat(batchNumberForm, 'batchNumber')"
style="width: 100%;"></el-input-number> @blur="priceFormat(batchNumberForm, 'batchNumber')" v-model="batchNumberForm.batchNumber"
controls-position="right" style="width: 100%;"></el-input-number>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
@@ -396,6 +422,9 @@ export default {
stockNumber: 0, stockNumber: 0,
firstShared: 0, firstShared: 0,
barCode: `${localStorage.getItem("shopId")}${dayjs().valueOf()}`, barCode: `${localStorage.getItem("shopId")}${dayjs().valueOf()}`,
isGrounding: 1,
productId: this.$route.query.goods_id,
shopId: localStorage.getItem("shopId")
// suit: 1 // suit: 1
}, },
tableAddShopIndex: null, tableAddShopIndex: null,
@@ -406,6 +435,7 @@ export default {
id: "", id: "",
typeEnum: "normal", typeEnum: "normal",
name: "", name: "",
shortTitle: "",//商品介绍
unitId: "", unitId: "",
unitName: "", unitName: "",
categoryId: "", // 商品分类id categoryId: "", // 商品分类id
@@ -535,15 +565,15 @@ export default {
const max=100000000; const max=100000000;
const newval=formatPrice(item[key],min,max,true) const newval=formatPrice(item[key],min,max,true)
console.log(newval) console.log(newval)
if(typeof newval!=='number'){ if (typeof newval !== 'number') {
item[key]=newval.value item[key] = newval.value
this.$message({ this.$message({
offset, offset,
message: `请输入${min}${max}范围内的数字`, message: `请输入${min}${max}范围内的数字`,
type: "error" type: "error"
}); });
}else{ } else {
item[key]=newval item[key] = newval
} }
}) })
}, },
@@ -572,8 +602,14 @@ export default {
}, },
// 确认批量修改规格 // 确认批量修改规格
batchNumberFormConfirm() { batchNumberFormConfirm() {
this.form.skuList.map(item => { console.log(this.form.skuList)
item[this.batchNumberKey] = this.batchNumberForm.batchNumber; this.form.skuList.map((item, index) => {
//解决vue2列表数据更新视图未变化问题
let newitem = { ...item }
newitem[this.batchNumberKey] = this.batchNumberForm.batchNumber;
this.$set(this.form.skuList, index, { ...newitem })
// item[this.batchNumberKey] = this.batchNumberForm.batchNumber;
}); });
this.showBatchModal = false; this.showBatchModal = false;
this.batchNumberForm.batchNumber = 0; this.batchNumberForm.batchNumber = 0;
@@ -605,11 +641,12 @@ export default {
this.form.skuList = skuList.map((item, index) => { this.form.skuList = skuList.map((item, index) => {
specInfo[index].id = item.id; specInfo[index].id = item.id;
specInfo[index].productId = item.productId; specInfo[index].productId = item.productId;
specInfo[index].realSalesNumber = item.productId; specInfo[index].realSalesNumber = item.realSalesNumber;
specInfo[index].shopId = item.shopId; specInfo[index].shopId = item.shopId;
specInfo[index].warnLine = item.warnLine; specInfo[index].warnLine = item.warnLine;
specInfo[index].suit = item.suit; specInfo[index].suit = item.suit;
specInfo[index].stockNumber = item.stockNumber; specInfo[index].stockNumber = item.stockNumber;
specInfo[index].isGrounding = item.isGrounding;
return specInfo[index]; return specInfo[index];
}); });
console.log(this.form.skuList); console.log(this.form.skuList);

View File

@@ -0,0 +1,180 @@
<template>
<el-dialog :title="title" :visible.sync="dialogVisible" @open="reset">
<el-form ref="form" :model="form" :rules="rules" label-width="140px" label-position="left">
<el-form-item label="员工姓名" prop="name">
<el-input v-model="form.name" placeholder="请输入员工姓名" />
</el-form-item>
<el-form-item label="员工编号" prop="code">
<el-input v-model="form.code" placeholder="请输入员工编号" />
</el-form-item>
<el-form-item label="手机号" prop="phone">
<el-input v-model="form.phone" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="员工账号" prop="account">
<el-input v-model="form.account" placeholder="请输入员工账号,建议使用手机号" />
</el-form-item>
<el-form-item label="登录密码">
<el-input type="password" v-model="form.password" placeholder="请输入登录密码不填默认123456" />
</el-form-item>
<el-form-item label="最大优惠金额">
<el-input-number v-model="form.maxDiscountAmount" controls-position="right" :min="0"
:max="100000"></el-input-number>
</el-form-item>
<el-form-item label="角色" prop="roleId">
<el-select v-model="form.roleId" placeholder="请选择角色">
<el-option :label="item.name" :value="item.id" v-for="item in roles" :key="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="允许登录PC桌面端">
<el-switch v-model="form.isPc" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<el-form-item label="允许登录管理端">
<el-switch v-model="form.isManage" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<el-form-item label="是否启用">
<el-switch v-model="form.status" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" :loading="loading" @click="onSubmitHandle"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { tbPlussShopStaff, rolesGet, tbPlussShopStaffDetail } from '@/api/shop.js'
export default {
data() {
return {
dialogVisible: false,
loading: false,
form: {
id: '',
name: '',
code: '',
account: '',
maxDiscountAmount: '',
status: 1,
isPc: 1,
isManage: 1,
roleId: '',
phone: '',
password: ''
},
resetForm: '',
rules: {
name: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
code: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
account: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
maxDiscountAmount: [
{
required: true,
message: ' ',
trigger: 'blur'
}
],
roleId: [
{
required: true,
message: ' ',
trigger: 'change'
}
],
phone: [
{
required: true,
message: ' ',
trigger: 'blur'
}
]
},
roles: []
}
},
computed: {
title() {
return this.form.id ? '编辑员工' : '添加员工'
}
},
mounted() {
this.resetForm = { ...this.form }
this.rolesGet()
},
methods: {
// 添加或编辑员工
onSubmitHandle() {
this.$refs.form.validate(async valid => {
if (valid) {
try {
this.loading = true
await tbPlussShopStaff(this.form)
this.loading = false
this.$emit('success')
this.close()
this.$notify({
title: '成功',
message: `${this.title}成功`,
type: 'success'
});
} catch (error) {
this.loading = false
console.log(error);
}
}
})
},
// 获取角色列表
async rolesGet() {
try {
const { content } = await rolesGet()
this.roles = content
} catch (error) {
console.log(error);
}
},
reset() {
this.form = { ...this.resetForm }
},
close() {
this.dialogVisible = false
},
show(row) {
this.dialogVisible = true
if (row && row.id) {
// this.form = { ...row }
this.tbPlussShopStaffDetail(row.id)
} else {
this.reset()
}
},
// 通过id获取员工信息
async tbPlussShopStaffDetail(id) {
try {
const res = await tbPlussShopStaffDetail(id)
this.form = res
} catch (error) {
console.log(error);
}
}
}
}
</script>

View File

@@ -0,0 +1,123 @@
<template>
<div class="app-container">
<div class="head-container">
<el-button type="primary" icon="el-icon-plus" @click="$refs.addStaff.show()">
添加员工
</el-button>
</div>
<div class="head-container">
<el-table :data="tableData.list" v-loading="tableData.loading">
<el-table-column label="员工名称" prop="name"></el-table-column>
<el-table-column label="员工编号" prop="code"></el-table-column>
<el-table-column label="员工账号" prop="account"></el-table-column>
<el-table-column label="是否启用" prop="status">
<template v-slot="scope">
<el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0"
@change="statusChange($event, scope.row)"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="120">
<template v-slot="scope">
<div class="btn_rows" style="display: flex;gap: 10px;">
<el-button type="text" icon="el-icon-edit"
@click="$refs.addStaff.show(scope.row)">编辑</el-button>
<el-popconfirm title="确定删除吗?" @confirm="delTableHandle([scope.row.id])">
<el-button type="text" icon="el-icon-delete" slot="reference">删除</el-button>
</el-popconfirm>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-container">
<el-pagination @size-change="paginationSizeChange" :total="tableData.total"
:current-page="tableData.page + 1" :page-size="tableData.size" @current-change="paginationChange"
layout="total, sizes, prev, pager, next, jumper"></el-pagination>
</div>
<addStaff ref="addStaff" @success="resetHandle" />
</div>
</template>
<script>
import addStaff from './components/addStaff.vue'
import { tbPlussShopStaffGet, updateStatus, shopStaffDelete } from '@/api/shop.js'
export default {
components: {
addStaff
},
data() {
return {
query: {},
tableData: {
page: 0,
size: 30,
total: 0,
loading: false,
list: []
}
}
},
mounted() {
this.getTableData()
},
methods: {
// 删除
async delTableHandle(ids) {
try {
const res = await shopStaffDelete(ids)
this.$notify({
title: '成功',
message: `已删除`,
type: 'success'
});
this.getTableData()
} catch (error) {
console.log(error);
}
},
// 修改员工状态
async statusChange(e, row) {
try {
const res = await updateStatus({
id: row.id,
status: e
})
this.getTableData()
} catch (error) {
console.log(error);
}
},
// 重置查询
resetHandle() {
this.tableData.page = 0
this.getTableData()
},
// 每页条数改变是回调
paginationSizeChange(e) {
this.tableData.size = e
this.tableData.page = 0
this.getTableData()
},
// 分页回调
paginationChange(e) {
this.tableData.page = e - 1
this.getTableData()
},
// 获取员工列表
async getTableData() {
try {
this.tableData.loading = true
const res = await tbPlussShopStaffGet({
page: this.tableData.page,
size: this.tableData.size
})
this.tableData.loading = false
this.tableData.list = res.content
this.tableData.total = res.totalElements
} catch (error) {
console.log(error)
}
}
}
}
</script>