sakura 1 rok pred
rodič
commit
db4b260d42
45 zmenil súbory, kde vykonal 568 pridanie a 302 odobranie
  1. 1 1
      manager-admin/dist/index.html
  2. 0 0
      manager-admin/dist/static/js/11.2dcec49040835ba0b16c.js
  3. BIN
      manager-admin/dist/static/js/11.2dcec49040835ba0b16c.js.gz
  4. 0 0
      manager-admin/dist/static/js/11.3e2f1e84951772407bb8.js
  5. BIN
      manager-admin/dist/static/js/11.3e2f1e84951772407bb8.js.gz
  6. 0 0
      manager-admin/dist/static/js/28.120e7c8815cb341a7184.js
  7. 0 0
      manager-admin/dist/static/js/28.4a5a3baa8d0a4a7f625a.js
  8. BIN
      manager-admin/dist/static/js/28.4a5a3baa8d0a4a7f625a.js.gz
  9. 0 0
      manager-admin/dist/static/js/29.4e1b501fd0aaa462ce84.js
  10. 0 0
      manager-admin/dist/static/js/30.34eae4c2a5e4ca1bcc88.js
  11. BIN
      manager-admin/dist/static/js/30.34eae4c2a5e4ca1bcc88.js.gz
  12. 0 0
      manager-admin/dist/static/js/31.841171d5136196198647.js
  13. 0 0
      manager-admin/dist/static/js/32.5508362fbd952fc94176.js
  14. 0 0
      manager-admin/dist/static/js/33.9d92479795f8827d958d.js
  15. 0 0
      manager-admin/dist/static/js/34.8b3706995abeda6f71c3.js
  16. 0 0
      manager-admin/dist/static/js/35.3f05c466a6b7dcabf4c4.js
  17. 0 0
      manager-admin/dist/static/js/36.c36caf87a7e1dde3b216.js
  18. BIN
      manager-admin/dist/static/js/36.c36caf87a7e1dde3b216.js.gz
  19. 0 0
      manager-admin/dist/static/js/37.b97aa3c1a3ee87ae599e.js
  20. 0 0
      manager-admin/dist/static/js/38.31bb6c8f34d8c1c39c5d.js
  21. 0 0
      manager-admin/dist/static/js/39.6b9992581ab3a8881822.js
  22. BIN
      manager-admin/dist/static/js/39.6b9992581ab3a8881822.js.gz
  23. BIN
      manager-admin/dist/static/js/40.018c74cd841eccabd3ab.js.gz
  24. 0 0
      manager-admin/dist/static/js/40.1fbc852f39da48a311b3.js
  25. 0 0
      manager-admin/dist/static/js/41.2914922109a5b9e8d90d.js
  26. BIN
      manager-admin/dist/static/js/41.2914922109a5b9e8d90d.js.gz
  27. 0 0
      manager-admin/dist/static/js/app.3553af482c8b713c4bdd.js
  28. BIN
      manager-admin/dist/static/js/app.3553af482c8b713c4bdd.js.gz
  29. 0 0
      manager-admin/dist/static/js/app.9287c4a5daa55edc8079.js
  30. BIN
      manager-admin/dist/static/js/app.9287c4a5daa55edc8079.js.gz
  31. 0 0
      manager-admin/dist/static/js/manifest.ce3bf886a15ba65fc256.js
  32. 1 1
      manager-admin/src/api/goodsExchange.js
  33. 11 16
      manager-admin/src/components/SkuEditor/src/helper.js
  34. 277 147
      manager-admin/src/components/SkuEditor/src/main.vue
  35. 1 1
      manager-admin/src/router/index.js
  36. 0 1
      manager-admin/src/store/modules/permission.js
  37. 12 5
      manager-admin/src/views/basicSetting/goods/editForm/BasicInfo.vue
  38. 12 2
      manager-admin/src/views/basicSetting/goods/editForm/Sku.vue
  39. 66 45
      manager-admin/src/views/basicSetting/goods/editForm/index.vue
  40. 63 15
      manager-admin/src/views/basicSetting/goods/index.vue
  41. 99 62
      manager-admin/src/views/layout/components/TagsView.vue
  42. 1 1
      manager-admin/src/views/setting/auth-settings/administratorManage.vue
  43. 15 3
      manager-admin/src/views/stock/goodsExchange/addInventory.vue
  44. 5 1
      manager-admin/src/views/stock/orderAdd.vue
  45. 4 1
      ui-utils/RegExp.js

+ 1 - 1
manager-admin/dist/index.html

@@ -1,3 +1,3 @@
 <!DOCTYPE html><html><head><meta charset=utf-8><script>var ua = window.navigator.userAgent
     var isIe = /MSIE|Trident/.test(ua)
-    // if (isIe) window.location.href = 'http://support.dmeng.net/upgrade-your-browser.html?referrer=' + encodeURIComponent(window.location.href)</script><script src=/static/js/envs.js></script><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=renderer content=webkit><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>erp</title><link rel="shortcut icon" href=/favicon.ico><link href=/static/css/app.815a74b205cd3494376a9cf54a3f994e.css rel=stylesheet></head><body><div id=app><div style="display: flex;width: 100vw;height: 100vh;justify-content:center;align-items:center"><img src=/static/img/index.ripple-radio-preloader.gif alt=""></div></div><script src=/static/js/jquery.min.js></script><script src=/static/js/xlsx.full.min.js></script><script src=/static/js/echarts.min.js></script><script src=/static/js/base64.min.js></script><script src=/static/js/psl.min.js></script><script src=/static/UE/ueditor.config.js></script><script src=/static/UE/ueditor.all.js></script><script src=/static/UE/lang/zh-cn/zh-cn.js></script><script src=/static/UE/ueditor.parse.js></script><script src="//webapi.amap.com/maps?v=2.0&key=a4553619077791eb0a6df2f450b9a03b&plugin=AMap.CircleEditor"></script><script src=//webapi.amap.com/ui/1.1/main.js></script><script type=text/javascript src=/static/js/manifest.184c5fd713da302470fb.js></script><script type=text/javascript src=/static/js/vendor.361fd1e9b131d10f0628.js></script><script type=text/javascript src=/static/js/app.3553af482c8b713c4bdd.js></script></body></html>
+    // if (isIe) window.location.href = 'http://support.dmeng.net/upgrade-your-browser.html?referrer=' + encodeURIComponent(window.location.href)</script><script src=/static/js/envs.js></script><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=renderer content=webkit><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>erp</title><link rel="shortcut icon" href=/favicon.ico><link href=/static/css/app.815a74b205cd3494376a9cf54a3f994e.css rel=stylesheet></head><body><div id=app><div style="display: flex;width: 100vw;height: 100vh;justify-content:center;align-items:center"><img src=/static/img/index.ripple-radio-preloader.gif alt=""></div></div><script src=/static/js/jquery.min.js></script><script src=/static/js/xlsx.full.min.js></script><script src=/static/js/echarts.min.js></script><script src=/static/js/base64.min.js></script><script src=/static/js/psl.min.js></script><script src=/static/UE/ueditor.config.js></script><script src=/static/UE/ueditor.all.js></script><script src=/static/UE/lang/zh-cn/zh-cn.js></script><script src=/static/UE/ueditor.parse.js></script><script src="//webapi.amap.com/maps?v=2.0&key=a4553619077791eb0a6df2f450b9a03b&plugin=AMap.CircleEditor"></script><script src=//webapi.amap.com/ui/1.1/main.js></script><script type=text/javascript src=/static/js/manifest.ce3bf886a15ba65fc256.js></script><script type=text/javascript src=/static/js/vendor.361fd1e9b131d10f0628.js></script><script type=text/javascript src=/static/js/app.9287c4a5daa55edc8079.js></script></body></html>

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/11.2dcec49040835ba0b16c.js


BIN
manager-admin/dist/static/js/11.2dcec49040835ba0b16c.js.gz


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/11.3e2f1e84951772407bb8.js


BIN
manager-admin/dist/static/js/11.3e2f1e84951772407bb8.js.gz


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/28.120e7c8815cb341a7184.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/28.4a5a3baa8d0a4a7f625a.js


