Merge branch 'yyw' of gitee.com:hzchunfen/erp into fix-release-1.0.0/yjc-migrate

This commit is contained in:
杨建炊 2024-09-05 10:52:14 +08:00
commit 53ac852284
70 changed files with 1027 additions and 151 deletions

1
public/dist/css/147.2c867641.css vendored Normal file
View File

@ -0,0 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-1f518a10]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-1f518a10]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.bgBox[data-v-1f518a10]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 15px 0}.bgBox .close[data-v-1f518a10]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-1f518a10]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content}

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.backimg[data-v-78f587bf]{width:100%;height:1080px;background-image:url(../img/%E7%BB%84%2032.a17892e3.png);background-repeat:no-repeat;background-size:100%;position:relative}.sign[data-v-78f587bf]{width:400px;height:500px;position:absolute;top:270px;right:300px}.sign .row[data-v-78f587bf]{margin-bottom:20px}.sign .title[data-v-78f587bf]{width:125px;height:23px;font-size:22px;font-family:BigruixianBlackGBV1\.0;font-weight:400;line-height:23px;color:#2b53ec;opacity:1}.sign .manage[data-v-78f587bf]{margin-top:19px;margin-bottom:50px}.sign .manage img[data-v-78f587bf]{margin-right:20px}.sign .manage span[data-v-78f587bf]{width:340px;height:57px;font-size:54px;font-family:BigruixianBlackGBV1\.0;font-weight:400;line-height:57px;color:#2b53ec;opacity:1}.sign .title-1[data-v-78f587bf]{width:70px;height:35px;font-size:35px;font-family:Source Han Sans CN;font-weight:500;line-height:60px;color:#393939;opacity:1;margin-bottom:35px}.sign .el-button[data-v-78f587bf]{width:400px;height:45px;background:#2b53ec;border-radius:5px;margin-top:40px}.sign .el-checkbox[data-v-78f587bf]{color:#2b53ec} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.backimg[data-v-561481f2]{width:100%;height:1080px;background-image:url(../img/%E7%BB%84%2032.a17892e3.png);background-repeat:no-repeat;background-size:100%;position:relative}.sign[data-v-561481f2]{width:400px;height:500px;position:absolute;top:270px;right:300px}.sign .row[data-v-561481f2]{margin-bottom:20px}.sign .title[data-v-561481f2]{width:125px;height:23px;font-size:22px;font-family:BigruixianBlackGBV1\.0;font-weight:400;line-height:23px;color:#2b53ec;opacity:1}.sign .manage[data-v-561481f2]{margin-top:19px;margin-bottom:50px}.sign .manage img[data-v-561481f2]{margin-right:20px}.sign .manage span[data-v-561481f2]{width:340px;height:57px;font-size:54px;font-family:BigruixianBlackGBV1\.0;font-weight:400;line-height:57px;color:#2b53ec;opacity:1}.sign .title-1[data-v-561481f2]{width:70px;height:35px;font-size:35px;font-family:Source Han Sans CN;font-weight:500;line-height:60px;color:#393939;opacity:1;margin-bottom:35px}.sign .el-button[data-v-561481f2]{width:400px;height:45px;background:#2b53ec;border-radius:5px;margin-top:40px}.sign .el-checkbox[data-v-561481f2]{color:#2b53ec}

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-2a9ed9ee]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-2a9ed9ee]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.opaBox[data-v-2a9ed9ee]{margin-bottom:15px}.bgBox[data-v-2a9ed9ee]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 15px 0}.bgBox .close[data-v-2a9ed9ee]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-2a9ed9ee]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-b907944a]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-b907944a]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.opaBox[data-v-b907944a]{margin-bottom:15px}.bgBox[data-v-b907944a]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 15px 0}.bgBox .close[data-v-b907944a]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-b907944a]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content}

1
public/dist/css/465.162dccfd.css vendored Normal file
View File

@ -0,0 +1 @@
.skuBox[data-v-4a07331a]{border:1px solid #e5e5e5;border-radius:5px;padding:15px 0;margin-bottom:15px;background-color:#f3f3f3}.skuBox .tit[data-v-4a07331a]{padding-left:40px;font-weight:600;font-size:15px;margin-bottom:15px}.el-upload--picture-card[data-v-4a07331a]{width:50px;height:50px}.el-form-item[data-v-4a07331a]{margin-left:40px}.avatar-uploader .el-upload[data-v-4a07331a]{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload[data-v-4a07331a]:hover{border-color:#409eff}.avatar-uploader-icon[data-v-4a07331a]{font-size:28px;color:#8c939d;width:148px;height:148px;line-height:148px;text-align:center}.avatar[data-v-4a07331a]{width:148px;height:148px;display:block}

View File

@ -1 +0,0 @@
.table[data-v-136cb538]{margin-top:20px;position:relative}.btn[data-v-136cb538]{float:right}.flex[data-v-136cb538]{display:flex;align-items:center}.goodBox .Img[data-v-136cb538]{width:50px;height:50px;margin-right:12px;border-radius:4px}.goodBox .tit[data-v-136cb538]{color:#000;font-size:13px}.confirmbtn[data-v-136cb538]{width:114px;height:44px;border-radius:3px;margin-top:21px;margin-bottom:8px}.import-right[data-v-136cb538]{margin-top:30px}.import-right a[data-v-136cb538]{text-decoration:none;color:#000}[data-v-136cb538] .btn11{padding:0;width:14px;height:14px}[data-v-136cb538] .btn11 img{width:100%;height:100%}.page[data-v-136cb538]{margin-top:20px}.searchBox[data-v-136cb538]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-136cb538]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.titBox[data-v-136cb538]{display:flex;align-items:center}.red[data-v-136cb538]{color:red}

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-4769713c]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-4769713c]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.opaBox[data-v-4769713c]{margin-bottom:15px}.bgBox[data-v-4769713c]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 1px 0}.bgBox .close[data-v-4769713c]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-4769713c]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-7638a0e4]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-7638a0e4]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.opaBox[data-v-7638a0e4]{margin-bottom:15px}.bgBox[data-v-7638a0e4]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 1px 0}.bgBox .close[data-v-7638a0e4]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-7638a0e4]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content}

1
public/dist/css/691.de1fc96e.css vendored Normal file
View File

@ -0,0 +1 @@
.el-upload--picture-card[data-v-253f0fda]{width:50px;height:50px}.avatar-uploader .el-upload[data-v-253f0fda]{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload[data-v-253f0fda]:hover{border-color:#409eff}.avatar-uploader-icon[data-v-253f0fda]{font-size:28px;color:#8c939d;width:148px;height:148px;line-height:148px;text-align:center}.avatar[data-v-253f0fda]{width:148px;height:148px;display:block}.shop-sku-img[data-v-253f0fda]{display:flex}.shop-sku-img .shop[data-v-253f0fda]{margin-right:20px;margin-bottom:20px}.shop-sku-img .shop .shop-name[data-v-253f0fda]{text-align:center}

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-3b8fe34f]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap;.row[data-v-3b8fe34f]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}}.opaBox[data-v-3b8fe34f]{margin-bottom:15px}.btn[data-v-3b8fe34f]{float:right}[data-v-3b8fe34f] .cell{display:flex;align-items:center}.commodityimg[data-v-3b8fe34f]{width:59px;height:59px;background:hsla(0,0%,89%,.39);opacity:1;display:block;margin-right:12px}.Img[data-v-3b8fe34f]{width:100%;height:100%}[data-v-3b8fe34f] .btn11{padding:0;width:14px;height:14px}[data-v-3b8fe34f] .btn11 img{width:100%;height:100%}.page[data-v-3b8fe34f]{margin-top:20px} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-b3d4720a]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap;.row[data-v-b3d4720a]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}}.opaBox[data-v-b3d4720a]{margin-bottom:15px}.btn[data-v-b3d4720a]{float:right}[data-v-b3d4720a] .cell{display:flex;align-items:center}.commodityimg[data-v-b3d4720a]{width:59px;height:59px;background:hsla(0,0%,89%,.39);opacity:1;display:block;margin-right:12px}.Img[data-v-b3d4720a]{width:100%;height:100%}[data-v-b3d4720a] .btn11{padding:0;width:14px;height:14px}[data-v-b3d4720a] .btn11 img{width:100%;height:100%}.page[data-v-b3d4720a]{margin-top:20px}

View File

