Преглед на файлове

Merge branch 'redUrgent' into testToMerge

qymljy преди 3 месеца
родител
ревизия
b585911010

+ 142 - 0
package-lock.json

@@ -29,6 +29,7 @@
         "moment": "^2.29.4",
         "nprogress": "^0.2.0",
         "print-js": "^1.6.0",
+        "qrcodejs2": "^0.0.2",
         "sass-loader": "^16.0.2",
         "script-loader": "^0.7.2",
         "sortablejs": "^1.15.2",
@@ -37,6 +38,7 @@
         "vue-countupjs": "^1.0.0",
         "vue-i18n": "^8.27.0",
         "vue-image-viewer": "^1.1.8",
+        "vue-qr": "^4.0.9",
         "vue-router": "^3.5.1",
         "vuex": "^3.6.2",
         "xlsx": "^0.18.5"
@@ -6989,6 +6991,20 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "dependencies": {
+        "mimic-response": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/deep-equal": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz",
@@ -10703,6 +10719,11 @@
       "resolved": "https://registry.npmmirror.com/jquery/-/jquery-3.7.1.tgz",
       "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
     },
+    "node_modules/js-binary-schema-parser": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz",
+      "integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg=="
+    },
     "node_modules/js-md5": {
       "version": "0.7.3",
       "resolved": "https://registry.npmmirror.com/js-md5/-/js-md5-0.7.3.tgz",
@@ -11597,6 +11618,17 @@
         "node": ">=6"
       }
     },
+    "node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/mini-css-extract-plugin": {
       "version": "2.9.2",
       "resolved": "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz",
@@ -12413,6 +12445,11 @@
         "node": ">=6"
       }
     },
+    "node_modules/parenthesis": {
+      "version": "3.1.8",
+      "resolved": "https://registry.npmmirror.com/parenthesis/-/parenthesis-3.1.8.tgz",
+      "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw=="
+    },
     "node_modules/parse-json": {
       "version": "5.2.0",
       "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
@@ -13430,6 +13467,11 @@
         "node": ">=6"
       }
     },
+    "node_modules/qrcodejs2": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmmirror.com/qrcodejs2/-/qrcodejs2-0.0.2.tgz",
+      "integrity": "sha512-+Y4HA+cb6qUzdgvI3KML8GYpMFwB24dFwzMkS/yXq6hwtUGNUnZQdUnksrV1XGMc2mid5ROw5SAuY9XhI3ValA=="
+    },
     "node_modules/qs": {
       "version": "6.7.0",
       "resolved": "https://registry.npmmirror.com/qs/-/qs-6.7.0.tgz",
@@ -14463,6 +14505,49 @@
       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
       "dev": true
     },
+    "node_modules/simple-concat": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz",
+      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/simple-get": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz",
+      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "decompress-response": "^6.0.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
     "node_modules/simple-swizzle": {
       "version": "0.2.2",
       "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -14806,6 +14891,14 @@
       "resolved": "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz",
       "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
     },
+    "node_modules/string-split-by": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/string-split-by/-/string-split-by-1.0.0.tgz",
+      "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==",
+      "dependencies": {
+        "parenthesis": "^3.1.5"
+      }
+    },
     "node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
@@ -17036,6 +17129,55 @@
         "url": "https://github.com/chalk/chalk?sponsor=1"
       }
     },
+    "node_modules/vue-qr": {
+      "version": "4.0.9",
+      "resolved": "https://registry.npmmirror.com/vue-qr/-/vue-qr-4.0.9.tgz",
+      "integrity": "sha512-pAISV94T0MNEYA3NGjykUpsXRE2QfaNxlu9ZhEL6CERgqNc21hJYuP3hRVzAWfBQlgO18DPmZTbrFerJC3+Ikw==",
+      "dependencies": {
+        "glob": "^8.0.1",
+        "js-binary-schema-parser": "^2.0.2",
+        "simple-get": "^4.0.1",
+        "string-split-by": "^1.0.0"
+      }
+    },
+    "node_modules/vue-qr/node_modules/brace-expansion": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz",
+      "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/vue-qr/node_modules/glob": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz",
+      "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^5.0.1",
+        "once": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/vue-qr/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/vue-ref": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/vue-ref/-/vue-ref-2.0.0.tgz",

+ 2 - 0
package.json

@@ -30,6 +30,7 @@
     "moment": "^2.29.4",
     "nprogress": "^0.2.0",
     "print-js": "^1.6.0",
+    "qrcodejs2": "^0.0.2",
     "sass-loader": "^16.0.2",
     "script-loader": "^0.7.2",
     "sortablejs": "^1.15.2",
@@ -38,6 +39,7 @@
     "vue-countupjs": "^1.0.0",
     "vue-i18n": "^8.27.0",
     "vue-image-viewer": "^1.1.8",
+    "vue-qr": "^4.0.9",
     "vue-router": "^3.5.1",
     "vuex": "^3.6.2",
     "xlsx": "^0.18.5"

+ 120 - 0
public/codeToFile.html

