first commit

This commit is contained in:
编码猿
2024-09-27 01:32:49 +08:00
commit 28ebe05a64
7399 changed files with 1174529 additions and 0 deletions

21
衣莎项目/源码/gc_nwjs/.gitignore vendored Normal file
View File

@@ -0,0 +1,21 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

View File

@@ -0,0 +1 @@
896ba979-b208-46d3-85b6-5c2b48e764b1

View File

@@ -0,0 +1,10 @@
条码034000567
返工效
营业额度
"main": "https://ceshi.yishaxiyi.com/factoryUpadate/index.html",
"node-remote": "https://ceshi.yishaxiyi.com/factoryUpadate/index.html",

View File

@@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/app'
]
}

View File

@@ -0,0 +1,14 @@
@echo off
set root_path=D:\nwjs-sdk-v0.33.4-win-x64\
set work_path=D:\nwjs-sdk-v0.33.4-win-x64\app\
D:
cd %work_path%
"D:\Program Files\WinRAR\WinRAR.exe" a -r -ep1 %root_path%app.zip %work_path%
echo ----------压缩包app.zip生成成功
echo ----------开始创建app.exe
cd %root_path%
copy /b nw.exe+app.zip app.exe
echo -----------创建app.exe成功
del app.zip
echo ----------删除app.zip成功
pause

View File

@@ -0,0 +1 @@
https://ceshi.yishaxiyi.com/factoryUpadate/index.html

12452
衣莎项目/源码/gc_nwjs/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,86 @@
{
"main": "http://localhost:8081/",
"node-remote": "http://localhost:8081/",
"name": "nwjs",
"version": "0.1.0",
"private": true,
"chromium-args": "--mixed-context",
"scripts": {
"dev": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"@bmy/axios": "^0.19.3",
"core-js": "^2.6.5",
"element-ui": "^2.12.0",
"readline": "^1.3.0",
"vue": "^2.6.10",
"vue-router": "^3.0.3",
"vuex": "^3.0.1"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^3.11.0",
"@vue/cli-plugin-eslint": "^3.11.0",
"@vue/cli-service": "^3.11.0",
"babel-eslint": "^10.0.1",
"eslint": "^5.16.0",
"eslint-plugin-vue": "^5.0.0",
"less": "^3.10.3",
"less-loader": "^5.0.0",
"vue-particles": "^1.0.9",
"vue-template-compiler": "^2.6.10"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"rules": {
"no-console": "off"
},
"parserOptions": {
"parser": "babel-eslint"
}
},
"postcss": {
"plugins": {
"autoprefixer": {}
}
},
"window": {
"title": "NetEaseMusic",
"toolbar": true,
"frame": true,
"width": 1000,
"height": 800
},
"platformOverrides": {
"windows": {
"window": {
"title": "伊莎洗衣工厂端 for Windows",
"toolbar": false
}
},
"linux": {
"window": {
"title": "伊莎洗衣工厂端 for Linux",
"toolbar": false
}
},
"osx": {
"window": {
"title": "伊莎洗衣工厂端 for OsX",
"toolbar": false
}
}
},
"browserslist": [
"> 1%",
"last 2 versions"
]
}

View File

@@ -0,0 +1 @@
43debd52-a7b6-4996-a291-b377201d7c52

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta HTTP-EQUIV="pragma" CONTENT="no-cache">
<meta HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<meta HTTP-EQUIV="expires" CONTENT="0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>伊莎洗衣工厂端</title>
</head>
<body>
<noscript>
<strong>We're sorry but nwjs doesn't work properly without JavaScript enabled. Please enable it to
continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
<!-- <script src="http://static.geekhelp.cn/chunk-0fc93251.545b08f2.js"></script> -->
</body>
</html>

View File

@@ -0,0 +1 @@
62724cb0-3c83-4705-acbe-5d51e3da5454

View File

@@ -0,0 +1,30 @@
<template>
<div id="app">
<router-view />
</div>
</template>
<script>
// import utils from '@/utils/utils'
export default {
data() {
return {
}
},
created() {
// 监听扫码枪事件
// utils.sweepCode((code) => {
// console.log(code);
// })
},
methods: {
}
}
</script>
<style lang='less'>
@import url("./assets/less/mian.less");
#app {
height: 100%;
}
</style>

View File

@@ -0,0 +1 @@
1441cb92-7f04-4a74-838f-2172ae0b338e

View File

@@ -0,0 +1 @@
39b57e87-6f9e-47bd-8f58-8566d2c63801

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1 @@
d66d282d-4ebf-4556-99d7-a74146d2f098

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1 @@
4220b0b1-29c3-4f1a-a9b6-39d125f80835

View File

@@ -0,0 +1,151 @@
var CreatedOKLodop7766 = null, CLodopIsLocal;
//====判断是否需要 Web打印服务CLodop:===
//===(不支持插件的浏览器版本需要用它)===
function needCLodop() {
try {
var ua = navigator.userAgent;
if (ua.match(/Windows\sPhone/i))
return true;
if (ua.match(/iPhone|iPod|iPad/i))
return true;
if (ua.match(/Android/i))
return true;
if (ua.match(/Edge\D?\d+/i))
return true;
var verTrident = ua.match(/Trident\D?\d+/i);
var verIE = ua.match(/MSIE\D?\d+/i);
var verOPR = ua.match(/OPR\D?\d+/i);
var verFF = ua.match(/Firefox\D?\d+/i);
var x64 = ua.match(/x64/i);
if ((!verTrident) && (!verIE) && (x64))
return true;
else if (verFF) {
verFF = verFF[0].match(/\d+/);
if ((verFF[0] >= 41) || (x64))
return true;
} else if (verOPR) {
verOPR = verOPR[0].match(/\d+/);
if (verOPR[0] >= 32)
return true;
} else if ((!verTrident) && (!verIE)) {
var verChrome = ua.match(/Chrome\D?\d+/i);
if (verChrome) {
verChrome = verChrome[0].match(/\d+/);
if (verChrome[0] >= 41)
return true;
}
}
return false;
} catch (err) {
return true;
}
}
//====页面引用CLodop云打印必须的JS文件,用双端口(8000和18000避免其中某个被占用====
if (needCLodop()) {
var src1 = "http://localhost:8000/CLodopfuncs.js?priority=1";
var src2 = "http://localhost:18000/CLodopfuncs.js?priority=0";
var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
var oscript = document.createElement("script");
oscript.src = src1;
head.insertBefore(oscript, head.firstChild);
oscript = document.createElement("script");
oscript.src = src2;
head.insertBefore(oscript, head.firstChild);
CLodopIsLocal = !!((src1 + src2).match(/\/\/localho|\/\/127.0.0./i));
}
//====获取LODOP对象的主过程====
function getLodop(oOBJECT, oEMBED) {
var strHtmInstall = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop32.zip' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
var strHtmUpdate = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop32.zip' target='_self'>执行升级</a>,升级后请重新进入。</font>";
var strHtm64_Install = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop64.zip' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
var strHtm64_Update = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop64.zip' target='_self'>执行升级</a>,升级后请重新进入。</font>";
var strHtmFireFox = "<br><br><font color='#FF00FF'>注意如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</font>";
var strHtmChrome = "<br><br><font color='#FF00FF'>(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</font>";
var strCLodopInstall_1 = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动点击这里<a href='CLodop_Setup_for_Win32NT.zip' target='_self'>下载执行安装</a>";
var strCLodopInstall_2 = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>";
var strCLodopInstall_3 = ",成功后请刷新本页面。</font>";
var strCLodopUpdate = "<br><font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='CLodop_Setup_for_Win32NT.zip' target='_self'>执行升级</a>,升级后请刷新页面。</font>";
var LODOP;
try {
var ua = navigator.userAgent;
var isIE = !!(ua.match(/MSIE/i)) || !!(ua.match(/Trident/i));
if (needCLodop()) {
try {
/* eslint-disable */
LODOP = getCLodop();
/* eslint-disable */
} catch (err) {
console.error(err);
}
if (!LODOP && document.readyState !== "complete") {
alert("网页还没下载完毕,请稍等一下再操作.");
return;
}
if (!LODOP) {
document.body.innerHTML = strCLodopInstall_1 + (CLodopIsLocal ? strCLodopInstall_2 : "") + strCLodopInstall_3 + document.body.innerHTML;
return;
} else {
if (CLODOP.CVERSION < "3.0.6.0") {
document.body.innerHTML = strCLodopUpdate + document.body.innerHTML;
}
if (oEMBED && oEMBED.parentNode)
oEMBED.parentNode.removeChild(oEMBED);
if (oOBJECT && oOBJECT.parentNode)
oOBJECT.parentNode.removeChild(oOBJECT);
}
} else {
var is64IE = isIE && !!(ua.match(/x64/i));
//=====如果页面有Lodop就直接使用没有则新建:==========
if (oOBJECT || oEMBED) {
if (isIE)
LODOP = oOBJECT;
else
LODOP = oEMBED;
} else if (!CreatedOKLodop7766) {
LODOP = document.createElement("object");
LODOP.setAttribute("width", 0);
LODOP.setAttribute("height", 0);
LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;");
if (isIE)
LODOP.setAttribute("classid", "clsid:2105C259-1E0C-4534-8141-A753534CB4CA");
else
LODOP.setAttribute("type", "application/x-print-lodop");
document.documentElement.appendChild(LODOP);
CreatedOKLodop7766 = LODOP;
} else
LODOP = CreatedOKLodop7766;
//=====Lodop插件未安装时提示下载地址:==========
if ((!LODOP) || (!LODOP.VERSION)) {
if (ua.indexOf('Chrome') >= 0)
document.body.innerHTML = strHtmChrome + document.body.innerHTML;
if (ua.indexOf('Firefox') >= 0)
document.body.innerHTML = strHtmFireFox + document.body.innerHTML;
document.body.innerHTML = (is64IE ? strHtm64_Install : strHtmInstall) + document.body.innerHTML;
return LODOP;
}
}
if (LODOP.VERSION < "6.2.2.4") {
if (!needCLodop())
document.body.innerHTML = (is64IE ? strHtm64_Update : strHtmUpdate) + document.body.innerHTML;
return LODOP;
}
//===如下空白位置适合调用统一功能(如注册语句、语言选择等):==
LODOP.SET_LICENSES("", "13528A153BAEE3A0254B9507DCDE2839", "", "");
//=======================================================
return LODOP;
} catch (err) {
alert("getLodop出错:" + err);
}
}
export default {
needCLodop,
getLodop
}

View File

@@ -0,0 +1 @@
8e34f6f4-10a7-4535-8918-c502d8d24e45

View File

@@ -0,0 +1 @@
@import './public/_mian.less';

View File

@@ -0,0 +1 @@
3321e8ce-1ea1-4cc3-be89-c313bb85455e

View File

@@ -0,0 +1,3 @@
@import './common.less';
@import './color.less';
@import './margin.less';

View File

@@ -0,0 +1,44 @@
@Brand100:#ecf5ff;
@Brand200:#d9ecff;
@Brand300:#c6e2ff;
@Brand400:#b3d8ff;
@Brand500:#a0cfff;
@Brand600:#8cc5ff;
@Brand700:#79bbff;
@Brand800:#66b1ff;
@Brand900:#53a8ff;
@Brand900:#409EFF;
@Brand:@Brand500;
@Success100:#f0f9eb;
@Success200:#e1f3d8;
@Success300:#67c23a;
@Warning100:#fdf6ec;
@Warning200:#faecd8;
@Warning300:#e6a23c;
@Danger100:#fef0f0;
@Danger200:#fde2e2;
@Danger300:#f56c6c;
@Info100:#f4f4f5;
@Info200:#e9e9eb;
@Info300:#909399;
@FontIndex100:#303133;
@FontIndex200:#606266;
@FontIndex300:#909399;
@FontIndex400:#C0C4CC;
@borderIndex100:#DCDFE6;
@borderIndex200:#E4E7ED;
@borderIndex300:#EBEEF5;
@borderIndex400:#F2F6FC;
@black:#000000;
@white:#ffffff;
@body:#edf0ef;
@themeColor:#04B84F;

View File

@@ -0,0 +1,246 @@
@import './color.less';
body, div, span, header, footer, nav, section, aside, article, ul, dl, dt, dd, li, a, p, h1, h2, h3, h4,h5, h6, i, b, textarea, button, input, select, figure, figcaption {
padding: 0;
margin: 0;
list-style: none;
font-style: normal;
text-decoration: none;
border: none;
font-family: "Microsoft Yahei",sans-serif;
-webkit-tap-highlight-color:transparent;
-webkit-font-smoothing: antialiased;
&:focus {
outline: none;
}
}
::-webkit-scrollbar
{
width: 0px;
cursor: pointer;
border-radius: inherit;
// background-color: rgba(144,147,153,.3);
}
/*定义滚动条轨道 内阴影+圆角*/
::-webkit-scrollbar-track
{
-webkit-box-shadow: inset 0 0 6px #00000000;
border-radius: 10px;
background-color: #00000000;
}
/*定义滑块 内阴影+圆角*/
::-webkit-scrollbar-thumb
{
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(144,147,153,.3);
background-color: rgba(144,147,153,.3);
}
input[type="button"], input[type="submit"], input[type="search"], input[type="reset"] {
-webkit-appearance: none;
}
textarea { -webkit-appearance: none;}
html,body{
height: 100%;
width: 100%;
background-color: #edf0ef;
}
.clear{
clear: both;
}
.h100{
height: 100%;
}
.w100{
width: 100%;
}
.b_img{
background-repeat: no-repeat;
background-size: 100% 100%;
}
.pointer{
cursor: pointer;
}
.img{
height: 100%;
width: 100%;
}
.margin{
margin: 0 auto;
}
.left{
float: left;
}
.right{
float: right;
}
.hide{
display: none;
}
.show{
display: block;
}
.tc{
text-align: center;
}
.tl{
text-align: left;
}
.tr{
text-align: right;
}
.ver_align{
vertical-align: middle;
}
.dis-flex1{
display: -webkit-flex;
display: flex;
-webkit-justify-content: center;
justify-content: center;
-webkit-align-items: center;
align-items: center;
}
// 垂直方向居中
.dis-flex2{
display: -webkit-flex;
display: flex;
-webkit-align-items: center;
align-items: center;
}
.inblock{
display: inline-block;
}
.block{
display: block;
}
.flex{
display: flex;
}
.flex-column{
display: flex;
flex-direction:column;
}
.flex1{
flex: 1;
}
// 重写ui框架样式
.el-dialog__header{
background: @themeColor !important;
.el-dialog__title{
color: #ffffff !important;
}
.el-dialog__close{
color: #ffffff !important;
}
}
.el-button--primary{
background-color: @themeColor !important;
border-color: @themeColor !important;
}
// 卡片样式重写
.Exhibition {
.el-card__header {
padding: 25px 20px 10px 20px !important;
border-bottom: 0px !important;
}
.clearfix {
font-size: 18px;
font-weight: bold;
color: rgba(51, 51, 51, 1);
}
.el-card__body{
padding: 0 10px 10px 10px !important;
.body_content{
background-color: #E6E6E6;
padding: 20px 36px;
color: #333333;
font-weight:500;
span{
min-width: 250px;
margin-right: 20px;
margin-top: 10px;
display: inline-block;
i{
display: inline-block;
width: 80px;
text-align: right;
margin-right: 5px;
}
}
}
}
}
// 表单样式重写
.el-table .warning-row {
background: #f6f6f6 !important;
}
.el-table__body tr:hover > td {
background-color: #e0f5e9 !important;
cursor: pointer;
}
// // 输入框样式重写
// .el-input__inner:hover {
// border-color: @themeColor !important;
// }
// .el-input__inner:focus-within{
// border-color: @themeColor !important;
// }
// // tab样式重写
// .el-tabs__item:hover{
// color: @themeColor !important;
// }
// .el-tabs__item.is-active {
// color: @themeColor !important;
// }
// .el-tabs__active-bar{
// background-color: @themeColor !important;
// }
// // 重写单选框样式
// .el-radio__input.is-checked .el-radio__inner {
// border-color: @themeColor !important;
// background: @themeColor !important;
// }
// .el-radio__input.is-checked+.el-radio__label {
// color: @themeColor !important;
// }
// // 重写复选框样式
// .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
// background-color: @themeColor !important;
// border-color: @themeColor !important;
// }
// .el-checkbox__input.is-checked+.el-checkbox__label {
// color: @themeColor !important;
// }
// // 重写选择器样式
// .el-select-dropdown__item.selected {
// color: @themeColor !important;
// }
// // 重写时间选择器样式
// .el-date-table td.end-date span, .el-date-table td.start-date span {
// background-color: @themeColor !important;
// }
// .el-date-table td.today span {
// color: @themeColor !important;
// }
// .el-date-table td.available:hover {
// color: @themeColor !important;
// }

View File

@@ -0,0 +1,15 @@
.ml10{
margin-left: 10px;
}
.mr10{
margin-right: 10px;
}
.mt10{
margin-top: 10px;
}
.mb10{
margin-bottom: 10px;
}
.mb30{
margin-bottom: 30px;
}

View File

@@ -0,0 +1 @@
31247e0f-3b3b-43eb-9dd9-6e6f58ec30e6

View File

@@ -0,0 +1,45 @@
@import '../public/color.less';
.dropMark {
padding: 0 10px 30px 10px;
box-sizing: border-box;
.el-input {
width: auto;
}
.list {
overflow-y: scroll;
.clearfix:before,
.clearfix:after {
display: table;
content: "";
}
.clearfix:after {
clear: both;
}
.el-col-8{
width: 18%;
&:nth-child(n+6) {
margin-top: 2%;
}
}
.el-col-offset-2,
.el-col-offset-0 {
margin-left: 0 !important;
margin-right: 2%;
}
.shop{
height: 150px;
.shopImg{
width: 150px;
}
}
.clearfix{
color: @FontIndex200;
font-weight: 500;
font-size: 14px;
.name{
color: @FontIndex100;
}
}
}
}

View File

@@ -0,0 +1,74 @@
@import '../public/color.less';
.index {
height: 100%;
width: 100%;
display: flex;
flex-direction:column;
.el-row{
width: 100%;
}
.header {
height: 100px;
width: 100%;
padding: 0 10px;
box-sizing: border-box;
border-bottom: 1px solid #dcdfe6;
background-color: #04B84F;
.logo {
height: 100px;
padding-left: 30px;
img{
width: 100%;
}
}
.ul {
height: 100px;
.li {
width: 100px;
.hamburger{
height: 50px;
width: 50px;
}
p{
margin-top: 5px;
font-size:16px;
color: @white;
font-weight:400;
}
}
}
}
.mian{
li{
width: 288px;
height: 240px;
margin: 0 30px;
}
}
.bootom{
height: 40px;
line-height: 40px;
padding: 0 30px;
background-color: #04B84F;
.secondary{
color: @white;
}
}
.close{
position: fixed;
right: 20px;
top: 35px;
color: @white;
.closeCen{
width: 120px;
float: right;
img{
height: 25px;
width: 23px;
}
.closeCen-p{
margin-left: 10px;
}
}
}
}

View File

@@ -0,0 +1,32 @@
@import '../public/color.less';
.login,
.ion,
.lizi {
height: 100%;
}
.login {
.ion {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
z-index: 0;
width: 100%;
height: 100%;
background: url(https://vue-particles.netlify.com/static/img/sky.871d198.jpg);
background-size: cover;
}
.form {
position: relative;
height: 100%;
.demo-ruleForm {
width: 500px;
}
}
// 重写ui框架样式
.el-form-item__label{
color: @white !important;
font-size: 24px !important;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -0,0 +1 @@
c907d9fe-0cc4-4d67-91c0-acce284348c2

View File

@@ -0,0 +1,171 @@
<template>
<div class="dropMark flex1">
<div class="flex-column h100 flex1">
<div>
<div class="block">
<div class="inblock">
时间:
<el-date-picker
v-model="time"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd hh:mm:ss"
></el-date-picker>
</div>
<div class="inblock ml10">
条码:
<el-input v-model="really_code" placeholder="请输入内容"></el-input>
</div>
<div class="inblock ml10">
<el-radio v-model="radio" label="1">领取</el-radio>
<el-radio v-model="radio" label="2">未领取</el-radio>
</div>
</div>
<div class="block mt10">
<div class="inblock">
颜色:
<el-input v-model="color" placeholder="请输入内容"></el-input>
</div>
<div class="inblock ml10">
品牌:
<el-input v-model="brand" placeholder="请输入内容"></el-input>
</div>
<div class="inblock ml10">
名称:
<el-input v-model="name" placeholder="请输入内容"></el-input>
</div>
<div class="inblock ml10">
<el-button type="primary" @click="_query()">查询</el-button>
</div>
</div>
</div>
<div class="mt10">
<el-card class="box-card">
<div>
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page"
:page-sizes="[20, 30, 40, 50]"
:page-size="limit"
layout="total, sizes, prev, pager, next, jumper"
:total="dropWatchList.info.count"
></el-pagination>
</div>
</el-card>
</div>
<div class="mt10 flex1 flex-column h100">
<el-card class="flex1 flex list">
<div>
<el-row>
<el-col
:span="8"
v-for="(item, index) in dropWatchList.list"
:key="index"
:offset="index > 0 ? 2 : 0"
>
<el-card :body-style="{ padding: '0px' }">
<div class="flex shop">
<div class="shopImg">
<img class="img" :src="item.image" alt="图片地址不正确请联系开发人员" />
</div>
<div style="padding: 14px;" class="bottom clearfix flex1">
<div class="name">名称: {{item.name}}</div>
<div>颜色: {{item.color}}</div>
<div>品牌: {{item.brand}}</div>
<div>水洗码: {{item.provision_code}}</div>
<div>{{item.find_time}}</div>
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
</el-card>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
tableHeight: window.innerHeight - 300,
time: [],
color: '',
brand: '',
name: '',
really_code: '',
radio: '1',
currentPage4: 4,
dropWatchList: {
list: [],
info: {}
},
page: 1,
limit: 20
}
},
created() {
this.time[0] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D h:m:s')
this.time[1] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D h:m:s')
this._query()
},
methods: {
handleSizeChange(val) {
// console.log(`每页 ${val} 条`);
this.limit = val
this._query()
},
handleCurrentChange(val) {
// console.log(`当前页: ${val}`);
this.page = val
this._query()
},
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
async _query() {
let data = {
startTime: this.time[0],
endTime: this.time[1],
status: this.radio,
really_code: this.really_code,
brand: this.brand,
color: this.color,
name: this.name,
page: this.page,
limit: this.limit
}
let res = await this.$http.findLossBid(data)
this.dropWatchList = res.data.data
}
}
}
</script>
<style lang="less" scoped>
@import "../assets/less/view/dropMark.less";
</style>
<style lang="less">
.dropMark {
.el-card__body {
overflow-y: scroll;
flex: 1;
}
.el-tabs__content {
flex: 1;
display: flex;
.el-tab-pane {
flex: 1;
display: flex;
}
}
}
</style>

View File

@@ -0,0 +1,162 @@
<template>
<div class="dropMark w100">
<div class="flex-column h100 flex1">
<div>
<div class="block">
<div class="inblock">
时间:
<el-date-picker
v-model="time"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd hh:mm:ss"
></el-date-picker>
</div>
<div class="inblock ml10">
<el-radio v-model="radio" label="1">未出厂</el-radio>
<el-radio v-model="radio" label="2">已出厂</el-radio>
</div>
</div>
<div class="block mt10">
<div class="inblock">
品牌:
<el-input v-model="brand" placeholder="请输入内容"></el-input>
</div>
<div class="inblock ml10">
名称:
<el-input v-model="name" placeholder="请输入内容"></el-input>
</div>
<div class="inblock ml10">
网格:
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</div>
<div class="inblock ml10">
颜色:
<el-select v-model="color" placeholder="请选择">
<el-option
v-for="item in colorData"
:key="item.color_name"
:label="item.color_name"
:value="item.color_name"
></el-option>
</el-select>
</div>
<div class="inblock ml10">
<el-button type="primary" @click="matchBid">开始匹配</el-button>
</div>
</div>
</div>
<div class="mt10 flex1 flex-column h100">
<el-table
:data="tableData"
height="250"
border
style="width: 100%"
:row-class-name="tableRowClassName"
>
<el-table-column prop="shop_order_no" label="订单号" width="180"></el-table-column>
<el-table-column prop="code_num" label="条形码" width="180"></el-table-column>
<el-table-column prop="name" label="衣物名称"></el-table-column>
<el-table-column prop="create_time" label="下单时间"></el-table-column>
<el-table-column prop="color" label="颜色"></el-table-column>
<el-table-column prop="brand" label="品牌"></el-table-column>
<el-table-column prop="cloth_wg" label="网格"></el-table-column>
<el-table-column prop="appendix" label="附件"></el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
tableHeight: window.innerHeight - 300,
time: [],
brand: '',
name: '',
color: '',
radio: '1',
currentPage4: 4,
colorData: [],
options: [{
value: '请选择',
label: '请选择'
}, {
value: '方格',
label: '方格'
}, {
value: '花纹',
label: '花纹'
}, {
value: '条纹',
label: '条纹'
}, {
value: '卡通',
label: '卡通'
}, {
value: '字母',
label: '字母'
}],
value: '',
tableData: []
}
},
created() {
this.time[0] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D h:m:s')
this.time[1] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D h:m:s')
this.matchBid()
this.$http.getShopColor()
.then(res => {
this.colorData = [{ id: null, color_name: '请选择' }, ...res.data.data]
})
},
methods: {
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
async matchBid() {
let data = {
outStatus: this.radio,
startTime: this.time[0],
endTime: this.time[1],
color: this.color == '请选择' ? '' : this.color,
brand: this.brand,
name: this.name
}
let res = await this.$http.matchBid(data)
this.tableData = res.data.data
}
}
}
</script>
<style lang="less" scoped>
@import "../assets/less/view/dropMark.less";
</style>
<style lang="less">
.dropMark {
.el-card__body {
overflow-y: scroll;
}
.el-tabs__content {
flex: 1;
display: flex;
.el-tab-pane {
flex: 1;
display: flex;
}
}
}
</style>

View File

@@ -0,0 +1,54 @@
<template>
<div>
<div class="header">
<div class="title">{{title}}</div>
<div class="right">
<el-button type="danger" plain @click="close()">关闭</el-button>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
title: {
type: String,
value: ''
}
},
created() {
console.log(this.title);
},
methods: {
close() {
this.$nw.close()
},
},
mounted() {
console.log(this.title)
}
}
</script>
<style lang="less" scoped>
.header {
width: 100%;
height: 50px;
text-align: center;
background: #04b84f;
position: relative;
.title {
width: 30%;
margin: 0 auto;
height: 50px;
line-height: 50px;
color: #ffffff;
font-size: 24px;
font-weight: 400;
}
.right {
position: absolute;
top: 5px;
right: 10px;
}
}
</style>

View File