@ -1 +0,0 @@
.el-upload--picture-card[data-v-ff99f10e]{width:50px;height:50px}.avatar-uploader .el-upload[data-v-ff99f10e]{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload[data-v-ff99f10e]:hover{border-color:#409eff}.avatar-uploader-icon[data-v-ff99f10e]{font-size:28px;color:#8c939d;width:148px;height:148px;line-height:148px;text-align:center}.avatar[data-v-ff99f10e]{width:148px;height:148px;display:block}.shop-sku-img[data-v-ff99f10e]{display:flex}.shop-sku-img .shop[data-v-ff99f10e]{margin-right:20px;margin-bottom:20px}.shop-sku-img .shop .shop-name[data-v-ff99f10e]{text-align:center}

View File

@ -1 +0,0 @@
.skuBox[data-v-3cee7459]{border:1px solid #e5e5e5;border-radius:5px;padding:15px 0;margin-bottom:15px;background-color:#f3f3f3}.skuBox .tit[data-v-3cee7459]{padding-left:40px;font-weight:600;font-size:15px;margin-bottom:15px}.el-upload--picture-card[data-v-3cee7459]{width:50px;height:50px}.el-form-item[data-v-3cee7459]{margin-left:40px}.avatar-uploader .el-upload[data-v-3cee7459]{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden}.avatar-uploader .el-upload[data-v-3cee7459]:hover{border-color:#409eff}.avatar-uploader-icon[data-v-3cee7459]{font-size:28px;color:#8c939d;width:148px;height:148px;line-height:148px;text-align:center}.avatar[data-v-3cee7459]{width:148px;height:148px;display:block}

1
public/dist/css/812.4c5ea71e.css vendored Normal file
View File

@ -0,0 +1 @@
.skuBox[data-v-4de310da]{border:1px solid #e5e5e5;border-radius:5px;padding:15px 0;margin-bottom:15px;background-color:#f3f3f3}.skuBox .tit[data-v-4de310da]{padding-left:40px;font-weight:600;font-size:15px;margin-bottom:15px}.skuBox[data-v-3dbf163e]{border:1px solid #e5e5e5;border-radius:5px;padding:15px 0;margin-bottom:15px;background-color:#f3f3f3}.skuBox .tit[data-v-3dbf163e]{padding-left:40px;font-weight:600;font-size:15px;margin-bottom:15px}.table[data-v-a2f1dd48]{margin-top:20px;position:relative}.btn[data-v-a2f1dd48]{float:right}.flex[data-v-a2f1dd48]{display:flex;align-items:center}.goodBox .Img[data-v-a2f1dd48]{width:50px;height:50px;margin-right:12px;border-radius:4px}.goodBox .tit[data-v-a2f1dd48]{color:#000;font-size:13px}.confirmbtn[data-v-a2f1dd48]{width:114px;height:44px;border-radius:3px;margin-top:21px;margin-bottom:8px}.import-right[data-v-a2f1dd48]{margin-top:30px}.import-right a[data-v-a2f1dd48]{text-decoration:none;color:#000}[data-v-a2f1dd48] .btn11{padding:0;width:14px;height:14px}[data-v-a2f1dd48] .btn11 img{width:100%;height:100%}.page[data-v-a2f1dd48]{margin-top:20px}.searchBox[data-v-a2f1dd48]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-a2f1dd48]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.titBox[data-v-a2f1dd48]{display:flex;align-items:center}.red[data-v-a2f1dd48]{color:red}

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-c963a484]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-c963a484]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.opaBox[data-v-c963a484]{margin-bottom:15px}.bgBox[data-v-c963a484]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 15px 0}.bgBox .close[data-v-c963a484]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-c963a484]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-823b7d84]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-823b7d84]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.opaBox[data-v-823b7d84]{margin-bottom:15px}.bgBox[data-v-823b7d84]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 15px 0}.bgBox .close[data-v-823b7d84]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-823b7d84]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content}

View File

@ -1 +1 @@
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>erp</title><script defer="defer" src="js/chunk-vendors.04652b46.js"></script><script defer="defer" src="js/app.f773b79c.js"></script><link href="css/chunk-vendors.77489a8d.css" rel="stylesheet"><link href="css/app.7e37f273.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but erp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html> <!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>erp</title><script defer="defer" src="js/chunk-vendors.04652b46.js"></script><script defer="defer" src="js/app.da342744.js"></script><link href="css/chunk-vendors.77489a8d.css" rel="stylesheet"><link href="css/app.7e37f273.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but erp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

