初始化

master
Sigo 4 years ago
commit 837593993d

@ -0,0 +1,18 @@
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2"
],
"plugins": ["transform-vue-jsx", "transform-runtime"],
"env": {
"test": {
"presets": ["env", "stage-2"],
"plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"]
}
}
}

@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

@ -0,0 +1,5 @@
/build/
/config/
/dist/
/*.js
/test/unit/coverage/

@ -0,0 +1,29 @@
// https://eslint.org/docs/user-guide/configuring
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint'
},
env: {
browser: true,
},
extends: [
// https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
// consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
'plugin:vue/essential',
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
'standard'
],
// required to lint *.vue files
plugins: [
'vue'
],
// add your custom rules here
rules: {
// allow async-await
'generator-star-spacing': 'off',
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
}
}

17
.gitignore vendored

@ -0,0 +1,17 @@
.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/test/unit/coverage/
/test/e2e/reports/
selenium-debug.log
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

@ -0,0 +1,10 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}

@ -0,0 +1,30 @@
# vue
> A Vue.js project
## Build Setup
``` bash
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
# run unit tests
npm run unit
# run e2e tests
npm run e2e
# run all tests
npm test
```
For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).

@ -0,0 +1,41 @@
'use strict'
require('./check-versions')()
process.env.NODE_ENV = 'production'
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
const spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
})
})

@ -0,0 +1,54 @@
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
}
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}

@ -0,0 +1,43 @@
// Modules to control application life and create native browser window
const {app, BrowserWindow} = require('electron')
const path = require('path')
function createWindow () {
// Create the browser window.
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})
// and load the index.html of the app.
mainWindow.loadFile('index.html')
// Open the DevTools.
// mainWindow.webContents.openDevTools()
}
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(() => {
createWindow()
app.on('activate', function () {
// On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') app.quit()
})
// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

@ -0,0 +1,102 @@
'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: options.sourceMap
}
}
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader',
publicPath: '../../'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader,
})
}
return output
}
exports.createNotifierCallback = () => {
const notifier = require('node-notifier')
return (severity, errors) => {
if (severity !== 'error') return
const error = errors[0]
const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
subtitle: filename || '',
icon: path.join(__dirname, 'logo.png')
})
}
}

@ -0,0 +1,22 @@
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap
module.exports = {
loaders: utils.cssLoaders({
sourceMap: sourceMapEnabled,
extract: isProduction
}),
cssSourceMap: sourceMapEnabled,
cacheBusting: config.dev.cacheBusting,
transformToRequire: {
video: ['src', 'poster'],
source: 'src',
img: 'src',
image: 'xlink:href'
}
}

@ -0,0 +1,104 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
const webpack = require('webpack')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
const createLintingRule = () => ({
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test'),resolve('/node_modules/_element-ui@1.4.10@element-ui/src'),
    resolve('/node_modules/_element-ui@1.4.10@element-ui/packages')],
options: {
formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay
}
})
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
// app: ['./node_modules/babel-polyfill/dist/polyfill','./src/main.js']
app: ['babel-polyfill', './src/main.js']
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? './' +config.build.assetsPublicPath
:'./' + config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
'jquery': 'jquery'
}
},
module: {
rules: [
...(config.dev.useEslint ? [createLintingRule()] : []),
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
},
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery"
})
],
}

@ -0,0 +1,320 @@
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.dev.cssSourceMap,
usePostCSS: true
})
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: {
rewrites: [{
from: /.*/,
to: path.posix.join(config.dev.assetsPublicPath, 'index.html')
}, ],
},
// https:true,
hot: true,
contentBase: false, // since we use CopyWebpackPlugin.
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay ?
{
warnings: false,
errors: true
} :
false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
},
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
// copy custom static assets
new CopyWebpackPlugin([{
from: path.resolve(__dirname, '../static'),
to: config.dev.assetsSubDirectory,
ignore: ['.*']
}])
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
// messages: [
// `
// 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎
// 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎
// 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎 鼎鼎
// 鼎鼎鼎 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎
// 鼎鼎鼎 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎
// 鼎鼎鼎 鼎鼎 鼎鼎
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
// 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
// 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
// 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
// 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
// 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
// 鼎 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
// 鼎鼎鼎鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
// 鼎鼎鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
// 鼎鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
// `,
// `Local: https://192.168.31.193:${port}`,
// `Network: http://${require('ip').address()}:${port}`,
// ],
/**
*
*
* Esc F1 F2 F3 F4 F5 F6 F7 F8 F9F10F11F12 P/SS LP/B
*
*
* ~ `│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│ BacSp │ │Ins│Hom│PUp│ │N L│ / │ * │ - │
*
* Tab Q W E R T Y U I O P { [} ] | \ DelEndPDn 7 8 9
* +
* Caps A S D F G H J K L : ;" ' Enter 4 5 6
*
* Shift Z X C V B N M < ,> .? / Shift 1 2 3
* E
* Ctrl Alt Space Alt Ctrl 0 .
*
*/
messages: [
`
~~~~~~~~~~~~~~~~#######~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~#########~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~############~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~#############~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~##~~###########~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~###~~######~#####~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~###~#######~~~####~~~~~~~~~~~~~~~~~
~~~~~~~~~~~###~~##########~####~~~~~~~~~~~~~~~~
~~~~~~~~~~####~~###########~####~~~~~~~~~~~~~~~
~~~~~~~~#####~~~###########~~#####~~~~~~~~~~~~~
~~~~~~~######~~~###~########~~~#####~~~~~~~~~~~
~~~~~~~#####~~~###~~~########~~~######~~~~~~~~~
~~~~~~######~~~###~~###########~~~######~~~~~~~
~~~~~######~~~####~##############~~######~~~~~~
~~~~#######~~#####################~#######~~~~~
~~~~#######~~##############################~~~~
~~~#######~~######~#################~#######~~~
~~~#######~~######~######~#########~~~######~~~
~~~#######~~~~##~~######~~~######~~~~~######~~~
~~~#######~~~~~~~~######~~~~#####~~~~~#####~~~~
~~~~######~~~~~~~~#####~~~~~#####~~~~~####~~~~~
~~~~~#####~~~~~~~~####~~~~~~####~~~~~###~~~~~~
~~~~~~#####~~~~~~;###~~~~~~~####~~~~~#~~~~~~~~
~~~~~~~~##~~~~~~~####~~~~~~~####~~~~~~~~~~~~~
~~~~~~~~~#~~~~~~~####~~~~~~~####~~~~~~~~~~~~~
`,
`Local: http://192.168.31.35:${port}`,
`Network: http://${require('ip').address()}:${port}`,
],
// messages: [
// `
// MMMMM
// MMMMMM
// MMMMMMM
// MMMMMMMM .
// MMMMMMMMM
// HMMMMMMMMMM
// MMMMMMMMMMMM M
// MMMMMMMMMMMMM M
// MMMMMMMMMMMMM M
// MMMMMMMMMMMMM:
// oMMMMMMMMMMMMMM
// .MMMMMMMMMMMMMMo MMMMMMMMMMMMMMM M
// MMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMM. oMMMMMMMMMMMMMMM.M
// MMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// oMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM: H
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM . MMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMM
// .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMMMMMM
// MM. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMMMMMMMM
// MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM .MMMMMMMMMMMMMM
// MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// .MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMM.MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// HMMMMMMMMMMMMMMMMMMMMM.MMMMMMMMM.MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMM MMM.oMMMMMMM..MMMMMMMMM:MMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMM MM..MMMMMMM...MMMMMMM. MMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMM ..MMMMMM...MMMMMM ..MMMMMMMMMMMMMMMMMMM
// MMMMMMM:M.MMM.M.. MMMMM M..MMMMM...MMMMMMMMMMMMMMMMMM MMM
// MMMM. .M..MM.M...MMMMMM..MMMMM.. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM .
// MMMM..M....M.....:MMM .MMMMMM..MMMMMMM...MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMM.M.. ...M......MM.MMMMM.......MHM.M .MMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMM..MM. . MMM.....MMMMMM.M.....M ..MM..M MMMMMMMMMMMMMMMMMMM
// .MMMMMHMM. ..MMMM. MMM............o..... . .MMMMMMMMMMMMMMM
// MMM. M... .........................M..:.MMMMMMMMMMMM
// oMMM............ .................M.M.MMMMMMMMM
// .....MM........................ . MMMMMM
// M.....M.....................o.MM.MMMMMMMM.
// M........................M.. ...MMMMMMMMMMMMMo
// :....MMM..............MMM..oMMMMMMM
// M...MMM.............MMMMMMM
// .............:MMMMMMMM
// M..... MMM.....M
// M M.............
// ................M
// ooM.................MM MoMMMMMoooM
// MMoooM......................MoooooooH..oMM
// MHooooMoM.....................MMooooooM........M
// oooooooMoooM......... o........MoooooooM............
// Mooooooooooo.......M.........Moooooooo:..............M
// MooMoooooooooM...M........:Mooooooooooo:..............M
// M..oooooooooooo .........Mooooooooooooooo..............M
// M...Mooo:oooooooo.M....ooooooooooooooooooo..M...........M
// ...oooooMoooooooM..Mooooooooooooo:oooooooM.M...........M.
// M...ooooooMoo:ooooMoooooooooooooHoooooooooH:M. ...........:
// M..MoooooooMoooooooooooooooooo:ooooooMooooMoM..............M
// M..ooooooooooMooooooooooooooHoooooooMooHooooM...............M
// ...ooooooooooooooooooo:MooooooooooooooMoMoooM................
// M...oooooooooooooooooooooooooooooooooooooMooMM................M
// ...MooooooooooooooooooooooooooooooooooooooooMo ................
// ...MooooooooooooooooooooooooooooooooooooooooM M................M
// M...ooooooooooooooooooooooooooooooooooooooooM ................M
// ...MoooooooooooooooooooooooooooooooooooooooMM .:...............
// .....MooooooooooooooooooooooooooooooooooooMoo .............M
// M...... ooooooooooooooooooooooooooooooooooooM M..............M
// M........MooooMMM MM MM MMMMMMMMMooooooooM M...............M
// .........HM M: MM :MMMMMM M M...............
// M..........M M MoM M M................M
// M.........:M MoH M M M MooooHoooMM. M M...............M
// M..........Moooo MMooM oooooMooooooooM M..............H
// M.........MooooM Mooo : ooooooMooooMoooM M........ . .o.M
// H.. .....ooooo oooo M MooooooooooooooM M... MMMMMMMMMMM
// MMMMMMMMMMooooM M oooo . ooooooMooooooooM .MMMMMMMMMMMMMMM
// MMMMMMMMMMooooH : ooooH oooooooooooooooo MMMMMMMMMMMMMMM
// MMMMMMMMMMoooo ooooM Moooooooooooooooo .MMMMMMMMMMMMMMM
// MMMMMMMMMMoooo ooooM MooooooooooooooooM MMMMMMMMMMMMMMM
// MMMMMMMMMMoooM ooooM ooooooooooooooooo MMMMMMMMMMM:M
// MMMMMMMMMMoooM MooooM oooooooooooMoooooo MH...........
// . ......Mooo. MooooM oooooooooooooooooo M............M
// M.M......oooo MooooM Moooooooooooooooooo: .........M.....
// M.M.....Moooo MooooM ooooooooooooooooooM .M............
// .......MooooH MooooM oooooooooMoooooooooo M..o...M..o....M
// .o....HMooooM MooooH MooooooooMooooooooooM .:M...M.......M
// M..M.....MoooM :oooo: .MooooooooHooMoooooooooM M M... ..oM.M
// M...M.:.Mooo. MMMMooooo oooooooooooMoooooooooooooM ....M. M
// M:M..o.Moooooooooooooo MooooooooooooooMooooooooooooM .Mo
// MooooooooooooooMooooooooooooMoMoooooooooooooo
// Mooooooooooooooo:ooooooooooooooooooooooooooooo
// ooooooooooooooooMooooooooooMoooooooooooooooooo
// ooooooooooooooooMoooooooooooMooooooooooooooooHo
// ooMooooooooooooooMoooooooooooooooooooooooooooMoM
// MooMoooooooooooooo.ooooooooooooooooooooooooooo:oM
// MoooooooooooooooooooooooooooooooooooooooooooooooM
// MoooMooooooooooooooMooooooooooooooooooooooooooooo.
// MoooMooooooooooooooMoooooooooooooooooooooooooMooooM
// MooooooooooooooooooMoooooooooooooooooooooooooMoooooM
// MooooMoooooooooooooMoooooooooooooooooooooooooMoHooooM
// ooooooMooooooooooooooooooooooooooooooooooooooooMoMoooM
// MooooooooooooooooooooMooooooooooooooooooooooooooMoooooH:
// MoooooooMooooooooooooMoooooooooooooooooooooooooooooHoooM
// MooooooooMoooooooooooMoooooooooooooooooooooooooMoooMooooM
// Moooooooooooooooooooooooooooooooooooooooooooooo.oooMooooo
// MoooooooooooooooooooooooooooooooooooooooooooooMoooooooooM
// MooooooooooooooooooooMoooooooooooooooooooooooooooooooooM
// MooooooooooooooooooooMHooooooooooooooooooooMoooo:ooooo
// MMooooooooooooooooooMoMHoooooooooooooooooooooooMooooo
// MMoooooooooooooooMMooo MMooooooooooooooooooooooooooM
// MMMoooooooooooooMooooo oooooooooooooooooooooMooooo
// MooMMoooooooooMoooMMoM ooooHooooooooooooooooMooooM
// MooooMooooooMooooMoooM MoooooMoooooooooooooMooooo
// ooooooMMooooooooMooooM MoooooooooMooooooooooooooM
// HooooooMoooooooMooooM HoooooooHooMooooooooooooo
// oooMoooooooooHoooM MoooooooooMoooooooooM
// HooooooooooooHM MooooooooMMoooooooM
// MMMMMMMMMMMMMM Moooooo:MooooHMM
// MMMMMMM: ... MMMMMMMMMMMMMM
// M............M MMMMMMMMM ....
// M.MM.......... M.............M
// M ..............MM M..............
// MMMMM............MMMM ..MMMMMMMM ....M
// MMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMM...M
// .MMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMM
// :MMMMMMMMMMMMMMMMMMH MMMMMMMMMMMMMMMMMMM
// By EBEN Jérôme MMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMM
// HMMMMMMMMee
// `,
// `Local: https://192.168.31.193:${port}`,
// `Network: http://${require('ip').address()}:${port}`,
// ],
},
onErrors: config.dev.notifyOnErrors ?
utils.createNotifierCallback() :
undefined
}))
resolve(devWebpackConfig)
}
})
})

@ -0,0 +1,150 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const env = process.env.NODE_ENV === 'testing'
? require('../config/test.env')
: require('../config/prod.env')
const webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true,
usePostCSS: true
})
},
devtool: config.build.productionSourceMap ? config.build.devtool : false,
output: {
path: config.build.assetsRoot,
publicPath:'./',
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false
}
},
sourceMap: config.build.productionSourceMap,
parallel: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css'),
// Setting the following option to `false` will not extract CSS from codesplit chunks.
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
allChunks: true,
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: config.build.productionSourceMap
? { safe: true, map: { inline: false } }
: { safe: true }
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: process.env.NODE_ENV === 'testing'
? 'index.html'
: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// keep module.id stable when vendor modules does not change
new webpack.HashedModuleIdsPlugin(),
// enable scope hoisting
new webpack.optimize.ModuleConcatenationPlugin(),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks (module) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity
}),
// This instance extracts shared chunks from code splitted chunks and bundles them
// in a separate chunk, similar to the vendor chunk
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
async: 'vendor-async',
children: true,
minChunks: 3
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIBhDCB7gIBADBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEh
MB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEB
AQUAA4GNADCBiQKBgQC+T31J/S+vISoAy9B3Rxqjb2at9GXiiESYJ7De8tuD0YCY
XQcn7YdjPGfH9xvw+e6UpuDwJgHbAfrL6Ba6BCQU8LsMZC5upr6f8g9VPpRDxUA3
8jWj0n0We8MIAz/yatrCgfCT4aQi9FUnVGv4BzpOkDSWuFzG/FeRiy4Jl7RZYwID
AQABoAAwDQYJKoZIhvcNAQELBQADgYEAY+lAevCAVaZ+wjMUGU6FghgJHZMN9NqX
54wun3Nss3paWAwjrQTVUXid3CTafZXf3opfKqXGAii1EgrNMyzbmnfu1WY7tr5X
LuVSFPkxlkmXXZAbT5pUqhdkNlmx15nonR1kt5f1l3E4vzcxNsjGwO5UwN4kG6ff
Qy13z0O/9uQ=
-----END CERTIFICATE REQUEST-----

@ -0,0 +1,13 @@
-----BEGIN CERTIFICATE-----
MIICDDCCAXUCFGl7NLxqW1Y1HqqUNyV4rNK8Y5VVMA0GCSqGSIb3DQEBCwUAMEUx
CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
cm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMjAxMjE5MDg0OTE0WhcNMzAxMjE3MDg0
OTE0WjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UE
CgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQC+T31J/S+vISoAy9B3Rxqjb2at9GXiiESYJ7De8tuD0YCYXQcn7Ydj
PGfH9xvw+e6UpuDwJgHbAfrL6Ba6BCQU8LsMZC5upr6f8g9VPpRDxUA38jWj0n0W
e8MIAz/yatrCgfCT4aQi9FUnVGv4BzpOkDSWuFzG/FeRiy4Jl7RZYwIDAQABMA0G
CSqGSIb3DQEBCwUAA4GBAHNpkSJPPEeWsXMLLL54+K6uxNGPPyTuRZK0ihhfkT+x
BGh5Hz7rB9JuBe/5uewKxf5nkjLUw+Mvh+Bsuom4RaPgfCj8Ao+wkt1+9XoUFXzZ
MdlBpUhlKKYt/qdS8TTuRCTOgicia9UR3xEswE2ixwSXrGrJWfYNNrnOZjtLP0/h
-----END CERTIFICATE-----

@ -0,0 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQC+T31J/S+vISoAy9B3Rxqjb2at9GXiiESYJ7De8tuD0YCYXQcn
7YdjPGfH9xvw+e6UpuDwJgHbAfrL6Ba6BCQU8LsMZC5upr6f8g9VPpRDxUA38jWj
0n0We8MIAz/yatrCgfCT4aQi9FUnVGv4BzpOkDSWuFzG/FeRiy4Jl7RZYwIDAQAB
AoGAAfaH8E9wQnoxGLkBeXl+SNlJUdoHgwKs0nT2WhZfNUjf7rJm9H56uwdQeruN
yjqJv3bJMzDxK/UlRR0rvtd0F86mKd0+uCznHZdiOQSD/WxIPJUQovM5n4D0mEz/
4sNzsPcOSEmmajIFa7JVudGNHD2Ed1h7w7NT7idA9g0t/kECQQDdYgp9sIov4MZj
LVmg64nBP73tnxoN7IbOtwsyhbzQ+MhEXfAhQvUT5SqlOpwp1ZwYxCcJ/IBXdnNL
Ab91GsDrAkEA3BGeJeRcRqlnAJAINkWH7KbGx4jmOPyXycpgMBazlGii22VxyfWv
+9lfPQtuUOxZnQqeR7UI4ZxkPXqQhQtraQJAJj0hAsTTmaGBou/aY2lLyg1wiPLK
VU1dm6cSUA+5pX7TWLvBFn2yR1V2IEQXZUJ4S+7Vr2vl3zWehH4wy9FrMQJACeAs
hazKy0z811SfWbgjEmalkvy8wB/tu9t+F4pdQrKzZD8YLST+YcHueTHTIISKvPZm
BffEz0MSaIPgimfpyQJADHVDfBVSR+4D2pEDx5K8zbss7BccqmtayJTYJiviulHn
P9Uh9ogb/rHLMiGjaPBP20u/JnXqYIBW9d/HccWXTQ==
-----END RSA PRIVATE KEY-----

@ -0,0 +1,4 @@
const isPro = Object.is(process.env.NODE_ENV, 'production')
module.exports= {
baseUrl: isPro ? 'http://192.168.31.192:8084/':'api/'
}

@ -0,0 +1,8 @@
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
baseURL:'"/api"'
})

@ -0,0 +1,95 @@
"use strict";
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require("path");
const FileManagerPlugin = require("filemanager-webpack-plugin");
module.exports = {
dev: {
env: require("./dev.env"),
assetsSubDirectory: "static",
assetsPublicPath: "/",
proxyTable: {
"/api": {
target: "http://192.168.31.209:8084/", //设置你调用的接口域名和端口号 别忘了加http 本地
// target: "http://139.9.185.131:8098/", //设置你调用的接口域名和端口号 别忘了加http 天懿达正式
// target: "http://139.9.58.205:8084/", //设置你调用的接口域名和端口号 别忘了加http 天懿达正式华为云
// target: "http://139.9.185.131:9094/", //设置你调用的接口域名和端口号 别忘了加http 盛联
// target: "http://139.9.185.131:8084/", //设置你调用的接口域名和端口号 别忘了加http 天懿达正式
// target: "http://192.168.31.201:8084/", //设置你调用的接口域名和端口号 别忘了加http 天懿达线上
// target: 'http://124.71.99.140:8084/', //设置你调用的接口域名和端口号 别忘了加http 线上
// target: 'http://124.71.99.140:8081/', //设置你调用的接口域名和端口号 别忘了加http 测试
// target: 'https://www.decaisoft.com:8088/', //设置你调用的接口域名和端口号 别忘了加http 测试
// target: 'https://www.decaisoft.com:8091/', //设置你调用的接口域名和端口号 别忘了加http 线上
changeOrigin: true, //允许跨域
pathRewrite: {
"^/api": "" //这个是定义要访问的路径,名字随便写
}
}
},
// Various Dev Server settingsss
host: "192.168.31.35", // can be overwritten by process.env.HOST
port: 3000, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: false,
errorOverlay: true,
notifyOnErrors: true,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader?
// If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console.
useEslint: false,
// If true, eslint errors and warnings will also be shown in the error overlay
// in the browser.
showEslintErrorsInOverlay: false,
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: "cheap-module-eval-source-map",
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
// https://vue-loader.vuejs.org/en/options.html#cachebusting
cacheBusting: true,
cssSourceMap: true,
disableHostCheck: true
},
plugins: [
new FileManagerPlugin({
events: {
onEnd: {
delete: ["./dist.rar"],
archive: [{
source: path.join(__dirname, "./dist"),
destination: path.join(__dirname, "./dist.rar")
}]
}
}
})
],
build: {
// Template for index.html
index: path.resolve(__dirname, "../dist/index.html"),
// Paths
assetsRoot: path.resolve(__dirname, "../dist"),
assetsSubDirectory: "static",
assetsPublicPath: "../../",
/**
* Source Maps
*/
productionSourceMap: true,
// https://webpack.js.org/configuration/devtool/#production
devtool: "#source-map",
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ["js", "css"],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
}
};

@ -0,0 +1,6 @@
'use strict'
module.exports = {
NODE_ENV: '"production"',
// baseURL:'https://zhuangcy.top:8000/api'
baseURL:'https://www.decaisoft.com:8088/api'
}