@@ -0,0 +1,118 @@
<template>
<div class="logins">
<div class="form dis-flex1">
<el-form
:model="ruleForm"
status-icon
:rules="rules"
ref="ruleForm"
label-width="100px"
class="demo-ruleForm margin"
size="medium"
>
<el-form-item label="账号" prop="user">
<el-input v-model="ruleForm.user" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="密码" prop="pass">
<el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')" :loading="loading">登录</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入账号"));
} else {
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入密码"));
} else {
callback();
}
};
return {
loading: false, //按钮加载状态
ruleForm: {
user: "",
pass: ""
},
rules: {
user: [{ validator: validatePass, trigger: "blur" }],
pass: [{ validator: validatePass2, trigger: "blur" }]
}
};
},
created() {
if (
localStorage.getItem("login") !== "" ||
localStorage.getItem("login") !== null
) {
let login = JSON.parse(localStorage.getItem("login")) || {};
this.ruleForm = {
user: login["user"],
pass: login["pass"]
};
}
},
methods: {
submitForm(formName) {
this.$refs[formName].validate(async valid => {
if (valid) {
this.loading = true;
let res = await this.$http.login(
this.ruleForm.user,
this.ruleForm.pass
);
this.loading = false;
if (res.data.status == 1) {
await localStorage.setItem(
"login",
JSON.stringify({
user: this.ruleForm.user,
pass: this.ruleForm.pass
})
);
this.$router.go(0);
} else {
this.$message({
message: res.data.msg,
type: "warning"
});
}
} else {
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
}
}
};
</script>
<style lang="less">
.logins {
.el-form-item__label {
color: #000000 !important;
font-size: 24px !important;
}
.form {
position: relative;
height: 100%;
.demo-ruleForm {
width: 500px;
}
}
}
</style>

View File

@@ -0,0 +1,77 @@
<template>
<div class="selectionMenu">
<el-dialog title="功能选择" :visible.sync="dialogVisible" width="40%" :before-close="handleClose">
<div class="border">
<ul class="border-ul">
<li v-for="(item,index) in dataList" :key="index" @click="goUrl(item)">{{item.title}}</li>
</ul>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
props: {
dataList: {
type: Array,
default() {
return []
}
},
isShow: {
type: Boolean,
default() {
return false
}
}
},
data() {
return {
dialogVisible: false
};
},
created() {
},
methods: {
// 关闭弹出框
handleClose(done) {
done();
},
// 跳转
goUrl(item) {
if (typeof item.url !== 'string') return;
let baseUrl = window.location;
nw.Window.open(`${baseUrl.origin}${baseUrl.pathname}#${item.url}?title=${item.title}&status=${item.status}`, { fullscreen: true, frame: true }, () => { });
// nw.Window.open('http://192.168.0.126:8080/#/exitFactory', {}, () => { });
}
},
watch: {
isShow() {
this.dialogVisible = !this.dialogVisible
}
}
};
</script>
<style lang="less" scoped>
.border {
width: 100%;
height: 500px;
overflow-y: scroll;
.border-ul {
li {
width: 120px;
height: 90px;
line-height: 90px;
text-align: center;
margin: 10px;
background: red;
display: inline-block;
font-size: 18px;
letter-spacing: 3px;
color: #ffffff;
float: left;
cursor: pointer;
}
}
}
</style>

View File

@@ -0,0 +1 @@
eae39927-dd05-43a2-92b5-b1b6e2dc9e19

View File

@@ -0,0 +1,6 @@
export default {
// baseUrl: 'https://yitest.yishaxiyi.com/factoryapi',// 开发阶段测试地址
baseUrl: 'https://ceshi.yishaxiyi.com/factoryapi',// 上线正式地址
prefix: '',//缓存前缀
a:'https://yitest.yishaxiyi.com/factoryUpadate/index.html'
}

View File

@@ -0,0 +1 @@
432d26c6-e88c-4dab-a39d-8d4970ed0cc8

View File

@@ -0,0 +1,33 @@
export default {
login: '/login',
getShopMember: '/getShopMember',//获取门店员工信息
allShop: '/allShop',//获取门店信息
allPosition: '/allPosition',//获取岗位信息
allPeople: '/allPeople',//获取工厂所有员工信息
getShopColor: '/getShopColor',//获取颜色
allDriver: '/allDriver',//获取驾驶员数据接口
findOut: '/findOut',//出厂查询
getOutByNo: '/getOutByNo',//根据出厂单号查询衣物信息
queryOrder: '/queryOrder',//订单号或条形码查询
orderAbout: 'orderAbout',//点击衣物信息查询工厂和门店操作记录
warn: '/warn',//衣物预警
workCount: '/workCount',//业绩查询
findLossBid: '/findLossBid',//掉标衣物查看
matchBid: '/matchBid',//掉标衣物匹配
operate: '/operate',//员工的岗位操作权限
changeClothProcess: '/changeClothProcess',//衣物工序(出厂单独接口)
outFactory: '/outFactory',//衣物出厂
countPosition: '/countPosition',//今日工作件数
outSys: '/outSys',//确认出厂
returnWhy: '/returnWhy', // 返工原因
insertReturn: '/insertReturn', // 添加返工
addExtra: '/addExtra',
returnList: '/returnList', // 返工记录列表接口
extraList: '/extraList', // 补款列表
sureAccept: '/sureAccept', // 接收返工
shopMoney: '/shopMoney', // 单个门店营业额查询
shopTypeMoney: '/shopTypeMoney', // 门店类型营业额统计
shopClothCount: '/shopClothCount', // 门店每日收衣统计
checkClothCount: '/checkClothCount' // 工厂总检数据查询
}

View File

@@ -0,0 +1,148 @@
import ajax from './index'
import api from './api'
import util from '../utils/utils'
import store from '../store/index'
import type from '../store/type'
export default {
async login(user, pass) {
let res = await ajax.request1({ url: api.login, method: "POST", data: { job_number: user, password: pass } })
if (res.data.status == 1) {
util.setStorage('userInfo', res.data.data)
store.commit(type.ACTIONS.SET_USERINFO, res.data.data)
}
return res
},
async findOut(data) {
return await ajax.request1({ url: api.findOut, method: "POST", data: data })
},
async getOutByNo(exit_factory_no) {
return await ajax.request1({ url: api.getOutByNo, params: { exit_factory_no: exit_factory_no } })
},
// 订单号或条形码查询
async queryOrder(clothTerm) {
return await ajax.request1({ url: api.queryOrder, method: 'POST', data: { clothTerm: clothTerm } })
},
//点击衣物信息查询工厂和门店操作记录
async orderAbout(code) {
return await ajax.request1({ url: api.orderAbout, params: { code: code } })
},
//衣物预警
async warn(data) {
return await ajax.request1({ url: api.warn, method: 'POST', data: data })
},
//业绩查询
async workCount(data) {
return await ajax.request1({ url: api.workCount, method: 'POST', data: data })
},
//掉标衣物查看
async findLossBid(data) {
return await ajax.request1({ url: api.findLossBid, method: 'POST', data: data })
},
//掉标衣物匹配
async matchBid(data) {
return await ajax.request1({ url: api.matchBid, method: 'POST', data: data })
},
//员工的岗位操作权限
async operate(type) {
let res = await ajax.request1({ url: api.operate, method: 'POST', data: { type: type } })
let rel = res.data.data
rel.map((v, i) => {
rel[i].title = v.name
})
return rel
},
// 衣物工序(出厂单独接口)
async changeClothProcess(data) {
return await ajax.request1({ url: api.changeClothProcess, method: 'POST', data: data })
},
// 衣物出厂
async outFactory(data) {
return await ajax.request1({ url: api.outFactory, method: 'POST', data: data })
},
// 今日工作件数
async countPosition(status) {
return await ajax.request1({ url: api.countPosition, method: 'POST', data: { status: status } })
},
// 确认出厂
async outSys() {
return await ajax.request1({ url: api.outSys, method: 'POST' })
},
// 公共接口
//获取门店员工信息
async getShopMember(shop_id) {
return await ajax.request1({ url: api.getShopMember, params: { shop_id: shop_id } })
},
//获取门店信息
async allShop() {
return await ajax.request1({ url: api.allShop })
},
//获取岗位信息
async allPosition() {
return await ajax.request1({ url: api.allPosition })
},
//获取工厂所有员工信息
async allPeople() {
return await ajax.request1({ url: api.allPeople })
},
//获取颜色
async getShopColor() {
return await ajax.request1({ url: api.getShopColor })
},
//获取驾驶员数据接口
async allDriver() {
return await ajax.request1({ url: api.allDriver })
},
//获取驾驶员数据接口
async returnWhy() {
return await ajax.request1({ url: api.returnWhy })
},
//添加返工
async insertReturn(params) {
return await ajax.request1({ url: api.insertReturn, method: 'POST', data: params })
},
//添加返工
async addExtra(params) {
return await ajax.request1({ url: api.addExtra, method: 'POST', data: params })
},
// 返工记录列表接口
async returnList(params) {
return await ajax.request1({ url: api.returnList, method: 'POST', data: params })
},
// 衣物补款列表接口
async extraList(params) {
return await ajax.request1({ url: api.extraList, method: 'POST', data: params })
},
async sureAccept(params) {
return await ajax.request1({ url: api.sureAccept, method: 'POST', data: params })
},
// 单个门店营业额查询
async shopMoney(params) {
return await ajax.request1({ url: api.shopMoney, method: 'POST', data: params })
},
// 门店类型营业额统计
async shopTypeMoney(params) {
return await ajax.request1({ url: api.shopTypeMoney, method: 'POST', data: params })
},
// 门店每日收衣统计
async shopClothCount(params) {
return await ajax.request1({ url: api.shopClothCount, method: 'POST', data: params })
},
// 工厂总检数据查询
async checkClothCount(params) {
return await ajax.request1({ url: api.checkClothCount, method: 'POST', data: params })
}
}

View File

@@ -0,0 +1,31 @@
import axios from '@bmy/axios';
import config from '@/config/index';
import store from '../store/index'
// Vue.use(axios)
export default {
/**
* 通用请求
* @param {*} option
* url 请求地址, data 请求参数, method请求方式默认get
*/
request1(option) {
let token = store.getters.userInfo['token']
let headers = { ...option.headers, token }
return new Promise((resolve, reject) => {
axios({
method: option.method || 'GET',
url: `${config.baseUrl}${option.url}`,
data: option.data,
params: option.params,
headers: headers
}).then(function (response) {
resolve(response)
}).catch(function (error) {
console.error(error, `======${option.url}请求出错`)
reject(error)
});
})
}
}

View File

@@ -0,0 +1,29 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store/index'
import ElementUI from 'element-ui';
// import 'element-ui/lib/theme-chalk/index.css';
// 自定义主题引入
import '@/static/style/theme/index.css'
// import VueParticles from 'vue-particles';
import http from '@/http/http';
import nw from '@/utils/nw'
import utils from '@/utils/utils'
import printing from '@/utils/printing'
Vue.config.productionTip = false
Vue.use(ElementUI)
// Vue.use(VueParticles)
Vue.prototype.$http = http
Vue.prototype.$nw = nw
Vue.prototype.$utils = utils
Vue.prototype.$printing = printing
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')

View File

@@ -0,0 +1,83 @@
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router);
export default new Router({
routes: [
{
path: '/',
redirect: '/login'
},
{
path: '/login',
name: 'login',
component: () => import('./views/login.vue')
},
{
path: '/index',
name: 'index',
component: () => import('./views/index.vue')
},
{
path: '/Statistics',
name: 'Statistics',
component: () => import('./views/Statistics.vue')
},
{
path: '/checkClothCount',
name: 'checkClothCount',
component: () => import('./views/checkClothCount.vue')
},
{
path: '/StoreTurnover',
name: 'StoreTurnover',
component: () => import('./views/StoreTurnover.vue')
},
{
path: '/exitFactory',
name: 'exitFactory',
component: () => import('./views/exitFactory.vue')
},
{
path: '/clothingInquiries',
name: 'clothingInquiries',
component: () => import('./views/clothingInquiries.vue')
},
{
path: '/productionEarlyWarning',
name: 'productionEarlyWarning',
component: () => import('./views/productionEarlyWarning.vue')
},
{
path: '/workload',
name: 'workload',
component: () => import('./views/workload.vue')
},
{
path: '/dropMark',
name: 'dropMark',
component: () => import('./views/dropMark.vue')
},
{
path: '/enterFactory',
name: 'enterFactory',
component: () => import('./views/enterFactory.vue')
},
{
path: '/factory',
name: 'factory',
component: () => import('./views/factory.vue')
},
{
path: '/rework',
name: 'rework',
component: () => import('./views/ReworkManagement.vue')
},
{
path: '/compensation',
name: 'compensation',
component: () => import('./views/CompensationManagement.vue')
}
]
})

View File

@@ -0,0 +1 @@
e7cc86a5-d0e2-4423-bb9c-da3907e6df82

View File

@@ -0,0 +1 @@
ed5fbef0-9eb6-4404-bc96-9040ef1e48d7

View File

@@ -0,0 +1 @@
{"global":{"$--color-primary":"#04B84F"},"local":{}}

View File

@@ -0,0 +1 @@
52889fa6-0d07-4ff7-b45a-8a6bfdb10aa9

View File

@@ -0,0 +1 @@
d54b3aac-8937-4e4f-9fe4-156d92db3c0d

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
37e078d8-c5dc-4fc5-a289-b8f0ef2bd216

View File

@@ -0,0 +1,3 @@
export default {
}

View File

@@ -0,0 +1,6 @@
import utils from '../utils/utils'
export default {
userInfo: (state) => {
return state.userInfo['name'] ? state.userInfo : utils.getStorage('userInfo') || {}
}
}

View File

@@ -0,0 +1,26 @@
import Vue from 'vue'
import Vuex from 'vuex'
import getters from '@/store/getters'
import home from './modules/Home'
import mutations from './mutations'
import state from './state'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
...state
},
modules: {
home
},
mutations: {
...mutations
},
actions: {
},
getters
})

View File

@@ -0,0 +1 @@
a36ffe4c-da6b-427a-8a73-87dab63869fb

View File

@@ -0,0 +1,16 @@
import type from '../type'
export default {
state: {
num:1
},
mutations: {
ADDNUM(state, n){
state.num += n
}
},
actions: {
[type.ACTIONS.NUM]({ commit },n){
commit('ADDNUM',n)
}
}
}

View File

@@ -0,0 +1,6 @@
import type from './type';
export default {
[type.MUTATIONS.SET_USERINFO](state, n) {
state.userInfo = n
}
}

View File