@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="UTF-8">
+        <title>商品资料页</title>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
+        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
+        <style>
+            .img-margin{
+                margin: 60pt 0 30pt 30pt;
+            }
+            .title-div{
+                width:100%;
+                height:50px;
+                margin:0 0 20pt 30pt
+            }
+            .title-font{
+                font-size: 40pt;
+                height:50px;
+                line-height: 50px;
+                vertical-align: auto;
+                text-align: left;
+                color: #333333;
+                font-weight: bold
+            }
+            .margin-style{
+                margin:0 30pt 20pt 30pt
+            }
+            .div-border{
+                width: 100%;
+                height: 150px;
+                border-radius: 8pt;
+                border: #cccccc solid 1px;
+                display: flex;
+                justify-content: left;
+                margin-bottom: 20px;
+            }
+            .img-style{
+                width: 90px;
+                height: 90px;
+                margin: 28px 0 0 20px;
+            }
+            .content-style{
+                font-size: 30px;
+                color: #333333;
+                margin: 30px 20px 0 20px;
+            }
+        </style>
+    </head>
+    <body>
+        <img src="./img/bnBag.png" width="85%" height="180px" class="img-margin">
+        <div class="title-div">
+            <div class="title-font" >产品技术资料</div>
+        </div>
+        <div class="margin-style" id="dataContainer"></div>
+        <script>
+            window.onload = async function(){
+                var loc=location.href;
+                var n1=loc.length;
+                var n2=loc.indexOf('=');
+                var code=loc.slice(n2+1,n1)
+                let that = this
+                console.log(code)
+                let param = {
+                    "id": 2025082515112802,
+                    "content": {
+                        "code": code
+                    },
+                }
+                axios.post('http://61.164.207.46:8000/yos/rest/index', param)
+                .then(function (response) {
+                    console.log(response)
+                    console.log(response.data.data.length)
+                    response.data.data.forEach(item => {
+                        const div = document.createElement('div');
+                        div.className = 'div-border';
+                        let iconSrc = '';
+                        if (item.attinfos[0].postfix == 'word' || item.attinfos[0].postfix == 'Word') {
+                            iconSrc = './img/word.svg';
+                        } else if (item.attinfos[0].postfix == 'pdf' || item.attinfos[0].postfix == 'PDF') {
+                            iconSrc = './img/pdfType.svg';
+                        } else if (item.attinfos[0].postfix == 'png' || item.attinfos[0].postfix == 'PNG' || item.attinfos[0].postfix == 'JPG' || item.attinfos[0].postfix == 'jpg') {
+                            iconSrc = './img/pngType.svg';
+                        }else if (item.attinfos[0].postfix == 'ppt' || item.attinfos[0].postfix == 'PPT') {
+                            iconSrc = './img/ppt.svg';
+                        }else if (item.attinfos[0].postfix == 'mp3' || item.attinfos[0].postfix == 'MP3' || item.attinfos[0].postfix == 'MP4' || item.attinfos[0].postfix == 'mp4'
+                            || item.attinfos[0].postfix == 'mov' || item.attinfos[0].postfix == 'MOV') {
+                            iconSrc = './img/mov.svg';
+                        }else if (item.attinfos[0].postfix == 'EXCEL' || item.attinfos[0].postfix == 'excel' || item.attinfos[0].postfix == 'xlsx' || item.attinfos[0].postfix == 'XLSX') {
+                            iconSrc = './img/excel.svg';
+                        } else {
+                            iconSrc = './img/default.svg';
+                        }
+                        div.innerHTML = `
+                            <div class="div-border" >
+                                <img src="${iconSrc}" class="img-style">
+                                <div class="content-style">${item.remarks}</div>
+                            </div>
+                `;
+                        dataContainer.appendChild(div);
+                        div.addEventListener('click', function() {
+                            console.log(item.attinfos[0].url)
+                            downloadFile(item.attinfos[0].url)
+                        });
+                    })
+                })
+                .catch(function (error) {
+                    console.log(error);
+                });
+            }
+            function downloadFile(fileUrl, fileType){
+                const link = document.createElement('a');
+                link.href = fileUrl
+                document.body.appendChild(link);
+                link.click();
+                document.body.removeChild(link);
+            }
+        </script>
+    </body>
+</html>

BIN
public/img/bnBag.png


+ 1 - 0
public/img/excelType.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1756796851259" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11939" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M276.621241 320.123586h431.139311v465.037242H276.621241z" fill="#FFFFFF" p-id="11940"></path><path d="M912.454621 1000.41269a48.16331 48.16331 0 0 1-35.310345 15.254069H138.593103a51.729655 51.729655 0 0 1-50.387862-50.776276V50.776276A54.589793 54.589793 0 0 1 103.247448 15.254069a48.869517 48.869517 0 0 1 35.310345-15.254069h503.631448l285.272276 287.70869v677.217103a49.681655 49.681655 0 0 1-15.042207 35.522207z m-245.300966-630.819311h-78.388965l-79.942621 117.901242-76.623448-117.901242H351.408552l117.018482 164.722759-125.634206 176.198621h79.90731l84.356414-125.669518 84.356414 124.89269h81.743448l-125.669517-175.315862z m0 0" fill="#42B275" p-id="11941"></path><path d="M927.496828 287.70869h-234.955035a51.553103 51.553103 0 0 1-50.21131-50.846897V0z m0 0" fill="#74D4AF" p-id="11942"></path></svg>

+ 1 - 0
public/img/mov.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1756796646732" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11347" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M647.450483 0H139.652414a49.434483 49.434483 0 0 0-35.592828 15.36 55.048828 55.048828 0 0 0-15.148138 35.80469v921.6a52.118069 52.118069 0 0 0 50.740966 51.164689h744.659862a48.587034 48.587034 0 0 0 35.592827-15.36 50.070069 50.070069 0 0 0 15.148138-35.804689V290.074483z" fill="#C386F0" p-id="11348"></path><path d="M935.088552 290.074483h-236.861793a51.941517 51.941517 0 0 1-50.599725-51.235311V0z m0 0" fill="#FFFFFF" opacity=".45" p-id="11349"></path><path d="M683.961379 470.934069a23.51669 23.51669 0 0 0-23.552 0l-52.753655 30.543448V460.093793a20.833103 20.833103 0 0 0-23.552-23.552h-232.342069a20.833103 20.833103 0 0 0-23.552 23.552v176.09269a20.797793 20.797793 0 0 0 23.552 23.516689h232.342069a20.797793 20.797793 0 0 0 23.552-23.516689v-41.489655l52.753655 30.402206a23.552 23.552 0 0 0 35.310345-20.232827v-113.487448a23.58731 23.58731 0 0 0-11.758345-20.44469z" fill="#FFFFFF" p-id="11350"></path></svg>

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
public/img/pdfType.svg