@ -0,0 +1,7 @@
'use strict'
const merge = require('webpack-merge')
const devEnv = require('./dev.env')
module.exports = merge(devEnv, {
NODE_ENV: '"testing"'
})

@ -0,0 +1,36 @@
commit 13bd4aa39aec644a95596eb1e25d0ad9ec007f9a (HEAD -> store)
Author: 十七 <2390744110@qq.com>
Date: Mon Aug 3 09:41:53 2020 +0800
门店端第一次上传
commit 991b9d6b15d22b0c878225660e4f3ab212b64626 (origin/master, master)
Author: 十七 <2390744110@qq.com>
Date: Sat Jul 25 18:25:45 2020 +0800
第二次提交
commit dc22f808d3e7fac9d12a9647585d44e551883d05
Author: 十七 <2390744110@qq.com>
Date: Sat Jul 18 18:07:34 2020 +0800
第一次提交
commit f38f60e83f59a9911cdc849b6e5a5de6d74b91f5
Author: lele0110 <2390744110@qq.com>
Date: Tue Jul 14 12:57:58 2020 +0800
first commit
commit edc21bb2d38b3d5570a067859848f157a4115ff8
Author: Lele0110 <2390744110@qq.com>
Date: Tue Jul 14 11:00:09 2020 +0800
第一次提交’
git commit -m 第一次提交’
commit 6d338709ce866c41a341012ad7dda41f1a2d4f00
Author: Lele0110 <2390744110@qq.com>
Date: Tue Jul 14 10:53:46 2020 +0800
first

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<!-- 主入口 -->
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta base="/门店业务" />
<!-- <link rel="icon" type="image/x-icon" href="http://demo.sc.chinaz.com/Files/pic/iconsico/5627/24.ico" /> -->
<link rel="icon" type="image/x-icon" href="static/title.png" />
<!-- <title>门店业务端</title> -->
</head>
<script
type="text/javascript"
src="//api.map.baidu.com/api?v=3.0&ak= OPfwfWopYoyhvGv50ST0DULf3tzvNXY1"
></script>
<!-- onselectstart="return false" -->
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

@ -0,0 +1,10 @@
import { service } from "./src/utils/service";
import {localPath} from "./src/api/api.js"
// 门店员工修改密码接口
export function changePassword(params) {
return service({
url: "/demay/ssm/staffLogin/changePassword",
method: "post",
data:params,
});
}

17881
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,111 @@
{
"name": "vue",
"version": "1.0.0",
"description": "A Vue.js project",
"author": "tangjunye <tangjunye@126.com>",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"unit": "jest --config test/unit/jest.conf.js --coverage",
"e2e": "node test/e2e/runner.js",
"test": "npm run unit && npm run e2e",
"lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
"build": "node build/build.js"
},
"dependencies": {
"@riophae/vue-treeselect": "^0.4.0",
"animate.css": "^3.5.1",
"axios": "^0.27.2",
"classlist-polyfill": "^1.2.0",
"echarts": "^4.9.0",
"element-resize-detector": "^1.2.1",
"element-ui": "^2.13.2",
"iview": "^3.5.4",
"jquery": "^3.6.0",
"qqmap": "^1.0.1",
"qs": "^6.9.4",
"serve": "^11.3.2",
"sortablejs": "^1.10.2",
"vue": "^2.5.2",
"vue-axios": "^2.1.5",
"vue-baidu-map": "^0.21.22",
"vue-esign": "^1.0.5",
"vue-print-nb": "^1.6.0",
"vue-router": "^3.0.1",
"vuex": "^3.5.1",
"webpack-dev-server": "^2.9.7"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-eslint": "^8.2.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-jest": "^21.0.2",
"babel-loader": "^7.1.1",
"babel-plugin-dynamic-import-node": "^1.2.0",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.22.0",
"chalk": "^2.0.1",
"chromedriver": "^2.27.2",
"cli": "^1.0.1",
"copy-webpack-plugin": "^4.0.1",
"cross-spawn": "^5.0.1",
"css-loader": "^0.28.0",
"es6-promise": "^4.2.8",
"eslint": "^4.15.0",
"eslint-config-standard": "^10.2.1",
"eslint-friendly-formatter": "^3.0.0",
"eslint-loader": "^1.7.1",
"eslint-plugin-import": "^2.7.0",
"eslint-plugin-node": "^5.2.0",
"eslint-plugin-promise": "^3.4.0",
"eslint-plugin-standard": "^3.0.1",
"eslint-plugin-vue": "^4.0.0",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
"filemanager-webpack-plugin": "^7.0.0-beta.0",
"friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1",
"jest": "^22.0.4",
"jest-serializer-vue": "^0.3.0",
"nightwatch": "^0.9.12",
"node-notifier": "^5.1.2",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss-url": "^7.2.1",
"rimraf": "^2.6.0",
"selenium-server": "^3.0.1",
"semver": "^5.3.0",
"shelljs": "^0.8.5",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^0.5.8",
"vue-jest": "^1.0.2",
"vue-loader": "^13.3.0",
"vue-particles": "^1.0.9",
"vue-style-loader": "^3.0.1",
"vue-template-compiler": "^2.5.2",
"webpack": "^3.12.0",
"webpack-bundle-analyzer": "^2.9.0",
"webpack-cli": "^4.2.0",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}

@ -0,0 +1,2 @@
import * as partten from "./partten.js";
export { partten };

@ -0,0 +1,73 @@
export const phoneNum = /^((1)|(\\+861)|(861))[0-9]{10}$/;
export const email = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
// export const http = "https://www.decaisoft.com:443/";
// export const https = "https://www.decaisoft.com:443/img";
export const http = "http://139.9.58.205:21/img/";
export const https = "http://139.9.58.205:8077/tydFile/";
var month = "";
if (new Date().getMonth() + 1 < 10) {
month = "0" + (new Date().getMonth() + 1);
} else {
month = new Date().getMonth() + 1;
dabao;
}
var day = "";
if (new Date().getDate() < 10) {
day = "0" + new Date().getDate();
} else {
day = new Date().getDate();
}
var hours = "";
if (new Date().getHours() < 10) {
hours = "0" + new Date().getHours();
} else {
hours = new Date().getHours();
}
var Min = null;
if (new Date().getMinutes() < 10) {
Min = "0" + new Date().getMinutes();
} else {
Min = new Date().getMinutes();
}
var seconds = null;
if (new Date().getSeconds() < 10) {
seconds = "0" + new Date().getSeconds();
} else {
seconds = new Date().getSeconds();
}
export const date =
new Date().getFullYear() +
"" +
month +
"" +
day +
"" +
hours +
"" +
Min +
"" +
seconds;
export const dates =
new Date().getFullYear() +
"/" +
month +
"/" +
day +
" " +
hours +
":" +
Min +
":" +
seconds;
export const dayStatisticDate =
new Date().getFullYear() + "-" + month + "-" + new Date().getDate();
export const months = new Date().getFullYear() + "-" + month + "";

@ -0,0 +1,635 @@
{
"header": {
"reportVersion": 1,
"event": "Allocation failed - JavaScript heap out of memory",
"trigger": "FatalError",
"filename": "report.20201021.163657.16548.0.001.json",
"dumpEventTime": "2020-10-21T16:36:57Z",
"dumpEventTimeStamp": "1603269417097",
"processId": 16548,
"cwd": "G:\\Code\\门店业务",
"commandLine": [
"node",
"G:\\Code\\门店业务\\node_modules\\.bin\\\\..\\_webpack-dev-server@2.9.7@webpack-dev-server\\bin\\webpack-dev-server.js",
"--inline",
"--progress",
"--config",
"build/webpack.dev.conf.js",
"--open"
],
"nodejsVersion": "v12.13.0",
"wordSize": 64,
"arch": "x64",
"platform": "win32",
"componentVersions": {
"node": "12.13.0",
"v8": "7.7.299.13-node.12",
"uv": "1.32.0",
"zlib": "1.2.11",
"brotli": "1.0.7",
"ares": "1.15.0",
"modules": "72",
"nghttp2": "1.39.2",
"napi": "5",
"llhttp": "1.1.4",
"http_parser": "2.8.0",
"openssl": "1.1.1d",
"cldr": "35.1",
"icu": "64.2",
"tz": "2019a",
"unicode": "12.1"
},
"release": {
"name": "node",
"lts": "Erbium",
"headersUrl": "https://nodejs.org/download/release/v12.13.0/node-v12.13.0-headers.tar.gz",
"sourceUrl": "https://nodejs.org/download/release/v12.13.0/node-v12.13.0.tar.gz",
"libUrl": "https://nodejs.org/download/release/v12.13.0/win-x64/node.lib"
},
"osName": "Windows_NT",
"osRelease": "10.0.18363",
"osVersion": "Windows 10 Pro",
"osMachine": "x86_64",
"cpus": [
{
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
"speed": 2808,
"user": 13069515,
"nice": 0,
"sys": 10645296,
"idle": 337333765,
"irq": 2128921
},
{
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
"speed": 2808,
"user": 26383687,
"nice": 0,
"sys": 11775968,
"idle": 322888671,
"irq": 124078
},
{
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
"speed": 2808,
"user": 19936359,
"nice": 0,
"sys": 9256343,
"idle": 331855609,
"irq": 116578
},
{
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
"speed": 2808,
"user": 20426781,
"nice": 0,
"sys": 8916140,
"idle": 331705406,
"irq": 99109
},
{
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
"speed": 2808,
"user": 17327500,
"nice": 0,
"sys": 7311734,
"idle": 336409093,
"irq": 89406
},
{
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
"speed": 2808,
"user": 17512812,
"nice": 0,
"sys": 8407140,
"idle": 335128359,
"irq": 88703
}
],
"networkInterfaces": [
{
"name": "以太网",
"internal": false,
"mac": "04:d4:c4:04:2e:50",
"address": "fe80::9033:450c:efcd:4d4d",
"netmask": "ffff:ffff:ffff:ffff::",
"family": "IPv6",
"scopeid": 13
},
{
"name": "以太网",
"internal": false,
"mac": "04:d4:c4:04:2e:50",
"address": "192.168.31.193",
"netmask": "255.255.255.0",
"family": "IPv4"
},
{
"name": "Loopback Pseudo-Interface 1",
"internal": true,
"mac": "00:00:00:00:00:00",
"address": "::1",
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
"family": "IPv6",
"scopeid": 0
},
{
"name": "Loopback Pseudo-Interface 1",
"internal": true,
"mac": "00:00:00:00:00:00",
"address": "127.0.0.1",
"netmask": "255.0.0.0",
"family": "IPv4"
}
],
"host": "CCN-20190524YLC"
},
"javascriptStack": {
"message": "No stack.",
"stack": [
"Unavailable."
]
},
"nativeStack": [
{
"pc": "0x00007ff6db451389",
"symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+10873"
},
{
"pc": "0x00007ff6db4557cc",
"symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+28348"
},
{
"pc": "0x00007ff6db454778",
"symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+24168"
},
{
"pc": "0x00007ff6db54332b",
"symbol": "v8::base::CPU::has_sse+37723"
},
{
"pc": "0x00007ff6dbd46f4e",
"symbol": "v8::Isolate::ReportExternalAllocationLimitReached+94"
},
{
"pc": "0x00007ff6dbd2ef91",
"symbol": "v8::SharedArrayBuffer::Externalize+833"
},
{
"pc": "0x00007ff6dbbfc85c",
"symbol": "v8::internal::Heap::EphemeronKeyWriteBarrierFromCode+1436"
},
{
"pc": "0x00007ff6dbc07c00",
"symbol": "v8::internal::Heap::ProtectUnprotectedMemoryChunks+1312"
},
{
"pc": "0x00007ff6dbc04734",
"symbol": "v8::internal::Heap::PageFlagsAreConsistent+3204"
},
{
"pc": "0x00007ff6dbbf9fc3",
"symbol": "v8::internal::Heap::CollectGarbage+1283"
},
{
"pc": "0x00007ff6dbbf8794",
"symbol": "v8::internal::Heap::AddRetainedMap+2356"
},
{
"pc": "0x00007ff6dbc19a65",
"symbol": "v8::internal::Factory::NewFillerObject+53"
},
{
"pc": "0x00007ff6db986239",
"symbol": "v8::internal::interpreter::JumpTableTargetOffsets::iterator::operator=+4057"
},
{
"pc": "0x00007ff6dc172c6d",
"symbol": "v8::internal::SetupIsolateDelegate::SetupHeap+567949"
},
{
"pc": "0x00007ff6dc173ba1",
"symbol": "v8::internal::SetupIsolateDelegate::SetupHeap+571841"
},
{
"pc": "0x000002bb0fa13c14",
"symbol": ""
}
],
"javascriptHeap": {
"totalMemory": 2165219328,
"totalCommittedMemory": 2165219328,
"usedMemory": 1963335664,
"availableMemory": 118413840,
"memoryLimit": 2197815296,
"heapSpaces": {
"read_only_space": {
"memorySize": 262144,
"committedMemory": 262144,
"capacity": 261872,
"used": 32296,
"available": 229576
},
"new_space": {
"memorySize": 33554432,
"committedMemory": 33554432,
"capacity": 16759808,
"used": 2745368,
"available": 14014440
},
"old_space": {
"memorySize": 1869983744,
"committedMemory": 1869983744,
"capacity": 1758637896,
"used": 1703823848,
"available": 54814048
},
"code_space": {
"memorySize": 3309568,
"committedMemory": 3309568,
"capacity": 2705792,
"used": 2705792,
"available": 0
},
"map_space": {
"memorySize": 5246976,
"committedMemory": 5246976,
"capacity": 2134240,
"used": 2134240,
"available": 0
},
"large_object_space": {
"memorySize": 251944960,
"committedMemory": 251944960,
"capacity": 251064936,
"used": 251064936,
"available": 0
},
"code_large_object_space": {
"memorySize": 917504,
"committedMemory": 917504,
"capacity": 829184,
"used": 829184,
"available": 0
},
"new_large_object_space": {
"memorySize": 0,
"committedMemory": 0,
"capacity": 16759808,
"used": 0,
"available": 16759808
}
}
},
"resourceUsage": {
"userCpuSeconds": 1554.44,
"kernelCpuSeconds": 441.937,
"cpuConsumptionPercent": 7.94103,
"maxRss": 3370020864,
"pageFaults": {
"IORequired": 22357184,
"IONotRequired": 0
},
"fsActivity": {
"reads": 6755,
"writes": 6
}
},
"libuv": [
],
"environmentVariables": {
"": "C:=C:\\",
"": "G:=G:\\Code\\门店业务",
"ALLUSERSPROFILE": "C:\\ProgramData",
"APPDATA": "C:\\Users\\Administrator\\AppData\\Roaming",
"CHROME_CRASHPAD_PIPE_NAME": "\\\\.\\pipe\\crashpad_1684_XWMAMZFAIGVPTHWP",
"CLASSPATH": ".;C:\\Program Files\\Java\\jdk1.8.0_91\\lib\\dt.jar;C:\\Program Files\\Java\\jdk1.8.0_91\\lib\\tools.jar;",
"COLORTERM": "truecolor",
"CommonProgramFiles": "C:\\Program Files\\Common Files",
"CommonProgramFiles(x86)": "C:\\Program Files (x86)\\Common Files",
"CommonProgramW6432": "C:\\Program Files\\Common Files",
"COMPUTERNAME": "CCN-20190524YLC",
"ComSpec": "C:\\WINDOWS\\system32\\cmd.exe",
"DOCKER_HOST": "tcp://192.168.198.130:2375",
"dp0": "G:\\Code\\门店业务\\node_modules\\.bin\\",
"DriverData": "C:\\Windows\\System32\\Drivers\\DriverData",
"FPS_BROWSER_APP_PROFILE_STRING": "Internet Explorer",
"FPS_BROWSER_USER_PROFILE_STRING": "Default",
"GROOVY_HOME": "D:\\javatools\\groovy-2.5.8",
"HOME": "C:\\Users\\Administrator",
"HOMEDRIVE": "C:",
"HOMEPATH": "\\Users\\Administrator",
"INIT_CWD": "G:\\Code\\门店业务",
"JAVA_HOME": "C:\\Program Files\\Java\\jdk1.8.0_91",
"LANG": "zh_CN.UTF-8",
"LOCALAPPDATA": "C:\\Users\\Administrator\\AppData\\Local",
"LOGONSERVER": "\\\\CCN-20190524YLC",
"MAVEN_HOME": "E:\\apache-maven-3.5.2-bin\\apache-maven-3.5.2",
"MAVEN_OPTS": "-Xms128m -Xmx512m",
"NODE": "E:\\soft\\nodejs\\node.exe",
"NODE_ENV": "development",
"NODE_PATH": "E:\\soft\\nodejs\\node_modules",
"npm_config_access": "",
"npm_config_allow_same_version": "",
"npm_config_also": "",
"npm_config_always_auth": "",
"npm_config_argv": "{\"remain\":[],\"cooked\":[\"--userconfig\",\"C:\\\\Users\\\\Administrator\\\\.cnpmrc\",\"--disturl\",\"https://npm.taobao.org/mirrors/node\",\"--registry\",\"https://r.npm.taobao.org\",\"run\",\"dev\"],\"original\":[\"--userconfig=C:\\\\Users\\\\Administrator\\\\.cnpmrc\",\"--disturl=https://npm.taobao.org/mirrors/node\",\"--registry=https://r.npm.taobao.org\",\"run\",\"dev\"]}",
"npm_config_audit": "true",
"npm_config_audit_level": "low",
"npm_config_auth_type": "legacy",
"npm_config_before": "",
"npm_config_bin_links": "true",
"npm_config_browser": "",
"npm_config_ca": "",
"npm_config_cache": "C:\\Users\\Administrator\\AppData\\Roaming\\npm-cache",
"npm_config_cache_lock_retries": "10",
"npm_config_cache_lock_stale": "60000",
"npm_config_cache_lock_wait": "10000",
"npm_config_cache_max": "Infinity",
"npm_config_cache_min": "10",
"npm_config_cafile": "",
"npm_config_cert": "",
"npm_config_cidr": "",
"npm_config_color": "true",
"npm_config_commit_hooks": "true",
"npm_config_depth": "Infinity",
"npm_config_description": "true",
"npm_config_dev": "",
"npm_config_disturl": "https://npm.taobao.org/mirrors/node",
"npm_config_dry_run": "",
"npm_config_editor": "notepad.exe",
"npm_config_engine_strict": "",
"npm_config_fetch_retries": "2",
"npm_config_fetch_retry_factor": "10",
"npm_config_fetch_retry_maxtimeout": "60000",
"npm_config_fetch_retry_mintimeout": "10000",
"npm_config_force": "",
"npm_config_format_package_lock": "true",
"npm_config_fund": "true",
"npm_config_git": "git",
"npm_config_git_tag_version": "true",
"npm_config_global": "",
"npm_config_globalconfig": "E:\\soft\\nodejs\\etc\\npmrc",
"npm_config_globalignorefile": "E:\\soft\\nodejs\\etc\\npmignore",
"npm_config_global_style": "",
"npm_config_group": "",
"npm_config_ham_it_up": "",
"npm_config_heading": "npm",
"npm_config_https_proxy": "",
"npm_config_if_present": "",
"npm_config_ignore_prepublish": "",
"npm_config_ignore_scripts": "",
"npm_config_init_author_email": "",
"npm_config_init_author_name": "",
"npm_config_init_author_url": "",
"npm_config_init_license": "ISC",
"npm_config_init_module": "C:\\Users\\Administrator\\.npm-init.js",
"npm_config_init_version": "1.0.0",
"npm_config_json": "",
"npm_config_key": "",
"npm_config_legacy_bundling": "",
"npm_config_link": "",
"npm_config_local_address": "",
"npm_config_loglevel": "notice",
"npm_config_logs_max": "10",
"npm_config_long": "",
"npm_config_maxsockets": "50",
"npm_config_message": "%s",
"npm_config_metrics_registry": "https://r.npm.taobao.org/",
"npm_config_node_gyp": "E:\\soft\\nodejs\\node_global\\node_modules\\cnpm\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js",
"npm_config_node_options": "",
"npm_config_node_version": "12.13.0",
"npm_config_noproxy": "",
"npm_config_offline": "",
"npm_config_onload_script": "",
"npm_config_only": "",
"npm_config_optional": "true",
"npm_config_otp": "",
"npm_config_package_lock": "true",
"npm_config_package_lock_only": "",
"npm_config_parseable": "",
"npm_config_prefer_offline": "",
"npm_config_prefer_online": "",
"npm_config_prefix": "E:\\soft\\nodejs",
"npm_config_preid": "",
"npm_config_production": "",
"npm_config_progress": "true",
"npm_config_proxy": "",
"npm_config_read_only": "",
"npm_config_rebuild_bundle": "true",
"npm_config_registry": "https://r.npm.taobao.org/",
"npm_config_rollback": "true",
"npm_config_save": "true",
"npm_config_save_bundle": "",
"npm_config_save_dev": "",
"npm_config_save_exact": "",
"npm_config_save_optional": "",
"npm_config_save_prefix": "^",
"npm_config_save_prod": "",
"npm_config_scope": "",
"npm_config_scripts_prepend_node_path": "warn-only",
"npm_config_script_shell": "",
"npm_config_searchexclude": "",
"npm_config_searchlimit": "20",
"npm_config_searchopts": "",
"npm_config_searchstaleness": "900",
"npm_config_send_metrics": "",
"npm_config_shell": "C:\\WINDOWS\\system32\\cmd.exe",
"npm_config_shrinkwrap": "true",
"npm_config_sign_git_commit": "",
"npm_config_sign_git_tag": "",
"npm_config_sso_poll_frequency": "500",
"npm_config_sso_type": "oauth",
"npm_config_strict_ssl": "true",
"npm_config_tag": "latest",
"npm_config_tag_version_prefix": "v",
"npm_config_timing": "",
"npm_config_tmp": "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp",
"npm_config_umask": "0000",
"npm_config_unicode": "",
"npm_config_unsafe_perm": "true",
"npm_config_update_notifier": "true",
"npm_config_usage": "",
"npm_config_user": "",
"npm_config_userconfig": "C:\\Users\\Administrator\\.cnpmrc",
"npm_config_user_agent": "npm/6.14.5 node/v12.13.0 win32 x64",
"npm_config_version": "",
"npm_config_versions": "",
"npm_config_viewer": "browser",
"npm_execpath": "E:\\soft\\nodejs\\node_global\\node_modules\\cnpm\\node_modules\\npm\\bin\\npm-cli.js",
"npm_lifecycle_event": "dev",
"npm_lifecycle_script": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --open",
"npm_node_execpath": "E:\\soft\\nodejs\\node.exe",
"npm_package_author_email": "tangjunye@126.com",
"npm_package_author_name": "tangjunye",
"npm_package_browserslist_0": "> 1%",
"npm_package_browserslist_1": "last 2 versions",
"npm_package_browserslist_2": "not ie <= 8",
"npm_package_dependencies_axios": "^0.19.2",
"npm_package_dependencies_classlist_polyfill": "^1.2.0",
"npm_package_dependencies_echarts": "^4.8.0",
"npm_package_dependencies_element_resize_detector": "^1.2.1",
"npm_package_dependencies_element_ui": "^2.13.2",
"npm_package_dependencies_jquery": "^3.5.1",
"npm_package_dependencies_qs": "^6.9.4",
"npm_package_dependencies_sortablejs": "^1.10.2",
"npm_package_dependencies_vue": "^2.5.2",
"npm_package_dependencies_vuex": "^3.5.1",
"npm_package_dependencies_vue_axios": "^2.1.5",
"npm_package_dependencies_vue_baidu_map": "^0.21.22",
"npm_package_dependencies_vue_print_nb": "^1.5.0",
"npm_package_dependencies_vue_router": "^3.0.1",
"npm_package_description": "A Vue.js project",
"npm_package_devDependencies_autoprefixer": "^7.1.2",
"npm_package_devDependencies_babel_core": "^6.22.1",
"npm_package_devDependencies_babel_eslint": "^8.2.1",
"npm_package_devDependencies_babel_helper_vue_jsx_merge_props": "^2.0.3",
"npm_package_devDependencies_babel_jest": "^21.0.2",
"npm_package_devDependencies_babel_loader": "^7.1.1",
"npm_package_devDependencies_babel_plugin_dynamic_import_node": "^1.2.0",
"npm_package_devDependencies_babel_plugin_syntax_jsx": "^6.18.0",
"npm_package_devDependencies_babel_plugin_transform_es2015_modules_commonjs": "^6.26.0",
"npm_package_devDependencies_babel_plugin_transform_runtime": "^6.22.0",
"npm_package_devDependencies_babel_plugin_transform_vue_jsx": "^3.5.0",
"npm_package_devDependencies_babel_polyfill": "^6.26.0",
"npm_package_devDependencies_babel_preset_env": "^1.3.2",
"npm_package_devDependencies_babel_preset_stage_2": "^6.22.0",
"npm_package_devDependencies_babel_register": "^6.22.0",
"npm_package_devDependencies_chalk": "^2.0.1",
"npm_package_devDependencies_chromedriver": "^2.27.2",
"npm_package_devDependencies_cli": "^1.0.1",
"npm_package_devDependencies_copy_webpack_plugin": "^4.0.1",
"npm_package_devDependencies_cross_spawn": "^5.0.1",
"npm_package_devDependencies_css_loader": "^0.28.0",
"npm_package_devDependencies_es6_promise": "^4.2.8",
"npm_package_devDependencies_eslint": "^4.15.0",
"npm_package_devDependencies_eslint_config_standard": "^10.2.1",
"npm_package_devDependencies_eslint_friendly_formatter": "^3.0.0",
"npm_package_devDependencies_eslint_loader": "^1.7.1",
"npm_package_devDependencies_eslint_plugin_import": "^2.7.0",
"npm_package_devDependencies_eslint_plugin_node": "^5.2.0",
"npm_package_devDependencies_eslint_plugin_promise": "^3.4.0",
"npm_package_devDependencies_eslint_plugin_standard": "^3.0.1",
"npm_package_devDependencies_eslint_plugin_vue": "^4.0.0",
"npm_package_devDependencies_extract_text_webpack_plugin": "^3.0.0",
"npm_package_devDependencies_file_loader": "^1.1.4",
"npm_package_devDependencies_friendly_errors_webpack_plugin": "^1.6.1",
"npm_package_devDependencies_html_webpack_plugin": "^2.30.1",
"npm_package_devDependencies_jest": "^22.0.4",
"npm_package_devDependencies_jest_serializer_vue": "^0.3.0",
"npm_package_devDependencies_nightwatch": "^0.9.12",
"npm_package_devDependencies_node_notifier": "^5.1.2",
"npm_package_devDependencies_optimize_css_assets_webpack_plugin": "^3.2.0",
"npm_package_devDependencies_ora": "^1.2.0",
"npm_package_devDependencies_portfinder": "^1.0.13",
"npm_package_devDependencies_postcss_import": "^11.0.0",
"npm_package_devDependencies_postcss_loader": "^2.0.8",
"npm_package_devDependencies_postcss_url": "^7.2.1",
"npm_package_devDependencies_rimraf": "^2.6.0",
"npm_package_devDependencies_selenium_server": "^3.0.1",
"npm_package_devDependencies_semver": "^5.3.0",
"npm_package_devDependencies_shelljs": "^0.7.6",
"npm_package_devDependencies_uglifyjs_webpack_plugin": "^1.1.1",
"npm_package_devDependencies_url_loader": "^0.5.8",
"npm_package_devDependencies_vue_jest": "^1.0.2",
"npm_package_devDependencies_vue_loader": "^13.3.0",
"npm_package_devDependencies_vue_particles": "^1.0.9",
"npm_package_devDependencies_vue_style_loader": "^3.0.1",
"npm_package_devDependencies_vue_template_compiler": "^2.5.2",
"npm_package_devDependencies_webpack": "^3.12.0",
"npm_package_devDependencies_webpack_bundle_analyzer": "^2.9.0",
"npm_package_devDependencies_webpack_merge": "^4.1.0",
"npm_package_engines_node": ">= 6.0.0",
"npm_package_engines_npm": ">= 3.0.0",
"npm_package_gitHead": "b8daba77e6f80ba98e7cbf48233ab0eb89cab926",
"npm_package_name": "vue",
"npm_package_private": "true",
"npm_package_readmeFilename": "README.md",
"npm_package_scripts_build": "node build/build.js",
"npm_package_scripts_dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --open",
"npm_package_scripts_e2e": "node test/e2e/runner.js",
"npm_package_scripts_lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
"npm_package_scripts_start": "npm run dev",
"npm_package_scripts_test": "npm run unit && npm run e2e",
"npm_package_scripts_unit": "jest --config test/unit/jest.conf.js --coverage",
"npm_package_version": "1.0.0",
"NUMBER_OF_PROCESSORS": "6",
"OneDrive": "C:\\Users\\Administrator\\OneDrive",
"ORIGINAL_XDG_CURRENT_DESKTOP": "undefined",
"OS": "Windows_NT",
"Path": "E:\\soft\\nodejs\\node_global\\node_modules\\cnpm\\node_modules\\npm\\node_modules\\npm-lifecycle\\node-gyp-bin;G:\\Code\\门店业务\\node_modules\\.bin;C:\\ProgramData\\Oracle\\Java\\javapath;E:\\app\\Administrator\\product\\11.2.0\\dbhome_1\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files (x86)\\Cesoft\\Excel Server2010;C:\\Program Files\\Java\\jdk1.8.0_91\\bin;D:\\javatools\\groovy-2.5.8\\bin;D:\\TortoiseSVN\\bin;E:\\soft\\nodejs\\;C:\\Program Files (x86)\\Cesoft\\Excel Server2010;C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Program Files\\Java\\jdk1.8.0_91\\bin;C:\\Program Files\\Java\\jdk1.8.0_91\\jre\\bin;E:\\apache-maven-3.5.2-bin\\apache-maven-3.5.2\\bin;E:\\Program Files\\MySQL\\MySQL Server 5.7\\bin;E:\\soft\\nodejs\\node_global;;D:\\ssh;D:\\Microsoft VS Code\\bin;C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\WindowsApps",
"PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JSE;.WSF;.WSH;.MSC;.CPL",
"PORT": "3000",
"PROCESSOR_ARCHITECTURE": "AMD64",
"PROCESSOR_IDENTIFIER": "Intel64 Family 6 Model 158 Stepping 10, GenuineIntel",
"PROCESSOR_LEVEL": "6",
"PROCESSOR_REVISION": "9e0a",
"ProgramData": "C:\\ProgramData",
"ProgramFiles": "C:\\Program Files",
"ProgramFiles(x86)": "C:\\Program Files (x86)",
"ProgramW6432": "C:\\Program Files",
"PROMPT": "$P$G",
"PSModulePath": "E:\\360MoveData\\Users\\Administrator\\Documents\\WindowsPowerShell\\Modules;C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules",
"PUBLIC": "C:\\Users\\Public",
"SESSIONNAME": "Console",
"SystemDrive": "C:",
"SystemRoot": "C:\\WINDOWS",
"TEMP": "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp",
"TERM_PROGRAM": "vscode",
"TERM_PROGRAM_VERSION": "1.50.1",
"TMP": "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp",
"USERDOMAIN": "CCN-20190524YLC",
"USERDOMAIN_ROAMINGPROFILE": "CCN-20190524YLC",
"USERNAME": "Administrator",
"USERPROFILE": "C:\\Users\\Administrator",
"windir": "C:\\WINDOWS",
"_prog": "node"
},
"sharedObjects": [
"E:\\soft\\nodejs\\node.exe",
"C:\\WINDOWS\\SYSTEM32\\ntdll.dll",
"C:\\WINDOWS\\System32\\KERNEL32.DLL",
"C:\\WINDOWS\\System32\\KERNELBASE.dll",
"C:\\WINDOWS\\System32\\WS2_32.dll",
"C:\\WINDOWS\\System32\\RPCRT4.dll",
"C:\\WINDOWS\\System32\\ADVAPI32.dll",
"C:\\WINDOWS\\System32\\msvcrt.dll",
"C:\\WINDOWS\\System32\\sechost.dll",
"C:\\WINDOWS\\SYSTEM32\\dbghelp.dll",
"C:\\WINDOWS\\System32\\USER32.dll",
"C:\\WINDOWS\\System32\\ucrtbase.dll",
"C:\\WINDOWS\\System32\\win32u.dll",
"C:\\WINDOWS\\System32\\GDI32.dll",
"C:\\WINDOWS\\System32\\gdi32full.dll",
"C:\\WINDOWS\\System32\\msvcp_win.dll",
"C:\\WINDOWS\\System32\\PSAPI.DLL",
"C:\\WINDOWS\\System32\\CRYPT32.dll",
"C:\\WINDOWS\\System32\\MSASN1.dll",
"C:\\WINDOWS\\System32\\bcrypt.dll",
"C:\\WINDOWS\\SYSTEM32\\IPHLPAPI.DLL",
"C:\\WINDOWS\\SYSTEM32\\USERENV.dll",
"C:\\WINDOWS\\System32\\profapi.dll",
"C:\\WINDOWS\\SYSTEM32\\WINMM.dll",
"C:\\WINDOWS\\SYSTEM32\\WINMMBASE.dll",
"C:\\WINDOWS\\System32\\cfgmgr32.dll",
"C:\\WINDOWS\\System32\\bcryptPrimitives.dll",
"C:\\WINDOWS\\System32\\IMM32.DLL",
"C:\\WINDOWS\\System32\\powrprof.dll",
"C:\\WINDOWS\\System32\\UMPDC.dll",
"C:\\WINDOWS\\system32\\uxtheme.dll",
"C:\\WINDOWS\\System32\\combase.dll",
"C:\\WINDOWS\\system32\\mswsock.dll",
"C:\\WINDOWS\\System32\\kernel.appcore.dll",
"C:\\WINDOWS\\System32\\NSI.dll",
"C:\\WINDOWS\\SYSTEM32\\dhcpcsvc6.DLL",
"C:\\WINDOWS\\SYSTEM32\\dhcpcsvc.DLL",
"C:\\WINDOWS\\SYSTEM32\\DNSAPI.dll",
"C:\\WINDOWS\\SYSTEM32\\CRYPTBASE.DLL",
"C:\\WINDOWS\\system32\\napinsp.dll",
"C:\\WINDOWS\\system32\\pnrpnsp.dll",
"C:\\WINDOWS\\System32\\winrnr.dll",
"C:\\WINDOWS\\system32\\NLAapi.dll",
"C:\\WINDOWS\\system32\\wshbth.dll"
]
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,165 @@
import { service } from "../utils/service";
// 添加员工排班上钟
export function addServiceOrder(params) {
return service({
url: "/demay/ssm/serviceOrder/add",
method: "post",
data: params
});
}
// 员工排班下钟
export function downServiceOrder(params) {
return service({
url: "/demay/ssm/serviceOrder/down",
method: "post",
data: params
});
}
// 查询全部员工排班
export function serviceOrderList(params) {
return service({
url: "/demay/ssm/serviceOrder/list",
method: "post",
data: params
});
}
// 查询全部员工排班其他状态
export function serviceOrderLists(params) {
return service({
url: "/demay/ssm/serviceOrder/lists",
method: "post",
data: params
});
}
// 修改员工排班上钟顺序
export function editServiceOrder(params) {
return service({
url: "/demay/ssm/serviceOrder/update",
method: "post",
data: params
});
}
// 添加服务单据(结算)
export function addStoreSettlement(params) {
return service({
url: "/demay/ssm/storeSettlement/add",
method: "post",
data: params
});
}
// 修改服务中单据
export function ediStoreSettlement(params) {
return service({
url: "/demay/ssm/storeSettlement/update",
method: "post",
data: params
});
}
// 添加服务单据(结算)
export function addServiceOrders(params) {
return service({
url: "/demay/ssm/serviceOrders/add",
method: "post",
data: params
});
}
//删除服务项目
export function delStoreSettlement(params) {
return service({
url: "/demay/ssm/storeSettlement/detele",
method: "post",
data: params
});
}
// 结算服务
export function cancelServiceOrders(params) {
return service({
url: "/demay/ssm/serviceOrders/cancel",
method: "post",
data: params
});
}
// 修改
export function editServiceOrders(params) {
return service({
url: "/demay/ssm/serviceOrders/update",
method: "post",
data: params
});
}
// 查询历史单据(按月)
export function pageServiceOrders(params) {
return service({
url: "/demay/ssm/serviceOrders/page",
method: "post",
data: params
});
}
//上钟
export function updateTime(params) {
return service({
url: "/demay/ssm/storeSettlement/updateTime",
method: "post",
data: params
});
}
//下钟
export function updateTimeX(params) {
return service({
url: "/demay/ssm/storeSettlement/updateTimeX",
method: "post",
data: params
});
}
//退房
export function checkOut(params) {
return service({
url: "/demay/ssm/storeSettlement/checkOut",
method: "post",
data: params
});
}
//换房
export function roomChange(params) {
return service({
url: "/demay/ssm/storeSettlement/roomChange",
method: "post",
data: params
});
}
//房间状态
export function roomSatet(params) {
return service({
url: "/demay/ssm/storeRoom/roomSatet",
method: "post",
data: params
});
// 修改员工排班上钟顺序
}
export function stateServiceOrder(params) {
return service({
url: "/demay/ssm/serviceOrder/update",
method: "post",
data: params
});
}
// 修改员工状态
export function editsServiceOrder(params) {
return service({
url: "/demay/ssm/serviceOrder/updates",
method: "post",
data: params
});
}

@ -0,0 +1,26 @@
import {
service
} from "../utils/service";
import {
localPath
} from "./api.js"
// 新店注册
export function addStore(params) {
return service({
url: "/demay/ssm/store/addStore",
method: "post",
data:params,
});
}
//获取手机号验证码
export function getphonecode(params) {
return service({
url: "/demay/ssm/login/getSmsCode",
method: "post",
data: params,
});
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,44 @@
import { service } from "../utils/service";
import { localPath } from "./api.js"
// 促销活动单添加 (门店端-促销活动单-促销活动单添加)
export function addDocPromotion(params) {
return service({
url: "/demay/ssm/docPromotion/add",
method: "post",
data: params
});
}
// 疗程单作废 (门店端-疗程单-疗程单作废)
export function cancelDocPromotion(params) {
return service({
url: "/demay/ssm/docPromotion/cancel",
method: "post",
data: params
});
}
// 分页查询 门店端-促销活动单-分页查询促销活动单
export function docPromotionPage(params) {
return service({
url: "/demay/ssm/docPromotion/page",
method: "post",
data: params
});
}
// 门店员工业绩提成统计列表 门店端-首页-门店员工业绩提成统计列表
export function statisticStaffDayList(params) {
return service({
url: "/demay/ssm/storeStatistic/staffDayList",
method: "post",
data: params
});
}
// 促销活动单业务员修改 (门店端-促销活动单-促销活动单业务员修改)
export function docPromotionEditStaff(params) {
return service({
url: "/demay/ssm/docPromotion/updateStaff",
method: "post",
data: params
});
}

@ -0,0 +1,79 @@
import { service } from "../utils/service";
import { localPath } from "./api.js";
// 门店员工获取手机短信验证码接口
export function getSmsCode(params) {
return service({
url: "/demay/ssm/staffLogin/getSmsCode",
method: "post",
data: params
});
}
// 门店员工手机验证码登陆获取token接口
export function phoneLogin(params) {
return service({
url: "/demay/ssm/staffLogin/phoneLogin",
method: "post",
data: params
});
}
//门店员工手机密码登陆获取token接口
export function phonePassLogin(params) {
return service({
url: "/demay/ssm/staffLogin/phonePassLogin",
method: "post",
data: params
});
}
// 通过手机号查询员工所属门店
export function staffLoginList(params) {
return service({
url: "/demay/ssm/staffLogin/list",
method: "post",
data: params
});
}
// 通过手机号查询员工所属门店
export function staffls(params) {
return service({
url: "/demay/ssm/staffLogin/lists",
method: "post",
data: params
});
}
// 查询所有门店 平台端-门店管理-查询所有门店
export function storeLists(params) {
return service({
url: "/demay/ssm/store/list",
method: "post",
data: params
});
}
// 登录忘记密码 获取密码
export function getSmsCodesPassword(params) {
return service({
url: "/demay/ssm/staffLogin/getSmsCodesPassword",
method: "post",
data: params
});
}
//,先查询门店,如果没有总店则返回不是总店用户,是总店用户则返回总店下的所有门店
export function selectHeadOffice(params) {
return service({
url: "/demay/ssm/staffLogin/selectHeadOffice",
method: "post",
data: params
});
}
//校验登录
export function phonePassLoginzd(params) {
return service({
url: "/demay/ssm/staffLogin/phonePassLoginzd",
method: "post",
data: params
});
}

@ -0,0 +1,21 @@
import { service } from "../utils/service";
import {localPath} from "./api.js"
// 门店员工修改密码接口
export function changePassword(params) {
return service({
url: "/demay/ssm/staffLogin/changePassword",
method: "post",
data:params,
});
}
//退出登录
export function logout(params) {
return service({
url: "/demay/ssm/staffLogin/logout",
method: "post",
data:params,
});
}

@ -0,0 +1,248 @@
import { service } from "../utils/service";
import { localPath } from "./api.js";
// 促销活动添加 (门店端-促销活动-促销活动添加)
export function addPromotion(params) {
return service({
url: "/demay/ssm/promotion/add",
method: "post",
data: params
});
}
// 促销活动审核 (门店端-促销活动-促销活动审核)
export function promotionAudit(params) {
return service({
url: "/demay/ssm/promotion/audit",
method: "post",
data: params
});
}
// 分页查询 门店端-促销活动-分页查询充值类别
export function promotionPage(params) {
return service({
url: "/demay/ssm/promotion/page",
method: "post",
data: params
});
}
// 分页查询 门店端-促销活动-首页
export function promotionList(params) {
return service({
url: "/demay/ssm/promotion/selectList",
method: "post",
data: params
});
}
// 促销活动推送 (门店端-促销活动-促销活动推送)
export function promotionPush(params) {
return service({
url: "/demay/ssm/promotion/push",
method: "post",
data: params
});
}
// 促销活动回收 (门店端-促销活动-促销活动回收)
export function promotionRevokeAudit(params) {
return service({
url: "/demay/ssm/promotion/revokeAudit",
method: "post",
data: params
});
}
// 促销活动关闭 (门店端-促销活动-促销活动关闭)
export function promotionShutDown(params) {
return service({
url: "demay/ssm/promotion/shutDown",
method: "post",
data: params
});
}
// 促销活动送审 (门店端-促销活动-促销活动送审)
export function promotionSendAudit(params) {
return service({
url: "/demay/ssm/promotion/sendAudit",
method: "post",
data: params
});
}
// 退款单反审核 (门店端-退款单-退款单反审核)
export function promotionUnAudit(params) {
return service({
url: "/demay/ssm/promotion/unAudit",
method: "post",
data: params
});
}
// 促销活动修改 (门店端-促销活动-促销活动修改)
export function editPromotion(params) {
return service({
url: "/demay/ssm/promotion/update",
method: "post",
data: params
});
}
// 分页查询 门店端-促销活动-分页查询促销活动指定会员数据
export function promotionMemPage(params) {
return service({
url: "/demay/ssm/promotionMem/page",
method: "post",
data: params
});
}
// 查询促销活动项目 门店端-促销活动-查询促销活动项目
export function promotionProList(params) {
return service({
url: "/demay/ssm/promotionPro/list",
method: "post",
data: params
});
}
// 查询促销活动项目 门店端-促销活动-查询促销活动项目
export function docPromotionProList(params) {
return service({
url: "/demay/ssm/docPromotionPro/list",
method: "post",
data: params
});
}
// 添加充值促销
export function recPromotionAdd(params) {
return service({
url: "/demay/ssm/topUpPromotion/add",
method: "post",
data: params
});
}
// 充值促销分页列表
export function recPromotionPage(params) {
return service({
url: "/demay/ssm/topUpPromotion/page",
method: "post",
data: params
});
}
// 添加赠卡申请单
export function addBaseZengka(params) {
return service({
url: "/demay/ssm/baseZengka/add",
method: "post",
data: params
});
}
// 修改赠卡申请单
export function editBaseZengka(params) {
return service({
url: "/demay/ssm/baseZengka/update",
method: "post",
data: params
});
}
// 赠卡page
export function baseZengkaPage(params) {
return service({
url: "/demay/ssm/baseZengka/page",
method: "post",
data: params
});
}
// 修改赠卡申请单状态
export function stateBaseZengka(params) {
return service({
url: "/demay/ssm/baseZengka/updateState",
method: "post",
data: params
});
}
// 添加团购卡申请单
export function addBaseGrouponCard(params) {
return service({
url: "/demay/ssm/baseGrouponCard/add",
method: "post",
data: params,
headers: {
"Content-type": "application/x-www-form-urlencoded"
}
});
}
// 修改团购卡申请单
export function editBaseGrouponCard(params) {
return service({
url: "/demay/ssm/baseGrouponCard/update",
method: "post",
data: params,
headers: {
"Content-type": "application/x-www-form-urlencoded"
}
});
}
// 团购卡page
export function baseGrouponCardPage(params) {
return service({
url: "/demay/ssm/baseGrouponCard/page",
method: "post",
data: params
});
}
// 修改团购卡申请单状态
export function stateBaseGrouponCard(params) {
return service({
url: "/demay/ssm/baseGrouponCard/updateState",
method: "post",
data: params
});
}
// 添加团购人名单
export function addBaseGrouponList(params) {
return service({
url: "/demay/ssm/baseGrouponList/add",
method: "post",
data: params
});
}
// 团购名单模板下载
export function downloadBaseGrouponList(params) {
return service({
url: "/demay/ssm/baseGrouponList/download",
method: "post",
data: params,
responseType: "blob"
});
}
// 门店充值类别批量导入 门店端-充值类别列表-门店充值类别批量导入
export function importBaseGrouponList(params) {
return service({
url: "/demay/ssm/baseGrouponList/import",
method: "post",
data: params,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
});
}
// 查询团购人名单(传团购单据Id)
export function selectBaseGrouponList(params) {
return service({
url: "/demay/ssm/baseGrouponList/select",
method: "post",
data: params
});
}
// 修改团购人名单
export function updateBaseGrouponList(params) {
return service({
url: "/demay/ssm/baseGrouponList/update",
method: "post",
data: params
});
}

@ -0,0 +1,278 @@
import { service } from "../utils/service";
import { localPath } from "./api.js";
// 添加门店月度任务 门店端-门店月度任务-添加门店月度任务
export function addMonthTask(params) {
return service({
url: "/demay/ssm/monthTask/add",
method: "post",
data: params
});
}
// 删除门店月度任务 门店端-门店月度任务-删除门店月度任务
export function delMonthTask(params) {
return service({
url: "/demay/ssm/monthTask/delete",
method: "post",
data: params
});
}
// 分页查询门店月度任务 门店端-门店月度任务-分页查询门店月度任务
export function monthTaskPage(params) {
return service({
url: "/demay/ssm/monthTask/page",
method: "post",
data: params
});
}
// 门店月度任务统计 门店端-门店月度任务-门店月度任务统计
export function monthTaskStatistic(params) {
return service({
url: "/demay/ssm/monthTask/statistic",
method: "post",
data: params
});
}
// 修改门店月度任务 门店端-门店月度任务-修改门店月度任务
export function editMonthTask(params) {
return service({
url: "/demay/ssm/monthTask/update",
method: "post",
data: params
});
}
// 门店月度任务状态修改 门店端-门店月度任务-门店月度任务状态修改
export function editMonthTaskState(params) {
return service({
url: "/demay/ssm/monthTask/updateStates",
method: "post",
data: params
});
}
// 当日负卡金记录查询
export function dayStatistic(params) {
return service({
url: "/demay/ssm/negativeCard/dayStatistic",
method: "post",
data: params
});
}
// 门店会员统计列表 门店端-门店统计-门店会员统计列表
export function storeStatisticMemberList(params) {
return service({
url: "/demay/ssm/storeStatistic/memberList",
method: "post",
params: params
});
}
// 门店会员统计列表 门店端-门店统计-会员排行榜充值统计
export function memberRecharge(params) {
return service({
url: "/demay/ssm/storeStatistic/memberRecharge",
method: "post",
data: params,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
});
}
// 门店项目统计列表 门店端-门店统计-当日门店项目统计列表
export function memberCourse(params) {
return service({
url: "/demay/ssm/storeStatistic/memberCourse",
method: "post",
data: params,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
});
}
// 门店项目统计列表 门店端-门店统计-门店项目统计列表
export function storeStatisticProjectList(params) {
return service({
url: "/demay/ssm/storeStatistic/projectList",
method: "post",
data: params
});
}
// 门店员工统计列表 门店端-门店统计-门店员工统计列表
export function storeStatisticStaffMonthList(params) {
return service({
url: "/demay/ssm/storeStatistic/staffMonthList",
method: "post",
data: params
});
}
// 查询员工工资 门店端-统计报表-查询员工工资
export function selectSalary(params) {
return service({
url: "/demay/ssm/salary/selectSalary",
method: "post",
data: params
});
}
// 添加员工工资 门店端-统计报表-添加员工工资
export function addSalary(params) {
return service({
url: "/demay/ssm/salary/add",
method: "post",
data: params
});
}
// 删除员工工资 门店端-统计报表-删除员工工资
export function delSalary(params) {
return service({
url: "/demay/ssm/salary/delete",
method: "post",
data: params
});
}
// 门店日报
export function storeDaily(params) {
return service({
url: "/demay/ssm/storeStatistic/storeDaily",
method: "post",
data: params
});
}
// 门店项目统计列表 门店端-门店统计-月度门店项目统计列表
export function projectMonthList(params) {
return service({
url: "/demay/ssm/storeStatistic/projectMonthList",
method: "post",
data: params
});
}
// 查询门店业绩分类统计表
export function achiCommLists(params) {
return service({
url: "/demay/ssm/staff/achiCommLists",
method: "post",
data: params
});
}
export function achiCommListsgroup(params) {
return service({
url: "/demay/ssm/staff/achiCommListsgroup",
method: "post",
data: params
});
}
//导出
export function exportachi(params) {
return service({
url: "/demay/ssm/staff////////achiCommListsgroup/exportachi",
method: "post",
data: params,
responseType: "blob"
});
}
// 查询门店业绩分类统计表
export function achiCommClassifyLists(params) {
return service({
url: "/demay/ssm/staff/achiCommClassifyLists",
method: "post",
data: params
});
}
//明细导出
export function acehioprtx(params) {
return service({
url: "/demay/ssm/staff//achiCommLists/exportachi",
method: "post",
responseType: "blob",
data: params
});
}
//导出员工工资单据明细
export function exportachiwhole(params) {
return service({
url: "/demay/ssm/staff/achiCommLists/exportachiwhole",
method: "post",
data: params
});
}
//查询项目单品贡献率 selectType; 0=查全公司1=查门店
export function rateContribution(params) {
return service({
url: "/demay/ssm/staff/rateContribution",
method: "post",
data: params
});
}
//明细
export function rateContributionMx(params) {
return service({
url: "/demay/ssm/staff/rateContributionMx",
method: "post",
data: params
});
}
//明细s
export function rateContributionMxs(params) {
return service({
url: "/demay/ssm/staff/rateContributionMxs",
method: "post",
data: params
});
}
//明细order
export function rateContributionMxOrder(params) {
return service({
url: "/demay/ssm/staff/rateContributionMxOrder",
method: "post",
data: params
});
}
//查询服务单品贡献率 selectType; 0=查全公司1=查门店
export function selectCashRateContribution(params) {
return service({
url: "/demay/ssm/staff/selectCashRateContribution",
method: "post",
data: params
});
}
//明细
export function selectCashRateContributionMx(params) {
return service({
url: "/demay/ssm/staff/selectCashRateContributionMx",
method: "post",
data: params
});
}
//明细s
export function selectCashRateContributionMxs(params) {
return service({
url: "/demay/ssm/staff/selectCashRateContributionMxs",
method: "post",
data: params
});
}
//明细order
export function selectCashRateContributionMxOrder(params) {
return service({
url: "/demay/ssm/staff/selectCashRateContributionMxOrder",
method: "post",
data: params
});
}
//换房
export function roomChange(params) {
return service({
url: "/demay/ssm/storeSettlement/roomChange",
method: "post",
data: params
});
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,95 @@
// 用户长时间未操作 退出登录
import router from "./router/index.js";
import { delCookie } from "./utils/utils.js";
var timer = null;
clearInterval(timer);
export function isOperateFun() {
var lastTime = new Date().getTime(); // 最后一次点击时间
var currentTime = new Date().getTime(); // 当前时间
var timeOut = 60 * 60 * 1000; // 允许最长未操作时间
var i = 1; // 辅助作用
function handleReset() {
// 重新赋值最后一次点击时间,清除定时器,重新开始定时器
//console.log('又点击了!!!!!!')
i = 1;
lastTime = new Date().getTime();
if (timer) {
clearInterval(timer);
timer = null;
}
if (!timer) {
//console.log('真好!重新开始')
handleInterval();
}
}
document.onclick = () => {
// 单击事件
handleReset();
};
document.ondblclick = () => {
// 双击事件
handleReset();
};
document.onmousedown = () => {
// 按下鼠标键时触发
handleReset();
};
document.onmouseup = () => {
// 释放按下的鼠标键时触发
handleReset();
};
document.onmousemove = () => {
// 鼠标移动事件
handleReset();
};
document.onmouseover = () => {
// 移入事件
handleReset();
};
document.onmouseout = () => {
// 移出事件
handleReset();
};
document.onmouseenter = () => {
// 移入事件
handleReset();
};
document.onmouseleave = () => {
// 移出事件
handleReset();
};
function handleInterval() {
// 定时器
timer = setInterval(() => {
currentTime = new Date().getTime(); // 当前时间
// //console.log(`${i++}-currentTime`, currentTime)
// //console.log('最后一次点击时间', lastTime)
if (currentTime - lastTime > timeOut) {
//console.log('长时间未操作')
alert("长时间未操作!退出登录!");
clearInterval(timer); // 清除定时器
const path = window.location.href.split("#")[1];
if (path !== "/login") {
// 判断当前路由不是首页 则跳转至首页
router.push("/login");
delCookie("token");
}
window.AndroidWebView.loginOut(); // 执行安卓退出方法
}
}, 1000);
}
handleInterval(); // 一开始程序 默认执行定制器
}

@ -0,0 +1,93 @@
'use strict'
import { app, protocol, BrowserWindow } from 'electron'
import {
createProtocol,
installVueDevtools
} from 'vue-cli-plugin-electron-builder/lib'
const isDevelopment = process.env.NODE_ENV !== 'production'
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win
// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([{ scheme: 'app', privileges: { secure: true, standard: true } }])
function createWindow() {
// Create the browser window.
win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
})
if (process.env.WEBPACK_DEV_SERVER_URL) {
// Load the url of the dev server if in development mode
win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
if (!process.env.IS_TEST) win.webContents.openDevTools()
} else {
createProtocol('app')
// Load the index.html when not in development
win.loadURL('app://./index.html')
}
win.on('closed', () => {
win = null
})
}
// Quit when all windows are closed.
app.on('window-all-closed', () => {
// On macOS it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', () => {
// On macOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (win === null) {
createWindow()
}
})
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', async() => {
if (isDevelopment && !process.env.IS_TEST) {
// Install Vue Devtools
// Devtools extensions are broken in Electron 6.0.0 and greater
// See https://github.com/nklayman/vue-cli-plugin-electron-builder/issues/378 for more info
// Electron will not launch with Devtools extensions installed on Windows 10 with dark mode
// If you are not using Windows 10 dark mode, you may uncomment these lines
// In addition, if the linked issue is closed, you can upgrade electron and uncomment these lines
// try {
// await installVueDevtools()
// } catch (e) {
// console.error('Vue Devtools failed to install:', e.toString())
// }
}
createWindow()
})
// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
if (process.platform === 'win32') {
process.on('message', data => {
if (data === 'graceful-exit') {
app.quit()
}
})
} else {
process.on('SIGTERM', () => {
app.quit()
})
}
}

@ -0,0 +1,167 @@
<template>
<div class="app-container">
<el-form ref="form" :model="form" label-width="110px">
<el-form-item label="详细地址:" prop="address">
<el-autocomplete v-model="form.address" style="width:100%;" popper-class="autoAddressClass" :fetch-suggestions="querySearchAsync" :trigger-on-focus="false" placeholder="详细地址" clearable @select="handleSelect">
<template slot-scope="{ item }">
<i class="el-icon-search fl mgr10" />
<div style="overflow:hidden;">
<div class="title">{{ item.title }}</div>
<span class="address ellipsis">{{ item.address }}</span>
</div>
</template>
</el-autocomplete>
</el-form-item>
<el-form-item label="地图定位:">
<div id="map-container" style="width:100%;height:43vh;" />
</el-form-item>
<el-form-item>
</el-form-item>
</el-form>
</div>
</template>
<script>
/* eslint-disable */
import loadBMap from "../../loadBMap.js";
export default {
props: ["bMapRes"],
data() {
return {
form: {
address: "", //
addrPoint: {
//
lng: 0,
lat: 0
}
},
map: "", //
mk: "", // Marker
list: []
};
},
async mounted() {
await loadBMap("oW2UEhdth2tRbEE4FUpF9E5YVDCIPYih"); // BMap
this.initMap();
},
methods: {
//
initMap() {
//console.log(this.bMapRes);
var that = this;
// 1
if (this.bMapRes != undefined) {
that.form.address = this.bMapRes.address;
var point = new BMap.Point(this.bMapRes.lng * 1, this.bMapRes.lat * 1);
} else {
var point = new BMap.Point();
// 6
this.geolocation();
}
this.map = new BMap.Map("map-container", { enableMapClick: false });
this.map.centerAndZoom(point, 19);
this.map.enableScrollWheelZoom(true);
// 3
this.mk = new BMap.Marker(point, { enableDragging: true });
this.map.addOverlay(this.mk);
this.mk.addEventListener("dragend", function (e) {
that.getAddrByPoint(e.point);
});
// 4
this.map.addControl(
new BMap.NavigationControl({
anchor: BMAP_ANCHOR_TOP_RIGHT,
type: BMAP_NAVIGATION_CONTROL_LARGE
})
);
// 5
var geolocationControl = new BMap.GeolocationControl({
anchor: BMAP_ANCHOR_BOTTOM_LEFT
});
geolocationControl.addEventListener("locationSuccess", function (e) {
that.getAddrByPoint(e.point);
});
geolocationControl.addEventListener("locationError", function (e) {
alert(e.message);
});
this.map.addControl(geolocationControl);
// 6
// this.geolocation();
// 7
this.map.addEventListener("click", function (e) {
that.getAddrByPoint(e.point);
});
},
//
geolocation() {
var that = this;
var geolocation = new BMap.Geolocation();
//console.log(geolocation);
geolocation.getCurrentPosition(
function (res) {
//console.log(res.point);
if (res != undefined || res != null) {
that.getAddrByPoint(res.point);
} else {
res.point.lat = 39.915095185635316
res.point.lng = 116.40397079994426
that.getAddrByPoint(res.point);
var point = new BMap.Point(39.915095185635316, 116.40397079994426);
}
},
{ enableHighAccuracy: true }
);
},
// 2
getAddrByPoint(point) {
var that = this;
var geco = new BMap.Geocoder();
geco.getLocation(point, function (res) {
that.$emit("getAddrByPoint", res);
that.form = res;
that.mk.setPosition(point);
that.map.panTo(point);
});
},
// 8-1
querySearchAsync(str, cb) {
var options = {
onSearchComplete: function (res) {
var s = [];
if (local.getStatus() == BMAP_STATUS_SUCCESS) {
for (var i = 0; i < res.getCurrentNumPois(); i++) {
s.push(res.getPoi(i));
}
cb(s);
} else {
cb(s);
}
}
};
var local = new BMap.LocalSearch(this.map, options);
local.search(str);
},
// 8-2
handleSelect(item) {
this.form.address = item.address + item.title;
this.form.addrPoint = item.point;
this.list = item;
this.map.clearOverlays();
this.mk = new BMap.Marker(item.point);
this.map.addOverlay(this.mk);
this.map.panTo(item.point);
}
}
};
</script>
<style >
.el-icon-location-information {
color: white !important;
}
</style>

@ -0,0 +1,86 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="600px">
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText" class="margin-top-xs" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
<el-table-column label="选择" width="60">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
{{ "" }}
</el-radio>
</template>
</el-table-column>
<el-table-column align="center" width="100" prop="brandNumber" label="水牌号"></el-table-column>
<el-table-column align="center" min-width="120" prop="staffName" label="名字"></el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="dialogVisible = false"> </el-button>
<el-button size="mini" type="primary" @click="confirms()">
</el-button>
</span>
</el-dialog>
</template>
<script>
import { selectListType } from "@/api/eashier.js";
export default {
data() {
return {
radio: null, //
radioForm: {}, //
list: [], //
dialogVisible: false, //
elementLoadingText: "数据加载中...", //list
listLoading: false, //list
title: "选择员工",
selectNumber: 0,
staffName: "",
staffList: [],
};
},
methods: {
//
show(form) {
this.list = [];
this.radio = null;
this.radioForm = {};
this.dialogVisible = true;
this.getData();
},
//
rowClick(row) {
console.log(row);
this.radio = row.id;
this.radioForm = row;
},
//
async getData() {
this.listLoading = true;
let form = { id: "", type: 0 };
if (this.staffName) {
form.staffName = this.staffName;
}
selectListType(form).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
this.list = Array.from(new Set(res.rows));
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
confirms() {
this.radioForm.ratioShow = false;
this.$emit("adminData", this.radioForm);
this.dialogVisible = false;
},
},
};
</script>
<style>
</style>

@ -0,0 +1,67 @@
<template>
<div class="excel">
<el-upload class="upload-demo" action="/" ref='upload' accept=".xlsx" :http-request="httprequest" :on-preview="handlePreview" :on-remove="handleRemove" :before-remove="beforeRemove" multiple :limit="1" :on-exceed="handleExceed" :file-list="fileList">
<el-button size="mini" type="primary">添加文档</el-button>
<div slot="tip" class="el-upload__tip">只能上传excel格式的文档</div>
</el-upload>
<br>
<br>
<div class="header_flex">
<span></span>
<div>
<el-button size='mini' type="primary" plain @click="cencal( infoDialog = false)"> </el-button>
<el-button size='mini' type="primary" @click="confirm( infoDialog = false)"> </el-button>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
fileList: [],
fileData: new FormData(),
infoDialog: false,
file: null,
};
},
methods: {
cencal() {
this.$emit("infoDialogV", this.infoDialog);
},
confirm() {
this.$refs.upload.submit();
this.$emit("infoDialogV", this.infoDialog);
this.$emit("fileData", this.file);
},
httprequest(file) {
this.file = file.file;
// this.fileData.append('file', file.file)
},
handleRemove(file, fileList) {
//console.log(file, fileList);
},
handlePreview(file) {
//console.log(file);
},
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList.length
} 个文件`
);
},
beforeRemove(file, fileList) {
return file.name;
},
},
};
</script>
<style>
.excel .upload-demo > li {
height: 50px;
font-size: 18px !important;
}
</style>

@ -0,0 +1,86 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="600px">
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText" class="margin-top-xs" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
<el-table-column label="选择" width="60">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
{{ "" }}
</el-radio>
</template>
</el-table-column>
<el-table-column align="center" width="100" prop="brandNumber" label="水牌号"></el-table-column>
<el-table-column align="center" min-width="120" prop="staffName" label="名字"></el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="dialogVisible = false"> </el-button>
<el-button size="mini" type="primary" @click="confirms()">
</el-button>
</span>
</el-dialog>
</template>
<script>
import { QuerCompetent } from "@/api/eashier.js";
export default {
data() {
return {
radio: null, //
radioForm: {}, //
list: [], //
dialogVisible: false, //
elementLoadingText: "数据加载中...", //list
listLoading: false, //list
title: "选择员工",
selectNumber: 0,
staffName: "",
staffList: [],
};
},
methods: {
//
show(form) {
this.list = [];
this.radio = null;
this.radioForm = {};
this.dialogVisible = true;
this.getData();
},
//
rowClick(row) {
console.log(row);
this.radio = row.id;
this.radioForm = row;
},
//
async getData() {
this.listLoading = true;
let form = { id: "", type: 0 };
if (this.staffName) {
form.staffName = this.staffName;
}
QuerCompetent(form).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
this.list = Array.from(new Set(res.rows));
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
confirms() {
this.radioForm.ratioShow = false;
this.$emit("adminData", this.radioForm);
this.dialogVisible = false;
},
},
};
</script>
<style>
</style>

@ -0,0 +1,200 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag width="600px" powerId="form" :title="title" :visible.sync="dialogFormVisible" :before-close="handleClose">
<div style="padding-left:80px">
<el-form :model="form" :rules="rules" ref="form" label-width="120px">
<div class="form">
<el-form-item label="姓名" prop="memberName">
<el-input oninput="value=value.replace(/[\d]/g,'')" ref="memberName" v-model="form.memberName" value autocomplete="on" maxlength="8"></el-input>
</el-form-item>
<el-form-item label="性别" prop="sex">
<el-radio v-model="form.sex" :label="1"></el-radio>
<el-radio v-model="form.sex" :label="0"></el-radio>
</el-form-item>
<el-form-item label="手机" prop="mobilePhone" v-if="title=='添加'">
<el-input oninput="this.value=this.value.replace(/\D/g,'')" pattern="[0-9]*" v-model="form.mobilePhone" value autocomplete="on" maxlength="11"></el-input>
</el-form-item>
<!-- <el-form-item label="登录密码:" prop="password" >
<el-input type="password" v-model="form.password" autocomplete="off"></el-input>
</el-form-item> -->
<el-form-item label="标签">
<el-input v-model="form.label" value autocomplete="on"></el-input>
<el-input v-model="form.label" style="position:fixed;bottom:-9999px;" autocomplete="on"></el-input>
</el-form-item>
<el-form-item label="支付密码:" prop="cashPassword" v-if="title=='添加'">
<el-input type="text" style="position:fixed;bottom:-9999px;" autocomplete="off"></el-input>
<el-input type="password" v-model="form.cashPassword" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="确认密码:" prop="checkPass" v-if="title=='添加'">
<el-input type="text" style="position:fixed;bottom:-9999px;" autocomplete="off"></el-input>
<el-input type="password" v-model="form.checkPass" autocomplete="off"></el-input>
</el-form-item>
</div>
</el-form>
</div>
<div slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="(dialogFormVisible = false)"> </el-button>
<el-button size="mini" type="primary" @click="confirm()"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { partten } from "../../../../partten/index";
import { addstoreMember, storeMemberedit } from "@/api/eashier.js";
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入密码"));
} else {
if (this.form.checkPass !== "") {
this.$refs.form.validateField("checkPass");
}
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === "") {
callback(new Error("请再次输入密码"));
} else if (value !== this.form.cashPassword) {
callback(new Error("两次输入密码不一致!"));
} else {
callback();
}
};
return {
dialogFormVisible: false, //
form: {}, //
title: "添加",
rules: {
cashPassword: [
{
required: true,
message: "请填支付密码",
trigger: ["blur", "change"],
},
{ validator: validatePass, trigger: "blur" },
],
checkPass: [{ validator: validatePass2, trigger: ["blur", "change"] }],
mobilePhone: [
{
required: true,
message: "请填写手机号!",
trigger: ["blur", "change"],
},
],
password: [
{
required: true,
message: "请输入登录密码!",
trigger: ["blur", "change"],
},
],
memberName: [
{
required: true,
message: "请填写名字!",
trigger: ["blur", "change"],
},
],
sex: [
{
required: true,
message: "请选择性别!",
trigger: ["blur", "change"],
},
],
},
};
},
methods: {
//
handleClose() {
this.form = {};
this.dialogFormVisible = false;
this.$refs.form.clearValidate();
},
//
show(row) {
if (row == "添加") {
this.form = {};
this.title = row;
} else {
this.form = { ...row };
this.form.checkPass = this.form.cashPassword;
this.title = "修改";
}
setTimeout(() => {
this.$refs.memberName.focus();
this.$refs.memberName.select();
this.$refs.form.clearValidate();
}, 300);
this.dialogFormVisible = true;
},
//
confirm() {
this.$refs.form.validate(async (valid) => {
if (valid) {
if (partten.phoneNum.test(this.form.mobilePhone)) {
if (this.title == "添加") {
if (this.form.checkPass == this.form.cashPassword) {
this.form.storeId = sessionStorage.getItem("parentId");
this.form.storeName = sessionStorage.getItem("parentName");
addstoreMember(this.form).then((res) => {
if (res.code == "000000") {
this.$message.success({ message: "添加成功!" });
this.$emit("editData", this.form);
this.dialogFormVisible = false;
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
} else {
this.$message.error({ message: "两次输入密码不一致" });
}
} else {
storeMemberedit(this.form).then((res) => {
if (res.code == "000000") {
this.$message.success({ message: "修改成功!" });
this.$emit("editData");
this.dialogFormVisible = false;
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
}
} else {
this.$alert("请输入正确的11位手机号", "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
}
});
},
},
};
</script>
<style scoped>
.el-input {
width: 260px;
}
</style>

@ -0,0 +1,131 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="800px" append-to-body>
<el-input class="form-width-ms" v-model="queryForm.memberName" placeholder="请输入会员名字"></el-input>
<el-button size="mini" type="primary" @click="getData"></el-button>
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" class="margin-top-xs" :element-loading-text="elementLoadingText" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
<el-table-column label="选择" width="60">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
{{ "" }}
</el-radio>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="memberNum" label="会员编码" min-width="120"></el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="memberName" label="会员姓名" min-width="100"></el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="sex" label="性别" min-width="60">
<template slot-scope="scope">{{scope.row.sex==1?'男':'女'}}</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="mobilePhone" label="手机号码" min-width="120">
<template slot-scope="scope">{{scope.row.mobilePhone | phone}}</template>
</el-table-column>
<el-table-column align="center" prop="label" label="标签" min-width="100" :show-overflow-tooltip="true"></el-table-column>
<el-table-column align="center" prop="memberStoreName" label="所属门店" min-width="140" :show-overflow-tooltip="true"></el-table-column>
</el-table>
<!-- 分页组件 -->
<el-pagination align="left" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="queryForm.pageNum" :page-sizes="[10,20,30,40,50]" :page-size="queryForm.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="dialogVisible = false"> </el-button>
<el-button size="mini" type="primary" @click="confirms()">
</el-button>
</span>
</el-dialog>
</template>
<script>
import { storeMemberpage } from "@/api/storeManage.js";
import { storeMemberOne } from "@/api/eashier.js";
export default {
data() {
return {
radio: null, //
radioForm: {}, //
list: [], //
dialogVisible: false, //
title: "选择会员",
listLoading: false, //list
elementLoadingText: "数据加载中...", //list
total: 0, //
queryForm: {
//
pageNum: 1,
pageSize: 10,
},
};
},
methods: {
//
show(form) {
this.staffList = [];
if (form) {
this.radio = form.id;
this.radioForm = { ...form };
} else {
this.radio = null;
this.radioForm = {};
}
this.dialogVisible = true;
this.getData();
},
//
rowClick(row) {
this.radio = row.id;
this.radioForm = row;
},
//
handleSizeChange(val) {
// //console.log(` ${val} `);
this.queryForm.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
// //console.log(`: ${val}`);
this.queryForm.pageNum = val;
this.getData();
},
//
async getData() {
this.queryForm.storeId = sessionStorage.getItem("parentId");
this.queryForm.state = 1;
this.listLoading = true;
storeMemberpage(this.queryForm).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
this.list = res.pageInfo.list;
this.total = res.pageInfo.total;
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
confirms() {
this.radioForm.ratioShow = false;
storeMemberOne({
mobilePhone: this.radioForm.mobilePhone,
storeId: sessionStorage.getItem("parentId"),
}).then((res) => {
if (res.code == "000000") {
this.dialogVisible = false;
this.$emit("memberData", res.data);
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
},
};
</script>
<style>
</style>

@ -0,0 +1,352 @@
<template>
<div>
<rec ref="rec"></rec>
<pro ref="pro"></pro>
<cash ref="cash"></cash>
<repay ref="repay"></repay>
<refRec ref="refRec"></refRec>
<refPro ref="refPro"></refPro>
<refCash ref="refCash"></refCash>
<protopro ref="protopro"></protopro>
<protorec ref="protorec"></protorec>
<promotion ref="promotion"></promotion>
</div>
</template>
<script>
import rec from "@/pages/eashier/collectionList/components/detail.vue";
import pro from "@/pages/eashier/reatment/components/detail.vue";
import cash from "@/pages/eashier/proceeds/detail/editform.vue";
import refRec from "@/pages/eashier/refundRecharge/components/detail.vue";
import refPro from "@/pages/eashier/refundCourse/components/detail.vue";
import refCash from "@/pages/eashier/refund/components/detail.vue";
import protopro from "@/pages/eashier/raiseReatment/components/detail.vue";
import protorec from "@/pages/eashier/coursetorec/components/detail.vue";
import repay from "@/pages/eashier/repayment/components/index.vue";
import promotion from "@/pages/promotion/sellpacking/components/detail.vue";
import {
recDetail,
proDetail,
cashDetail,
cardChangeDetail,
protoDetail,
repayDetail,
refOrderDetail,
promotionDetail,
} from "@/api/eashier.js";
export default {
components: {
rec,
pro,
cash,
refRec,
refPro,
refCash,
protopro,
protorec,
promotion,
repay,
},
data() {
return {
form: {}, //
itemList: [
//
{
docType: "upgrade_out",
docTypeName: "升级转出",
},
{
docType: "upgrade_in",
docTypeName: "升级充值",
},
{
docType: "demotion_out",
docTypeName: "降级转出",
},
{
docType: "demotion_in",
docTypeName: "降级充值",
},
{
docType: "init",
docTypeName: "初始化",
},
{
docType: "card_recharge",
docTypeName: "充值开卡",
},
{
docType: "recharge_roll_course",
docTypeName: "疗程转充值卡",
},
{
docType: "card_change",
docTypeName: "加价转疗程",
},
{
docType: "card_use",
docTypeName: "疗程开卡",
},
{
docType: "store_cash",
docTypeName: "收银",
},
{
docType: "card_repay",
docTypeName: "还款",
},
{
docType: "refund_recharge",
docTypeName: "充值退款",
},
{
docType: "refund_course",
docTypeName: "疗程退款",
},
{
docType: "refund_cash",
docTypeName: "消费退款",
},
{
docType: "promotion",
docTypeName: "促销活动",
},
{
docType: "promotion_card_repay",
docTypeName: "促销还款",
},
],
queryForm: {
//
pageNum: 1,
pageSize: 10,
},
};
},
methods: {
//
show(form) {
this.querForm = { pageNum: 1, pageSize: 10 };
this.queryForm.id = form.docId;
this.queryForm.storeId = form.storeId;
var item = {};
if (
form.docType == "card_recharge" ||
form.docType == "upgrade_out" ||
form.docType == "upgrade_in" ||
form.docType == "demotion_out" ||
form.docType == "demotion_in"
) {
//
if (form.inputDate) {
this.queryForm.selectDate = form.inputDate;
} else {
this.queryForm.selectDate = form.docDate;
}
console.log(this.queryForm);
console.log(form);
recDetail(this.queryForm).then((res) => {
if (res.code == "000000") {
if (res.pageInfo.total == 0) {
this.backCalls();
} else {
item = res.pageInfo.list[0];
this.$refs.rec.show(item, "明细");
}
} else {
this.backCall(res);
}
});
}
if (form.docType == "card_use") {
//
if (form.inputDate) {
this.queryForm.selectDate = form.inputDate;
} else {
this.queryForm.selectDate = form.docDate;
}
proDetail(this.queryForm).then((res) => {
if (res.code == "000000") {
if (res.pageInfo.total == 0) {
this.backCalls();
} else {
item = res.pageInfo.list[0];
this.$refs.pro.show(item, "明细");
}
} else {
this.backCall(res);
}
});
}
if (form.docType == "store_cash") {
//
if (form.inputDate) {
this.queryForm.selectDate = form.inputDate;
} else {
this.queryForm.selectDate = form.docDate;
}
cashDetail(this.queryForm).then((res) => {
if (res.code == "000000") {
if (res.pageInfo.total == 0) {
this.backCalls();
} else {
item = res.pageInfo.list[0];
this.$refs.cash.show(item, "明细");
}
} else {
this.backCall(res);
}
});
}
if (form.docType == "card_change") {
//
console.log(form.docType);
cardChangeDetail(this.queryForm).then((res) => {
if (res.code == "000000") {
if (res.pageInfo.total == 0) {
this.backCalls();
} else {
item = res.pageInfo.list[0];
this.$refs.protopro.show(item, "明细");
}
} else {
this.backCall(res);
}
});
}
if (form.docType == "recharge_roll_course") {
//
protoDetail(this.queryForm).then((res) => {
if (res.code == "000000") {
if (res.pageInfo.total == 0) {
this.backCalls();
} else {
item = res.pageInfo.list[0];
this.$refs.protorec.show(item, "明细");
}
} else {
this.backCall(res);
}
});
}
if (
form.docType == "card_repay" ||
form.docType == "promotion_card_repay"
) {
//
repayDetail(this.queryForm).then((res) => {
if (res.code == "000000") {
if (res.pageInfo.total == 0) {
this.backCalls();
} else {
item = res.pageInfo.list[0];
this.$refs.repay.show(item, "明细");
}
} else {
this.backCall(res);
}
});
}
if (form.docType == "refund_recharge") {
//退
this.queryForm.type = 0;
refOrderDetail(this.queryForm).then((res) => {
if (res.code == "000000") {
if (res.pageInfo.total == 0) {
this.backCalls();
} else {
item = res.pageInfo.list[0];
this.$refs.refRec.show(item, "明细");
}
} else {
this.backCall(res);
}
});
}
if (form.docType == "refund_course") {
//退
this.queryForm.type = 1;
refOrderDetail(this.queryForm).then((res) => {
if (res.code == "000000") {
if (res.pageInfo.total == 0) {
this.backCalls();
} else {
item = res.pageInfo.list[0];
this.$refs.refPro.show(item, "明细");
}
} else {
this.backCall(res);
}
});
}
if (form.docType == "refund_cash") {
//退
this.queryForm.type = 2;
refOrderDetail(this.queryForm).then((res) => {
if (res.code == "000000") {
if (res.pageInfo.total == 0) {
this.backCalls();
} else {
item = res.pageInfo.list[0];
this.$refs.refCash.show(item, "明细");
}
} else {
this.backCall(res);
}
});
}
if (form.docType == "promotion") {
//
promotionDetail(this.queryForm).then((res) => {
if (res.code == "000000") {
if (res.pageInfo.total == 0) {
this.backCalls();
} else {
item = res.pageInfo.list[0];
this.$refs.promotion.show(item, "明细");
}
} else {
this.backCall(res);
}
});
}
if (form.docType == "init") {
this.$alert("初始化没有单据明细", "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
},
backCall(res) {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
},
backCalls() {
this.$alert("没有找到相关明细", "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
},
},
};
</script>
<style>
</style>

@ -0,0 +1,135 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" append-to-body width="75%">
<el-alert title="双击查看明细" type="info"></el-alert>
<el-table @row-dblclick="confirm" :data="list" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
<el-table-column align="center" width="100" prop="docTypeName" label="单据类别"></el-table-column>
<el-table-column align="center" width="120" show-overflow-tooltip prop="docNum" label="单号"></el-table-column>
<el-table-column align="center" width="120" show-overflow-tooltip prop="tradeName" label="项目名称"></el-table-column>
<el-table-column align="center" min-width="80" prop="saleRatio" label="占比(%)"></el-table-column>
<el-table-column align="center" min-width="80" prop="cardAchi" label="卡付业绩">
<template slot-scope="scope">
{{scope.row.cardAchi?scope.row.cardAchi:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="cardComm" label="卡付提成">
<template slot-scope="scope">
{{scope.row.cardComm?scope.row.cardComm:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="cashAchi" label="现付业绩">
<template slot-scope="scope">
{{scope.row.cashAchi?scope.row.cashAchi:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="cashComm" label="现付提成">
<template slot-scope="scope">
{{scope.row.cashComm?scope.row.cashComm:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="saleAchievementAmount" label="总业绩"></el-table-column>
<el-table-column align="center" min-width="80" prop="saleCommissionAmount" label="总提成"></el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" @click="dialogVisible = false">关闭</el-button>
</el-button>
</span>
</el-dialog>
</template>
<script>
import { achiCommDetailList } from "@/api/eashier.js";
export default {
data() {
return {
list: [], //
dialogVisible: false, //
elementLoadingText: "数据加载中...", //list
listLoading: false, //list
title: "员工业绩提成",
itemList: [
//
{
docType: "card_recharge",
docTypeName: "充值开卡",
},
{
docType: "recharge_roll_course",
docTypeName: "疗程转充值卡",
},
{
docType: "card_use",
docTypeName: "疗程开卡",
},
{
docType: "store_cash",
docTypeName: "收银",
},
{
docType: "card_repay",
docTypeName: "还款",
},
{
docType: "refund_recharge",
docTypeName: "充值退款",
},
{
docType: "refund_course",
docTypeName: "疗程退款",
},
{
docType: "refund_cash",
docTypeName: "消费退款",
},
{
docType: "promotion",
docTypeName: "促销活动",
},
],
form: {}, //
};
},
methods: {
//
show(form) {
this.form = { ...form };
this.dialogVisible = true;
this.getData();
},
//
async getData() {
this.listLoading = true;
let form = {
classify: this.form.classify,
date: this.form.date,
staffId: this.form.staffId,
};
achiCommDetailList(form).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
res.rows.forEach((item) => {
this.itemList.forEach((items) => {
if (item.docType == items.docType) {
item.docTypeName = items.docTypeName;
}
});
});
this.list = res.rows;
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
confirm() {},
},
};
</script>
<style>
</style>

@ -0,0 +1,115 @@
<template>
<el-dialog :close-on-click-modal="false" append-to-body v-dialogDrag :title="title" :visible.sync="dialogVisible" width="500px">
<el-alert title="双击查看明细" type="info"></el-alert>
<el-table @row-dblclick="confirm" :data="list" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
<el-table-column align="center" min-width="120" prop="typeName" label="单据类别"></el-table-column>
<el-table-column align="center" min-width="120" prop="achievementAmount" label="业绩"></el-table-column>
<el-table-column align="center" min-width="120" prop="commissionAmount" label="提成"></el-table-column>
</el-table>
<detail ref="detail"></detail>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" @click="dialogVisible=false"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { achiCommClassifyList } from "@/api/eashier.js";
import detail from "./detail/index";
export default {
components: { detail },
data() {
return {
list: [], //
dialogVisible: false, //
elementLoadingText: "数据加载中...", //list
listLoading: false, //list
title: "员工业绩提成",
form: {}, //
typeList: [
{
typeName: "充值",
typeIndex: 0,
},
{
typeName: "疗程",
typeIndex: 1,
},
{
typeName: "服务",
typeIndex: 2,
},
{
typeName: "还款",
typeIndex: 3,
},
{
typeName: "充值退",
typeIndex: 4,
},
{
typeName: "疗程退",
typeIndex: 5,
},
{
typeName: "消费退",
typeIndex: 6,
},
{
typeName: "促销",
typeIndex: 7,
},
],
};
},
methods: {
show(form, date) {
this.form = { ...form };
this.title = form.brandNumber + "--" + form.staffName;
this.dialogVisible = true;
this.getData(date);
},
//
rowClick(row) {
console.log(row);
this.radio = row.id;
this.radioForm = row;
},
getData(date) {
this.listLoading = true;
let form = {
type: 2,
date: date,
staffId: this.form.staffId,
};
achiCommClassifyList(form).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
res.rows.forEach((item) => {
this.typeList.forEach((items) => {
if (item.classify * 1 == items.typeIndex) {
item.typeName = items.typeName;
}
});
});
this.list = res.rows;
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
confirm(row) {
this.$refs.detail.show(row);
},
},
};
</script>
<style>
</style>

@ -0,0 +1,95 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" append-to-body :visible.sync="dialogVisible" width="60%">
<el-alert title="双击查看明细" type="info"></el-alert>
<el-table @row-dblclick="confirm" :data="list" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
<el-table-column align="center" min-width="120" prop="date" label="日期"></el-table-column>
<el-table-column align="center" min-width="80" prop="cardAchi" label="卡付业绩">
<template slot-scope="scope">
{{scope.row.cardAchi?scope.row.cardAchi:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="cardComm" label="卡付提成">
<template slot-scope="scope">
{{scope.row.cardComm?scope.row.cardComm:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="cashAchi" label="现付业绩">
<template slot-scope="scope">
{{scope.row.cashAchi?scope.row.cashAchi:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="cashComm" label="现付提成">
<template slot-scope="scope">
{{scope.row.cashComm?scope.row.cashComm:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="120" prop="achievementAmount" label="业绩"></el-table-column>
<el-table-column align="center" min-width="120" prop="commissionAmount" label="提成"></el-table-column>
</el-table>
<detail ref="detail"></detail>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" @click="dialogVisible=false"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { achiCommList } from "@/api/eashier.js";
import detail from "../index";
export default {
components: { detail },
data() {
return {
list: [], //
dialogVisible: false, //
elementLoadingText: "数据加载中...", //list
listLoading: false, //list
title: "员工业绩提成",
form: {}, //
};
},
methods: {
show(form, date) {
this.form = { ...form };
this.title = form.brandNumber + "--" + form.staffName;
this.dialogVisible = true;
this.getData();
},
//
rowClick(row) {
console.log(row);
this.radio = row.id;
this.radioForm = row;
},
//
async getData() {
this.listLoading = true;
let form = {
type: this.form.type,
staffId: this.form.staffId,
};
achiCommList(form).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
this.list = res.rows;
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
confirm(row) {
this.$refs.detail.show(row, row.date);
},
},
};
</script>
<style>
</style>

@ -0,0 +1,135 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" append-to-body width="75%">
<el-alert title="双击查看明细" type="info"></el-alert>
<el-table @row-dblclick="confirm" :data="list" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
<el-table-column align="center" width="100" prop="docTypeName" label="单据类别"></el-table-column>
<el-table-column align="center" width="120" show-overflow-tooltip prop="docNum" label="单号"></el-table-column>
<el-table-column align="center" width="120" show-overflow-tooltip prop="tradeName" label="项目名称"></el-table-column>
<el-table-column align="center" min-width="80" prop="saleRatio" label="占比(%)"></el-table-column>
<el-table-column align="center" min-width="80" prop="cardAchi" label="卡付业绩">
<template slot-scope="scope">
{{scope.row.cardAchi?scope.row.cardAchi:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="cardComm" label="卡付提成">
<template slot-scope="scope">
{{scope.row.cardComm?scope.row.cardComm:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="cashAchi" label="现付业绩">
<template slot-scope="scope">
{{scope.row.cashAchi?scope.row.cashAchi:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="cashComm" label="现付提成">
<template slot-scope="scope">
{{scope.row.cashComm?scope.row.cashComm:'--'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="saleAchievementAmount" label="总业绩"></el-table-column>
<el-table-column align="center" min-width="80" prop="saleCommissionAmount" label="总提成"></el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" @click="dialogVisible = false">关闭</el-button>
</el-button>
</span>
</el-dialog>
</template>
<script>
import { achiCommDetailList } from "@/api/eashier.js";
export default {
data() {
return {
list: [], //
dialogVisible: false, //
elementLoadingText: "数据加载中...", //list
listLoading: false, //list
title: "员工业绩提成",
itemList: [
//
{
docType: "card_recharge",
docTypeName: "充值开卡",
},
{
docType: "recharge_roll_course",
docTypeName: "疗程转充值卡",
},
{
docType: "card_use",
docTypeName: "疗程开卡",
},
{
docType: "store_cash",
docTypeName: "收银",
},
{
docType: "card_repay",
docTypeName: "还款",
},
{
docType: "refund_recharge",
docTypeName: "充值退款",
},
{
docType: "refund_course",
docTypeName: "疗程退款",
},
{
docType: "refund_cash",
docTypeName: "消费退款",
},
{
docType: "promotion",
docTypeName: "促销活动",
},
],
form: {}, //
};
},
methods: {
//
show(form) {
this.form = { ...form };
this.dialogVisible = true;
this.getData();
},
//
async getData() {
this.listLoading = true;
let form = {
classify: this.form.classify,
date: this.form.date,
staffId: this.form.staffId,
};
achiCommDetailList(form).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
res.rows.forEach((item) => {
this.itemList.forEach((items) => {
if (item.docType == items.docType) {
item.docTypeName = items.docTypeName;
}
});
});
this.list = res.rows;
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
confirm() {},
},
};
</script>
<style>
</style>

@ -0,0 +1,188 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="70%" append-to-body>
<div class="flex justify-end padding-bottom-xs" v-if="!form.memberName">
<el-input class="form-width-m " size="small" v-model="queryForm.id" clearable placeholder="项目编码搜索"></el-input>
<el-input class="form-width-m margin-left-xs" size="small" v-model="queryForm.projectName" clearable placeholder="项目名称搜索"></el-input>
<el-button class="margin-left-xs" size="mini" type="primary" @click="getData"></el-button>
</div>
<div v-if="!form.memberName">
<el-table @row-dblclick="confirms" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
<el-table-column label="选择" width="60">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row">
{{ "" }}
</el-radio>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="projectNum" label="项目编码" min-width="100"></el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="projectName" label="项目名称" min-width="120"></el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="minumumTimes" label="最低销售次数" min-width="60"></el-table-column>
<el-table-column align="center" label="散客">
<el-table-column align="center" min-width="75" prop="price" label="标价"></el-table-column>
<el-table-column align="center" min-width="80" prop="topPrice" label="最高价"></el-table-column>
<el-table-column align="center" min-width="80" prop="minumumPrice" label="最低价"></el-table-column>
</el-table-column>
<el-table-column align="center" label="会员">
<el-table-column align="center" min-width="75" prop="priceMember" label="标价"></el-table-column>
<el-table-column align="center" min-width="80" prop="topPriceMember" label="最高价"></el-table-column>
<el-table-column align="center" min-width="80" prop="minumumPriceMember" label="最低价"></el-table-column>
</el-table-column>
<el-table-column align="center" prop="isCardPay" label="允许卡付" min-width="80">
<template slot-scope="scope">{{
scope.row.isCardPay == 0 ? "是" : scope.row.isCardPay == 1?'否':"未设"
}}</template>
</el-table-column>
<el-table-column align="center" prop="noDiscount" label="卡付打折" min-width="80">
<template slot-scope="scope">{{
scope.row.noDiscount == 0 ? "是" : scope.row.noDiscount == 1?'否':"未设"
}}</template>
</el-table-column>
</el-table>
</div>
<el-table @row-dblclick="confirms" v-else :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}" :data="coureList" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
<el-table-column label="选择" width="60">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row">
{{ "" }}
</el-radio>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip min-width="100" align="left" prop="courseProjectNum" label="项目编码"></el-table-column>
<el-table-column show-overflow-tooltip min-width="120" align="left" prop="courseProjectName" label="项目名称"></el-table-column>
<el-table-column show-overflow-tooltip min-width="70" align="center" prop="price" label="项目单价"></el-table-column>
<el-table-column show-overflow-tooltip min-width="70" align="center" prop="courseRestCount" label="剩余次数"></el-table-column>
<el-table-column show-overflow-tooltip min-width="70" align="center" prop="courseRestPrice" label="剩余金额"></el-table-column>
<el-table-column show-overflow-tooltip min-width="70" align="center" prop="courseConsumeCount" label="可用次数"></el-table-column>
<el-table-column show-overflow-tooltip min-width="105" align="center" prop="endTime" label="到期日期"></el-table-column>
<el-table-column show-overflow-tooltip min-width="120" align="center" prop="storeName" label="所属门店"></el-table-column>
</el-table>
<!-- 分页组件 -->
<el-pagination v-if="!form.memberName" align="left" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="queryForm.pageNum" :page-sizes="[10,20,30,40,50]" :page-size="queryForm.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="dialogVisible = false"> </el-button>
<el-button size="mini" type="primary" @click="confirms()">
</el-button>
</span>
</el-dialog>
</template>
<script>
import { propageNew } from "@/api/storeManage.js";
import { couAccountList } from "@/api/eashier.js";
export default {
data() {
return {
radio: null, //
radioForm: {}, //
list: [], //
coureList: [],
dialogVisible: false, //
listLoading: false, //list
elementLoadingText: "数据加载中...", //list
title: "选择门店项目", //
total: 0, //
form: {}, //
queryForm: {
//
pageNum: 1,
pageSize: 10,
state: 1,
projectName: "",
},
courseProjectId: "", //
};
},
methods: {
//
show(form, id) {
this.courseProjectId = id;
this.coureList = [];
this.list = [];
this.form = {};
if (form == 1 || form == 0 || form == 3) {
if (form != 3) {
this.queryForm.directConsumption = form;
}
} else {
this.form = { ...form };
}
this.radio = null;
this.radioForm = {};
this.list = [];
this.getData();
this.dialogVisible = true;
},
//
rowClick(row) {
this.radio = row.id;
this.radioForm = row;
},
//
handleSizeChange(val) {
// //console.log(` ${val} `);
this.queryForm.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
// //console.log(`: ${val}`);
this.queryForm.pageNum = val;
this.getData();
},
//
async getData() {
this.listLoading = true;
if (this.form.memberName) {
this.title = "选择会员卡包疗程";
var memberIds = {
memberId: this.form.id,
};
if (this.courseProjectId) {
memberIds.courseProjectId = this.courseProjectId;
}
// courseAccountId
couAccountList(memberIds).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
res.rows.forEach((item) => {
item.courseAccountId = item.id;
});
this.coureList = res.rows;
} else {
this.$alert(res.message, "查询会员疗程", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
} else {
this.title = "选择门店项目";
propageNew(this.queryForm).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
this.total = res.pageInfo.total;
this.list = res.pageInfo.list;
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
}
},
confirms() {
this.$emit("projectData", this.radioForm);
this.dialogVisible = false;
},
},
};
</script>
<style>
</style>

@ -0,0 +1,133 @@
<template>
<el-dialog title="项目列表" :visible.sync="dialogFormVisible" append-to-body width="60%" @close="close">
<el-table border :data="list" max-height="600" ref="list" v-loading="listLoading" :element-loading-text="elementLoadingText" @row-click="getCurrentRow" :row-class-name="rowName" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="projectNum" label="项目编码" min-width="100"></el-table-column>
<el-table-column :show-overflow-tooltip="true" align="center" prop="projectName" label="项目名称" min-width="120"></el-table-column>
<el-table-column align="center" label="散客">
<el-table-column align="center" min-width="80" prop="price" label="标价"></el-table-column>
<el-table-column align="center" min-width="80" prop="topPrice" label="最高价"></el-table-column>
<el-table-column align="center" min-width="80" prop="minumumPrice" label="最低价"></el-table-column>
</el-table-column>
<el-table-column align="center" label="会员">
<el-table-column align="center" min-width="80" prop="priceMember" label="标价"></el-table-column>
<el-table-column align="center" min-width="80" prop="topPriceMember" label="最高价"></el-table-column>
<el-table-column align="center" min-width="80" prop="minumumPriceMember" label="最低价"></el-table-column>
</el-table-column>
</el-table>
<el-pagination background :current-page="queryForm.pageNum" :page-size="queryForm.pageSize" :layout="layout" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange"></el-pagination>
<div slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" @click="close"> </el-button>
<el-button size="mini" type="primary" @click="save"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { propage, setAchiCommList } from "@/api/storeManage.js";
export default {
data() {
return {
title: "",
listLoading: true,
dialogFormVisible: false,
dialogFormVisiblebz: false,
layout: "total, sizes, prev, pager, next, jumper",
total: 0, //
form: {}, //
elementLoadingText: "正在加载...",
list: [], //
queryForm: {
pageNum: 1,
pageSize: 10,
roleName: undefined,
userId: undefined,
},
currentRow: null,
radio: null, //
selection: [],
textarea2: "",
};
},
methods: {
fetchData() {
propage(this.queryForm).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
this.list = res.pageInfo.list;
this.total = res.pageInfo.total;
this.queryForm.pageNum = res.pageInfo.pageNum;
this.queryForm.pageSize = res.pageInfo.pageSize;
} else {
this.$alert(res.message, "查询门店疗程", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
getCurrentRow(row) {
this.$refs["list"].toggleRowSelection(row);
},
//
handleSelectionChange(selection) {
this.selection = selection;
console.log(this.selection);
},
//
rowName({ row, rowIndex }) {
row.index = rowIndex;
},
handleSizeChange(val) {
this.queryForm.pageSize = val;
this.fetchData();
},
handleCurrentChange(val) {
this.queryForm.pageNum = val;
this.fetchData();
},
close() {
this.queryForm = this.$options.data().queryForm;
this.dialogFormVisible = false;
},
//
save() {
let form = { ...this.form };
let list = [];
this.selection.forEach((item) => {
list.push(item.id);
});
form.projectRequests = list;
setAchiCommList(form).then((res) => {
if (res.code == "000000") {
this.$message.success({ message: "操作成功" });
this.$emit("selectProData", this.selection);
this.dialogFormVisible = false;
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
show(form) {
this.form = { ...form };
this.selection = [];
this.dialogFormVisible = true;
this.fetchData();
},
},
created: function () {},
};
</script>
<style></style>

@ -0,0 +1,89 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="1000px" append-to-body>
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText" class="margin-top-xs" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
<el-table-column label="选择" width="60">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
{{ "" }}
</el-radio>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip min-width="120" align="left" prop="rechargeTypeNum" label="充值编码"></el-table-column>
<el-table-column show-overflow-tooltip min-width="120" align="left" prop="rechargeTypeName" label="充值卡"></el-table-column>
<el-table-column show-overflow-tooltip min-width="80" align="left" prop="type" label="类别">
<template slot-scope="scope">
{{scope.row.type==0?'赠送卡':scope.row.type==1?'折扣卡':'活动卡'}}
</template>
</el-table-column>
<el-table-column show-overflow-tooltip min-width="80" align="center" prop="cardRestMoney" label="剩余金额"></el-table-column>
<el-table-column show-overflow-tooltip min-width="80" align="center" prop="cardConsumeMoney" label="可用金额"></el-table-column>
<el-table-column show-overflow-tooltip min-width="100" align="center" prop="discount" label="享受优惠(%)"></el-table-column>
<el-table-column show-overflow-tooltip min-width="80" align="center" prop="cardGiftMoney" label="赠送金额"></el-table-column>
<el-table-column show-overflow-tooltip min-width="100" align="center" prop="discountFreeAmount" label="赠送折扣(%)"></el-table-column>
<el-table-column show-overflow-tooltip min-width="105" align="center" prop="endTime" label="到期日期"></el-table-column>
</el-table>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="dialogVisible = false"> </el-button>
<el-button size="mini" type="primary" @click="confirms()"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { recAccountList } from "@/api/eashier.js";
export default {
data() {
return {
radio: null, //
radioForm: {}, //
list: [], //
dialogVisible: false, //
title: "选择会员充值帐户",
elementLoadingText: "数据加载中...", //list
listLoading: false, //list
};
},
methods: {
//
show(form) {
this.form = { ...form };
this.list = [];
this.dialogVisible = true;
this.getData();
},
//
rowClick(row) {
this.radio = row.id;
this.radioForm = row;
},
//
async getData() {
this.listLoading = true;
recAccountList({ memberId: this.form.memberId }).then((res) => {
this.listLoading = false;
if (res.code === "000000") {
this.listLoading = false;
this.list = res.rows;
} else {
this.$alert("查询会员充值帐户 : " + res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
confirms() {
this.$emit("recTypeData", this.radioForm);
this.dialogVisible = false;
},
},
};
</script>
<style>
</style>

@ -0,0 +1,124 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="1000px" append-to-body>
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText" class="margin-top-xs" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
<el-table-column label="选择" width="60">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
{{ "" }}
</el-radio>
</template>
</el-table-column>
<el-table-column align="center" show-overflow-tooltip min-width="100" prop="rechargeTypeNum" label="编码"></el-table-column>
<el-table-column align="center" show-overflow-tooltip min-width="120" prop="rechargeTypeName" label="名称"></el-table-column>
<el-table-column show-overflow-tooltip min-width="75" align="left" prop="type" label="类别">
<template slot-scope="scope">
{{scope.row.type==0?'赠送卡':scope.row.type==1?'折扣卡':'活动卡'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="75" prop="firstAmount" label="首充金额">
<template slot-scope="scope">{{scope.row.firstAmount?scope.row.firstAmount:'无首充'}}</template>
</el-table-column>
<el-table-column align="center" min-width="75" prop="rechargeMoney" label="续充金额"></el-table-column>
<el-table-column align="center" min-width="80" prop="discount" label="享受折扣(%)"></el-table-column>
<el-table-column align="center" min-width="75" prop="giftMoney" label="赠送金额">
<template slot-scope="scope">{{scope.row.giftMoney?scope.row.giftMoney:'无赠送'}}</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="discountFreeAmount" label="赠送折扣(%)">
<template slot-scope="scope">{{scope.row.discountFreeAmount?scope.row.discountFreeAmount:'无折扣'}}</template>
</el-table-column>
<el-table-column align="center" min-width="80" prop="validTime" label="有效期限(月)"></el-table-column>
<el-table-column align="center" show-overflow-tooltip min-width="115" prop="stopDates" label="到期日期"></el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="dialogVisible = false"> </el-button>
<el-button size="mini" type="primary" @click="confirms()"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { recTypeList } from "@/api/eashier.js";
export default {
data() {
return {
radio: null, //
radioForm: {}, //
list: [], //
dialogVisible: false, //
title: "选择充值类别", //
elementLoadingText: "数据加载中...", //list
listLoading: false, //list
selectNumber: null, //0 1 2
selcetList: [], //
};
},
methods: {
//
show(number, list) {
console.log(number);
console.log(list);
if (list) {
this.selcetList = list;
}
if (number) {
this.selectNumber = number;
}
this.list = [];
this.radio = null;
this.radioForm = {};
this.dialogVisible = true;
this.getData();
},
//
rowClick(row) {
this.radio = row.id;
this.radioForm = row;
},
//
async getData() {
this.listLoading = true;
let form = {
id: "",
storeId: sessionStorage.getItem("parentId"),
};
if (this.selectNumber) {
form.type = this.selectNumber;
}
recTypeList(form).then((res) => {
this.listLoading = false;
if (res.code === "000000") {
if (this.selcetList.length == 0) {
this.list = res.rows;
} else {
var list = [];
this.selcetList.forEach((item) => {
res.rows.forEach((items) => {
if (item.newRechargeTypeId == items.id) {
list.push(items);
}
});
});
this.list = list;
}
} else {
this.$alert("查询充值列表 : " + res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
confirms() {
this.$emit("recTypeData", this.radioForm);
this.dialogVisible = false;
},
},
};
</script>
<style>
</style>

@ -0,0 +1,136 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="1000px" append-to-body>
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :empty-text="'无'+title" :element-loading-text="elementLoadingText" class="margin-top-xs" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
<el-table-column label="选择" width="60">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
{{ "" }}
</el-radio>
</template>
</el-table-column>
<el-table-column align="center" show-overflow-tooltip min-width="120" prop="rechargeTypeName" label="名称"></el-table-column>
<el-table-column show-overflow-tooltip min-width="80" align="left" prop="type" label="类别">
<template slot-scope="scope">
{{scope.row.type==0?'赠送卡':scope.row.type==1?'折扣卡':'活动卡'}}
</template>
</el-table-column>
<el-table-column align="center" min-width="100" prop="firstAmount" label="首充金额">
<template slot-scope="scope">{{scope.row.firstAmount?scope.row.firstAmount:'无首充'}}</template>
</el-table-column>
<el-table-column align="center" prop="liftType" label="升降级" min-width="100" :show-overflow-tooltip="true" sortable>
<template slot-scope="scope">{{
scope.row.liftType == 0 ? "升级" :scope.row.liftType == 1 ?"降级":'无'
}}</template>
</el-table-column>
<el-table-column align="center" min-width="100" prop="rechargeMoney" label="续充金额"></el-table-column>
<el-table-column align="center" min-width="100" prop="discount" label="享受优惠"></el-table-column>
<el-table-column align="center" min-width="100" prop="giftMoney" label="赠送金额">
<template slot-scope="scope">{{scope.row.giftMoney?scope.row.giftMoney:'无赠送'}}</template>
</el-table-column>
<el-table-column align="center" min-width="100" prop="discountFreeAmount" label="赠送折扣">
<template slot-scope="scope">{{scope.row.discountFreeAmount?scope.row.discountFreeAmount:'无折扣'}}</template>
</el-table-column>
<el-table-column align="center" min-width="100" prop="validTime" label="有效期限(月)"></el-table-column>
<el-table-column align="center" show-overflow-tooltip min-width="115" prop="stopDates" label="到期日期"></el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="dialogVisible = false"> </el-button>
<el-button size="mini" type="primary" @click="confirms()"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { recTypeSjianjiList, recTypeSjianjiLists } from "@/api/storeManage.js";
export default {
data() {
return {
radio: null, //
radioForm: {}, //
list: [], //
dialogVisible: false, //
title: "充值类别",
elementLoadingText: "数据加载中...", //list
listLoading: false, //list
selectNumber: 0, //0 1 2
};
},
methods: {
//
show(form, number) {
this.radio = null;
this.radioForm = {};
this.dialogVisible = true;
if (form == 0 || form == 1 || form == 2) {
this.selectNumber = form;
this.getData();
} else {
this.selectNumber = -1;
this.form = { ...form };
if (number) {
this.selectNumber = number;
this.title = "选择升级卡";
}
this.getDatas();
}
},
//
rowClick(row) {
this.radio = row.id;
this.radioForm = row;
},
//
async getData() {
this.listLoading = true;
let form = {
id: "",
type: this.selectNumber,
storeId: sessionStorage.getItem("parentId"),
};
recTypeSjianjiList(form).then((res) => {
this.listLoading = false;
if (res.code === "000000") {
this.list = res.rows;
} else {
this.$alert("查询充值列表 : " + res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
async getDatas() {
let form = { liftCardId: this.form.id };
if (this.selectNumber >= 0) {
form.liftType = this.selectNumber - 1;
}
recTypeSjianjiLists(form).then((res) => {
this.listLoading = false;
if (res.code === "000000") {
this.list = res.rows;
} else {
this.$alert("查询充值列表 : " + res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
confirms() {
this.dialogVisible = false;
this.$emit("recTypeData", this.radioForm);
},
},
};
</script>
<style>
</style>

@ -0,0 +1,180 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag title="取消欠款" :visible.sync="cancelDialogVisible" width="650px" append-to-body :before-close="handleCloseCancel">
<el-form label-width="120px" inline>
<div v-if="form.docType=='promotion_card_use'">
<el-form-item label="会员名称">
{{form.memberName}}
</el-form-item>
<el-form-item label="手机号码">
{{form.memberName}}
</el-form-item>
<el-form-item label="促销名称">
{{form.tradeName}}
</el-form-item>
<el-form-item label="成交金额">
<span class="text-red text-price">
{{form.tradeMoney}}
</span>
</el-form-item>
<el-form-item label="欠款金额">
<span class="text-cyan text-price">
{{form.debtMoney}}
</span>
</el-form-item>
<el-form-item label="取消欠款">
<span class="text-cyan text-price">
{{form.cancelMoney}}
</span>
</el-form-item>
<el-table :data="form.cancelDebtMxes" :row-class-name="tableRowClassName" ref="multipleTable" highlight-current-row tooltip-effect="dark">
<el-table-column prop="courseProjectNum" show-overflow-tooltip label="项目编码" align="center" min-width="80"></el-table-column>
<el-table-column prop="courseProjectName" show-overflow-tooltip label="项目名称" align="center" min-width="120"></el-table-column>
<el-table-column prop="price" show-overflow-tooltip label="欠款" align="center" min-width="80">
<el-table-column prop="debtMoney" show-overflow-tooltip label="金额" align="center" min-width="80"></el-table-column>
<el-table-column prop="debtCount" show-overflow-tooltip label="次数" align="center" min-width="80"></el-table-column>
</el-table-column>
<el-table-column prop="price" show-overflow-tooltip label="取消欠款" align="center" min-width="80">
<el-table-column prop="cancelMoney" show-overflow-tooltip label="金额" align="center" min-width="80">
<template slot-scope="scope">
<div @click.stop>
<div class="text-cyan" v-if="editCancelMIndex!=scope.$index" @click="openEditCancelM(scope.row,scope.$index,editCancelMIndex=scope.$index)">
{{scope.row.cancelMoney}}
<i class="el-icon-edit text-cyan"></i>
</div>
<el-input v-focus oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" type="number" class="form-input-width-xs" v-else @blur="endEditCancelM(scope.row,editCancelMIndex=-1)" v-model="scope.row.cancelMoney"></el-input>
</div>
</template>
</el-table-column>
<el-table-column prop="cancelNum" show-overflow-tooltip label="次数" align="center" min-width="80">
<template slot-scope="scope">
<div @click.stop>
<div class="text-cyan" v-if="editCancelCIndex!=scope.$index" @click="openEditCancelC(scope.row,scope.$index,editCancelCIndex=scope.$index)">
{{scope.row.cancelNum}}
<i class="el-icon-edit text-cyan"></i>
</div>
<el-input v-focus oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" type="number" class="form-input-width-xs" v-else @blur="endEditCancelC(scope.row,editCancelCIndex=-1)" v-model="scope.row.cancelNum"></el-input>
</div>
</template>
</el-table-column>
</el-table-column>
</el-table>
</div>
<div v-else>
<el-form-item label="欠款帐户">
{{form.tradeName}}
</el-form-item>
<el-form-item label="成交金额">
<span class="text-red text-price">
{{form.tradeMoney}}
</span>
</el-form-item>
<el-form-item label="欠款金额">
<span class="text-cyan text-price">
{{form.debtMoney}}
</span>
</el-form-item>
<el-form-item label="取消欠款金额">
<el-input oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" type="number" class="form-width-ms" v-model="form.cancelMoney"></el-input>
</el-form-item>
<el-form-item label="取消欠款次数" v-if="form.docType == 'card_use'">
<el-input pattern="[0-9]*\" type="number" class="form-width-ms" v-model="form.cancelNum"></el-input>
</el-form-item>
</div>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="handleCloseCancel"> </el-button>
<el-button size="mini" type="primary" :loading="loading" @click="confirmCancel(loading=true)"> </el-button>
</span>
</el-dialog>
</template>
<script>
import { addCancelDebtList } from "@/api/eashier.js";
export default {
data() {
return {
loading: false, //
form: {}, //
cancelDialogVisible: false, //
editCancelCIndex: -1, //>:
editCancelMIndex: -1, //>:
};
},
methods: {
//
tableRowClassName({ row, rowIndex }) {
row.index = rowIndex;
},
//
show(form) {
this.form = { ...form };
this.cancelDialogVisible = true;
},
//
handleCloseCancel() {
this.form = {};
this.cancelDialogVisible = false;
this.$emit("cancelData");
},
//
openEditCancelM(row, index) {},
//
endEditCancelM(row) {
if (row.cancelMoney * 1 > row.debtMoney) {
this.$message.waring({ message: "最高可以取消" + row.debtMoney });
row.cancelMoney = row.debtMoney;
} else {
this.sumMoney();
}
},
//
openEditCancelC(row, index) {
let form = { ...row };
},
//
endEditCancelC(row) {
if (row.cancelNum * 1 > row.debtCount) {
this.$message.waring({ message: "最高可以取消" + row.debtCount });
row.cancelNum = row.debtCount;
} else {
this.sumMoney();
}
},
//
sumMoney() {
let money = 0;
let form = { ...this.form };
this.form.cancelDebtMxes.forEach((item) => {
money += item.cancelMoney * 1;
});
form.cancelMoney = money.toFixed(2) * 1;
this.form = JSON.parse(JSON.stringify(form));
},
//
confirmCancel() {
setTimeout(() => {
this.loading = false;
}, 3000);
addCancelDebtList(this.form).then((res) => {
this.loading = false;
if (res.code == "000000") {
this.cancelDialogVisible = false;
this.$message.success({ message: "提交成功!" });
this.$emit("cancelData");
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
},
};
</script>
<style>
</style>

@ -0,0 +1,757 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="80%" append-to-body :before-close="handleClose">
<div style="height:60vh;width:100%">
<el-form inline style="overflow: auto;height:57vh;">
<el-form-item label="名字:">
<div class="repayDiv">{{form.memberName}}
<i v-if="form.sex==1" class="el-icon-male text-blue"></i>
<i v-else class="el-icon-female text-pink"></i>
</div>
</el-form-item>
<el-form-item label="手机号码:">
<div class="repayDiv">{{form.mobilePhone}}</div>
</el-form-item>
<el-form-item label="总欠款:">
<div class="repayDiv text-price text-red">{{form.debtMoney}}</div>
</el-form-item>
<el-form-item label="待付金额:">
<div class="repayDiv text-price text-red">{{debtMoneys}}</div>
</el-form-item>
<el-form-item label="实付金额:">
<div class="repayDiv text-price text-red">{{payMoney}}</div>
</el-form-item>
<el-form-item label="补单: ">
<div class="rowformdivs ">
<span style="cursor: pointer;" @click="openDate(recDateShow=true)" v-show="!recDateShow">{{form.additionDate }} </span>
<el-button size="mini" type="text" @click="(recDateShow=true)" v-if="!recDateShow"><i class="el-icon-edit"></i>补单</el-button>
<el-date-picker @blur='(recDateShow=false)' v-else v-focus ref="recDate" class="rowformdiv" v-model="form.additionDate" format="yyyy-MM-dd" value-format="yyyy-MM-dd" placeholder="选择日期">
</el-date-picker>
</div>
</el-form-item>
<el-alert title="选中列表进行还款" type="info" show-icon></el-alert>
<el-table :data="list" @selection-change="selRoleChangeHand" :row-class-name="tableRowClassName" @row-click="handleRowClick" ref="multipleTable" highlight-current-row tooltip-effect="dark">
<el-table-column type="selection" width="30" align="center"></el-table-column>
<el-table-column type="expand" width="0">
<template slot-scope="props">
<span>员工/门店管理层/高管业绩</span>
<!-- 员工占比合集组件 -->
<div class="flex justify-center align-start flex-wrap padding-xs">
<staffsles ref="staffsles" @staffslesData="staffslesData"></staffsles>
<admin ref="admin" @adminData="adminData"></admin>
<manager ref="manager" @managerData="managerData"></manager>
</div>
</template>
</el-table-column>
<el-table-column prop="storeNum" label="门店编码" show-overflow-tooltip align="center" min-width="80"></el-table-column>
<el-table-column prop="storeName" label="门店名称" show-overflow-tooltip align="center" min-width="100"></el-table-column>
<el-table-column prop="docNum" show-overflow-tooltip label="单号" align="center" min-width="100"></el-table-column>
<el-table-ediCountcolumn prop="docDate" show-overflow-tooltip label="时间" align="center" min-width="105"></el-table-ediCountcolumn>
<el-table-column prop="docType" label="类型" align="center" width="75">
<template slot-scope="scope">
<div>{{scope.row.docType=='card_use'?'疗程':scope.row.docType=='promotion_card_use'?'促销':scope.row.liftType==1?'升降级':'正常充值'}}</div>
</template>
</el-table-column>
<el-table-column prop="tradeName" show-overflow-tooltip label="名称" align="center" min-width="100"></el-table-column>
<el-table-column prop="tradeMoney" label="成交额" align="center" width="80"></el-table-column>
<el-table-column prop="debtMoney" label="欠款" align="center" width="80"></el-table-column>
<el-table-column prop="tradeMoney" label="疗程还款" align="center" width="90">
<template slot-scope="props">
<!-- 疗程卡付列表 -->
<div @click.stop="">
<el-popover placement="bottom" width="500">
<el-table class="border" style="max-width:900px" :data="proList" :summary-method="getSummaries" show-summary max-height="400" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)',color:'#eeeeee'}">
<el-table-column align="center" prop="courseProjectName" show-overflow-tooltip label="疗程名称" width="110"></el-table-column>
<el-table-column align="center" prop="price" label="疗程标价" width="70"></el-table-column>
<el-table-column show-overflow-tooltip min-width="70" align="center" prop="courseRestCount" label="剩余次数"></el-table-column>
<el-table-column align="center" prop="payNumber" label="支付次数" width="90">
<template slot-scope="scope">
<div class="form-input-width" v-if="proIndex!=scope.$index" @click="editCount(scope.row,scope.$index)">
{{ scope.row.payNumber }}
<i class="text-cyan el-icon-edit"></i>
</div>
<el-input v-else v-focus type="number" size="samll" class="form-input-width" pattern="[0-9]" v-model="scope.row.payNumber" @blur="endCount(scope.row,scope.$index)" @change="endCount(scope.row,scope.$index)"></el-input>
</template>
</el-table-column>
<el-table-column align="center" prop="payMoney" label="支付总额" width="70"></el-table-column>
</el-table>
<el-button size="mini" slot="reference" @click="openRecPro(props.row,props.$index,clickIndex=props.$index)"></el-button>
</el-popover>
</div>
</template>
</el-table-column>
<el-table-column prop="tradeMoney" label="充值还款" align="center" width="90">
<template slot-scope="props">
<!-- 充值卡付列表 -->
<div @click.stop="" v-if="props.row.docType!='card_recharge'">
<el-popover placement="bottom" width="350">
<el-table class="border" style="max-width:900px" :data="recList" :summary-method="getSummaries" show-summary max-height="400" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)',color:'#eeeeee'}">
<el-table-column align="center" prop="rechargeTypeName" show-overflow-tooltip label="充值名称" min-width="110"></el-table-column>
<el-table-column align="center" prop="cardRestMoney" label="剩余充值" width="70"></el-table-column>
<el-table-column align="center" prop="payMoney" label="金额" width="90">
<template slot-scope="scope">
<div class="form-input-width" v-if="recIndex!=scope.$index" @click="editPayMoney(scope.row,scope.$index)">
{{ scope.row.payMoney }}
<i class="text-cyan el-icon-edit"></i>
</div>
<el-input v-else v-focus type="number" size="samll" class="form-input-width" pattern="[0-9]" v-model="scope.row.payMoney" @blur="endPayMoney(scope.row,scope.$index)" @change="endPayMoney(scope.row,scope.$index)"></el-input>
</template>
</el-table-column>
<el-table-column align="center" prop="cardOver" label="剩余金额" width="70"></el-table-column>
</el-table>
<el-button size="mini" slot="reference" @click="openRecPro(props.row,props.$index,clickIndex=props.$index)"></el-button>
</el-popover>
</div>
<div v-else click.stop="">不能卡付</div>
</template>
</el-table-column>
<el-table-column prop="repayMoney" label="待付金额" align="center" width="100">
<template slot-scope="scope">
<div @click.stop>
<div class="text-cyan" v-if="editDebtIndex!=scope.$index" @click="openEditDebtMoney(scope.row,scope.$index,editDebtIndex=scope.$index)">
{{scope.row.repayMoney}}
<i class="el-icon-edit text-cyan"></i>
</div>
<el-input v-focus oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" type="number" class="form-input-width-xs" v-else @blur="endEdutDebtMoney(scope.row,editDebtIndex=-1)" v-model="scope.row.repayMoney"></el-input>
</div>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="90" v-if="headOffice">
<template slot-scope="scope">
<el-button @click.stop="cancel(scope.row)" size="mini" type="primary">取消欠款</el-button>
</template>
</el-table-column>
</el-table>
<!-- 现付列表 -->
<el-form-item label="支付:">
<div style="width:300px" class="padding-xs border border-radius-10 margin-top-xs">
<el-table :data="payLists" :summary-method="getSummaries" show-summary>
<el-table-column align="center" prop="payName" label="支付方式" min-width="150">
<template slot-scope="scope"><span style="cursor: pointer;" @click="openEditMoney(scope.row,scope.$index)">{{scope.row.payName}}</span></template>
</el-table-column>
<el-table-column align="center" prop="payMoney" label="本次支付" width="120">
<template slot-scope="scope">
<div class="form-input-width pointer text-cayn" v-if="editPayIndex!=scope.$index" @click="openEditMoney(scope.row,scope.$index,editPayIndex=scope.$index)" style="width:60px;cursor: pointer;margin-left:30px">
{{scope.row.payMoney}}
<i class="el-icon-edit text-cyan"></i>
</div>
<el-input v-focus class="form-input-width-xs" oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" v-model="scope.row.payMoney" @blur="endEditMoney(scope.row,editPayIndex=-1)" type="number" v-else></el-input>
</template>
</el-table-column>
</el-table>
</div>
</el-form-item>
</el-form>
</div>
<!-- 取消还款组件 -->
<cancel ref="cancel" @cancelData="getData"></cancel>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="handleClose"> </el-button>
<el-button size="mini" type="primary" :loading="loading" :disabled="multipleSelection.length==0" @click="confirms(loading=true)"> </el-button>
</span>
</el-dialog>
</template>
<script>
import {
ctlist,
selectList,
debtPage,
addrepay,
selectOne,
addCancelDebtList,
couAccountList,
recAccountCashList,
} from "@/api/eashier.js";
import cancel from "./components/cancel.vue";
import admin from "@/components/staffList/admin/index";
import manager from "@/components/staffList/manager/index";
import staffsles from "@/components/staffList/staff/index";
export default {
components: {
cancel,
staffsles,
manager,
admin,
},
data() {
return {
headOffice: false, //
staffList: [], //
proList: [], //
recList: [], //
proCopyList: [], //
recCopyList: [], //
editPayIndex: -1, //>:
editDebtIndex: -1, //>:
dialogVisible: false, // //
title: "还款", //
list: [], //
payLists: [], //
recDateShow: false, //
debtMoneys: 0, //
payMoney: 0, //
multipleSelection: [], //
loading: false, //
form: {}, //
rowIndex: -1, //
proIndex: -1, //>:
recIndex: -1, //>:
clickIndex: -1, //>/:
};
},
methods: {
//
openRecPro(row, indexs) {
this.list.forEach((item, index) => {
item.proList.forEach((items) => {
if (items.payNumber > 0) {
items.courseRestCount = items.courseRestCount;
} else {
items.courseRestCount = items.courseRestCount - items.payNumber;
}
});
});
this.proList = JSON.parse(JSON.stringify(this.list[indexs].proList));
this.recList = JSON.parse(JSON.stringify(this.list[indexs].recList));
},
//>
editCount(row, index) {
let form = { ...this.proList[index] };
this.proIndex = index;
this.proList.splice(index, 1, form);
},
//>
endCount(row, index) {
if (row.payNumber) {
row.payNumber = row.payNumber * 1;
} else {
row.payNumber = 0;
}
let form = { ...row };
this.proIndex = -1;
form.payMoney = (form.payNumber * form.price).toFixed(2) * 1;
this.proList.splice(index, 1, form);
this.proList.forEach((item) => {});
this.sumPay();
},
//>
editPayMoney(row, index) {
let form = { ...this.recList[index] };
this.recIndex = index;
this.recList.splice(index, 1, form);
},
//>
endPayMoney(row, index) {
console.log(row.payMoney);
if (row.payMoney) {
row.payMoney = row.payMoney * 1;
} else {
row.payMoney = 0;
}
let form = { ...row };
this.recIndex = -1;
this.recList.splice(index, 1, form);
this.sumPay();
},
//
handleClose() {
this.form = Object.assign({});
this.debtMoneys = 0;
this.payMoney = 0;
this.tradeMoney = 0;
this.payLists = [];
this.list = [];
this.multipleSelection = [];
this.staffList = [];
this.dialogVisible = false;
},
//
cancel(row) {
delete row.adminList;
delete row.entities;
delete row.managerList;
delete row.docDate;
delete row.adminList;
this.$refs.cancel.show(row);
},
//
staffslesData(v) {
this.list[this.rowIndex].entities = [...v];
},
//
managerData(v) {
this.list[this.rowIndex].managerList = [...v];
},
//
adminData(v) {
this.list[this.rowIndex].adminList = [...v];
},
//
show(form) {
this.form = { ...form };
this.dialogVisible = true;
this.headOffice =
sessionStorage.getItem("headOffice") * 1 == 1 ? true : false;
this.getData();
},
//
getPage() {
//
recAccountCashList({
memberId: this.form.id,
}).then((res) => {
if (res.code == "000000") {
let recCopyList = [];
res.rows.forEach((item) => {
item.cardOver = item.cardRestMoney;
item.payMoney = 0;
if (item.cardRestMoney == item.cardConsumeMoney) {
recCopyList.push(item);
}
});
this.recCopyList = recCopyList;
} else {
this.$alert(res.message, "查询会员卡包", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
//
couAccountList({ memberId: this.form.id }).then((res) => {
if (res.code == "000000") {
let proCopyList = [];
res.rows.forEach((item) => {
item.payMoney = 0;
item.payNumber = 0;
item.payMoney = (item.payNumber * item.price).toFixed(2) * 1;
if (item.courseRestCount == item.courseConsumeCount) {
proCopyList.push(item);
}
});
this.proCopyList = proCopyList;
} else {
this.$alert(res.message, "查询会员疗程", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
async getData() {
this.getPage();
//
ctlist({ id: "" }).then((res) => {
if (res.code == "000000") {
res.rows.forEach((item) => {
item.payMoney = 0;
item.payName = item.collectionTypeName;
item.payId = item.id;
});
this.payLists = res.rows;
}
});
let form = {
pageSize: 99,
memberId: this.form.id,
state: 0,
storeId: this.form.storeId,
};
//
debtPage(form).then((res) => {
if (res.code == "000000") {
let list = [];
res.pageInfo.list.forEach((element) => {
element.yetMoney = element.tradeMoney - element.debtMoney;
if (element.docType == "card_use") {
element.type = "疗程";
}
if (element.docType == "card_recharge") {
element.type = "充值";
}
element.entities.forEach((item) => {
item.staffName = item.saleStaffName;
item.id = item.saleStaffId;
item.identityCard = item.saleIdentityCard;
item.ratio = item.saleRatio;
item.ratioShow = false;
if (item.id) {
item.staffNames = item.brandNumber + "--" + item.staffName;
}
});
selectOne({ type: 7, orderId: element.id }).then((res) => {
if (res.code == "000000") {
var managerList = [];
var adminList = [];
res.rows.forEach((item) => {
if (item.staffType == 0) {
item.staffNames = item.brandNumber + "--" + item.staffName;
managerList.push(item);
}
if (item.staffType == 1) {
item.staffNames = item.brandNumber + "--" + item.staffName;
adminList.push(item);
}
});
if (managerList.length == 0) {
managerList.push({ ratio: 100 });
}
if (adminList.length == 0) {
adminList.push({ ratio: 100 });
}
if (element.entities.length == 0) {
element.entities.push({ ratio: 100 });
}
var form = {
debtId: element.id,
storeName: element.storeName,
storeNum: element.storeNum,
memberId: element.memberId,
memberName: element.memberName,
memberIdentityCard: element.memberIdentityCard,
mobilePhone: element.mobilePhone,
docId: element.docId,
docNum: element.docNum,
docDate: element.docDate,
docType: element.docType,
tradeId: element.tradeId,
tradeName: element.tradeName,
tradeMoney: element.tradeMoney,
yetMoney: element.yetMoney,
debtMoney: element.debtMoney,
accountId: element.accountId,
repayMoney: element.debtMoney,
entities: element.entities,
salesAchievement: element.salesAchievement,
salesCommission: element.salesCommission,
cardSalesAchievement: element.cardSalesAchievement,
cardSalesCommission: element.cardSalesCommission,
typeRatio: element.typeRatio,
adminList: adminList,
managerList: managerList,
cancelDebtMxes: element.cancelDebtMxes,
};
var that = this;
setTimeout(() => {
form.proList = that.proCopyList;
form.recList = that.recCopyList;
list.push(form);
}, 500);
} else {
this.$alert(res.message, "加载高管", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
});
this.list = list;
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
tableRowClassName({ row, rowIndex }) {
row.index = rowIndex;
},
//
confirms() {
if (this.form.additionDate != undefined) {
this.form.isAddition = 1;
} else {
this.form.isAddition = 0;
}
let payLists = [];
let num = 0;
let paynum = 0;
let debtMoney = 0;
this.payLists.forEach((item) => {
if (item.payMoney > 0) {
paynum += item.payMoney * 1;
let items = {
payId: item.payId,
payName: item.payName,
payMoney: item.payMoney,
};
payLists.push(items);
}
});
delete this.form.moneys;
this.form.repayMoney = this.payMoney;
this.form.payMoney = this.payMoney;
let repayAccountListRequests = [];
console.log(this.multipleSelection);
this.multipleSelection.forEach((item) => {
console.log(item);
num += item.repayMoney;
debtMoney += item.debtMoney;
item.payMoney = item.repayMoney;
item.repayMoney = item.repayMoney;
console.log(item.proList);
item.proList.forEach((items) => {
if (items.payNumber > 0 || items.payMoney > 0) {
let pro = {
accountName: items.courseProjectName,
accountNum: items.courseProjectNum,
payNumber: items.payNumber,
payMoney: items.payMoney,
accountType: 1,
accountId: items.id,
storeId: items.storeId,
storeName: items.storeName,
};
repayAccountListRequests.push(pro);
}
});
item.recList.forEach((items) => {
if (items.payMoney > 0) {
let rec = {
accountName: items.rechargeTypeName,
accountNum: items.rechargeTypeNum,
payMoney: items.payMoney,
accountType: 0,
accountId: items.id,
storeId: items.storeId,
storeName: items.storeName,
};
repayAccountListRequests.push(rec);
}
});
item.repayAccountListRequests = repayAccountListRequests;
delete item.type;
delete item.docDate;
delete item.yetMoney;
});
this.form.debtMoney = debtMoney;
if (num != paynum) {
this.$message.error({
message: "支付金额与选择还款金额不相等, 不能进行还款 !",
});
this.loading = false;
} else {
this.form.payLists = payLists;
let repayTradeLists = [];
this.multipleSelection.forEach((item) => {
item.staffRequests = item.entities;
let salesmens = [];
item.managerList.forEach((item) => {
if (item.id) {
item.staffType = 0;
salesmens.push(item);
}
});
item.adminList.forEach((item) => {
if (item.id) {
item.staffType = 1;
salesmens.push(item);
}
});
item.salesmens = salesmens;
repayTradeLists.push(item);
});
delete this.form.debtMoneys;
this.form.repayTradeLists = repayTradeLists;
addrepay(this.form).then((res) => {
this.loading = false;
if (res.code == "000000") {
this.$message.success({
message: res.message,
});
this.dialogVisible = false;
this.$emit("repaymentData");
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
}
},
//
openEditDebtMoney(row, index) {
row.debtMoney = row.tradeMoney - row.yetMoney;
row.debtMoney = row.debtMoney * 1;
},
//
endEdutDebtMoney(row) {
row.repayMoney = row.repayMoney * 1;
var number = 0;
this.multipleSelection.forEach((item) => {
number += item.repayMoney * 1;
});
this.debtMoneys = number;
},
//
selRoleChangeHand(row) {
this.multipleSelection = row;
var number = 0;
this.multipleSelection.forEach((item) => {
number += item.repayMoney * 1;
});
this.debtMoneys = 0;
this.debtMoneys = number;
console.log(this.multipleSelection);
},
//
handleRowClick(row, column, event) {
this.rowIndex = row.index;
this.$refs.multipleTable.toggleRowExpansion(row);
this.$refs.multipleTable.toggleRowSelection(row);
var number = 0;
this.multipleSelection.forEach((item) => {
number += item.repayMoney * 1;
});
this.debtMoneys = 0;
this.debtMoneys = number;
var that = this;
console.log(row);
setTimeout(() => {
that.$refs.staffsles.show(row.entities);
that.$refs.manager.show(row.managerList);
that.$refs.admin.show(row.adminList);
}, 800);
},
//
openEditMoney(row, index) {
if (this.form.numMoney != 0) {
if (row.payMoney != 0) {
row.payMoney = row.payMoney * 1 + this.debtMoneys;
} else {
row.payMoney = this.debtMoneys;
}
}
},
//
endEditMoney(row) {
var number = 0;
this.multipleSelection.forEach((item) => {
number += item.repayMoney * 1;
});
let num = 0;
this.payLists.forEach((item) => {
num += item.payMoney * 1;
});
this.payMoney = num;
this.debtMoneys = this.debtMoneys - num;
if (this.payMoney != number) {
this.debtMoneys = number - this.payMoney;
} else {
this.debtMoneys = 0;
}
},
////
sumPay() {
var recMoney = 0;
var proMoney = 0;
this.proList.forEach((item) => {
proMoney += item.payMoney;
});
this.recList.forEach((item) => {
item.cardOver = (item.cardRestMoney - item.payMoney).toFixed(2) * 1;
recMoney += item.payMoney;
});
let form = { ...this.list[this.clickIndex] };
form.repayMoney = (form.debtMoney - proMoney - recMoney).toFixed(2) * 1;
form.proList = JSON.parse(JSON.stringify(this.proList));
form.recList = JSON.parse(JSON.stringify(this.recList));
let proList = [];
this.proCopyList.forEach((item) => {
let proLists = [];
form.proList.forEach((items) => {
if (item.id == items.id) {
item.courseRestCount = item.courseRestCount - item.payNumber;
} else {
item.courseRestCount = item.courseRestCount;
}
proLists.push(items);
});
proList = JSON.parse(JSON.stringify(proLists));
});
this.list.splice(this.clickIndex, 1, form);
console.log(this.list);
},
//
//
getSummaries(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = "合计";
return;
}
const values = data.map((item) => Number(item[column.property]));
if (column.property == "payMoney") {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
sums[index] += " ";
} else {
sums[index] = "--";
}
});
return sums;
},
},
mounted() {
this.$nextTick(function () {
this.$on("list", function () {
//console.log('');
});
});
},
};
</script>
<style scoped>
.repayDiv {
width: 100px;
}
.setting {
border-bottom: #333 1px solid;
}
.setting .el-form-item {
margin: 0;
padding: 0;
}
.setting .el-form-item__content {
line-height: 50px;
}
.setting i {
display: none;
}
.el-table__expand-icon {
display: none !important;
}
</style>

@ -0,0 +1,140 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="600px">
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
<el-table-column label="选择" width="60">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
{{ "" }}
</el-radio>
</template>
</el-table-column>
<el-table-column align="center" width="100" prop="brandNumber" label="水牌号"></el-table-column>
<el-table-column align="center" min-width="120" prop="staffName" label="名字"></el-table-column>
<el-table-column align="center" min-width="100" prop="jobName" label="工种">
<template slot-scope="scope">
{{
scope.row.job == 1
? "美发师"
: scope.row.job == 2
? "技师"
: scope.row.job == 3
? "助理"
: scope.row.job == 4
? "收银员"
: scope.row.job == 5
? "美容师"
: "暂无"
}}
</template>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="dialogVisible = false"> </el-button>
<el-button size="mini" type="primary" @click="confirms()">
</el-button>
</span>
</el-dialog>
</template>
<script>
import { selectList } from "@/api/eashier.js";
export default {
data() {
return {
radio: null, //
radioForm: {}, //
list: [], //
dialogVisible: false, // //
elementLoadingText: "数据加载中...", //list //
listLoading: false, //list //
title: "选择员工", //
selectNumber: 0, // 0 1 2
staffList: [], //
};
},
methods: {
//
show(number, title, list) {
//number 0 1 2
//list
this.staffList = [];
if (title) {
this.title = title;
}
if (list) {
this.staffList = list;
}
this.selectNumber = number;
this.list = [];
this.radio = null;
this.radioForm = {};
this.dialogVisible = true;
console.log(this.staffList);
this.getData();
},
//
//
rowClick(row) {
this.radio = row.id;
this.radioForm = row;
},
//
//
async getData() {
this.listLoading = true;
let form = { id: "" };
if (this.staffName) {
form.staffName = this.staffName;
}
selectList(form).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
if (this.staffList.length == 0) {
this.list = res.rows;
} else {
var list = [];
res.rows.forEach((item) => {
this.staffList.forEach((items) => {
if (item.id == items.id) {
} else {
list.push(item);
}
});
});
this.list = Array.from(new Set(list));
}
} else {
this.$alert(res.message, "提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
confirms() {
if (this.selectNumber == 1) {
this.radioForm.saleStaffName = this.radioForm.staffName;
this.radioForm.saleStaffId = this.radioForm.id;
this.radioForm.saleIdentityCard = this.radioForm.identityCard;
this.radioForm.saleRatio = 0;
}
if (this.selectNumber == 2) {
this.radioForm.manageStaffName = this.radioForm.staffName;
this.radioForm.manageStaffId = this.radioForm.id;
this.radioForm.manageIdentityCard = this.radioForm.identityCard;
this.radioForm.manageBrandNumber = this.radioForm.brandNumber;
}
this.radioForm.ratioShow = false;
this.$emit("staffData", this.radioForm);
this.dialogVisible = false;
},
},
};
</script>
<style>
</style>

@ -0,0 +1,178 @@
<template>
<div style="width: 300px;overflow: hidden;" class="border-radius-10 border margin-right-xs bg-white">
<el-table :data="staffLists" max-height="300" class="margin-xs" style="width:280px">
<el-table-column align="left" prop="brandNumber" label="水牌号--管理员名字" min-width="180">
<template slot-scope="scope">
<el-select style="width:180px" v-model="scope.row.staffNames" clearable @clear="clear" no-match-text="" placeholder="请选择" @change="ratioChange($event,scope.$index)" filterable default-first-option>
<el-option v-for="(item,index) in staffList" :key="index" :label="item.brandNumber+'--'+ item.staffName" :value="item.id">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" prop="ratio" label="占比(%)" width="80">
<template slot-scope="scope">
<div class="form-input-width" v-if="editIndex!=scope.$index" @click="openStaffRatio(scope.$index, scope.row)">
{{ scope.row.ratio }}
<i class="el-icon-edit text-cyan" v-if="scope.$index!=0"></i>
</div>
<el-input v-focus class="form-input-width-xs" size="samll" type="number" oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" v-else v-model="scope.row.ratio" @blur="endStaffRatio(scope.row, scope.$index)"></el-input>
</template>
</el-table-column>
</el-table>
<div style="width: 150px;margin:10px auto;" class="flex justify-between align-center">
<el-button size="mini" type="info" :disabled="staffLists.length == 0" @click="delsalesman"></el-button>
<el-button size="mini" type="primary" plain @click="(staffLists.push({brandNumber:'',staffName:'',ratio:0}))"></el-button>
</div>
</div>
</template>
<script>
import { selectListType } from "@/api/eashier.js";
export default {
data() {
return {
staffList: [], //
staffLists: [{ ratio: 100 }], // //
editIndex: -1, //
staffListCopy: [], //
storeId: null, //id
};
},
methods: {
//
clear() {
this.staffLists = [{ ratio: 100 }];
this.changeStaff();
this.confirm();
},
//
ratioChange(v, index) {
this.staffList.forEach((item) => {
if (item.id == v) {
item.ratio = this.staffLists[index].ratio;
item.staffNames = item.brandNumber + "--" + item.staffName;
this.staffLists.splice(index, 1, item);
}
});
this.confirm();
this.changeStaff();
},
//
openStaffRatio(index, row) {
if (index != 0 || row.ratio * 1 != 100) {
let form = { ...row };
this.editIndex = index;
this.staffLists.splice(index, 1, form);
}
},
//
endStaffRatio(row, index) {
let num = 0;
if (index != 0) {
this.staffLists.forEach((item, i) => {
if (i != 0) {
num += item.ratio * 1;
}
});
this.staffLists[0].ratio = 100 - num;
if (this.staffLists[0].ratio < 1) {
this.$message.error({
message: "第一位员工占比过低",
});
} else {
if (!row.ratio) {
row.ratio = 0;
} else {
row.ratio = row.ratio * 1;
}
let form = this.staffLists[index];
this.staffLists.splice(index, 1, form);
}
this.editIndex = -1;
}
this.confirm();
this.changeStaff();
},
//
delsalesman() {
let index = this.staffLists.length - 1;
if (index == 0) {
this.$message.warning({ message: "第一行员工只能修改" });
} else {
let ratio = this.staffLists[index].ratio;
this.staffLists[0].ratio += ratio;
this.staffLists.splice(index, 1);
}
this.confirm();
this.changeStaff();
},
//
show(list, storeId) {
this.staffLists = [...list];
if (storeId) {
this.storeId = storeId;
}
this.getData();
},
//
confirm() {
let list = [];
this.staffLists.forEach((item) => {
let items = {
id: item.id,
ratio: item.ratio,
brandNumber: item.brandNumber,
staffName: item.staffName,
identityCard: item.identityCard,
storeId: item.storeId,
storeName: item.storeName,
staffType: 1,
staffNames: item.brandNumber + "--" + item.staffName,
};
list.push(items);
});
this.$emit("adminData", list);
},
//
changeStaff() {
var that = this;
var list = that.staffLists
.concat(that.staffListCopy)
.filter(function (v) {
return (
that.staffLists.indexOf(v) === -1 ||
that.staffListCopy.indexOf(v) === -1
);
});
this.staffList = list;
},
//
//
async getData() {
let form = { type: 0 };
if (this.storeId) {
form.storeId = this.storeId;
}
selectListType(form).then((res) => {
if (res.code == "000000") {
res.rows.forEach((item) => {
item.editStaffRatioShow = false;
});
this.staffList = res.rows;
this.staffListCopy = res.rows;
} else {
this.$alert(res.message, "加载员工提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
},
};
</script>
<style>
</style>

@ -0,0 +1,167 @@
<template>
<div style="width: 300px;overflow: hidden;" class="border-radius-10 border bg-white">
<el-table :data="staffLists" max-height="300" class="margin-xs" style="width:280px">
<el-table-column align="left" prop="brandNumber" label="水牌号--高管名字" min-width="180">
<template slot-scope="scope">
<el-select style="width:180px" v-model="scope.row.staffNames" clearable @clear="clear" no-match-text="" placeholder="请选择" @change="ratioChange($event,scope.$index)" filterable default-first-option>
<el-option v-for="(item,index) in staffList" :key="index" :label="item.brandNumber+'--'+ item.staffName" :value="item.id">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" prop="ratio" label="占比(%)" width="80">
<template slot-scope="scope">
<div class="form-input-width" v-if="editIndex!=scope.$index" @click="openStaffRatio(scope.$index, scope.row)">
{{ scope.row.ratio }}
<i class="el-icon-edit text-cyan" v-if="scope.$index!=0"></i>
</div>
<el-input v-focus class="form-input-width-xs" size="samll" type="number" oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" v-else v-model="scope.row.ratio" @blur="endStaffRatio(scope.row, scope.$index)"></el-input>
</template>
</el-table-column>
</el-table>
<div style="width: 150px;margin:10px auto;" class="flex justify-between align-center">
<el-button size="mini" type="info" :disabled="staffLists.length == 0" @click="delsalesman"></el-button>
<el-button size="mini" type="primary" plain @click="(staffLists.push({brandNumber:'',staffName:'',ratio:0}))"></el-button>
</div>
</div>
</template>
<script>
import { QuerCompetent } from "@/api/eashier.js";
export default {
data() {
return {
staffList: [], //
staffLists: [{ ratio: 100 }], // //
editIndex: -1, //
staffListCopy: [], //
};
},
methods: {
//
clear() {
this.staffLists = [{ ratio: 100 }];
this.changeStaff();
this.confirm();
},
//
ratioChange(v, index) {
this.staffList.forEach((item) => {
if (item.id == v) {
item.ratio = this.staffLists[index].ratio;
item.staffNames = item.brandNumber + "--" + item.staffName;
this.staffLists.splice(index, 1, item);
}
});
this.confirm();
this.changeStaff();
},
//
openStaffRatio(index, row) {
if (index != 0 || row.ratio * 1 != 100) {
let form = { ...row };
this.editIndex = index;
this.staffLists.splice(index, 1, form);
}
},
//
endStaffRatio(row, index) {
let num = 0;
if (index != 0) {
this.staffLists.forEach((item, i) => {
if (i != 0) {
num += item.ratio * 1;
}
});
this.staffLists[0].ratio = 100 - num;
if (this.staffLists[0].ratio < 1) {
this.$message.error({
message: "第一位占比过低",
});
} else {
if (!row.ratio) {
row.ratio = 0;
} else {
row.ratio = row.ratio * 1;
}
let form = this.staffLists[index];
this.editIndex = -1;
this.staffLists.splice(index, 1, form);
}
}
this.confirm();
this.changeStaff();
},
//
delsalesman() {
let index = this.staffLists.length - 1;
if (index == 0) {
this.$message.warning({ message: "第一行员工只能修改" });
} else {
let ratio = this.staffLists[index].ratio;
this.staffLists[0].ratio += ratio;
this.staffLists.splice(index, 1);
}
this.confirm();
this.changeStaff();
},
//
show(list) {
this.staffLists = [...list];
this.getData();
},
//
confirm() {
let list = [];
this.staffLists.forEach((item) => {
let items = {
id: item.id,
ratio: item.ratio,
brandNumber: item.brandNumber,
staffName: item.staffName,
identityCard: item.identityCard,
storeId: item.storeId,
storeName: item.storeName,
staffNames: item.brandNumber + "--" + item.staffName,
staffType: 0,
};
list.push(items);
});
this.$emit("managerData", list);
},
//
changeStaff() {
var that = this;
var list = that.staffLists
.concat(that.staffListCopy)
.filter(function (v) {
return (
that.staffLists.indexOf(v) === -1 ||
that.staffListCopy.indexOf(v) === -1
);
});
this.staffList = list;
},
//
//
async getData() {
QuerCompetent({ type: 0, pageSize: 999 }).then((res) => {
if (res.code == "000000") {
this.staffList = res.pageInfo.list;
this.staffListCopy = res.pageInfo.list;
} else {
this.$alert(res.message, "加载高管提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
},
};
</script>
<style>
</style>

@ -0,0 +1,180 @@
<template>
<div style="width: 300px;overflow: hidden;" class="border-radius-10 border margin-right-xs bg-white ">
<el-table :data="staffLists" max-height="300" class="margin-xs" style="width:280px">
<el-table-column align="left" prop="brandNumber" label="水牌号--员工名字" min-width="180">
<template slot-scope="scope">
<el-select style="width:180px" v-model="scope.row.staffNames" clearable @clear="clear" no-match-text="" placeholder="请选择" @change="ratioChange($event,scope.$index)" filterable default-first-option>
<el-option v-for="(item,index) in staffList" :key="index" :label="item.brandNumber+'--'+ item.staffName" :value="item.id">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column align="center" prop="ratio" label="占比(%)" width="80">
<template slot-scope="scope">
<div class="form-input-width" v-if="editIndex!=scope.$index" @click="openStaffRatio(scope.$index, scope.row)">
{{ scope.row.ratio }}
<i class="el-icon-edit text-cyan" v-if="scope.$index!=0"></i>
</div>
<el-input v-focus class="form-input-width-xs" size="samll" type="number" oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" v-else v-model="scope.row.ratio" @blur="endStaffRatio(scope.row, scope.$index)"></el-input>
</template>
</el-table-column>
</el-table>
<div style="width: 150px;margin:10px auto;" class="flex justify-between align-center">
<el-button size="mini" type="info" :disabled="staffLists.length == 0" @click="delsalesman"></el-button>
<el-button size="mini" type="primary" plain @click="(staffLists.push({brandNumber:'',staffName:'',ratio:0}))"></el-button>
</div>
</div>
</template>
<script>
import { selectList } from "@/api/eashier.js";
export default {
data() {
return {
staffList: [], //
staffLists: [{ ratio: 100 }], // //
editIndex: -1, //
staffListCopy: [], //
storeId: null, //id
};
},
methods: {
//
ratioChange(v, index) {
this.staffList.forEach((item) => {
if (item.id == v) {
item.ratio = this.staffLists[index].ratio;
item.staffNames = item.brandNumber + "--" + item.staffName;
this.staffLists.splice(index, 1, item);
}
});
this.changeStaff();
this.confirm();
},
//
clear() {
this.staffLists = [{ ratio: 100 }];
this.changeStaff();
this.confirm();
},
//
openStaffRatio(index, row) {
if (index != 0 || row.ratio * 1 != 100) {
let form = { ...row };
this.editIndex = index;
this.staffLists.splice(index, 1, form);
}
},
//
endStaffRatio(row, index) {
let num = 0;
if (index != 0) {
this.staffLists.forEach((item, i) => {
if (i != 0) {
num += item.ratio * 1;
}
});
this.staffLists[0].ratio = 100 - num;
if (this.staffLists[0].ratio < 1) {
this.$message.error({
message: "第一位员工占比过低",
});
} else {
if (!row.ratio) {
row.ratio = 0;
} else {
row.ratio = row.ratio * 1;
}
let form = this.staffLists[index];
this.editIndex = -1;
this.staffLists.splice(index, 1, form);
}
}
this.changeStaff();
this.confirm();
},
//
delsalesman() {
let index = this.staffLists.length - 1;
if (index == 0) {
this.$message.warning({ message: "第一行员工只能修改" });
} else {
let ratio = this.staffLists[index].ratio;
this.staffLists[0].ratio += ratio;
this.staffLists.splice(index, 1);
}
this.changeStaff();
this.confirm();
},
//
show(list, storeId) {
console.log(list);
this.staffLists = [...list];
if (storeId) {
this.storeId = storeId;
}
this.getData();
},
//
confirm() {
let list = [];
this.staffLists.forEach((item) => {
let items = {
id: item.id,
ratio: item.ratio,
brandNumber: item.brandNumber,
staffName: item.staffName,
identityCard: item.identityCard,
storeId: item.storeId,
storeName: item.storeName,
staffNames: item.brandNumber + "--" + item.staffName,
staffType: 2,
};
list.push(items);
});
this.$emit("staffslesData", list);
},
//
changeStaff() {
var that = this;
var list = that.staffLists
.concat(that.staffListCopy)
.filter(function (v) {
return (
that.staffLists.indexOf(v) === -1 ||
that.staffListCopy.indexOf(v) === -1
);
});
this.staffList = list;
},
//
//
async getData() {
let form = { id: "" };
if (this.storeId) {
form.storeId = this.storeId;
}
selectList(form).then((res) => {
if (res.code == "000000") {
res.rows.forEach((item) => {
item.editStaffRatioShow = false;
});
this.staffList = res.rows;
this.staffListCopy = res.rows;
} else {
this.$alert(res.message, "加载员工提示", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
},
};
</script>
<style>
</style>

@ -0,0 +1,80 @@
<template>
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="500px">
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
<el-table-column label="选择" width="60">
<template slot-scope="scope">
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
{{ "" }}
</el-radio>
</template>
</el-table-column>
<el-table-column align="center" width="100" prop="storeNum" label="门店编码"></el-table-column>
<el-table-column align="center" min-width="120" prop="storeName" label="门店名称"></el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button size="mini" type="primary" plain @click="dialogVisible = false"> </el-button>
<el-button size="mini" type="primary" @click="confirms()">
</el-button>
</span>
</el-dialog>
</template>
<script>
import { organization } from "@/api/storeManage.js";
export default {
data() {
return {
radio: null, //
radioForm: {}, //
list: [], //
dialogVisible: false, // //
elementLoadingText: "数据加载中...", //list
listLoading: false, //list
title: "选择门店", //
};
},
methods: {
//
show(form) {
this.list = [];
this.radio = null;
this.radioForm = {};
this.dialogVisible = true;
this.getData();
},
//
rowClick(row) {
this.radio = row.id;
this.radioForm = row;
},
//
async getData() {
this.listLoading = true;
let parentId = JSON.parse(sessionStorage.getItem("storeInfo")).id;
organization({ parentId: parentId }).then((res) => {
this.listLoading = false;
if (res.code == "000000") {
this.list = [...res.rows];
} else {
this.$alert(res.message, "获取门店信息", {
confirmButtonText: "确定",
confirmButtonClass: "confirmbtnFalses",
type: "warning",
center: true,
callback: (action) => {},
});
}
});
},
//
confirms() {
this.radioForm.ratioShow = false;
this.$emit("storeData", this.radioForm);
this.dialogVisible = false;
},
},
};
</script>
<style>
</style>

@ -0,0 +1,86 @@
<template>
<div>
<div>{{time}}</div>
</div>
</template>
<script>
export default {
data() {
return {
time: "", //
flag: false, //
endTime: "", //
overtime: false, //
form: {}, //
};
},
mounted() {},
methods: {
//
show(form, endTime, number) {
this.form = form;
if (number == 1) {
this.flag = true;
this.endTime = new Date();
this.timeDown();
} else {
this.endTime = endTime;
this.flag = false;
this.timeDown();
}
if (!endTime) {
this.endTime = "";
this.flag = false;
this.timeDown();
}
},
//
timeDown() {
const endTime = new Date(this.endTime);
const nowTime = new Date();
let leftTime = parseInt((endTime.getTime() - nowTime.getTime()) / 1000);
let d = parseInt(leftTime / (24 * 60 * 60));
let h = this.formate(parseInt((leftTime / (60 * 60)) % 24));
let m = this.formate(parseInt((leftTime / 60) % 60));
let s = this.formate(parseInt(leftTime % 60));
var that = this;
if (leftTime <= 0) {
this.flag = true;
this.$emit("timendData", { form: this.form, overtime: this.overtime });
}
if (leftTime == 0) {
this.flag = true;
this.$emit("timendData", { form: this.form, overtime: this.overtime });
} else {
if (m < 0 || s < 0 || h) {
m = this.formate(-m);
s = this.formate(-s);
h = this.formate(-h);
this.overtime = true;
} else {
this.overtime = false;
}
if (h > 0) {
m = m + h * 60;
}
// this.time = `${m}:${s}`; // 30
this.time = `${m} min`; // 30
let v = { form: this.form, time: this.time };
this.$emit("timeData", v);
}
},
// 0
formate(time) {
if (time >= 10 || time <= 0) {
return time;
} else {
return `0${time}`;
}
},
},
};
</script>
<style scoped>
</style>

@ -0,0 +1,103 @@
<template>
<div id="admin">
<div class="admin_header_div">
<div class="adminheader admin_head">
<el-image :src="url" fit="contain" :preview-src-list="srcList"></el-image>
</div>
<div class="adminheader admin_name">
<div>
<span>Admin</span>
<p>超级管理员</p>
<p>店长</p>
</div>
</div>
</div>
<div class="admin_footer">
<ul style="list-style:none;">
<li><span>登录地点 : </span>广州市 天河区</li>
<li><span>当前门店 : </span>广州一号店</li>
<li><span>当前时间 : </span> {{currentTime | dateFormat}}</li>
</ul>
</div>
</div>
</template>
<script>
export default {
data() {
return {
url:
"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1606968864415&di=ec0d6b4482dd7808347e71078536ce4e&imgtype=0&src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F202002%2F24%2F20200224214559_wtkbq.thumb.400_0.jpg",
srcList: [
"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1606968864415&di=ec0d6b4482dd7808347e71078536ce4e&imgtype=0&src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F202002%2F24%2F20200224214559_wtkbq.thumb.400_0.jpg",
],
currentTime: "",
};
},
created() {
var _this = this; //Vuethis
this.timer = setInterval(function () {
_this.currentTime = new Date();
}, 1000);
},
beforeDestroy() {
if (this.timer) {
clearInterval(this.timer); // Vue
}
},
};
</script>
<style scoped>
#admin {
height: 100%;
width: 100%;
box-shadow: 3px 3px 5px #999;
}
.admin_header_div {
display: flex;
justify-content: space-between;
width: 100%;
box-shadow: 0px 1px 3px rgb(220, 220, 220);
}
.adminheader {
height: 200px;
}
.admin_head {
width: 55%;
display: flex;
justify-content: space-between;
}
.admin_head .el-image {
height: 120px;
width: 120px;
border-radius: 120px;
margin: 20px 5px;
}
.admin_name {
text-align: center;
width: 100%;
}
.admin_name div {
margin-top: 50px;
}
.admin_name span {
font-weight: 700;
font-size: 24px;
}
.admin_name p {
font-size: 12px;
color: #666;
line-height: 20px;
}
.admin_footer {
margin: 50px 10px;
}
.admin_footer li{
font-size: 14px;
line-height: 30px;
text-indent: 1em;
color: #666;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

@ -0,0 +1,171 @@
<template>
<!-- 门店日报 -->
<div>
<div class="bottom-right flex justify-center flex-wrap padding-bottom">
<el-tooltip effect="dark" :content="'今日客单总数为 ' + form.cashPeopleNum " placement="top">
<div class="bottom-right-item">
<i class="el-icon-user i"></i>
<br>
<span>客单数</span>
<div class="bottom-right-item-number">{{form.cashPeopleNum}}</div>
</div>
</el-tooltip>
<el-tooltip effect="dark" :content="'今日总充值金额 ' + form.rechargeMoney +' , 总共充值人数为 ' +form.rechargeOrderNum" placement="top">
<div class="bottom-right-item">
<i class="el-icon-s-management i"></i>
<br>
<span>充值金额</span>
<div>
<div class="text-red text-price">{{form.rechargeMoney | money}}</div>
<div>
<i class=" text-blue el-icon-user-solid bottom-right-item-icon"></i>
<div class=" bottom-right-item-icon-number">{{form.rechargeOrderNum}}</div>
</div>
</div>
</div>
</el-tooltip>
<el-tooltip effect="dark" :content="'今日总服务金额 ' + form.cashMoney +' , 男客 ' +form.man+'女客'+form.woman" placement="top">
<div class="bottom-right-item">
<i class="el-icon-s-finance i"></i>
<br>
<span>服务金额</span>
<div>
<div class="text-red text-price">{{form.cashMoney | money}}</div>
<div>
<i class=" text-blue el-icon-user-solid bottom-right-item-icon"></i>
<div class="text-blue bottom-right-item-icon-number">{{form.man}}</div>
<i class="text-red el-icon-user-solid bottom-right-item-icon"></i>
<div class="text-red bottom-right-item-icon-number">{{form.woman}}</div>
</div>
</div>
</div>
</el-tooltip>
<el-tooltip effect="dark" :content="'今日总还款金额 ' + form.repayMoney" placement="top">
<div class="bottom-right-item">
<i class="el-icon-s-ticket i"></i>
<br>
<span>还款金额</span>
<div class="text-red text-price">{{form.repayMoney | money}}</div>
</div>
</el-tooltip>
<el-tooltip effect="dark" :content="'今日总退款金额 ' + form.refundMoney" placement="top">
<div class="bottom-right-item">
<i class="el-icon-s-release i"></i>
<br>
<span>退款金额</span>
<div class="text-red text-price">{{form.refundMoney | money}}</div>
</div>
</el-tooltip>
<el-tooltip effect="dark" :content="'今日新增会员 ' + form.newMemberNum" placement="top">
<div class="bottom-right-item">
<i class="el-icon-s-marketing i"></i>
<br>
<span>新增会员</span>
<div>
<i class="text-blue el-icon-user-solid bottom-right-item-icon"></i>
<div class=" bottom-right-item-icon-number">{{form.newMemberNum}}</div>
</div>
</div>
</el-tooltip>
<el-tooltip effect="dark" :content="'总使用中的会员数为 ' + form.startMemberNum" placement="top">
<div class="bottom-right-item">
<i class="el-icon-loading i"></i>
<br>
<span>启用会员</span>
<div>
<i class=" text-blue el-icon-user-solid bottom-right-item-icon"></i>
<div class=" bottom-right-item-icon-number">{{form.startMemberNum}}</div>
</div>
</div>
</el-tooltip>
<el-tooltip effect="dark" :content="'门店会员总数为 ' + form.memberNum" placement="top">
<div class="bottom-right-item">
<i class="el-icon-s-data i"></i>
<br>
<span>会员总数</span>
<div>
<i class="text-blue el-icon-user-solid bottom-right-item-icon"></i>
<div class=" bottom-right-item-icon-number">{{form.memberNum}}</div>
</div>
</div>
</el-tooltip>
</div>
</div>
</template>
<script>
import { storeDaily } from "../../api/statistics";
export default {
data() {
return {
form: {
headCount: 68,
rechargeMoney: 264568,
rechargeOrderNum: 26,
cashPeopleNum: 54,
cashMoney: 344501,
repayMoney: 5500,
newMemberNum: 8,
memberNum: 48,
startMemberNum: 47,
refundMoney: 3500,
},
};
},
methods: {
storeDaily() {
let form = JSON.parse(sessionStorage.getItem("userInfo"));
storeDaily({ storeId: form.storeId }).then((res) => {
if (res.code == "000000") {
this.form = res.data;
}
});
},
},
created() {
this.storeDaily();
},
};
</script>
<style scoped>
.bottom-right {
/* display: flex;
justify-content: space-between;
flex-wrap: wrap; */
max-height: 40vh;
overflow: auto;
}
.bottom-right-item {
height: 80px;
width: 130px;
/* border: 1px solid #333; */
text-align: center;
padding: 25px 50px;
}
.bottom-right-item .i {
font-size: 42px;
color: #51a5ff;
}
.bottom-right-item span {
font-size: 16px;
color: #999;
}
.bottom-right-item-number {
font-size: 36px;
font-weight: 700;
color: #f78;
}
.bottom-right-item-icon {
font-size: 24px;
}
.bottom-right-item-icon-number {
display: inline-block;
font-size: 16px;
color: #999;
font-weight: 700;
}
</style>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save