@@ -0,0 +1,5 @@
export default {
userInfo: {
token: ''
}
}

View File

@@ -0,0 +1,11 @@
export default {
ACTIONS: {
NUM: 'NUM',
SET_USERINFO: 'SET_USERINFO',
GET_USERINFO: 'GET_USERINFO'
},
MUTATIONS: {
SET_USERINFO: 'SET_USERINFO',
GET_USERINFO: 'GET_USERINFO'
}
};

View File

@@ -0,0 +1 @@
0feac996-cd60-4ced-a233-680f85e85da3

View File

@@ -0,0 +1,27 @@
/* eslint-disable */
let win = nw.Window.get() || '';
export default {
big() {
win.toggleFullscreen();
},
/**
* 打开新窗口跳转
* @param {*} url
* @param {*} option
* @param {*} callback
*/
openWin(url, option, callback) {
let baseUrl = window.location
nw.Window.open(`${baseUrl.origin}${baseUrl.pathname}#${url}`, { fullscreen: true, frame: true }, () => {
// And listen to new window's focus event
// callback(win)
// win.on('focus', () => {
// win.toggleFullscreen();
// });
});
},
close() {
win.close();
}
}

View File

@@ -0,0 +1,101 @@
var ws;
var wsUrl = 'ws://localhost:2012';//打印后台地址与
var isWx = true;
function connection() {
if ('WebSocket' in window) {
ws = new WebSocket(wsUrl);
}
else if ('MozWebSocket' in window) {
ws = new MozWebSocket(wsUrl);
} else {
alert('当前浏览器不支持');
}
//注册各类回调
ws.onopen = function () {
// alert('连接打印后台成功');
isWx = true
}
ws.onclose = function () {
// alert('与打印后台断开连接');
isWx = false
}
ws.onerror = function () {
alert('数据传输发生错误');
isWx = false
}
ws.onmessage = function (receiveMsg) {
if (receiveMsg.data.split("|")[0] == "A_GetPrinterStatus") {
var ret = receiveMsg.data.split("|")[1];
if (ret == 0) {
document.getElementById("status").value = "无返回值";
return;
}
else if (ret == 1) {
document.getElementById("status").value = "打印机命令解析器忙碌中!";
return;
}
else if (ret == 2) {
document.getElementById("status").value = "2 纸张用完或安装错误!"; //纸张用完或安装错误!
return;
}
else if (ret == 4) {
document.getElementById("status").value = "4 碳带用完或安装错误!"; //碳带用完或安装错误!";
return;
}
else if (ret == 8) {
document.getElementById("status").value = "8 打印批次文档中!"; //打印批次文档中!";
return;
}
else if (ret == 16) {
document.getElementById("status").value = "16 正在打印文件!"; //正在打印文件!
return;
}
else if (ret == 32) {
document.getElementById("status").value = "32 打印机暂停!"; //打印机暂停!
return;
}
else if (ret == 64) {
document.getElementById("status").value = "64 正在送出标签纸!"; //正在送出标签纸!
return;
}
else if (ret == 9) {
document.getElementById("status").value = "9 打印机待机中!"; //打印机待机中!
return;
}
}
}
}
function sendMessage(data) {
//尝试向打印后台发送消息
if (!isWx) return;
ws.send('A_EnumUSB');
ws.send('A_CreateUSBPort|1');
ws.send('A_Prn_Text_TrueType|5|0|35|宋体|1|600|0|0|0|AA|' + data.code_num + '|1');
ws.send('A_Prn_Text_TrueType|5|20|34|宋体|1|900|0|800|0|BB|' + data.shopName + '|1');
ws.send('A_Prn_Text_TrueType|5|40|28|宋体|1|600|0|0|0|DD|' + data.username + '|1');
ws.send('A_Prn_Text_TrueType|5|60|24|宋体|1|600|0|0|0|HH|' + data.appendix + '|1');
ws.send('A_Prn_Text_TrueType|5|80|28|宋体|1|600|0|0|0|CC|' + data.color + ' ' + '共' + data.total_count + '件|1');
ws.send('A_Prn_Text_TrueType|5|100|28|宋体|1|600|0|0|0|EE|' + data.name + '|1');
ws.send('A_Prn_Text_TrueType|5|120|24|宋体|1|600|0|0|0|FF|' + data.shop_order_no + '|1');
ws.send('A_Prn_Barcode|110|134|2|o|2|3|60|B|1|' + data.code_num + '');
ws.send('A_Prn_Text_TrueType|170|30|32|宋体|4|600|0|0|0|GG|' + data.telnum + '|1');
ws.send('A_Print_Out|1|1|1|1');
ws.send('A_ClosePrn');
}
// function getStatus() {
// ws.send('A_EnumUSB');
// ws.send('A_CreateUSBPort|1');
// ws.send('A_GetPrinterStatus');
// ws.send('A_ClosePrn');
// }
export default {
sendMessage: sendMessage,
connection: connection
}

View File

@@ -0,0 +1,144 @@
import config from '@/config/index';
export default {
/**
* 使用百度api,把文字转换成语音并播放
* @param {string} str 需要转换成语音的字符串
*/
voiceText(str) {
var url = "http://tsn.baidu.com/text2audio?lan=zh&ie=UTF-8&text=" + encodeURI(str);
var audio = new Audio(url);
audio.src = url;
audio.play();
},
/**
* 获取扫码枪扫码的内容
* @param {Function} cell 回调函数返回扫码结果
*/
sweepCode(cell) {
window.onload = function () {
var code = "";
var lastTime, nextTime;
var lastCode, nextCode;
document.onkeypress = function (e) {
nextCode = e.which;
nextTime = new Date().getTime();
if (lastCode != null && lastTime != null && nextTime - lastTime <= 30) {
code += String.fromCharCode(lastCode);
} else if (lastCode != null && lastTime != null && nextTime - lastTime > 100) {
code = "";
}
lastCode = nextCode;
lastTime = nextTime;
}
this.onkeypress = function (e) {
if (e.which == 13) {
cell(code)
code = "";
}
}
}
},
/**
* 判断是字符且存在
* @param {*} str
*/
isString(str) {
if (Object.prototype.toString.call(str) !== '[object String]' && str.length <= 0) return true;
return false
},
/**
* 获取本地缓存
* @param {string} key 需要获取缓存中的名字
*/
getStorage(key) {
if (this.isString(key)) return;
try {
return JSON.parse(localStorage.getItem(`${config.prefix}${key}`));
} catch (err) {
console.error(err)
}
},
/**
* 存储本地缓存
* @param {string} key 需要缓存的名字
* @param {any} value 需要set的值
*/
setStorage(key, value) {
if (this.isString(key)) return;
try {
localStorage.setItem(key, JSON.stringify(value))
return 'ok'
} catch (err) {
console.error(err)
}
},
/**
* 获取本地缓存
* @param {string} key 需要获取缓存中的名字
*/
getSession(key) {
if (this.isString(key)) return;
console.log(key);
try {
return JSON.parse(sessionStorage.getItem(`${config.prefix}${key}`));
} catch (err) {
console.error(err)
}
},
/**
* 存储本地缓存
* @param {string} key 需要缓存的名字
* @param {any} value 需要set的值
*/
setSession(key, value) {
if (this.isString(key)) return;
try {
localStorage.setItem(key, JSON.stringify(value))
return 'ok'
} catch (err) {
console.error(err)
}
},
/**
* 删除指定key
* @param {string} key
*/
removeItemSession(key) {
if (this.isString(key)) return;
try {
sessionStorage.removeItem(`${config.prefix}${key}`)
return 'ok'
} catch (err) {
console.error(err)
}
},
// 格式化日期如月、日、时、分、秒保证为2位数
formatNumber(n) {
n = n.toString()
return n[1] ? n : '0' + n;
},
/**
* 用法formatTime(1545903266795, 'Y-M-D h:m:s')
* @param {number} number 毫秒时间戳
* @param {string} format 日期格式
*/
formatTime(number, format) {
if (typeof number !== 'number') {
number = parseInt(number)
}
let time = new Date(number)
let newArr = []
let formatArr = ['Y', 'M', 'D', 'h', 'm', 's']
newArr.push(time.getFullYear())
newArr.push(this.formatNumber(time.getMonth() + 1))
newArr.push(this.formatNumber(time.getDate()))
newArr.push(this.formatNumber(time.getHours()))
newArr.push(this.formatNumber(time.getMinutes()))
newArr.push(this.formatNumber(time.getSeconds()))
for (let i in newArr) {
format = format.replace(formatArr[i], newArr[i])
}
return format;
}
}

View File

@@ -0,0 +1 @@
29a202df-9102-4462-a3e3-e18196dbbd26

View File

@@ -0,0 +1,159 @@
<template>
<div class="compensation">
<navbar title="补款管理"></navbar>
<div class="flex1 workload flex-column h100">
<div class="mt10">
<el-card class="box-card">
<div>
<div class="inblock">
<span class="demonstration">
订单号 :
<el-input v-model="from.order_no" placeholder="条形码输入" @keyup.enter.native='queryList'></el-input>
</span>
</div>
<!--门店选择-->
<div class="inblock time">
<el-select v-model="from.shop_id" @change="shopidChage" placeholder="--请选择门店--">
<el-option
v-for="(item,index) in allShop"
:key="index"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
<!--订单选择-->
<div class="inblock time">
<el-select v-model="from.is_online" @change="shopidChage" placeholder="--请选择订单类型--">
<el-option
label="门店"
value="1">
</el-option>
<el-option
label="线上"
value="2">
</el-option>
</el-select>
</div>
<!--订单选择-->
<div class="inblock time">
<el-select v-model="from.status" @change="shopidChage" placeholder="--请选择订单状态--">
<el-option
label="待补款"
value="1">
</el-option>
<el-option
label="已补款"
value="2">
</el-option>
</el-select>
</div>
<!--开始结束时间-->
<div class="inblock time">
开始/结束时间:
<el-date-picker
v-model="time"
@change="DateChange"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
</div>
</el-card>
</div>
<div class="flex1 mt10">
<el-table
:data="tableData"
border
style="width: 100%"
:height="tableHeight"
:row-class-name="tableRowClassName">
<el-table-column prop="startTime" label="订单号" sortable></el-table-column>
<el-table-column prop="endTime" label="添加补款员工" sortable></el-table-column>
<el-table-column prop="factory_member_name" label="补款金额"></el-table-column>
<el-table-column prop="factory_position_id" label="实际补款金额"></el-table-column>
<el-table-column prop="factory_position_id" label="补款原因"></el-table-column>
<el-table-column prop="factory_position_id" label="用户姓名"></el-table-column>
<el-table-column prop="factory_position_id" label="电话"></el-table-column>
<el-table-column prop="factory_position_id" label="添加时间"></el-table-column>
<el-table-column prop="factory_position_id" label="补款时间"></el-table-column>
<el-table-column prop="totalCount" label="所属门店"></el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script>
import header from '@/components/header'
export default {
components: {
navbar: header
},
data() {
return {
tableHeight: window.innerHeight - 200,
allShop: {},
tableData: [],
time: [new Date(), new Date()],
from: {
token: JSON.parse(localStorage.getItem("userInfo")).token,
shop_id: '',
status: '',
is_online: '',
order_no: '',
start_time: '',
end_time: ''
}
}
},
created() {
this.time[0] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D');
this.time[1] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D');
this.getAllShop()
},
methods: {
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
async queryList() {
this.from.start_time = this.time[0];
this.from.end_time = this.time[1];
this.tableData = (await this.$http.extraList(this.from)).data.data.data;
console.log("this.tableData ------: ", this.tableData)
},
shopidChage() {
this.queryList();
},
// 时间被选择的时候发送ajax
DateChange() {
this.queryList();
},
async getAllShop() {
this.allShop = (await this.$http.allShop()).data.data;
console.log(" allShop: ", this.allShop)
}
},
name: "ReworkManagement"
}
</script>
<style scoped lang="less">
.el-input {
width: auto !important;
}
.time {
margin-left: 40px;
}
</style>

View File

@@ -0,0 +1,129 @@
<template>
<div class="rework">
<navbar title="返工管理"></navbar>
<div class="flex1 workload flex-column h100">
<div class="mt10">
<el-card class="box-card">
<div>
<div class="inblock">
<span class="demonstration">
条形码 :
<el-input v-model="from.barCode" placeholder="条形码输入" @keyup.enter.native='queryList'></el-input>
</span>
</div>
<div class="inblock time">
统计日期:
<el-date-picker
v-model="time"
@change="DateChange"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
<div class="inblock time">
<el-radio-group @change="radioChange" v-model="from.return_status">
<el-radio label="2" checked>我发布的</el-radio>
<el-radio label="1">我的返工</el-radio>
</el-radio-group>
</div>
</div>
</el-card>
</div>
<div class="flex1 mt10">
<el-table
:data="tableData"
border
style="width: 100%"
:height="tableHeight"
:row-class-name="tableRowClassName"
>
<el-table-column prop="find_member" label="发现员工" sortable></el-table-column>
<el-table-column prop="return_member" label="返工员工"></el-table-column>
<el-table-column prop="return_position" label="返工岗位"></el-table-column>
<el-table-column prop="remarks" label="返工原因"></el-table-column>
<el-table-column prop="code_num" label="条形码"></el-table-column>
<el-table-column prop="create_time" label="返工时间"></el-table-column>
<el-table-column prop="factory_position_id" label="操作">
<template slot-scope="scope">
<el-button type="text" @click="AcknowledgeReceipt(scope.row)" size="small">确认接收</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script>
import header from '@/components/header'
export default {
components: {
navbar: header
},
data() {
return {
tableHeight: window.innerHeight - 200,
time: [new Date(), new Date()],
tableData: [],
from: {
limit: 10,
barCode: "",
start_time: '',
end_time: '',
return_status: "2",
token: JSON.parse(localStorage.getItem("userInfo")).token
}
}
},
created() {
this.time[0] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D')
this.time[1] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D')
},
methods: {
// 接收返工
async AcknowledgeReceipt(row){
console.log("ROW: ", row)
let list = await this.$http.sureAccept({
token: JSON.parse(localStorage.getItem("userInfo")).token,
id: row.id
});
console.log("list: ", list)
},
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
async queryList() {
this.from.start_time = this.time[0];
this.from.end_time = this.time[1];
this.tableData = (await this.$http.returnList(this.from)).data.data.data;
console.log("this.tableData ------: ", this.tableData)
},
// 时间被选择的时候发送ajax
DateChange() {
this.queryList();
},
// 单选被选择时候发送ajax
radioChange() {
this.queryList();
}
},
name: "ReworkManagement"
}
</script>
<style scoped lang="less">
.el-input {
width: auto !important;
}
.time {
margin-left: 40px;
}
</style>

View File

@@ -0,0 +1,131 @@
<template>
<div class="Statistics">
<navbar title="收衣统计"></navbar>
<!--门店类型营业额统计-->
<div class="flex1 workload flex-column h100">
<!--顶部选项-->
<el-card class="box-card">
<!--门店选择-->
<span>请选择门店</span>
<div class="inblock m-left time">
<el-select v-model="StoreSingleData.shop_id" @change="StoreSingleChange" placeholder="--请选择门店--">
<el-option
v-for="(item,index) in allShop"
:key="index"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</el-card>
<!--数据展示-->
<div class="flex1 mt10">
<el-table
:data="StoreSingleListData.list"
border
style="width: 100%"
:height="tableHeight"
:row-class-name="tableRowClassName">
<el-table-column prop="name" label="门店名称" sortable></el-table-column>
<el-table-column prop="totalCount" label="收衣件数"></el-table-column>
<el-table-column prop="startTime" label="开始时间" sortable></el-table-column>
<el-table-column prop="endTime" label="结束时间"></el-table-column>
</el-table>
</div>
<el-card v-if="isShowPagination" class="box-card1">
<div>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="StoreSingleData.page"
:page-size.sync="StoreSingleData.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="StoreSingleListData.info.count"
background
></el-pagination>
</div>
</el-card>
</div>
</div>
</template>
<script>
import header from '@/components/header'
export default {
components: {
navbar: header
},
data() {
return {
// 保存所有门店数据
allShop: [],
isShowPagination: false,
tableHeight: window.innerHeight - 200,
StoreSingleListData: [],
StoreSingleData: {
shop_id: '',
page: 1,
limit: 10
}
}
},
created() {
this.getAllShop()
this.StoreSingleGetData()
},
methods: {
// 分页大小变化
handleSizeChange(val) {
console.log("分页大小变化: ", val)
this.StoreSingleData.limit = val;
this.StoreSingleChange()
},
// 当前页变化
handleCurrentChange(val) {
console.log("当前页变化: ", val)
this.StoreSingleData.page = val;
this.StoreSingleChange()
},
// 下拉地址选择的时候
StoreSingleChange(item) {
this.StoreSingleGetData()
},
/**
* 请求单个门店营业额 发送请求
* @constructor
*/
async StoreSingleGetData() {
this.StoreSingleListData = await (await this.$http.shopClothCount(this.StoreSingleData)).data.data
if (this.StoreSingleListData.list.length !== 0) {
this.isShowPagination = true
} else {
this.isShowPagination = false
}
},
// 获取所有门店数据
async getAllShop() {
this.allShop = (await this.$http.allShop()).data.data;
},
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
}
}
</script>
<style>
</style>

View File

@@ -0,0 +1,228 @@
<template>
<div class="StoreTurnover">
<navbar title="营业额管理"></navbar>
<!--门店类型营业额统计-->
<div class="flex1 workload flex-column h100">
<!--顶部选项-->
<div class="mt10">
<el-card class="box-card">
<div>
<!--开始时间-->
<div class="inblock time">
开始/结束时间:
<el-date-picker
v-model="StoreTypeTime"
@change="StoreTypeTimeChange"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd">
</el-date-picker>
</div>
</div>
</el-card>
</div>
<!--数据展示-->
<div class="flex1 mt10">
<el-row type="flex" :gutter="30" justify="center">
<el-col :span="7" class="item-l" v-for="(item,index) in StoreTypeListData" :key="index">
<h2>{{item.totalMoney}}</h2>
<p>{{item.name}}</p>
</el-col>
</el-row>
</div>
</div>
<br><br>
<!--单个门店营业额查询-->
<div class="flex1 workload flex-column h100">
<!--顶部选项-->
<div class="mt10">
<el-card class="box-card">
<div>
<!--开始时间-->
<div class="inblock time">
开始/结束时间:
<el-date-picker
v-model="StoreSingleTime"
@change="StoreSingleChange"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd">
</el-date-picker>
</div>
<!--门店选择-->
<div class="inblock m-left time">
<el-select v-model="StoreSingleData.shop_id" @change="StoreSingleChange" placeholder="--请选择门店--">
<el-option
v-for="(item,index) in allShop"
:key="index"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
</el-card>
<el-card v-if="StoreSingleListData.length != 0" class="box-card1">
<div>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page"
:page-sizes="[20, 30, 40, 50]"
:page-size="limit"
layout="total, sizes, prev, pager, next, jumper"
:total="StoreSingleListData.info.count"
background
></el-pagination>
</div>
</el-card>
</div>
<!--数据展示-->
<div class="flex1 mt10">
<el-table
:data="StoreSingleListData.list"
border
style="width: 100%"
:height="tableHeight"
:row-class-name="tableRowClassName">
<el-table-column prop="name" label="门店名称" sortable></el-table-column>
<el-table-column prop="totalMoney" label="营业额" sortable></el-table-column>
<el-table-column prop="startTime" label="开始时间"></el-table-column>
<el-table-column prop="endTime" label="结束时间"></el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script>
import header from '@/components/header'
export default {
components: {
navbar: header
},
data () {
return {
page: 1,
limit: 20,
tableHeight: window.innerHeight - 200,
StoreTypeTime: [new Date(), new Date()], // 门店类型营业额
StoreSingleTime: [new Date(), new Date()], // 单个门店营业额
allShop: {},
StoreSingleListData: [],
// 单个门店营业额的数据
StoreSingleData: {
page: 1,
limit: 20,
shop_id: '',
startTime: '',
endTime: ''
},
// 门店类型营业额统计
StoreTypeListData: [],
StoreTypeData: {
token: JSON.parse(localStorage.getItem("userInfo")).token,
startTime: '',
endTime: ''
}
}
},
created() {
this.StoreTypeTime[0] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D');
this.StoreTypeTime[1] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D');
this.StoreSingleTime[0] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D');
this.StoreSingleTime[1] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D');
this.getAllShop();
},
methods: {
// 分页大小变化
handleSizeChange(val) {
console.log("分页大小变化: ", val)
this.StoreSingleData.limit = val;
this.StoreSingleChange()
},
// 当前页变化
handleCurrentChange(val) {
console.log("当前页变化: ", val)
this.StoreSingleData.page = val;
this.StoreSingleChange()
},
/**
* 请求单个门店营业额 发送请求
* @constructor
*/
async StoreSingleGetData() {
this.StoreSingleListData = await (await this.$http.shopMoney(this.StoreSingleData)).data.data
console.log("this.StoreSingleListData: ", this.StoreSingleListData)
},
// 单个门店营业额 的 门店选择 和 时间选择发生改变的时候
StoreSingleChange() {
this.StoreSingleData.startTime = this.StoreSingleTime[0];
this.StoreSingleData.endTime = this.StoreSingleTime[1];
console.log("this.StoreSingleData: ", this.StoreSingleData)
this.StoreSingleGetData()
},
/**
* 门店类型营业额统计 发送请求
* @returns {Promise<void>}
* @constructor
*/
async StoreTypeGetData() {
this.StoreTypeListData = await (await this.$http.shopTypeMoney(this.StoreTypeData)).data.data
console.log("this.StoreTypeListData: ", this.StoreTypeListData)
},
// 门店类型营业额统计 时间选择发生改变的时候
StoreTypeTimeChange() {
console.log("时间选择发生变化")
this.StoreTypeData.startTime = this.StoreTypeTime[0];
this.StoreTypeData.endTime = this.StoreTypeTime[1];
this.StoreTypeGetData()
},
// 获取所有门店数据
async getAllShop() {
this.allShop = (await this.$http.allShop()).data.data;
},
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
}
}
</script>
<style scoped lang="less">
.m-left {
margin-left: 20px;
}
.item-l {
background: #06b84f;
color: #fff;
margin-bottom: 15px;
padding: 40px 0;
margin-left: 10px;
text-align: center;
}
</style>

View File

@@ -0,0 +1,160 @@
<template>
<div class="checkClothCount">
<navbar title="总检查询"></navbar>
<div class="flex1 workload flex-column h100">
<!--顶部选项-->
<el-card class="box-card">
<div class="inblock">
<!--门店选择-->
<span>请选择门店</span>
<div class="inblock m-left time">
<el-select v-model="StoreSingleData.shop_id" @change="StoreSingleChange" placeholder="--请选择门店--">
<el-option
v-for="(item,index) in allShop"
:key="index"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</div>
</div>
<div class="inblock time">
统计日期:
<el-date-picker
v-model="time"
@change="DateChange"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
</el-card>
<div class="flex1 mt10">
<el-table
:data="StoreSingleListData.list"
border
style="width: 100%"
:height="tableHeight"
:row-class-name="tableRowClassName">
<el-table-column prop="mall_product_name" label="名称" sortable></el-table-column>
<el-table-column prop="shopName" label="门店" sortable></el-table-column>
<el-table-column prop="code_num" label="条形码"></el-table-column>
<el-table-column prop="create_time" label="时间"></el-table-column>
<el-table-column prop="cloth_status" label="状态"></el-table-column>
</el-table>
</div>
<el-card v-if="isShowPagination" class="box-card1">
<div>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="StoreSingleData.page"
:page-size.sync="StoreSingleData.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="StoreSingleListData.info.count"
background
></el-pagination>
</div>
</el-card>
</div>
</div>
</template>
<script>
import header from '@/components/header'
export default {
components: {
navbar: header
},
data() {
return {
time: [new Date(), new Date()],
tableHeight: window.innerHeight - 200,
allShop: [],
StoreSingleListData: [],
isShowPagination: false,
StoreSingleData: {
shop_id: '',
startTime: '',
endTime: '',
page: 1,
limit: 10
}
}
},
created() {
this.time[0] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D');
this.time[1] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D');
this.getAllShop();
},
methods: {
// 分页大小变化
handleSizeChange(val) {
this.StoreSingleData.limit = val;
this.StoreSingleChange()
},
// 当前页变化
handleCurrentChange(val) {
console.log("当前页变化: ", val)
this.StoreSingleData.page = val;
this.StoreSingleChange()
},
// 下拉地址选择的时候
StoreSingleChange() {
console.log("StoreSingleData.shop_id: ", this.StoreSingleData.shop_id)
this.StoreSingleData.startTime = this.time[0]
this.StoreSingleData.endTime = this.time[1]
this.StoreSingleGetData()
},
// 时间选择的时候
DateChange() {
this.StoreSingleData.startTime = this.time[0]
this.StoreSingleData.endTime = this.time[1]
this.StoreSingleGetData()
},
getAllShop() {},
// 获取所有门店数据
async getAllShop() {
this.allShop = (await this.$http.allShop()).data.data;
},
/**
* 请求单个门店工厂总检数据查询
*/
async StoreSingleGetData() {
this.StoreSingleListData = await (await this.$http.checkClothCount(this.StoreSingleData)).data.data
console.log("this.StoreSingleListData: ", this.StoreSingleListData)
if (this.StoreSingleListData.list.length !== 0) {
this.isShowPagination = true
} else {
this.isShowPagination = false
}
},
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
}
},
}
</script>
<style scoped>
.time {
margin-left: 30px;
}
</style>

View File