BIN
manager-admin/dist/static/js/28.4a5a3baa8d0a4a7f625a.js.gz


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/29.4e1b501fd0aaa462ce84.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/30.34eae4c2a5e4ca1bcc88.js


BIN
manager-admin/dist/static/js/31.033792915cf9cbc4c988.js.gz → manager-admin/dist/static/js/30.34eae4c2a5e4ca1bcc88.js.gz


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/31.841171d5136196198647.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/32.5508362fbd952fc94176.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/33.9d92479795f8827d958d.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/34.8b3706995abeda6f71c3.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/35.3f05c466a6b7dcabf4c4.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/36.c36caf87a7e1dde3b216.js


BIN
manager-admin/dist/static/js/37.56dc3c0608153dbd3da9.js.gz → manager-admin/dist/static/js/36.c36caf87a7e1dde3b216.js.gz


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/37.b97aa3c1a3ee87ae599e.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/38.31bb6c8f34d8c1c39c5d.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/39.6b9992581ab3a8881822.js


BIN
manager-admin/dist/static/js/39.6b9992581ab3a8881822.js.gz


BIN
manager-admin/dist/static/js/40.018c74cd841eccabd3ab.js.gz


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/40.1fbc852f39da48a311b3.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/41.2914922109a5b9e8d90d.js


BIN
manager-admin/dist/static/js/41.2914922109a5b9e8d90d.js.gz


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/app.3553af482c8b713c4bdd.js


BIN
manager-admin/dist/static/js/app.3553af482c8b713c4bdd.js.gz


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/app.9287c4a5daa55edc8079.js


BIN
manager-admin/dist/static/js/app.9287c4a5daa55edc8079.js.gz


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
manager-admin/dist/static/js/manifest.ce3bf886a15ba65fc256.js


+ 1 - 1
manager-admin/src/api/goodsExchange.js