2
public/dist/js/147.97be836f.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/147.97be836f.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/dist/js/200.1a2e4aeb.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/200.1a2e4aeb.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/dist/js/292.25ac0e82.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/292.25ac0e82.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/465.630ca1a8.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/465.630ca1a8.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/617.3e63da06.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/617.3e63da06.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/691.c4036076.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/691.c4036076.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/dist/js/702.43d335b0.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/702.43d335b0.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/812.d9984fe9.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/812.d9984fe9.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/dist/js/849.307fe005.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/849.307fe005.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/dist/js/967.1e40c1e4.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/dist/js/app.da342744.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/app.da342744.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -39,6 +39,14 @@ export function getPurchaseLog(params) {
}) })
} }
export function examinePurchase(data) {
return http({
url: "/api/purchase_record/purchase_batch_check",
method: "post",
data
})
}
export function addPurchaseLog(data) { export function addPurchaseLog(data) {
return http({ return http({
url: "/api/supplier/purchase_record", url: "/api/supplier/purchase_record",

View File

@ -0,0 +1,198 @@
<template>
<el-dialog :visible.sync="show" title="新增商品" width="900px" @close="closeDialog" :close-on-click-modal="false">
<el-form label-width="120px" :inline="true">
<el-form-item label="商品品种/品类:">
<treeselect
:options="treeList"
style="width: 200px;"
:disable-branch-nodes="true"
:show-count="true"
:normalizer="normalizer"
placeholder="请选择品种"
v-model="type_id">
<div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div>
</treeselect>
</el-form-item>
<div v-for="(item, i) in skus" :key="i" class="skuBox">
<div class="tit">规格{{ i + 1 }}</div>
<el-form-item label="规格名称:">
<el-input placeholder="规格名称" v-model="item.title"></el-input>
</el-form-item>
<el-form-item label="颜色/特性:">
<el-input placeholder="颜色/特性" v-model="item.attribute"></el-input>
</el-form-item>
<el-form-item label="商品状态:">
<el-select v-model="item.status" placeholder="下架(默认)" style="width: 200px;">
<el-option v-for="it in options" :key="it.id" :label="it.label" :value="it.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="商品成本:">
<el-input v-model="item.cost" placeholder="商品成本">
</el-input>
</el-form-item>
<div>
<el-form-item label="可售库存:">
<el-input v-model="item.sale_stock" placeholder="可售库存">
</el-input>
</el-form-item>
<el-form-item label="最终编码:">
<el-input v-model="item.external_sku_id" placeholder="不输入自动生成"></el-input>
</el-form-item>
<el-form-item label="">
<el-button type="danger" @click="handleDelete(i)" size="mini" icon="el-icon-delete">删除</el-button>
</el-form-item>
</div>
</div>
<div>
<el-form-item>
<el-button type="success" @click="toAddSku()" icon="el-icon-plus">增加规格</el-button>
</el-form-item>
</div>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSave()" :loading="loading">保存</el-button>
<el-button plain @click="cancel()">取消</el-button>
</span>
</el-dialog>
</template>
<script>
import { addGoods } from '@/api/goods.js'
import { goods_types } from '@/api/rankingData.js'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
components: { Treeselect },
props: {
show: {
type: Boolean,
default: () => {
return false
}
}
},
data() {
return {
showDialog: false,
treeList: [],
skus: [],
type_id: null,
options: [
{ id: 0, label: "下架" },
{ id: 1, label: "在售" }
],
loading: false
}
},
methods: {
getGoodsTypes() {
let params = {
parent_id: 0
}
goods_types(params).then((res) => {
this.treeList = JSON.parse(JSON.stringify(res.data.data).replace(/name/g, "label"))
})
},
//
handleSave() {
this.loading = true
let skus = this.skus
let params = {
type_id: this.type_id || '',
goods_id: '',
skus: skus
}
addGoods(params).then((res) => {
this.$message({ message: '商品添加成功!', type: 'success' })
this.loading = false
this.closeDialog()
this.$emit('complete')
}).catch(() => {
this.loading = false
})
},
toAddSku() {
if(!this.type_id) {
this.$message({ message: "请选择商品品种/品类", type: "error" })
return
}
this.handleAdd()
},
handleAdd() {
let sku = {
title: '',
external_sku_id: '',
status: 0,
num: 0,
cost: 0,
sale_stock: 9999,
reserve: 0,
attribute: ''
}
this.skus.push(sku)
},
handleDelete(index) {
this.skus.splice(index, 1)
},
cancel() {
this.closeDialog()
},
normalizer(node) {
if ((!node.children || (node.children && node.children.length == 0)) && node.level == 1) {
node.isDisabled = true
}
return node
},
parseLabel(node) {
let text = ''
text += node.parentNode ? node.parentNode.label + ' / ' : ''
text += node.raw ? node.raw.label : ''
return text
},
closeDialog() {
this.showDialog = false
this.$emit('close')
}
},
watch: {
show: {
handler(newVal, oldVal) {
if (newVal) {
this.skus = []
this.showDialog = true
this.handleAdd()
this.getGoodsTypes()
}
},
deep: true,
immediate: true
}
}
}
</script>
<style scoped lang="scss">
.skuBox{
border: 1px solid #e5e5e5;
border-radius: 5px;
padding: 15px 0;
margin-bottom: 15px;
background-color: #f3f3f3;
.tit{
padding-left: 40px;
font-weight: 600;
font-size: 15px;
margin-bottom: 15px;
}
}
</style>

View File

@ -0,0 +1,194 @@
<template>
<el-dialog :visible.sync="show" title="编辑商品" width="900px" @close="closeDialog" :close-on-click-modal="false">
<el-form label-width="120px" :inline="true">
<el-form-item label="商品品种/品类:">
<treeselect
:options="treeList"
style="width: 200px;"
:disable-branch-nodes="true"
:show-count="true"
:normalizer="normalizer"
placeholder="请选择品种"
v-model="goodsInfo.goods.type_id">
<div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div>
</treeselect>
</el-form-item>
<el-form-item label="规格名称:">
<el-input placeholder="规格名称" v-model="goodsInfo.title"></el-input>
</el-form-item>
<el-form-item label="最终编码:">
<el-input v-model="goodsInfo.external_sku_id" placeholder="不输入自动生成" disabled></el-input>
</el-form-item>
<el-form-item label="颜色/特性:">
<el-input placeholder="颜色/特性" v-model="goodsInfo.attribute"></el-input>
</el-form-item>
<el-form-item label="商品状态:">
<el-select v-model="goodsInfo.status" placeholder="下架(默认)" style="width: 200px;">
<el-option v-for="it in options" :key="it.id" :label="it.label" :value="it.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="商品成本:">
<el-input v-model="goodsInfo.cost" placeholder="商品成本">
</el-input>
</el-form-item>
<el-form-item label="在售库存:">
<el-input v-model="goodsInfo.sale_stock" placeholder="可售库存"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSave()" :loading="loading">保存</el-button>
<el-button plain @click="cancel()">取消</el-button>
</span>
</el-dialog>
</template>
<script>
import { updateGoods, checkGoods } from '@/api/goods.js'
import { goods_types } from '@/api/rankingData.js'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
components: { Treeselect },
props: {
show: {
type: Boolean,
default: () => {
return false
}
},
id: {
type: Number,
default: () => {
return 0
}
}
},
data() {
return {
goods_id: 0,
showDialog: false,
treeList: [],
skus: [],
type_id: null,
options: [
{ id: '下架', label: '下架' },
{ id: '在售', label: '在售' }
],
loading: false,
goodsInfo: {
goods: {
type_id: null
}
}
}
},
methods: {
getGoodsTypes() {
let params = {
parent_id: 0
}
goods_types(params).then((res) => {
this.treeList = JSON.parse(JSON.stringify(res.data.data).replace(/name/g, "label"))
})
},
//
handleSave() {
this.loading = true
let goods = {
title: this.goodsInfo.goods.title,
img_url: this.goodsInfo.goods.img_url,
type_id: this.goodsInfo.goods.type_id || '',
brand_id: this.goodsInfo.goods.brand_id,
goods_code: this.goodsInfo.goods.goods_code
}
let sku = {
title: this.goodsInfo.title,
external_sku_id: this.goodsInfo.external_sku_id,
status: this.goodsInfo.status,
num: this.goodsInfo.num,
cost: this.goodsInfo.cost,
sale_stock: this.goodsInfo.sale_stock,
thumb_url: this.goodsInfo.thumb_url,
attribute: this.goodsInfo.attribute
}
if (sku.status == '下架') {
sku.status = 0
} else if (sku.status == '在售') {
sku.status = 1
}
let params = {
goods_id: this.goodsInfo.goods_id,
goods,
sku
}
updateGoods(this.goods_id, params).then((res) => {
this.$message({ type: 'success', message: '编辑成功' })
this.loading = false
this.closeDialog()
this.$emit('complete')
}).catch(() => {
this.loading = false
})
},
getGoodsInfo() {
checkGoods(this.goods_id).then((res) => {
this.goodsInfo = res.data.data
this.goodsInfo.goods.type_id = this.goodsInfo.goods.type_id || null
})
},
cancel() {
this.closeDialog()
},
normalizer(node) {
if ((!node.children || (node.children && node.children.length == 0)) && node.level == 1) {
node.isDisabled = true
}
return node
},
parseLabel(node) {
let text = ''
text += node.parentNode ? node.parentNode.label + ' / ' : ''
text += node.raw ? node.raw.label : ''
return text
},
closeDialog() {
this.showDialog = false
this.$emit('close')
}
},
watch: {
id(newVal, oldVal) {
this.goods_id = newVal
},
show(newVal, oldVal) {
if (newVal) {
this.showDialog = true
this.getGoodsInfo()
this.getGoodsTypes()
}
}
}
}
</script>
<style scoped lang="scss">
.skuBox{
border: 1px solid #e5e5e5;
border-radius: 5px;
padding: 15px 0;
margin-bottom: 15px;
background-color: #f3f3f3;
.tit{
padding-left: 40px;
font-weight: 600;
font-size: 15px;
margin-bottom: 15px;
}
}
</style>

View File

@ -142,17 +142,22 @@ const list = [
}, },
{ {
path: "PURCHASE_RECORD", path: "PURCHASE_RECORD",
name: "入库采购", name: "商品采购",
component: () => import("../views/supplyChain/procureLog.vue") component: () => import("../views/supplyChain/procureLog.vue")
}, },
{
path: "PURCHASE_RECORD_CHECK",
name: "质检入库",
component: () => import("../views/supplyChain/procureCheck.vue")
},
{ {
path: "LOSS_RECORD", path: "LOSS_RECORD",
name: "报损记录", name: "仓库报损",
component: () => import("../views/supplyChain/lossRecord.vue") component: () => import("../views/supplyChain/lossRecord.vue")
}, },
{ {
path: "DAILY_STOCK_RECORD", path: "DAILY_STOCK_RECORD",
name: "每日盘点记录", name: "库存盘点",
component: () => import("../views/supplyChain/dailyStock.vue") component: () => import("../views/supplyChain/dailyStock.vue")
} }
] ]

View File

@ -76,6 +76,7 @@
console.log(res.data.roles) console.log(res.data.roles)
if(res.data.roles && res.data.roles[0]) { if(res.data.roles && res.data.roles[0]) {
localStorage.setItem("roleName", res.data.roles[0].name) localStorage.setItem("roleName", res.data.roles[0].name)
localStorage.setItem("userId", res.data.id)
this.$message({ this.$message({
message: "成功登录,欢迎来到后台管理系统", message: "成功登录,欢迎来到后台管理系统",
type: "success" type: "success"

View File

@ -40,6 +40,7 @@
<div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div> <div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div>
</treeselect> </treeselect>
</el-form-item> </el-form-item>
<!-- <el-form-item label="商品品牌:"> <!-- <el-form-item label="商品品牌:">
<el-select v-model="form.brand_id" placeholder="商品品牌" filterable :disabled="disabled"> <el-select v-model="form.brand_id" placeholder="商品品牌" filterable :disabled="disabled">
<el-option v-for="item in brandList" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in brandList" :key="item.id" :label="item.name" :value="item.id">
@ -52,6 +53,9 @@
<el-form-item label="规格名称:"> <el-form-item label="规格名称:">
<el-input placeholder="规格名称" v-model="item.title"></el-input> <el-input placeholder="规格名称" v-model="item.title"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="颜色/特性:">
<el-input placeholder="颜色/特性" v-model="item.attribute"></el-input>
</el-form-item>
<el-form-item label="商品状态:"> <el-form-item label="商品状态:">
<el-select v-model="item.status" placeholder="下架(默认)"> <el-select v-model="item.status" placeholder="下架(默认)">
<el-option v-for="it in options" :key="it.id" :label="it.label" :value="it.id"> <el-option v-for="it in options" :key="it.id" :label="it.label" :value="it.id">
@ -117,7 +121,7 @@
img_url: "", img_url: "",
type_id: null, // Treeselectnull type_id: null, // Treeselectnull
brand_id: "", brand_id: "",
goods_code: "", goods_code: ""
}, },
// //
options: [ options: [
@ -227,7 +231,8 @@
num: 0, num: 0,
cost: 0, cost: 0,
sale_stock: 9999, sale_stock: 9999,
reserve: 0 reserve: 0,
attribute: ''
}; };
this.skus.push(sku); this.skus.push(sku);
}, },

View File

@ -41,7 +41,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="num" label="组合数量"></el-table-column> <el-table-column prop="num" label="组合数量"></el-table-column>
<el-table-column label="实际库存"> <el-table-column label="剩余库存">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="!scope.row.children">{{ scope.row.stock }}</span> <span v-if="!scope.row.children">{{ scope.row.stock }}</span>
</template> </template>
@ -96,24 +96,24 @@
<el-form-item label="商品编码" prop="external_sku_id"> <el-form-item label="商品编码" prop="external_sku_id">
<el-input v-model="dynamicValidateForm.external_sku_id"></el-input> <el-input v-model="dynamicValidateForm.external_sku_id"></el-input>
</el-form-item> </el-form-item>
<el-form-item v-for="(item, index) in dynamicValidateForm.combination_goods" :label="'子商品' + index" <el-form-item v-for="(item, index) in dynamicValidateForm.combination_goods" :label="'花材' + (index + 1)"
:key="item.item_id" :prop="'combination_goods.' + index + '.item_id'" :rules="{ :key="item.item_id" :prop="'combination_goods.' + index + '.item_id'" :rules="{
required: true, message: '子商品不能为空', trigger: 'blur' required: true, message: '子商品不能为空', trigger: 'blur'
}"> }">
<el-col :span="8"> <div style="display: flex;align-items: center;">
<el-select v-model="item.item_id" filterable remote reserve-keyword placeholder="请选择子商品" <el-select v-model="item.item_id" filterable remote reserve-keyword placeholder="请选择子商品"
:remote-method="remoteMethod" :loading="remoteLoading"> :remote-method="remoteMethod" :loading="remoteLoading" style="width: 240px;">
<el-option v-for="sku in skus" :key="sku.id" :label="sku.title" :value="sku.id"></el-option> <el-option v-for="sku in skus" :key="sku.id" :label="sku.title" :value="sku.id"></el-option>
</el-select> </el-select>
</el-col> <el-input v-model="item.item_num" placeholder="数量" style="width: 120px;margin: 0 10px"></el-input>
<el-col :span="2"> <el-button type="danger" size="mini" @click.prevent="removeItem(index)">删除</el-button>
<el-input v-model="item.item_num" placeholder="数量"></el-input> </div>
</el-col> </el-form-item>
<el-button type="danger" @click.prevent="removeItem(index)">删除</el-button> <el-form-item label=" ">
<el-button @click="addItem" icon="el-icon-plus">添加花材</el-button>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="submitForm('dynamicValidateForm')">提交</el-button> <el-button type="primary" @click="submitForm('dynamicValidateForm')">提交</el-button>
<el-button @click="addItem">添加子商品</el-button>
<el-button @click="resetForm('dynamicValidateForm')">重置</el-button> <el-button @click="resetForm('dynamicValidateForm')">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>

View File

@ -38,6 +38,7 @@
<div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div> <div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div>
</treeselect> </treeselect>
</el-form-item> </el-form-item>
<!-- <el-form-item label="商品品牌:"> <!-- <el-form-item label="商品品牌:">
<el-select v-model="goodsData.goods.brand_id" placeholder="商品品牌" filterable> <el-select v-model="goodsData.goods.brand_id" placeholder="商品品牌" filterable>
<el-option v-for="item in brand" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in brand" :key="item.id" :label="item.name" :value="item.id">
@ -52,6 +53,9 @@
<el-form-item label="最终编码:"> <el-form-item label="最终编码:">
<el-input v-model="goodsData.external_sku_id" placeholder="规格编码" disabled></el-input> <el-input v-model="goodsData.external_sku_id" placeholder="规格编码" disabled></el-input>
</el-form-item> </el-form-item>
<el-form-item label="颜色/特性:">
<el-input placeholder="颜色/特性" v-model="goodsData.attribute"></el-input>
</el-form-item>
<el-form-item label="商品状态:"> <el-form-item label="商品状态:">
<el-select v-model="goodsData.status"> <el-select v-model="goodsData.status">
<el-option v-for="item in options" :key="item.id" :label="item.label" :value="item.id"> <el-option v-for="item in options" :key="item.id" :label="item.label" :value="item.id">
@ -126,6 +130,7 @@ export default {
sale_stock: '', sale_stock: '',
external_sku_id: "", external_sku_id: "",
thumb_url: [], thumb_url: [],
attribute: '',
goods: { goods: {
img_url: "", img_url: "",
title: "", title: "",
@ -243,7 +248,8 @@ export default {
num: this.goodsData.num, num: this.goodsData.num,
cost: this.goodsData.cost, cost: this.goodsData.cost,
sale_stock: this.goodsData.sale_stock, sale_stock: this.goodsData.sale_stock,
thumb_url: this.goodsData.thumb_url thumb_url: this.goodsData.thumb_url,
attribute: this.goodsData.attribute
}; };
if (sku.status == "下架") { if (sku.status == "下架") {
sku.status = 0; sku.status = 0;

View File

@ -84,7 +84,7 @@
<!-- 表格 --> <!-- 表格 -->
<el-table v-loading="loading" ref="multipleTable" border :data="tableData" class="table" tooltip-effect="dark" <el-table v-loading="loading" ref="multipleTable" border :data="tableData" class="table" tooltip-effect="dark"
style="width: 100%" @selection-change="handleSelectionChange" max-height="1500"> style="width: 100%" @selection-change="handleSelectionChange">
<!-- 多选框 --> <!-- 多选框 -->
<el-table-column type="selection" align="center"></el-table-column> <el-table-column type="selection" align="center"></el-table-column>
<el-table-column label="商品信息" width="300"> <el-table-column label="商品信息" width="300">
@ -94,19 +94,19 @@
<div> <div>
<div class="tit">{{ scope.row.name }}</div> <div class="tit">{{ scope.row.name }}</div>
<p>{{ scope.row.external_sku_id }}</p> <p>{{ scope.row.external_sku_id }}</p>
<p>{{ scope.row.goods && scope.row.goods.updated_at }}</p> <p>{{ scope.row.updated_at }}</p>
</div> </div>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="品类/品种" align="center"> <!-- <el-table-column label="品类/品种" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.goods && scope.row.goods.type"> <div v-if="scope.row.goods && scope.row.goods.type">
<span>{{ scope.row.goods.type.parent_type ? scope.row.goods.type.parent_type.name : '-' }} / </span> <span>{{ scope.row.goods.type.parent_type ? scope.row.goods.type.parent_type.name : '-' }} / </span>
<span>{{ scope.row.goods.type.name || '-' }}</span> <span>{{ scope.row.goods.type.name || '-' }}</span>
</div> </div>
</template> </template>
</el-table-column> </el-table-column> -->
<!-- <el-table-column label="规格" prop="title"></el-table-column> --> <!-- <el-table-column label="规格" prop="title"></el-table-column> -->
<!-- <el-table-column label="品牌"> <!-- <el-table-column label="品牌">
<template slot-scope="scope"> <template slot-scope="scope">
@ -126,9 +126,9 @@
</template> </template>
</el-table-column> --> </el-table-column> -->
<el-table-column prop="cost" sortable label="成本" align="center"> <el-table-column prop="cost" label="成本" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="flex"> <div class="flex" style="justify-content: center;">
<div v-if="isShow"> <div v-if="isShow">
<el-input v-model="scope.row.cost"></el-input> <el-input v-model="scope.row.cost"></el-input>
</div> </div>
@ -179,7 +179,7 @@
</template> </template>
</el-table-column> --> </el-table-column> -->
<!-- <el-table-column sortable label="销量" align="center"> <el-table-column sortable label="销量" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.row.order_goods_num }}</span> <span>{{ scope.row.order_goods_num }}</span>
<el-popover placement="right-start" trigger="hover" <el-popover placement="right-start" trigger="hover"
@ -192,7 +192,7 @@
<i class="el-icon-view" slot="reference" style="padding-left: 5px;"></i> <i class="el-icon-view" slot="reference" style="padding-left: 5px;"></i>
</el-popover> </el-popover>
</template> </template>
</el-table-column> --> </el-table-column>
<!-- <el-table-column sortable label="损耗"> <!-- <el-table-column sortable label="损耗">
<template slot-scope="scope"> <template slot-scope="scope">
@ -227,7 +227,7 @@
</template> </template>
</el-table-column> --> </el-table-column> -->
<el-table-column prop="stock" sortable label="当前实际库存" align="center"></el-table-column> <el-table-column prop="yesterday_num" label="实际库存" align="center"></el-table-column>
<el-table-column prop="sale_stock" label="可售库存"> <el-table-column prop="sale_stock" label="可售库存">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="titBox" v-if="scope.row.edit"> <div class="titBox" v-if="scope.row.edit">
@ -237,14 +237,18 @@
</div> </div>
<div v-else>{{scope.row.sale_stock}} <div v-else>{{scope.row.sale_stock}}
<span style="color: #409eff;margin-left: 5px;cursor: pointer;font-size: 15px;" <span style="color: #409eff;margin-left: 5px;cursor: pointer;font-size: 15px;"
@click="showEdit(scope.row, scope.$index)"> @click="openSaleEdit(scope.row, scope.$index)">
<i class="el-icon-edit"></i> <i class="el-icon-edit"></i>
</span> </span>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="剩余库存" sortable align="center" prop="stock">
<el-table-column align="center"> <template slot-scope="scope">
<span :class="scope.row.stock * 1 < 0 ? 'red' : ''">{{ scope.row.stock }}</span>
</template>
</el-table-column>
<!-- <el-table-column align="center">
<template slot="header" slot-scope="scope"> <template slot="header" slot-scope="scope">
<span>销存比例</span> <span>销存比例</span>
<el-tooltip class="item" effect="dark" content="当前库存/当天7点盘点的库存" placement="top"> <el-tooltip class="item" effect="dark" content="当前库存/当天7点盘点的库存" placement="top">
@ -254,7 +258,7 @@
<template slot-scope="scope"> <template slot-scope="scope">
<span :class="scope.row.sale_ratio * 1 < 20 ? 'red' : ''">{{ scope.row.sale_ratio }}%</span> <span :class="scope.row.sale_ratio * 1 < 20 ? 'red' : ''">{{ scope.row.sale_ratio }}%</span>
</template> </template>
</el-table-column> </el-table-column> -->
<!-- <el-table-column prop="address" sortable label="盘点"> <!-- <el-table-column prop="address" sortable label="盘点">
<template slot-scope="scope"> <template slot-scope="scope">
@ -272,12 +276,10 @@
<el-table-column prop="status" label="状态" align="center"></el-table-column> <el-table-column prop="status" label="状态" align="center"></el-table-column>
<el-table-column label="操作" align="center" width="120" v-if="is_admin"> <el-table-column label="操作" align="center" width="120" v-if="is_admin">
<template slot-scope="scope"> <template slot-scope="scope">
<div style="text-align: center;width: 100%;">
<!-- <el-button type="text" @click="ejectstock(scope.row)">库存</el-button> --> <!-- <el-button type="text" @click="ejectstock(scope.row)">库存</el-button> -->
<el-button type="text" @click="handleEdit(scope.row.id)">编辑</el-button> <el-button type="text" @click="handleEdit(scope.row.id)">编辑</el-button>
<!-- <el-button type="text" @click="goodslog(scope.row)">记录</el-button> --> <!-- <el-button type="text" @click="goodslog(scope.row)">记录</el-button> -->
<!-- <el-button type="text" @click="deleteSku(scope.row)">删除</el-button> --> <!-- <el-button type="text" @click="deleteSku(scope.row)">删除</el-button> -->
</div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -291,9 +293,14 @@
<!-- 分页功能 --> <!-- 分页功能 -->
<div class="page-pagination"> <div class="page-pagination">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" <el-pagination
:current-page="current_page" :page-sizes="[10, 30, 50, 100, 200]" :page-size="per_page" @size-change="handleSizeChange"
layout="total, sizes, prev, pager, next, jumper" :total="Paginationdata.total"> @current-change="handleCurrentChange"
:current-page="current_page"
:page-sizes="[10, 30, 50, 100, 200]"
:page-size="per_page"
layout="total, sizes, prev, pager, next, jumper"
:total="Paginationdata.total">
</el-pagination> </el-pagination>
</div> </div>
</el-card> </el-card>
@ -304,8 +311,7 @@
<el-table-column prop="two_days_ago_num" label="2天前库存"> <el-table-column prop="two_days_ago_num" label="2天前库存">
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
<el-input v-model="scope.row.two_days_ago_num" :disabled="true"> <el-input v-model="scope.row.two_days_ago_num" :disabled="true"></el-input>
</el-input>
<el-input v-model="scope.row.two_days_ago_num"></el-input> <el-input v-model="scope.row.two_days_ago_num"></el-input>
</div> </div>
</template> </template>
@ -432,6 +438,12 @@
</span> </span>
</el-dialog> </el-dialog>
<!-- 新增商品 -->
<add-goods :show="showAdd" @close="showAdd = false" @complete="refreshList"></add-goods>
<!-- 编辑商品 -->
<edit-goods :show="showEdit" :id="curId" @close="showEdit = false" @complete="refreshList"></edit-goods>
</div> </div>
</template> </template>
@ -442,9 +454,11 @@
import { orderRest } from "@/api/shop" import { orderRest } from "@/api/shop"
import Treeselect from '@riophae/vue-treeselect' import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css' import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import addGoods from "@/components/Goods/add.vue"
import editGoods from "@/components/Goods/edit.vue"
export default { export default {
components: { Treeselect }, components: { Treeselect, addGoods, editGoods },
data() { data() {
return { return {
editPriceId: '', //id editPriceId: '', //id
@ -540,7 +554,10 @@
chooseList: [], chooseList: [],
showUpdate: false, showUpdate: false,
commitLoading: false, commitLoading: false,
is_admin: localStorage.getItem('roleName') == '超级管理员' || localStorage.getItem('roleName') == '系统管理员' is_admin: localStorage.getItem('roleName') == '超级管理员' || localStorage.getItem('roleName') == '系统管理员',
showAdd: false,
showEdit: false,
curId: 0
} }
}, },
methods: { methods: {
@ -553,7 +570,9 @@
}, },
// //
handleEdit(id) { handleEdit(id) {
this.$router.push({ path: "EDIT_GOODS", query: { id: id } }) // this.$router.push({ path: "EDIT_GOODS", query: { id: id } })
this.curId = id
this.showEdit = true
}, },
// //
@ -675,7 +694,11 @@
}, },
// //
addNewgoods() { addNewgoods() {
this.$router.push("/ADDGOODS") // this.$router.push("/ADDGOODS")
this.showAdd = true
},
refreshList() {
this.handleChoose(this.current_page)
}, },
// //
@ -1088,7 +1111,7 @@
this.commitLoading = false this.commitLoading = false
}) })
}, },
showEdit(row, index) { openSaleEdit(row, index) {
this.$set(this.tableData[index], 'edit', true) this.$set(this.tableData[index], 'edit', true)
this.$set(this.tableData[index], 'sale_stock_old', row.sale_stock) this.$set(this.tableData[index], 'sale_stock_old', row.sale_stock)
}, },

View File

@ -57,16 +57,23 @@
<el-dialog title="新增" :visible.sync="dialogVisible" width="500px"> <el-dialog title="新增" :visible.sync="dialogVisible" width="500px">
<div v-for="(item, index) in inventoryOrders" :key="index" class="bgBox"> <div v-for="(item, index) in inventoryOrders" :key="index" class="bgBox">
<div class="close" @click="delItem(index)"><i class="el-icon-delete-solid"></i></div> <div class="close" @click="delItem(index)"><i class="el-icon-delete-solid"></i></div>
<el-form label-width="90px"> <el-form label-width="90px" label-position="right">
<el-form-item label="商品编码:"> <el-form-item label="商品名称:">
<el-input v-model="item.external_sku_id" clearable></el-input> <el-select v-model="item.external_sku_id" filterable remote reserve-keyword placeholder="商品名称" clearable
:remote-method="remoteMethod" :loading="searchLoading">
<el-option v-for="it in goodsList" :key="it.external_sku_id" :label="it.title" :value="it.external_sku_id">
</el-option>
</el-select>
</el-form-item> </el-form-item>
<!-- <el-form-item label="商品编码:">
<el-input v-model="item.external_sku_id" clearable></el-input>
</el-form-item> -->
<el-form-item label="盘点库存:"> <el-form-item label="盘点库存:">
<el-input v-model="item.inventory" clearable></el-input> <el-input v-model="item.inventory" clearable></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加标签</div> <div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加记录</div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="commitSupplier" :loading="commitloading"> </el-button> <el-button type="primary" @click="commitSupplier" :loading="commitloading"> </el-button>
@ -93,6 +100,7 @@
<script> <script>
import { getDailyStock, batchAddDailyStock } from "@/api/supplyChain" import { getDailyStock, batchAddDailyStock } from "@/api/supplyChain"
import axios from "axios" import axios from "axios"
import { goodsSkusList } from "@/api/goods"
export default { export default {
data() { data() {
@ -111,6 +119,8 @@ export default {
}, },
addTime: [], addTime: [],
showImport: false, showImport: false,
goodsList: [],
searchLoading: false,
fileList: [] fileList: []
} }
}, },
@ -211,6 +221,21 @@ export default {
} else { } else {
this.$message.error("请先上传文件") this.$message.error("请先上传文件")
} }
},
remoteMethod(query) {
if (query !== '') {
this.searchLoading = true
setTimeout(() => {
this.searchLoading = false
goodsSkusList(query).then((res) => {
this.goodsList = res.data.filter(item => {
return item.title.toLowerCase().indexOf(query.toLowerCase()) > -1
})
})
}, 200)
} else {
this.goodsList = []
}
} }
}, },
mounted() { mounted() {

View File

@ -62,9 +62,9 @@
</div> </div>
</el-card> </el-card>
<el-dialog title="新增" :visible.sync="dialogVisible" width="500px"> <el-dialog title="新增" :visible.sync="dialogVisible" width="900px">
<el-form label-width="90px"> <el-form label-width="90px" :inline="true">
<el-form-item label="采购人"> <el-form-item label="采购人:">
<el-select v-model="curInfo.buyer_id" clearable filterable ref="userBatchRef"> <el-select v-model="curInfo.buyer_id" clearable filterable ref="userBatchRef">
<el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
@ -73,25 +73,39 @@
</el-form> </el-form>
<div v-for="(item, index) in lossOrders" :key="index" class="bgBox"> <div v-for="(item, index) in lossOrders" :key="index" class="bgBox">
<div class="close" @click="delItem(index)"><i class="el-icon-delete-solid"></i></div> <div class="close" @click="delItem(index)"><i class="el-icon-delete-solid"></i></div>
<el-form label-width="90px"> <el-form label-width="90px" :inline="true">
<el-form-item label="商品编码"> <el-form-item label="商品名称:">
<el-select v-model="item.external_sku_id" filterable remote reserve-keyword placeholder="商品名称" clearable
:remote-method="remoteMethod" :loading="searchLoading">
<el-option v-for="it in goodsList" :key="it.external_sku_id" :label="it.title" :value="it.external_sku_id">
</el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="商品编码:">
<el-input v-model="item.external_sku_id" clearable></el-input> <el-input v-model="item.external_sku_id" clearable></el-input>
</el-form-item> -->
<el-form-item label="数量:">
<el-input v-model="item.num" clearable @input="changeInput(index, item)"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="数量"> <el-form-item label="成本:">
<el-input v-model="item.num" clearable></el-input> <el-input v-model="item.cost" clearable @input="changeInput(index, item)" style="width: 215px;">
<template slot="append"></template>
</el-input>
</el-form-item> </el-form-item>
<el-form-item label="成本"> <el-form-item label="商品总价:">
<el-input v-model="item.cost" clearable></el-input> <el-input v-model="item.total_price" style="width: 215px;">
<template slot="append"></template>
</el-input>
</el-form-item> </el-form-item>
<el-form-item label="报损原因"> <el-form-item label="报损原因:">
<el-input v-model="item.reason" clearable></el-input> <el-input v-model="item.reason" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item label="报损现象"> <el-form-item label="报损现象:">
<el-input v-model="item.phenomenon" clearable></el-input> <el-input v-model="item.phenomenon" clearable></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加标签</div> <div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加记录</div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="commitBatchLoss" :loading="commitloading"> </el-button> <el-button type="primary" @click="commitBatchLoss" :loading="commitloading"> </el-button>
@ -100,20 +114,34 @@
<el-dialog title="编辑" :visible.sync="editDialog" width="500px"> <el-dialog title="编辑" :visible.sync="editDialog" width="500px">
<el-form label-width="90px"> <el-form label-width="90px">
<el-form-item label="商品编码"> <el-form-item label="采购人">
<el-input v-model="curInfo.external_sku_id" clearable></el-input> <el-select v-model="curInfo.buyer_user_id" clearable filterable ref="userRef">
<el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="商品名称">
<el-select v-model="curInfo.external_sku_id" filterable remote reserve-keyword placeholder="商品名称" clearable
:remote-method="editRemoteMethod" :loading="searchLoading">
<el-option v-for="it in editGoodsList" :key="it.external_sku_id" :label="it.title" :value="it.external_sku_id">
</el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="商品编码">
<el-input v-model="curInfo.external_sku_id" clearable></el-input>
</el-form-item> -->
<el-form-item label="数量"> <el-form-item label="数量">
<el-input v-model="curInfo.num" disabled></el-input> <el-input v-model="curInfo.num" disabled></el-input>
</el-form-item> </el-form-item>
<el-form-item label="成本"> <el-form-item label="成本">
<el-input v-model="curInfo.cost" clearable></el-input> <el-input v-model="curInfo.cost" clearable>
<template slot="append"></template>
</el-input>
</el-form-item> </el-form-item>
<el-form-item label="采购人"> <el-form-item label="商品总价">
<el-select v-model="curInfo.buyer_id" clearable filterable ref="userRef"> <el-input v-model="curInfo.total_price" disabled>
<el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id"> <template slot="append"></template>
</el-option> </el-input>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="报损原因"> <el-form-item label="报损原因">
<el-input v-model="curInfo.reason" clearable></el-input> <el-input v-model="curInfo.reason" clearable></el-input>
@ -149,6 +177,7 @@
import { getLossLog, batchAddLossLog, updateLossLog } from "@/api/supplyChain" import { getLossLog, batchAddLossLog, updateLossLog } from "@/api/supplyChain"
import axios from "axios" import axios from "axios"
import { userList } from "@/api/user" import { userList } from "@/api/user"
import { goodsSkusList } from "@/api/goods"
export default { export default {
data() { data() {
@ -170,7 +199,10 @@ export default {
fileList: [], fileList: [],
usersList: [], usersList: [],
lossOrders: [], lossOrders: [],
editDialog: false editDialog: false,
goodsList: [],
searchLoading: false,
editGoodsList: []
} }
}, },
methods: { methods: {
@ -207,12 +239,13 @@ export default {
// //
handleAdd() { handleAdd() {
this.curInfo = { this.curInfo = {
buyer_id: '' buyer_id: localStorage.getItem("userId")
} }
this.lossOrders = [{ this.lossOrders = [{
external_sku_id: '', external_sku_id: '',
num: '', num: '',
cost: '', cost: '',
total_price: '',
reason: '', reason: '',
phenomenon: '' phenomenon: ''
}] }]
@ -226,13 +259,19 @@ export default {
external_sku_id: '', external_sku_id: '',
num: '', num: '',
cost: '', cost: '',
total_price: '',
reason: '', reason: '',
phenomenon: '' phenomenon: ''
}) })
}, },
handleEdit(row) { handleEdit(row) {
this.curInfo = JSON.parse(JSON.stringify(row)) this.curInfo = JSON.parse(JSON.stringify(row))
this.dialogVisible = true this.editGoodsList = [{
external_sku_id: row.external_sku_id,
title: row.goods_sku && row.goods_sku.name
}]
this.curInfo.total_price = (row.cost * 1) * (row.num * 1)
this.editDialog = true
}, },
commitBatchLoss() { commitBatchLoss() {
this.commitloading = true this.commitloading = true
@ -325,6 +364,39 @@ export default {
userList(params).then((res) => { userList(params).then((res) => {
this.usersList = res.data.data this.usersList = res.data.data
}) })
},
changeInput(index, row) {
this.$set(this.lossOrders[index], 'total_price', ((row.num * 1) * (row.cost * 1)))
},
remoteMethod(query) {
if (query !== '') {
this.searchLoading = true
setTimeout(() => {
this.searchLoading = false
goodsSkusList(query).then((res) => {
this.goodsList = res.data.filter(item => {
return item.title.toLowerCase().indexOf(query.toLowerCase()) > -1
})
})
}, 200)
} else {
this.goodsList = []
}
},
editRemoteMethod(query) {
if (query !== '') {
this.searchLoading = true
setTimeout(() => {
this.searchLoading = false
goodsSkusList(query).then((res) => {
this.editGoodsList = res.data.filter(item => {
return item.title.toLowerCase().indexOf(query.toLowerCase()) > -1
})
})
}, 200)
} else {
this.editGoodsList = []
}
} }
}, },
mounted() { mounted() {

View File

@ -0,0 +1,224 @@
<template>
<div class="pageBox">
<div class="cardBox">
<div class="searchBox">
<div class="row">
<span>商品名称</span>
<el-input v-model="filter.title" clearable></el-input>
</div>
<div class="row">
<span>商品编码</span>
<el-input v-model="filter.external_sku_id" clearable></el-input>
</div>
<div class="row">
<span>创建时间</span>
<el-date-picker
v-model="addTime"
type="datetimerange"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 340px">
</el-date-picker>
</div>
<div class="row">
<span>审核状态</span>
<el-select v-model="filter.status" placeholder="请选择" clearable>
<el-option v-for="item in statusList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</div>
<div class="row">
<el-button type="primary" icon="el-icon-search" @click="handleSearch">筛选</el-button>
</div>
</div>
</div>
<el-card>
<el-table v-loading="loading" :data="procureList" style="width: 100%" border>
<el-table-column prop="goods_sku.id" label="商品id" width="80" align="center" />
<el-table-column prop="goods_sku.name" label="商品名称" />
<el-table-column prop="external_sku_id" label="商品编码" />
<el-table-column prop="num" label="采购数量" />
<el-table-column prop="cost" label="采购成本" />
<el-table-column prop="buyer_name" label="采购人名称" />
<!-- <el-table-column prop="status" label="状态" /> -->
<el-table-column prop="expire_time" label="到货时间" />
<el-table-column prop="supplier_name" label="供应商">
<template slot-scope="scope">
<span v-if="scope.row.supplier_name">{{ scope.row.supplier_name }}{{scope.row.supplier_id}}</span>
</template>
</el-table-column>
<el-table-column label="状态">
<template slot-scope="scope">
<span v-if="scope.row.status == 0">待审核</span>
<span v-else-if="scope.row.status == 1" style="color: #6DD230;">审核通过</span>
<span v-else-if="scope.row.status == 2" style="color: #f00;">审核不通过</span>
</template>
</el-table-column>
<el-table-column prop="date" label="采购时间" align="center" />
<el-table-column label="操作" width="120" align="center">
<template slot-scope="scope">
<el-button type="primary" v-if="scope.row.status != 1" plain @click="toExamine(scope.row)" icon="el-icon-s-check" size="mini">审核</el-button>
</template>
</el-table-column>
</el-table>
<div class="page-pagination">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page"
:page-sizes="[15, 30, 50, 100]"
:page-size="pageSize"
layout="prev, pager, next, jumper, sizes, total"
:total="total">
</el-pagination>
</div>
</el-card>
<el-dialog title="审核" :visible.sync="dialogVisible" width="500px">
<el-form label-width="90px">
<el-form-item label="审核状态:">
<el-radio-group v-model="curInfo.status">
<el-radio :label="1">审核通过</el-radio>
<el-radio :label="2">审核不通过</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="commitCheck" :loading="commitloading"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getPurchaseLog, examinePurchase } from "@/api/supplyChain"
export default {
data() {
return {
loading: false,
page: 1,
pageSize: 15,
total: 0,
procureList: [],
filter: {
title: '',
external_sku_id: '',
status: ''
},
addTime: [],
curInfo: {},
commitloading: false,
dialogVisible: false,
statusList: [
{ id: 0, name: '待审核' },
{ id: 1, name: '审核通过' },
{ id: 2, name: '审核不通过' }
]
}
},
methods: {
fetchList() {
this.loading = true
let params = {
page: this.page,
per_page: this.pageSize,
...this.filter,
start_time: this.addTime ? this.addTime[0] : '',
end_time: this.addTime ? this.addTime[1] : ''
}
getPurchaseLog(params).then((res) => {
this.procureList = res.data.data
this.total = res.data.meta.total
this.loading = false
}).catch(() => {
this.loading = false
})
},
handleSizeChange(val) {
this.page = 1
this.pageSize = val
this.fetchList()
},
handleCurrentChange(val) {
this.page = val
this.fetchList()
},
handleSearch() {
this.page = 1
this.fetchList()
},
toExamine(row) {
this.curInfo = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
},
commitCheck() {
if(!this.curInfo.status) {
this.$message({ type: "error", message: "请选择审核状态" })
return
}
this.commitloading = true
let params = {
purchaseOrders: [{
id: this.curInfo.id,
status: this.curInfo.status
}]
}
examinePurchase(params).then((res) => {
this.$message({ type: "success", message: "操作成功!" })
this.commitloading = false
this.dialogVisible = false
this.fetchList()
}).catch(() => {
this.commitloading = false
})
}
},
mounted() {
this.fetchList()
}
}
</script>
<style lang="scss" scoped>
.searchBox{
display: flex;
align-items: center;
flex-wrap: wrap;
white-space: nowrap;
.row{
font-size: 14px;
margin-bottom: 20px;
margin-right: 15px;
display: flex;
align-items: center;
}
}
.bgBox{
position: relative;
border-radius: 5px;
background-color: #f5f2f2;
margin-bottom: 15px;
padding: 15px 30px 15px 0;
.close{
color: #f00;
position: absolute;
right: 5px;
top: 5px;
font-size: 20px;
cursor: pointer;
}
}
.btn{
display: flex;
align-items: center;
font-size: 14px;
color: #409eff;
cursor: pointer;
width: fit-content;
}
</style>

View File

@ -22,6 +22,13 @@
style="width: 340px"> style="width: 340px">
</el-date-picker> </el-date-picker>
</div> </div>
<div class="row">
<span>审核状态</span>
<el-select v-model="filter.status" placeholder="请选择" clearable>
<el-option v-for="item in statusList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</div>
<div class="row"> <div class="row">
<el-button type="primary" icon="el-icon-search" @click="handleSearch">筛选</el-button> <el-button type="primary" icon="el-icon-search" @click="handleSearch">筛选</el-button>
</div> </div>
@ -40,13 +47,20 @@
<el-table-column prop="cost" label="采购成本" /> <el-table-column prop="cost" label="采购成本" />
<el-table-column prop="buyer_name" label="采购人名称" /> <el-table-column prop="buyer_name" label="采购人名称" />
<!-- <el-table-column prop="status" label="状态" /> --> <!-- <el-table-column prop="status" label="状态" /> -->
<el-table-column prop="expire_time" label="保质期时间" /> <el-table-column prop="expire_time" label="到货时间" />
<el-table-column prop="supplier_name" label="供应商"> <el-table-column prop="supplier_name" label="供应商">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.supplier_name">{{ scope.row.supplier_name }}{{scope.row.supplier_id}}</span> <span v-if="scope.row.supplier_name">{{ scope.row.supplier_name }}{{scope.row.supplier_id}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="date" label="采购时间" align="center" /> <el-table-column prop="date" label="采购时间" align="center" />
<el-table-column label="状态">
<template slot-scope="scope">
<span v-if="scope.row.status == 0">待审核</span>
<span v-else-if="scope.row.status == 1" style="color: #6DD230;">审核通过</span>
<span v-else-if="scope.row.status == 2" style="color: #f00;">审核不通过</span>
</template>
</el-table-column>
<el-table-column label="操作" width="120" align="center"> <el-table-column label="操作" width="120" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="primary" @click="handleEdit(scope.row)" icon="el-icon-edit" size="mini">编辑</el-button> <el-button type="primary" @click="handleEdit(scope.row)" icon="el-icon-edit" size="mini">编辑</el-button>
@ -66,15 +80,15 @@
</div> </div>
</el-card> </el-card>
<el-dialog title="新增" :visible.sync="dialogVisible" width="500px"> <el-dialog title="新增" :visible.sync="dialogVisible" width="900px">
<el-form label-width="90px"> <el-form label-width="90px" :inline="true">
<el-form-item label="采购人"> <el-form-item label="采购人:">
<el-select v-model="curInfo.buyer_user_id" clearable filterable ref="userBatchRef"> <el-select v-model="curInfo.buyer_user_id" clearable filterable ref="userBatchRef">
<el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="供应商"> <el-form-item label="供应商:">
<el-select v-model="curInfo.supplier_id" clearable filterable ref="supplierBatchRef"> <el-select v-model="curInfo.supplier_id" clearable filterable ref="supplierBatchRef">
<el-option v-for="item in supplierList" :key="item.id" :label="item.supplier_name" :value="item.id"> <el-option v-for="item in supplierList" :key="item.id" :label="item.supplier_name" :value="item.id">
</el-option> </el-option>
@ -83,17 +97,31 @@
</el-form> </el-form>
<div v-for="(item, index) in purchaseOrders" :key="index" class="bgBox"> <div v-for="(item, index) in purchaseOrders" :key="index" class="bgBox">
<div class="close" @click="delItem(index)"><i class="el-icon-delete-solid"></i></div> <div class="close" @click="delItem(index)"><i class="el-icon-delete-solid"></i></div>
<el-form label-width="90px"> <el-form label-width="90px" :inline="true">
<el-form-item label="商品编码"> <el-form-item label="商品名称:">
<el-input v-model="item.external_sku_id" clearable></el-input> <el-select v-model="item.external_sku_id" filterable remote reserve-keyword placeholder="商品名称" clearable
:remote-method="remoteMethod" :loading="searchLoading">
<el-option v-for="it in goodsList" :key="it.external_sku_id" :label="it.title" :value="it.external_sku_id">
</el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="数量"> <!-- <el-form-item label="商品编码:">
<el-input v-model="item.num" clearable></el-input> <el-input v-model="item.external_sku_id" disabled></el-input>
</el-form-item> -->
<el-form-item label="数量:">
<el-input v-model="item.num" clearable @input="changeInput(index, item)"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="成本"> <el-form-item label="成本:">
<el-input v-model="item.cost" clearable></el-input> <el-input v-model="item.cost" clearable @input="changeInput(index, item)" style="width: 215px;">
<template slot="append"></template>
</el-input>
</el-form-item> </el-form-item>
<el-form-item label="采购日期"> <el-form-item label="商品总价:">
<el-input v-model="item.total_price" style="width: 215px;">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="采购日期:">
<el-date-picker <el-date-picker
v-model="item.date" v-model="item.date"
type="date" type="date"
@ -102,9 +130,18 @@
value-format="yyyy-MM-dd"> value-format="yyyy-MM-dd">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="到货时间:">
<el-date-picker
v-model="item.arrived_time"
type="datetime"
placeholder="选择日期"
format="yyyy-MM-dd hh:mm:ss"
value-format="yyyy-MM-dd hh:mm:ss">
</el-date-picker>
</el-form-item>
</el-form> </el-form>
</div> </div>
<div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加标签</div> <div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加采购商品</div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="commitAddPurchase" :loading="commitloading"> </el-button> <el-button type="primary" @click="commitAddPurchase" :loading="commitloading"> </el-button>
@ -113,17 +150,8 @@
<el-dialog title="编辑" :visible.sync="editDialog" width="600px"> <el-dialog title="编辑" :visible.sync="editDialog" width="600px">
<el-form label-width="90px"> <el-form label-width="90px">
<el-form-item label="商品编码">
<el-input v-model="curInfo.external_sku_id" disabled></el-input>
</el-form-item>
<el-form-item label="数量">
<el-input v-model="curInfo.num" disabled></el-input>
</el-form-item>
<el-form-item label="成本">
<el-input v-model="curInfo.cost" disabled></el-input>
</el-form-item>
<el-form-item label="采购人"> <el-form-item label="采购人">
<el-select v-model="curInfo.buyer_user_id" clearable filterable ref="userRef"> <el-select v-model="curInfo.buyer_user_id" clearable filterable ref="userRef" disabled>
<el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
@ -134,6 +162,27 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="商品名称">
<el-select v-model="curInfo.external_sku_id" filterable remote reserve-keyword placeholder="商品名称" clearable
:remote-method="editRemoteMethod" :loading="searchLoading">
<el-option v-for="it in editGoodsList" :key="it.external_sku_id" :label="it.title" :value="it.external_sku_id">
</el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="商品编码">
<el-input v-model="curInfo.external_sku_id" disabled></el-input>
</el-form-item> -->
<el-form-item label="数量">
<el-input v-model="curInfo.num" disabled></el-input>
</el-form-item>
<el-form-item label="成本">
<el-input v-model="curInfo.cost" disabled></el-input>
</el-form-item>
<el-form-item label="商品总价">
<el-input v-model="curInfo.total_price" disabled>
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="采购时间"> <el-form-item label="采购时间">
<el-date-picker <el-date-picker
v-model="curInfo.date" v-model="curInfo.date"
@ -143,6 +192,15 @@
value-format="yyyy-MM-dd"> value-format="yyyy-MM-dd">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="到期时间">
<el-date-picker
v-model="curInfo.arrived_time"
type="datetime"
placeholder="到货时间"
format="yyyy-MM-dd hh:mm:ss"
value-format="yyyy-MM-dd hh:mm:ss">
</el-date-picker>
</el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="editDialog = false"> </el-button> <el-button @click="editDialog = false"> </el-button>
@ -172,6 +230,8 @@
import { getPurchaseLog, updatePurchaseLog, getSupplier, batchAddPurchaseLog } from "@/api/supplyChain" import { getPurchaseLog, updatePurchaseLog, getSupplier, batchAddPurchaseLog } from "@/api/supplyChain"
import axios from "axios" import axios from "axios"
import { userList } from "@/api/user" import { userList } from "@/api/user"
import { goodsSkusList } from "@/api/goods"
import dayjs from 'dayjs'
export default { export default {
data() { data() {
@ -183,7 +243,8 @@ export default {
procureList: [], procureList: [],
filter: { filter: {
title: '', title: '',
external_sku_id: '' external_sku_id: '',
status: ''
}, },
addTime: [], addTime: [],
commitloading: false, commitloading: false,
@ -194,7 +255,15 @@ export default {
usersList: [], usersList: [],
supplierList: [], supplierList: [],
purchaseOrders: [], purchaseOrders: [],
editDialog: false editDialog: false,
goodsList: [],
searchLoading: false,
statusList: [
{ id: 0, name: '待审核' },
{ id: 1, name: '审核通过' },
{ id: 2, name: '审核不通过' }
],
editGoodsList: []
} }
}, },
methods: { methods: {
@ -231,14 +300,16 @@ export default {
// //
handleAdd() { handleAdd() {
this.curInfo = { this.curInfo = {
buyer_user_id: '', buyer_user_id: localStorage.getItem("userId"),
supplier_id: '' supplier_id: ''
} }
this.purchaseOrders = [{ this.purchaseOrders = [{
external_sku_id: '', external_sku_id: '',
num: '', num: '',
cost: '', cost: '',
date: '' total_price: '',
date: dayjs().format('YYYY-MM-DD'),
arrived_time: ''
}] }]
this.dialogVisible = true this.dialogVisible = true
}, },
@ -250,11 +321,18 @@ export default {
external_sku_id: '', external_sku_id: '',
num: '', num: '',
cost: '', cost: '',
date: '' total_price: '',
date: dayjs().format('YYYY-MM-DD'),
arrived_time: ''
}) })
}, },
handleEdit(row) { handleEdit(row) {
this.curInfo = JSON.parse(JSON.stringify(row)) this.curInfo = JSON.parse(JSON.stringify(row))
this.editGoodsList = [{
external_sku_id: row.external_sku_id,
title: row.goods_sku && row.goods_sku.name
}]
this.curInfo.total_price = (row.cost * 1) * (row.num * 1)
this.editDialog = true this.editDialog = true
}, },
commitAddPurchase() { commitAddPurchase() {
@ -367,6 +445,39 @@ export default {
getSupplier(params).then((res) => { getSupplier(params).then((res) => {
this.supplierList = res.data.data this.supplierList = res.data.data
}) })
},
remoteMethod(query) {
if (query !== '') {
this.searchLoading = true
setTimeout(() => {
this.searchLoading = false
goodsSkusList(query).then((res) => {
this.goodsList = res.data.filter(item => {
return item.title.toLowerCase().indexOf(query.toLowerCase()) > -1
})
})
}, 200)
} else {
this.goodsList = []
}
},
changeInput(index, row) {
this.$set(this.purchaseOrders[index], 'total_price', ((row.num * 1) * (row.cost * 1)))
},
editRemoteMethod(query) {
if (query !== '') {
this.searchLoading = true
setTimeout(() => {
this.searchLoading = false
goodsSkusList(query).then((res) => {
this.editGoodsList = res.data.filter(item => {
return item.title.toLowerCase().indexOf(query.toLowerCase()) > -1
})
})
}, 200)
} else {
this.editGoodsList = []
}
} }
}, },
mounted() { mounted() {