@@ -0,0 +1,263 @@
<template>
<div class="flex-column h100">
<navbar title="衣物查询"></navbar>
<div class="clothingInquiries flex1 flex-column h100">
<div>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="衣物操作" name="first">
<div class="inblock">
<span>衣物编号或订单 :</span>
<el-input
class="mr10 ml10"
v-model="order"
placeholder="请输入内容"
@keyup.enter.native="queryOrder()"
></el-input>
<el-button type="primary" @click="queryOrder">查询</el-button>
<el-button type="primary">打印</el-button>
</div>
</el-tab-pane>
</el-tabs>
</div>
<div class="mt10">
<el-card class="box-card Exhibition">
<div slot="header" class="clearfix">
<span>订单详情</span>
</div>
<div class="body_content">
<span>
<i>订单编号:</i>
{{orderInfo.shop_order_no}}
</span>
<span>
<i>订单金额:</i>
{{orderInfo.order_total_price}}
</span>
<span>
<i>实收金额:</i>
{{orderInfo.total_price}}
</span>
<br />
<span>
<i>收衣门店:</i>
{{orderInfo.shopName}}
</span>
<span>
<i>店员姓名:</i>
{{orderInfo.name}}
</span>
<span>
<i>联系电话:</i>
{{orderInfo.mobile}}
</span>
<span>
<i>详细地址:</i>
{{orderInfo.user_address}}
</span>
<br />
<span>
<i>客户姓名:</i>
{{orderInfo.username}}
</span>
<span>
<i>联系电话:</i>
{{orderInfo.telnum}}
</span>
<span>
<i>衣服件数:</i>
{{orderInfo.total_count}}
</span>
<span>
<i>收衣时间:</i>
{{orderInfo.create_time}}
</span>
</div>
</el-card>
</div>
<div class="flex1 mt10 flex-column h100">
<div class="flex1">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>衣物信息</span>
</div>
<div>
<el-table
:height="250"
:data="orderInfo.cloth"
border
style="width: 100%"
:row-class-name="tableRowClassName"
@cell-dblclick="tableDbEdit"
>
<el-table-column prop="shop_order_no" label="订单号" sortable></el-table-column>
<el-table-column prop="code_num" label="条形码"></el-table-column>
<el-table-column prop="name" label="衣物名称"></el-table-column>
<el-table-column prop="brand" label="品牌"></el-table-column>
<el-table-column prop="color" label="颜色"></el-table-column>
<el-table-column prop="cloth_wg" label="网格"></el-table-column>
<el-table-column prop="price" label="价格"></el-table-column>
<el-table-column prop="wash_remark" label="洗涤方式、附加服务、附加费"></el-table-column>
<el-table-column prop="remark" label="备注"></el-table-column>
<el-table-column prop="appendix" label="附件"></el-table-column>
<el-table-column prop="cloth_status" label="衣物状态"></el-table-column>
<el-table-column prop="hang_num" label="挂衣点"></el-table-column>
<el-table-column prop="is_return" label="返洗"></el-table-column>
<el-table-column prop="create_time" label="时间" sortable></el-table-column>
</el-table>
</div>
</el-card>
</div>
<div class="flex1 flex mt10">
<div class="flex1">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>资金记录</span>
</div>
<div>
<el-table
:height="250"
:data="orderInfo.moneyInfo"
border
style="width: 100%"
:row-class-name="tableRowClassName"
>
<el-table-column prop="money" label="交易金额" width="180"></el-table-column>
<el-table-column prop="pay_type" label="支付方式" width="180"></el-table-column>
<el-table-column prop="scen" label="交易类型"></el-table-column>
<el-table-column prop="remark" label="备注"></el-table-column>
<el-table-column prop="create_time" label="时间" sortable></el-table-column>
</el-table>
</div>
</el-card>
</div>
<div class="flex1 ml10">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>工厂操作记录</span>
</div>
<div>
<el-table
:height="250"
:data="orderInfo.factoryRecord"
border
style="width: 100%"
:row-class-name="tableRowClassName"
>
<el-table-column prop="code_num" label="条形码" width="180"></el-table-column>
<el-table-column prop="factory_position_id" label="工序" width="180"></el-table-column>
<el-table-column prop="factory_member_name" label="员工"></el-table-column>
<el-table-column prop="create_time" label="操作时间" sortable></el-table-column>
</el-table>
</div>
</el-card>
</div>
</div>
<div class="flex1 flex mt10 mb30">
<div class="flex1">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>门店操作</span>
</div>
<div>
<el-table
:height="250"
:data="orderInfo.shopRecord"
border
style="width: 100%"
:row-class-name="tableRowClassName"
>
<el-table-column prop="code_num" label="条形码" width="180"></el-table-column>
<el-table-column prop="factory_position_id" label="状态" width="180"></el-table-column>
<el-table-column prop="remark" label="备注信息"></el-table-column>
<el-table-column prop="shopName" label="门店"></el-table-column>
<el-table-column prop="create_time" label="时间" sortable></el-table-column>
</el-table>
</div>
</el-card>
</div>
<div class="flex1 ml10">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>误扫码操作记录</span>
</div>
<div>
<el-table
:height="250"
:data="tableData"
border
style="width: 100%"
:row-class-name="tableRowClassName"
>
<el-table-column prop="date" label="条形码" width="180"></el-table-column>
<el-table-column prop="name" label="工序" width="180"></el-table-column>
<el-table-column prop="address" label="员工"></el-table-column>
<el-table-column prop="address" label="门店"></el-table-column>
<el-table-column prop="date" label="操作时间" sortable></el-table-column>
</el-table>
</div>
</el-card>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import header from '@/components/header'
export default {
components: {
navbar: header
},
data() {
return {
activeName: 'first',
order: '',
orderInfo: {
cloth: [],
moneyInfo: [],
factoryRecord: [],
shopRecord: []
},
tableData: []
}
},
methods: {
async tableDbEdit(row) {
if (row['code_num']) {
let res = await this.$http.orderAbout(row['code_num'])
this.orderInfo.factoryRecord = res.data.data.factory_record
this.orderInfo.shopRecord = res.data.data.shop_record
}
},
handleClick(tab, event) {
console.log(tab, event);
},
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
async queryOrder() {
let res = await this.$http.queryOrder(this.order)
this.orderInfo = res.data.data
}
}
}
</script>
<style lang="less" scoped>
.clothingInquiries {
margin: 0 10px;
.el-input {
width: auto;
}
}
.clearfix:before,
.clearfix:after {
display: table;
content: "";
}
.clearfix:after {
clear: both;
}
</style>

View File

@@ -0,0 +1,67 @@
<template>
<div class="flex-column h100">
<navbar title="掉标管理"></navbar>
<div class="dropMark flex1 flex-column h100">
<el-tabs v-model="activeName" @tab-click="handleClick" class="flex1 flex-column h100">
<el-tab-pane label="掉标衣物查看" name="first" class="flex1">
<dropCheck></dropCheck>
</el-tab-pane>
<el-tab-pane label="掉标衣物匹配" name="second">
<dropMatching></dropMatching>
</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script>
import header from '@/components/header';
import dropCheck from '@/components/dropCheck';
import dropMatching from '@/components/dropMatching';
export default {
components: {
navbar: header,
dropCheck: dropCheck,
dropMatching: dropMatching
},
data() {
return {
activeName: 'first'
}
},
methods: {
handleSizeChange(val) {
console.log(`每页 ${val}`);
},
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
},
handleClick(tab, event) {
console.log(tab, event);
},
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
},
}
</script>
<style lang="less" scoped>
@import "../assets/less/view/dropMark.less";
</style>
<style lang="less">
.dropMark {
.el-card__body {
overflow-y: scroll;
}
.el-tabs__content {
flex: 1;
display: flex;
.el-tab-pane {
flex: 1;
display: flex;
}
}
}
</style>

View File

@@ -0,0 +1,469 @@
<template>
<div class="flex-column h100">
<navbar :title="title"></navbar>
<div class="enterFactory flex1 flex-column">
<el-card class="box-card mt10">
<div class="inblock">
<span class="demonstration">条形码 :</span>
<el-input v-model="barCode" placeholder="条形码输入" @keyup.enter.native="_query" :autofocus="true"></el-input>
<span class="ml10">
<el-button type="primary" @click="_query()">查询</el-button>
</span>
<span class="ml10">
<el-button type="primary" @click="print">打印</el-button>
</span>
<span class="ml10">
<el-button type="primary" @click="openRework">返工</el-button>
</span>
<span class="ml10">
<el-button type="primary" @click="openSupplement">补款</el-button>
</span>
</div>
</el-card>
<el-card class="box-card mt10">
<div class="news">{{laundryData.msg}}</div>
</el-card>
<el-card class="box-card mt10 flex1">
<div>
<div class="orderInfo left">
<div class="text">
<div class="name">条形码 :</div>
<div class="words flex1">{{laundryData.data.code_num}}</div>
</div>
<div class="text">
<div class="name">订单号 :</div>
<div class="words flex1">{{laundryData.data.shop_order_no}}</div>
</div>
<div class="text">
<div class="name">洗衣方式 :</div>
<div class="words flex1">{{laundryData.data.wash_remark}}</div>
</div>
<div class="text">
<div class="name">附件 :</div>
<div class="words flex1">{{laundryData.data.appendix}}</div>
</div>
<div class="text">
<div class="name">备注 :</div>
<div class="words flex1">{{laundryData.data.remark}}</div>
</div>
</div>
<div class="orderInfo left">
<div class="text">
<div class="name">衣物名称 :</div>
<div class="words flex1">{{laundryData.data.name}}</div>
</div>
<div class="text">
<div class="name">门店 :</div>
<div class="words flex1">{{laundryData.data.shopName}}</div>
</div>
<div class="text">
<div class="name">单价 :</div>
<div class="words flex1">{{laundryData.data.price}}</div>
</div>
<div class="text">
<div class="name">时间 :</div>
<div class="words flex1">{{laundryData.data.create_time}}</div>
</div>
</div>
<div class="orderInfo left">
<div class="text">
<div class="name">品牌 :</div>
<div class="words flex1">{{laundryData.data.brand}}</div>
</div>
<div class="text">
<div class="name">颜色 :</div>
<div class="words flex1">{{laundryData.data.color}}</div>
</div>
<div class="text">
<div class="name">网格 :</div>
<div class="words flex1">{{laundryData.data.cloth_wg}}</div>
</div>
<div class="text">
<div class="name">返洗 :</div>
<div class="words flex1">{{laundryData.data.is_return}}</div>
</div>
<div class="text">
<div class="name">状态 :</div>
<div class="words flex1">{{laundryData.data.cloth_status}}</div>
</div>
</div>
<div class="clear"></div>
</div>
</el-card>
<el-card class="box-card mt10">
<div class="userDay">
<span>工号:{{operationRecord.job_number}}</span>
<span>姓名:{{operationRecord.userName}}</span>
<span>今日计件:{{operationRecord.countWork}}</span>
</div>
</el-card>
</div>
<!--返工管理-->
<el-dialog title="返工管理" width="30%" :visible.sync="isOpenRework">
<el-form :model="ReworkList">
<el-form-item label="返工员工" label-width="120px">
<el-select v-model="ReworkList.return_member_id"
@change="SelectPeople"
style="width: 100%;"
placeholder="--请选择返工员工--">
<el-option v-for="(item,index) in allPeopleList"
:key="index"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="返工岗位" label-width="120px">
<el-select v-model="ReworkList.return_position_id" style="width: 100%;" placeholder="--请选择返工岗位--">
<el-option v-for="(item,index) in allPositionList"
:key="index"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="返工原因" label-width="120px">
<el-select v-model="ReworkList.title" style="width: 100%;" placeholder="--请选择返工原因--">
<el-option v-for="(item,index) in allreturnWhy"
:key="index"
:label="item.title"
:value="item.title">
</el-option>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="isOpenRework = false"> </el-button>
<el-button type="primary" @click="submitOpenRework"> </el-button>
</div>
</el-dialog>
<el-dialog title="补款" width="30%" :visible.sync="isOpenSupplement">
<el-form :model="SupplementList">
<el-form-item label="补款金额" label-width="120px">
<el-input placeholder="请输入补款金额" v-model="SupplementList.extra_money"></el-input>
</el-form-item>
<el-form-item label="补款原因" label-width="120px">
<el-input placeholder="补款原因" type="textarea" v-model="SupplementList.extra_reason"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="isOpenSupplement = false"> </el-button>
<el-button type="primary" @click="submitSupplement"> </el-button>
</div>
</el-dialog>
<el-dialog
title="提示"
:visible.sync="dialogVisible"
width="60%">
<el-table
:data="repeatList"
stripe
style="width: 100%">
<el-table-column
prop="username"
label="姓名"
width="180">
</el-table-column>
<el-table-column
prop="telnum"
label="手机"
width="180">
</el-table-column>
<el-table-column
prop="code_num"
label="条码"
width="180">
</el-table-column>
<el-table-column
prop="mall_product_name"
label="名称"
width="180">
</el-table-column>
<el-table-column
label="操作">
<template slot-scope="scope">
<el-button type="danger" @click="repeatListHandleClick(scope.row)" size="small">选择</el-button>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script>
import header from "@/components/header";
export default {
components: {
navbar: header
},
data() {
return {
dialogVisible: false, // 是否显示 数据重复的时候的弹窗列表
repeatList: [], // 重复的衣物数据
title: "发生未知错误",
barCode: null,
isCheck: 0,
status: null,
laundryData: {
msg: "系统准备完毕,请输入条形码!",
data: {}
},
allPositionList: {},
allPeopleList: {},
allreturnWhy: {},
// 表单数据
ReworkList: {
return_member_id: '', // 返工员工
return_member: '', // 返工员工姓名
return_position_id: '', // 返工岗位id
title: '', // 返工原因
code_num: '', // 条形码
token: '' // token
},
SupplementList: {
token: '', // token
extra_reason: '', // 补款原因
extra_money: '', // 补款金额
order_id: '', // 订单 id
},
// 返工管理变量弹窗
isOpenRework: false,
// 补款变量的弹窗
isOpenSupplement: false,
isGetOrder: false,
operationRecord: {}
};
},
created() {
if (this.$route.query["title"]) {
this.title = this.$route.query["title"];
}
if (this.$route.query["status"]) {
this.status = this.$route.query["status"];
this.countPosition();
}
this.$printing.connection();
},
methods: {
// 提交补款被点击
async submitSupplement() {
if (!this.isGetOrder) {
this.$notify.error({
title: '提示',
message: '请先输入条形码进行查询!'
});
} else {
this.SupplementList.token = JSON.parse(localStorage.getItem("userInfo")).token;
this.SupplementList.order_id = this.laundryData.data.order_id;
let SupplementData = await this.$http.addExtra(this.SupplementList);
if(SupplementData.data.status == 1) {
this.$notify({
title: '提示',
type: 'success',
message: SupplementData.data.msg,
});
this.isOpenSupplement = false;
} else {
this.$notify.error({
title: '提示',
message: '添加失败...'
});
}
}
},
// 打开补款弹窗
async openSupplement() {
this.isOpenSupplement = true;
},
// 打开返工弹窗
async openRework() {
this.allPositionList = (await this.$http.allPosition()).data.data;
this.allPeopleList = (await this.$http.allPeople()).data.data;
this.allreturnWhy = (await this.$http.returnWhy()).data.data;
this.isOpenRework = true;
},
// 提交返工信息
async submitOpenRework() {
if (this.barCode == null || this.barCode.length == 0) {
this.$notify.error({
title: '提示',
message: '条形码未输入'
});
} else {
// 保存条形码
this.ReworkList.code_num = this.barCode;
this.ReworkList.token = JSON.parse(localStorage.getItem("userInfo")).token;
// console.log("提交的信息:", this.ReworkList)
let resData = await this.$http.insertReturn(this.ReworkList);
// console.log("添加成功:", resData);
if(resData.data.status == 1) {
this.$notify({
title: '提示',
type: 'success',
message: resData.data.msg,
});
this.isOpenRework = false;
} else {
this.$notify.error({
title: '提示',
message: '添加失败...'
});
}
}
},
// 获取选中的用户名字
SelectPeople(item) {
let chooseItem = this.allPeopleList.filter(val=> val.id == item);
this.ReworkList.return_member = chooseItem[0].name;
},
print() {
if (this.status == 5) {
this.$printing.sendMessage(this.laundryData.data);
}
},
// 弹窗列表重复数据被点击选择按钮后
async repeatListHandleClick(row) {
let res = await this.$http.changeClothProcess({
status: parseInt(this.status),
order_id: row.mall_order_id,
barCode: this.barCode,
isCheck: parseInt(this.isCheck)
});
this.dialogVisible = false
this.checkShopCode(res.data)
},
// 查询
async _query() {
let data = {
status: parseInt(this.status),
barCode: this.barCode,
isCheck: parseInt(this.isCheck)
};
this.isGetOrder = true;
let res = await this.$http.changeClothProcess(data);
let rel = res.data;
this.checkShopCode(rel)
},
checkShopCode(rel) {
// 如果状态等于2表示数据出现重复了这边需要显示一个弹窗展示一个列表
// 让用户去选择,用户选择后 重新调用 changeClothProcess 接口,传入
// 用户选中的 item的 order_id 034000572
if (rel.status == 2) {
this.repeatList = rel.data;
this.dialogVisible = true;
console.log("显示弹窗")
} else {
// 判断是否已经处理过该物件
if (rel.data.isProcess == 2) {
this.$utils.voiceText("该条码已处理");
this.laundryData = rel;
this.barCode = null;
return;
}
// 附件弹窗
if (rel.data.checkStatus == 0) {
this.isCheck = 0
this.$utils.voiceText("该条码有附件");
this.open(rel.msg);
return;
}
this.isCheck = 0;
this.laundryData = rel;
this.barCode = null;
this.countPosition();
this.$utils.voiceText(rel.data.name);
if (this.status == 5) {
this.$printing.sendMessage(rel.data);
}
}
},
open(msg) {
this.$confirm(msg, "提示", {
confirmButtonText: "完整",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.isCheck = 1;
this._query();
})
.catch(() => {});
},
// 今日操作记录
async countPosition() {
let res = await this.$http.countPosition(this.status);
this.operationRecord = res.data.data;
}
}
};
</script>
<style lang="less" scoped>
.enterFactory {
padding: 0 10px 30px 10px;
.demonstration {
margin-left: 5px;
margin-right: 10px;
font-size: 24px;
font-weight: 700;
color: #303133;
}
.el-input {
width: auto;
}
.news {
text-align: center;
font-size: 20px;
color: #f56c6c;
letter-spacing: 4px;
}
.orderInfo {
min-width: 300px;
color: #04b84f;
font-size: 20px;
.text {
max-width: 500px;
margin-bottom: 20px;
margin-right: 20px;
display: flex;
.name {
width: 100px;
text-align: right;
margin-right: 10px;
}
}
}
.userDay {
font-size: 20px;
color: #303133;
text-align: center;
span {
margin: 0 20px;
}
}
}
</style>

View File

@@ -0,0 +1,179 @@
<template>
<div class="flex-column h100">
<navbar title="出厂查询"></navbar>
<div class="exitFactory flex1 flex-column">
<div class="query">
<div class="inblock">
<span class="demonstration">出厂时间 :</span>
<el-date-picker
v-model="time"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
<div class="inblock">
<span class="demonstration">出厂门店 :</span>
<el-select v-model="store" placeholder="请选择">
<el-option
v-for="item in options1"
:key="item.name"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</div>
<div class="inblock">
<span class="demonstration">驾驶员 :</span>
<el-select v-model="driver" placeholder="请选择">
<el-option
v-for="item in options2"
:key="item.name"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</div>
<div class="inblock">
<span class="demonstration">出厂单号 :</span>
<el-input v-model="oddNumbers" placeholder="请输入内容"></el-input>
</div>
<div class="but inblock">
<el-button type="primary" @click="_query">查询</el-button>
<el-button type="primary">重新打印</el-button>
</div>
</div>
<div class="flex">
<div class="table-left">
<el-table
border
:data="factoryData"
:height="tableHeight"
style="width: 100%"
@cell-dblclick="tableDbEdit"
:row-class-name="tableRowClassName"
>
<el-table-column prop="create_time" label="出厂时间" width="150"></el-table-column>
<el-table-column prop="exit_factory_no" label="出场单号" width="150"></el-table-column>
<el-table-column prop="name" label="门店名称"></el-table-column>
<el-table-column prop="factory_member_name" label="驾驶员"></el-table-column>
</el-table>
</div>
<div class="table-right flex1">
<el-table
border
:data="tableData"
:height="tableHeight"
style="width: 100%"
:row-class-name="tableRowClassName"
>
<el-table-column prop="order_no" label="订单号"></el-table-column>
<el-table-column prop="code_num" label="条形码"></el-table-column>
<el-table-column prop="name" label="衣物名称"></el-table-column>
<el-table-column prop="create_time" label="时间"></el-table-column>
</el-table>
</div>
</div>
</div>
</div>
</template>
<script>
import header from '@/components/header'
export default {
components: {
navbar: header
},
data() {
return {
tableHeight: window.innerHeight - 100,
time: [new Date(), new Date()],
oddNumbers: '',
store: '',
driver: '',
options1: [],
options2: [],
factoryData: [],
tableData: []
}
},
created() {
this.time[0] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D')
this.time[1] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D')
Promise.all([this._query(), this.allShop()]).then(() => {
if (this.factoryData.length > 0) this.getOutByNo(this.factoryData[0].exit_factory_no);
})
},
methods: {
tableDbEdit(row) {
if (row['exit_factory_no']) this.getOutByNo(row.exit_factory_no);
},
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
// 按钮查询
async _query() {
let data = {
startTime: this.time[0],
endTime: this.time[1],
shop_id: this.store,
userID: this.driver,
exit_factory_no: this.oddNumbers
}
let res = await this.$http.findOut(data)
this.factoryData = res.data.data;
},
async getOutByNo(id) {
if (id == null) return;
let res = await this.$http.getOutByNo(id)
this.tableData = res.data.data
},
async allShop() {
let res = await this.$http.allShop()
let res1 = await this.$http.allDriver()
let data = {
id: '',
name: '请选择'
}
this.options2 = [data, ...res1.data.data]
this.options1 = [data, ...res.data.data]
}
}
}
</script>
<style lang="less" scoped>
.exitFactory {
width: 100%;
height: 100%;
padding: 0 10px;
margin-bottom: 30px;
box-sizing: border-box;
overflow: hidden;
.query {
padding: 20px 0px;
box-sizing: border-box;
.but {
margin-left: 20px;
}
}
.demonstration {
margin-left: 5px;
margin-right: 10px;
}
.table-left {
width: 30%;
margin-right: 30px;
overflow-y: scroll;
}
.table-right {
overflow-y: scroll;
}
.el-input {
width: auto;
}
}
</style>

View File

@@ -0,0 +1,195 @@
<template>
<div class="flex-column h100">
<navbar :title="title"></navbar>
<div class="enterFactory flex1 flex-column">
<el-card class="box-card mt10">
<div class="inblock">
<span class="demonstration">条形码 :</span>
<el-input v-model="barCode" placeholder="条形码输入" @keyup.enter.native='outFactory'></el-input>
<span class="ml10">
<el-button type="primary" @click="outFactory">查询</el-button>
</span>
<span class="ml10">
<el-button type="primary" @click="outSys">出厂</el-button>
</span>
<span class="ml10">
<el-button type="primary" @click="delTableData()">取消物件</el-button>
</span>
</div>
</el-card>
<el-card class="box-card mt10">
<div class="news">{{codeText}}</div>
</el-card>
<el-card class="box-card mt10 flex1">
<el-table
ref="multipleTable"
:data="tableData"
tooltip-effect="dark"
style="width: 100%"
:height="tableHeight"
@selection-change="handleSelectionChange"
:row-class-name="tableRowClassName"
@row-click="rowClick"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column label="订单号">
<template slot-scope="scope">{{ scope.row.order_no }}</template>
</el-table-column>
<el-table-column prop="code_num" label="条形码"></el-table-column>
<el-table-column prop="name" label="衣物名称"></el-table-column>
<el-table-column prop="shopName" label="所属门店"></el-table-column>
<el-table-column prop="create_time" label="时间"></el-table-column>
</el-table>
</el-card>
<el-card class="box-card mt10">
<div class="userDay">
<span>工号:{{operationRecord.job_number}}</span>
<span>姓名:{{operationRecord.userName}}</span>
<span>今日计件:{{operationRecord.countWork}}</span>
</div>
</el-card>
</div>
</div>
</template>
<script>
import header from '@/components/header';
export default {
components: {
navbar: header
},
data() {
return {
tableHeight: window.innerHeight - 400,
title: '发生未知错误',
barCode: '',
status: null,
codeText: '系统准备完毕,请输入条形码!',
operationRecord: {},
tableData: [],
multipleSelection: []
}
},
created() {
if (this.$route.query['title']) {
this.title = this.$route.query['title']
}
if (this.$route.query['status']) {
this.status = this.$route.query['status']
this.countPosition()
}
},
methods: {
// 行的选中函数
toggleSelection(rows) {
if (rows) {
rows.forEach(row => {
this.$refs.multipleTable.toggleRowSelection(row);
});
} else {
this.$refs.multipleTable.clearSelection();
}
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
// 把当前行的下表插入row
tableRowClassName({ row, rowIndex }) {
row.index = rowIndex
},
// 点击行选中
rowClick(row) {
if (row !== null) {
this.toggleSelection([this.tableData[row.index]])
}
},
// 删除
delTableData() {
let newArr = [];
this.tableData.map((v, i) => {
let arr = this.multipleSelection.filter((n) => {
return n.order_no == v.order_no
})
if (arr.length <= 0) {
newArr.push(v)
}
})
this.tableData = [...newArr]
},
// 出厂衣物扫描
async outFactory() {
let data = {
barCode: this.barCode,
status: parseInt(this.status)
};
let res = await this.$http.outFactory(data)
if (res.data.data['0']) this.tableData.push(res.data.data['0']);
this.codeText = res.data.msg
if(res.data.data.isProcess == 2){
this.$utils.voiceText('该物件已出厂');
this.barCode = ''
return
}
this.countPosition()
if(res.data.status == 1){
this.$utils.voiceText(res.data.data[0].name);
}
this.barCode = ''
},
// 今日操作记录
async countPosition() {
let res = await this.$http.countPosition(this.status)
this.operationRecord = res.data.data
},
// 出厂
async outSys() {
let res = await this.$http.outSys()
this.codeText = res.data.msg
}
}
}
</script>
<style lang="less" scoped>
.enterFactory {
padding: 0 10px 30px 10px;
.demonstration {
margin-left: 5px;
margin-right: 10px;
font-size: 24px;
font-weight: 700;
color: #303133;
}
.el-input {
width: auto;
}
.news {
text-align: center;
font-size: 20px;
color: #f56c6c;
letter-spacing: 4px;
}
.orderInfo {
min-width: 300px;
color: #04b84f;
font-size: 20px;
.text {
max-width: 500px;
margin-bottom: 20px;
margin-right: 20px;
display: flex;
.name {
width: 100px;
text-align: right;
margin-right: 10px;
}
}
}
.userDay {
font-size: 20px;
color: #303133;
text-align: center;
span {
margin: 0 20px;
}
}
}
</style>

View File

@@ -0,0 +1,217 @@
<template>
<div class="index">
<div class="header dis-flex2">
<el-row :gutter="20">
<el-col :span="4">
<div class="logo dis-flex2">
<img src="@/assets/img/logo.png" alt srcset />
</div>
</el-col>
<!-- 菜单开始 -->
<el-col :span="10">
<ul class="ul dis-flex2">
<li
v-for="(item,index) in menu"
:key="index"
class="li left pointer"
@click="hamburger(index)"
>
<div class="hamburger margin">
<img class="img" :src="item.imgUrl" alt srcset />
</div>
<p class="tc">{{item.title}}</p>
</li>
</ul>
</el-col>
<!-- 菜单结束 -->
<el-col :span="5">
<div class="grid-content bg-purple"></div>
</el-col>
</el-row>
</div>
<div class="mian flex1 dis-flex1">
<div>
<ul class>
<li class="left" v-for="(item,index) in ImgArr" :key="index" @click="openFunWin(index)">
<img class="img" :src="item" alt srcset />
</li>
</ul>
</div>
</div>
<div class="bootom">
<el-row>
<el-col :span="12">
<div class="tl secondary">登录用户: {{userInfo['job_number']}} {{userInfo['name']}}</div>
</el-col>
<el-col :span="12">
<div class="tr secondary">当前时间: {{time}}</div>
</el-col>
</el-row>
</div>
<div class="close pointer">
<div class="flex closeCen" @click="close()">
<div>
<img src="../assets/img/icon/close.png" alt srcset />
</div>
<div class="closeCen-p">退出系统</div>
</div>
<div class="flex closeCen" @click="dialogVisible = true">
<div class="closeCen-p">切换账号</div>
</div>
</div>
<!-- 弹出层开始 -->
<selectionMenu :isShow="isShow" :dataList="dataList"></selectionMenu>
<!-- 弹出层结束 -->
<!-- 切换账号开始 -->
<el-dialog title="提示" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
<login></login>
</el-dialog>
<!-- 切换账号结束 -->
<!-- <el-dialog title="其他管理" :visible.sync="otherSetting">-->
<!-- <el-row class="other" :gutter="24">-->
<!-- <el-col class="other-item fg" :span="12">返工管理</el-col>-->
<!-- <el-col class="other-item bk" :span="12">补款管理</el-col>-->
<!-- </el-row>-->
<!-- </el-dialog>-->
</div>
</template>
<script>
import selectionMenu from "@/components/selectionMenu";
import login from "@/components/login";
import { mapGetters } from "vuex";
export default {
components: {
selectionMenu: selectionMenu,
login: login
},
data() {
return {
isShow: false, //弹出层
dialogVisible: false, //切换账号弹窗
dataList: [],
time: "",
otherSetting: false,
ImgArr: [
require("../assets/img/Enter-factory.png"),
require("../assets/img/Handle.png"),
require("../assets/img/Factory.png")
],
menu: [
{
imgUrl: require("../assets/img/icon/1.png"),
title: "打开菜单"
},
{
imgUrl: require("../assets/img/icon/2.png"),
title: "衣物查询"
},
{
imgUrl: require("../assets/img/icon/3.png"),
title: "衣物预警"
},
{
imgUrl: require("../assets/img/icon/4.png"),
title: "业绩查询"
},
{
imgUrl: require("../assets/img/icon/5.png"),
title: "掉标管理"
},
{
imgUrl: require("../assets/img/icon/6.png"),
title: "其他管理"
}
]
};
},
created() {
setInterval(() => {
this.time = new Date().toLocaleString();
}, 1000);
},
computed: {
...mapGetters(["userInfo"])
},
methods: {
close() {
this.$confirm("即将退出程序, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
nw.App.quit();
});
},
// 点击菜单
hamburger(index) {
switch (index) {
case 0:
this.dataList = [{ title: "出厂查询", url: "exitFactory" }];
this.isShow = !this.isShow;
break;
case 1:
this.$nw.openWin("/clothingInquiries");
break;
case 2:
this.$nw.openWin("/productionEarlyWarning");
break;
case 3:
this.$nw.openWin("/workload");
break;
case 4:
this.$nw.openWin("/dropMark");
break;
case 5:
this.dataList = [
{ title: "返工管理", url: "rework" },
{ title: "补款管理", url: "compensation" },
{ title: "营业额管理", url: "StoreTurnover" },
{ title: "收衣统计", url: "Statistics" },
{ title: "总检查询", url: "checkClothCount" }
];
this.isShow = !this.isShow;
break;
default:
break;
}
},
async openFunWin(code) {
let res = await this.$http.operate(code + 1);
switch (code) {
case 0:
res.map((v, i) => {
res[i].url = "enterFactory";
});
this.dataList = res;
break;
case 1:
res.map((v, i) => {
res[i].url = "enterFactory";
});
this.dataList = res;
break;
case 2:
res.map((v, i) => {
res[i].url = "factory";
});
this.dataList = res;
break;
default:
break;
}
this.isShow = !this.isShow;
},
// 切换账号关闭
handleClose(done) {
done();
}
}
};
</script>
<style lang="less">
@import "../assets/less/view/index.less";
</style>

View File

@@ -0,0 +1,119 @@
<template>
<div class="login">
<div class="ion">
<!-- <vue-particles
color="#7b7d7d"
:particleOpacity="0.7"
:particlesNumber="60"
shapeType="circle"
:particleSize="4"
linesColor="#203c77"
:linesWidth="1"
:lineLinked="true"
:lineOpacity="0.4"
:linesDistance="100"
:moveSpeed="2"
:hoverEffect="true"
hoverMode="grab"
:clickEffect="true"
clickMode="push"
class="lizi"
></vue-particles>-->
</div>
<div class="form dis-flex1">
<el-form
:model="ruleForm"
status-icon
:rules="rules"
ref="ruleForm"
label-width="100px"
class="demo-ruleForm margin"
size="medium"
>
<el-form-item label="账号" prop="user">
<el-input v-model="ruleForm.user" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="密码" prop="pass">
<el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')" :loading="loading">登录</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入账号'));
} else {
callback();
}
};
var validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
} else {
callback();
}
};
return {
loading: false,//按钮加载状态
ruleForm: {
user: '',
pass: ''
},
rules: {
user: [
{ validator: validatePass, trigger: 'blur' }
],
pass: [
{ validator: validatePass2, trigger: 'blur' }
]
}
};
},
created() {
if (localStorage.getItem('login') !== '' || localStorage.getItem('login') !== null) {
let login = JSON.parse(localStorage.getItem('login')) || {}
this.ruleForm = {
user: login['user'],
pass: login['pass']
}
}
},
methods: {
submitForm(formName) {
this.$refs[formName].validate(async (valid) => {
if (valid) {
this.loading = true
let res = await this.$http.login(this.ruleForm.user, this.ruleForm.pass)
this.loading = false
if (res.data.status == 1) {
await localStorage.setItem('login', JSON.stringify({ user: this.ruleForm.user, pass: this.ruleForm.pass }))
this.$nw.big();
this.$router.push('/index')
} else {
this.$message({
message: res.data.msg,
type: 'warning'
});
}
} else {
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
}
}
}
</script>
<style lang="less">
@import "../assets/less/view/login.less";
</style>

View File

@@ -0,0 +1,238 @@
<template>
<div class="flex-column h100">
<navbar title="衣物预警"></navbar>
<div class="subject flex1 flex-column h100 w100">
<div class="flex">
<div class="mt10">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>超出时间</span>
</div>
<div>
<div class="radio-time">
<el-radio v-model="timeRadio" label="0">所有</el-radio>
</div>
<el-radio v-model="timeRadio" label="1">1天</el-radio>
<el-radio v-model="timeRadio" label="2">2天</el-radio>
<el-radio v-model="timeRadio" label="3">3天</el-radio>
<el-radio v-model="timeRadio" label="7">1周</el-radio>
<el-radio v-model="timeRadio" label="14">2周</el-radio>
<el-radio v-model="timeRadio" label="30">1个月</el-radio>
</div>
</el-card>
</div>
<div class="mt10 ml10">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>衣物状态</span>
</div>
<div>
<div class="radio-time">
<el-radio v-model="stateRadio" label="1">未完成</el-radio>
</div>
<el-radio v-model="stateRadio" label="2">收衣未入厂</el-radio>
<el-radio v-model="stateRadio" label="3">已入厂未出厂</el-radio>
<el-radio v-model="stateRadio" label="4">出厂未到店</el-radio>
<el-radio v-model="stateRadio" label="5">返店未取衣</el-radio>
</div>
</el-card>
</div>
<div class="mt10 ml10">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>其他筛选</span>
</div>
<div>
<div class="radio-time">
<el-checkbox v-model="checked">是否加快</el-checkbox>
</div>
<div class="mt10">
选择门店:
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.name"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</el-card>
</div>
</div>
<div class="flex-column flex1 mt10">
<div>
<el-card class="box-card1">
<div>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page"
:page-sizes="[20, 30, 40, 50]"
:page-size="limit"
layout="total, sizes, prev, pager, next, jumper"
:total="tableData.info.count"
background
></el-pagination>
</div>
</el-card>
</div>
<div class="flex1 mt10">
<el-table
:data="tableData.list"
border
:height="tableHeight"
style="width: 100%"
:row-class-name="tableRowClassName"
@row-dblclick="dblclick"
>
<el-table-column prop="create_time" label="下单时间" width="180"></el-table-column>
<el-table-column prop="shop_order_no" label="订单号" width="180"></el-table-column>
<el-table-column prop="shopName" label="所属门店"></el-table-column>
<el-table-column prop="code_num" label="条形码"></el-table-column>
<el-table-column prop="name" label="衣物名称"></el-table-column>
<el-table-column prop="cloth_status" label="状态"></el-table-column>
<el-table-column prop="remark" label="备注"></el-table-column>
<el-table-column prop="wash_remark" label="洗衣方式、附加服务、附加费"></el-table-column>
<el-table-column prop="total_price" label="价格"></el-table-column>
</el-table>
</div>
</div>
</div>
<!-- 弹出层 -->
<el-dialog
title="详情跟踪"
:visible.sync="dialogVisible"
width="40%"
:before-close="handleClose"
:row-class-name="tableRowClassName"
>
<div class="border">
<el-table :data="tableData.list" height="250" border style="width: 100%">
<el-table-column prop="date" label="订单号" width="120"></el-table-column>
<el-table-column prop="name" label="条形码"></el-table-column>
<el-table-column prop="name" label="状态"></el-table-column>
<el-table-column prop="name" label="门店"></el-table-column>
<el-table-column prop="name" label="收衣店员"></el-table-column>
<el-table-column prop="name" label="工厂洗衣师" width="120"></el-table-column>
<el-table-column prop="address" label="备注" width="180"></el-table-column>
<el-table-column prop="date" label="操作时间" width="120"></el-table-column>
</el-table>
</div>
</el-dialog>
</div>
</template>
<script>
import header from '@/components/header'
export default {
components: {
navbar: header
},
data() {
return {
tableHeight: window.innerHeight - 400,
timeRadio: '0',
stateRadio: '1',
checked: false,
options: [],
value: '',
tableData: {
info: {},
list: []
},
dialogVisible: false,
page: 1,
limit: 20
}
},
created() {
this.warn()
this.$http.allShop()
.then(res => {
this.options = [{ id: null, name: "请选择" }, ...res.data.data]
})
},
methods: {
// 分页大小变化
handleSizeChange(val) {
this.limit = val
this.warn()
},
// 当前页变化
handleCurrentChange(val) {
this.page = val
this.warn()
},
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
// 关闭弹出框
handleClose(done) {
done();
},
//
dblclick(row) {
console.log(row);
this.dialogVisible = true
},
// 获取衣物预警数据
async warn() {
let data = {
dayCount: parseInt(this.timeRadio),
status: parseInt(this.stateRadio),
shop_id: parseInt(this.value),
is_urgent: this.checked ? 1 : 0,
page: this.page,
limit: this.limit
}
let res = await this.$http.warn(data)
this.tableData = res.data.data
}
},
watch: {
timeRadio() {
this.warn()
},
stateRadio() {
this.warn()
},
value() {
this.warn()
},
checked() {
this.warn()
}
}
}
</script>
<style lang="less" scoped>
.subject {
padding: 0 10px 30px 10px;
box-sizing: border-box;
.radio-time {
width: 60px;
}
}
.box-card {
width: 320px;
height: 180px;
}
.box-card1 {
width: 100%;
}
</style>
<style lang="less">
// .subject {
// .el-table {
// height: 100% !important;
// .el-table__body-wrapper {
// height: 100% !important;
// }
// }
// }
</style>

View File

@@ -0,0 +1,142 @@
<template>
<div class="flex-column h100">
<navbar title="工厂工作量统计"></navbar>
<div class="flex1 workload flex-column h100">
<div class="mt10">
<el-card class="box-card">
<div>
<div class="inblock">
统计日期:
<el-date-picker
v-model="time"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
<div class="inblock ml10">
统计岗位:
<el-select v-model="value1" placeholder="请选择">
<el-option
v-for="item in options1"
:key="item.id"
:label="item.name"
:value="item.name"
></el-option>
</el-select>
</div>
<div class="inblock ml10">
操作伙伴:
<el-select v-model="value2" placeholder="请选择">
<el-option
v-for="item in options2"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</el-card>
</div>
<div class="flex1 mt10">
<el-table
:data="tableData"
border
style="width: 100%"
:height="tableHeight"
:row-class-name="tableRowClassName"
>
<el-table-column prop="startTime" label="开始时间" sortable></el-table-column>
<el-table-column prop="endTime" label="结束时间" sortable></el-table-column>
<el-table-column prop="factory_member_name" label="伙伴"></el-table-column>
<el-table-column prop="factory_position_id" label="岗位"></el-table-column>
<el-table-column prop="totalCount" label="工作计件"></el-table-column>
<el-table-column prop="return_percent" label="返工率"></el-table-column>
<el-table-column prop="position_money" label="营业额度"></el-table-column>
</el-table>
</div>
<div class="bottom mt10">
<span
v-for="(item,index) in allCount"
:key="index"
>{{item.position_name}}: {{item.allCount}}</span>
</div>
</div>
</div>
</template>
<script>
import header from '@/components/header'
export default {
components: {
navbar: header
},
data() {
return {
tableHeight: window.innerHeight - 200,
time: [new Date(), new Date()],
options1: [],
options2: [],
value1: '',
value2: '',
tableData: [],
allCount: []
}
},
created() {
this.time[0] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D')
this.time[1] = this.$utils.formatTime(new Date().getTime(), 'Y-M-D')
Promise.all([this.qSelect(), this.workCount()])
},
methods: {
tableRowClassName({ rowIndex }) {
if (rowIndex % 2 == 0) {
return 'warning-row';
}
return '';
},
async workCount() {
let data = {
startTime: this.time[0],
endTime: this.time[1],
stationID: this.value1 != '请选择' ? this.value1 : '',
userID: this.value2
}
let res = await this.$http.workCount(data)
this.tableData = res.data.data.positionCount
this.allCount = res.data.data.allCount
},
async qSelect() {
let res1 = await this.$http.allPosition()
let res2 = await this.$http.allPeople()
this.options1 = [{ id: null, name: '请选择' }, ...res1.data.data]
this.options2 = [{ id: null, name: '请选择' }, ...res2.data.data]
}
},
watch: {
value1() {
this.workCount()
},
value2() {
this.workCount()
},
time() {
this.workCount()
}
}
}
</script>
<style lang="less" scoped>
.workload {
padding: 0 10px 30px 10px;
box-sizing: border-box;
.bottom {
text-align: center;
span {
margin: 0 20px;
}
}
}
</style>

View File

@@ -0,0 +1,17 @@
module.exports = {
//...
publicPath: process.env.NODE_ENV === 'production' ? './' : '/',
//...
// devServer: {
// proxy: {
// '/api': {
// target: 'https://ceshi.yishaxiyi.com/factoryapi',
// ws: true,
// changeOrigin: true,
// pathRewrite: {
// '^/api': '' //通过pathRewrite重写地址将前缀/api转为/
// }
// }
// }
// }
}

File diff suppressed because it is too large Load Diff