@@ -185,7 +185,7 @@ export function warehouseOut(parmas) {
 
 export function getGoodsInfo(params) {
   return request({
-    url: '/admin/erp/goods',
+    url: '/admin/erp/goods/getSkuByWarehouse',
     method: 'get',
     loaidng: false,
     params

+ 11 - 16
manager-admin/src/components/SkuEditor/src/helper.js

@@ -17,21 +17,19 @@ export const defaultParams = [
     key: 'sku',
     name: 'sku',
     // value: 0,
-    type: 'Number',
+    type: 'String',
     required: true,
-    reg: RegExp.money,
     batch: true
   },
-  {
+ {
     key: 'bar_code',
     name: '条码',
     // value: 0,
-    type: 'Number',
+    type: 'String',
     required: true,
-    reg: RegExp.money,
     batch: true
   },
-/*   {
+  /*  {
     key: 'sn_code',
     name: '序列号',
     // value: 0,
@@ -40,17 +38,17 @@ export const defaultParams = [
     reg: RegExp.money,
     batch: true
   }, */
-  {
-    key: 'price',
+/*   {
+    key: 'cost_price',
     name: '价格',
     // value: 0,
     type: 'Number',
     required: true,
     reg: RegExp.money,
     batch: true
-  },
+  }, */
   {
-    key: 'retail_price',
+    key: 'price',
     name: '售价',
     value: 0,
     type: 'Number',
@@ -58,7 +56,7 @@ export const defaultParams = [
     reg: RegExp.money,
     batch: true
   },
-  {
+ /* {
     key: 'cost_price',
     name: '成本价',
     value: 0,
@@ -67,7 +65,7 @@ export const defaultParams = [
     reg: RegExp.money,
     batch: true
   },
- /*  {
+   {
     key: 'mkt_price',
     name: '市场价',
     value: 0,
@@ -105,7 +103,7 @@ export const defaultParams = [
     key: 'day_price',
     name: '日租金',
     value: '',
-    type: 'String',
+    type: 'Number',
     required: true,
     batch: true
   },
@@ -195,7 +193,6 @@ export const mockSleep = timer => new Promise(resolve => setTimeout(resolve, tim
  * @returns {any}
  */
 export const cloneJson = (json) => JSON.parse(JSON.stringify(json))
-
 /**
  * 生成表格表单
  * @param selectedSpecs
@@ -209,9 +206,7 @@ export const makeTableForm = (selectedSpecs, params, skuList, haveSpec,hire_or_s
   // 插入参数的列
   params.forEach(param => {
     if(hire_or_sail=="sail" && param.name!=='日租金'){
-
        return tableHead.push(param)
-        console.log(tableHead);
     }else{
       let arr1=['sku','日租金','条码','序列号']
       arr1.map(el=>{

+ 277 - 147
manager-admin/src/components/SkuEditor/src/main.vue

@@ -14,11 +14,11 @@
           <span class="tip-label">提示:</span>
           <div class="tip-content">
             在输入框中输入不存在的规格或规格值后回车,即可添加自定义规格或规格值
-            <br/>
+            <br />
             只有第一个规格可以添加规格值图片
           </div>
         </div>
-        <template v-for="(sp, sp_index) in skuForm.selectedSpecs" >
+        <template v-for="(sp, sp_index) in skuForm.selectedSpecs">
           <el-form-item label="规格名:" class="spec-name">
             <el-select
               v-model="sp.spec_id"
@@ -33,26 +33,51 @@
                 :disabled="computedDisabledSpec(option.spec_id)"
               />
             </el-select>
-            <el-button icon="el-icon-delete" class="del-btn" @click="handleDeleteSpec(sp_index)"/>
-            <el-checkbox v-if="sp_index === 0" label="规格图片" v-model="sp.has_spec_image"/>
+            <el-button
+              icon="el-icon-delete"
+              class="del-btn"
+              @click="handleDeleteSpec(sp_index)"
+            />
+            <el-checkbox
+              v-if="sp_index === 0"
+              label="规格图片"
+              v-model="sp.has_spec_image"
+            />
           </el-form-item>
-          <el-form-item label="规格值:" class="spec-values" :class="{'no-spec-val': sp.spec_value_list.length === 0}">
-            <div v-for="(sv, sv_index) in sp.spec_value_list" :key="sv_index" class="spec-value-item">
+          <el-form-item
+            label="规格值:"
+            class="spec-values"
+            :class="{ 'no-spec-val': sp.spec_value_list.length === 0 }"
+          >
+            <div
+              v-for="(sv, sv_index) in sp.spec_value_list"
+              :key="sv_index"
+              class="spec-value-item"
+            >
               <div class="spec-value-select">
                 <el-select
                   v-model="sv.spec_value_id"
                   default-first-option
-                  @change="spec_val_id => handleSpecValChange(sp.spec_id, spec_val_id)"
+                  @change="
+                    (spec_val_id) =>
+                      handleSpecValChange(sp.spec_id, spec_val_id)
+                  "
                 >
                   <el-option
                     v-for="option in getSpecValueList(sp.spec_id)"
                     :key="option.spec_value_id"
                     :label="option.spec_value"
                     :value="option.spec_value_id"
-                    :disabled="computedDisabledSpecVal(sp.spec_id, option.spec_value_id)"
+                    :disabled="
+                      computedDisabledSpecVal(sp.spec_id, option.spec_value_id)
+                    "
                   />
                 </el-select>
-                <el-button icon="el-icon-delete" class="del-btn" @click="handleDeleteSpecVal(sp_index, sv_index)"/>
+                <el-button
+                  icon="el-icon-delete"
+                  class="del-btn"
+                  @click="handleDeleteSpecVal(sp_index, sv_index)"
+                />
               </div>
               <el-form-item
                 label=""
@@ -64,8 +89,13 @@
                   accept="image/*"
                   list-type="picture-card"
                   :action="MixinUploadApi"
-                  :file-list="sv.spec_image ? [{ url: sv.spec_image }] : undefined"
-                  :on-success="file => handleSpecValImgUploadSuccess(sp_index, sv_index, file)"
+                  :file-list="
+                    sv.spec_image ? [{ url: sv.spec_image }] : undefined
+                  "
+                  :on-success="
+                    (file) =>
+                      handleSpecValImgUploadSuccess(sp_index, sv_index, file)
+                  "
                   :on-remove="() => handleSpecValImgRemove(sp_index, sv_index)"
                   :limit="1"
                   class="spec-value-upload"
@@ -74,9 +104,19 @@
                 </el-upload>
               </el-form-item>
             </div>
-            <div class="spec-value-item" :class="{'has-img': sp.has_spec_image}">
-              <el-button v-if="sp.spec_id" type="text" @click="handleAddSpecVal(sp_index)">添加规格值</el-button>
-              <span v-else style="color: #999; font-size: 12px">请选择规格</span>
+            <div
+              class="spec-value-item"
+              :class="{ 'has-img': sp.has_spec_image }"
+            >
+              <el-button
+                v-if="sp.spec_id"
+                type="text"
+                @click="handleAddSpecVal(sp_index)"
+                >添加规格值</el-button
+              >
+              <span v-else style="color: #999; font-size: 12px"
+                >请选择规格</span
+              >
             </div>
           </el-form-item>
         </template>
@@ -93,22 +133,32 @@
             <span>{{ formatterSpecText(row) }}</span>
           </template>
         </el-table-column>
+        <!--  -->
         <el-table-column label="序列号" align="center" v-if="haveSn">
           <template v-slot="{ row }">
-              <el-input
+            <el-input
               onKeyUp="value=value.replace(/[\W]/g,'')"
               v-model="row.sn_code"
               :controls="false"
               :max="99999999"
               style="width: 95%"
-              />
+            />
           </template>
         </el-table-column>
-        <el-table-column v-for="item in tableColumns" :key="item.key" align="center">
+        <el-table-column
+          v-for="item in tableColumns"
+          :key="item.key"
+          align="center"
+        >
           <template v-slot:header="{ row }">
             <div>
               <span>{{ item.name }}</span>
-              <el-tooltip v-if="!!item.tip" effect="dark" :content="item.tip" placement="top">
+              <el-tooltip
+                v-if="!!item.tip"
+                effect="dark"
+                :content="item.tip"
+                placement="top"
+              >
                 <i class="el-icon-warning" style="cursor: help"></i>
               </el-tooltip>
               <el-popover
@@ -123,11 +173,14 @@
                   label-position="right"
                   @submit.native.prevent
                 >
-                  <el-form-item v-if="item.batchForm.prefix !== false" label="前缀字符">
+                  <el-form-item
+                    v-if="item.batchForm.prefix !== false"
+                    label="前缀字符"
+                  >
                     <el-input
                       v-model="item.batchForm.prefix"
                       :maxlength="20"
-                      style="width: 100px;"
+                      style="width: 100px"
                       placeholder="选填"
                     />
                   </el-form-item>
@@ -148,7 +201,10 @@
                       style="width: 100px"
                     />
                   </el-form-item>
-                  <el-form-item v-if="item.batchForm.step !== false" label="递增步长">
+                  <el-form-item
+                    v-if="item.batchForm.step !== false"
+                    label="递增步长"
+                  >
                     <el-input-number
                       v-model="item.batchForm.step"
                       :controls="false"
@@ -157,7 +213,10 @@
                       placeholder="选填"
                     />
                   </el-form-item>
-                  <el-form-item v-if="item.batchForm.pad_zero !== false" label="补零位数">
+                  <el-form-item
+                    v-if="item.batchForm.pad_zero !== false"
+                    label="补零位数"
+                  >
                     <el-input-number
                       v-model="item.batchForm.pad_zero"
                       :controls="false"
@@ -168,20 +227,29 @@
                   </el-form-item>
                 </el-form>
                 <div style="text-align: right; margin: 0">
-                  <el-button size="mini" type="text" @click="item.show_batch = false">取消</el-button>
-                  <el-button type="primary" size="mini" @click="handleBatchSetSkuParams(item)">确定</el-button>
+                  <el-button
+                    size="mini"
+                    type="text"
+                    @click="item.show_batch = false"
+                    >取消</el-button
+                  >
+                  <el-button
+                    type="primary"
+                    size="mini"
+                    @click="handleBatchSetSkuParams(item)"
+                    >确定</el-button
+                  >
                 </div>
                 <i slot="reference" class="el-icon-brush batch-btn"></i>
               </el-popover>
-
             </div>
           </template>
           <template v-slot="{ row, $index }">
-            <span v-if="item.readonly">{{ row[item.key] || '-' }}</span>
+            <span v-if="item.readonly">{{ row[item.key] || "-" }}</span>
             <el-form-item
               v-else
               :prop="`skuList.${$index}.${item.key}`"
-              :class="{'hide-message': !showFormMessage}"
+              :class="{ 'hide-message': !showFormMessage }"
             >
               <el-input-number
                 v-if="item.type === 'Number'"
@@ -207,55 +275,59 @@
 </template>
 
 <script>
-import * as Helper from './helper'
+import * as Helper from "./helper";
 
 export default {
-  name: 'SkuEditor',
+  name: "SkuEditor",
   props: {
     // 扩展参数
     extendedParams: {
       type: Array,
       required: false,
-      default: () => ([])
+      default: () => [],
     },
     // 显示表单错误信息
     showFormMessage: {
       type: Boolean,
       required: false,
-      default: false
+      default: false,
     },
     // 是否显示Label
     showLabel: {
       type: Boolean,
       required: false,
-      default: true
+      default: true,
     },
     // 是否显示规格
     showSpecs: {
       type: Boolean,
       required: false,
-      default: true
+      default: true,
     },
     categoryId: {
       type: String,
-      default: ''
+      default: "",
     },
     goodsInfo: {
       type: Object,
-      default: {}
+      default: {},
     },
     haveSpec: {
       type: Boolean,
-      default: false
+      default: false,
     },
     haveSn: {
       type: Boolean,
-      default: false
+      default: false,
+    },
+    hireOrSail: {
+      type: String,
+      default: "",
+    },
+    sku_sn: {
+      type: String,
+      default: "",
     },
-    hireOrSail:{
-      type:String,
-      default: ""
-    }
   },
   data() {
     return {
@@ -263,169 +335,208 @@ export default {
       // goodsInfo: '',
       skuForm: {
         selectedSpecs: [],
-        skuList: []
+        skuList: [],
       },
       specList: [],
       tableColumns: [],
-      rawSkuList: []
-    }
+      rawSkuList: [],
+    };
   },
   computed: {
     params() {
-      return Helper.mergeParams(this.extendedParams, this.haveSpec)
+      return Helper.mergeParams(this.extendedParams, this.haveSpec);
     },
     skuRules() {
-      return Helper.computedSkuRules(this.skuForm, this.params)
-    }
+      return Helper.computedSkuRules(this.skuForm, this.params);
+    },
   },
   mounted() {
-    this.init()
+    this.init();
   },
   watch: {
     // 监听已选规格,自动生成表单
-    'skuForm.selectedSpecs': {
+    "skuForm.selectedSpecs": {
       deep: true,
-      handler: 'makeTableForm'
+      handler: "makeTableForm",
     },
     haveSpec: {
       handler(val) {
-        this.skuForm.selectedSpecs = []
-        this.skuForm.skuList = []
-      }
+        if(val){
+          //this.skuForm.skuList = [{}]
+        }else{
+          //this.skuForm.skuList = [{sku:sessionStorage.getItem('sn')+'0000'}];
+        }
+        this.skuForm.selectedSpecs = [];
+        this.skuForm.skuList = [];
+      },
     },
     categoryId: {
       handler(val) {
         if (val) {
-          this.getSpecList()
+          this.getSpecList();
         }
       },
-      immediate: true
+      immediate: true,
     },
     goodsInfo: {
       handler(val) {
         if (val.product_list) {
-          this.init()
+          this.init();
         }
       },
-      immediate: true
+      immediate: true,
+    },
+    sku_sn:{
+      handler(val) {
+          //this.skuForm.skuList = [{sku:sessionStorage.getItem('sn')+'0000'}];
+      },
     }
   },
   methods: {
     // 初始化数据
     async init() {
       try {
-        this.loading = true
-        const goodsInfo = this.goodsInfo
+        this.loading = true;
+        const goodsInfo = this.goodsInfo;
+        console.log('goodsInfo',this.goodsInfo);
         if (goodsInfo.product_list) {
           // 获取规格列表
-          this.getSpecList()
-          this.skuForm.skuList = Helper.cloneJson(goodsInfo.product_list)
-          this.rawSkuList = Helper.cloneJson(goodsInfo.product_list)
+          this.getSpecList();
+          this.skuForm.skuList = Helper.cloneJson(goodsInfo.product_list);
+          this.rawSkuList = Helper.cloneJson(goodsInfo.product_list);
           // 初始化商品SKU中已选择的规格信息
-          this.skuForm.selectedSpecs = Helper.initSelectedSpecs(this.skuForm.skuList)
+          this.skuForm.selectedSpecs = Helper.initSelectedSpecs(this.skuForm.skuList);
         }
         if (!this.haveSpec) {
-          this.makeTableForm()
+          this.makeTableForm();
         }
       } finally {
-        this.loading = false
+        this.loading = false;
       }
     },
     // 获取规格列表
     async getSpecList() {
-      const category_id = this.goodsInfo.category_id || this.categoryId
-      await Helper.getSpecsByCategoryId(category_id).then(res => {
-        this.specList = res
-        this.makeTableForm()
-      })
+      const category_id = this.goodsInfo.category_id || this.categoryId;
+      await Helper.getSpecsByCategoryId(category_id).then((res) => {
+        this.specList = res;
+        this.makeTableForm();
+      });
     },
     // 获取商品sku信息
     async getSkuList() {
-      // const skuList = await Helper.getGoodsSkus(this.goodsId)
-      this.skuForm.skuList = Helper.cloneJson(skuList)
-      this.rawSkuList = Helper.cloneJson(skuList)
+       const skuList = await Helper.getGoodsSkus(this.goodsId)
+      this.skuForm.skuList = Helper.cloneJson(skuList);
+      this.rawSkuList = Helper.cloneJson(skuList);
     },
     // 生成表格表单
     makeTableForm() {
-      const specs = Helper.getSelectedSpecsFormSpecList(this.skuForm.selectedSpecs, this.specList)
-      const table = Helper.makeTableForm(specs, this.params, this.skuForm.skuList, this.haveSpec,this.hireOrSail)
-      if(this.hireOrSail=='sail'){
-        this.tableColumns = table.columns.filter(el=>{
-          return this.hireOrSail=='sail'&&el.name!=='日租金'
-        })
-      }else{
-        this.tableColumns = table.columns
+      const specs = Helper.getSelectedSpecsFormSpecList(
+        this.skuForm.selectedSpecs,
+        this.specList
+      );
+      const table = Helper.makeTableForm(
+        specs,
+        this.params,
+        this.skuForm.skuList,
+        this.haveSpec,
+        this.hireOrSail
+      );
+      /**/ if (this.hireOrSail == "sail") {
+        this.tableColumns = table.columns.filter((el) => {
+          return this.hireOrSail == "sail" && el.name !== "日租金";
+        });
+      } else {
+    this.tableColumns = table.columns;
+
       }
-       console.log(this.tableColumns);
-      this.skuForm.skuList = table.data
+      this.skuForm.skuList = table.data;
       //如果是单规格,不用选择规格,默认给一个sku
-      if(!this.haveSpec) {
-        this.skuForm.skuList = [{}]
-      }
+      /* if (!this.haveSpec) {
+        this.skuForm.skuList = [{}];
+      } */
     },
     // 获取规格下的规格值列表
     getSpecValueList(spec_id) {
-      const specVal = this.specList.find(item => item.spec_id === spec_id)
-      return specVal ? specVal.value_list : []
+      const specVal = this.specList.find((item) => item.spec_id === spec_id);
+      return specVal ? specVal.value_list : [];
     },
     // 计算要禁用的规格
     computedDisabledSpec(spec_id) {
-      return this.skuForm.selectedSpecs.map(item => item.spec_id).includes(spec_id)
+      return this.skuForm.selectedSpecs
+        .map((item) => item.spec_id)
+        .includes(spec_id);
     },
     // 计算要禁用的规格值
     computedDisabledSpecVal(spec_id, spec_value_id) {
-      return this.skuForm
-        .selectedSpecs.find(item => item.spec_id === spec_id)
-        .spec_value_list.map(item => item.spec_value_id)
-        .includes(spec_value_id)
+      return this.skuForm.selectedSpecs
+        .find((item) => item.spec_id === spec_id)
+        .spec_value_list.map((item) => item.spec_value_id)
+        .includes(spec_value_id);
     },
     // 添加规格
     handleAddSpec() {
       if (!this.goodsInfo.category_id && !this.categoryId) {
-        this.$message.error('请先选择商品类别!')
-        return
+        this.$message.error("请先选择商品类别!");
+        return;
       }
-      this.skuForm.selectedSpecs.push({ spec_id: '', has_spec_image: false, spec_value_list: [] })
+      this.skuForm.selectedSpecs.push({
+        spec_id: "",
+        has_spec_image: false,
+        spec_value_list: [],
+      });
     },
     // 添加规格值
     handleAddSpecVal(index) {
-      this.skuForm.selectedSpecs[index].spec_value_list.push({ spec_value_id: '' })
+      this.skuForm.selectedSpecs[index].spec_value_list.push({
+        spec_value_id: "",
+        spec_name:""
+      });
     },
     // 规格发生改变
     async handleSpecChange(spec_id) {
-      let spec = this.specList.find(sp => sp.spec_id === spec_id)
-      const selectedSpec = this.skuForm.selectedSpecs.find(sp => sp.spec_id === spec_id)
-      selectedSpec.spec_id = spec.spec_id
-      selectedSpec.spec_value_list = []
+      let spec = this.specList.find((sp) => sp.spec_id === spec_id);
+      const selectedSpec = this.skuForm.selectedSpecs.find(
+        (sp) => sp.spec_id === spec_id
+      );
+      selectedSpec.spec_id = spec.spec_id;
+      selectedSpec.spec_value_list = [];
     },
     // 规格值发生改变
     async handleSpecValChange(spec_id, spec_val_id) {
-      let specVal = ''
-      const specValueList = this.specList.find(sp => sp.spec_id === spec_id).value_list
+      let specVal = "";
+      const specValueList = this.specList.find(
+        (sp) => sp.spec_id === spec_id
+      ).value_list;
       if (Array.isArray(specValueList)) {
-        specVal = specValueList.find(sv => sv.spec_value_id === spec_val_id)
+        specVal = specValueList.find((sv) => sv.spec_value_id === spec_val_id);
       }
-      if (specVal) return
+      if (specVal) return;
     },
     // 格式化规格文字信息
     formatterSpecText(row) {
-      if (!Array.isArray(row.spec_list)) return '/'
-      return row.spec_list.map(sv => sv.spec_value).join('/')
+      if (!Array.isArray(row.spec_list)) return "/";
+      return row.spec_list.map((sv) => sv.spec_value).join("/");
     },
     // 移除规格
     async handleDeleteSpec(sp_index) {
       try {
-        const spec = this.skuForm.selectedSpecs[sp_index]
+        const spec = this.skuForm.selectedSpecs[sp_index];
         if (spec.spec_id) {
-          let msg = '确定要移除这个规格吗?'
-          let has_spec = false
+          let msg = "确定要移除这个规格吗?";
+          let has_spec = false;
           if (Array.isArray(spec.spec_value_list)) {
-            has_spec = spec.spec_value_list.filter(sv => sv.spec_value_id).length !== 0
+            has_spec =
+              spec.spec_value_list.filter((sv) => sv.spec_value_id).length !==
+              0;
           }
-          if (has_spec) msg = '移除后规格维度将发生改变,会导致已有规格数据丢失!确定要移除吗?'
-          await this.$confirm(msg, '提示', { type: has_spec ? 'error' : 'warning' })
+          if (has_spec)
+            msg =
+              "移除后规格维度将发生改变,会导致已有规格数据丢失!确定要移除吗?";
+          await this.$confirm(msg, "提示", {
+            type: has_spec ? "error" : "warning",
+          });
         }
-        this.skuForm.selectedSpecs.splice(sp_index, 1)
+        this.skuForm.selectedSpecs.splice(sp_index, 1);
       } catch (e) {
         //
       }
@@ -433,46 +544,65 @@ export default {
     // 移除规格值
     async handleDeleteSpecVal(sp_index, sv_index) {
       try {
-        const spec_value_list = this.skuForm.selectedSpecs[sp_index].spec_value_list
+        const spec_value_list =
+          this.skuForm.selectedSpecs[sp_index].spec_value_list;
         if (spec_value_list[sv_index].spec_value_id) {
-          let msg = '确定要移除这个规格值吗?'
-          let last_spc_val = false
+          let msg = "确定要移除这个规格值吗?";
+          let last_spc_val = false;
           if (spec_value_list.length === 1) {
-            last_spc_val = true
-            msg = '最后一个规格值移除后规格维度将发生改变,会导致已有规格数据丢失!确定要移除吗?'
+            last_spc_val = true;
+            msg =
+              "最后一个规格值移除后规格维度将发生改变,会导致已有规格数据丢失!确定要移除吗?";
           }
-          await this.$confirm(msg, '提示', { type: last_spc_val ? 'error' : 'warning' })
+          await this.$confirm(msg, "提示", {
+            type: last_spc_val ? "error" : "warning",
+          });
         }
-        this.skuForm.selectedSpecs[sp_index].spec_value_list.splice(sv_index, 1)
+        this.skuForm.selectedSpecs[sp_index].spec_value_list.splice(
+          sv_index,
+          1
+        );
       } catch (e) {
         //
       }
     },
     // 规格值图片上传成功
     handleSpecValImgUploadSuccess(sp_index, sv_index, file) {
-      this.$set(this.skuForm.selectedSpecs[sp_index].spec_value_list[sv_index], 'spec_image', file.url)
-      this.$refs.skuForm.validateField([`selectedSpecs.${sp_index}.spec_value_list.${sv_index}.spec_image`])
+      this.$set(
+        this.skuForm.selectedSpecs[sp_index].spec_value_list[sv_index],
+        "spec_image",
+        file.url
+      );
+      this.$refs.skuForm.validateField([
+        `selectedSpecs.${sp_index}.spec_value_list.${sv_index}.spec_image`,
+      ]);
     },
     // 移除规格值图片
     handleSpecValImgRemove(sp_index, sv_index) {
-      this.skuForm.selectedSpecs[sp_index].spec_value_list[sv_index].spec_image = ''
+      this.skuForm.selectedSpecs[sp_index].spec_value_list[
+        sv_index
+      ].spec_image = "";
     },
     // 批量设置SKU参数
     async handleBatchSetSkuParams(param) {
       try {
-        await this.$confirm('当前操作会覆盖已有值,确定吗?', '提示', { type: 'warning' })
-        let { prefix, step, initial_value, pad_zero } = Helper.cloneJson(param.batchForm)
-        this.skuForm.skuList.forEach(sku => {
-          let val = ''
-          if (prefix !== false && prefix) val += prefix
-          if (step !== false && step) initial_value += step
+        await this.$confirm("当前操作会覆盖已有值,确定吗?", "提示", {
+          type: "warning",
+        });
+        let { prefix, step, initial_value, pad_zero } = Helper.cloneJson(
+          param.batchForm
+        );
+        this.skuForm.skuList.forEach((sku) => {
+          let val = "";
+          if (prefix !== false && prefix) val += prefix;
+          if (step !== false && step) initial_value += step;
           if (pad_zero !== false && pad_zero > 1) {
-            val += String(initial_value).padStart(pad_zero, '0')
+            val += String(initial_value).padStart(pad_zero, "0");
           } else {
-            val += initial_value
+            val += initial_value;
           }
-          this.$set(sku, param.key, val || '')
-        })
+          this.$set(sku, param.key, val || "");
+        });
       } catch (e) {
         // console.log('e: ', e)
       }
@@ -481,28 +611,28 @@ export default {
     submit() {
       return new Promise((resolve, reject) => {
         if (this.skuForm.skuList.length === 0) {
-          reject()
-          return
+          reject();
+          return;
         }
-        this.$refs.skuForm.validate(async valid => {
+        this.$refs.skuForm.validate(async (valid) => {
           if (!valid) {
-            // this.$message.error('表单填写有误,请核对带有红色边框的表单项!')
-            reject()
-            return
+            //this.$message.error('表单填写有误,请核对带有红色边框的表单项!')
+            reject();
+            return;
           }
-          const skus = Helper.cloneJson(this.skuForm.skuList)
-          resolve(skus)
+          const skus = Helper.cloneJson(this.skuForm.skuList);
+          resolve(skus);
           // try {
           //   await Helper.saveGoodsSkus(this.goodsId, skus)
           //   resolve()
           // } catch (e) {
           //   //
           // }
-        })
-      })
-    }
-  }
-}
+        });
+      });
+    },
+  },
+};
 </script>
 <style lang="scss" scoped>
 @import "./styles";

+ 1 - 1
manager-admin/src/router/index.js

@@ -176,7 +176,7 @@ const asyncRouters = [
     },
     children: [
       { path: 'goods-list', component: () => import('@/views/basicSetting/goods/index.vue'), name: 'goodsList', meta: { title: 'goodsList' } },
-      { path: 'goods-add', component: () => import('@/views/basicSetting/goods/editForm/index'), name: 'goodsAddForm', meta: { title: 'goodsAddForm', noCache: true }, hidden: true },
+      { path: 'goods-add/:hire_or_sail?', component: () => import('@/views/basicSetting/goods/editForm/index'), name: 'goodsAddForm', meta: { title: 'goodsAddForm', noCache: true }, hidden: true },
       { path: 'spec-list', component: () => import('@/views/basicSetting/specList'), name: 'specList', meta: { title: 'specList' }},
       { path: 'goods-edit/:id?', component: () => import('@/views/basicSetting/goods/editForm/index'), name: 'goodsEditForm', meta: { title: 'goodsEditForm', noCache: true }, hidden: true },
       { path: 'brand', component: () => import('@/views/basicSetting/brand'), name: 'brand', meta: { title: 'brand' } },

+ 0 - 1
manager-admin/src/store/modules/permission.js

@@ -11,7 +11,6 @@ const permission = {
   },
   mutations: {
     SET_ROUTERS: (state, routers) => {
-      console.log(state, routers);
       state.addRouters = routers
       state.routers = constantRouterMap.concat(routers)
     },

+ 12 - 5
manager-admin/src/views/basicSetting/goods/editForm/BasicInfo.vue

@@ -26,8 +26,8 @@
           class="form-item-width"
           v-model="formData.sn"
           :minlength="2"
-          :maxlength="100"
-          clearable
+          :maxlength="9"
+          @blur="snBlur"
           placeholder="请输入商品编号"
         ></el-input>
       </el-form-item>
@@ -122,7 +122,7 @@
           </div>
         </el-upload>
       </el-form-item>
-      <el-form-item prop="param_list" label="商品参数" v-if="collapseVal.length !== 0">
+      <!-- <el-form-item prop="param_list" label="商品参数" v-if="collapseVal.length !== 0">
         <span v-if="collapseVal.length === 0">-</span>
         <el-collapse v-else :value="collapseVal">
           <el-collapse-item
@@ -164,7 +164,7 @@
             </el-form-item>
           </el-collapse-item>
         </el-collapse>
-      </el-form-item>
+      </el-form-item> -->
     </el-form>
   </div>
 </template>
@@ -219,6 +219,9 @@ export default {
     this.getBrandAllList()
   },
   methods: {
+    snBlur(){
+      sessionStorage.setItem("sn",this.formData.sn)
+    },
     /** 获取分类 */
     getCategoryAllChildren() {
       API_Category.getCategoryAllChildren(0).then(response => {
@@ -249,7 +252,11 @@ export default {
     },
     /** 商品图片发生改变 */
     handlePictureChange(fileList) {
-      this.formData.image_list = fileList
+      /* let url=fileList.map(el=>{
+        return el.url
+      })   this.formData.images = url.join(',') */
+      this.formData.image_list=fileList
+
     },
     /** 视频上传效验 */
     beforeUploadVideo(file) {

+ 12 - 2
manager-admin/src/views/basicSetting/goods/editForm/Sku.vue

@@ -2,10 +2,11 @@
   <div>
     <el-form :model="formData" :rules="formRules" ref="formRef" label-width="120px">
       <el-form-item label="规格类型" props="haveSpec" :rules="formRules.haveSpec">
-        <el-radio-group v-model="formData.haveSpec">
+        <el-radio-group v-model="formData.haveSpec" :disabled="skuDisabled">
           <el-radio :label="false">无规格</el-radio>
           <el-radio :label="true">有规格</el-radio>
         </el-radio-group>
+        <span style="font-size: 12px;color: #606266;margin-left: 30px;"></span>
       </el-form-item>
       <el-form-item label="序列号" >
         <el-radio-group v-model="formData.haveSn">
@@ -31,6 +32,7 @@
           :have-spec="formData.haveSpec"
           :have-sn="formData.haveSn"
           :hireOrSail="hire_or_sail"
+          :sku_sn="skuSn"
         />
       </el-form-item>
     </el-form>
@@ -53,6 +55,9 @@ export default {
     },
     hire_or_sail:{
       type:String
+    },
+    skuSn:{
+      type: String
     }
   },
   data() {
@@ -65,9 +70,13 @@ export default {
       formRules: {
         haveSpec: [this.MixinRequired('请选择规格类型', 'change')],
       },
+      skuDisabled:false
     }
   },
   mounted() {
+    if(this.$route.params.id){
+      this.skuDisabled=true
+    }
   },
   methods: {
     /** 表单校验 */
@@ -80,7 +89,7 @@ export default {
         // 校验通过更新数据
         Object.assign(this.propFormData, this.formData)
       } catch (e) {
-        this.$message.error('【价格库存】不完善,请填写相关信息')
+        this.$message.error('【价格成本】不完善,请填写相关信息')
         this.$emit('updateActiveTab', 'sku')
         // 截断父组件后面的代码
         throw e
@@ -91,6 +100,7 @@ export default {
     propFormData: {
       handler(newVal) {
         this.formData = newVal
+        console.log(this.formData);
       }
     }
   }

+ 66 - 45
manager-admin/src/views/basicSetting/goods/editForm/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="container">
-    <el-tabs v-model="activeTab">
+    <el-tabs v-model="activeTab" @tab-click="tabChange">
       <el-tab-pane label="基本信息" name="basicInfo">
         <BasicInfoForm
           ref="basicInfoRef"
@@ -15,6 +15,7 @@
           :propFormData="formData"
           :category_id="formData.category_id"
           :hire_or_sail="hire_or_sail"
+          :skuSn="skuSn"
         />
       </el-tab-pane>
       <el-tab-pane label="商品详情" name="description">
@@ -33,97 +34,117 @@
       </el-tab-pane>
     </el-tabs>
     <div class="footer">
-      <el-button :loading="formLoading" type="primary" @click="submitForm">保存</el-button>
+      <el-button :loading="formLoading" type="primary" @click="submitForm"
+        >保存</el-button
+      >
       <el-button @click="back">返回</el-button>
     </div>
   </div>
 </template>
 <script>
-import BasicInfoForm from './BasicInfo'
-import DescriptionForm from './Description'
-import OtherForm from './Other'
-import SkuForm from './Sku'
-import * as API_Goods from '@/api/goods'
+import BasicInfoForm from "./BasicInfo";
+import DescriptionForm from "./Description";
+import OtherForm from "./Other";
+import SkuForm from "./Sku";
+import * as API_Goods from "@/api/goods";
 
 export default {
-  name: 'goodsEditForm',
+  name: "goodsEditForm",
   components: { BasicInfoForm, DescriptionForm, OtherForm, SkuForm },
   data() {
     return {
-      activeTab: 'basicInfo', // tab激活的窗口
+      activeTab: "basicInfo", // tab激活的窗口
       formLoading: false,
       formData: {}, // 表单数据
       id: null, // 商品id
-      hire_or_sail:""
-    }
+      hire_or_sail: "",
+      skuSn: "",
+    };
   },
   methods: {
+    tabChange(val) {
+      if (val.name == "sku") {
+        this.skuSn = sessionStorage.getItem("sn");
+      }
+    },
     /** 初始化 */
     init() {
-       this.hire_or_sail=this.$route.params.hire_or_sail
-      const { id } = this.$route.params
+      this.hire_or_sail = this.$route.params.hire_or_sail;
+      const { id } = this.$route.params;
       if (id) {
-        this.id = id
-        this.GET_GoodsDetail()
+        this.id = id;
+        this.GET_GoodsDetail();
       }
     },
     /** 查询商品详情 */
     async GET_GoodsDetail() {
-      this.formData = await API_Goods.getGoodsInfo(this.id)
+      this.formData = await API_Goods.getGoodsInfo(this.id);
+      /* this.formData.image_list=this.formData.images.split(',') */
+      this.formData.haveSpec = this.formData.spec;
+      this.formData.haveSn = this.formData.have_sn;
     },
     /** 提交表单 */
     async submitForm() {
-      this.formLoading = true
+      this.formLoading = true;
       try {
         // 校验各表单
-        await this.$refs.basicInfoRef.validateForm()
-        await this.$refs.skuRef.validateForm()
-        await this.$refs.descriptionRef.validateForm()
-        await this.$refs.otherRef.validateForm()
+        await this.$refs.basicInfoRef.validateForm();
+        await this.$refs.skuRef.validateForm();
+        await this.$refs.descriptionRef.validateForm();
+        await this.$refs.otherRef.validateForm();
         // 深拷贝一份数据bar_code
-        this.formData.bar_code= this.formData.product_list[0].bar_code
-         this.formData.sn_code= this.formData.product_list[0].sn_code
-        const formDataCopy = this.MixinClone(this.formData)
-        formDataCopy.spec=formDataCopy.haveSpec
-        formDataCopy.hire_or_sail=this.hire_or_sail
-        console.log(formDataCopy);
+        this.formData.bar_code = this.formData.product_list[0].bar_code;
+        this.formData.sn_code = this.formData.product_list[0].sn_code;
+        const formDataCopy = this.MixinClone(this.formData);
+        formDataCopy.spec = formDataCopy.haveSpec;
+        formDataCopy.have_sn = formDataCopy.haveSn;
+        formDataCopy.hire_or_sail = this.hire_or_sail;
+        if (formDataCopy.haveSpec) {
+          formDataCopy.product_list.map((item) => {
+            item.spec_name = item.spec_list.map(el=>{
+              return el.spec_value;
+            })
+          });
+        }
 
         if (this.id) {
-          await API_Goods.editGoods(this.id, formDataCopy)
-          this.$message.success('修改成功')
+          await API_Goods.editGoods(this.id, formDataCopy);
+          sessionStorage.removeItem("sn");
+          this.$message.success("修改成功");
         } else {
-          await API_Goods.addGoods(formDataCopy)
-          this.$message.success('添加成功')
+          await API_Goods.addGoods(formDataCopy);
+          sessionStorage.removeItem("sn");
+          this.$message.success("添加成功");
         }
-        this.back()
+        this.back();
       } finally {
-        this.formLoading = false
+        this.formLoading = false;
       }
     },
     /** 返回商品列表 */
     back() {
-      this.$store.dispatch('delCurrentViews', {
+      this.$store.dispatch("delCurrentViews", {
         view: this.$route,
-        $router: this.$router
-      })
-      this.$router.push({name: 'goodsList'})
+        $router: this.$router,
+      });
+      this.$router.push({ name: "goodsList" });
     },
     /** 更新激活的tab */
     updateActiveTab(activeTab) {
-      this.activeTab = activeTab
-    }
+      this.activeTab = activeTab;
+    },
   },
   watch: {
     $route: {
       immediate: true,
       handler(newVal) {
-        if (newVal.name === 'goodsAddForm' || newVal.name === 'goodsEditForm') {
-          this.init()
+        if (newVal.name === "goodsAddForm" || newVal.name === "goodsEditForm") {
+          this.init();
         }
-      }
-    }
-  }
-}
+      },
+    },
+  },
+};
 </script>
 
 <style lang="scss" scoped>

+ 63 - 15
manager-admin/src/views/basicSetting/goods/index.vue

@@ -11,7 +11,7 @@
                 v-if="checkPermission(['category:add'])"
                 type="primary"
                 @click="handleAddCategary"
-                >新增</el-button
+                >新增类别</el-button
               >
             </div>
           </div>
@@ -61,7 +61,7 @@
                 @click.stop="handleEditSpecs(data)"
                 >规格</el-button
               >
-            <!--   <el-button
+              <!--   <el-button
                 type="text"
                 size="mini"
                 icon="el-icon-setting"
@@ -77,7 +77,7 @@
         <en-table-layout
           :tableData="tableData.data"
           class="draggable-table"
-		      :row-key="getRowKeys"
+          :row-key="getRowKeys"
           :loading="loading"
           style="margin: 10px 10px 0 10px"
         >
@@ -88,14 +88,14 @@
                 v-if="checkPermission(['goods:add'])"
                 type="primary"
                 @click="handleAddGoods('sail')"
-                >新增</el-button
+                >新增售卖商品</el-button
               >
               <el-button
                 size="mini"
-                v-if="checkPermission(['goods:add'])"
+                v-if="checkPermission(['goodsLease:add'])"
                 type="primary"
                 @click="handleAddGoods('hire')"
-                >新增租赁</el-button
+                >新增租赁商品</el-button
               >
             </div>
             <div
@@ -119,9 +119,22 @@
           <template slot="table-columns">
             <el-table-column prop="sn" label="商品编号" />
             <el-table-column prop="name" label="商品名称" />
-            <el-table-column prop="category_name" label="商品类别" />
-            <el-table-column prop="brand_name" label="品牌" />
-            <el-table-column prop="" label="规格型号" />
+            <el-table-column prop="category_id" label="商品类别">
+              <template slot-scope="scope">
+                {{ categorysName(scope.row.category_id) }}
+              </template>
+            </el-table-column>
+            <el-table-column prop="brand_id" label="品牌">
+              <template slot-scope="scope">
+                {{ brand(scope.row.brand_id) }}
+              </template>
+            </el-table-column>
+            <el-table-column prop="" label="商品形式"
+              ><template slot-scope="scope">
+                {{ sailOrHire(scope.row.hire_or_sail) }}
+              </template></el-table-column
+            >
+
             <!-- <el-table-column prop="price" label="价格" :formatter="MixinFormatPrice"/>
             <el-table-column prop="label_names" label="商品标签"/> -->
             <el-table-column label="上架" key="market_enable">
@@ -251,6 +264,7 @@
 import * as API_Goods from "@/api/goods";
 import * as API_Category from "@/api/category";
 import Sortable from "sortablejs";
+import * as API_brand from "@/api/basicSetting";
 export default {
   name: "productFile",
   data() {
@@ -277,10 +291,11 @@ export default {
       },
       // 左侧商品分类高度,和table保持一致
       categoryHeight: `${document.body.clientHeight - 219}px`,
+      brandList: [],
     };
   },
   mounted() {
-    this.rowDrop()
+    this.rowDrop();
     // this.rowDrop()
     this.GET_ProductList();
     this.GET_Category();
@@ -293,6 +308,35 @@ export default {
     }, 1000);
   },
   methods: {
+    sailOrHire(val) {
+      let name = "";
+      if (val == "sail") {
+        name = "售卖";
+        return name;
+      } else {
+        name = "租赁";
+        return name;
+      }
+    },
+    brand(val) {
+      let name = "";
+      this.brandList.map((el) => {
+        if (el.brand_id == val) {
+          return (name = el.name);
+        }
+      });
+      return name;
+    },
+    //获取类别名称
+    categorysName(val) {
+      let name = "";
+      this.categorys.map((el) => {
+        if (el.category_id == val) {
+          return (name = el.name);
+        }
+      });
+      return name;
+    },
     getRowKeys(row) {
       return row.id;
     },
@@ -318,8 +362,8 @@ export default {
         });
       });
     }, */
-    updateList(id,sort) {
-      API_Goods.updateSort({ goods_id: id,sort:sort }).then((res) => {
+    updateList(id, sort) {
+      API_Goods.updateSort({ goods_id: id, sort: sort }).then((res) => {
         if (res.errno != 0) {
           this.getList();
         }
@@ -337,7 +381,7 @@ export default {
           const currRow = _this.tableData.data.splice(oldIndex, 1)[0];
           _this.tableData.data.splice(newIndex, 0, currRow);
           console.log(currRow);
-          _this.updateList(currRow.id,currRow.sort);
+          _this.updateList(currRow.id, currRow.sort);
         },
       });
     },
@@ -354,7 +398,7 @@ export default {
     handleEditGoods(row) {
       this.$router.push({
         name: "goodsEditForm",
-        params: { id: row.id },
+        params: { id: row.id,hire_or_sail: row.hire_or_sail  },
       });
     },
     /** 编辑关联规格 */
@@ -468,7 +512,7 @@ export default {
       console.log(val);
       this.$router.push({
         name: "goodsAddForm",
-        params:{hire_or_sail: val}
+        params: { hire_or_sail: val },
       });
     },
 
@@ -507,6 +551,10 @@ export default {
         .catch(() => {
           this.loading = false;
         });
+      API_brand.getBrandList(this.params).then((response) => {
+        this.loading = false;
+        this.brandList = response.data;
+      });
     },
   },
 };

+ 99 - 62
manager-admin/src/views/layout/components/TagsView.vue

@@ -9,11 +9,22 @@
         <el-dropdown-item command="closeAll">关闭所有</el-dropdown-item>
       </el-dropdown-menu>
     </el-dropdown> -->
-    <scroll-pane class='tags-view-wrapper' ref='scrollPane'>
-      <router-link ref='tag' class="tags-view-item" :class="isActive(tag)?'active':''" v-for="tag in Array.from(visitedViews)"
-                   :to="tag" :key="tag.path" @contextmenu.prevent.native="openMenu(tag,$event)">
-        {{generateTitle(tag.title)}}
-        <span v-if="tag.name !== 'dashboard'" class='el-icon-close' @click.prevent.stop='closeSelectedTag(tag)'></span>
+    <scroll-pane class="tags-view-wrapper" ref="scrollPane">
+      <router-link
+        ref="tag"
+        class="tags-view-item"
+        :class="isActive(tag) ? 'active' : ''"
+        v-for="tag in Array.from(visitedViews)"
+        :to="tag"
+        :key="tag.path"
+        @contextmenu.prevent.native="openMenu(tag, $event)"
+      >
+        {{ generateTitle(tag.title) }}
+        <span
+          v-if="tag.name !== 'dashboard'"
+          class="el-icon-close"
+          @click.prevent.stop="closeSelectedTag(tag)"
+        ></span>
       </router-link>
     </scroll-pane>
     <!-- <ul class='contextmenu' v-show="visible" :style="{left:left+'px',top:top+'px'}">
@@ -25,8 +36,8 @@
 </template>
 
 <script>
-import ScrollPane from '@/components/ScrollPane'
-import { generateTitle } from '@/utils/i18n'
+import ScrollPane from "@/components/ScrollPane";
+import { generateTitle } from "@/utils/i18n";
 
 export default {
   components: { ScrollPane },
@@ -36,108 +47,135 @@ export default {
       top: 0,
       left: 0,
       selectedTag: {},
-      isFloor: false
-    }
+      isFloor: false,
+      newTime: "",
+    };
   },
   computed: {
     visitedViews() {
-     return this.$store.state.tagsView.visitedViews
-    }
+      return this.$store.state.tagsView.visitedViews;
+    },
   },
   watch: {
     $route(value) {
-      this.selectedTag = value
-      this.addViewTags()
-      this.moveToCurrentTag()
-      if (this.$route.path === '/page/pc-decoration/floor') {
-        this.isFloor = true
+      this.selectedTag = value;
+      this.addViewTags();
+      this.moveToCurrentTag();
+      if (this.$route.path === "/page/pc-decoration/floor") {
+        this.isFloor = true;
       } else {
-        this.isFloor = false
+        this.isFloor = false;
       }
     },
     visible(value) {
       if (value) {
-        document.body.addEventListener('click', this.closeMenu)
+        document.body.addEventListener("click", this.closeMenu);
       } else {
-        document.body.removeEventListener('click', this.closeMenu)
+        document.body.removeEventListener("click", this.closeMenu);
       }
-    }
+    },
   },
   mounted() {
-    this.addViewTags()
+    this.addViewTags();
+    this.getNowTime(); //进入页面调用该方法获取当前时间
+    clearInterval(myTimeDisplay); //销毁之前定时器
+    var myTimeDisplay = setInterval(() => {
+      this.getNowTime(); //每秒更新一次时间
+    }, 1000);
   },
   methods: {
+    getNowTime() {
+      var date = new Date();
+      var time =
+        date.getFullYear() +
+        "-" +
+        (date.getMonth() + 1) +
+        "-" +
+        date.getDate() +
+        " " +
+        date.getHours() +
+        ":" +
+        date.getMinutes() +
+        ":" +
+        date.getSeconds();
+      this.newTime = time;
+    },
+    //根据自己的需求,看要不要在时间不大于10的时候在前面补0,如果需要直接this.addZero(date.getMinutes()),其它与之相同,如果不需要删掉addZero()方法即可。
+    //小于10的拼接上0字符串
+    addZero(s) {
+      return s < 10 ? "0" + s : s;
+    },
     generateTitle, // generateTitle by vue-i18n
     generateRoute() {
       if (this.$route.name) {
-        return this.$route
+        return this.$route;
       }
-      return false
+      return false;
     },
     isActive(route) {
-      return route.path === this.$route.path// || route.name === this.$route.name
+      return route.path === this.$route.path; // || route.name === this.$route.name
     },
     addViewTags() {
-      const route = this.generateRoute()
+      const route = this.generateRoute();
       if (!route) {
-        return false
+        return false;
       }
-      this.$store.dispatch('addVisitedViews', route)
+      this.$store.dispatch("addVisitedViews", route);
     },
     moveToCurrentTag() {
-      const tags = this.$refs.tag
+      const tags = this.$refs.tag;
       this.$nextTick(() => {
         for (const tag of tags) {
           if (tag.to.path === this.$route.path) {
-            this.$refs.scrollPane.moveToTarget(tag.$el)
-            break
+            this.$refs.scrollPane.moveToTarget(tag.$el);
+            break;
           }
         }
-      })
+      });
     },
     /** 快捷操作分发 */
     dropdownEvent(command) {
-      if (command === 'closeOthers') {
-        this.closeOthersTags()
-      } else if (command === 'closeAll') {
-        this.closeAllTags()
+      if (command === "closeOthers") {
+        this.closeOthersTags();
+      } else if (command === "closeAll") {
+        this.closeAllTags();
       } else {
-        this.$store.dispatch('reloadViews')
+        this.$store.dispatch("reloadViews");
       }
     },
     closeSelectedTag(view) {
-      this.$store.dispatch('delVisitedViews', view).then((views) => {
+      this.$store.dispatch("delVisitedViews", view).then((views) => {
         if (this.isActive(view)) {
-          const latestView = views.slice(-1)[0]
+          const latestView = views.slice(-1)[0];
           if (latestView) {
-            this.$router.push(latestView)
+            this.$router.push(latestView);
           } else {
-            this.$router.push('/')
+            this.$router.push("/");
           }
         }
-      })
+      });
     },
     closeOthersTags() {
-      this.$router.push(this.selectedTag)
-      this.$store.dispatch('delOthersViews', this.selectedTag).then(() => {
-        this.moveToCurrentTag()
-      })
+      this.$router.push(this.selectedTag);
+      this.$store.dispatch("delOthersViews", this.selectedTag).then(() => {
+        this.moveToCurrentTag();
+      });
     },
     closeAllTags() {
-      this.$store.dispatch('delAllViews')
-      this.$router.push('/')
+      this.$store.dispatch("delAllViews");
+      this.$router.push("/");
     },
     openMenu(tag, e) {
-      this.visible = true
-      this.selectedTag = tag
-      this.left = e.clientX
-      this.top = e.clientY
+      this.visible = true;
+      this.selectedTag = tag;
+      this.left = e.clientX;
+      this.top = e.clientY;
     },
     closeMenu() {
-      this.visible = false
-    }
-  }
-}
+      this.visible = false;
+    },
+  },
+};
 </script>
 
 <style type="text/scss" lang="scss" scoped>