+ 1 - 0
public/img/pngType.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1756796808868" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11790" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M647.485793 0H139.687724a49.434483 49.434483 0 0 0-35.628138 15.36 54.872276 54.872276 0 0 0-15.112827 35.80469v921.6a52.082759 52.082759 0 0 0 50.740965 51.164689h744.624552a48.657655 48.657655 0 0 0 35.628138-15.36 50.034759 50.034759 0 0 0 15.112827-35.804689V290.074483z" fill="#FF4C5E" p-id="11791"></path><path d="M935.053241 290.074483h-236.861793a51.941517 51.941517 0 0 1-50.564414-51.235311V0z m0 0" fill="#FFFFFF" opacity=".45" p-id="11792"></path><path d="M593.425655 373.089103L395.511172 715.917241h395.864276z" fill="#FFFFFF" p-id="11793"></path><path d="M375.913931 544.485517l-98.868965 171.396414h197.949793z" fill="#FFFFFF" p-id="11794"></path><path d="M312.35531 408.505379m-35.416276 0a35.416276 35.416276 0 1 0 70.832552 0 35.416276 35.416276 0 1 0-70.832552 0Z" fill="#FFFFFF" p-id="11795"></path></svg>

+ 1 - 0
public/img/ppt.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1756796734064" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11494" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M644.343172 4.096H140.464552a48.975448 48.975448 0 0 0-35.310345 15.32469 54.836966 54.836966 0 0 0-15.042207 35.698758v917.892414A51.835586 51.835586 0 0 0 140.499862 1024h738.974897a48.128 48.128 0 0 0 35.310344-15.32469 49.964138 49.964138 0 0 0 15.006897-35.698758V292.969931z" fill="#F16C41" p-id="11495"></path><path d="M929.75669 292.969931h-235.060966a51.588414 51.588414 0 0 1-50.176-50.988138V4.096z m0 0" fill="#FFFFFF" opacity=".45" p-id="11496"></path><path d="M501.865931 377.997241a117.195034 117.195034 0 0 0-56.708414 14.124138v-14.124138H396.535172v340.215173h48.622345v-111.474759a117.195034 117.195034 0 0 0 56.708414 14.124138 121.502897 121.502897 0 0 0 0-243.041103z m0 194.418759a72.845241 72.845241 0 0 1-56.708414-27.188966v-91.347862a72.845241 72.845241 0 1 1 56.708414 118.536828z" fill="#FFFFFF" p-id="11497"></path></svg>

+ 1 - 0
public/img/word.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1756789866938" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11198" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M641.588966 0H138.451862a48.834207 48.834207 0 0 0-35.310345 15.218759 54.589793 54.589793 0 0 0-15.006896 35.486896v913.478621a51.659034 51.659034 0 0 0 50.317241 50.740965h737.986207a48.198621 48.198621 0 0 0 35.310345-15.218758 49.646345 49.646345 0 0 0 15.006896-35.486897V287.496828z" fill="#5C91E5" p-id="11199"></path><path d="M926.790621 287.496828h-234.813793a51.482483 51.482483 0 0 1-50.14069-50.776276v-236.579311z m0 0" fill="#FFFFFF" opacity=".45" p-id="11200"></path><path d="M431.280552 709.561379h-58.29738l105.295449-339.791448h58.297379z" fill="#FFFFFF" p-id="11201"></path><path d="M325.879172 369.769931H267.581793l105.295448 339.791448h58.29738zM689.046069 369.769931h58.297379l-105.295448 339.791448h-58.297379z" fill="#FFFFFF" p-id="11202"></path><path d="M641.942069 709.561379h-58.297379l-105.295449-339.791448h58.29738z" fill="#FFFFFF" p-id="11203"></path></svg>

+ 116 - 0
src/Form/codeManage/add.vue

@@ -0,0 +1,116 @@
+<template>
+  <div>
+    <el-button
+        size="small"
+        type="primary"
+        @click="addBtn"
+    >{{ $t("新 建") }}</el-button>
+    <el-drawer
+        :title="$t('新建二维码')"
+        :visible.sync="dialogFormVisible"
+        :wrapperClosable="false"
+        size="700px"
+        direction="rtl"
+        append-to-body
+        :show-close="false"
+        @close="onClose"
+    >
+      <div class="drawer__panel">
+        <el-row :gutter="10">
+          <el-form
+              :model="form"
+              :rules="rules"
+              ref="form"
+              :label-width="tool.onlyZh('90px')"
+              label-position="right"
+              size="mini"
+          >
+            <el-col :span="24">
+              <el-form-item :label="$t('标题') + ':'" prop="title">
+                <el-input
+                    v-model="form.title"
+                    :placeholder="$t('请填写标题')"
+                ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item :label="$t('备注') + ':'">
+                <el-input
+                    type="textarea"
+                    :rows="5"
+                    v-model="form.remarks"
+                    :placeholder="$t('请填写备注')"
+                ></el-input>
+              </el-form-item>
+            </el-col>
+          </el-form>
+        </el-row>
+      </div>
+      <div class="fixed__btn__panel">
+        <el-button
+            size="small"
+            @click="onClose"
+            class="normal-btn-width inline-16"
+        >{{ $t("取 消") }}</el-button>
+        <el-button
+            size="small"
+            type="primary"
+            :loading="loading"
+            @click="onSubmit"
+            class="normal-btn-width"
+        >{{ $t("确 定") }}</el-button>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "add",
+  data(){
+    return {
+      dialogFormVisible:false,
+      loading:false,
+      form:{
+        "plm_technicalinfo_codeid": 0,
+        "title": "",
+        "remarks": ""
+      },
+      rules:{
+        title: [
+          {
+            required: true,
+            message: this.$t("请填写标题"),
+            trigger: "blur",
+          },
+        ],
+      }
+    }
+  },
+  methods:{
+    addBtn(){
+      this.dialogFormVisible = true
+    },
+    onSubmit(){
+      this.$refs.form.validate(async (valid) => {
+        if (!valid) return false
+        const res = await this.$api.requested({
+          "id": 2025082513204302,
+          "content": this.form
+        })
+        this.tool.showMessage(res,()=>{
+          this.$emit('onSuccess')
+          this.dialogFormVisible = false
+        })
+      })
+    },
+    onClose(){
+      this.dialogFormVisible = false
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 122 - 0
src/Form/codeManage/edit.vue

@@ -0,0 +1,122 @@
+<template>
+  <div>
+    <el-button
+        size="small"
+        type="text"
+        @click="editBtn"
+    >{{ $t("编辑") }}</el-button>
+    <el-drawer
+        :title="$t('编辑二维码')"
+        :visible.sync="dialogFormVisible"
+        :wrapperClosable="false"
+        size="700px"
+        direction="rtl"
+        append-to-body
+        :show-close="false"
+        @close="onClose"
+    >
+      <div class="drawer__panel">
+        <el-row :gutter="10">
+          <el-form
+              :model="form"
+              :rules="rules"
+              ref="form"
+              :label-width="tool.onlyZh('90px')"
+              label-position="right"
+              size="mini"
+          >
+            <el-col :span="24">
+              <el-form-item :label="$t('标题') + ':'" prop="title">
+                <el-input
+                    v-model="form.title"
+                    :placeholder="$t('请填写标题')"
+                ></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item :label="$t('备注') + ':'">
+                <el-input
+                    type="textarea"
+                    :rows="5"
+                    v-model="form.remarks"
+                    :placeholder="$t('请填写备注')"
+                ></el-input>
+              </el-form-item>
+            </el-col>
+          </el-form>
+        </el-row>
+      </div>
+      <div class="fixed__btn__panel">
+        <el-button
+            size="small"
+            @click="onClose"
+            class="normal-btn-width inline-16"
+        >{{ $t("取 消") }}</el-button>
+        <el-button
+            size="small"
+            type="primary"
+            :loading="loading"
+            @click="onSubmit"
+            class="normal-btn-width"
+        >{{ $t("确 定") }}</el-button>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+<script>
+export default {
+  name: "edit",
+  props:['data'],
+  data(){
+    return {
+      dialogFormVisible:false,
+      loading:false,
+      form:{
+        "plm_technicalinfo_codeid": 0,
+        "title": "",
+        "remarks": ""
+      },
+      rules:{
+        title: [
+          {
+            required: true,
+            message: this.$t("请填写标题"),
+            trigger: "blur",
+          },
+        ],
+      }
+    }
+  },
+  methods:{
+    editBtn(){
+      this.dialogFormVisible = true
+      console.log(this.data)
+      this.form = {
+        "plm_technicalinfo_codeid": this.data.plm_technicalinfo_codeid,
+        "title": this.data.title,
+        "remarks": this.data.remarks
+      }
+    },
+    onSubmit(){
+      this.$refs.form.validate(async (valid) => {
+        if (!valid) return false
+        const res = await this.$api.requested({
+          "id": 2025082513204302,
+          "content": this.form
+        })
+        this.tool.showMessage(res,()=>{
+          this.$emit('onSuccess')
+          this.dialogFormVisible = false
+        })
+      })
+    },
+    onClose(){
+      this.dialogFormVisible = false
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 86 - 0
src/HDrpManagement/codeManage/index.vue

@@ -0,0 +1,86 @@
+<template>
+  <div>
+    <basicLayout
+        style="padding-top:0 !important"
+        ref="basicLayout"
+        formPath="codeManage"
+        tableName="codesTable"
+        idName="plm_technicalinfo_codeids"
+        :apiId="{query:2025082513210302,del:2025082513211502}">
+      <template v-slot:tbList="scope">
+        <div v-if="scope.data.column.columnname == 'codeImg'" >
+          <div  @click="codeClick(scope.data.column.data.code)">
+            <vue-qr  :text="url + '?code=' + scope.data.column.data.code" :size="36" @callback="callback"></vue-qr>
+          </div>
+        </div>
+        <div>
+          {{scope.data.column.data[scope.data.column.columnname]}}
+        </div>
+      </template>
+      <template v-slot:tbOpreation="scope">
+        <edit :data="scope.data.data" @onSuccess="onSuccess" class="inline-16"></edit>
+        <darwerPanel :id="scope.data.data.plm_technicalinfo_codeid" :title="$t(`关联商品`)" :detailPath="{path:'/relationCode'}" class="inline-16" @closeDrawer="onSuccess"/>
+        <btnDelete class="inline-16" paramID="2025082513211502" nameKey="plm_technicalinfo_codeids" :id="scope.data.data.plm_technicalinfo_codeid"
+                   message="确认是否删除该二维码及其关联的商品信息?" @onSuccess="onSuccess" btnTitle="删除"></btnDelete>
+      </template>
+    </basicLayout>
+    <el-dialog
+        append-to-body
+        :visible.sync="dialogVisible"
+        width="700px"
+    >
+      <vue-qr  :text="bigUrl" :size="600" @click="codeClick"  @callback="callback"></vue-qr>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import edit from '@/Form/codeManage/edit'
+import darwerPanel from '@/HManagement/archives_sc/components/Rpanel'
+import btnDelete from '@/components/btn-popconfirm/index'
+import vueQr from 'vue-qr'
+export default {
+  name: "index",
+  components:{edit,darwerPanel,btnDelete,vueQr},
+  data(){
+    return {
+      dialogVisible:false,
+      url:'http://61.164.207.46:8000/yosweb/codeToFile.html',
+      // url:'http://192.168.3.146:8000/yosweb/codeToFile.html',
+      bigUrl:''
+    }
+  },
+  methods:{
+    onSuccess(){
+      this.$refs.basicLayout.listData()
+    },
+    async codeClick(code){
+      this.dialogVisible = true
+      console.log(this.url,'urlURL')
+      this.bigUrl = this.url + '?code=' + code
+    },
+    callback(){
+    },
+    getURL () {
+      var str = window.location.href;
+      var index = str.indexOf('/');
+      var num = 0;
+      while(index !== -1) {
+        num++;
+        index = str.indexOf('/',index + 1);
+        if (num++ === 3) {
+          this.url = str.slice(0, index) + '/yosweb/codeToFile.html'
+          return str.slice(0, index);
+        }
+      }
+    }
+  },
+  mounted() {
+    this.getURL()
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 242 - 0
src/HDrpManagement/codeManage/modules/add.vue

@@ -0,0 +1,242 @@
+<template>
+  <div>
+    <el-button size="small" type="primary"  @click="onShow">{{$t(`新增关联商品`)}}</el-button>
+    <el-drawer
+        :title="$t(`新增关联商品`)"
+        :visible.sync="drawer"
+        :wrapperClosable="false"
+        size="85%"
+        @close="onClose"
+        append-to-body
+    >
+      <div class="drawer__panel" style="margin-top: 0;margin-bottom: 0;padding-top: 0">
+        <div style="margin-top: 20px;margin-bottom: 10px">
+          <uploadAllData
+              class="inline-16"
+              :total="total"
+              @handlePullApi="handlePullApi"
+              @handleUploadApi="handleUploadApi"
+              @onSuccess="onSuccess"
+          ></uploadAllData>
+          <el-input style="width:200px;" :placeholder="$t('搜索')" :suffix-icon="params.content.where.condition?params.content.where.condition.length > 0?'':'':'el-icon-search'" v-model="params.content.where.condition" @keyup.native.enter="productsData(params.content.pageNumber = 1)" @clear="productsData(params.content.pageNumber = 1)" size="small" class="input-with-select inline-16 layout_search__panel" clearable>
+          </el-input>
+        </div>
+
+        <selectClass ref="class" @clickAreaBase="clickAreaBase" @brandChange="brandChange" @onClassChange="onClassChange" @Search="Search" @clearSearch="clearSearch" @clickField="clickField" :default="true"></selectClass>
+        <div>
+          <tablelayout :layout="tablecols" :data="productsList" :custom="true" :checkbox="true" height="calc(100vh - 392px)" @checkboxCallBack="checkboxCallBack">
+            <template v-slot:customcol="scope">
+              <div v-if="scope.column.columnname === 'province'">
+                <span>{{scope.column.data.province}} - {{scope.column.data.city}} - {{scope.column.data.county}}</span>
+              </div>
+              <div v-else-if="scope.column.columnname === 'isonsale'" :style="{color:scope.column.data[scope.column.columnname] === 1?tool.getStatusColor('上架',true):tool.getStatusColor('下架',true)}">
+                <span>{{scope.column.data.isonsale ? $t('上架') : $t('下架')}}</span>
+              </div>
+              <p v-else-if="scope.column.columnname === 'status'">
+                <span :style="tool.getStatusColor(scope.column.data[[scope.column.columnname]])">{{$t(scope.column.data[[scope.column.columnname]])}}</span>
+              </p>
+              <p v-else-if="scope.column.columnname === 'itemclass'">
+                <span v-if="JSON.stringify(scope.column.data.itemclass) !== '[]' && scope.column.data.itemclass">
+                   <span v-for="item in scope.column.data.itemclass" :key="item.index">
+                     <el-tag style="margin-right: 10px;margin-top: 5px;margin-bottom: 5px" type="success">{{$t(item.itemclassfullname)}}</el-tag>
+                  </span>
+                </span>
+                <span v-else>
+                  --
+                </span>
+              </p>
+              <div v-else-if="scope.column.columnname === 'nominalpressure'">
+                {{tool.nominalPressureSet(scope.column.data.nominalpressure)}}
+              </div>
+              <div v-else>{{scope.column.columnname === 'operation' || scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname] : '--'}}</div>
+            </template>
+
+          </tablelayout>
+
+        </div>
+        <div>
+          <div style="margin-top: 10px;float: left">{{$t(`已选`)}} {{selected}} {{$t(`个商品,共`)}} {{total}} {{$t(`个商品`)}}</div>
+          <div  style="margin-top: 10px;text-align:right">
+            <el-pagination
+                background
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+                :current-page="params.content.pageNumber"
+                :page-sizes="[20, 50, 100, 200]"
+                layout="total,sizes, prev, pager, next, jumper"
+                :total="total">
+            </el-pagination>
+          </div>
+        </div>
+        <div class="dialog-footer">
+          <el-button size="small" @click="drawer = false" class="normal-btn-width">{{$t(`取消`)}}</el-button>
+          <el-button size="small" type="primary" @click="onSubmit"  class="normal-btn-width btn-primary">{{$t(`确定`)}}</el-button>
+        </div>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import tablelayout from '@/components/table/index2'
+import uploadAllData from '@/components/uploadAllData/index'
+import selectClass from '@/components/selectClass/index'
+export default {
+  name: "add",
+  props:["plm_technicalinfo_codeid"],
+  data(){
+    return {
+      drawer:false,
+      add:false,
+      placeholder:this.$t('商品名称'),
+      form:{
+        itemid:''
+      },
+      rules:{
+        itemid: [
+          { required: true, message: this.$t('档案名称不可为空'), trigger: 'blur' },
+        ],
+      },
+      productsList:[],
+      multipleSelection: [],
+      tablecols:[],
+      tableHieght:420,
+      selected:0,
+      total:0,
+      currentPage:0,
+      params:{
+        "id": 2025082514111602,
+        "content": {
+          "pageNumber":1,
+          "pageSize":20,
+          "where": {
+            "condition": "",
+            "standards": "",
+            "tradefield": "",
+            "sa_brandid": "",
+            "itemclassid": ""
+          }
+        }
+      }
+    }
+  },
+  components:{
+    tablelayout,
+    uploadAllData,
+    selectClass
+  },
+  mounted() {
+
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).addProductTable.tablecols
+  },
+  methods: {
+    onShow(){
+      this.drawer = true
+      this.productsData()
+    },
+    onClose(){
+      this.drawer = false
+      this.form.itemid=''
+    },
+    async productsData(){
+      const res = await this.$api.requested(this.params)
+      console.log(res)
+      this.productsList = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+    },
+    checkboxCallBack(val){
+      console.log(val)
+      this.multipleSelection = val;
+      this.selected = val.length
+
+    },
+    /*拉取数据*/
+    handlePullApi (pullApi) {
+      pullApi.content = JSON.parse(JSON.stringify(this.params.content))
+      pullApi.id = this.params.id
+    },
+    /*上传数据*/
+    handleUploadApi (uploadApi,data) {
+      uploadApi.id = 20220926102003
+      let arr = data.map(e=>{
+        return {
+          plm_technicalinfo_codeid:this.plm_technicalinfo_codeid,
+          itemid:e.itemid
+        }
+      })
+      uploadApi.content = {
+        "plm_technicalinfo_codeid":this.plm_technicalinfo_codeid,
+        "itemids":arr
+      }
+    },
+    async onSubmit(){
+      console.log(this.multipleSelection)
+      let arr = this.multipleSelection.map(item=>item.itemid)
+      const res = await this.$api.requested({
+        "id": "2025082514084802",
+        "content": {
+          "plm_technicalinfo_codeid":this.plm_technicalinfo_codeid,
+          "itemids":arr
+        }
+      })
+      this.tool.showMessage(res, () => {
+        this.drawer = false
+        this.$emit('addSuccess')
+      })
+    },
+    onSuccess () {
+      this.$emit('addSuccess')
+      this.drawer = false
+    },
+    searchActive(data) {
+      this.params.content.where.condition = data
+      this.productsData()
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.params.content.pageSize = val
+      this.productsData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.params.content.pageNumber = val
+      this.productsData()
+    },
+    clickAreaBase (item) {
+      this.params.content.where.standards = item
+      this.productsData()
+    },
+    brandChange(id) {
+      console.log(id);
+      this.brandId = id
+      this.$refs.class.clickClass(false)
+      // this.productsData()
+    },
+    onClassChange (n) {
+      this.params.content.where.itemclassid = n.itemclassid
+      this.productsData()
+    },
+    Search(data) {
+      this.params.content.where.condition = data
+      this.params.content.pageNumber = 1
+      this.productsData()
+    },
+    clearSearch() {
+      this.params.content.where.condition = ''
+      this.params.content.pageNumber = 1
+      this.productsData()
+    },
+    clickField (item) {
+      this.params.content.where.tradefield = item.tradefield
+      this.productsData()
+    },
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 70 - 0
src/HDrpManagement/codeManage/modules/relation.vue

@@ -0,0 +1,70 @@
+<template>
+  <div >
+    <div class="container normal-panel normal-margin">
+      <add :plm_technicalinfo_codeid="this.$route.query.id" @addSuccess="onSuccess" class="inline-16"></add>
+      <el-button type="primary" @click="onDeletes" size="small" :disabled="selectList.length == 0">{{$t(`批量删除`)}}</el-button>
+    </div>
+    <div class="container normal-panel " style="padding-top: 0px">
+      <relation_list ref="list" :id="this.$route.query.id" :checkbox="true" @selectionChange="selectionChange">
+        <template v-slot:del="scope">
+          <relationDel v-if="tool.checkAuth($route.name,'delete')" :data="scope.data" :type="'text'" @deleteSuccess="onSuccess"></relationDel>
+        </template>
+      </relation_list>
+    </div>
+  </div>
+</template>
+
+<script>
+import relation_list from './relationList'
+import add from './add'
+import relationDel from './relationDel'
+export default {
+  name: "relation",
+  data() {
+    return {
+      selectList:[]
+    }
+  },
+  components:{
+    relation_list,
+    add,
+    relationDel
+  },
+  methods:{
+    onSuccess(){
+      this.$refs.list.listData(this.$refs.list.params.content.pageNumber = 1)
+    },
+    selectionChange(data){
+      this.selectList = []
+      this.selectList = data.map(item=>item.plm_technicalinfo_code_itemid)
+    },
+    onDeletes(){
+      this.$confirm(this.$t('是否确认批量删除关联商品')+'?', this.$t('提示'), {
+        confirmButtonText: this.$t('确定'),
+        cancelButtonText: this.$t('取消'),
+        type: 'warning'
+      }).then(async () => {
+        const res = await this.$api.requested({
+          "id": "2025082514092302",
+          "content": {
+            "plm_technicalinfo_code_itemids": this.selectList
+          },
+        })
+        this.tool.showMessage(res,()=>{
+          this.selectList = []
+          this.onSuccess()
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: this.$t('已取消删除')
+        });
+      });
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 33 - 0
src/HDrpManagement/codeManage/modules/relationDel.vue

@@ -0,0 +1,33 @@
+<template>
+  <div class="inline-16">
+    <el-popconfirm :confirm-button-text="$t('确定')" :cancel-button-text="$t('取消')"
+        :title="$t(`确定删除此商品吗`)+'?'"
+        @confirm="deleteRow()">
+      <el-button slot="reference" size="small" type="text">{{$t('删 除')}}</el-button>
+    </el-popconfirm>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "relationDel",
+  props:['data'],
+  methods:{
+    async deleteRow() {
+      const res = await this.$api.requested({
+        "id": "2025082514092302",
+        "content": {
+          "plm_technicalinfo_code_itemids":[this.data.plm_technicalinfo_code_itemid]
+        }
+      })
+      this.tool.showMessage(res, () => {
+        this.$emit('deleteSuccess')
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 121 - 0
src/HDrpManagement/codeManage/modules/relationList.vue

@@ -0,0 +1,121 @@
+<template>
+  <div>
+    <search :placeholder="placeholder" @searchActive="searchActive"></search>
+    <table-new-layout :layout="tablecols" :data="list" :checkbox="checkbox" :opwidth="200" :custom="true" :width="true" :height="list.length <= 5?'300px':tableHieght" @selectionChange="selectionChange">
+      <template v-slot:customcol="scope">
+        <div v-if="scope.column.columnname === 'isonsale' " :style="{color:scope.column.data[scope.column.columnname] === 1?tool.getStatusColor('上架',true):tool.getStatusColor('下架',true)}">
+          <span v-if="scope.column.data[scope.column.columnname] === 0"
+          >{{$t(`下架`)}}
+          </span>
+          <span v-if="scope.column.data[scope.column.columnname] === 1"
+          >{{$t(`上架`)}}
+          </span>
+        </div>
+        <p v-else-if="scope.column.columnname === 'status'">
+          <span :style="tool.getStatusColor(scope.column.data[[scope.column.columnname]])">{{$t(scope.column.data[[scope.column.columnname]])}}</span>
+        </p>
+        <p v-else-if="scope.column.columnname === 'itemclass'">
+          <span v-if="JSON.stringify(scope.column.data.itemclass) !== '[]' && scope.column.data.itemclass">
+             <span v-for="item in scope.column.data.itemclass" :key="item.index">
+               <el-tag style="margin-right: 10px;margin-top: 5px;margin-bottom: 5px" type="success">{{$t(item.itemclassfullname)}}</el-tag>
+            </span>
+          </span>
+          <span v-else>
+            --
+          </span>
+        </p>
+        <div v-else-if="scope.column.columnname === 'nominalpressure'">
+          {{tool.nominalPressureSet(scope.column.data.nominalpressure)}}
+        </div>
+        <div v-else>{{scope.column.columnname === 'operation' || scope.column.data[scope.column.columnname]?scope.column.data[scope.column.columnname] : '--'}}</div>
+      </template>
+      <template v-slot:opreation="scope">
+        <div>
+          <slot name="del" :data="scope.data"></slot>
+        </div>
+      </template>
+    </table-new-layout>
+    <div style="margin-top:16px;text-align:right">
+      <el-pagination
+          background
+          small
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="currentPage"
+          :page-size="params.content.pageSize"
+          layout="total, prev, pager, next, jumper"
+          :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import search from './search'
+export default {
+  name: "relationList",
+  props:["id","checkbox"],
+  data(){
+    return {
+      placeholder:this.$t('商品名称'),
+      tableHieght:'calc(100vh - 210px)',
+      list:[],
+      tablecols:[],
+      total:0,
+      currentPage:0,
+      params:{
+        "id": "2025082514100702",
+        "content": {
+          "plm_technicalinfo_codeid":this.id,
+          "pageSize":20,
+          "pageNumber":1,
+          "where":{
+            "condition":"",
+          }
+        }
+      }
+    }
+  },
+  components:{
+    search
+  },
+  mounted() {
+    this.listData()
+  },
+  methods:{
+    async listData(){
+      const res = await this.$api.requested(this.params)
+      this.list = res.data
+      this.total = res.total
+      this.currentPage = res.pageNumber
+      console.log(this.currentPage);
+
+      console.log(res)
+    },
+    handleSizeChange(val) {
+      // console.log(`每页 ${val} 条`);
+      this.params.content.pageSize = val
+      this.listData()
+    },
+    handleCurrentChange(val) {
+      // console.log(`当前页: ${val}`);
+      this.params.content.pageNumber = val
+      this.listData()
+    },
+    searchActive(data){
+      this.params.content.where.condition = data
+      this.listData()
+    },
+    selectionChange(list){
+      this.$emit('selectionChange',list)
+    }
+  },
+  created() {
+    this.tablecols = this.tool.tabelCol(this.$route.name).relationProductTable.tablecols
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 48 - 0
src/HDrpManagement/codeManage/modules/search.vue

@@ -0,0 +1,48 @@
+<template>
+  <div class="container border-bottom">
+    <span>{{$t(`搜索`)}}: </span>
+    <el-input
+        with="200"
+        type="text"
+        v-model="search"
+        :placeholder="placeholder"
+        size="small"
+        clearable
+        @searchActive="queryClick"
+        @keyup.enter.native="queryClick()"
+        @clear="queryClick"
+    >
+      <i slot="prefix" class="el-icon-search"  @click="queryClick()"></i>
+    </el-input>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "search",
+  props:["placeholder"],
+  data() {
+    return {
+      search:'',
+    }
+  },
+  methods: {
+    queryClick(){
+      this.$emit('searchActive',this.search)
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+  .el-input {
+    width: 200px;
+    margin-right: 16px;
+  }
+  /deep/.el-input__prefix {
+    display: flex;
+    align-items: center;
+  }
+
+</style>

+ 13 - 0
src/HDrpManagement/prodectFileData/components/codeToFile.vue

@@ -0,0 +1,13 @@
+<template>
+  <div>{{'展示数据1111'}}</div>
+</template>
+
+<script>
+export default {
+  name: "codeToFile"
+}
+</script>
+
+<style scoped>
+
+</style>

+ 4 - 1
src/HDrpManagement/prodectFileData/index.vue

@@ -17,8 +17,11 @@
         <p v-if="scope.data.column.columnname == 'downloadqty' || scope.data.column.columnname == 'readqty'">
           {{scope.data.column.data[scope.data.column.columnname]?scope.data.column.data[scope.data.column.columnname]:'0'}}
         </p>
+        <div v-else-if="scope.data.column.columnname == 'isout'">
+          {{scope.data.column.data[scope.data.column.columnname]?'是':'否'}}
+        </div>
         <div v-else>
-          {{$t(scope.data.column.data[scope.data.column.columnname])}}
+          {{scope.data.column.data[scope.data.column.columnname]}}
         </div>
       </template>
       <template v-slot:tbOpreation="scope">

+ 13 - 3
src/HDrpManagement/prodectFileData/modules/add.vue

@@ -25,6 +25,12 @@
                 </el-select>
               </el-form-item>
             </el-col>
+            <el-col :span="24">
+              <el-form-item :label="$t(`是否对外`)+':'">
+                <el-radio v-model="form.isout" :label="1">{{$t(`是`)}}</el-radio>
+                <el-radio v-model="form.isout" :label="0">{{$t(`否`)}}</el-radio>
+              </el-form-item>
+            </el-col>
             <el-col :span="24">
               <el-form-item  :label="$t(`资料说明`)+':'">
                 <el-input type="textarea" rows="5" v-model="form.remarks" :placeholder="$t(`输入资料说明`)"></el-input>
@@ -66,6 +72,7 @@ export default {
       form:{
         type:'',
         remarks:'',
+        isout:0,
         attinfos:[]
       },
       options: [],
@@ -111,7 +118,8 @@ export default {
           "content": {
             "plm_technicalinfoid":0,
             "type":this.form.type,
-            "remarks":this.form.remarks
+            "remarks":this.form.remarks,
+            "isout":this.form.isout
           }
         })
         this.tool.showMessage(res,() => {
@@ -123,7 +131,8 @@ export default {
           this.form = {
             type:'',
             remarks:'',
-            attinfos:[]
+            attinfos:[],
+            isout:0,
           }
           this.$emit('onSuccess')
         })
@@ -139,7 +148,8 @@ export default {
       this.form = {
         type:'',
         remarks:'',
-        attinfos:[]
+        attinfos:[],
+        isout:0,
       }
       this.listFiles = this.$refs.list.list
       this.batchDeletion()

+ 8 - 1
src/HDrpManagement/prodectFileData/modules/edit.vue

@@ -23,6 +23,12 @@
                 </el-select>
               </el-form-item>
             </el-col>
+            <el-col :span="24">
+              <el-form-item :label="$t(`是否对外`)+':'">
+                <el-radio v-model="form.isout" :label="1">{{$t(`是`)}}</el-radio>
+                <el-radio v-model="form.isout" :label="0">{{$t(`否`)}}</el-radio>
+              </el-form-item>
+            </el-col>
             <el-col :span="24">
               <el-form-item  :label="$t(`资料说明`)+':'">
                 <el-input type="textarea" rows="5" v-model="form.remarks" :placeholder="$t(`输入资料说明`)"></el-input>
@@ -108,7 +114,8 @@ export default {
           "content": {
             "plm_technicalinfoid":this.form.plm_technicalinfoid,
             "type":this.form.type,
-            "remarks":this.form.remarks
+            "remarks":this.form.remarks,
+            "isout":this.form.isout
           }
         })
         this.tool.showMessage(res,() => {

+ 2 - 1
src/HManagement/archives_sc/components/Rpanel.vue

@@ -34,6 +34,7 @@ export default {
       this.$router.push({path:this.detailPath.path,query:{id:this.id}})
     },
     closeDrawer () {
+      this.$emit('closeDrawer')
       this.$router.back()
     }
   },
@@ -55,4 +56,4 @@ export default {
   color:#666;
   height:100vh;
 }
-</style>
+</style>

BIN
src/assets/icons/bnBag.png


+ 47 - 0
src/components/btn-popconfirm/index.vue

@@ -0,0 +1,47 @@
+<template>
+  <div>
+    <el-popconfirm
+        :title="$t(message)"
+        @confirm="onClick"
+    >
+      <el-button slot="reference" type="text" size="small">{{$t(btnTitle)}}</el-button>
+    </el-popconfirm>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "index",
+  props:{
+    message:String,
+    btnTitle:String,
+    nameKey:String,
+    id:String,
+    paramID:String,
+    isNumber:Boolean
+  },
+  data(){
+    return {
+      param:{
+        id:this.paramID,
+        content:{
+          [this.nameKey]: [this.id]
+        }
+      }
+    }
+  },
+  methods:{
+    async onClick(){
+      this.param.content[this.nameKey] = this.isNumber ? this.id : [this.id];
+      const res = await this.$api.requested(this.param)
+      this.tool.showMessage(res, () => {
+        this.$emit("onSuccess");
+      });
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 21 - 0
src/router/HDrpManagement.js

@@ -230,6 +230,27 @@ const HDrpManagement = [
         component: () => import(/* webpackChunkName: "about" */ '@/HDrpManagement/prodectFileData/modules/relation')
       }
     ]
+  },{
+    path: '/codeManage',
+    name: 'codeManage',
+    meta: {
+      title: '资料二维码管理',
+      ast_nav: true,
+      keeproute: true,
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/HDrpManagement/codeManage/index'),
+    children: [
+      {
+        path: '/relationCode',
+        name:'codeManage',
+        meta: {
+          title: '资料二维码管理关联商品',
+          ast_nav: true,
+          keeproute: true,
+        },
+        component: () => import(/* webpackChunkName: "about" */ '@/HDrpManagement/codeManage/modules/relation')
+      }
+    ]
   },{
     path: '/accountclass',
     name: 'accountclass',

+ 1 - 1
src/router/index.js

@@ -24,7 +24,6 @@ let routes = [
     name: 'login',
     component: () => import(/* webpackChunkName: "about" */ '@/views/login/login.vue')
   },
-
   // {
   //   path: '/accounts',
   //   name: 'accounts',
@@ -161,6 +160,7 @@ let routes = [
   },
 ];
 
+
 routes[2].children = [...routes[2].children,...HManagement,...SManagement,...HDrpManagement,...SDrpManagement,...WebsiteManagement,...OptionSystem]
 
 const router = new VueRouter({

Някои файлове не бяха показани, защото твърде много файлове са промени