@@ -152,7 +190,7 @@ export default {
   // justify-content: space-between;
   // border-bottom: 1px solid #d8dce5;
   margin-left: 20px;
-    margin-top: 5px;
+  margin-top: 5px;
   &.tabs-box {
     min-width: 1260px;
   }
@@ -170,7 +208,7 @@ export default {
     &:hover {
       filter: brightness(1.1);
       transform: rotate(180deg);
-      transition: .15s;
+      transition: 0.15s;
     }
     .el-icon-arrow-down {
       font-size: 16px;
@@ -199,7 +237,7 @@ export default {
         background-color: #fff;
         // color: #fff;
         // border-color: #409EFF;
-        color: #409EFF;
+        color: #409eff;
         &::before {
           // content: '';
           // background: #fff;
@@ -224,7 +262,7 @@ export default {
     font-size: 12px;
     font-weight: 400;
     color: #333;
-    box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3);
+    box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
     li {
       margin: 0;
       padding: 7px 16px;
@@ -246,12 +284,11 @@ export default {
 
       border-radius: 50%;
       text-align: center;
-      transition: all .3s cubic-bezier(.645, .045, .355, 1);
+      transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
       transform-origin: 100% 50%;
       &:before {
-        transform: scale(.6);
+        transform: scale(0.6);
         display: inline-block;
-
       }
       &:hover {
         background-color: #b4bccc;

+ 1 - 1
manager-admin/src/views/setting/auth-settings/administratorManage.vue

@@ -244,7 +244,7 @@ export default {
     /** 添加人员 */
     handleAddAdmin() {
       this.adminForm = {
-        founder: 1,
+        founder: 0,
         real_name: '',
         password: ''
       }

+ 15 - 3
manager-admin/src/views/stock/goodsExchange/addInventory.vue

@@ -258,8 +258,13 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55" />
-        <el-table-column prop="sn" label="商品编号"> </el-table-column>
-        <el-table-column prop="bar_code" label="商品条码"> </el-table-column>
+        <el-table-column prop="" label="商品编号">
+          <template slot-scope="scope">
+            {{scope.goods_vo.sn}}
+          </template>
+        </el-table-column>
+        <el-table-column prop="bar_code" label="商品条码">
+           </el-table-column>
         <el-table-column prop="sn_code" label="序列号"> </el-table-column>
         <el-table-column prop="name" label="商品名称"> </el-table-column>
         <el-table-column prop="goods_style" label="规格型号"> </el-table-column>
@@ -797,7 +802,14 @@ export default {
         return
       }
       API_GoodsExchange.getGoodsInfo().then((res) => {
-        this.goodsData = res.data;
+        let item={}
+        res.map(el=>{
+          item.sn=el.goods_vo.sn
+          item.name=el.goods_vo.name
+          /* item. */
+          return item
+        })
+        this.goodsData = res;
         this.goodsVisible = true;
       });
       /*// if (!this.goodsExchangeAddForm.warehouse_id) {

+ 5 - 1
manager-admin/src/views/stock/orderAdd.vue

@@ -98,10 +98,14 @@
         </el-col>
         <el-col :span="10">
           <el-form-item
-            label="付款金额"
+            label="付款金额:"
             prop="pay_price"
             :rules="rules.pay_price"
           >
+          <span>{{ '¥'+3340 }}</span>
+          <span>实付价格:</span>
+          <!-- <span>折扣:<el-input placeholder="请输入"></el-input>
+          </span> -->
             <el-input
               v-model="OrderForm.pay_price"
               placeholder="请输入"

+ 4 - 1
ui-utils/RegExp.js

@@ -45,6 +45,8 @@ let URL = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[
 
 // 固话
 let TEL = /0\d{2,3}-\d{7,8}/
+//字母和数字
+let code=/^[A-Za-z0-9]+$/
 
 module.exports = {
   mobile: mobile,
@@ -57,5 +59,6 @@ module.exports = {
   IDCard: IDCard,
   userName: userName,
   URL: URL,
-  TEL: TEL
+  TEL: TEL,
+  code:code
 }

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov