소스 검색

1、AR发行配置

huangmp 1 년 전
부모
커밋
df8c9da79a
30개의 변경된 파일8915개의 추가작업 그리고 19개의 파일을 삭제
  1. 26 5
      src/components/order-card-item/index.vue
  2. 3 0
      src/store/modules/user.js
  3. 0 1
      src/views/main-navbar.vue
  4. 266 0
      src/views/modules/ar/arAssets/add-or-update.vue
  5. 173 0
      src/views/modules/ar/arAssets/index.vue
  6. 267 0
      src/views/modules/ar/arIssue/add-or-update.vue
  7. 199 0
      src/views/modules/ar/arIssue/index.vue
  8. 189 0
      src/views/modules/ar/arIssueConfig/add-or-update.vue
  9. 213 0
      src/views/modules/ar/arIssueConfig/interactive-config.vue
  10. 437 0
      src/views/modules/ar/arIssuePic/add-or-update.vue
  11. 251 0
      src/views/modules/ar/arIssuePic/index.vue
  12. 333 0
      src/views/modules/ar/arIssueUserCard/add-or-update.vue
  13. 239 0
      src/views/modules/ar/arIssueUserCard/index.vue
  14. 1 0
      src/views/modules/print/print-order.vue
  15. 3 3
      src/views/modules/print/wave-print-order.vue
  16. 38 5
      src/views/modules/prod/printPicLib-add-or-update.vue
  17. 129 0
      src/views/modules/prod/score-prod-assets.vue
  18. 390 0
      src/views/modules/prod/score-sku-table.vue
  19. 515 0
      src/views/modules/prod/score-sku-tag.vue
  20. 495 0
      src/views/modules/prod/scoreProdInfo.vue
  21. 334 0
      src/views/modules/prod/scoreProdList.vue
  22. 90 0
      src/views/modules/score/consignment-info.vue
  23. 427 0
      src/views/modules/score/order-delivery-update.vue
  24. 222 0
      src/views/modules/score/order-upload.vue
  25. 1615 0
      src/views/modules/score/order.vue
  26. 1405 0
      src/views/modules/score/orderInfo.vue
  27. 528 0
      src/views/modules/score/score-config.vue
  28. 91 0
      src/views/modules/score/score-growth-config.vue
  29. 16 5
      src/views/modules/settlement/third-print-settlement.vue
  30. 20 0
      src/views/modules/shop/feature/create/edit/components/scroll-tab-nav/index.vue

+ 26 - 5
src/components/order-card-item/index.vue

@@ -396,9 +396,8 @@
             height = 1087;
           }else if(prodName.indexOf("票根") !== -1){
             width = 780;
-            height = 1489;
+            height = 1488;
           }else if(prodName.indexOf("直拍封面") !== -1){
-            debugger
             if(that.shopId === 6){
               width = 709;
               height = 1228;
@@ -442,16 +441,19 @@
           }else if(prodName.indexOf("圆形徽章") !== -1){
             width = 850;
             height = 850;
+          }else if(prodName.indexOf("大徽章") !== -1){
+            width = 2115;
+            height = 2115;
           }else if(prodName.indexOf("手幅") !== -1){
             width = 1252;
             height = 3614;
-          }else if(prodName.indexOf("4寸典藏级花式拍立得") !== -1){
+          }else if(prodName.indexOf("典藏4寸花式拍立得") !== -1){
             width = 921;
             height = 1087;
           }else if(prodName.indexOf("4寸花式拍立得") !== -1){
             width = 921;
             height = 1087;
-          }else if(prodName.indexOf("5寸典藏级花式拍立得") !== -1){
+          }else if(prodName.indexOf("典藏5寸花式拍立得") !== -1){
             width = 1346;
             height = 1087;
           }else if(prodName.indexOf("长方形贴纸") !== -1){
@@ -460,6 +462,12 @@
           }else if(prodName.indexOf("方形贴纸") !== -1){
             width = 662;
             height = 662;
+          }else if(prodName.indexOf("小圆形贴纸") !== -1){
+            width = 709;
+            height = 709;
+          }else if(prodName.indexOf("大圆形贴纸") !== -1){
+            width = 1016;
+            height = 1016;
           }else if(prodName.indexOf("撕拉") !== -1){
             width = 768;
             height = 768;
@@ -481,9 +489,12 @@
           }else if(prodName.indexOf("大3寸") !== -1){
             width = 803;
             height = 1098;
-          }else if(prodName.indexOf("闪耀") !== -1){
+          }else if(prodName.indexOf("闪耀") !== -1 || prodName.indexOf("哪吒") !== -1 || prodName.indexOf("白月") !== -1){
             width = 803;
             height = 1098;
+          }else if(prodName.indexOf("亚克力票根") !== -1){
+            width = 780;
+            height = 1488;
           }
           let _URL = window.URL || window.webkitURL;
           let img = new Image();
@@ -617,6 +628,8 @@
           this.prodType = '四宫格书签';
         }else if(prodName.indexOf('徽章') != -1){
           this.prodType = '徽章';
+        }else if(prodName.indexOf('大徽章') != -1){
+          this.prodType = '大徽章';
         }else if(prodName.indexOf('手幅') != -1){
           this.prodType = '手幅';
         }else if(prodName.indexOf('毛绒徽章') != -1){
@@ -627,6 +640,10 @@
           this.prodType = '长方形贴纸';
         }else if(prodName.indexOf('方形贴纸') != -1){
           this.prodType = '方形贴纸';
+        }else if(prodName.indexOf('小圆形贴纸') != -1){
+          this.prodType = '小圆形贴纸';
+        }else if(prodName.indexOf('大圆形贴纸') != -1){
+          this.prodType = '大圆形贴纸';
         }else if(prodName.indexOf('二宫格') != -1){
           this.prodType = '二宫格';
         }else if(prodName.indexOf('撕拉') != -1){
@@ -639,6 +656,10 @@
           this.prodType = '大3寸';
         }else if(prodName.indexOf('闪耀') != -1){
           this.prodType = '闪耀';
+        }else if(prodName.indexOf('哪吒') != -1){
+          this.prodType = '哪吒';
+        }else if(prodName.indexOf('白月') != -1){
+          this.prodType = '白月';
         }
         this.$nextTick(() =>{
           this.$refs.canvasPreviewRef.init(cardItem, this.resourcesUrl + picUrl, this.prodType, side)

+ 3 - 0
src/store/modules/user.js

@@ -40,6 +40,9 @@ export default {
     updateShopName (state, shopName) {
       state.shopName = shopName
     },
+    updateNickName(state, nickName) {
+      state.nickName = nickName
+    },
     updateShopStatus (state, shopStatus) {
       state.shopStatus = shopStatus
     },

+ 0 - 1
src/views/main-navbar.vue

@@ -211,7 +211,6 @@ export default {
     if (window.Notification && this.shopStatus === 1) {
         // 浏览器通知--window.Notification
       if (Notification.permission === 'granted') {
-        console.log('允许通知')
         this.notification = false
         notifFlag = false
       } else if (Notification.permission !== 'denied') {

+ 266 - 0
src/views/modules/ar/arAssets/add-or-update.vue

@@ -0,0 +1,266 @@
+<template>
+  <el-dialog
+    :title="
+      !dataForm.assetsId
+        ? '新增资源'
+        : '修改资源'
+    "
+    :close-on-click-modal="false"
+    :visible.sync="visible"
+    width="70%"
+    @close="handleClose"
+  >
+    <el-form
+      :model="dataForm"
+      label-width="80px"
+      ref="dataForm"
+    >
+      <el-form-item
+        v-if="dataForm.assetsId"
+        label="资源名称"
+        prop="assetsName"
+        :label-width="labelWidth"
+      >
+        <el-input
+          v-model="dataForm.assetsName"
+          placeholder="资源名称"
+          size="small"
+          style="width: 250px"
+        ></el-input>
+      </el-form-item>
+      <el-form-item
+        label="资源类型"
+        prop="assetsType"
+        :label-width="labelWidth"
+      >
+        <el-radio-group v-model="dataForm.assetsType">
+          <el-radio label="Video">视频</el-radio>
+          <el-radio label="Model">模型</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item
+        label="适用卡片"
+        prop="cardType"
+        :label-width="labelWidth"
+      >
+        <el-radio-group v-model="dataForm.cardType">
+          <el-radio label="3CXK">3寸卡</el-radio>
+          <el-radio label="6x9">6x9卡</el-radio>
+          <el-radio label="MXP">明信片</el-radio>
+          <el-radio label="ZP">直拍</el-radio>
+          <el-radio label="D3CXK">大3寸</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-row>
+        <el-form-item label="素材资源" prop="frontUrl">
+          <el-row>
+            <div style="display: flex; flex-wrap: wrap">
+              <div v-for="(item, index) in dataForm.assetsList" :key="index" v-if="dataForm.assetsType === 'Video'">
+                <video
+                  v-if="item.url"
+                  :src="item.url"
+                  controls="controls"
+                  style="width:175px;height:87.5px;"
+                />
+                <!-- 显示查看和删除的按钮弹窗 -->
+                <div
+                  class="avatar-uploader-popup"
+                >
+                 <span>{{item.name}}  </span><i class="el-icon-delete" @click="deleteAssets(index)" />
+                </div>
+              </div>
+            </div>
+          </el-row>
+          <el-row>
+            <el-upload
+              ref="upload"
+              :multiple="uploadMultiple"
+              :before-upload="(file, fileList)=>handleBeforeUpload(file, fileList)"
+              action="#"
+              :limit="uploadLimit"
+              :file-list="dataForm.assetsList"
+              :http-request="uploadAssets"
+              :headers="{Authorization: $cookie.get('Authorization_vs'),locale:lang}"
+              :on-remove="(res,file)=>{onRemove(res,file)}"
+              :show-file-list="dataForm.assetsType === 'Model'"
+              :on-exceed="handleExceed">
+              <el-button size="small" type="primary">点击上传</el-button>
+            </el-upload>
+          </el-row>
+        </el-form-item>
+      </el-row>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <div class="default-btn" @click="visible = false">{{ $t("crud.filter.cancelBtn") }}</div>
+      <div @click="dataFormSubmit()" class="default-btn primary-btn">{{ $t("crud.filter.submitBtn") }}</div>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import { setDialogWidth, widthChange } from '@/utils/setDialogWidth'
+import { Debounce } from '@/utils/debounce'
+export default {
+  data () {
+    return {
+      visible: false,
+      showFileList: false,
+      dataForm: {
+        assetsId: null,
+        assetsName: null,
+        assetsType: 'Video',
+        assetsList: [],
+        assetsUrl: null,
+        cardType: null
+      },
+      uploadMultiple: true,
+      uploadLimit: 50,
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      dataRule: {
+        assetsName: [
+          { required: true, message: '资源名称不能为空', trigger: 'blur' },
+        ],
+      },
+      dialogWidth: '',
+      defWidth: localStorage.getItem('lang') === 'en' ? 850 : 750,
+      labelWidth: localStorage.getItem('lang') === 'en' ? '130px' : '80px',
+
+      // 正在提交
+      isSubmitting: false,
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+      lang: localStorage.getItem('lang'),
+    }
+  },
+  created () {
+    this.dialogWidth = setDialogWidth(this.defWidth)
+  },
+  mounted () {
+    widthChange(this, this.defWidth)
+  },
+  methods: {
+    init (assetsId) {
+      this.dataForm.assetsId = assetsId || 0
+      this.visible = true
+      this.$nextTick(() => {
+        this.$refs.dataForm.resetFields()
+      })
+      if (this.dataForm.assetsId) {
+        this.uploadMultiple = false
+        this.uploadLimit = 1
+        this.$http({
+          url: this.$http.adornUrl(
+            `/ar/arAssets/info/${this.dataForm.assetsId}`
+          ),
+          method: 'get',
+          params: this.$http.adornParams()
+        }).then(({ data }) => {
+          this.dataForm.assetsId = data.assetsId
+          this.dataForm.assetsName = data.assetsName
+          this.dataForm.cardType = data.cardType
+          this.dataForm.assetsUrl = data.assetsUrl
+          let assets = {name: data.assetsName, url: this.resourcesUrl + this.dataForm.assetsUrl, path: this.dataForm.assetsUrl}
+          this.dataForm.assetsList.push(assets)
+        })
+      }
+    },
+
+    /**
+     * 上传资源
+     */
+
+    uploadAssets (event) {
+      const file = event.file
+      const formData = new FormData()
+      formData.append('file', file)
+      formData.append('type', 4)
+      this.$http({
+        url: this.$http.adornUrl('/admin/file/wsjUpload'),
+        method: 'post',
+        headers: {
+          'Content-Type': file.type
+        },
+        data: formData
+      }).then(res => {
+        let data = res.data[0]
+        let assets = {name: file.name, url: this.resourcesUrl + data.filePath, path: data.filePath}
+        this.dataForm.assetsList.push(assets)
+      })
+    },
+    // 删除预览视频
+    deleteAssets (index) {
+      this.dataForm.assetsList.splice(index, 1)
+    },
+    /**
+     * 上传资源前检查合法性
+     * @param file
+     * @returns {boolean}
+     */
+    handleBeforeUpload (file) {
+      const isLt100M = file.size / 1024 / 1024 < 100
+      if (!isLt100M) {
+        this.$message.error('上传资源大小不能超过100MB哦!')
+        return false
+      }
+      return true
+    },
+    onRemove (response, file, fileList) {
+      let index = this.dataForm.assetsList.findIndex((item) => item.path = response.path)
+      this.dataForm.assetsList.splice(index, 1)
+    },
+    handleExceed(files, fileList){
+      this.$message.error("一次最多上传" + this.uploadLimit + "个文件")
+    },
+
+    // 表单提交
+    dataFormSubmit: Debounce(function () {
+      this.$refs['dataForm'].validate(valid => {
+        if (valid) {
+          if (this.isSubmitting) {
+            return
+          }
+          this.isSubmitting = true
+          this.$http({
+            url: this.$http.adornUrl(`/ar/arAssets`),
+            method: this.dataForm.assetsId ? 'put' : 'post',
+            data: this.$http.adornData(this.dataForm)
+          }).then(({ data }) => {
+            this.isSubmitting = false
+            this.$message({
+              message: this.$i18n.t('publics.operation'),
+              type: 'success',
+              duration: 500,
+              onClose: () => {
+                this.visible = false
+                this.$emit('refreshDataList', this.page)
+              }
+            })
+          }).catch((error) => {
+            console.log('err', error)
+            this.isSubmitting = false
+          })
+        }
+      })
+    }, 500),
+
+    handleClose(){
+      this.dataForm = {
+        assetsId: null,
+        assetsName: null,
+        assetsType: 'Video',
+        assetsList: [],
+        assetsUrl: null,
+        cardType: null
+      }
+    }
+  }
+}
+</script>
+<style scoped>
+.v-modal {
+  z-index: 2001 !important;
+}
+</style>

+ 173 - 0
src/views/modules/ar/arAssets/index.vue

@@ -0,0 +1,173 @@
+<template>
+  <div class="mod-ar-arIssue">
+    <div class="main-container">
+      <div class="operation-bar">
+        <div v-if="isAuth('ar:arAssets:save')" class="default-btn primary-btn" @click="addOrUpdateHandle()">{{ $t('crud.addBtn') }}</div>
+      </div>
+      <div class="table-con">
+          <el-table
+            :data="dataList"
+            header-cell-class-name="table-header"
+            row-class-name="table-row-low"
+            style="width: 100%"
+          >
+            <el-table-column
+              label="资源名称"
+              prop="assetsName"
+              align="center"
+            >
+            </el-table-column>
+            <el-table-column label="资源类型" prop="assetsType" align="center">
+              <template slot-scope="scope">
+                <el-tag v-if="scope.row.assetsType === 'Video'" type="primary">视频</el-tag>
+                <el-tag v-if="scope.row.assetsType === 'Model'" type="success">模型</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="适用卡片" prop="cardType" align="center">
+              <template slot-scope="scope">
+                <el-tag v-if="scope.row.cardType === '3CXK'" type="primary">3寸卡</el-tag>
+                <el-tag v-if="scope.row.cardType === 'D3CXK'" type="primary">大3寸</el-tag>
+                <el-tag v-if="scope.row.cardType === '6x9'" type="success">6x9卡</el-tag>
+                <el-tag v-if="scope.row.cardType === 'MXP'" type="danger">明信片</el-tag>
+                <el-tag v-if="scope.row.cardType === 'ZP'" type="danger">直拍</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column
+              align="center"
+              :label="$t('crud.menu')"
+              width="250"
+              >
+              <template slot-scope="scope">
+                <div class="text-btn-con">
+                  <div v-if="isAuth('ar:arAssets:update')" class="default-btn text-btn" @click="addOrUpdateHandle(scope.row.assetsId)">{{ $t('text.updateBtn') }}</div>
+                  <div v-if="isAuth('ar:arAssets:delete')" class="default-btn text-btn" @click="deleteHandle(scope.row.assetsId)">{{ $t('text.delBtn') }}</div>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="page.currentPage"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="page.pageSize"
+          :total="page.total"
+          layout="total, sizes, prev, pager, next, jumper"
+        ></el-pagination>
+    </div>
+    <add-or-update v-if="addOrUpdateVisible"
+                   ref="addOrUpdate"
+                   @refreshDataList="refreshChange"></add-or-update>
+  </div>
+</template>
+
+<script>
+import AddOrUpdate from './add-or-update'
+export default {
+  data () {
+    return {
+      dataList: [],
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      searchForm: {},
+      dataListLoading: false,
+      addOrUpdateVisible: false,
+      issuePicVisible: false
+    }
+  },
+  components: {
+    AddOrUpdate,
+  },
+  created () {
+    this.getDataList(this.page)
+  },
+  mounted () {
+  },
+  methods: {
+    getDataList (page, params) {
+      this.dataListLoading = true
+      this.$http({
+        url: this.$http.adornUrl('/ar/arAssets/page'),
+        method: 'get',
+        params: this.$http.adornParams(Object.assign({
+          current: page.currentPage,
+          size: page.pageSize
+        }, this.searchForm))
+      }).then(({ data }) => {
+        this.dataList = data.records
+        this.page.total = data.total
+        this.dataListLoading = false
+      })
+    },
+    // 新增 / 修改
+    addOrUpdateHandle (issueId) {
+      this.addOrUpdateVisible = true
+      this.$nextTick(() => {
+        this.$refs.addOrUpdate.init(issueId)
+      })
+    },
+    deleteHandle (assetsId) {
+      this.$confirm(this.$i18n.t('admin.isDeleOper') + '?', this.$i18n.t('text.tips'), {
+        confirmButtonText: this.$i18n.t('crud.filter.submitBtn'),
+        cancelButtonText: this.$i18n.t('crud.filter.cancelBtn'),
+        type: 'warning'
+      }).then(() => {
+        this.$http({
+          url: this.$http.adornUrl('/ar/arAssets/' + assetsId),
+          method: 'delete',
+          data: this.$http.adornData({})
+        }).then(({ data }) => {
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success',
+            duration: 500,
+            onClose: () => {
+              this.refreshChange()
+            }
+          })
+        })
+      }).catch(() => { })
+    },
+    // 刷新回调用
+    refreshChange () {
+      this.page.currentPage = 1
+      this.getDataList(this.page)
+    },
+    searchChange () {
+      this.page.currentPage = 1
+      this.page.pageSize = 10
+      this.getDataList(this.page)
+    },
+    handleSizeChange (val) {
+      this.page.pageSize = val
+      this.getDataList(this.page)
+    },
+    handleCurrentChange (val) {
+      this.page.currentPage = val
+      this.getDataList(this.page)
+    },
+    addOrUpdateHandleIssuePic(issueId){
+      this.issuePicVisible = true
+      this.$nextTick(() => {
+        this.$refs.issuePicRef.init(issueId)
+      })
+    },
+    addOrUpdateHandleUserCard(){
+
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+
+.mod-shop-refundAddr {
+  .main-container {
+    margin: 0;
+    padding: 0;
+  }
+}
+</style>

+ 267 - 0
src/views/modules/ar/arIssue/add-or-update.vue

@@ -0,0 +1,267 @@
+<template>
+  <el-dialog
+    :title="
+      !dataForm.issueId
+        ? '新增发行'
+        : '修改发行'
+    "
+    :close-on-click-modal="false"
+    :visible.sync="visible"
+    :width="dialogWidth"
+  >
+    <el-form
+      :model="dataForm"
+      :rules="dataRule"
+      :inline="true"
+      label-width="80px"
+      ref="dataForm"
+    >
+      <el-form-item
+        label="发行名称"
+        prop="issueName"
+        :label-width="labelWidth"
+      >
+        <el-input
+          v-model="dataForm.issueName"
+          placeholder="发行名称"
+          size="small"
+          style="width: 250px"
+        ></el-input>
+      </el-form-item>
+      <el-form-item
+        label="发行总量"
+        prop="issueCount"
+        :label-width="labelWidth"
+      >
+        <el-input
+          v-model="dataForm.issueCount"
+          size="small"
+          style="width: 250px"
+          placeholder="发行总量"
+          type="number"
+          :min="1"
+        >
+          <template slot="append">张</template>
+        </el-input>
+      </el-form-item>
+      <el-form-item label="发行时间" prop="issueTime" :label-width="labelWidth">
+        <el-date-picker
+          style="width: 250px"
+          size="small"
+          v-model="dataForm.issueTime"
+          type="datetime"
+          placeholder="发行时间"
+          value-format="yyyy-MM-dd HH:mm:ss"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item :label-width="labelWidth" label="柄图款数" prop="issueStyles">
+        <el-input
+          v-model="dataForm.issueStyles"
+          size="small"
+          style="width: 250px"
+          placeholder="柄图款数"
+          type="number"
+          :min="1"
+        >
+          <template slot="append">款</template>
+        </el-input>
+      </el-form-item>
+      <el-form-item
+        label="发行描述"
+        prop="issueDesc"
+        :label-width="labelWidth"
+      >
+        <el-input
+          v-model="dataForm.issueDesc"
+          style="width: 600px"
+          rows="5"
+          size="small"
+          placeholder="发行描述"
+          type="textarea"
+        ></el-input>
+      </el-form-item>
+      <el-divider>图鉴主题配置</el-divider>
+      <el-row>
+        <el-form-item label="封面图">
+          <el-upload
+            ref="frontUpload"
+            list-type="picture-card"
+            accept="image/*"
+            :multiple="false"
+            action="#"
+            :limit="1"
+            :show-file-list="false"
+            :http-request="uploadIssueCover"
+            :headers="{Authorization: $cookie.get('Authorization_vs'),locale:lang}"
+            :on-remove="(res,file)=>{onFrontRemove(res,file)}">
+            <img v-if="dataForm.issueTopic.issueCover" :src="resourcesUrl + dataForm.issueTopic.issueCover" class="avatar">
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+          </el-upload>
+        </el-form-item>
+      </el-row>
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="主题背景色" label-align="left" label-width="90px">
+            <el-color-picker v-model="dataForm.issueTopic.issueBgColor" size="small"></el-color-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="级别背景色" label-align="left" label-width="90px">
+            <el-color-picker v-model="dataForm.issueTopic.cardTypeBgColor" size="small"></el-color-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="级别名颜色" label-align="left" label-width="90px">
+            <el-color-picker v-model="dataForm.issueTopic.cardTypeFontColor" size="small"></el-color-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="柄图名颜色" label-align="left" label-width="90px">
+            <el-color-picker v-model="dataForm.issueTopic.cardFontColor" size="small"></el-color-picker>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <div class="default-btn" @click="visible = false">{{ $t("crud.filter.cancelBtn") }}</div>
+      <div @click="dataFormSubmit()" class="default-btn primary-btn">{{ $t("crud.filter.submitBtn") }}</div>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import { setDialogWidth, widthChange } from '@/utils/setDialogWidth'
+import { Debounce } from '@/utils/debounce'
+export default {
+  data () {
+    return {
+      visible: false,
+      dataForm: {
+        issueId: null,
+        issueName: null,
+        issueDesc: null,
+        issueCount: 0,
+        issueStyles: 0,
+        issueTime: null,
+        issueTopic: {
+          issueCover: null,
+          issueBgColor: null,
+          cardTypeBgColor: null,
+          cardTypeFontColor: null,
+          cardFontColor: null
+        },
+      },
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+      lang: localStorage.getItem('lang'),
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      dataRule: {
+        issueName: [
+          { required: true, message: '发行名称不能为空', trigger: 'blur' },
+        ],
+      },
+      dialogWidth: '',
+      defWidth: localStorage.getItem('lang') === 'en' ? 850 : 750,
+      labelWidth: localStorage.getItem('lang') === 'en' ? '130px' : '80px',
+
+      // 正在提交
+      isSubmitting: false
+    }
+  },
+  created () {
+    this.dialogWidth = setDialogWidth(this.defWidth)
+  },
+  mounted () {
+    widthChange(this, this.defWidth)
+  },
+  methods: {
+    init (issueId) {
+      this.dataForm.issueId = issueId || 0
+      this.visible = true
+      this.$nextTick(() => {
+        this.$refs.dataForm.resetFields()
+      })
+      if (this.dataForm.issueId) {
+        this.$http({
+          url: this.$http.adornUrl(
+            `/ar/arIssue/info/${this.dataForm.issueId}`
+          ),
+          method: 'get',
+          params: this.$http.adornParams()
+        }).then(({ data }) => {
+          this.dataForm.issueId = data.issueId
+          this.dataForm.issueName = data.issueName
+          this.dataForm.issueDesc = data.issueDesc
+          this.dataForm.issueTime = data.issueTime
+          this.dataForm.issueCount = data.issueCount
+          this.dataForm.issueStyles = data.issueStyles
+          if(data.issueTopic){
+            this.dataForm.issueTopic = JSON.parse(data.issueTopic)
+          }
+        })
+      }
+    },
+    // 表单提交
+    dataFormSubmit: Debounce(function () {
+      this.$refs['dataForm'].validate(valid => {
+        if (valid) {
+          if (this.isSubmitting) {
+            return
+          }
+          this.isSubmitting = true
+          if(this.dataForm.issueTopic){
+            this.dataForm.issueTopic = JSON.stringify(this.dataForm.issueTopic)
+          }
+          this.$http({
+            url: this.$http.adornUrl(`/ar/arIssue`),
+            method: this.dataForm.issueId ? 'put' : 'post',
+            data: this.$http.adornData(this.dataForm)
+          }).then(({ data }) => {
+            this.isSubmitting = false
+            this.$message({
+              message: this.$i18n.t('publics.operation'),
+              type: 'success',
+              duration: 500,
+              onClose: () => {
+                this.visible = false
+                this.$emit('refreshDataList', this.page)
+              }
+            })
+          }).catch((error) => {
+            console.log('err', error)
+            this.isSubmitting = false
+          })
+        }
+      })
+    }, 500),
+    uploadIssueCover (event) {
+      const file = event.file
+      const formData = new FormData()
+      formData.append('file', file)
+      formData.append('type', 1)
+      this.$http({
+        url: this.$http.adornUrl('/admin/file/wsjUpload'),
+        method: 'post',
+        headers: {
+          'Content-Type': file.type
+        },
+        data: formData
+      }).then(res => {
+        let data = res.data[0]
+        this.dataForm.issueTopic.issueCover = data.filePath
+      })
+    },
+    onFrontRemove (response, file, fileList) {
+      this.dataForm.issueTopic.issueCover = null
+    },
+  }
+}
+</script>
+<style scoped>
+.v-modal {
+  z-index: 2001 !important;
+}
+</style>

+ 199 - 0
src/views/modules/ar/arIssue/index.vue

@@ -0,0 +1,199 @@
+<template>
+  <div class="mod-ar-arIssue">
+    <div class="main-container">
+      <div class="operation-bar">
+        <div v-if="isAuth('ar:arIssue:save')" class="default-btn primary-btn" @click="addOrUpdateHandle()">{{ $t('crud.addBtn') }}</div>
+      </div>
+      <div class="table-con">
+          <el-table
+            :data="dataList"
+            header-cell-class-name="table-header"
+            row-class-name="table-row-low"
+            style="width: 100%"
+          >
+            <el-table-column
+              label="发行名称"
+              prop="issueName"
+              align="center"
+            >
+            </el-table-column>
+            <!--<el-table-column
+              align="left"
+              prop="issueDesc"
+              label="发行描述"
+              width="250px"
+            >-->
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="issueCount"
+              label="发行总量"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="issueStyles"
+              label="柄图款数"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="issueTime"
+              label="发行时间"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              :label="$t('crud.menu')"
+              width="250"
+              >
+              <template slot-scope="scope">
+                <div class="text-btn-con">
+                  <div class="default-btn text-btn" @click="addOrUpdateHandleIssuePic(scope.row.issueId)">柄图</div>
+                  <div class="default-btn text-btn" @click="addOrUpdateHandleUserCard(scope.row.issueId)">卡片</div>
+                  <div v-if="isAuth('ar:arIssue:update')" class="default-btn text-btn" @click="addOrUpdateHandle(scope.row.issueId)">{{ $t('text.updateBtn') }}</div>
+                  <div v-if="isAuth('ar:arIssue:delete')" class="default-btn text-btn" @click="deleteHandle(scope.row.issueId)">{{ $t('text.delBtn') }}</div>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="page.currentPage"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="page.pageSize"
+          :total="page.total"
+          layout="total, sizes, prev, pager, next, jumper"
+        ></el-pagination>
+    </div>
+    <add-or-update v-if="addOrUpdateVisible"
+                   ref="addOrUpdate"
+                   @refreshDataList="refreshChange"></add-or-update>
+    <issue-pic v-if="issuePicVisible"
+                   ref="issuePicRef"
+                   @refreshDataList="refreshChange"></issue-pic>
+    <issue-user-card v-if="issueUserCardVisible"
+               ref="issueUserCardRef"
+               @refreshDataList="refreshChange"></issue-user-card>
+  </div>
+</template>
+
+<script>
+import AddOrUpdate from './add-or-update'
+import IssuePic from '../arIssuePic/index'
+import IssueUserCard from '../arIssueUserCard/index'
+export default {
+  data () {
+    return {
+      dataList: [],
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      searchForm: {},
+      dataListLoading: false,
+      addOrUpdateVisible: false,
+      issuePicVisible: false,
+      issueUserCardVisible: false,
+    }
+  },
+  components: {
+    AddOrUpdate,
+    IssuePic,
+    IssueUserCard
+  },
+  created () {
+    this.getDataList(this.page)
+  },
+  mounted () {
+  },
+  methods: {
+    getDataList (page, params) {
+      this.dataListLoading = true
+      this.$http({
+        url: this.$http.adornUrl('/ar/arIssue/page'),
+        method: 'get',
+        params: this.$http.adornParams(Object.assign({
+          current: page.currentPage,
+          size: page.pageSize
+        }, this.searchForm))
+      }).then(({ data }) => {
+        this.dataList = data.records
+        this.page.total = data.total
+        this.dataListLoading = false
+      })
+    },
+    // 新增 / 修改
+    addOrUpdateHandle (issueId) {
+      this.addOrUpdateVisible = true
+      this.$nextTick(() => {
+        this.$refs.addOrUpdate.init(issueId)
+      })
+    },
+    deleteHandle (issueId) {
+      this.$confirm(this.$i18n.t('admin.isDeleOper') + '?', this.$i18n.t('text.tips'), {
+        confirmButtonText: this.$i18n.t('crud.filter.submitBtn'),
+        cancelButtonText: this.$i18n.t('crud.filter.cancelBtn'),
+        type: 'warning'
+      }).then(() => {
+        this.$http({
+          url: this.$http.adornUrl('/ar/arIssue/' + issueId),
+          method: 'delete',
+          data: this.$http.adornData({})
+        }).then(({ data }) => {
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success',
+            duration: 500,
+            onClose: () => {
+              this.refreshChange()
+            }
+          })
+        })
+      }).catch(() => { })
+    },
+    // 刷新回调用
+    refreshChange () {
+      this.page.currentPage = 1
+      this.getDataList(this.page)
+    },
+    searchChange () {
+      this.page.currentPage = 1
+      this.page.pageSize = 10
+      this.getDataList(this.page)
+    },
+    handleSizeChange (val) {
+      this.page.pageSize = val
+      this.getDataList(this.page)
+    },
+    handleCurrentChange (val) {
+      this.page.currentPage = val
+      this.getDataList(this.page)
+    },
+    addOrUpdateHandleIssuePic(issueId){
+      this.issuePicVisible = true
+      this.$nextTick(() => {
+        this.$refs.issuePicRef.init(issueId)
+      })
+    },
+    addOrUpdateHandleUserCard(issueId){
+      this.issueUserCardVisible = true
+      this.$nextTick(() => {
+        this.$refs.issueUserCardRef.init(issueId)
+      })
+    },
+  }
+}
+</script>
+<style lang="scss" scoped>
+
+.mod-shop-refundAddr {
+  .main-container {
+    margin: 0;
+    padding: 0;
+  }
+}
+</style>

+ 189 - 0
src/views/modules/ar/arIssueConfig/add-or-update.vue

@@ -0,0 +1,189 @@
+<template>
+  <el-dialog
+    title="柄图发行配置"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+    width="760px"
+    v-if="visible"
+    @close="closeDialog"
+    :visible.sync="visible">
+    <el-form :model="dataForm" size="small" label-width="100px">
+     <!-- <el-row>
+        <el-form-item label="资源类型" prop="assetsType">
+          <el-radio-group v-model="dataForm.assetsType">
+            <el-radio label="Video">视频</el-radio>
+            <el-radio label="Model">模型</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="屏幕方向" prop="screenOrientation">
+          <el-radio-group v-model="dataForm.screenOrientation">
+            <el-radio label="landscape">横屏展示</el-radio>
+            <el-radio label="portrait">竖屏展示</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-row>-->
+      <!--<el-form-item label="选择资源" prop="newReceiverInfo" width="200px">
+        <el-select
+          v-model="dataForm.assetsIdList"
+          placeholder="请选择资源"
+          :remote-method="getAssetsList"
+          multiple clearable filterable>
+          <el-option
+            v-for="assets in assetsList"
+            :key="assets.assetsId"
+            :label="assets.assetsName"
+            :value="assets.assetsId">
+          </el-option>
+        </el-select>
+      </el-form-item>-->
+      <el-row v-if="dataForm.configId">
+        <el-divider>二维码配置</el-divider>
+        <el-col :span="8">
+          <el-form-item label="X坐标">
+            <el-input type="number" v-model="arCodeConfig.arCodeX" style="width:140px">
+              <template slot="append">像素</template>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="Y坐标" label-align="left">
+            <el-input type="number" v-model="arCodeConfig.arCodeY" style="width:140px">
+              <template slot="append">像素</template>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="宽度">
+            <el-input type="number" v-model="arCodeConfig.arCodeWidth" style="width:140px">
+              <template slot="append">像素</template>
+            </el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-button type="primary" @click="handleIssue">批量发行</el-button>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button class="default-btn" @click="visible = false">{{$t("crud.filter.cancelBtn")}}</el-button>
+      <el-button class="default-btn primary-btn" type="primary" @click="handleIssue()">{{$t("crud.filter.submitBtn")}}</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  components: {
+
+  },
+  data () {
+    return {
+      visible: false,
+      dataForm: {
+        configId: null,
+        issuePicId: null,
+        issueId: null,
+        assetsType: 'Video',
+        assetsPackage: null,
+        assetsIdList:[],
+        screenOrientation: 'portrait'
+      },
+      arCodeConfig:{
+        configId: null,
+        arCodeX: 0,
+        arCodeY: 0,
+        arCodeWidth: 0
+      },
+      assetsList:[],
+      dataRule: {
+      },
+    }
+  },
+
+  created() {
+    this.getAssetsList()
+  },
+  methods: {
+    init (issuePicId, issueId) {
+      this.dataForm.issuePicId = issuePicId || null
+      this.dataForm.issueId = issueId || null
+      this.visible = true
+      this.$nextTick(() => {
+        if (this.dataForm.issuePicId) {
+          this.$http({
+            url: this.$http.adornUrl('/ar/arIssuePicAssetsConfig/infoByPicId/' + this.dataForm.issuePicId),
+            method: 'get',
+            params: this.$http.adornParams()
+          }).then(({data}) => {
+            if(data){
+              this.dataForm.issueId = data.issueId
+              this.dataForm.issuePicId = data.issuePicId
+              this.dataForm.configId = data.configId
+              this.dataForm.screenOrientation = data.screenOrientation
+              this.arCodeConfig.configId = data.configId
+              for(let i in data.assetsPackageArray){
+                this.dataForm.assetsIdList.push(data.assetsPackageArray[i].videoId)
+              }
+            }
+          })
+        }
+      })
+    },
+    // 表单提交
+    dataFormSubmit () {
+      if(!this.dataForm.assetsType){
+        this.$message.error("资源类型必选")
+        return;
+      }
+      this.$http({
+        url: this.$http.adornUrl('/ar/arIssuePicAssetsConfig'),
+        method: this.dataForm.configId ? 'put' : 'post',
+        data: this.$http.adornData(this.dataForm)
+      }).then(({data}) => {
+        this.$message({
+          message: this.$i18n.t('publics.operation'),
+          type: 'success'
+        });
+        this.closeDialog()
+      })
+    },
+    getAssetsList(assetsName){
+      this.$http({
+        url: this.$http.adornUrl('/ar/arAssets/listByName'),
+        method: 'get',
+        params: this.$http.adornParams({assetsName: assetsName})
+      }).then(({data}) => {
+        this.assetsList = data
+      })
+    },
+    handleIssue(){
+      this.$confirm('确定要生成卡片吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.$http({
+          url: this.$http.adornUrl('/ar/arIssuePicAssetsConfig/issue'),
+          method: 'post',
+          data: this.$http.adornData(this.arCodeConfig)
+        }).then(() => {
+          this.$message({
+            message: '请刷新查看发行进度',
+            type: 'success'
+          });
+          this.closeDialog()
+        })
+      })
+    },
+    closeDialog(){
+      this.visible = false;
+      this.dataForm = {
+        configId: null,
+        issuePicId: null,
+        issueId: null,
+        assetsType: 'Video',
+        assetsPackage: null,
+        assetsIdList:[]
+      }
+    },
+  }
+}
+</script>

+ 213 - 0
src/views/modules/ar/arIssueConfig/interactive-config.vue

@@ -0,0 +1,213 @@
+<template>
+  <el-dialog
+    title="互动视频配置"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+    width="50%"
+    v-if="visible"
+    @close="closeDialog"
+    :visible.sync="visible">
+    <el-form :model="dataForm" size="small" label-width="100px">
+      <el-divider>基础配置</el-divider>
+      <el-row>
+        <el-form-item label="资源类型" prop="assetsType">
+          <el-radio-group v-model="dataForm.assetsType">
+            <el-radio label="Video">视频</el-radio>
+            <el-radio label="Model">模型</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="屏幕方向" prop="screenOrientation">
+          <el-radio-group v-model="dataForm.screenOrientation">
+            <el-radio label="landscape">横屏展示</el-radio>
+            <el-radio label="portrait">竖屏展示</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-row>
+      <el-divider>剧情配置</el-divider>
+      <el-row
+        v-if="videoList"
+        v-for="(video, videoIndex) in videoList">
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="选择视频资源" prop="newReceiverInfo">
+              <el-select
+                size="large"
+                v-model="video.videoId"
+                placeholder="请选择资源"
+                :remote-method="getAssetsList"
+                clearable filterable>
+                <el-option
+                  v-for="assets in assetsList"
+                  :key="assets.assetsId"
+                  :label="assets.assetsName"
+                  :value="assets.assetsId">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item
+              label="视频类型">
+              <el-select
+                size="large"
+                v-model="video.isFirst">
+                <el-option key="1" label="开头视频" :value=1 ></el-option>
+                <el-option key="0" label="剧情视频" :value=0 ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-button size="medium" type="danger" @click.prevent="removeVideo(videoIndex)">删除</el-button>
+          </el-col>
+        </el-row>
+        <el-divider content-position="left">剧情选项</el-divider>
+        <el-row v-if="video.endOptions" v-for="(option, optionIndex) in video.endOptions">
+          <el-col :span="8">
+            <el-form-item label="选项名称:">
+              <el-input v-model="option.optionName" size="medium" style="width: 215px"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="跳转到:">
+              <el-select
+                size="large"
+                v-model="option.jumpToVideoId"
+                placeholder="请选择资源"
+                :remote-method="getAssetsList"
+                clearable filterable>
+                <el-option
+                  v-for="assets in assetsList"
+                  :key="assets.assetsId"
+                  :label="assets.assetsName"
+                  :value="assets.assetsId">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-button size="medium" type="danger" @click.prevent="removeOptions(videoIndex, optionIndex)">删除选项</el-button>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-button size="medium" type="success" @click.prevent="addOptions(videoIndex)">新增选项</el-button>
+        </el-row>
+        <el-divider></el-divider>
+      </el-row>
+      <el-row>
+        <el-button size="medium" type="primary" @click="addVideo">新增互动视频</el-button>
+      </el-row>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button class="default-btn" @click="visible = false">{{$t("crud.filter.cancelBtn")}}</el-button>
+      <el-button class="default-btn primary-btn" type="primary" @click="dataFormSubmit()">{{$t("crud.filter.submitBtn")}}</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+  export default {
+    components: {
+
+    },
+    data () {
+      return {
+        visible: false,
+        assetsList:[],
+        prodId: null,
+        videoList: [],
+        dataForm:{},
+      }
+    },
+
+    created() {
+      this.getAssetsList();
+    },
+    methods: {
+      init (issuePicId, issueId) {
+        this.dataForm.issuePicId = issuePicId || null
+        this.dataForm.issueId = issueId || null
+        this.visible = true
+        this.$nextTick(() => {
+          if (this.dataForm.issuePicId) {
+            this.$http({
+              url: this.$http.adornUrl('/ar/arIssuePicAssetsConfig/infoByPicId/' + this.dataForm.issuePicId),
+              method: 'get',
+              params: this.$http.adornParams()
+            }).then(({data}) => {
+              if(data){
+                this.dataForm.issueId = data.issueId
+                this.dataForm.issuePicId = data.issuePicId
+                this.dataForm.configId = data.configId
+                this.dataForm.assetsType = data.assetsType
+                this.dataForm.screenOrientation = data.screenOrientation
+                this.videoList = data.assetsPackageArray
+              }
+            })
+          }
+        })
+      },
+      // 表单提交
+      dataFormSubmit () {
+        let url = '/ar/arIssuePicAssetsConfig/saveConfig'
+        if(this.dataForm.configId){
+          url = '/ar/arIssuePicAssetsConfig/updateConfig'
+        }
+        this.dataForm.assetsPackageArray = this.videoList
+        this.$http({
+          url: this.$http.adornUrl(url),
+          method: 'post',
+          data: this.$http.adornData(this.dataForm)
+        }).then(({data}) => {
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success'
+          });
+          this.closeDialog()
+        })
+      },
+      getAssetsList(assetsName){
+        this.$http({
+          url: this.$http.adornUrl('/ar/arAssets/listByName'),
+          method: 'get',
+          params: this.$http.adornParams({assetsName: assetsName})
+        }).then(({data}) => {
+          this.assetsList = data
+        })
+      },
+      addVideo(){
+        if(!this.videoList){
+          this.videoList = []
+        }
+        this.videoList.push({
+          videoId: null,
+          isFirst: null,
+          endOptions: []
+        });
+
+      },
+      removeVideo(videoIndex){
+        this.videoList.splice(videoIndex, 1)
+      },
+      addOptions(videoIndex){
+        const video = this.videoList[videoIndex]
+        const endOption = {optionName: '', jumpToVideoId: null}
+        if(video.endOptions){
+          let endOptions = video.endOptions
+          endOptions.push(endOption)
+          this.$set(this.videoList[videoIndex], "endOptions", endOptions);
+        }else{
+          let endOptions = [endOption]
+          this.$set(this.videoList[videoIndex], "endOptions", endOptions);
+        }
+      },
+      removeOptions(assetsIndex, optionIndex){
+        let video = this.videoList[assetsIndex]
+        video.endOptions.splice(optionIndex, 1)
+      },
+      closeDialog(){
+        this.visible = false;
+        this.videoList = []
+      },
+    }
+  }
+</script>

+ 437 - 0
src/views/modules/ar/arIssuePic/add-or-update.vue

@@ -0,0 +1,437 @@
+<template>
+  <el-drawer
+    :title="
+      !dataForm.issuePicId
+        ? '新增柄图'
+        : '修改柄图'
+    "
+    :visible.sync="visible"
+    :direction="direction"
+    :append-to-body="true"
+    size="50%"
+    :before-close="handleClose"
+    custom-class="demo-drawer"
+  >
+    <div class="demo-drawer__content">
+      <el-form
+      :model="dataForm"
+      :rules="dataRule"
+      :inline="true"
+      label-width="80px"
+      ref="dataForm"
+      style="margin-left: 20px"
+    >
+      <el-form-item
+        label="柄图名称"
+        prop="issuePicName"
+        v-if="dataForm.showName"
+      >
+        <el-input
+          v-model="dataForm.issuePicName"
+          placeholder="柄图名称"
+          size="small"
+          style="width: 250px"
+        ></el-input>
+      </el-form-item>
+      <el-form-item
+        label="发行数量"
+        prop="issuePicCount"
+      >
+        <el-input
+          v-model="dataForm.issuePicCount"
+          size="small"
+          style="width: 250px"
+          placeholder="发行总量"
+          type="number"
+          :min="1"
+        >
+          <template slot="append">张</template>
+        </el-input>
+      </el-form-item>
+      <el-form-item
+        label="等级分类"
+        prop="issuePicLevel"
+      >
+        <el-input
+          v-model="dataForm.issuePicLevel"
+          placeholder="等级分类"
+          size="small"
+          style="width: 250px"
+        ></el-input>
+      </el-form-item>
+      <el-row>
+        <el-form-item prop="picType" label="柄图尺寸">
+          <el-radio-group v-model="dataForm.picType">
+            <el-radio label="6x9">6x9</el-radio>
+            <el-radio label="3CXK">3寸</el-radio>
+            <el-radio label="D3CXK">大3寸</el-radio>
+            <el-radio label="ZP">直拍</el-radio>
+            <el-radio label="MXP">明信片</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-row>
+      <div v-if="frontUploadErrorTips" style="color: red; font-size: 18px">正面:{{frontUploadErrorTips + '尺寸不对'}}</div>
+      <el-row>
+        <el-col>
+          <el-form-item label="柄图正面" prop="frontUrl">
+            <el-upload
+              ref="frontUpload"
+              list-type="picture-card"
+              accept="image/*"
+              :multiple="frontMultiple"
+              :before-upload="(file, fileList)=>handleBeforeUpload(file, fileList,'Front')"
+              action="#"
+              :limit="frontLimit"
+              :file-list="dataForm.frontList"
+              :http-request="uploadFrontPic"
+              :headers="{Authorization: $cookie.get('Authorization_vs'),locale:lang}"
+              :on-remove="(res,file)=>{onFrontRemove(res,file)}"
+              :on-success="(res,file)=>{onFrontUploadSuccess(res,file)}">
+              <i class="el-icon-plus"></i>
+            </el-upload>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <div v-if="backUploadErrorTips" style="color: red; font-size: 18px">背面:{{backUploadErrorTips + '尺寸不对'}}</div>
+      <el-row>
+        <el-col>
+          <el-form-item label="柄图背面" prop="backUrl">
+            <el-upload
+              ref="backUpload"
+              list-type="picture-card"
+              accept="image/*"
+              :multiple="true"
+              :before-upload="(file, fileList)=>handleBeforeUpload(file, fileList,'Back')"
+              action="#"
+              :limit="1"
+              :file-list="dataForm.backList"
+              :http-request="uploadBackPic"
+              :headers="{Authorization: $cookie.get('Authorization_vs'),locale:lang}"
+              :on-success="(res,file)=>{onBackUploadSuccess(res,file)}"
+              :on-remove="(res,file)=>{onBackRemove(res,file)}">
+              <i class="el-icon-plus"></i>
+            </el-upload>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+      <div class="demo-drawer__footer">
+        <div class="default-btn" @click="visible = false">{{ $t("crud.filter.cancelBtn") }}</div>
+        <div @click="dataFormSubmit()" class="default-btn primary-btn">{{ $t("crud.filter.submitBtn") }}</div>
+      </div>
+    </div>
+  </el-drawer>
+</template>
+
+<script>
+import { setDialogWidth, widthChange } from '@/utils/setDialogWidth'
+import ImgUpload from '@/components/imgs-upload'
+export default {
+  components: {
+    ImgUpload
+  },
+  data () {
+    return {
+      frontMultiple: true,
+      frontLimit: 40,
+      visible: false,
+      direction: 'rtl',
+      dataForm: {
+        showName: false,
+        issuePicId: null,
+        issueId: null,
+        issuePicName: null,
+        issuePicCount: null,
+        frontUrl: null,
+        backUrl: null,
+        backList: [],
+        frontList: [],
+        picType: "6x9",
+        back: {},
+        issuePicLevel: null
+      },
+      lang: localStorage.getItem('lang'),
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      dataRule: {
+        issueName: [
+          { required: true, message: '发行名称不能为空', trigger: 'blur' },
+        ],
+      },
+      dialogWidth: '',
+      defWidth: localStorage.getItem('lang') === 'en' ? 850 : 750,
+      labelWidth: localStorage.getItem('lang') === 'en' ? '130px' : '80px',
+
+      // 正在提交
+      isSubmitting: false,
+      frontUploadErrorTips: '',
+      backUploadErrorTips: '',
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+    }
+  },
+  created () {
+    this.dialogWidth = setDialogWidth(this.defWidth)
+  },
+  mounted () {
+    widthChange(this, this.defWidth)
+  },
+  methods: {
+    addInit (issueId) {
+      this.dataForm.issueId = issueId || 0
+      this.dataForm.picType = null
+      this.dataForm.frontUrl = null
+      this.dataForm.backUrl = null
+      this.dataForm.issuePicName = null
+      this.dataForm.issuePicCount = 0
+      this.visible = true
+      this.dataForm.frontList = []
+      this.dataForm.backList = []
+      this.dataForm.front = {}
+      this.dataForm.back = {}
+      this.frontMultiple = true
+      this.frontLimit = 40
+    },
+    updateInit (issuePicId) {
+      this.dataForm.issuePicId = issuePicId || 0
+      this.dataForm.showName = true
+      this.visible = true
+      this.$nextTick(() => {
+        this.$refs.dataForm.resetFields()
+        this.frontMultiple = false
+        this.frontLimit = 1
+      })
+      if (this.dataForm.issuePicId) {
+        this.$http({
+          url: this.$http.adornUrl(
+            `/ar/arIssuePic/info/${this.dataForm.issuePicId}`
+          ),
+          method: 'get',
+          params: this.$http.adornParams()
+        }).then(({ data }) => {
+          this.dataForm.issueId = data.issueId
+          this.dataForm.issuePicId = data.issuePicId
+          this.dataForm.issuePicName = data.issuePicName
+          this.dataForm.issuePicCount = data.issuePicCount
+          this.dataForm.frontUrl = data.frontUrl
+          this.dataForm.backUrl = data.backUrl
+          this.dataForm.picType = data.picType
+          this.dataForm.issuePicLevel = data.issuePicLevel
+          let front = {name: data.issuePicName, url: this.resourcesUrl + this.dataForm.frontUrl, path: this.dataForm.frontUrl}
+          let back = {name: data.issuePicName, url: this.resourcesUrl + this.dataForm.backUrl, path: this.dataForm.backUrl}
+          this.dataForm.frontList.push(front)
+          this.dataForm.backList.push(back)
+          this.dataForm.back = back
+        })
+      }
+    },
+    // 表单提交
+    async dataFormSubmit () {
+      if (this.isSubmitting) {
+        return
+      }
+      try{
+        this.dataForm.frontUrl = this.dataForm.frontList.join(",");
+        this.isSubmitting = true
+        this.$http({
+          url: this.$http.adornUrl(`/ar/arIssuePic`),
+          method: this.dataForm.issuePicId ? 'put' : 'post',
+          data: this.$http.adornData(this.dataForm)
+        }).then(({ data }) => {
+          this.isSubmitting = false
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success',
+            duration: 500,
+            onClose: () => {
+              this.handleClose()
+              this.$emit('refreshDataList', this.page)
+            }
+          })
+        }).catch((error) => {
+          console.log('err', error)
+          this.isSubmitting = false
+        })
+      }catch (error) {
+        this.$message.error(`第 ${error + 1} 张图片不符合尺寸要求。`)
+        this.isSubmitting = false
+      }
+    },
+    handleClose(done) {
+      this.visible = false
+      this.frontMultiple = false
+      this.frontLimit = 40
+      this.dataForm = {
+        issuePicId: null,
+        issueId: null,
+        issuePicName: null,
+        issuePicCount: null,
+        frontUrl: null,
+        backUrl: null,
+        backList: [],
+        frontList: [],
+        back:{},
+        picType: "6x9"
+      }
+    },
+
+    checkImageSize(imageStr, index) {
+      let width = 780
+      let height = 1134
+      let picType = this.dataForm.picType
+      if (picType === '3CXK') {
+        width = 709
+        height = 1087
+      } else if (picType === '6x9') {
+        width = 780
+        height = 1134
+      } else if (picType === 'ZP') {
+        width = 732
+        height = 1252
+      }else if (picType === 'MXP') {
+        width = 1252
+        height = 1819
+      }else if (picType === 'D3CXK') {
+        width = 803
+        height = 1098
+      }else{
+        width = 780
+        height = 1134
+      }
+      return new Promise((resolve, reject) => {
+        let image = new Image();
+        image.onload = function() {
+          let imageFormat = imageStr.split('.').pop();
+          if(imageFormat !== 'jpg'){
+            reject(index);
+          }
+          if ((image.width === width && image.height === height)) {
+            resolve();
+          } else {
+            reject(index);
+          }
+        };
+        image.src = this.resourcesUrl + imageStr;
+      });
+    },
+
+    handleBeforeUpload (file, fileList, frontOrBack) {
+      // let index = fileList.findIndex(item => item.name === file.name)
+      let _this = this
+      let isSize = true
+      let width = 780
+      let height = 1134
+      let picType = this.dataForm.picType
+      if (picType === '3CXK') {
+        width = 709
+        height = 1087
+      } else if (picType === '6x9') {
+        width = 780
+        height = 1134
+      }else if (picType === 'MXP') {
+        width = 1252
+        height = 1819
+      }else if (picType === 'D3CXK') {
+        width = 803
+        height = 1098
+      }else if (picType === 'ZP') {
+        width = 732
+        height = 1252
+      }
+      isSize = new Promise(function(resolve, reject) {
+        let _URL = window.URL || window.webkitURL
+        let image = new Image()
+        image.onload = function() {
+          let valid = image.naturalWidth === width && image.naturalHeight === height
+          valid ? resolve() : reject()
+        }
+        image.src = _URL.createObjectURL(file)
+      }).then(
+        () => {
+          return file;
+        },
+        () => {
+          if(frontOrBack === 'Front'){
+            _this.frontUploadErrorTips = file.name
+          }else{
+            _this.backUploadErrorTips = file.name
+          }
+          return Promise.reject()
+        }
+      )
+      return isSize;
+    },
+
+    onFrontUploadSuccess (response, file, fileList) {
+
+    },
+    onBackUploadSuccess (response, file, fileList) {
+
+    },
+
+    onFrontRemove (response, file, fileList) {
+      let index = this.dataForm.frontList.findIndex((item) => item.path = response.path)
+      this.dataForm.frontList.splice(index, 1)
+    },
+    onBackRemove (response, file, fileList) {
+      let index = this.dataForm.backList.findIndex((item) => item.path = response.path)
+      this.dataForm.backList.splice(index, 1)
+    },
+
+    /**
+     * 上传正面图片
+     */
+
+    uploadFrontPic (event) {
+      const file = event.file
+      const formData = new FormData()
+      formData.append('file', file)
+      formData.append('type', 2)
+      this.$http({
+        url: this.$http.adornUrl('/admin/file/wsjUpload'),
+        method: 'post',
+        headers: {
+          'Content-Type': file.type
+        },
+        data: formData
+      }).then(res => {
+        let data = res.data[0]
+        let front = {name: file.name, url: this.resourcesUrl + data.filePath, path: data.filePath}
+        this.dataForm.frontList.push(front)
+      })
+    },
+
+    /**
+     * 上传正面图片
+     */
+
+    uploadBackPic (event) {
+      const file = event.file
+      const formData = new FormData()
+      formData.append('file', file)
+      formData.append('type', 2)
+      this.$http({
+        url: this.$http.adornUrl('/admin/file/wsjUpload'),
+        method: 'post',
+        headers: {
+          'Content-Type': file.type
+        },
+        data: formData
+      }).then(res => {
+        let data = res.data[0]
+        let back = {name: file.name, url: this.resourcesUrl + data.filePath, path: data.filePath}
+        this.dataForm.backList.push(back)
+        this.dataForm.back = back
+      })
+    },
+
+  }
+}
+</script>
+<style scoped>
+.v-modal {
+  z-index: 2001 !important;
+}
+</style>

+ 251 - 0
src/views/modules/ar/arIssuePic/index.vue

@@ -0,0 +1,251 @@
+<template>
+  <el-drawer
+    title="发行柄图"
+    :visible.sync="visible"
+    :direction="direction"
+    size="60%"
+    :before-close="handleClose">
+    <div class="mod-ar-arIssuePic" style="margin-left: 24px">
+      <div class="main-container">
+        <div class="operation-bar">
+          <div v-if="isAuth('ar:arIssuePic:save')" class="default-btn primary-btn" @click="addHandle()">{{ $t('crud.addBtn') }}</div>
+        </div>
+        <div class="table-con">
+          <el-table
+            :data="dataList"
+            header-cell-class-name="table-header"
+            row-class-name="table-row-low"
+            style="width: 100%"
+          >
+            <el-table-column
+              label="图片名称"
+              prop="issuePicName"
+              align="center"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="issuePicCount"
+              label="发行数量"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="issuePicLevel"
+              label="等级"
+            >
+            </el-table-column>
+            <!-- 正面图 -->
+            <el-table-column label="正面" prop="frontUrl" align="center">
+              <template slot-scope="scope">
+                <el-image
+                  style="width: 100px; height: 100px"
+                  :src="resourcesUrl + scope.row.frontUrl"
+                  v-if="scope.row.frontUrl"
+                  fit="fill"
+                  @click="previewPic(scope.row.frontUrl)"
+                />
+              </template>
+            </el-table-column>
+            <!-- 背面图 -->
+            <el-table-column label="背面" prop="backUrl" align="center">
+              <template slot-scope="scope">
+                <el-image
+                  style="width: 100px; height: 100px"
+                  :src="resourcesUrl + scope.row.backUrl"
+                  v-if="scope.row.backUrl"
+                  fit="fill"
+                  @click="previewPic(scope.row.backUrl)"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column
+              align="center"
+              :label="$t('crud.menu')"
+              width="250"
+            >
+              <template slot-scope="scope">
+                <div class="text-btn-con">
+<!--                  <div v-if="isAuth('ar:arIssue:update')" class="default-btn text-btn" @click="configHandle(scope.row.issuePicId)">基础配置</div>-->
+                  <div v-if="isAuth('ar:arIssue:update')" class="default-btn text-btn" @click="interactiveConfigHandle(scope.row.issuePicId)">互动配置</div>
+                  <div v-if="isAuth('ar:arIssue:update')" class="default-btn text-btn" @click="issueConfigHandle(scope.row.issuePicId)">发行配置</div>
+                  <div v-if="isAuth('ar:arIssue:update')" class="default-btn text-btn" @click="updateHandle(scope.row.issuePicId)">{{ $t('text.updateBtn') }}</div>
+                  <div v-if="isAuth('ar:arIssue:delete')" class="default-btn text-btn" @click="deleteHandle(scope.row.issuePicId)">{{ $t('text.delBtn') }}</div>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="page.currentPage"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="page.pageSize"
+          :total="page.total"
+          layout="total, sizes, prev, pager, next, jumper"
+        ></el-pagination>
+      </div>
+      <add-or-update v-if="addOrUpdateVisible"
+                     ref="addOrUpdate"
+                     @refreshDataList="refreshChange"></add-or-update>
+      <el-dialog :visible.sync="previewPicDialogVisible" :modal="false" title="图片预览" width="30%" top="3vh">
+        <el-image :src="previewPicUrl" alt=""  style="width: 100%; height: 100%"/>
+      </el-dialog>
+      <config-add-or-update ref="configAddOrUpdate"></config-add-or-update>
+      <interactive-config ref="interactiveConfigAddOrUpdate"></interactive-config>
+    </div>
+  </el-drawer>
+
+</template>
+
+<script>
+import AddOrUpdate from './add-or-update'
+import ConfigAddOrUpdate from '../arIssueConfig/add-or-update'
+import InteractiveConfig from "../arIssueConfig/interactive-config";
+export default {
+  data () {
+    return {
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+      addOrUpdateVisible: false,
+      dataList: [],
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      searchForm: {},
+      dataListLoading: false,
+      visible: false,
+      direction: "rtl",
+      issueId: null,
+      previewPicUrl: null,
+      previewPicDialogVisible: false,
+      configVisible: false,
+      interactiveConfigVisible: false,
+    }
+  },
+  components: {
+    InteractiveConfig,
+    AddOrUpdate,
+    ConfigAddOrUpdate
+  },
+  created () {
+    this.getDataList(this.page)
+  },
+  mounted () {
+  },
+  methods: {
+    getDataList (page, params) {
+      this.dataListLoading = true
+      this.$http({
+        url: this.$http.adornUrl('/ar/arIssuePic/page'),
+        method: 'get',
+        params: this.$http.adornParams(Object.assign({
+          current: page.currentPage,
+          size: page.pageSize,
+          issueId: this.issueId
+        }, this.searchForm))
+      }).then(({ data }) => {
+        this.dataList = data.records
+        this.page.total = data.total
+        this.dataListLoading = false
+      })
+    },
+    init(issueId){
+      this.issueId = issueId || 0
+      this.visible = true
+      if (this.issueId) {
+        this.getDataList(this.page)
+      }
+    },
+    // 新增 / 修改
+    addHandle (issueId) {
+      this.addOrUpdateVisible = true
+      this.$nextTick(() => {
+        this.$refs.addOrUpdate.addInit(this.issueId)
+      })
+    },
+    // 新增 / 修改
+    updateHandle (issuePicId) {
+      this.addOrUpdateVisible = true
+      this.$nextTick(() => {
+        this.$refs.addOrUpdate.updateInit(issuePicId)
+      })
+    },
+    // 新增 / 修改
+    issueConfigHandle (issuePicId) {
+      this.configVisible = true
+      this.$nextTick(() => {
+        this.$refs.configAddOrUpdate.init(issuePicId, this.issueId)
+      })
+    },
+    interactiveConfigHandle(issuePicId){
+      this.interactiveConfigVisible = true
+      this.$nextTick(() => {
+        this.$refs.interactiveConfigAddOrUpdate.init(issuePicId, this.issueId)
+      })
+    },
+    deleteHandle (issuePicId) {
+      this.$confirm(this.$i18n.t('admin.isDeleOper') + '?', this.$i18n.t('text.tips'), {
+        confirmButtonText: this.$i18n.t('crud.filter.submitBtn'),
+        cancelButtonText: this.$i18n.t('crud.filter.cancelBtn'),
+        type: 'warning'
+      }).then(() => {
+        this.$http({
+          url: this.$http.adornUrl('/ar/arIssuePic/' + issuePicId),
+          method: 'delete',
+          data: this.$http.adornData({})
+        }).then(({ data }) => {
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success',
+            duration: 300,
+            onClose: () => {
+              this.refreshChange()
+            }
+          })
+        })
+      }).catch(() => { })
+    },
+    // 刷新回调用
+    refreshChange () {
+      // this.page.currentPage = 1
+      this.getDataList(this.page)
+    },
+    searchChange () {
+      this.page.currentPage = 1
+      this.page.pageSize = 10
+      this.getDataList(this.page)
+    },
+    handleSizeChange (val) {
+      this.page.pageSize = val
+      this.getDataList(this.page)
+    },
+    handleCurrentChange (val) {
+      this.page.currentPage = val
+      this.getDataList(this.page)
+    },
+
+    addOrUpdateHandleIssuePic(){
+
+    },
+    handleClose(done) {
+      this.visible = false
+    },
+    previewPic(url){
+      this.previewPicUrl = this.resourcesUrl + url;
+      this.previewPicDialogVisible = true;
+    },
+  }
+}
+</script>
+<style lang="scss" scoped>
+
+.mod-shop-refundAddr {
+  .main-container {
+    margin: 0;
+    padding: 0;
+  }
+}
+</style>

+ 333 - 0
src/views/modules/ar/arIssueUserCard/add-or-update.vue

@@ -0,0 +1,333 @@
+<template>
+  <el-drawer
+    :title="
+      !dataForm.cardId
+        ? '生成卡片'
+        : '更新卡片'
+    "
+    :visible.sync="visible"
+    :direction="direction"
+    :append-to-body="true"
+    size="50%"
+    :before-close="handleClose"
+    custom-class="demo-drawer"
+  >
+    <div class="demo-drawer__content">
+      <el-form
+      :model="dataForm"
+      :rules="dataRule"
+      :inline="true"
+      label-width="80px"
+      ref="dataForm"
+      style="margin-left: 20px"
+    >
+      <el-form-item prop="issuePicId" label="生成柄图">
+        <el-select v-model="dataForm.issuePicId" clearable filterable>
+          <el-option
+            v-for="pic in issuePicList"
+            :key="pic.issuePicId"
+            :label="pic.issuePicName"
+            :value="pic.issuePicId"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+      <div class="demo-drawer__footer">
+        <div class="default-btn" @click="visible = false">{{ $t("crud.filter.cancelBtn") }}</div>
+        <div @click="dataFormSubmit()" class="default-btn primary-btn">{{ $t("crud.filter.submitBtn") }}</div>
+      </div>
+    </div>
+  </el-drawer>
+</template>
+
+<script>
+import { setDialogWidth, widthChange } from '@/utils/setDialogWidth'
+import ImgUpload from '@/components/imgs-upload'
+export default {
+  components: {
+    ImgUpload
+  },
+  data () {
+    return {
+      frontMultiple: true,
+      frontLimit: 40,
+      visible: false,
+      direction: 'rtl',
+      issuePicList: [],
+      dataForm: {
+        showName: false,
+        issuePicId: null,
+        issueId: null,
+        issuePicName: null,
+        issuePicCount: null,
+        frontUrl: null,
+        backUrl: null,
+        backList: [],
+        frontList: [],
+        picSize: "6x9",
+        back: {},
+      },
+      lang: localStorage.getItem('lang'),
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      dataRule: {
+        issueName: [
+          { required: true, message: '发行名称不能为空', trigger: 'blur' },
+        ],
+      },
+      dialogWidth: '',
+      defWidth: localStorage.getItem('lang') === 'en' ? 850 : 750,
+      labelWidth: localStorage.getItem('lang') === 'en' ? '130px' : '80px',
+
+      // 正在提交
+      isSubmitting: false,
+      frontUploadErrorTips: '',
+      backUploadErrorTips: '',
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+    }
+  },
+  created () {
+    this.dialogWidth = setDialogWidth(this.defWidth)
+  },
+  mounted () {
+    widthChange(this, this.defWidth)
+  },
+  methods: {
+    addInit (issueId) {
+      this.dataForm.issueId = issueId || 0
+      this.dataForm.frontUrl = null
+      this.dataForm.backUrl = null
+      this.dataForm.issuePicName = null
+      this.dataForm.issuePicCount = 0
+      this.visible = true
+      this.dataForm.frontList = []
+      this.dataForm.backList = []
+      this.dataForm.front = {}
+      this.dataForm.back = {}
+      this.frontMultiple = true
+      this.frontLimit = 40
+    },
+    updateInit (issuePicId) {
+      this.dataForm.issuePicId = issuePicId || 0
+      this.dataForm.showName = true
+      this.visible = true
+      this.$nextTick(() => {
+        this.$refs.dataForm.resetFields()
+        this.frontMultiple = false
+        this.frontLimit = 1
+      })
+      if (this.dataForm.issuePicId) {
+        this.$http({
+          url: this.$http.adornUrl(
+            `/ar/arIssuePic/info/${this.dataForm.issuePicId}`
+          ),
+          method: 'get',
+          params: this.$http.adornParams()
+        }).then(({ data }) => {
+          this.dataForm.issueId = data.issueId
+          this.dataForm.issuePicId = data.issuePicId
+          this.dataForm.issuePicName = data.issuePicName
+          this.dataForm.issuePicCount = data.issuePicCount
+          this.dataForm.frontUrl = data.frontUrl
+          this.dataForm.backUrl = data.backUrl
+          let front = {name: data.issuePicName, url: this.resourcesUrl + this.dataForm.frontUrl, path: this.dataForm.frontUrl}
+          let back = {name: data.issuePicName, url: this.resourcesUrl + this.dataForm.backUrl, path: this.dataForm.backUrl}
+          this.dataForm.frontList.push(front)
+          this.dataForm.backList.push(back)
+          this.dataForm.back = back
+        })
+      }
+    },
+    // 表单提交
+    async dataFormSubmit () {
+      if (this.isSubmitting) {
+        return
+      }
+      try{
+        this.dataForm.frontUrl = this.dataForm.frontList.join(",");
+        this.isSubmitting = true
+        this.$http({
+          url: this.$http.adornUrl(`/ar/arIssuePic`),
+          method: this.dataForm.issuePicId ? 'put' : 'post',
+          data: this.$http.adornData(this.dataForm)
+        }).then(({ data }) => {
+          this.isSubmitting = false
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success',
+            duration: 500,
+            onClose: () => {
+              this.handleClose()
+              this.$emit('refreshDataList', this.page)
+            }
+          })
+        }).catch((error) => {
+          console.log('err', error)
+          this.isSubmitting = false
+        })
+      }catch (error) {
+        this.$message.error(`第 ${error + 1} 张图片不符合尺寸要求。`)
+        this.isSubmitting = false
+      }
+    },
+    handleClose(done) {
+      this.visible = false
+      this.frontMultiple = false
+      this.frontLimit = 40
+      this.dataForm = {
+        issuePicId: null,
+        issueId: null,
+        issuePicName: null,
+        issuePicCount: null,
+        frontUrl: null,
+        backUrl: null,
+        backList: [],
+        frontList: [],
+        back:{},
+        picSize: "6x9"
+      }
+    },
+
+    checkImageSize(imageStr, index) {
+      let width = 780
+      let height = 1134
+      let picSize = this.dataForm.picSize
+      if (picSize === '3C') {
+        width = 709
+        height = 1087
+      } else if (picSize === '6x9') {
+        width = 780
+        height = 1134
+      }else{
+        width = 780
+        height = 1134
+      }
+      return new Promise((resolve, reject) => {
+        let image = new Image();
+        image.onload = function() {
+          let imageFormat = imageStr.split('.').pop();
+          if(imageFormat !== 'jpg'){
+            reject(index);
+          }
+          if ((image.width === width && image.height === height)) {
+            resolve();
+          } else {
+            reject(index);
+          }
+        };
+        image.src = this.resourcesUrl + imageStr;
+      });
+    },
+
+    handleBeforeUpload (file, fileList, frontOrBack) {
+      // let index = fileList.findIndex(item => item.name === file.name)
+      let _this = this
+      let isSize = true
+      let width = 780
+      let height = 1134
+      let picSize = this.dataForm.picSize
+      if (picSize === '3C') {
+        width = 709
+        height = 1087
+      } else if (picSize === '6x9') {
+        width = 780
+        height = 1134
+      }
+      isSize = new Promise(function(resolve, reject) {
+        let _URL = window.URL || window.webkitURL
+        let image = new Image()
+        image.onload = function() {
+          let valid = image.naturalWidth === width && image.naturalHeight === height
+          valid ? resolve() : reject()
+        }
+        image.src = _URL.createObjectURL(file)
+      }).then(
+        () => {
+          return file;
+        },
+        () => {
+          if(frontOrBack === 'Front'){
+            _this.frontUploadErrorTips = file.name
+          }else{
+            _this.backUploadErrorTips = file.name
+          }
+          return Promise.reject()
+        }
+      )
+      return isSize;
+    },
+
+    onFrontUploadSuccess (response, file, fileList) {
+
+    },
+    onBackUploadSuccess (response, file, fileList) {
+
+    },
+
+    onFrontRemove (response, file, fileList) {
+      let index = this.dataForm.frontList.findIndex((item) => item.path = response.path)
+      this.dataForm.frontList.splice(index, 1)
+    },
+    onBackRemove (response, file, fileList) {
+      let index = this.dataForm.backList.findIndex((item) => item.path = response.path)
+      this.dataForm.backList.splice(index, 1)
+    },
+
+    /**
+     * 上传正面图片
+     */
+
+    uploadFrontPic (event) {
+      const file = event.file
+      const formData = new FormData()
+      formData.append('file', file)
+      formData.append('type', 2)
+      this.$http({
+        url: this.$http.adornUrl('/admin/file/wsjUpload'),
+        method: 'post',
+        headers: {
+          'Content-Type': file.type
+        },
+        data: formData
+      }).then(res => {
+        let data = res.data[0]
+        let front = {name: file.name, url: this.resourcesUrl + data.filePath, path: data.filePath}
+        this.dataForm.frontList.push(front)
+      })
+    },
+
+    /**
+     * 上传正面图片
+     */
+
+    uploadBackPic (event) {
+      const file = event.file
+      const formData = new FormData()
+      formData.append('file', file)
+      formData.append('type', 2)
+      this.$http({
+        url: this.$http.adornUrl('/admin/file/wsjUpload'),
+        method: 'post',
+        headers: {
+          'Content-Type': file.type
+        },
+        data: formData
+      }).then(res => {
+        let data = res.data[0]
+        let back = {name: file.name, url: this.resourcesUrl + data.filePath, path: data.filePath}
+        this.dataForm.backList.push(back)
+        this.dataForm.back = back
+      })
+    },
+
+  }
+}
+</script>
+<style scoped>
+.v-modal {
+  z-index: 2001 !important;
+}
+</style>

+ 239 - 0
src/views/modules/ar/arIssueUserCard/index.vue

@@ -0,0 +1,239 @@
+<template>
+  <el-drawer
+    title="发行卡片"
+    :visible.sync="visible"
+    :direction="direction"
+    size="60%"
+    :before-close="handleClose">
+    <div class="mod-ar-arIssuePic" style="margin-left: 24px">
+      <div class="main-container">
+        <!--<div class="operation-bar">
+          <div v-if="isAuth('ar:arIssueUserCard:save')" class="default-btn primary-btn" @click="addHandle()">生成卡片</div>
+        </div>-->
+        <div class="table-con">
+          <el-table
+            :data="dataList"
+            header-cell-class-name="table-header"
+            row-class-name="table-row-low"
+            style="width: 100%"
+          >
+            <el-table-column
+              label="卡编号"
+              prop="cardNo"
+              align="center"
+            >
+            </el-table-column>
+            <!-- 正面图 -->
+            <el-table-column label="正面图" prop="frontUrl" align="center">
+              <template slot-scope="scope">
+                <el-image
+                  style="width: 100px; height: 100px"
+                  :src="resourcesUrl + scope.row.frontUrl"
+                  v-if="scope.row.frontUrl"
+                  fit="fill"
+                  @click="previewPic(scope.row.frontUrl)"
+                />
+              </template>
+            </el-table-column>
+            <!-- 背面图 -->
+            <el-table-column label="背面图" prop="backUrl" align="center">
+              <template slot-scope="scope">
+                <el-image
+                  style="width: 100px; height: 100px"
+                  :src="resourcesUrl + scope.row.backUrl"
+                  v-if="scope.row.backUrl"
+                  fit="fill"
+                  @click="previewPic(scope.row.backUrl)"
+                />
+              </template>
+            </el-table-column>
+            <!-- 背面图 -->
+            <el-table-column label="二维码" prop="arCodeUrl" align="center">
+              <template slot-scope="scope">
+                <el-image
+                  style="width: 100px; height: 100px"
+                  :src="resourcesUrl + scope.row.arCodeUrl"
+                  v-if="scope.row.backUrl"
+                  fit="fill"
+                  @click="previewPic(scope.row.arCodeUrl)"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column label="资源类型" prop="assetsType" align="center">
+              <template slot-scope="scope">
+                <el-tag v-if="scope.row.assetsType === 'Video'" type="primary">视频</el-tag>
+                <el-tag v-if="scope.row.assetsType === 'Model'" type="success">模型</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column
+              align="center"
+              prop="confirmTime"
+              label="确权时间"
+            >
+            </el-table-column>
+            <el-table-column
+              align="center"
+              :label="$t('crud.menu')"
+              width="250"
+            >
+              <template slot-scope="scope">
+                <div class="text-btn-con">
+<!--                  <div v-if="isAuth('ar:arIssueUserCard:update')" class="default-btn text-btn" @click="updateHandle(scope.row.issuePicId)">{{ $t('text.updateBtn') }}</div>-->
+                  <div v-if="isAuth('ar:arIssueUserCard:delete')" class="default-btn text-btn" @click="deleteHandle(scope.row.cardId)">{{ $t('text.delBtn') }}</div>
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <el-pagination
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="page.currentPage"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="page.pageSize"
+          :total="page.total"
+          layout="total, sizes, prev, pager, next, jumper"
+        ></el-pagination>
+      </div>
+      <add-or-update v-if="addOrUpdateVisible"
+                     ref="addOrUpdate"
+                     @refreshDataList="refreshChange"></add-or-update>
+      <el-dialog :visible.sync="previewPicDialogVisible" :modal="false" title="图片预览" width="30%" top="3vh">
+        <el-image :src="previewPicUrl" alt=""  style="width: 100%; height: 100%"/>
+      </el-dialog>
+    </div>
+  </el-drawer>
+
+</template>
+
+<script>
+import AddOrUpdate from './add-or-update'
+export default {
+  data () {
+    return {
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+      addOrUpdateVisible: false,
+      dataList: [],
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      searchForm: {},
+      dataListLoading: false,
+      visible: false,
+      direction: "rtl",
+      issueId: null,
+      previewPicUrl: null,
+      previewPicDialogVisible: false,
+    }
+  },
+  components: {
+    AddOrUpdate
+  },
+  created () {
+    this.getDataList(this.page)
+  },
+  mounted () {
+  },
+  methods: {
+    getDataList (page, params) {
+      this.dataListLoading = true
+      this.$http({
+        url: this.$http.adornUrl('/ar/arIssueUserCard/page'),
+        method: 'get',
+        params: this.$http.adornParams(Object.assign({
+          current: page.currentPage,
+          size: page.pageSize,
+          issueId: this.issueId
+        }, this.searchForm))
+      }).then(({ data }) => {
+        this.dataList = data.records
+        this.page.total = data.total
+        this.dataListLoading = false
+      })
+    },
+    init(issueId){
+      this.issueId = issueId || 0
+      this.visible = true
+      if (this.issueId) {
+        this.getDataList(this.page)
+      }
+    },
+    // 新增 / 修改
+    addHandle (issueId) {
+      this.addOrUpdateVisible = true
+      this.$nextTick(() => {
+        this.$refs.addOrUpdate.addInit(this.issueId)
+      })
+    },
+    // 新增 / 修改
+    updateHandle (issuePicId) {
+      this.addOrUpdateVisible = true
+      this.$nextTick(() => {
+        this.$refs.addOrUpdate.updateInit(issuePicId)
+      })
+    },
+    deleteHandle (cardId) {
+      this.$confirm(this.$i18n.t('admin.isDeleOper') + '?', this.$i18n.t('text.tips'), {
+        confirmButtonText: this.$i18n.t('crud.filter.submitBtn'),
+        cancelButtonText: this.$i18n.t('crud.filter.cancelBtn'),
+        type: 'warning'
+      }).then(() => {
+        this.$http({
+          url: this.$http.adornUrl('/ar/arIssueUserCard/' + cardId),
+          method: 'delete',
+          data: this.$http.adornData({})
+        }).then(({ data }) => {
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success',
+            duration: 300,
+            onClose: () => {
+              this.refreshChange()
+            }
+          })
+        })
+      }).catch(() => { })
+    },
+    // 刷新回调用
+    refreshChange () {
+      // this.page.currentPage = 1
+      this.getDataList(this.page)
+    },
+    searchChange () {
+      this.page.currentPage = 1
+      this.page.pageSize = 10
+      this.getDataList(this.page)
+    },
+    handleSizeChange (val) {
+      this.page.pageSize = val
+      this.getDataList(this.page)
+    },
+    handleCurrentChange (val) {
+      this.page.currentPage = val
+      this.getDataList(this.page)
+    },
+
+    addOrUpdateHandleIssuePic(){
+
+    },
+    handleClose(done) {
+      this.visible = false
+    },
+    previewPic(url){
+      this.previewPicUrl = this.resourcesUrl + url;
+      this.previewPicDialogVisible = true;
+    },
+  }
+}
+</script>
+<style lang="scss" scoped>
+
+.mod-shop-refundAddr {
+  .main-container {
+    margin: 0;
+    padding: 0;
+  }
+}
+</style>

+ 1 - 0
src/views/modules/print/print-order.vue

@@ -310,6 +310,7 @@
                   <span v-if="order.pdfLayoutType === 'SQ'" style="font-size: 24px; color: red">书签</span>
                   <span v-if="order.pdfLayoutType === 'ZP'" style="font-size: 24px; color: red">直拍</span>
                   <span v-if="order.pdfLayoutType === '5CXK'" style="font-size: 24px; color: red">5寸</span>
+                  <span v-if="order.pdfLayoutType === 'FK'" style="font-size: 24px; color: red">方卡</span>
                 </div>
               </el-col>
               <!-- 买家信息 -->

+ 3 - 3
src/views/modules/print/wave-print-order.vue

@@ -461,8 +461,7 @@
         newWaveNo: null,
         visible: false,
         wave:{},
-        resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
-        printChannel: "WoNiu",
+        printChannel: "KuaiYin",
         addToWaveDialogVisible: false,
         wavePrintOrderInfoDownloadLoading:false,
         onKeyDeliveryLoading: false,
@@ -896,7 +895,7 @@
             xmlhttp.open("GET", url, true);
             xmlhttp.responseType = "arraybuffer";
             xmlhttp.onload = function () {
-              if (this.status == 200) {
+              if (this.status === 200) {
                 resolve(this.response);
               }else{
                 reject(this.status);
@@ -1266,6 +1265,7 @@
       },
 
       dialogClose(){
+        this.wavePrintOrderPdfDownloadLoading = false
         this.wave = {},
         this.visible = false
         this.theData = null;

+ 38 - 5
src/views/modules/prod/printPicLib-add-or-update.vue

@@ -13,6 +13,21 @@
           </el-option>
         </el-select>
       </el-form-item>
+      <el-form-item label="产类类型" prop="prodId">
+        <el-select v-model="dataForm.prodType" clearable filterable @change="prodLayoutTypeChange">
+          <el-option key="3CXK" label="3寸小卡" value="3CXK"></el-option>
+          <el-option key="4CXK" label="4寸小卡" value="4CXK"></el-option>
+          <el-option key="5CXK" label="5寸小卡" value="5CXK"></el-option>
+          <el-option key="MXP" label="明信片" value="MXP"></el-option>
+          <el-option key="FK" label="大方卡" value="FK"></el-option>
+          <el-option key="XFK" label="小方卡" value="XFK"></el-option>
+          <el-option key="D3CXK" label="大3寸" value="D3CXK"></el-option>
+          <el-option key="ZP" label="直拍" value="ZP"></el-option>
+          <el-option key="SQ" label="书签" value="SQ"></el-option>
+          <el-option key="HZ" label="徽章吧唧" value="HZ"></el-option>
+          <el-option key="5CFZFP" label="5寸仿真" value="5CFZFP"></el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item label="分类" prop="category">
         <el-input v-model="dataForm.category" style="width: 185px" />
       </el-form-item>
@@ -72,6 +87,9 @@ export default {
         category:null,
         backCopyNum: 1,
         shopId: this.$store.state.user.shopId,
+        prodLayoutType: 'D3CXK',
+        canvasWidth: 709,
+        canvasHeight: 1087
       },
       resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
       prodList: [],
@@ -106,6 +124,16 @@ export default {
         }
       });
     },
+    prodLayoutTypeChange(pdfLayoutType){
+      this.$http({
+        url: this.$http.adornUrl('/admin/prodDesignSpec/getByProdType'),
+        method: 'get',
+        params: this.$http.adornParams({pdfLayoutType: pdfLayoutType})
+      }).then(({data}) => {
+        this.dataForm.canvasWidth = data.canvasWidth
+        this.dataForm.canvasHeight = data.canvasHeight
+      })
+    },
     getProdTypeSize(){
       let width = 0;
       let height = 0;
@@ -164,13 +192,21 @@ export default {
       }else if(prodName.indexOf("九重紫") !== -1){
         width = 803;
         height = 1098;
+      }else if(prodName.indexOf("大奉打更人") !== -1 || prodName.indexOf("哪吒") !== -1 || prodName.indexOf("封神") !== -1 || prodName.indexOf("白月") !== -1){
+        width = 803;
+        height = 1098;
+      }else if(prodName.indexOf("莎头") !== -1){
+        width = 1087;
+        height = 921;
       }
       return {width, height};
     },
     //验证图片尺寸
     checkImageSize(imageStr, index) {
-      let width = this.getProdTypeSize().width;
-      let height = this.getProdTypeSize().height;
+      let width = this.dataForm.canvasWidth
+      let height = this.dataForm.canvasHeight
+      // let width = this.getProdTypeSize().width;
+      // let height = this.getProdTypeSize().height;
       return new Promise((resolve, reject) => {
         let image = new Image();
         image.onload = function() {
@@ -201,9 +237,6 @@ export default {
     async dataFormSubmit () {
       try{
         let frontImgs = this.dataForm.frontUrl.split(",");
-        // if(this.dataForm.backUrl){
-        //   imgs[1] = this.dataForm.backUrl ? this.dataForm.backUrl:null;
-        // }
         await Promise.all(frontImgs.map(this.checkImageSize));
         this.$http({
           url: this.$http.adornUrl('/print/printPicLib'),

+ 129 - 0
src/views/modules/prod/score-prod-assets.vue

@@ -0,0 +1,129 @@
+<template>
+  <el-dialog
+    title="关联兑换素材"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+    width="30%"
+    v-if="visible"
+    @close="closeDialog"
+    :visible.sync="visible">
+    <el-form :model="dataForm" size="small" label-width="100px">
+      <el-form-item
+        label="选择资源" prop="newReceiverInfo" width="200px"
+        v-for="(item, index) in scoreProdAssetsList">
+        <el-row>
+          <el-col :span="10">
+            <el-select
+              size="large"
+              style="width: 220px"
+              v-model="item.assetsId"
+              placeholder="请选择资源"
+              :remote-method="getAssetsList"
+              clearable filterable>
+              <el-option
+                v-for="assets in assetsList"
+                :key="assets.assetsId"
+                :label="assets.assetsName"
+                :value="assets.assetsId">
+              </el-option>
+            </el-select>
+          </el-col>
+          <el-col :span="8">
+            <el-select
+              size="large"
+              v-model="item.canDownload">
+              <el-option key="1" label="允许下载" :value=1 ></el-option>
+              <el-option key="0" label="不允许下载" :value=0 ></el-option>
+            </el-select>
+          </el-col>
+          <el-col :span="6">
+            <el-button size="medium" type="danger" @click.prevent="removeAssets(index)">删除</el-button>
+          </el-col>
+        </el-row>
+      </el-form-item>
+      <el-form-item>
+        <el-button size="medium" type="primary" @click="addAssets">新增兑换素材</el-button>
+      </el-form-item>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button class="default-btn" @click="visible = false">{{$t("crud.filter.cancelBtn")}}</el-button>
+      <el-button class="default-btn primary-btn" type="primary" @click="dataFormSubmit()">{{$t("crud.filter.submitBtn")}}</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+  export default {
+    components: {
+
+    },
+    data () {
+      return {
+        visible: false,
+        assetsList:[],
+        prodId: null,
+        scoreProdAssetsList: []
+      }
+    },
+
+    created() {
+      this.getAssetsList()
+    },
+    methods: {
+      init (prodId) {
+        this.prodId = prodId || null
+        this.visible = true
+        this.$nextTick(() => {
+          if (this.prodId) {
+            this.$http({
+              url: this.$http.adornUrl('/shop/scoreProdAssets/infoByProdId/' + this.prodId),
+              method: 'get',
+              params: this.$http.adornParams()
+            }).then(({data}) => {
+              if(data){
+                this.scoreProdAssetsList = data
+              }
+            })
+          }
+        })
+      },
+      // 表单提交
+      dataFormSubmit () {
+        this.$http({
+          url: this.$http.adornUrl('/shop/scoreProdAssets'),
+          method: 'post',
+          data: this.$http.adornData({prodId: this.prodId, scoreProdAssetsList: this.scoreProdAssetsList})
+        }).then(({data}) => {
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success'
+          });
+          this.closeDialog()
+        })
+      },
+      getAssetsList(assetsName){
+        this.$http({
+          url: this.$http.adornUrl('/ar/arAssets/listByName'),
+          method: 'get',
+          params: this.$http.adornParams({assetsName: assetsName})
+        }).then(({data}) => {
+          this.assetsList = data
+        })
+      },
+      addAssets(){
+        this.scoreProdAssetsList.push({
+          prodId: this.prodId,
+          assetsId: this.assetsId,
+          canDownload: 0
+        });
+      },
+      removeAssets(index){
+        this.scoreProdAssetsList.splice(index, 1)
+      },
+      closeDialog(){
+        this.visible = false;
+        this.scoreProdAssetsList = []
+      },
+    }
+  }
+</script>

+ 390 - 0
src/views/modules/prod/score-sku-table.vue

@@ -0,0 +1,390 @@
+<template>
+  <div class="mod-prod-sku-table">
+    <el-form-item>
+      <!--      批量设置-->
+      <div>
+        <div
+            class="default-btn text-btn"
+            @click="switchSet"
+          >{{$t("groups.batchSettings")}}</div>
+          <el-form :inline="true" class="demo-form-inline" v-if="isEdit" size="small">
+            <el-form-item label="市场价">
+              <el-input-number v-model="dataFrom.oriPrice"
+                              size="small"
+                              :precision="2"
+                              :max="1000000000"
+                              :min="0"
+              ></el-input-number>
+            </el-form-item>
+            <el-form-item label="销售价">
+              <el-input-number v-model="dataFrom.price"
+                              size="small"
+                              :precision="2"
+                              :max="1000000000"
+                              :min="0"
+              ></el-input-number>
+            </el-form-item>
+
+            <el-form-item label="积分价">
+              <el-input-number v-model="dataFrom.skuScore"
+                              size="small"
+                              :precision="0"
+                              :max="1000000000"
+                              :min="1"
+              ></el-input-number>
+            </el-form-item>
+
+            <el-form-item :label="this.$i18n.t('product.stocks')">
+              <el-input-number v-model="dataFrom.stocks"
+                              size="small"
+                              :precision="0"
+                              :max="1000000000"
+                              :min="0"
+              ></el-input-number>
+            </el-form-item>
+
+            <el-form-item :label="this.$i18n.t('prodList.prodWeight')">
+              <el-input-number v-model="dataFrom.weight"
+                              size="small"
+                              :precision="2"
+                              :max="1000000000"
+                              :min="0"
+              ></el-input-number>
+            </el-form-item>
+            <el-form-item :label="this.$i18n.t('prodList.prodVolume')">
+              <el-input-number v-model="dataFrom.volume"
+                              size="small"
+                              :precision="2"
+                              :max="1000000000"
+                              :min="0"
+              ></el-input-number>
+            </el-form-item>
+            <el-form-item>
+              <div class="default-btn primary-btn" @click="batchSet">{{$t("crud.filter.submitBtn")}}</div>
+            </el-form-item>
+            <el-form-item>
+              <div class="default-btn primary-btn" style="background-color:#F56C6C;border:#F56C6C;" @click="switchSet">{{$t("crud.filter.cancelBtn")}}</div>
+            </el-form-item>
+          </el-form>
+      </div>
+      <el-table
+        :data="value"
+        style="width: 100%;"
+        header-cell-class-name="table-header"
+        row-class-name="table-row"
+        :span-method="tableSpanMethod"
+      >
+        <el-table-column
+          v-for="(leftTitle, index) in tableLeftTitles"
+          :key="index"
+          :label="leftTitle"
+        >
+          <template slot-scope="scope">{{scope.row.properties.split(';')[index].split(':')[1]}}</template>
+        </el-table-column>
+        <el-table-column v-if="tableLeftTitles.length" prop="pic" :label="this.$i18n.t('prodSku.skuPic')" width="180">
+          <template slot-scope="scope">
+            <img-upload v-model="scope.row.pic"></img-upload>
+          </template>
+        </el-table-column>
+        <!-- <el-table-column prop="prodName" label="商品名称" width="160" v-if="tableLeftTitles.length">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.prodName" type="textarea" :disabled="!scope.row.status"></el-input>
+          </template>
+        </el-table-column>-->
+        <el-table-column prop="prodNameCn" :label="this.$i18n.t('prodSku.chineseName')" width="250" v-if="tableLeftTitles.length">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.prodNameCn" type="textarea" :disabled="!scope.row.status" size="small"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="prodNameEn" :label="this.$i18n.t('prodSku.englishName')" width="250" v-if="tableLeftTitles.length">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.prodNameEn" type="textarea" :disabled="!scope.row.status" size="small"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="oriPrice" label="市场价(元)" width="160">
+          <template slot-scope="scope">
+            <el-input-number
+              size="small"
+              v-model="scope.row.oriPrice"
+              controls-position="right"
+              :precision="2"
+              :max="1000000000"
+              :min="0.00"
+              :disabled="!scope.row.status"
+            ></el-input-number>
+          </template>
+        </el-table-column>
+        <el-table-column prop="price" label="销售价(元)" width="160">
+          <template slot-scope="scope">
+            <el-input-number
+              size="small"
+              v-model="scope.row.price"
+              controls-position="right"
+              :precision="2"
+              :max="1000000000"
+              :min="0.00"
+              :disabled="!scope.row.status"
+            ></el-input-number>
+          </template>
+        </el-table-column>
+        <el-table-column prop="skuScore" label="积分价" width="160">
+          <template slot-scope="scope">
+            <el-input-number
+              size="small"
+              v-model="scope.row.skuScore"
+              controls-position="right"
+              :precision="0"
+              :max="1000000000"
+              :min="1"
+              @blur="changeScorePrice(scope)"
+              :disabled="!scope.row.status"
+            ></el-input-number>
+          </template>
+        </el-table-column>
+
+        <el-table-column prop="stocks" label="库存" width="160">
+          <template slot-scope="scope">
+            <el-input-number
+              size="small"
+              v-model="scope.row.stocks"
+              controls-position="right"
+              :precision="0"
+              :max="1000000000"
+              :min="0"
+              :disabled="!scope.row.status"
+            ></el-input-number>
+          </template>
+        </el-table-column>
+        <el-table-column prop="partyCode" label="商品编码" width="200">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.partyCode" maxlength="36" size="small"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column prop="weight" label="重量" width="160">
+          <template slot-scope="scope">
+            <el-input-number
+              size="small"
+              v-model="scope.row.weight"
+              controls-position="right"
+              :precision="2"
+              :max="1000000000"
+              :min="0"
+              :disabled="!scope.row.status"
+            ></el-input-number>
+          </template>
+        </el-table-column>
+        <el-table-column prop="volume" label="体积" width="160">
+          <template slot-scope="scope">
+            <el-input-number
+              size="small"
+              v-model="scope.row.volume"
+              controls-position="right"
+              :precision="2"
+              :max="1000000000"
+              :min="0"
+              :disabled="!scope.row.status"
+            ></el-input-number>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作">
+          <template slot-scope="scope">
+            <div
+              class="default-btn text-btn"
+              @click="changeSkuStatus(`${scope.$index}`)"
+              v-if="scope.row.status"
+            >禁用</div>
+            <div
+              class="default-btn text-btn"
+              @click="changeSkuStatus(`${scope.$index}`)"
+              v-else
+            >启用</div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form-item>
+  </div>
+</template>
+
+<script>
+// import PicUpload from '@/components/pic-upload'
+import ImgUpload from '@/components/img-upload'
+export default {
+  data () {
+    return {
+      // 数据库中的规格
+      dbSpecs: [],
+      // 根据选定的规格所查询出来的规格值
+      dbSpecValues: [],
+      specs: [], // 使用的规格
+      initing: false,
+      isEdit: false,
+      dataFrom: {
+        oriPrice: null,
+        price: null,
+        skuScore: null,
+        stocks: null,
+        weight: null,
+        volume: null
+      }
+    }
+  },
+  components: {
+    ImgUpload
+  },
+  props: {
+    value: {
+      default: [],
+      type: Array
+    },
+    prodNameCn: {
+      default: ''
+    },
+    prodNameEn: {
+      default: ''
+    }
+  },
+  watch: {
+    prodNameCn: function () {
+      this.skuAddProdName()
+    },
+    prodNameEn: function () {
+      this.skuAddProdName()
+    }
+  },
+  created: function () {
+    this.isEdit = false
+    this.$http({
+      url: this.$http.adornUrl(`/prod/spec/list`),
+      method: 'get',
+      params: this.$http.adornParams()
+    }).then(({ data }) => {
+      this.dbSpecs = data
+    })
+  },
+  computed: {
+    tableLeftTitles () {
+      let res = []
+      for (let i = 0; i < this.skuTags.length; i++) {
+        const skuTag = this.skuTags[i]
+        res.push(skuTag.tagName)
+      }
+      return res
+    },
+    skuTags: {
+      get () { return this.$store.state.prod.skuTags }
+    },
+    defalutSku () {
+      return this.$store.state.prod.defalutSku
+    }
+  },
+  methods: {
+    init () {
+      this.initing = true
+    },
+    getTableSpecData () {
+      return this.value
+    },
+    tableSpanMethod ({ row, column, rowIndex, columnIndex }) {
+
+    },
+    changeSkuStatus (tagIndex) {
+      this.value[tagIndex].status = this.value[tagIndex].status ? 0 : 1
+    },
+    skuAddProdName () {
+      if (this.initing) {
+        return
+      }
+      let skuList = []
+      for (let i = 0; i < this.value.length; i++) {
+        const sku = Object.assign({}, this.value[i])
+        if (!sku.properties) {
+          return
+        }
+        sku.skuName = ''
+        let properties = sku.properties.split(';')
+        for (const propertiesKey in properties) {
+          sku.skuName += properties[propertiesKey].split(':')[1] + ' '
+        }
+        sku.prodNameCn = this.prodNameCn + ' ' + sku.skuName
+        sku.prodName = this.prodNameCn + ' ' + sku.skuName
+        sku.prodNameEn = this.prodNameEn + ' ' + sku.skuName
+        skuList.push(sku)
+      }
+      this.$emit('input', skuList)
+    },
+    switchSet () {
+      this.isEdit = !this.isEdit
+      if (!this.isEdit) {
+        this.dataFrom.oriPrice = 0
+        this.dataFrom.price = 0
+        this.dataFrom.skuScore = 1
+        this.dataFrom.stocks = 0
+        this.dataFrom.weight = 0
+        this.dataFrom.volume = 0
+      }
+    },
+    changeScorePrice(row) {
+      let obj = row.row
+      if(!row.row.skuScore) {
+        obj['skuScore'] = 1
+        this.$set(this.value, row.$index, obj)
+        this.value[row.$index].skuScore = 1
+      }
+    },
+    batchSet () {
+      this.value.forEach(sku => {
+        if (this.dataFrom.oriPrice) {
+          sku.oriPrice = this.dataFrom.oriPrice
+        }
+        if (this.dataFrom.price) {
+          sku.price = this.dataFrom.price
+        }
+        if (this.dataFrom.skuScore) {
+          sku.skuScore = this.dataFrom.skuScore
+        }
+        if (this.dataFrom.stocks) {
+          sku.stocks = this.dataFrom.stocks
+        }
+        if (this.dataFrom.weight) {
+          sku.weight = this.dataFrom.weight
+        }
+        if (this.dataFrom.volume) {
+          sku.volume = this.dataFrom.volume
+        }
+      })
+      this.isEdit = false
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+.mod-prod-sku-table {
+  .pic-uploader-component .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+    .pic-uploader-icon {
+      font-size: 28px;
+      color: #8c939d;
+      width: 120px;
+      height: 120px;
+      line-height: 120px;
+      text-align: center;
+    }
+    .pic {
+      width: 120px;
+      height: 120px;
+      display: block;
+    }
+  }
+  .pic-uploader-component .el-upload:hover {
+    border-color: #409eff;
+  }
+  .el-upload--picture-card{
+  background: #ffffff;
+}
+}
+</style>

+ 515 - 0
src/views/modules/prod/score-sku-tag.vue

@@ -0,0 +1,515 @@
+<template>
+  <div class="mod-prod-sku-tag">
+    <el-form-item label="商品规格">
+      <div class="default-btn primary-btn" @click="shopTagInput()">添加规格</div>
+      <span class="tips">({{$t('shopProcess.mostAdd') + '100' + $t('shopProcess.group')}})</span>
+      <div v-for="(tag, tagIndex) in skuTags" :key="tagIndex">
+        <span class="mariginR">{{tag.tagName}}</span>
+        <div
+          class="default-btn text-btn"
+          @click="removeTag(tagIndex)"
+        >{{$t("remindPop.delete")}}</div>
+        <br />
+        <el-tag
+        class="mariginR"
+          v-for="(tagItem, tagItemIndex) in tag.tagItems"
+          :key="tagItem"
+          closable
+          :disable-transitions="false"
+          @close="handleTagClose(tagIndex, tagItemIndex)"
+        >{{tagItem}}</el-tag>
+        <el-input
+          class="input-new-tag"
+          v-if="tagItemInputs[tagIndex] && tagItemInputs[tagIndex].visible"
+          v-model="tagItemInputs[tagIndex].value"
+          :ref="`saveTagInput${tagIndex}`"
+          size="small"
+          maxlength="20"
+          @keyup.enter.native="handleInputConfirm(tagIndex)"
+          @blur="handleInputConfirm(tagIndex)"
+        ></el-input>
+        <div v-if="(!tagItemInputs[tagIndex] || !tagItemInputs[tagIndex].visible) && tag.maxSku > tag.tagItems.length" class="default-btn" @click="showTagInput(tagIndex)">+ {{$t("prodSku.add")}}</div>
+      </div>
+    </el-form-item>
+    <el-form-item label="规格名" v-show="isShowTagInput">
+      <el-col :span="8" style="margin-left:10px">
+        <el-input
+          v-model="addTagInput.propName"
+          style="width:200px"
+          placeholder="规格名"
+          @change="handleTagClick"
+          size="small"
+        >
+        </el-input>
+      </el-col>
+    </el-form-item>
+    <el-form-item label="规格值" v-show="isShowTagInput">
+      <el-col :span="8">
+        <el-tooltip
+          effect="light"
+          :content="$t('prodSku.enterInput')"
+          placement="top"
+        >
+        <i style="margin-left:-8px" class="el-icon-question"></i>
+        </el-tooltip>
+        <el-select
+          v-model="addTagInput.selectValues"
+          multiple
+          filterable
+          allow-create
+          :multiple-limit="multipleLimit"
+          default-first-option
+          placeholder="规格值"
+          size="small"
+          @change="handleTagValClick"
+        >
+        </el-select>
+      </el-col>
+    </el-form-item>
+    <el-form-item>
+      <div class="default-btn primary-btn" @click="addTag()" v-show="isShowTagInput">确定</div>
+      <div class="default-btn" @click="hideTagInput()" v-show="isShowTagInput">取消</div>
+    </el-form-item>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      value: [],
+      isShowTagInput: false,
+      addTagInput: {
+        propName: '',
+        selectValues: ''
+      },
+      type: 0,
+      tagItemName: '',
+      tagName: '',
+      tagNameIndex: 0,
+      tagItemInputs: [],
+      // sku的标记
+      // tags: [],
+      // 数据库中的规格
+      dbTags: [],
+      // 根据选定的规格所查询出来的规格值
+      dbTagValues: [],
+      specs: [], // 使用的规格
+      initing: false,
+
+      multipleLimit: 100 //限制规格选择数
+    }
+  },
+  created: function () {
+    this.$http({
+      url: this.$http.adornUrl(`/prod/spec/list`),
+      method: 'get',
+      params: this.$http.adornParams()
+    }).then(({ data }) => {
+      this.dbTags = data
+    })
+  },
+  props: {
+    //   tags: { // sku的标记
+    //     default: [],
+    //     type: Array
+    //   }
+    skuList: {
+      default: []
+    }
+  },
+  computed: {
+    // 未使用的规格, 通过计算属性计算
+    unUseTags () {
+      let res = []
+      for (let i = 0; i < this.dbTags.length; i++) {
+        const dbTag = this.dbTags[i]
+        let specIndex = this.skuTags.findIndex(tag => tag.tagName === dbTag.propName)
+        if (specIndex === -1) {
+          res.push(dbTag)
+        }
+      }
+      return res
+    },
+    skuTags: {
+      get () { return this.$store.state.prod.skuTags },
+      set (val) { this.$store.commit('prod/updateSkuTags', val) }
+    },
+    defalutSku () {
+      return this.$store.state.prod.defalutSku
+    }
+  },
+  watch: {
+    skuTags: {
+      handler (val, oldVal) {
+        if (this.initing) {
+          this.initing = false
+          return
+        }
+        let skuList = []
+        if (this.type === 4) {
+          // 删除规格值
+          this.skuList.forEach(sku => {
+            let propertiesArray = sku.properties.split(';')
+            if (this.tagItemName !== propertiesArray[this.tagNameIndex].split(':')[1]) {
+              skuList.push(sku)
+            }
+          })
+        } else if (this.type === 2) {
+          // 添加规格值
+          var properties = this.tagName + ':' + this.tagItemName
+          // 增加或删除规格
+          let tempSkuList = []
+          val.forEach(tag => {
+            if (skuList.length === 0) {
+              if (this.tagName === tag.tagName) {
+                let sku = Object.assign({}, this.defalutSku)
+                sku.properties = properties // 销售属性组合字符串
+                skuList.push(sku)
+              } else {
+                tag.tagItems.forEach(tagItem => {
+                  let sku = Object.assign({}, this.defalutSku)
+                  sku.properties = `${tag.tagName}:${tagItem}` // 销售属性组合字符串
+                  skuList.push(sku)
+                })
+              }
+              if (val.length === 1) {
+                skuList = this.skuList.concat(skuList)
+              }
+            } else {
+              tempSkuList = []
+              if (this.tagName === tag.tagName) {
+                skuList.forEach(sku => {
+                  if (sku.properties.indexOf(this.tagName) === -1) {
+                    let newSku = Object.assign({}, sku)
+                    newSku.properties = `${sku.properties};${properties}`
+                    tempSkuList.push(newSku)
+                  }
+                })
+              } else {
+                tag.tagItems.forEach(tagItem => {
+                  skuList.forEach(sku => {
+                    if (sku.properties.indexOf(tag.tagName) === -1) {
+                      let newSku = Object.assign({}, sku)
+                      newSku.properties = `${sku.properties};${tag.tagName}:${tagItem}`
+                      tempSkuList.push(newSku)
+                    }
+                  })
+                })
+              }
+              skuList = this.skuList.concat(tempSkuList)
+            }
+          })
+        } else {
+          // 增加或删除规格
+          let tempSkuList = []
+          val.forEach(tag => {
+            // console.log('tag', tag)
+            if (skuList.length === 0) {
+              tag.tagItems.forEach(tagItem => {
+                let sku = Object.assign({}, this.defalutSku)
+                sku.properties = `${tag.tagName}:${tagItem}` // 销售属性组合字符串
+                skuList.push(sku)
+              })
+            } else {
+              tempSkuList = []
+              tag.tagItems.forEach(tagItem => {
+                skuList.forEach(sku => {
+                  let newSku = Object.assign({}, sku)
+                  newSku.properties = `${sku.properties};${tag.tagName}:${tagItem}`
+                  tempSkuList.push(newSku)
+                })
+              })
+              skuList = tempSkuList
+            }
+          })
+        }
+        if (!skuList.length) {
+          skuList.push(Object.assign({}, this.defalutSku))
+        }
+        this.changeMaxSku()
+        // debugger
+        this.$emit('change', skuList)
+      },
+      deep: true
+    }
+  },
+  methods: {
+    init (skuList) {
+      this.value = skuList
+      if (!skuList || !skuList.length) {
+        this.skuTags = []
+        this.$emit('change', [Object.assign({}, this.defalutSku)])
+        return
+      }
+      this.initing = true
+      let skuTags = []
+      for (let i = 0; i < skuList.length; i++) {
+        const sku = skuList[i]
+        if (!sku.properties) break
+        let propertiesArray = sku.properties.split(';')
+        for (let j in propertiesArray) {
+          let cnProperties = propertiesArray[j].split(':')
+          if (!skuTags[j]) {
+            skuTags[j] = {
+              tagName: cnProperties[0],
+              tagItems: []
+            }
+            this.tagItemInputs.push({ visible: false, value: '' })
+          }
+          let tagItemNameIndex = skuTags[j].tagItems.findIndex((tagItemName) => tagItemName === cnProperties[1])
+          if (tagItemNameIndex === -1) {
+            skuTags[j].tagItems.push(cnProperties[1])
+          }
+        }
+      }
+      this.skuTags = skuTags
+      this.changeMaxSku()
+    },
+
+
+    changeMaxSku() {
+      if(this.skuTags.length === 0) return
+      let skuList = this.skuTags.map((item) => {return item.tagItems.length > 0 ? item.tagItems.length : 1 })
+      let multipleLimit = 100
+      let dataList = this.skuTags
+      skuList.forEach((item, index) => {
+        let y = skuList.length > 1 ? skuList.reduce((x, y) => {return x * y}) : item
+        multipleLimit = Math.floor(100 / y)
+        let demoList = JSON.parse(JSON.stringify(skuList))
+        demoList.splice(index, 1)
+        let x = skuList.length > 1 ? demoList.reduce((x, y) => {return x * y}) : item
+        dataList[index]['maxSku'] = Math.floor(100 / x)
+      })
+      this.multipleLimit = multipleLimit
+      this.skuTags = dataList
+    },
+
+    // 显示规格名、规格值输入框
+    shopTagInput () {
+      this.isShowTagInput = true
+    },
+    // 隐藏规格名、规格值输入框
+    hideTagInput () {
+      this.isShowTagInput = false
+      this.cleanTagInput()
+    },
+    addTag () {
+      let selectValues = this.addTagInput.selectValues
+      if (!this.addTagInput.propName) {
+        this.$message.error(this.$i18n.t('prodSku.inputSkuName'))
+        return
+      }
+      if (!selectValues.length) {
+        this.$message.error(this.$i18n.t('prodSku.inputSkuValue'))
+        return
+      }
+      if (this.checkAddTag()) {
+        return
+      }
+      this.isShowTagInput = false
+      let tagItems = []
+      for (let i = 0; i < selectValues.length; i++) {
+        const element = selectValues[i]
+        tagItems.push(element)
+      }
+      // 向规格中放入规格输入框内的数据
+      this.$store.commit('prod/addSkuTag', {
+        tagName: this.addTagInput.propName,
+        tagItems
+      })
+      this.type = 1
+      this.cleanTagInput()
+    },
+    // 清除规格值输入框内容
+    cleanTagInput () {
+      this.addTagInput = {
+        propName: '',
+        selectValues: ''
+      }
+    },
+    // 规格名输入框,选中规格事件
+    handleTagClick () {
+      // 判断空格
+      if (!this.addTagInput.propName.trim()) {
+        this.addTagInput.propName = ''
+        return
+      }
+      // 判断字符长度(规格名不超过10字符)
+      if (this.addTagInput.propName.length > 10) {
+        this.addTagInput.propName = ''
+        this.$message({
+          message: this.$i18n.t('prodSku.specNameLengthLimit'),
+          type: 'error',
+          duration: 1000
+        })
+        return
+      }
+      // 规格名不允许包含特殊字符;:
+      if (this.addTagInput.propName.indexOf(';') !== -1 || this.addTagInput.propName.indexOf(':') !== -1) {
+        this.addTagInput.propName = ''
+        this.$message({
+          message: this.$i18n.t('prodSku.specName') + this.$i18n.t('prodSku.specialWordSymbolTips'),
+          type: 'error',
+          duration: 1500
+        })
+        return
+      }
+      // 清空规格值输入框
+      this.dbTagValues = []
+      this.addTagInput.selectValues = []
+      // 判断规格名输入的值是否为数据库中已有的值
+      let specsIndex = this.dbTags.findIndex(spec => spec.propName === this.addTagInput.propName)
+      // 如果不是,则说明为用户随便输入
+      if (specsIndex === -1) return
+      // 如果数据库已有该规格名,则获取根据id获取该规格名称含有的规格值
+      this.$http({
+        url: this.$http.adornUrl(`/prod/spec/listSpecValue/${this.dbTags[specsIndex].propId}`),
+        method: 'get',
+        params: this.$http.adornParams()
+      }).then(({ data }) => {
+        this.dbTagValues = data
+      })
+    },
+    // 规格值判断空格
+    handleTagValClick () {
+      const idx = this.addTagInput.selectValues.length - 1
+      const curVal = this.addTagInput.selectValues[idx] ? String(this.addTagInput.selectValues[idx]) : ''
+      if (!curVal.trim()) {
+        this.addTagInput.selectValues.splice(idx, 1)
+        return
+      }
+      // 规格值长度限制(20字符以内)
+      if (curVal.length > 20) {
+        this.addTagInput.selectValues.splice(idx, 1)
+        this.$message({
+          message: this.$i18n.t('prodSku.specValueLengthLimit'),
+          type: 'error',
+          duration: 1000
+        })
+        return
+      }
+      // 规格值不允许包含特殊字符;:
+      if (curVal.indexOf(';') !== -1 || curVal.indexOf(':') !== -1) {
+        this.addTagInput.selectValues.splice(idx, 1)
+        this.$message({
+          message: this.$i18n.t('prodSku.specValue') + this.$i18n.t('prodSku.specialWordSymbolTips'),
+          type: 'error',
+          duration: 1500
+        })
+      }
+    },
+    // 关闭标签
+    handleTagClose (tagIndex, tagItemIndex) {
+      this.tagName = this.skuTags[tagIndex]
+      this.tagNameIndex = tagIndex
+      this.tagItemName = this.skuTags[tagIndex].tagItems[tagItemIndex]
+      if (this.skuTags[tagIndex].tagItems.length === 1) {
+        return
+      }
+      this.type = 4
+      this.$store.commit('prod/removeSkuTagItem', { tagIndex, tagItemIndex })
+    },
+    // 标签输入框确定时调用
+    handleInputConfirm (tagIndex) {
+      if (this.checkTagItem(tagIndex)) {
+        return
+      }
+      this.tagName = this.skuTags[tagIndex].tagName
+      this.tagItemName = this.tagItemInputs[tagIndex].value
+
+      let tagItem = this.tagItemInputs[tagIndex].value
+      if (tagItem) {
+        this.$store.commit('prod/addSkuTagItem', { tagIndex, tagItem })
+      }
+      this.tagItemInputs[tagIndex].visible = false
+      this.tagItemInputs[tagIndex].value = ''
+      this.type = 2
+    },
+    // 显示标签输入框
+    showTagInput (tagIndex) {
+      this.tagItemInputs.push({ visible: false, value: '' })
+      this.tagItemInputs[tagIndex].visible = true
+      this.$nextTick(() => {
+        this.$refs[`saveTagInput${tagIndex}`][0].$refs.input.focus()
+      })
+    },
+    removeTag (tagIndex) {
+      this.type = 3
+      this.$store.commit('prod/removeSkuTag', tagIndex)
+    },
+    /**
+     * 新增规格值时,判断是否存在同名的规格值
+     */
+    checkTagItem (tagIndex) {
+      let tagItem = this.tagItemInputs[tagIndex].value
+      var isSame = false
+      if (this.skuTags[tagIndex].tagItems.indexOf(tagItem) !== -1) {
+        isSame = true
+        this.$message.error(this.$i18n.t('prodSku.repeatWarning'))
+        return true
+      }
+      // this.skuTags.some(tag => {
+      //   if (tag.tagItems.indexOf(tagItem) > -1) {
+      //     isSame = true
+      //     this.$message.error(this.$i18n.t('prodSku.repeatWarning'))
+      //     return true
+      //   }
+      // })
+      return isSame
+    },
+    /**
+     * 新增规格时,判断是否存在同名的规格及规格值值
+     */
+    checkAddTag () {
+      var isSame = false
+      this.skuTags.forEach(tag => {
+        if (this.addTagInput.propName === tag.tagName && !isSame) {
+          isSame = true
+          this.$message.error(this.$i18n.t('prodSku.skuName') + `[${this.addTagInput.propName}]` + this.$i18n.t('prodSku.reEnter'))
+        }
+        this.addTagInput.selectValues.forEach(item => {
+          if (tag.tagName === this.addTagInput.propName && tag.tagItems.indexOf(item) > -1 && !isSame) {
+            isSame = true
+            // this.$message.error('规格值 \'' + item + '\' 已存在,请重新输入')
+            this.$message.error(this.$i18n.t('prodSku.skuValue') + `[${item}]` + this.$i18n.t('prodSku.reEnter'))
+          }
+        })
+      })
+      this.tagItemInputs.push({ visible: false, value: '' })
+      return isSame
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+.mod-prod-sku-tag {
+  .el-tag + .el-tag {
+    margin-left: 10px;
+  }
+  .tips {
+    font-size: 12px;
+    color: #999999;
+    margin-left: 10px;
+  }
+  .button-new-tag {
+    margin-left: 10px;
+    height: 32px;
+    line-height: 30px;
+    padding-top: 0;
+    padding-bottom: 0;
+  }
+  .input-new-tag {
+    width: 90px;
+    margin-left: 10px;
+    vertical-align: bottom;
+  }
+  .el-upload--picture-card{
+    background: #ffffff;
+  }
+  .mariginR {
+    margin-right: 5px;
+  }
+}
+</style>

+ 495 - 0
src/views/modules/prod/scoreProdInfo.vue

@@ -0,0 +1,495 @@
+<template>
+  <div class="mod-prod-info">
+    <!-- <div class="title">新增积分商品</div> -->
+    <el-form :model="dataForm" ref="dataForm" label-width="100px" size="small">
+      <el-form-item label="商品类别">
+        <el-radio-group v-model="dataForm.mold">
+          <el-radio :label="0">实物商品</el-radio>
+          <el-radio :label="1">虚拟商品</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="商品视频">
+        <video-upload v-model="dataForm.video" />
+      </el-form-item>
+      <el-form-item label="商品图片"
+      class="productImg-label"
+      >
+        <!-- <mul-pic-upload v-model="dataForm.imgs" /> -->
+        <imgs-upload v-model="dataForm.imgs" />
+        <span>建议图片尺寸为 800*800</span>
+      </el-form-item>
+      <score-sku-tag ref="skuTag" @change="skuTagChangeSkuHandler" :skuList="dataForm.skuList"></score-sku-tag>
+      <score-sku-table
+        ref="skuTable"
+        v-model="dataForm.skuList"
+        :prodNameCn.sync="prodNameCn"
+        :prodNameEn.sync="prodNameEn"
+      ></score-sku-table>
+
+      <prod-transport
+        v-model="dataForm.deliveryTemplateId"
+        v-if="mold === 0"
+      ></prod-transport>
+      <el-tabs type="card">
+        <el-tab-pane label="中文信息">
+          <el-form-item label="产品名称" prop="prodNameCn">
+            <!-- :rules="[{ required: true, message: '产品名称不能为空'}]" -->
+            <el-col :span="8">
+              <el-input
+                v-model="prodNameCn"
+                placeholder="产品名称"
+                maxlength="50"
+              ></el-input>
+            </el-col>
+          </el-form-item>
+
+          <el-form-item label="商品卖点" prop="briefCn">
+            <el-col :span="8">
+              <el-input
+                v-model="briefCn"
+                type="textarea"
+                :autosize="{minRows: 2, maxRows: 4}"
+                placeholder="商品卖点"
+              ></el-input>
+            </el-col>
+          </el-form-item>
+          <el-form-item :label="this.$i18n.t('homes.productDetails')" prop="contentCn">
+            <tiny-mce v-model="contentCn" ref="content" style="width:95%"></tiny-mce>
+          </el-form-item>
+        </el-tab-pane>
+        <el-tab-pane label="English Information">
+          <el-form-item label="Prod name" prop="prodNameEn">
+            <!-- :rules="[{ required: true, message: 'Product English name cannot be empty'}]" -->
+            <el-col :span="8">
+              <el-input v-model="prodNameEn" placeholder="Prod name" maxlength="50"></el-input>
+            </el-col>
+          </el-form-item>
+          <el-form-item label="Selling point" prop="briefEn">
+            <el-col :span="8">
+              <el-input
+                v-model="briefEn"
+                type="textarea"
+                :autosize="{minRows: 2, maxRows: 4}"
+                placeholder="Selling point"
+              ></el-input>
+            </el-col>
+          </el-form-item>
+          <el-form-item label="Product Details" prop="contentEn">
+            <tiny-mce v-model="contentEn" ref="content" style="width:95%"></tiny-mce>
+          </el-form-item>
+        </el-tab-pane>
+      </el-tabs>
+      <el-form-item>
+        <div class="default-btn primary-btn" @click="dataFormSubmit()">{{$t("crud.filter.submitBtn")}}</div>
+      </el-form-item>
+    </el-form>
+    <!-- 品牌选择弹窗-->
+    <brand-select
+      v-if="brandSelectVisible"
+      ref="brandSelect"
+      :isSingle="true"
+      @refreshSelectBrand="selectBrand"
+    ></brand-select>
+  </div>
+</template>
+
+<script>
+import VideoUpload from '@/components/video-upload'
+import ScoreSkuTag from './score-sku-tag'
+import ScoreSkuTable from './score-sku-table'
+import TinyMce from '@/components/tiny-mce'
+import ImgUpload from '@/components/img-upload'
+import ImgsUpload from '@/components/imgs-upload'
+import BrandSelect from '@/components/brand-select'
+import ProdTransport from './prod-transport'
+
+export default {
+  data () {
+    return {
+      brandSelectVisible: false,
+      prodNameEn: '',
+      prodNameCn: '',
+      contentEn: '',
+      contentCn: '',
+      briefEn: '',
+      briefCn: '',
+      sameCityStatus: 0,
+      // 规格列表
+      dataForm: {
+        prodName: '',
+        brief: '',
+        pic: '',
+        imgs: '',
+        video: '',
+        categoryId: this.$route.query.categoryId ? parseInt(this.$route.query.categoryId) : null,
+        shopCategoryId: null, // 店铺分类id
+        prodId: 0,
+        brandId: 0,
+        prodScore: 0,
+        scorePrice: 0,
+        skuList: [],
+        scoreProdType: 0,
+        prodNameEn: '',
+        prodNameCn: '',
+        contentEn: '',
+        contentCn: '',
+        briefEn: '',
+        briefCn: '',
+        content: '',
+        brandName: '',
+        deliveryMode: {},
+        isCheck: false,
+        value: false,
+        deliveryTemplateId: null,
+        prodLangList: [],
+        mold: 1
+      },
+      deliveryMode: {
+        hasShopDelivery: true,
+        hasUserPickUp: false,
+        hasCityDelivery: false
+      },
+      brandName: '',
+      isSubmit: false,
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL
+    }
+  },
+  watch: {
+    'dataForm.imgs': {
+      deep: true, // 深度监听设置为 true
+      immediate: true,
+      handler (newV, oldV) {
+        if (newV.split(',').length > 9) {
+          this.dataForm.imgs = oldV
+          this.errorMsg(this.$i18n.t('product.downloadTemplateTips3'))
+        }
+      }
+    }
+  },
+  components: {
+    // MulPicUpload,
+    BrandSelect,
+    ImgUpload,
+    ImgsUpload,
+    VideoUpload,
+    TinyMce,
+    ScoreSkuTag,
+    ScoreSkuTable,
+    ProdTransport
+  },
+  computed: {
+    defalutSku () {
+      return this.$store.state.prod.defalutSku
+    }
+  },
+  mounted () {
+    // console.log(2222222)
+    this.dataForm.prodId = this.$route.query.prodId
+    // this.getCategoryList()
+    // this.getCategoryTree()
+    this.getDataList()
+  },
+  methods: {
+    // 获取分类数据
+    getDataList () {
+      this.isSubmit = false
+      if (this.dataForm.prodId) {
+        // 获取产品数据
+        this.$http({
+          url: this.$http.adornUrl(`/shop/scoreProduct/info/${this.dataForm.prodId}`),
+          method: 'get',
+          params: this.$http.adornParams()
+        }).then(({ data }) => {
+          this.dataForm = data
+          this.dataForm.prodLangList.forEach(prodLang => {
+            if (prodLang.lang === 0) {
+              this.prodNameCn = prodLang.prodName
+              this.briefCn = prodLang.brief
+              this.contentCn = prodLang.content
+            }
+            if (prodLang.lang === 1) {
+              this.prodNameEn = prodLang.prodName
+              this.briefEn = prodLang.brief
+              this.contentEn = prodLang.content
+            }
+          })
+          this.dataForm.deliveryMode = JSON.parse(data.deliveryMode)
+          this.dataForm.deliveryMode.hasShopDelivery = true
+          // this.category.selected = idList(this.category.list, this.dataForm.categoryId, 'categoryId', 'children').reverse()
+          if (data.brand) {
+            this.dataForm.brandId = data.brand.brandId
+            this.dataForm.brandName = data.brand.brandName
+            this.brandName = data.brandName
+          }
+          this.$refs.skuTag.init(data.skuList)
+          this.dataForm.skuList.forEach(sku => {
+            sku.oriStock = sku.stocks
+            sku.skuLangList.forEach(skulang => {
+              if (skulang.lang === 0) {
+                sku.prodNameCn = skulang.prodName
+              } else {
+                sku.prodNameEn = skulang.prodName
+              }
+            })
+          })
+          this.$refs.skuTable.init()
+          this.dataForm.skuList.forEach(item => {
+            item.changeStock = item.stocks
+          })
+        })
+      } else {
+        this.$nextTick(() => {
+          this.$refs['dataForm'].resetFields()
+          this.$refs.skuTag.init()
+          this.dataForm.pic = ''
+          this.dataForm.imgs = ''
+          this.dataForm.video = ''
+        })
+      }
+    },
+    // 表单提交
+    dataFormSubmit () {
+      this.$refs['dataForm'].validate((valid) => {
+        if (!this.dataForm.imgs) {
+          this.errorMsg(this.$i18n.t('product.choosePicUpload'))
+          return
+        }
+        if (!this.dataForm.skuList.find(el => el.status)) {
+        // 至少要启用一种商品规格
+          this.$message({
+            message: this.$i18n.t('product.enableSpec'),
+            type: 'error',
+            duration: 500
+          })
+          return
+        }
+        // 检验是否有选择品牌
+        // if (!this.dataForm.brandName) {
+        //   this.errorMsg('请选择一个所属品牌')
+        //   return
+        // }
+        // 校验sku列表
+        this.checkSkuList()
+        if (this.isCheck) {
+          this.errorMsg(this.value)
+          return
+        }
+        if (!this.prodNameCn) {
+          this.errorMsg(this.$i18n.t('product.pleComAndEnName'))
+          return
+        }
+        if (!this.prodNameEn) {
+          this.prodNameEn = this.prodNameCn
+        }
+        if (/^\s+$/g.test(this.prodNameEn)) {
+          this.prodNameEn = this.prodNameCn
+        }
+        if (/^\s+$/g.test(this.briefEn) || /^\s+$/g.test(this.briefCn)) {
+          this.errorMsg(this.$i18n.t('shopProcess.inputAllSpace'))
+          return
+        }
+        if (!this.dataForm.deliveryTemplateId) {
+          this.errorMsg(this.$i18n.t('product.pleShgTlate'))
+          return
+        }
+        this.dataForm.prodNameCn = this.prodNameCn
+        this.dataForm.briefCn = this.briefCn
+        this.dataForm.contentCn = this.contentCn
+        this.dataForm.prodNameEn = this.prodNameEn
+        this.dataForm.briefEn = this.briefEn
+        this.dataForm.contentEn = this.contentEn
+        this.dataForm.prodName = this.dataForm.prodNameCn
+        let param = Object.assign({}, this.dataForm)
+        // 设置价格和库存
+        this.paramSetPriceAndStocks(param)
+        param.deliveryMode = undefined
+        param.deliveryModeVo = this.deliveryMode
+        this.dataForm.skuList.forEach(item => {
+          item.changeStock = item.stocks - item.oriStock
+        })
+        // 商品主图
+        param.pic = this.dataForm.imgs.split(',')[0]
+        // console.log('this.dataForm', this.dataForm.skuList)
+        if (this.isSubmit) {
+          return false
+        }
+        this.isSubmit = true
+        this.$http({
+          url: this.$http.adornUrl(`/shop/scoreProduct`),
+          method: param.prodId ? 'put' : 'post',
+          data: this.$http.adornData(param)
+        }).then(({ data }) => {
+          this.$message({
+            message: this.$i18n.t('remindPop.success'),
+            type: 'success',
+            duration: 800,
+            onClose: () => {
+              this.visible = false
+              this.$store.commit('common/removeMainActiveTab')
+              this.$router.push({ name: 'prod-scoreProdList' })
+              this.$emit('refreshDataList')
+            }
+          })
+        }).catch((e) => {
+          this.isSubmit = false
+        })
+      })
+    },
+    /**
+     * 品牌删除按钮
+     */
+    handleClose () {
+      this.dataForm.brandId = null
+      this.brandName = ''
+      this.dataForm.brandName = this.brandName
+    },
+    /**
+     * 显示添加指定品牌弹框
+     */
+    brandSelectHandle () {
+      this.brandSelectVisible = true
+      this.$nextTick(() => {
+        this.$refs.brandSelect.init()
+      })
+    },
+    /**
+     * 添加指定品牌
+     */
+    selectBrand (brands) {
+      if (brands) {
+        this.brandName = brands[0].brandName
+        this.dataForm.brandId = brands[0].brandId
+        this.dataForm.brandName = this.brandName
+        // this.$set(this.dataForm, 'brandId', this.dataForm.brandId)
+        // this.$set(this.dataForm, 'brandName', this.dataForm.brandName)
+      }
+    },
+    /**
+     * 删除视频
+     */
+    deleteVideo () {
+      this.dataForm.video = null
+    },
+
+    checkSkuList () {
+      // console.log('skuList', this.dataForm.skuList)
+      this.dataForm.skuList.forEach(item => {
+        this.isCheck = false
+        // if (!item.pic) {
+        //   this.isCheck = true
+        //   this.value = '请上传sku图片'
+        //   return false
+        // }
+        if (!item.price && item.price !== 0) {
+          this.isCheck = true
+          this.value = this.$i18n.t('product.emptyPrice')
+          return false
+        }
+        if (!item.oriPrice && item.oriPrice !== 0) {
+          this.isCheck = true
+          this.value = this.$i18n.t('product.emptyMarketValue')
+          return false
+        }
+        if (!item.skuScore) {
+          this.isCheck = true
+          this.value = this.$i18n.t('product.emptyScorePrice')
+          return false
+        }
+        if (item.stocks === null || item.stocks === undefined) {
+          this.isCheck = true
+          this.value = this.$i18n.t('product.emptyStocks')
+          return false
+        }
+      })
+    },
+    paramSetPriceAndStocks (param) {
+      // 获取规格属性信息
+      // param.skuList = this.$refs.prodSpec.getTableSpecData()
+      // 商品库存
+      param.totalStocks = 0
+      // 商品价格
+      param.price = param.skuList[0].price
+      // 商品原价
+      param.oriPrice = 0
+      // 商品积分价格
+      param.scorePrice = param.skuList[0].skuScore
+      // 商品实际库存
+      for (let i = 0; i < param.skuList.length; i++) {
+        const element = param.skuList[i]
+        console.log('element.status', element.status)
+        if (element.status !== 1) {
+          console.log('end', param.totalStocks, element.stocks)
+          continue
+        }
+        if (i === 0) {
+          param.price = element.price ? Number.parseFloat(element.price) : 0
+          param.scorePrice = element.skuScore ? Number.parseFloat(element.skuScore) : 0
+          param.oriPrice = element.oriPrice ? Number.parseFloat(element.oriPrice) : 0
+        }
+        // 商品价格为最低价的那件商品的价格
+        param.price = Math.min(param.price, element.price)
+        if (param.price === element.price) {
+          param.price = element.price
+        }
+        // 设置最低市场价
+        param.oriPrice = Math.min(param.oriPrice, element.oriPrice)
+        if (param.oriPrice === element.oriPrice) {
+          param.oriPrice = element.oriPrice
+        }
+        // 设置最低积分价格
+        param.scorePrice = Math.min(param.scorePrice, element.skuScore)
+        if (param.scorePrice === element.skuScore) {
+          param.scorePrice = element.skuScore
+        }
+
+        console.log(element.skuScore)
+        console.log(param.scorePrice)
+        param.totalStocks += element.stocks ? Number.parseInt(element.stocks) : 0
+      }
+      // 如果sku没有商品名称,则使用商品的商品名称
+      if (param.skuList.length === 1 && !param.skuList[0].skuName) {
+        param.skuList[0].prodNameCn = this.dataForm.prodNameCn
+        param.skuList[0].prodNameEn = this.dataForm.prodNameEn
+      }
+    },
+    skuTagChangeSkuHandler (skuList) {
+      const prodNameCn = this.prodNameCn
+      const prodNameEn = this.prodNameEn
+      skuList.forEach(sku => {
+        if (sku.properties) {
+          sku.skuName = ''
+          let properties = sku.properties.split(';')
+          for (const propertiesKey in properties) {
+            sku.skuName += properties[propertiesKey].split(':')[1] + ' '
+          }
+          sku.prodNameCn = prodNameCn + ' ' + sku.skuName
+          sku.prodNameEn = prodNameEn + ' ' + sku.skuName
+        }
+      })
+      this.dataForm.skuList = skuList
+    },
+    errorMsg (message) {
+      this.$message({
+        message: message,
+        type: 'error',
+        duration: 1500
+      })
+    }
+  }
+}
+</script>
+<style>
+ .el-upload--picture-card{
+    background: #ffffff;
+  }
+  .productImg-label .el-form-item__label:before{
+    content: '*';
+    color: #F56C6C;
+    margin-right: 4px;
+  }
+  .productImg-label .el-upload--picture-card i {
+    position: absolute;
+    top: 39%;
+    left: 37%;
+  }
+</style>

+ 334 - 0
src/views/modules/prod/scoreProdList.vue

@@ -0,0 +1,334 @@
+<template>
+  <div class="mod-prod">
+    <div class="search-bar">
+      <el-form :inline="true" class="search-form" ref="searchForm" :model="searchForm" size="small">
+        <div class="input-row">
+          <el-form-item prop="keyword" :label="$t('product.prodName') + ':'" class="search-form-item">
+            <el-input type="text" v-model="searchForm.keyword" :placeholder="$t('product.prodName')"></el-input>
+          </el-form-item>
+          <el-form-item prop="status" :label="$t('product.status') + ':'" class="search-form-item">
+            <el-select v-model="searchForm.status" :placeholder="$t('product.status')">
+              <el-option label="下架" :value="0"></el-option>
+              <el-option label="上架" :value="1"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <div class="default-btn primary-btn" @click="searchChange(true)">查询</div>
+            <div class="default-btn" @click="resetSearchForm('searchForm')">重置</div>
+          </el-form-item>
+        </div>
+      </el-form>
+    </div>
+    <div class="main-container">
+      <div class="operation-bar">
+        <div class="default-btn primary-btn" @click="addOrUpdateHandle()" v-if="isAuth('score:prod:save')">
+          新增
+        </div>
+      </div>
+      <div class="table-con">
+        <el-table
+          ref="scoreProLisTTable"
+          :data="dataList"
+          style="width: 100%"
+          header-cell-class-name="table-header"
+          row-class-name="table-row"
+          >
+          <el-table-column
+            align="left"
+            prop="prodName"
+            :label="$t('product.prodName')"
+            width="230">
+            <template slot-scope="scope">
+              <span class="table-cell-text">
+                {{scope.row.prodName}}
+              </span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            prop="pic"
+            :label="$t('product.pic')"
+            width="200">
+            <template slot-scope="scope">
+              <div class="table-cell-image">
+                <img :src="resourcesUrl + scope.row.pic" :alt="scope.row.prodName">
+              </div>
+            </template>
+          </el-table-column>
+          <!-- 市场价(元) -->
+          <el-table-column
+            prop="oriPrice"
+            align="center"
+            label="市场价(元)">
+          </el-table-column>
+          <!-- 销售价(元) -->
+          <el-table-column
+            prop="price"
+            align="center"
+            label="销售价(元)">
+          </el-table-column>
+          <el-table-column
+            prop="scorePrice"
+            align="center"
+            label="商品所需积分">
+          </el-table-column>
+          <el-table-column
+            prop="totalStocks"
+            align="center"
+            :label="$t('product.availableInventory')">
+          </el-table-column>
+          <el-table-column
+            prop="status"
+            :label="$t('product.status')">
+            <template slot-scope="scope">
+              <div v-if="scope.row.status === 1">上架</div>
+              <div v-else-if="scope.row.status === 0" >下架</div>
+              <div v-else-if="scope.row.status === 2" >违规下架</div>
+              <div v-else-if="scope.row.status === 3" >待审核</div>
+              <div v-else-if="scope.row.status === 4" >拒绝通过</div>
+              <div v-else >其他</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            fixed="right"
+            align="center"
+            :label="$t('publics.operating')"
+            width="230">
+            <template slot-scope="scope">
+              <div class="text-btn-con">
+                <div
+                v-if="isAuth('score:prod:update')"
+                class="default-btn text-btn"
+                @click="addOrUpdateHandle(scope.row.prodId)"
+                >修改</div>
+                <div
+                  class="default-btn text-btn"
+                  v-if="scope.row.status === 0"
+                  @click="changeProdStatus(scope.row.prodId, 1)"
+                >上架</div>
+                <div
+                  class="default-btn text-btn"
+                  v-if="scope.row.status === 1"
+                  @click="changeProdStatus(scope.row.prodId, 0)"
+                >下架</div>
+                <div
+                  class="default-btn text-btn"
+                  @click="editAssets(scope.row.prodId)"
+                >兑换素材</div>
+                <div
+                  v-if="isAuth('score:prod:delete')"
+                  class="default-btn text-btn"
+                  @click="deleteHandle(scope.row.prodId)"
+                >删除</div>
+              </div>
+            </template>
+          </el-table-column>
+
+
+        </el-table>
+      </div>
+      <el-pagination
+          v-if="dataList.length"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="page.currentPage"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="page.pageSize"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="page.total">
+        </el-pagination>
+    </div>
+
+    <!-- 下线管理弹窗-->
+    <ProdOfflineHandleEvent
+      v-if="prodOfflineHandleEventVisible"
+      selectUrl="/prod/prod/getOfflineHandleEventByProdId"
+      applyUrl="/prod/prod/auditApply"
+      ref="prodOfflineHandleEvent"
+      @refreshDataList="refreshChange"
+    ></ProdOfflineHandleEvent>
+    <score-prod-assets
+      v-if="prodAssetsVisible"
+      ref="scoreProdAssetsRef">
+    </score-prod-assets>
+  </div>
+</template>
+
+<script>
+import ProdOfflineHandleEvent from '@/components/offline-event-handle'
+import ScoreProdAssets from "./score-prod-assets";
+export default {
+  data () {
+    return {
+      theData: null, // 保存上次点击查询的请求条件
+      theParams: null, // 保存上次点击查询的请求条件
+
+      dataForm: {
+        prodName: ''
+      },
+      dataList: [],
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      searchForm: {
+        keyword: '',
+        status: ''
+      },
+      dataListSelections: [],
+      dataListLoading: false,
+      prodOfflineHandleEventVisible: false,
+      prodAssetsVisible: false,
+      prodNameRouter: '',
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL
+    }
+  },
+  components: {
+    ScoreProdAssets,
+    ProdOfflineHandleEvent
+  },
+  created () {
+    if (this.$route.query.prodName) {
+      this.prodNameRouter = this.$route.query.prodName
+    }
+    this.getDataList()
+  },
+  methods: {
+    // 获取数据列表
+    getDataList (page, newData = false) {
+      this.dataListLoading = true
+      if (newData || !this.theData) {
+        this.theParams = JSON.parse(JSON.stringify(this.searchForm))
+        this.theData = {
+          current: page == null ? this.page.currentPage : page.currentPage,
+          keyword: this.prodNameRouter ? this.prodNameRouter : this.dataForm.prodName,
+          size: page == null ? this.page.pageSize : page.pageSize,
+          prodType: 3
+        }
+      } else {
+        this.theData.current = page == null ? this.page.currentPage : page.currentPage
+        this.theData.size = page == null ? this.page.pageSize : page.pageSize
+      }
+
+      this.$http({
+        url: this.$http.adornUrl('/prod/prod/pageByProdType'),
+        method: 'get',
+        params: this.$http.adornParams(
+          Object.assign(
+           this.theData,
+            this.theParams
+          )
+        )
+      }).then(({ data }) => {
+        this.dataList = data.records
+        for (const key in this.dataList) {
+          if (this.dataList.hasOwnProperty(key)) {
+            const element = this.dataList[key]
+            element.imgs = element.pic
+          }
+        }
+        this.dataForm.prodName = ''
+        this.prodNameRouter = null
+        this.page.total = data.total
+        this.dataListLoading = false
+      })
+    },
+    // 新增 / 修改
+    addOrUpdateHandle (id) {
+      this.$router.push({
+        path: '/prod-scoreProdInfo',
+        query: { prodId: id }
+      })
+    },
+    // 删除
+    deleteHandle (id) {
+      this.$confirm(this.$i18n.t('scoreProdList.isDelete'), this.$i18n.t('remindPop.remind'), {
+        confirmButtonText: this.$i18n.t('remindPop.confirm'),
+        cancelButtonText: this.$i18n.t('remindPop.cancel'),
+        type: 'warning'
+      })
+        .then(() => {
+          this.$http({
+            url: this.$http.adornUrl(`/platform/scoreProduct/${id}`),
+            method: 'delete',
+            data: this.$http.adornData({})
+          }).then(({ data }) => {
+            this.$message({
+              message: this.$i18n.t('remindPop.succeeded'),
+              type: 'success',
+              duration: 1500,
+              onClose: () => {
+                this.getDataList(this.page)
+              }
+            })
+          })
+        })
+        .catch(() => { })
+    },
+    changeProdStatus (id, status) {
+      this.$confirm(this.$i18n.t('remindPop.makeSure') + ' ' + `[${status ? this.$i18n.t('prodList.onShelf') : this.$i18n.t('prodList.offShelf')}]` + ' ' + this.$i18n.t('remindPop.operation') + '?', this.$i18n.t('remindPop.remind'), {
+        confirmButtonText: this.$i18n.t('remindPop.confirm'),
+        cancelButtonText: this.$i18n.t('remindPop.cancel'),
+        type: 'warning'
+      })
+        .then(() => {
+          this.$http({
+            url: this.$http.adornUrl(`/platform/scoreProduct/prodStatus`),
+            method: 'put',
+            data: this.$http.adornData({
+              status: status,
+              prodId: id
+            })
+          }).then(({ data }) => {
+            this.$message({
+              message: this.$i18n.t('remindPop.succeeded'),
+              type: 'success',
+              duration: 1500,
+              onClose: () => {
+                this.getDataList(this.page)
+              }
+            })
+          })
+        })
+    },
+    // 条件查询
+    searchChange (newData = false) {
+      this.getDataList(this.page, newData)
+    },
+    // 多选变化
+    selectionChange (val) {
+      this.dataListSelections = val
+    },
+    // 申请审核
+    editAssets (prodId) {
+      this.prodAssetsVisible = true
+      this.$nextTick(() => {
+        this.$refs.scoreProdAssetsRef.init(prodId)
+      })
+    },
+    // 回调刷新
+    refreshChange () {
+      this.getDataList()
+    },
+        /**
+     * 重置表单
+     * @param {String} formName 表单名称
+     */
+    resetSearchForm (formName) {
+      this.$refs[formName].resetFields()
+    },
+    handleSizeChange (val) {
+      this.page.pageSize = val
+      this.getDataList()
+    },
+    handleCurrentChange (val) {
+      this.page.currentPage = val
+      this.getDataList()
+    }
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+
+</style>

+ 90 - 0
src/views/modules/score/consignment-info.vue

@@ -0,0 +1,90 @@
+<template>
+  <!-- 发货信息,用于导出代发货订单的excel交给快递公司 -->
+  <el-dialog
+    :modal="false"
+    :title="this.$i18n.t('order.pleEntShipInfo')"
+    :close-on-click-modal="false"
+    :visible.sync="visible"
+    width="38%"
+  >
+    <el-form
+      :model="dataForm"
+      :rules="dataRule"
+      ref="dataForm"
+      @keyup.enter.native="dataFormSubmit()"
+      label-width="120px"
+      size="small"
+    >
+      <el-form-item :label="this.$i18n.t('order.senderName')" prop="consignmentName">
+        <el-input
+          v-model="dataForm.consignmentName"
+          controls-position="right"
+          :label="this.$i18n.t('order.senderName')"
+        ></el-input>
+      </el-form-item>
+      <el-form-item :label="this.$i18n.t('order.shiPhoNum')" prop="consignmentMobile">
+        <el-input
+          v-model="dataForm.consignmentMobile"
+          controls-position="right"
+          :label="this.$i18n.t('order.shiPhoNum')"
+        ></el-input>
+      </el-form-item>
+      <el-form-item :label="this.$i18n.t('order.deliveryAddress')" prop="consignmentAddr">
+        <el-input
+          v-model="dataForm.consignmentAddr"
+          controls-position="right"
+          :label="this.$i18n.t('order.deliveryAddress')"
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <div class="default-btn" @click="visible = false">{{$t("crud.filter.cancelBtn")}}</div>
+      <div
+        class="default-btn primary-btn"
+        @click="dataFormSubmit()"
+      >{{$t("crud.filter.submitBtn")}}</div>
+    </span>
+  </el-dialog>
+</template>
+<script>
+export default {
+  data () {
+    return {
+      visible: false,
+      dataForm: {
+        consignmentName: '',
+        consignmentMobile: '',
+        consignmentAddr: ''
+      },
+      dataRule: {
+        consignmentName: [
+          { required: true, message: this.$i18n.t('publics.noNull'), trigger: 'blur' }
+        ],
+        consignmentMobile: [
+          { required: true, message: this.$i18n.t('publics.noNull'), trigger: 'blur' }
+        ],
+        consignmentAddr: [
+          { required: true, message: this.$i18n.t('publics.noNull'), trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  methods: {
+    init (orderNumber, dvyId, dvyFlowId) {
+      this.visible = true
+      this.$nextTick(() => {
+        this.$refs['dataForm'].resetFields()
+      })
+    },
+    // 表单提交
+    dataFormSubmit () {
+      this.$refs['dataForm'].validate((valid) => {
+        if (valid) {
+          this.visible = false
+          this.$emit('inputCallback', this.dataForm)
+        }
+      })
+    }
+  }
+}
+</script>

+ 427 - 0
src/views/modules/score/order-delivery-update.vue

@@ -0,0 +1,427 @@
+<template>
+  <el-dialog
+    :title="this.$i18n.t('order.orderShipping')"
+    :close-on-click-modal="false"
+    :visible.sync="visible"
+    width="50%"
+  >
+    <div class="mod-order-orderInfo">
+      <!-- <el-alert title="*请仔细填写物流公司及快递单号,发货后72小时内仅支持做一次更正,逾期不可修改" type="warning" show-icon></el-alert> -->
+      <el-table
+        ref="multipleTable"
+        :data="dataList"
+        tooltip-effect="dark"
+        style="width: 100%"
+        header-cell-class-name="table-header"
+        row-class-name="table-row"
+        @selection-change="handleSelectionChange"
+      >
+        <!-- <span>{{scope.row.status === 0?status=true:status=false}}<span> -->
+        <el-table-column
+          type="selection"
+          width="55"
+          :selectable="checkSelectable"
+        ></el-table-column>
+        <el-table-column :label="this.$i18n.t('product.prodName')">
+          <template slot-scope="scope">
+            {{ scope.row.prodName }}
+            <div
+              class="order-status"
+              v-if="
+                scope.row.returnMoneySts !== null &&
+                scope.row.returnMoneySts > 0 &&
+                scope.row.returnMoneySts < 6
+              "
+            >
+              {{ $t("order.reimburse") }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="prodCount"
+          :label="this.$i18n.t('order.canShipQuantity')"
+          width="160"
+          align="center"
+        ></el-table-column>
+        <el-table-column
+          prop="status"
+          :label="this.$i18n.t('product.status')"
+          show-overflow-tooltip
+          width="160"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <!-- <template slot-scope="scope">{{ scope.row.status }}</template> -->
+            <div
+              class="default-btn text-btn"
+              v-if="
+                scope.row.returnMoneySts !== null &&
+                scope.row.returnMoneySts < 6 &&
+                scope.row.returnMoneySts > 0
+              "
+              >{{
+                [
+                  "",
+                  $t("order.buyerApplication"),
+                  $t("order.sellerAccepts"),
+                  $t("order.selShipment"),
+                  $t("order.sellerReceipt"),
+                  $t("order.refundsuccessfully"),
+                ][scope.row.returnMoneySts]
+              }}</div
+            >
+            <div
+              v-else-if="scope.row.status !== 0 && scope.row.status !== -1"
+              >{{ $t("order.partialDelivery") }}</div
+            >
+            <div v-else-if="scope.row.status === 0">{{
+              $t("order.shipmentCompleted")
+            }}</div>
+            <div
+              v-else-if="scope.row.status === -1"
+              >{{ $t("order.toBeShipped") }}</div
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="changeNum"
+          :label="this.$i18n.t('order.numberOfShipments')"
+          fit
+          align="center"
+          width="240"
+        >
+          <template slot-scope="scope">
+            <el-input-number
+              :disabled="scope.row.prodCount <= 0"
+              size="small"
+              v-model="scope.row.changeNum"
+              :precision="0"
+              :min="0"
+              :max="scope.row.prodCount"
+            ></el-input-number
+            >​
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <!-- :rules="dataRule" -->
+    <el-form
+      :model="dataForm"
+      ref="dataForm"
+      @keyup.enter.native="dataFormSubmit()"
+      label-width="100px"
+      size="small"
+    >
+      <div class="detail-cont">
+        <div class="detail01">
+          <div class="text-width">
+            <el-form-item :label="this.$i18n.t('order.waitForDelivery')">
+              <span
+                >{{ $t("order.delType") }}:{{
+                  $t("order.expressDelivery")
+                }}</span
+              >
+            </el-form-item>
+            <el-form-item label>
+              <span
+                >{{ $t("publics.addressee") }}:{{
+                  dataForm.userAddrOrder.receiver
+                }}</span
+              >
+            </el-form-item>
+            <el-form-item label>
+              <span
+                >{{ $t("order.phoneNum") }}:{{
+                  dataForm.userAddrOrder.mobile
+                }}</span
+              >
+            </el-form-item>
+            <el-form-item label>
+              <span
+                >{{ $t("publics.deliveryAddr") }}:{{
+                  dataForm.userAddrOrder.province
+                }}{{ dataForm.userAddrOrder.city
+                }}{{ dataForm.userAddrOrder.area
+                }}{{ dataForm.userAddrOrder.addr }}</span
+              >
+            </el-form-item>
+          </div>
+        </div>
+      </div>
+      <el-form-item :label="this.$i18n.t('order.deliveryMethod') + ':'">
+        <el-radio-group v-model="dataForm.deliveryType" @change="clear()">
+          <el-radio :label="1" :disabled="dataForm.deliveryType === 4">{{
+            $t("order.shouldExpressDelivery")
+          }}</el-radio>
+          <el-radio :label="3" :disabled="dataForm.deliveryType === 4">{{
+            $t("order.noNeedRequired")
+          }}</el-radio>
+          <!-- <el-radio :label="4" :disabled="dataForm.deliveryType !== 4">{{
+            $t("order.sameCityDelivery")
+          }}</el-radio> -->
+        </el-radio-group>
+      </el-form-item>
+      <div v-if="dataForm.deliveryType === 1">
+        <el-form-item :label="this.$i18n.t('order.courierCompany') + ':'">
+          <!-- <span>快递公司:</span> -->
+          <el-select
+            v-model="dataForm.dvyId"
+            :placeholder="this.$i18n.t('tip.select')"
+          >
+            <el-option
+              v-for="item in dataForm.dvyNames"
+              :key="item.dvyId"
+              :label="item.dvyName"
+              :value="item.dvyId"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          :label="this.$i18n.t('order.trackingNumber') + ':'"
+          prop="dvyFlowId"
+        >
+          <el-input
+            v-model="dataForm.dvyFlowId"
+            width="80"
+            maxlength="90"
+            show-word-limit
+            label="this.$i18n.t('order.trackingNumber')"
+          ></el-input>
+        </el-form-item>
+      </div>
+    </el-form>
+    <span slot="footer">
+      <div class="default-btn" @click="visible = false">{{
+        $t("crud.filter.cancelBtn")
+      }}</div>
+      <div class="default-btn primary-btn" @click="submitProds()">{{
+        $t("crud.filter.submitBtn")
+      }}</div>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      visible: false,
+      dataForm: {
+        dvyId: '',
+        userAddrOrder: {},
+        dvyFlowId: 0,
+        dvyNames: [],
+        orderNumber: 0,
+        deliveryType: 1
+      },
+      dataList: [],
+      selectOrderItems: [],
+      isSubmit: false,
+      checkAll: false,
+      orderItems: [],
+      isTrue: false,
+      errorInfo: '',
+      orderId: 0,
+      order: null,
+      isIndeterminate: true,
+      orderNumber: 0,
+      freightAmount: 0,
+      lossAmount: 0,
+      dataListLoading: false,
+      dataListSelections: [],
+      addOrUpdateVisible: false
+    }
+  },
+  components: {},
+  mounted () { },
+  methods: {
+    processingStr (str) {
+      // str = str.replace(/\u200B/g,'');
+      // return str
+    },
+
+    /**
+     * 获取数据列表
+     */
+    init (order) {
+      this.isSubmit = false
+      this.dataForm.userAddrOrder = {}
+      this.visible = true
+      this.orderNumber = order.orderNumber
+      this.clear()
+      // 修改
+      this.$http({
+        url: this.$http.adornUrl(`/platform/orderDelivery/getOrderItemUnDelivery/${order.orderNumber}`),
+        method: 'get',
+        params: this.$http.adornParams()
+      }).then(({ data }) => {
+        // console.log('data', data)
+        // console.log('orderItems', data.orderItems)
+        this.dataForm.userAddrOrder = data.userAddrOrder
+        this.dataList = data.orderItems
+        this.dataForm.deliveryType = parseInt(data.dvyType)
+        this.dataList.forEach(element => {
+          element.changeNum = element.prodCount
+        })
+      })
+      this.getDeliveryList()
+    },
+    getDeliveryList () {
+      this.$http({
+        url: this.$http.adornUrl('/platform/delivery/list'),
+        method: 'get',
+        params: this.$http.adornParams()
+      }).then(({ data }) => {
+        this.dataForm.dvyNames = data
+      })
+    },
+    /**
+     * 修改状态
+     */
+    handleSelectionChange (val) {
+      this.selectOrderItems = val
+    },
+    /**
+     * 禁用多选按钮
+     */
+    checkSelectable (row) {
+      return row.status !== 0 && (!row.returnMoneySts || row.returnMoneySts < 0 || row.returnMoneySts > 5)
+    },
+    clear () {
+      this.dataForm.dvyFlowId = 0
+      this.dataForm.dvyId = ''
+    },
+    /**
+      * 校验数量
+      */
+    check () {
+      this.isTrue = false
+      if (this.selectOrderItems.length <= 0) {
+        this.isTrue = true
+        this.errorInfo = this.$i18n.t('order.seleOrd')
+        return true
+      }
+      this.selectOrderItems.forEach(element => {
+        if (element.prodCount <= 0 || element.prodCount < element.changeNum || element.changeNum <= 0) {
+          this.isTrue = true
+          this.errorInfo = element.prodName + this.$i18n.t('order.numNotZero') + '!'
+          return true
+        }
+        if (element.changeNum <= 0) {
+          this.isTrue = true
+          this.errorInfo = element.prodName + this.$i18n.t('order.numNotZero') + '!'
+          return true
+        }
+        if (element.changeNum == null) {
+          this.isTrue = true
+          this.errorInfo = element.prodName + this.$i18n.t('order.fhNumNotZero') + '!'
+          return true
+        }
+      })
+      if (this.dataForm.dvyId === '' && this.dataForm.deliveryType === 1) {
+        this.isTrue = true
+        this.errorInfo = this.$i18n.t('order.seleCouCom')
+        return true
+      }
+      if ((this.dataForm.dvyFlowId === 0 || !this.dataForm.dvyFlowId) && this.dataForm.deliveryType === 1) {
+        this.isTrue = true
+        this.errorInfo = this.$i18n.t('order.entCouNum')
+        return true
+      }
+      var reg = /^[a-zA-Z0-9]{4,30}$/
+      if (!reg.test(this.dataForm.dvyFlowId) && this.dataForm.deliveryType === 1) {
+        this.isTrue = true
+        this.errorInfo = this.$i18n.t('order.checkDvyId')
+        return true
+      }
+    },
+    /**
+     * 确定事件
+     */
+    submitProds () {
+      if (!this.dataForm.deliveryType) {
+        this.$message.error(this.$i18n.t('order.pledSeleMet'))
+        return
+      }
+      this.check()
+      if (this.isTrue) {
+        this.errorMsg(this.errorInfo)
+        return
+      }
+      if (this.isSubmit) {
+        return
+      }
+      this.isSubmit = true
+      // let param = this.dataForm
+      this.$http({
+        url: this.$http.adornUrl(`/platform/orderDelivery/orderItemsDelivery`),
+        method: 'put',
+        data: this.$http.adornData({
+          orderNumber: this.orderNumber,
+          dvyId: this.dataForm.dvyId,
+          dvyFlowId: this.dataForm.dvyFlowId,
+          freightAmount: this.freightAmount,
+          selectOrderItems: this.selectOrderItems,
+          deliveryType: this.dataForm.deliveryType
+        })
+      }).then(({ data }) => {
+        this.$message({
+          message: this.$i18n.t('publics.operation'),
+          type: 'success',
+          duration: 1500,
+          onClose: () => {
+            this.visible = false
+            this.$emit('refreshOrderDeliveryUpdate')
+          }
+        })
+      }).catch(({ e }) => {
+        this.isSubmit = false
+      })
+    },
+    errorMsg (message) {
+      this.$message({
+        message: message,
+        type: 'error',
+        duration: 1500
+      })
+    }
+  }
+}
+</script>
+
+<style>
+.el-input__inner {
+  border: 1px solid #dcdfe6 !important;
+}
+</style>
+<style scoped>
+.mod-order-orderInfo {
+  height: 100%;
+  width: 100%;
+  font: 14px Arial, "PingFang SC", "Hiragino Sans GB", STHeiti,
+    "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
+  color: #495060;
+}
+.element.style {
+  border-top: 1px solid #eeeeee;
+  border-right: 1px solid #eeeeee;
+  border-bottom: 1px solid #eeeeee;
+}
+.prods-select-body {
+  height: auto;
+  overflow: auto;
+  border-top: 1px solid #eeeeee;
+  border-right: 1px solid #eeeeee;
+  border-bottom: 1px solid #eeeeee;
+}
+.mod-order-order .contprod-:last-child {
+  border-bottom: 0;
+  border-left: 0;
+}
+.mod-order-order .prod-cont.prod-bottom,
+.mod-order-order .prod-cont {
+  border-bottom: 1px solid #dddee1;
+  border-left: 1px solid #dddee1;
+}
+</style>

+ 222 - 0
src/views/modules/score/order-upload.vue

@@ -0,0 +1,222 @@
+<template>
+  <!-- 发货信息,用于导出代发货订单的excel交给快递公司 -->
+  <el-dialog
+    :modal="false"
+    :title="$t('order.uploadTips1')"
+    :close-on-click-modal="false"
+    :visible.sync="visible"
+    :class="['box',this.$i18n.t('language') === 'English'?'box-en':'']"
+  >
+    <div class="tips">
+      <p>
+        {{$t('order.uploadTips0')}}
+      </p>
+      <p style="margin-top:10px">{{ $t('order.attention') }}:</p>
+      <p style="margin-top:10px">
+        {{$t('order.uploadTips2')}}
+      </p>
+      <p style="margin-top:10px">
+         {{$t('order.uploadTips3')}}
+      </p>
+    </div>
+    <el-upload
+      ref="upload"
+      v-loading="loading"
+      :auto-upload="false"
+      :v-loading="loading"
+      :before-upload="beforeAvatarUpload"
+      :file-list="files"
+      :limit="1"
+      :on-error="uploadFalse"
+      :on-preview="handlePreview"
+      :on-remove="handleRemove"
+      :on-success="uploadSuccess"
+      :action="this.$http.adornUrl('/score/order/exportOrderExcel')"
+      :headers="{Authorization: $cookie.get('Authorization_vp'),locale:lang}"
+      class="upload-demo"
+      name="orderExcelFile"
+    >
+      <!-- :file-list="fileList" -->
+      <!-- multiple -->
+
+      <div slot="tip" class="el-upload__tip" />
+      <div
+        class="default-btn"
+        @click="submitUpload"
+      >{{ $t("order.ImportingFiles") }}</div>
+      <div
+        class="default-btn"
+        @click="exportOrder"
+      >{{ $t("order.exportOrder") }}</div>
+      <div slot="trigger" class="default-btn primary-btn select">{{
+        $t("order.SelectFile")
+      }}</div>
+
+    </el-upload>
+  </el-dialog>
+</template>
+<script>
+// import * as api from '@/api/product/list'
+// import { getToken } from '@/utils/auth'
+// import * as orderApi from '@/api/order/order'
+export default {
+  props: {
+    param: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      visible: false,
+      lang: localStorage.getItem('lang') || 'zh_CN',
+      loading: false,
+      upload: false,
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+      couponId: 3,
+      files: [],
+      getToken: null,
+      dataForm: {
+        consignmentName: '',
+        consignmentMobile: '',
+        consignmentAddr: ''
+      },
+      dataRule: {
+        consignmentName: [
+          { required: true, message: this.$i18n.t('publics.noNull'), trigger: 'blur' }
+        ],
+        consignmentMobile: [
+          { required: true, message: this.$i18n.t('publics.noNull'), trigger: 'blur' }
+        ],
+        consignmentAddr: [
+          { required: true, message: this.$i18n.t('publics.noNull'), trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  methods: {
+    exportOrder () {
+      if (!this.param.startTime || !this.param.endTime) {
+        this.$message.error(this.$i18n.t('order.pleExpOrderFirst'))
+        return
+      }
+      this.$confirm(this.$t('order.sureToExport'), this.$t('text.tips'), {
+        confirmButtonText: this.$t('order.confirm'),
+        cancelButtonText: this.$t('order.cancel'),
+        type: 'warning'
+      }).then(() => {
+        this.$http({
+          url: this.$http.adornUrl('/score/order/unDeliveryOrderExcel'),
+          methods: 'get',
+          params: this.$http.adornParams({
+            'startTime': this.param.startTime, // 开始时间
+            'endTime': this.param.endTime // 结束时间
+          }),
+          responseType: 'blob' // 解决文件下载乱码问题
+        }).then(({ data }) => {
+          var blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' })
+          const fileName = '待发货订单信息.xlsx'
+          const elink = document.createElement('a')
+          if ('download' in elink) { // 非IE下载
+            elink.download = fileName
+            elink.style.display = 'none'
+            elink.href = URL.createObjectURL(blob)
+            document.body.appendChild(elink)
+            elink.click()
+            URL.revokeObjectURL(elink.href) // 释放URL 对象
+            document.body.removeChild(elink)
+          } else { // IE10+下载
+            navigator.msSaveBlob(blob, fileName)
+          }
+        }).catch((e) => {
+          this.$message.error(e)
+        })
+      })
+    },
+    uploadSuccess (response) {
+      this.loading = false
+      console.log(response)
+      const data = response
+      if (!data) {
+        alert(this.$i18n.t('order.fileSuccess'))
+      } else {
+        alert(data)
+      }
+      this.files = []
+      this.visible = false
+      this.$emit('refreshDataList1')
+    },
+    uploadFalse (response) {
+      this.loading = false
+      alert(this.$i18n.t('order.fileUploadFail'))
+    },
+    init (id) {
+      this.visible = true
+      this.loading = false
+      this.files = []
+      this.$nextTick(() => {
+        // this.$refs['dataForm'].resetFields()
+      })
+      this.couponId = id
+    },
+    // 上传前对文件的大小的判断
+    beforeAvatarUpload (file) {
+      this.upload = true
+      const extension = file.name.split('.')[1] === 'xls'
+      const extension2 = file.name.split('.')[1] === 'xlsx'
+      const isLt2M = file.size / 1024 / 1024 < 10
+      if (!extension && !extension2) {
+        alert(this.$i18n.t('order.downloadTemplateTips1'))
+        return false
+      }
+      if (!isLt2M) {
+        alert(this.$i18n.t('order.downloadTemplateTips2'))
+        return false
+      }
+      this.loading = true
+      return extension || (extension2 && isLt2M)
+    },
+    submitUpload () {
+      this.upload = false
+      this.$refs.upload.submit()
+      if (!this.upload) {
+        this.$message.error('请选择要上传的文件')
+      }
+    },
+    handleRemove (file) {
+    },
+    handlePreview (file) {
+      if (file.response.status) {
+        alert(this.$i18n.t('order.fileSuccess'))
+      } else {
+        alert(this.$i18n.t('order.fileFail'))
+      }
+      this.visible = false
+      this.$emit('refreshDataList1')
+    }
+  }
+}
+</script>
+<style scoped>
+ div >>> .el-dialog__body {
+   padding: 20px;
+ }
+ .tips {
+   margin-bottom: 30px;
+ }
+ .select {
+   margin-right: 10px;
+ }
+ .box >>> .el-dialog {
+   width: 40%;
+ }
+ 
+ @media (max-width:1660px) {
+  .box-en >>> .el-dialog {
+    width: 69% !important;
+  }
+ }
+ 
+</style>

+ 1615 - 0
src/views/modules/score/order.vue

@@ -0,0 +1,1615 @@
+<template>
+  <div class="mod-score-order">
+    <div class="search-bar">
+      <el-form
+        :inline="true"
+        :model="dataForm"
+        @keyup.enter.native="getDataList(this.page)"
+        size="small"
+      >
+      <div class="input-row">
+        <el-form-item :label="$t('order.number') + ':'">
+          <el-input
+            v-model="dataForm.orderNumber"
+            :placeholder="this.$i18n.t('order.number')"
+            clearable
+            size="small"
+          ></el-input>
+        </el-form-item>
+        <el-form-item :label="$t('order.status') + ':'">
+          <template>
+            <el-select
+              v-model="status"
+              clearable
+              :placeholder="this.$i18n.t('order.statusMsg')"
+              size="small"
+              @change="orderStatus"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </template>
+        </el-form-item>
+        <el-form-item :label="$t('order.theRecipientSName') + ':'">
+          <el-input
+            v-model="dataForm.receiver"
+            :placeholder="this.$i18n.t('order.pleaseEnRecipName')"
+            clearable
+            size="small"
+          ></el-input>
+        </el-form-item>
+
+        <el-form-item label="联系电话:">
+          <el-input
+            v-model="dataForm.mobile"
+            :placeholder="this.$i18n.t('order.pleaseEnterNumber')"
+            clearable
+            size="small"
+            type="number"
+            class="myinput-appearance"
+          ></el-input>
+        </el-form-item>
+        <el-form-item :label="$t('order.createTime') + ':'">
+          <el-date-picker
+            size="small"
+            v-model="dateRange"
+            type="datetimerange"
+            range-separator="—"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <div class="default-btn" @click="setDateRange(1)">今日</div>
+          <div class="default-btn" @click="setDateRange(2)">昨日</div>
+          <div class="default-btn" @click="setDateRange(3)">近7天</div>
+          <div class="default-btn" @click="setDateRange(4)">近30天</div>
+        </el-form-item>
+
+        <el-form-item>
+          <div
+            class="default-btn primary-btn"
+            @click="searchChange(true)"
+            >查询</div
+          >
+          <!-- <el-button @click="showConsignmentInfo()"
+                    type="primary"
+          size="small">导出待发货订单</el-button>-->
+          <div
+            class="default-btn"
+            @click="clear()"
+            >清空</div
+          >
+         <!-- <div
+            class="default-btn"
+            @click="getSoldExcel()"
+            >{{ $t("order.export") }}</div
+          >
+
+         <div
+              class="default-btn"
+              @click="uploadSpu"
+              >{{ $t("order.BulkShipping") }}</div
+            >-->
+        </el-form-item>
+        </div>
+      </el-form>
+    </div>
+    <div class="main-container main">
+      <div class="content">
+        <!-- 导航 -->
+        <div class="score-status-nav clearfix">
+          <ul class="nav-list clearfix" style="left: -2%">
+            <li
+              :class="['nav-item', sts == 0 ? 'selected' : '']"
+              data-sts="0"
+              @click="selectNav($event)"
+            >
+              <p class="li-txt">全部</p>
+            </li>
+            <li
+              :class="['nav-item', sts == 1 ? 'selected' : '']"
+              data-sts="1"
+              @click="selectNav($event)"
+            >
+              <p class="li-txt">{{ $t("order.pendingPayment") }}</p>
+            </li>
+            <li
+              :class="['nav-item', sts == 2 ? 'selected' : '']"
+              data-sts="2"
+              @click="selectNav($event)"
+            >
+              <p class="li-txt">{{ $t("order.toBeShipped") }}</p>
+            </li>
+            <li
+              :class="['nav-item', sts == 3 ? 'selected' : '']"
+              data-sts="3"
+              @click="selectNav($event)"
+            >
+              <p class="li-txt">{{ $t("order.pendingReceipt") }}</p>
+            </li>
+            <li
+              :class="['nav-item', sts == 5 ? 'selected' : '']"
+              data-sts="5"
+              @click="selectNav($event)"
+            >
+              <p class="li-txt">{{ $t("order.successfulTransaction") }}</p>
+            </li>
+            <li
+              :class="['nav-item', sts == 6 ? 'selected' : '']"
+              data-sts="6"
+              @click="selectNav($event)"
+            >
+              <p class="li-txt">{{ $t("order.transactionFailed") }}</p>
+            </li>
+            <!-- <li
+              :class="['nav-item', sts == 7 ? 'selected' : '']"
+              data-sts="7"
+              @click="selectNav($event)"
+            >
+              <p class="li-txt">{{ $t("group.groupType") }}</p>
+            </li> -->
+          </ul>
+          <ul class="nav-right"></ul>
+        </div>
+
+        <!-- 列标题 -->
+        <div :class="['tit', showHeadScroll ? 'fixed-top' : '']">
+          <el-row style="width: 100%">
+            <el-col :span="7">
+              <span class="item product">{{ $t("order.product") }}</span>
+            </el-col>
+            <el-col :span="3" class="transaction-price">
+              <span class="item">{{ $t("order.transaQuantity") }}</span>
+            </el-col>
+            <el-col :span="3" class="column-title">
+              <span class="item">金额/积分(元)</span>
+            </el-col>
+            <el-col :span="3" class="column-title">
+              <span class="item">{{ $t("order.paymentMethod") }}</span>
+            </el-col>
+            <el-col :span="3" class="column-title">
+              <span class="item">{{ $t("order.buyerConsignee") }}</span>
+            </el-col>
+            <el-col :span="2" class="column-title">
+              <span class="item">订单状态</span>
+            </el-col>
+            <!-- <el-col :span="2" class="column-title">
+              <span class="item">{{ $t("order.afterSale") }}</span>
+            </el-col> -->
+            <el-col :span="3" class="column-title">
+              <span class="item">{{ $t("order.operation") }}</span>
+            </el-col>
+          </el-row>
+        </div>
+
+        <div class="prod" v-for="order in dataList" :key="order.orderId">
+          <div class="prod-tit">
+            <span>{{ $t("order.number") }}:{{ order.orderNumber }}</span>
+            <span>{{ $t("order.createTime") }}:{{ order.createTime }}</span>
+            <span>店铺名称:{{ order.shopName }}</span>
+            <!-- <span>买家:19999999999</span>
+            <span >联系电话:19999999999</span>-->
+          </div>
+          <div class="prod-cont">
+            <el-row style="width: 100%">
+              <el-col :span="10">
+                <div class="prod-item">
+                  <div
+                    class="items name"
+                    v-for="orderItem in order.orderItems"
+                    :key="orderItem.orderItemId"
+                  >
+                    <div class="prod-image">
+                      <img :src="resourcesUrl + orderItem.pic"  @error="handlePicError" />
+                    </div>
+                    <div class="prod-name">
+                      <dir class="prod-con">
+                        <div class="prod-name-txt">
+                          {{ orderItem.prodName }}
+                        </div>
+                        <div
+                          class="order-status"
+                          v-if="order.status > 0 && order.status < 8"
+                        >
+                          {{
+                            [
+                              "",
+                              $t("order.pendingPayment"),
+                              $t("order.toBeShipped"),
+                              $t("order.pendingReceipt"),
+                              "",
+                              $t("order.successfulTransaction"),
+                              $t("order.transactionFailed"),
+                              $t("group.waitGroup"),
+                            ][order.status]
+                          }}
+                        </div>
+                        <!-- <div
+                          class="order-status"
+                          v-if="order.status > 0 && order.status < 8"
+                        >{{['','待付款','待发货','待收货','','交易成功','交易失败','待成团'][order.status]}}</div>-->
+                        <!-- <span class="prod-info">{{orderItem.skuName}}</span> -->
+                      </dir>
+                    </div>
+                    <div class="prod-price">
+                      <span>{{ orderItem.price.toFixed(2) }}</span>
+                      <span
+                        >{{ orderItem.prodCount }}件</span
+                      >
+                    </div>
+                  </div>
+                </div>
+              </el-col>
+              <el-col :span="3" style="height: 100%">
+                <div class="item">
+                  <div>
+                    <span class="totalprice"
+                      >¥ {{ order.actualTotal.toFixed(2)
+                      }}{{
+                        order.payScore && order.payScore > 0
+                          ? "+ " + order.payScore + " 积分"
+                          : ""
+                      }}</span
+                    >
+                    <span class="totalprice" v-if="order.freightAmount"
+                      >({{ $t("order.includingFreight") }}:{{
+                        $t("order.monetaryUnit")
+                      }}{{ order.freightAmount.toFixed(2) }})</span
+                    >
+                    <span
+                      >{{ $t("order.total") }} {{ order.productNums }}
+                      件</span
+                    >
+                  </div>
+                </div>
+              </el-col>
+              <el-col :span="3" style="height: 100%">
+                <div class="item">
+                  <div>
+                    <span v-if="(!order.payType && order.payType != 0) || order.status === 1">{{
+                      $t("order.unpaid")
+                    }}</span>
+                    <span v-else>{{
+                      [
+                        $t("order.pointsPayment"),
+                        $t("order.wecProPay"),
+                        $t("order.alipayPCPayment"),
+                        $t("order.wechatScanCodePayment"),
+                        $t("order.wechatH5Payment"),
+                        $t("order.weclAccountPay"),
+                        $t("order.alipayH5Payment"),
+                        $t("order.alipayAPPPayment"),
+                        $t("order.wechatAPPPayment"),
+                        $t("order.balancePayment"),
+                        $t("order.payPalPayment")
+                      ][order.payType]
+                    }}</span>
+                    <!-- <span
+                      v-else
+                    >{{['积分支付','微信小程序支付','支付宝PC端支付','微信扫码支付','微信H5支付','微信公众号支付','支付宝H5支付','支付宝APP支付','微信APP支付','用户余额支付','PayPal支付'][order.payType]}}</span>-->
+                  </div>
+                </div>
+              </el-col>
+              <el-col :span="3" style="height: 100%">
+                <div class="item">
+                  <div class="buyer-info">
+                    <div class="buyer-name" v-if="order.dvyType !== 3">
+                      {{ order.userAddrOrder.receiver }}
+                    </div>
+                    <div class="buyer-phone" v-if="order.dvyType !== 3">
+                      {{ order.userAddrOrder.mobile }}
+                    </div>
+                  </div>
+                </div>
+              </el-col>
+              <el-col :span="2" style="height: 100%">
+                <div class="item">
+                  <!-- <span v-if="order.refundStatus === 1" size="small" type="danger">退款申请中</span> -->
+                  <span>
+<!--                    待付款-->
+                    <span
+                      v-if="order.status === 1"
+                      size="small"
+                      type="danger"
+                      >{{ $t("order.pendingPayment") }}</span
+                    >
+<!--                    待发货-->
+                    <span
+                      v-else-if="order.status === 2"
+                      size="small"
+                      type="danger"
+                      >{{ $t("order.toBeShipped") }}</span
+                    >
+<!--                    待收货-->
+                    <span
+                      v-else-if="order.status === 3"
+                      size="small"
+                      type="danger"
+                      >{{ $t("order.pendingReceipt") }}</span
+                    >
+<!--                    待成团-->
+                    <span
+                      v-else-if="order.status === 7"
+                      size="small"
+                      type="danger"
+                      >{{ $t("group.waitGroup") }}</span
+                    >
+<!--                    交易成功-->
+                    <span
+                      v-else-if="order.status === 5"
+                      size="small"
+                      type="danger"
+                      >{{ $t("order.successfulTransaction") }}</span
+                    >
+<!--                    交易失败-->
+                    <span v-else-if="order.status === 6" size="small">{{
+                      $t("order.transactionFailed")
+                    }}</span>
+                  </span>
+                </div>
+              </el-col>
+              <!-- <el-col :span="2" style="height: 100%">
+                <div class="item">
+                  <span
+                    v-if="order.refundStatus === 1"
+                    size="small"
+                    type="danger"
+                    >{{ $t("order.requestingRefund") }}</span
+                  >
+                  <span
+                    v-else-if="order.refundStatus === 2"
+                    size="small"
+                    type="danger"
+                    >{{ $t("order.refundsuccessfully") }}</span
+                  >
+                  <span
+                    v-else-if="order.refundStatus === 3"
+                    size="small"
+                    type="danger"
+                    >{{ $t("order.partialRefundSucc") }}</span
+                  >
+                  <span
+                    v-else-if="order.refundStatus === 4"
+                    size="small"
+                    type="danger"
+                    >{{ $t("order.refundFailed") }}</span
+                  >
+                  <span v-else size="small" type="danger">{{
+                    $t("order.noAfterSales")
+                  }}</span>
+                </div>
+              </el-col> -->
+              <el-col :span="3" style="height: 100%">
+                <div class="item">
+                  <div class="operate">
+                    <!-- <button onclick="">打印订单</button><br> -->
+                    <!--<div
+                      class="default-btn text-btn operate-btn"
+                      @click="addOrUpdateHandle(order.orderNumber)"
+                      >{{ $t("order.seeDetails") }}</div
+                    >-->
+                    <!--<div
+                      class="default-btn text-btn operate-btn marLeftNo block"
+                      @click="toImbox(order)"
+                      >{{ $t("order.contactBuyer") }}</div
+                    >-->
+                    <!--<div
+                      class="default-btn text-btn operate-btn marLeftNo"
+                      @click="changeOrder(order)"
+                      v-if="
+                        order.status === 2 &&
+                        (!order.refundStatus || order.refundStatus === 4)
+                      "
+                      >{{ $t("order.delivery") }}</div
+                    >-->
+                    <!-- 退款信息 -->
+                    <div
+                      class="default-btn text-btn"
+                      @click="refundRoute(order.orderNumber)"
+                      v-if="order.refundStatus"
+                      >{{ $t("order.refundInformation") }}</div
+                    >
+                    <div
+                      class="default-btn text-btn marLeftNo"
+                      v-if="
+                        order.status == 3 &&
+                        (!order.refundStatus || order.refundStatus > 2) &&
+                        order.dvyType === 1
+                      "
+                      @click="reviseLogistics(order.orderNumber)"
+                      >{{ $t("delivery.modifyLogistics") }}</div
+                    >
+                  </div>
+                </div>
+              </el-col>
+            </el-row>
+          </div>
+          <!-- <div class="remark">
+            <div class="buyer-remark">
+              <span>备注:{{order.remarks}}</span>
+            </div>
+          </div>-->
+        </div>
+        <div class="empty" v-if="!dataList.length">
+          {{ $t("order.noData") }}
+        </div>
+      </div>
+    </div>
+    <el-pagination
+      v-if="dataList.length"
+      @size-change="sizeChangeHandle"
+      @current-change="currentChangeHandle"
+      :current-page="page.currentPage"
+      :page-sizes="[10, 20, 50, 100]"
+      :page-size="page.pageSize"
+      :total="page.total"
+      layout="total, sizes, prev, pager, next, jumper"
+    ></el-pagination>
+    <!-- 弹窗, 新增 / 修改 -->
+    <add-or-update
+      v-if="addOrUpdateVisible"
+      ref="addOrUpdate"
+      @refreshDataList="getDataList"
+    ></add-or-update>
+    <order-delivery-update
+      v-if="devyVisible"
+      ref="orderDeliveryUpdate"
+      @refreshOrderDeliveryUpdate="getDataList"
+    ></order-delivery-update>
+    <consignment-info
+      v-if="consignmentInfoVisible"
+      ref="consignmentInfo"
+      @inputCallback="getWaitingConsignmentExcel"
+    ></consignment-info>
+    <!-- 修改物流弹窗 -->
+    <!-- <el-dialog :title="修改物流" width="70%"></el-dialog> -->
+    <el-dialog
+      :title="this.$i18n.t('delivery.modifyLogistics')"
+      :close-on-click-modal="false"
+      :visible.sync="logVisible"
+      @closed="handleClose"
+      class="LogModification"
+      width="50%"
+    >
+      <!-- 修改 -->
+      <div class="revise-log" v-if="isReviseLog">
+        <div class="change-logistics">
+          <div class="warning">{{ $t("delivery.ifModifyTheLog") }}</div>
+          <div class="log-list">
+            <div
+              class="item"
+              v-for="(logItem, index) in logisticsInfo"
+              :key="index"
+            >
+              <div class="i-tit">
+                <div class="big">
+                  {{ $t("delivery.package") }}{{ index + 1 }}
+                </div>
+                <div class="text">
+                  {{ $t("delivery.total") }} {{ logItem.productNums }}
+                  {{ $t("marketing.item") }}{{ $t("order.product") }}
+                </div>
+              </div>
+              <!-- <div class="i-con">
+                   <div class="label">发货方式:</div>
+                   <div class="con">
+                     <div class="con-radio">
+                       <input type="radio" name="checkit" value="" checked="true"/><span>需要物流</span>
+                     </div>
+                   </div>
+                 </div>
+                 <div class="i-con">
+                   <div class="label">物流公司:</div>
+                   <div class="con">
+                     <div class="con-select">申通快递</div>
+                     <div class="con-text">
+                       <div class="text">运单号编:</div>
+                       <input type="text" />
+                     </div>
+                   </div>
+              </div>-->
+
+              <el-form
+                :model="logDataForm"
+                ref="logDataForm"
+                @keyup.enter.native="logDataFormSubmit()"
+                label-width="95px"
+                size="small"
+              >
+                <el-form-item
+                  :label="$t('delivery.deliveryMethod') + ':'"
+                  style="text-align: left"
+                >
+                  <el-radio-group v-model="logItem.deliveryType">
+                    <el-radio :label="1" v-model="radio" disabled>{{
+                        $t("delivery.needLogistics")
+                      }}</el-radio>
+                    <el-radio :label="3" v-model="radio" disabled>{{
+                        $t("order.noNeedRequired")
+                      }}</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+                <div class="info-int" v-if="logItem.deliveryType !== 3">
+                  <el-form-item
+                    :label="$t('delivery.courierCompany') + ':'"
+                    class="form-item"
+                  >
+                    <div class="con">
+                      <el-select class="int-frame" v-model="logItem.dvyId">
+                        <!-- :placeholder="this.$i18n.t('tip.select')" -->
+                        <el-option
+                          v-for="item in logDataForm.dvyNames"
+                          :key="item.dvyId"
+                          :label="item.dvyName"
+                          :value="item.dvyId"
+                        ></el-option>
+                      </el-select>
+                    </div>
+                  </el-form-item>
+                  <el-form-item
+                    :label="$t('delivery.trackingNumber') + ':'"
+                    class="form-item"
+                  >
+                    <el-input
+                      v-model="logItem.dvyFlowId"
+                      controls-position="right"
+                      :min="0"
+                      :class="['int-frame', errorNum == 1 ? 'errortip' : '']"
+                    ></el-input>
+                    <!-- :label="this.$i18n.t('order.trackingNumber')" -->
+                  </el-form-item>
+                </div>
+              </el-form>
+            </div>
+          </div>
+        </div>
+      </div>
+      <!-- 确认 -->
+      <div class="change-logistics" v-if="!isReviseLog">
+        <div class="warning">{{ $t("delivery.ifModifyTheLog") }}</div>
+        <el-table
+          header-cell-class-name="table-header"
+          row-class-name="table-row"
+          :data="confirmList">
+          <!-- <div v-for="(item,index) in confirmList" :key="index"> -->
+          <el-table-column
+            property="dvyIdName"
+            :label="this.$i18n.t('delivery.packageName')"
+            width="220"
+            style="text-align: left"
+          ></el-table-column>
+          <el-table-column
+            property="productNums"
+            :label="this.$i18n.t('delivery.amountOfGoods')"
+            width="140"
+          ></el-table-column>
+          <el-table-column
+            property="delMethod"
+            :label="this.$i18n.t('delivery.deliveryMethod')"
+            width="140"
+          ></el-table-column>
+          <el-table-column
+            property="dvyName"
+            :label="this.$i18n.t('delivery.logisticsCompany')"
+            width="170"
+          ></el-table-column>
+          <el-table-column
+            property="dvyFlowId"
+            :label="this.$i18n.t('delivery.trackingNumber')"
+          ></el-table-column>
+          <!-- </div> -->
+        </el-table>
+      </div>
+
+      <div slot="footer" v-if="isReviseLog" class="dialog-footer">
+        <div
+          class="default-btn"
+         @click="logVisible = false">{{
+          $t("crud.filter.cancelBtn")
+        }}</div>
+        <div
+          class="default-btn primary-btn"
+          @click="logDataFormSubmit()">{{
+          $t("distribution.save")
+        }}</div>
+      </div>
+
+      <div slot="footer" v-if="!isReviseLog" class="dialog-footer">
+        <div
+          class="default-btn"
+          @click="backToRevise()">{{
+          $t("delivery.backToModify")
+        }}</div>
+        <div
+          class="default-btn primary-btn"
+          type="primary" @click="confirmRevise()">{{
+          $t("delivery.confirmTheChanges")
+        }}</div>
+      </div>
+    </el-dialog>
+    <!-- 批量发货弹窗 -->
+    <order-upload v-if="uploadVisible" ref="spuUpload" :param="dataForm" @refreshDataList1="getWaitingConsignmentExcel" />
+
+  </div>
+</template>
+
+<script>
+import AddOrUpdate from './orderInfo'
+import ConsignmentInfo from './consignment-info'
+import OrderDeliveryUpdate from './order-delivery-update'
+import moment from 'moment'
+import OrderUpload from './order-upload'
+export default {
+  data () {
+    return {
+      sts: 0,
+      dataForm: {},
+      dateRange: [],
+      status: null,
+      options: [{
+        value: 1,
+        label: this.$i18n.t('order.pendingPayment')
+      },
+      {
+        value: 2,
+        label: this.$i18n.t('order.toBeShipped')
+      },
+      {
+        value: 3,
+        label: this.$i18n.t('order.pendingReceipt')
+      },
+      {
+        value: 5,
+        label: this.$i18n.t('order.successfulTransaction')
+      },
+      {
+        value: 6,
+        label: this.$i18n.t('order.transactionFailed')
+      }],
+      refund: [{
+        value: 0,
+        label: this.$i18n.t('order.noAfterSales')
+      },
+      {
+        value: 1,
+        label: this.$i18n.t('order.requestARefund')
+      },
+      {
+        value: 2,
+        label: this.$i18n.t('order.refundsuccessfully')
+      },
+      {
+        value: 3,
+        label: this.$i18n.t('order.partialRefundSucc')
+      },
+      {
+        value: 4,
+        label: this.$i18n.t('order.refundFailed')
+      }],
+      orderType: [{
+        value: 0,
+        label: this.$i18n.t('order.normalOrder')
+      }, {
+        value: 1,
+        label: this.$i18n.t('order.groupPurchaseOrder')
+      }, {
+        value: 2,
+        label: this.$i18n.t('order.spikeOrder')
+      }],
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+      dataList: [],
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      // 确认修改弹窗
+      isReviseLog: true,  // 是否正在修改物流信息
+      confirmList: [],  // 确认修改信息
+      radio: '1',
+      logVisible: false,
+      logDataForm: {
+        dvyId: '', // 当前物流公司id
+        dvyFlowId: '',  // 物流单号
+        dvyNames: []  // 物流公司列表
+      },
+      logisticsInfo: [],  // 包裹列表
+      showHeadScroll: false, // 修改物流相关
+      dataListLoading: false,
+      dataListSelections: [],
+      orderDevyVisible: false,
+      devyVisible: false,
+      addOrUpdateVisible: false,
+      consignmentInfoVisible: false,
+      uploadVisible: false,
+      oldPar: {}
+    }
+  },
+  components: {
+    AddOrUpdate,
+    ConsignmentInfo,
+    OrderDeliveryUpdate,
+    OrderUpload
+  },
+  created () {
+    // 携带参数查询
+    this.getDataList(this.page, this.$route.query)
+
+    // 请求物流公司
+    this.getLogisticsList()
+  },
+  activated () {
+    // 携带参数查询
+    var query = this.$route.query
+    if (Object.keys(query).length > 0) {
+      this.getDataList(this.page, query)
+    }
+  },
+  mounted () {
+    // 监听页面滚动
+    window.addEventListener('scroll', this.scrollToTop)
+  },
+  methods: {
+    handlePicError (event) {
+      event.target.src = require('@/assets/img/def.png')
+    },
+    /**
+     * 页面滚动事件
+     */
+    scrollToTop () {
+      let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
+      this.showHeadScroll = scrollTop > 400
+    },
+    /**
+     * 发货
+     */
+    changeOrder (order) {
+      this.devyVisible = true
+      this.$nextTick(() => {
+        this.$refs.orderDeliveryUpdate.init(order)
+      })
+    },
+    /**
+     * 获取数据列表
+     */
+    getDataList (page, params, type = 0, newData = false) {
+      let par = Object.assign(
+        {
+          'orderNumber': this.dataForm.orderNumber,
+              // 'prodName': this.dataForm.prodName,
+          'shopName': this.dataForm.shopName,
+          'receiver': this.dataForm.receiver,
+          'mobile': this.dataForm.mobile,
+          'status': this.status,
+          'refundStatus': this.dataForm.refundStatus,
+          'startTime': this.dateRange === null ? null : this.dateRange[0], // 开始时间
+          'endTime': this.dateRange === null ? null : this.dateRange[1] // 结束时间
+        },
+            params
+          )
+      if (type === 0) {
+        this.oldPar = par
+      } else {
+        par = this.oldPar
+      }
+      if (newData || !this.theData) {
+        this.theData = JSON.parse(JSON.stringify(par))
+      }
+      page = (page === undefined ? this.page : page)
+      this.dataListLoading = true
+      this.$http({
+        url: this.$http.adornUrl('/score/order/page'),
+        method: 'get',
+        params: this.$http.adornParams(
+          Object.assign(
+            {
+              current: page == null ? this.page.currentPage : page.currentPage,
+              size: page == null ? this.page.pageSize : page.pageSize
+            },
+            this.theData
+          ), false
+        )
+      }).then(({ data }) => {
+        this.dataList = data.records
+        this.page.total = data.total
+        this.sts = !this.status ? 0 : this.status
+        this.dataListLoading = false
+      })
+    },
+    // 每页数
+    sizeChangeHandle (val) {
+      this.page.pageSize = val
+      this.page.currentPage = 1
+      this.getDataList(this.page, {}, 1)
+    },
+    // 当前页
+    currentChangeHandle (val) {
+      this.page.currentPage = val
+      this.getDataList(this.page, {}, 1)
+    },
+
+    /**
+     * 导航选择状态
+     */
+    selectNav (e) {
+      this.page.currentPage = 1
+      var sts = e.currentTarget.dataset.sts
+      this.sts = parseInt(sts)
+      this.status = this.sts === 0 ? null : parseInt(sts)
+      this.getDataList(this.page)
+    },
+    // 多选
+    selectionChangeHandle (val) {
+      this.dataListSelections = val
+    },
+    orderStatus (val) {
+      this.status = val
+    },
+    /**
+     * 根据选项设置时间
+     * 1:今天 2:昨天 3: 近七天 4:近30天 5:近60天
+     */
+    setDateRange (val) {
+      var startDay = null
+      var endDay = null
+      if (val === 1) {
+        startDay = 0
+        endDay = 0
+      } else if (val === 2) {
+        startDay = -1
+        endDay = -1
+      } else if (val === 3) {
+        startDay = -7
+        endDay = -1
+      } else if (val === 4) {
+        startDay = -30
+        endDay = -1
+      } else {
+        return
+      }
+      // 开始时间
+      var startTime = moment().add(startDay, 'days').startOf('days').format('LL')
+      // 结束时间
+      var endTime = moment().add(endDay, 'days').endOf('days').format('LL')
+      this.dateRange = [startTime, endTime]
+    },
+    // 新增 / 修改
+    addOrUpdateHandle (val) {
+      // this.addOrUpdateVisible = true
+      // this.$nextTick(() => {
+      //   this.$refs.addOrUpdate.init(val)
+      // })
+      this.$router.push({
+        path: '/score-orderInfo',
+        query: {
+          orderNumber: val
+        }
+      })
+    },
+    // 退款路由跳转
+    refundRoute (val) {
+      this.$router.push({
+        path: '/order-orderRefund',
+        query: { orderNumber: val }
+      })
+    },
+    /**
+     * 关闭 修改物流弹窗
+     */
+    handleClose () {
+      this.isReviseLog = true
+    },
+    // 前往消息盒子
+    toImbox (order) {
+      window.open(location.href.split('#')[0] + '#/imBox?userId=' + order.userId + '&orderNumber=' + order.orderNumber, 'view_window')
+    },
+    // 删除
+    deleteHandle (id) {
+      var ids = id ? [id] : this.dataListSelections.map(item => {
+        return item.orderId
+      })
+      this.$confirm(this.$i18n.t('remindPop.makeSure') + ' ' + `[${id ? this.$i18n.t('remindPop.delete') : this.$i18n.t('remindPop.batchDeletion')}]` + ' ' + this.$i18n.t('remindPop.operation') + '?', this.$i18n.t('remindPop.remind'), {
+        confirmButtonText: this.$i18n.t('remindPop.confirm'),
+        cancelButtonText: this.$i18n.t('remindPop.cancel'),
+        type: 'warning'
+      }).then(() => {
+        this.$http({
+          url: this.$http.adornUrl(`/prod/spec/${ids}`),
+          method: 'delete',
+          data: this.$http.adornData(ids, false)
+        }).then(({ data }) => {
+          this.$message({
+            message: this.$i18n.t('remindPop.succeeded'),
+            type: 'success',
+            duration: 1500,
+            onClose: () => {
+              this.getDataList(this.page)
+            }
+          })
+        })
+      }).catch(() => { })
+    },
+    showConsignmentInfo () {
+      this.consignmentInfoVisible = true
+      this.$nextTick(() => {
+        this.$refs.consignmentInfo.init()
+      })
+    },
+    // 清空按钮
+    clear () {
+      this.dataForm = {}
+      this.dateRange = []
+      this.status = null
+    },
+    /**
+     * 获取包裹物流信息
+     */
+    reviseLogistics (orderNumber) {
+      // console.log(orderNumber)
+      this.logVisible = !this.logVisible
+      this.$http({
+        url: this.$http.adornUrl('/platform/orderDelivery/getOrderDeliveries/' + orderNumber),
+        method: 'put'
+      }).then(({ data }) => {
+        this.logisticsInfo = data
+        this.logisticsInfo.forEach((el, index) => {
+          el.newDvyFlowId = el.dvyFlowId
+          el.newDvyId = el.dvyId
+          el.dvyIdName = this.$i18n.t('order.package') + Number(index + 1)
+          // 修改弹窗
+          this.confirmList = []  // 清空确认列表
+        })
+      })
+      this.errorNum = 0
+      // console.log(this.logisticsInfo)
+    },
+    /**
+     * 请求物流公司列表
+     */
+    getLogisticsList () {
+      this.$http({
+        url: this.$http.adornUrl('/admin/delivery/list'),
+        method: 'get',
+        params: this.$http.adornParams()
+      }).then(({ data }) => {
+        this.logDataForm.dvyNames = data
+      })
+    },
+
+    /**
+     * 点击保存
+     */
+    logDataFormSubmit () {
+      //  let reviseLogList = []
+      let flag = true
+      let logisticsInfo = this.logisticsInfo
+      logisticsInfo.map((el, index) => {
+        if (el.deliveryType === 3) {
+          return
+        }
+        if (!flag) {
+          return false
+        }
+        // console.log('logisticsInfo', el.logisticsInfo)
+        // console.log('el.dvyFlowId', el.dvyFlowId)
+        var reg = /^[a-zA-Z0-9]{4,30}$/
+        if (el.dvyFlowId.length === 0) {
+          this.$message({
+            message: this.$i18n.t('order.logEmpty'),
+            type: 'warning'
+          })
+          flag = false
+          this.errorNum = 1
+          // throw ('物流单号不能为空')
+          // return false
+        } else if (!reg.test(el.dvyFlowId)) {
+          this.$message({
+            message: this.$i18n.t('order.checkDvyId'),
+            type: 'warning'
+          })
+          flag = false
+          this.errorNum = 1
+        } else {
+          this.errorNum = 0
+          // console.log(el.newDvyFlowId)
+          let confirmList = this.confirmList
+          if ((el.newDvyFlowId.length !== 0 && el.newDvyFlowId !== el.dvyFlowId) || (el.newDvyId !== el.dvyId)) {
+            confirmList.push(el)
+            confirmList.forEach((el, index) => {
+              el.delMethod = this.$i18n.t('delivery.logistics')
+              // el.packageName = "包裹" + Number(index+1)
+              this.logDataForm.dvyNames.forEach((dvyName, index) => {
+                if (el.dvyId === dvyName.dvyId) {
+                  el.dvyName = dvyName.dvyName
+                }
+              })
+            })
+            this.confirmList = confirmList
+          }
+        }
+        // console.log('确认列表:', this.confirmList)
+        // this.confirmList.forEach((el, index) => {
+
+        // })
+      })
+      // console.log(this.errorNum)
+      if (this.errorNum === 1) {
+        return
+      } else if (this.confirmList.length === 0) {
+        this.$message({
+          message: this.$i18n.t('order.noLogIsChanged'),
+          type: 'warning'
+        })
+        flag = false
+      }
+      if (flag) {
+        this.isReviseLog = false // 修改弹窗
+      }
+    },
+    /**
+     * 确认修改物流信息
+     */
+    confirmRevise () {
+      // let dvyOrderParam = {
+      //   deliveryOrders: this.confirmList
+      // }
+      this.$http({
+        url: this.$http.adornUrl('/platform/orderDelivery/updateOrderDeliveries'),
+        method: 'put',
+        data: this.$http.adornData({
+          deliveryOrders: this.confirmList
+        }),
+        params: this.$http.adornParams()
+      }).then(({ data }) => {
+        this.$message({
+          message: this.$i18n.t('publics.operation'),
+          type: 'success'
+        })
+        this.isReviseLog = true
+        this.logVisible = false
+      })
+    },
+    /**
+     * 返回修改(物流信息)
+     */
+    backToRevise () {
+      this.isReviseLog = true
+      // 修改弹窗
+      this.confirmList = []  // 清空确认列表
+    },
+    // 搜索查询
+    searchChange (newData = false) {
+      this.page.currentPage = 1
+      this.getDataList(this.page, null, 0, newData)
+    },
+    getSoldExcel () {
+      if (!this.dateRange || this.dateRange.length < 2) {
+        this.$message.error(this.$i18n.t('order.pleExpOrderFirst'))
+        return
+      }
+      this.$confirm(this.$i18n.t('order.exportReport'), this.$i18n.t('remindPop.remind'), {
+        confirmButtonText: this.$i18n.t('remindPop.confirm'),
+        cancelButtonText: this.$i18n.t('remindPop.cancel'),
+        type: 'warning'
+      }).then(() => {
+        this.$http({
+          url: this.$http.adornUrl('/score/order/soldExcel'),
+          method: 'get',
+          params: this.$http.adornParams({
+            'orderNumber': this.dataForm.orderNumber,
+            // 'prodName': this.dataForm.prodName,
+            'shopName': this.dataForm.shopName,
+            'receiver': this.dataForm.receiver,
+            'mobile': this.dataForm.mobile,
+            'status': this.status,
+            'refundStatus': this.dataForm.refundStatus,
+            'startTime': this.dateRange === null ? null : this.dateRange[0], // 开始时间
+            'endTime': this.dateRange === null ? null : this.dateRange[1] // 结束时间
+          }),
+          responseType: 'blob' // 解决文件下载乱码问题
+        }).then(({ data }) => {
+          var blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' })
+          const fileName = this.$i18n.t('order.orderInfCollationXls')
+          const elink = document.createElement('a')
+          if ('download' in elink) { // 非IE下载
+            elink.download = fileName
+            elink.style.display = 'none'
+            elink.href = URL.createObjectURL(blob)
+            document.body.appendChild(elink)
+            elink.click()
+            URL.revokeObjectURL(elink.href) // 释放URL 对象
+            document.body.removeChild(elink)
+          } else { // IE10+下载
+            navigator.msSaveBlob(blob, fileName)
+          }
+        })
+      })
+    },
+    getWaitingConsignmentExcel () {
+      this.getDataList(this.page)
+    },
+    uploadSpu () {
+      this.dataForm.startTime = this.dateRange === null ? null : this.dateRange[0]
+      this.dataForm.endTime = this.dateRange === null ? null : this.dateRange[1]
+      this.uploadVisible = true
+      this.$nextTick(() => {
+        this.$refs.spuUpload.init()
+      })
+    }
+  },
+  destroyed () {
+    // 页面销毁时移除监听
+    window.removeEventListener('scroll', this.handleScroll)
+  }
+}
+</script>
+<style scoped>
+.el-button + .el-button {
+  margin-left: 0 !important;
+  display: block;
+}
+.operation-box {
+  display: inline-block;
+  margin-left: 30px;
+}
+</style>
+
+<style lang="scss" scoped>
+.clearfix:after {
+  /*伪元素是行内元素 正常浏览器清除浮动方法*/
+  content: "";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+}
+.clearfix {
+  *zoom: 1; /*ie6清除浮动的方式 *号只有IE6-IE7执行,其他浏览器不执行*/
+}
+// .el-form-item {
+//   margin-bottom: 10px !important;
+// }
+input.el-input__inner {
+  // border: 0;
+  height: 32px;
+  line-height: 32px;
+  font-size: 14px;
+}
+.mod-score-order {
+  .screening-conditions {
+    display: block;
+    padding: 20px;
+    background: #f8f8f9;
+    margin-bottom: 20px;
+  }
+  .main {
+    .score-status-nav {
+      position: relative;
+      display: block;
+      width: 100%;
+      margin-bottom: 15px;
+      height: 40px;
+      line-height: 40px;
+      .nav-list {
+        position: absolute;
+        left: 0;
+        top: 0;
+        width: 40%;
+      }
+      .nav-right {
+        // width: 61.5%;
+        width: 70%;
+        height: 45px;
+        // margin-left: 38.5%;
+        margin-left: 30%;
+        border-bottom: 1px solid #ddd;
+      }
+      .nav-item {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        float: left;
+        width: 14%;
+        height: 45px;
+        line-height: 1.5em;
+        background: #f8f8f9;
+        border-top: 1px solid #ddd;
+        border-right: 1px solid #ddd;
+        border-bottom: 1px solid #ddd;
+        text-align: center;
+        cursor: pointer;
+      }
+      .li-txt {
+        text-overflow: -o-ellipsis-lastline;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        display: -webkit-box;
+        -webkit-line-clamp: 2;
+        -webkit-box-orient: vertical;
+      }
+      .nav-item:first-child {
+        border-left: 1px solid #ddd;
+      }
+      .selected {
+        background: #fff;
+        border-bottom: none;
+      }
+    }
+    .tit {
+      display: flex;
+      align-items: center;
+      margin-bottom: 15px;
+      background: #F7F8FA;
+      z-index: 11;
+      height: 57px;
+      font-weight: bold;
+    }
+    .fixed-top {
+      position: fixed;
+      width: calc(83.5% + var(--tit-width-incremental));
+      top: 90px;
+    }
+    .column-title {
+      text-align: center;
+    }
+    .transaction-price {
+      text-align: right;
+    }
+  }
+  .prod {
+    margin-bottom: 15px;
+  }
+  .tit {
+    display: flex;
+    height: 45px;
+    align-items: center;
+  }
+  .tit .item {
+    padding: 0 10px;
+    width: 10%;
+    text-align: center;
+  }
+  .tit .product {
+    width: 25%;
+  }
+  .prod-tit {
+    padding: 10px;
+    background: #f8f8f9;
+    border-left: 1px solid #dddee1;
+    border-top: 1px solid #dddee1;
+    border-right: 1px solid #dddee1;
+  }
+  .prod-tit span {
+    margin-right: 15px;
+  }
+  .prod-cont {
+    display: flex;
+    border-top: 1px solid #dddee1;
+    border-bottom: 1px solid #dddee1;
+    border-left: 1px solid #dddee1;
+    color: #495060;
+  }
+  .prod-cont .item {
+    display: flex;
+    display: -webkit-flex;
+    align-items: center;
+    justify-content: center;
+    padding: 10px;
+    // width: 10%;
+    border-right: 1px solid #dddee1;
+    text-align: center;
+    height: 100%;
+  }
+  .prod-cont .item span {
+    display: block;
+  }
+  .prod-cont .prod-item {
+    // width: 38%;
+    display: flex;
+    flex-direction: column;
+    border-right: 1px solid #dddee1;
+  }
+  .prod-name {
+    // display: flex;
+    // align-items: center;
+    width: 55%;
+    text-align: left;
+    vertical-align: middle;
+  }
+  .prod-con {
+    display: block;
+    padding: 0 !important;
+  }
+  .prod-price {
+    position: absolute;
+    right: 10px;
+    text-align: center;
+  }
+  .prod-price span {
+    display: block;
+  }
+  .prod-price span:first-child {
+    margin-bottom: 10px;
+  }
+  .prod-name .prod-info {
+    display: block;
+    color: #80848f;
+    margin-top: 30px;
+  }
+  .buyer-info {
+    display: block;
+    width: 100%;
+  }
+  .buyer-name {
+    margin-bottom: 10px;
+  }
+  .order-status {
+    display: inline-block;
+    margin-top: 15px;
+    padding: 2px 4px;
+    border: 1px solid #e43130;
+    border-radius: 2px;
+    color: #e43130;
+  }
+  .prod-cont .items.name {
+    display: flex;
+    align-items: center;
+    position: relative;
+    padding: 10px;
+    // height: 100px;
+    border-bottom: 1px solid #dddee1;
+  }
+  .prod-cont .items.name:last-child {
+    border-bottom: none;
+  }
+  .prod-image {
+    margin-right: 20px;
+    width: 80px;
+    height: 80px;
+  }
+  .prod-image img {
+    width: 100%;
+    height: 100%;
+  }
+  // .item span {
+  //   display: block;
+  //   margin-bottom: 10px;
+  // }
+  .totalprice {
+    margin-bottom: 10px;
+  }
+  .item .operate {
+    color: #2d8cf0;
+  }
+  .item .totalprice {
+    color: #c00;
+  }
+  .prod .remark {
+    width: 100%;
+    height: 50px;
+    line-height: 50px;
+    background-color: #e8f7f6;
+    border-left: 1px solid #dddee1;
+    border-right: 1px solid #dddee1;
+    border-bottom: 1px solid #dddee1;
+    margin-bottom: 20px;
+  }
+  .buyer-remark {
+    padding: 0 20px;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+  }
+
+  .el-form-item {
+    margin-bottom: 20px !important;
+  }
+  .el-form-item__label {
+    width: 100px;
+  }
+}
+.empty {
+  display: block;
+  height: 200px;
+  line-height: 200px;
+  text-align: center;
+  color: #aaa;
+}
+// 修改物流弹窗
+.change-logistics {
+  color: #333;
+  padding: 0 20px;
+}
+// .change-logistics,
+// .revise-log {
+//   max-height: 300px;
+//   overflow-y: auto;
+// }
+.LogModification {
+  .i-tit {
+    margin-bottom: 10px;
+  }
+  .el-button + .el-button {
+    display: inline-block;
+    margin-left: 10px !important;
+  }
+  input.el-input__inner {
+    border: 0 !important;
+  }
+  .log-list {
+    max-height: 600px;
+    overflow-y: auto;
+  }
+}
+
+.log-info-table {
+  margin-top: 20px;
+  max-height: 600px;
+  overflow-y: auto;
+}
+
+.change-logistics .warning {
+  padding: 10px;
+  border: 1px solid #f1924e;
+  background: #fff5ed;
+}
+
+.change-logistics .item {
+  padding-bottom: 20px;
+}
+
+.change-logistics .item .i-tit {
+  display: flex;
+  align-items: center;
+}
+
+.change-logistics .item .i-tit .big {
+  font-weight: 600;
+  margin-right: 15px;
+}
+
+.change-logistics .item .i-con {
+  display: flex;
+  align-items: center;
+  margin-top: 15px;
+}
+
+.change-logistics .item .i-con .label {
+  width: 80px;
+}
+
+.change-logistics .item .i-con .con {
+  display: flex;
+  align-items: center;
+}
+
+.change-logistics .item .i-con .con .con-radio {
+  margin-right: 10px;
+}
+
+.change-logistics .item .i-con .con .con-radio input,
+.change-logistics .item .i-con .con .con-radio span {
+  display: inline-block;
+  vertical-align: middle;
+  margin-right: 8px;
+}
+
+.change-logistics .item .i-con .con .con-radio input[type="radio"] {
+  margin-left: 5px;
+}
+
+.change-logistics .item .i-con .con .con-select {
+  position: relative;
+  padding: 6px 25px 6px 12px;
+  width: 220px;
+  height: 32px;
+  line-height: 18px;
+  border: 1px solid #ddd;
+  background: #fff;
+  border-radius: 2px;
+}
+
+.change-logistics .item .i-con .con .con-select::after {
+  position: absolute;
+  top: 13px;
+  right: 8px;
+  display: block;
+  width: 0;
+  height: 0;
+  content: " ";
+  font-size: 0;
+  border: 5px solid transparent;
+  border-top: 5px solid #333;
+  border-radius: 2px;
+}
+
+.change-logistics .item .i-con .con .con-text {
+  margin-left: 10px;
+  display: flex;
+  align-items: center;
+}
+
+.change-logistics .item .i-con .con .con-text .text {
+  width: 80px;
+}
+
+.change-logistics .item .i-con .con .con-text input[type="text"] {
+  border: 1px solid #ddd;
+  padding: 0 10px;
+  height: 30px;
+  width: 160px;
+  border-radius: 2px;
+}
+// 修改物流弹窗end
+
+// 修改物流信息弹窗
+.log-list {
+  margin-top: 30px;
+}
+.el-form-item__label {
+  // text-align: left;
+  width: 100px;
+}
+.el-form-item {
+  margin-bottom: 0;
+  // margin-top: 10px;
+}
+.info-int {
+  display: flex;
+}
+.form-item {
+  margin-right: 15px;
+}
+.int-frame {
+  // border-radius: 0;
+  border: 0;
+  // border: 1px solid #ddd;
+}
+.info-int .el-form-item__content,
+.info-int .el-form-item__label,
+.el-input__suffix-inner,
+.el-input__icon {
+  height: 32px;
+  line-height: 32px;
+}
+// 修改物流信息弹窗end
+// 确认修改
+.el-table .cell {
+  text-align: center;
+}
+.errortip {
+  border-color: #e43130;
+}
+.block {
+  display: block !important;
+}
+.marLeftNo {
+  margin-left: 0 !important;
+}
+@media (max-width:1660px) {
+  .fixed-top {
+    width: calc(79.5% + var(--tit-width-incremental)) !important;
+  }
+}
+@media (max-width:1360px) {
+  .fixed-top {
+    width: calc(75.5% + var(--tit-width-incremental)) !important;
+  }
+}
+</style>
+
+<style>
+  .mod-score-order .search-bar .input-row .myinput-appearance>  input::-webkit-outer-spin-button,
+.mod-score-order .search-bar .input-row .myinput-appearance>  input::-webkit-inner-spin-button {
+    -webkit-appearance: none;
+}
+.mod-score-order .search-bar .input-row .myinput-appearance>input[type="number"] {
+    -moz-appearance: textfield;
+}
+</style>

+ 1405 - 0
src/views/modules/score/orderInfo.vue

@@ -0,0 +1,1405 @@
+<template>
+  <div class="detail-dialog">
+    <div class="new-page-title">
+      <div class="line" />
+      <div class="text">
+        {{
+          !dataForm.orderNumber
+          ? this.$i18n.t('crud.addTitle')
+          : this.$i18n.t('order.orderDetails')
+        }}
+      </div>
+    </div>
+    <el-form
+      :model="dataForm"
+      ref="dataForm"
+      @keyup.enter.native="dataFormSubmit()"
+      label-width="80px"
+      size="small"
+    >
+      <div class="mod-order-orderInfo">
+        <div class="content">
+          <div class="order-number" style="display: none">
+            <div class="num-cont">
+              <el-form-item :label="this.$i18n.t('order.number') + ':'">
+                <span class="text">{{ dataForm.orderNumber }}</span>
+              </el-form-item>
+              <el-form-item>
+                <el-steps
+                  :active="stepsStatus"
+                  align-center
+                  :process-status="dataForm.status == 6 ? 'error' : 'wait'"
+                >
+                  <el-step
+                    :title="this.$i18n.t('order.submitOrder')"
+                    :description="dataForm.createTime"
+                  ></el-step>
+                  <el-step
+                    :title="this.$i18n.t('order.paid')"
+                    :description="dataForm.payTime"
+                  ></el-step>
+                  <el-step
+                    :title="this.$i18n.t('order.delivered')"
+                    :description="dataForm.dvyTime"
+                  ></el-step>
+                  <el-step
+                    :title="this.$i18n.t('order.receivedGoods')"
+                    :description="dataForm.finallyTime"
+                  ></el-step>
+                </el-steps>
+              </el-form-item>
+            </div>
+          </div>
+          <div class="order-state" style="display:none">
+            <div class="state-cont">
+              <div class="state-title">
+                <el-form-item
+                  :label="this.$i18n.t('order.orderStatus') + ':'"
+                >
+                  <template slot-scope="scope">
+                    <div
+                      v-if="dataForm.status === 1"
+                      >{{ $t("order.pendingPayment") }}</div
+                    >
+                    <div
+                      v-if="dataForm.status === 2"
+                      >{{ $t("order.toBeShipped") }}</div
+                    >
+                    <div
+                      v-if="dataForm.status === 3"
+                      >{{ $t("order.pendingReceipt") }}</div
+                    >
+                    <div
+                      v-if="dataForm.status === 4"
+                      >{{ $t("order.toBeEvaluated") }}</div
+                    >
+                    <div
+                      v-if="dataForm.status === 5"
+                      >{{ $t("order.success") }}</div
+                    >
+                    <div
+                      v-if="dataForm.status === 6"
+                      >{{ $t("order.fail") }}</div
+                    >
+                    <div
+                      v-if="dataForm.status === 7"
+                      >{{ $t("group.waitGroup") }}</div
+                    >
+                  </template>
+                </el-form-item>
+                <el-form-item>
+                  <el-row>
+                    <!-- <el-button
+                    type="primary"
+                    v-if="dataForm.status === 2"
+                    plain
+                    @click="changeOrder()"
+                    >发货</el-button>-->
+                    <!-- <el-button type="info" plain>打印</el-button> -->
+                  </el-row>
+                </el-form-item>
+              </div>
+              <div class="order-info">
+                <div class="order-details">
+                  <div class="detail-title">
+                    <img src="~@/assets/img/car.png" alt />
+                    <span class="prompt">{{ $t("order.deliveryMsg") }}</span>
+                    &nbsp;
+                    <div
+                      class="default-btn text-btn"
+                      v-if="dataForm.status < 3 || dataForm.status === 7"
+                      @click="changeUserAddrOrder(dataForm.userAddrOrder)"
+                      >{{ $t("order.reviseAddr") }}</div
+                    >
+                  </div>
+                  <div class="detail-cont">
+                    <div class="detail01">
+                      <img src="~@/assets/img/address.png" alt />
+                      <div class="text-width">
+                        <!-- <span class="revise-addr" @click="changeAddr(dataForm.addrOrderId)">
+                        <img src="~@/assets/img/revise.png" alt=""/>修改地址
+                        </span>-->
+                        <el-form-item
+                          :label="this.$i18n.t('publics.addressee') + ':'"
+                        >
+                          <span>{{ dataForm.userAddrOrder.receiver }}</span>
+                        </el-form-item>
+                        <el-form-item
+                          :label="this.$i18n.t('publics.mobilePhone') + ':'"
+                        >
+                          <span>{{ dataForm.userAddrOrder.mobile }}</span>
+                        </el-form-item>
+                        <el-form-item
+                          :label="this.$i18n.t('publics.deliveryAddr') + ':'"
+                        >
+                          <span
+                            >{{ dataForm.userAddrOrder.province
+                            }}{{ dataForm.userAddrOrder.city
+                            }}{{ dataForm.userAddrOrder.area
+                            }}{{ dataForm.userAddrOrder.addr }}</span
+                          >
+                        </el-form-item>
+                      </div>
+                    </div>
+                    <div class="detail01">
+                      <img src="~@/assets/img/invoice.png" alt />
+                      <span>{{ $t("order.invoiceMsg") }}</span>
+                    </div>
+                  </div>
+                </div>
+                <div class="buyers">
+                  <div class="detail-title">
+                    <img
+                      src="~@/assets/img/buyer.png"
+                      alt
+                      style="margin-right: 15px"
+                    />
+                    <el-form-item
+                      :label="this.$i18n.t('order.orderRemarks')"
+                      style="margin-top: 22px"
+                      label-width="80px"
+                    >
+                      &nbsp;
+                      <div class="default-btn text-btn" @click="changeRemarks()">{{
+                        $t("order.reviseRemarks")
+                      }}</div>
+                    </el-form-item>
+                  </div>
+                  <div class="buyers-info">
+                    <div class="detail02">
+                      <img src="~@/assets/img/message.png" alt />
+                      <div class="text-width">
+                        <span>{{ $t("order.reviseRemarks") + ":" }}</span>
+                        <br />
+                        <span>{{ dataForm.remarks }}</span>
+                      </div>
+                    </div>
+                    <div class="detail02">
+                      <img src="~@/assets/img/message.png" alt />
+                      <div class="text-width">
+                        <span>{{ $t("order.sellerNote") + ":" }}</span>
+                        <br />
+                        <span>{{ dataForm.shopRemarks }}</span>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+              <div class="item-list">
+                <el-table :data="dataForm.orderItems" border
+                  header-cell-class-name="table-header"
+                  row-class-name="table-row"
+                >
+                  <el-table-column prop :label="this.$i18n.t('home.goods')">
+                    <template slot-scope="scope">
+                      <img
+                        :src="resourcesUrl + scope.row.pic"
+                        width="100"
+                        height="100"
+                      />
+                      <span>{{ scope.row.prodName }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    prop="price"
+                    :label="this.$i18n.t('home.unitPrice')"
+                    width="180"
+                    align="center"
+                  >
+                    <template slot-scope="scope">
+                      <span>{{ scope.row.price }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    prop="count"
+                    :label="this.$i18n.t('home.quantity')"
+                    width="180"
+                    align="center"
+                  >
+                    <template slot-scope="scope">
+                      <span>{{ scope.row.prodCount }}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    prop="totalPrice"
+                    :label="this.$i18n.t('home.totalPrice')"
+                    width="180"
+                    align="center"
+                  >
+                    <template slot-scope="scope">
+                      <span>{{ scope.row.productTotalAmount }}</span>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+              <div class="item-info">
+                <el-form-item
+                  :label="this.$i18n.t('home.prodTotalPrice') + ':'"
+                >
+                  <span class="text">¥{{ dataForm.total }}</span>
+                </el-form-item>
+                <!-- <el-form-item label="店铺优惠:">
+              <span class="text">¥15.00</span>
+                </el-form-item>-->
+                <!-- <el-form-item label="积分抵扣:">
+              <span class="text">¥15.00</span>
+                </el-form-item>-->
+                <!-- <el-form-item label="发票费用:">
+              <span class="text">¥15.00</span>
+                </el-form-item>-->
+                <el-form-item
+                  :label="this.$i18n.t('home.shippingFees') + ':'"
+                  v-if="dataForm.freightAmount"
+                >
+                  <span class="text">¥{{ dataForm.freightAmount }}</span>
+                </el-form-item>
+                <el-form-item :label="this.$i18n.t('home.amountDue') + ':'">
+                  <span class="text">{{
+                  $t("order.monetaryUnit") +
+                  dataForm.actualTotal +
+                  " + " +
+                  dataForm.score +
+                  $t("order.score")}}</span>
+                </el-form-item>
+              </div>
+            </div>
+          </div>
+          <div class="order-number">
+            <div class="number">
+              <span class="text">{{ $t("order.number") }}:</span>
+              {{ dataForm.orderNumber }}
+            </div>
+            <div class="time">
+              <span class="text">{{ $t("order.createTime") }}:</span>
+              {{ dataForm.createTime }}
+            </div>
+            <div class="type">
+              {{
+                [
+                  $t("order.notYetrmalOrder"),
+                  $t("order.groupPurchaseOrder"),
+                  $t("order.spikeOrder"),
+                ][dataForm.orderType]
+              }}
+            </div>
+          </div>
+          <div class="order-state">
+            <div class="state-box">
+              <div class="state">
+                {{
+                  [
+                    $t("order.waitToPay"),
+                    $t("order.waitDel"),
+                    $t("order.waitingFeGoods"),
+                    $t("order.waitingtion"),
+                    $t("order.commoditful"),
+                    $t("order.commodityFailed"),
+                    $t("order.commodited"),
+                  ][dataForm.status - 1]
+                }}
+              </div>
+              <div class="state-des">
+                <div v-if="dataForm.status === 1">
+                  {{ $t("order.buyerDidNTime") }}
+                </div>
+                <div v-if="dataForm.status === 2">
+                  {{ $t("order.buyPleF") }}
+                </div>
+                <div v-if="dataForm.status === 3">
+                  {{ $t("order.shelF") }}
+                </div>
+                <!-- <div v-if="dataForm.status === 4">订单已完成,等待买家发表评价。</div> -->
+                <div v-if="dataForm.status === 5">{{ $t("order.buyB") }}</div>
+                <div v-if="dataForm.status === 6">
+                  {{ $t("order.orderCanc") }}
+                </div>
+                <div v-if="dataForm.status === 7">
+                  {{ $t("order.outTimeCanOrd") }}
+                </div>
+              </div>
+              <!-- <div class="actions">
+                <div class="item" v-if="dataForm.status === 1">
+                  <div class="el-button--text">修改价格</div>
+                </div>
+                <div class="item" v-if="dataForm.status === 2">
+                  <div class="el-button--text">立即发货</div>
+                  <div
+                    class="item-btn"
+                    @click="changeUserAddrOrder(dataForm.userAddrOrder)"
+                  >修改收货地址</div>
+                </div>
+                <div class="item" v-if="dataForm.status === 3">
+                  <div class="el-button--text">延长收货</div>
+                </div>
+              </div>-->
+            </div>
+            <div class="state-steps">
+              <el-form-item>
+                <el-steps
+                  :active="stepsStatus"
+                  align-center
+                  :process-status="dataForm.status == 6 ? 'error' : 'wait'"
+                >
+                  <el-step
+                    :title="this.$i18n.t('order.submitOrder')"
+                    :description="dataForm.createTime"
+                  ></el-step>
+                  <el-step
+                    :title="this.$i18n.t('order.paid')"
+                    :description="dataForm.payTime"
+                  ></el-step>
+                  <el-step
+                    :title="this.$i18n.t('order.delivered')"
+                    :description="dataForm.dvyTime"
+                  ></el-step>
+                  <el-step
+                    :title="this.$i18n.t('order.receivedGoods')"
+                    :description="dataForm.finallyTime"
+                  ></el-step>
+                </el-steps>
+              </el-form-item>
+            </div>
+          </div>
+          <div class="packages">
+            <div class="p-tab">
+              <div
+                :class="indexs === index ? 'item active' : 'item'"
+                @click="onClickListDelivery(deliveryExpresse, index)"
+                v-for="(
+                  deliveryExpresse, index
+                ) in dataForm.deliveryExpresses"
+                :key="index"
+              >
+                {{ $t("order.package") }}{{ index + 1 }}
+              </div>
+            </div>
+            <div class="p-con" v-if="deliveryExpresse">
+              <div class="deliver-msg">
+                <div class="d-item">
+                  <div class="text" :style="this.$i18n.t('language') === 'language' ? 'width:210px;' : 'width:80px;'">{{ $t("order.deliveryMethod") }}:</div>
+                  <div class="res">
+                    {{
+                      [
+                        $t("order.expressDelivery"),
+                        $t("order.selfMention"),
+                        $t("order.noNeedRequired"),
+                      ][deliveryExpresse.deliveryType - 1] || [
+                        this.$i18n.t("order.expressDelivery"),
+                        this.$i18n.t("order.selfMention"),
+                        this.$i18n.t("order.noNeedRequired"),
+                      ][dataForm.dvyType - 1]
+                    }}
+                  </div>
+                  <!-- <div class="item">
+                    <div class="text">配送方式:</div>
+                    <div class="res" v-if="dataForm.dvyType == 1">快递</div>
+                    <div class="res" v-if="dataForm.dvyType == 2">自提</div>
+                    <div class="res" v-if="dataForm.dvyType == 3">无需快递</div>
+                  </div>-->
+                </div>
+                <div class="d-item">
+                  <div class="text" :style="this.$i18n.t('language') === 'language' ? 'width:210px;' : 'width:80px;'">{{ $t("order.deliveryTime") }}:</div>
+                  <div class="res">{{ deliveryExpresse.createTime }}</div>
+                </div>
+                <div class="d-item" v-if="deliveryExpresse.deliveryType !== 3">
+                  <div class="text" :style="this.$i18n.t('language') === 'language' ? 'width:210px;' : 'width:80px;'">{{ $t("order.courierCompany") }}:</div>
+                  <div class="res">
+                    {{ deliveryExpresse.deliveryDto.companyName }}
+                  </div>
+                </div>
+                <div class="d-item" v-if="deliveryExpresse.deliveryType !== 3">
+                  <div class="text" :style="this.$i18n.t('language') === 'language' ? 'width:210px;' : 'width:80px;'">{{ $t("order.trackingNumber") }}:</div>
+                  <div class="res">
+                    {{ deliveryExpresse.deliveryDto.dvyFlowId }}
+                  </div>
+                </div>
+                <div class="d-goods over">
+                  <div class="arrow-box">
+                    <div class="arrow prev disable"></div>
+                    <div class="arrow next"></div>
+                  </div>
+                  <div class="goods-box">
+                    <div
+                      class="item"
+                      v-for="(
+                        orderItem, index
+                      ) in deliveryExpresse.orderItems"
+                      :key="index"
+                    >
+                      <div class="img">
+                        <img :src="orderItem.pic" alt />
+                      </div>
+                      <div class="name">{{ orderItem.prodName }}</div>
+                      <div class="number">
+                        {{ $t("order.quantity") }}:{{ orderItem.prodCount }}
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+              <div class="logistics">
+                <div class="l-tit" v-if="deliveryExpresse && deliveryExpresse.deliveryDto">
+                  <span class="text"
+                    >{{ $t("order.logisticsStatus") }}:</span
+                  >
+                  <span
+                    class="l-state"
+                    v-if="deliveryExpresse.deliveryDto.state === 0"
+                    >{{ $t("order.noRecord") }}</span
+                  >
+                  <span
+                    class="l-state"
+                    v-if="deliveryExpresse.deliveryDto.state === 1"
+                    >{{ $t("order.collected") }}</span
+                  >
+                  <span
+                    class="l-state"
+                    v-if="deliveryExpresse.deliveryDto.state === 2"
+                    >{{ $t("order.delivering") }}</span
+                  >
+                  <span
+                    class="l-state"
+                    v-if="deliveryExpresse.deliveryDto.state === 3"
+                    >{{ $t("order.haveBeenReceived") }}</span
+                  >
+                  <span
+                    class="l-state"
+                    v-if="deliveryExpresse.deliveryDto.state === 201"
+                    >{{ $t("order.reachTheDestinationCity") }}</span
+                  >
+                  <span
+                    class="l-state"
+                    v-if="deliveryExpresse.deliveryDto.state === 4"
+                    >{{ $t("order.problemPiece") }}</span
+                  >
+                </div>
+                <div class="logistics-box"
+                      v-if="deliveryExpresse && deliveryExpresse.deliveryDto">
+                  <div
+                    class="item"
+                    v-if="
+                      deliveryExpresse.deliveryDto.state === 0 &&
+                      dataForm.status == 5 &&
+                      dataForm.finallyTime !== null
+                    "
+                  >
+                    <div class="time">{{ dataForm.finallyTime }}</div>
+                    <div class="text">
+                      {{ $t("order.receivedGoods") }}
+                    </div>
+                  </div>
+                  <div
+                    class="item"
+                    v-for="(trace, index) in deliveryExpresse.deliveryDto
+                      .traces"
+                    :key="index"
+                  >
+                    <div class="time">{{ trace.acceptTime }}</div>
+                    <div class="text">{{ trace.acceptStation }}</div>
+                  </div>
+                  <div
+                    class="item"
+                    v-if="
+                      deliveryExpresse.deliveryDto.traces &&
+                      deliveryExpresse.deliveryDto.traces.length < 1
+                    "
+                  >
+                    {{ $t("order.noLogisticsInformation") }}
+                  </div>
+                  <div
+                    class="item"
+                    v-if="dataForm.status >= 3 && dataForm.dvyTime !== null"
+                  >
+                    <div class="time">{{ dataForm.dvyTime }}</div>
+                    <div class="text">
+                      {{ $t("order.merchantHasShippedWa") }}
+                    </div>
+                  </div>
+                  <div
+                    class="item"
+                    v-if="dataForm.status >= 2 && dataForm.payTime !== null"
+                  >
+                    <div class="time">{{ dataForm.payTime }}</div>
+                    <div class="text">{{ $t("order.buyerHasPaidWa") }}</div>
+                  </div>
+                  <div :class="['item', dataForm.status >= 1?'left-line':'']" v-if="dataForm.status >= 1">
+                    <div class="time">{{ dataForm.createTime }}</div>
+                    <div class="text">
+                      {{ $t("order.buyerSubmittedAnOrder") }}
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="order-info">
+            <div class="info-item">
+              <div class="item-tit">
+                {{ $t("order.recipientInformation") }}
+              </div>
+              <div class="item">
+                <div class="text">{{ $t("order.addressee") }}:</div>
+                <div class="res">{{ dataForm.userAddrOrder.receiver }}</div>
+              </div>
+              <div class="item">
+                <div class="text">{{ $t("order.contactTel") }}:</div>
+                <div class="res">{{ dataForm.userAddrOrder.mobile }}</div>
+              </div>
+              <div class="item">
+                <div class="text">{{ $t("publics.deliveryAddr") }}:</div>
+                <div class="res">
+                  {{ dataForm.userAddrOrder.province
+                  }}{{ dataForm.userAddrOrder.area
+                  }}{{ dataForm.userAddrOrder.city
+                  }}{{ dataForm.userAddrOrder.addr }}
+                </div>
+                <!-- <div class="res">北京市 北京市 朝阳区 元大都城垣遗址公园6号 辣婆婆(东元大都店)</div> -->
+              </div>
+            </div>
+            <div class="info-item">
+              <div class="item-tit">
+                {{ $t("order.shippingInformation") }}
+              </div>
+              <div class="item">
+                <div class="text">{{ $t("order.delType") }}:</div>
+                <div class="res">
+                  {{
+                    [
+                      $t("order.expressDelivery"),
+                      $t("order.selfMention"),
+                      $t("order.noNeedRequired"),
+                    ][dataForm.dvyType - 1]
+                  }}
+                </div>
+                <div class="res" v-if="dataForm.dvyType === null">
+                  {{ $t("order.notYet") }}
+                </div>
+                <!-- <div class="res" v-if="dataForm.dvyType == 1">快递</div>
+                <div class="res" v-if="dataForm.dvyType == 2">自提</div>
+                <div class="res" v-if="dataForm.dvyType == 3">无需快递</div>-->
+              </div>
+              <div class="item">
+                <div class="text">{{ $t("order.deliveryTime") }}:</div>
+                <div class="res">{{ dataForm.dvyTime }}</div>
+                <div class="res" v-if="dataForm.dvyTime === null">
+                  {{ $t("order.notYet") }}
+                </div>
+              </div>
+            </div>
+            <!-- <div class="info-item">
+              <div class="item-tit">
+                {{ $t("order.virtualInfo") }}
+              </div>
+              <div class="item">
+                <div class="text">{{ $t("order.virtualMsg") }}:</div>
+                <div class="res">
+                <div
+                    v-for="(virtualRemark,index) in virtualRemarkList"
+                    :key="index" >
+                  {{
+                    virtualRemark.name
+                  }}:{{
+                    virtualRemark.value
+                  }}
+                </div>
+                </div>
+              </div>
+            </div> -->
+            <div class="info-item">
+              <div class="item-tit">{{ $t("order.paymentInformation") }}</div>
+              <div class="item">
+                <div class="text">{{ $t("order.actualAmount") }}:</div>
+                <div class="res">
+                  {{ $t("order.monetaryUnit") +
+                  dataForm.actualTotal +
+                  " + " +
+                  dataForm.score +
+                  $t("order.score") }}
+                </div>
+              </div>
+              <div class="item">
+                <div class="text">{{ $t("order.payWay") }}:</div>
+                <div v-if="dataForm.payType === null || dataForm.status === 1">
+                  {{ $t("order.unpaid") }}
+                </div>
+                <div class="res" v-else>
+                  {{
+                    [
+                      $t("order.pointsPayment"),
+                      $t("platform.weChatPay"),
+                      $t("platform.aliPay"),
+                      $t("order.wechatScanCodePayment"),
+                      $t("order.wechatH5Payment"),
+                      $t("order.weclAccountPay"),
+                      $t("order.alipayH5Payment"),
+                      $t("order.alipayAPPPayment"),
+                      $t("order.wechatAPPPayment"),
+                      $t("order.balancePayment"),
+                    ][dataForm.payType]
+                  }}
+                </div>
+              </div>
+              <div class="item">
+                <div class="text">{{ $t("order.paymentTime") }}:</div>
+                <div class="res">{{ dataForm.payTime }}</div>
+                <div class="res" v-if="dataForm.payTime === null">
+                  {{ $t("order.notYet") }}
+                </div>
+              </div>
+            </div>
+            <div class="info-item">
+              <div class="item-tit">{{ $t("order.buyerInformation") }}</div>
+              <div class="item">
+                <div class="text">{{ $t("order.buyerSNickname") }}:</div>
+                <div class="res">{{ dataForm.nickName }}</div>
+                <div class="res" v-if="dataForm.nickName === null">
+                  {{ $t("order.notYet") }}
+                </div>
+              </div>
+              <div class="item">
+                <div class="text">{{ $t("order.buyerMessage") }}:</div>
+                <div class="res">{{ dataForm.remarks }}</div>
+                <div
+                  class="res"
+                  v-if="dataForm.remarks === null || dataForm.remarks === ''"
+                >
+                  {{ $t("order.notYet") }}
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="goods-list">
+            <el-table :data="dataForm.orderItems" border
+              header-cell-class-name="table-header"
+              row-class-name="table-row"
+            >
+              <el-table-column prop :label="this.$i18n.t('home.goods')">
+                <template slot-scope="scope">
+                  <div class="df">
+                    <img
+                      :src="resourcesUrl + scope.row.pic"
+                      width="60"
+                      height="60"
+                    />
+                    <span class="name">{{ scope.row.prodName }}</span>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="price"
+                :label="this.$i18n.t('order.unitPrice')"
+                width="180"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <span>{{ scope.row.price }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="count"
+                :label="this.$i18n.t('order.quantity')"
+                width="180"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <span>{{ scope.row.prodCount }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="count"
+                :label="this.$i18n.t('order.preferentialAmount')"
+                width="180"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <span>{{ scope.row.shareReduce }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="totalPrice"
+                :label="this.$i18n.t('order.totalPrice')"
+                width="180"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <span>{{ scope.row.productTotalAmount }}</span>
+                </template>
+              </el-table-column>
+            </el-table>
+            <div class="goods-total">
+              <div class="text-box">
+                <div class="item">
+                  <div class="text">{{ $t("order.prodTotalPrice") }}:</div>
+                  <div class="number">{{
+                  $t("order.monetaryUnit") + dataForm.total +
+                  " + " + dataForm.score +
+                  $t("order.score")}}</div>
+                </div>
+                <div class="item" v-if="dataForm.reduceAmount">
+                  <div class="text">{{ $t("marketing.discountedPrice") }}:</div>
+                  <div class="number">¥{{ dataForm.reduceAmount }}</div>
+                </div>
+                <div class="item" v-if="dataForm.freightAmount">
+                  <div class="text">{{ $t("order.shippingFees") }}:</div>
+                  <div class="number">¥{{ dataForm.freightAmount }}</div>
+                </div>
+                <div class="item act-price">
+                  <div class="text">{{ $t("order.amountDue") }}:</div>
+                  <div class="number">{{
+                  $t("order.monetaryUnit") +
+                  dataForm.actualTotal +
+                  " + " +
+                  dataForm.score +
+                  $t("order.score") }}</div>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="order-log">
+            <div class="log-title">{{ $t("order.logs") }}</div>
+            <div class="log-cont" v-if="dataForm.createTime">
+              {{ dataForm.createTime }} {{ dataForm.nickName }}
+              {{ $t("order.createOrder") }}
+            </div>
+            <div class="log-cont" v-if="dataForm.updateTime">
+              {{ dataForm.updateTime }} {{ dataForm.nickName }}
+              {{ $t("order.orderUpdate") }}
+            </div>
+            <div class="log-cont" v-if="dataForm.payTime">
+              {{ dataForm.payTime }} {{ dataForm.nickName }}
+              {{ $t("order.payment") }}
+            </div>
+            <div class="log-cont" v-if="dataForm.dvyTime">
+              {{ dataForm.dvyTime }}
+              {{ $t("order.deliverys") }}
+            </div>
+            <div class="log-cont" v-if="dataForm.finallyTime">
+              {{ dataForm.finallyTime }} {{ dataForm.nickName }}
+              {{ $t("order.completed") }}
+            </div>
+            <div class="log-cont" v-if="dataForm.cancelTime">
+              {{ dataForm.cancelTime }} {{ dataForm.nickName }}
+              {{ $t("order.cancelOrder") }}
+            </div>
+          </div>
+          <!-- ___ -->
+        </div>
+      </div>
+    </el-form>
+      <!-- 弹窗, 新增 / 修改 -->
+      <!-- <order-addr-update
+        v-if="orderAddrUpdateVisible"
+        ref="orderAddrUpdate"
+        @refreshUserAddrOrder="getDataList"
+      ></order-addr-update>
+      <order-remark-update
+        v-if="orderRemarkUpdateVisible"
+        ref="orderRemarkUpdate"
+        @refreshUserRemarkOrder="getDataList"
+      ></order-remark-update>-->
+  </div>
+</template>
+
+<script>
+// import OrderAddrUpdate from '@/components/order-addr-update'
+// import OrderRemarkUpdate from '@/components/order-remark-update'
+export default {
+  data () {
+    return {
+      visible: false,
+      dataForm: {
+        orderId: 0,
+        orderNumber: '',
+        remarks: '',
+        shopRemarks: '',
+        total: 0,
+        deliveryExpresses: [],
+        actualTotal: 0,
+        dvyType: '',
+        status: 1,
+        addrOrderId: 0,
+        nickName: '',
+        orderItems: [],
+        orderTime: '',
+        updateTime: '',
+        payTime: '',
+        dvyTime: '',
+        finallyTime: '',
+        cancelTime: '',
+        orderType: '',
+        userAddrOrder: {}
+      },
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+      deliveryExpresse: {
+        deliveryDto: {}
+      },
+      indexs: 0,
+      orderRemarkUpdateVisible: false,
+      orderAddrUpdateVisible: false
+    }
+  },
+  components: {
+    // OrderAddrUpdate,
+    // OrderRemarkUpdate
+  },
+  watch: {
+    visible: function () {
+      if (!this.visible) {
+        this.orderRemarkUpdateVisible = false
+        this.orderAddrUpdateVisible = false
+      }
+    }
+  },
+  computed: {
+    stepsStatus: function () {
+      if (this.dataForm.finallyTime) {
+        return 4
+      }
+      if (this.dataForm.dvyTime) {
+        return 3
+      }
+      if (this.dataForm.payTime) {
+        return 2
+      }
+      if (this.dataForm.createTime) {
+        return 1
+      }
+    }
+  },
+  created () {
+    this.dataForm.orderNumber = this.$route.query.orderNumber || 0
+    this.init()
+  },
+  methods: {
+    init () {
+      this.visible = true
+      this.$nextTick(() => {
+        this.$refs['dataForm'].resetFields()
+      })
+      if (this.dataForm.orderNumber) {
+        // 修改
+        this.$http({
+          url: this.$http.adornUrl(`/platform/orderDelivery/orderInfo/${this.dataForm.orderNumber}`),
+          method: 'get',
+          params: this.$http.adornParams()
+        }).then(({ data }) => {
+          data.deliveryExpresses.forEach(item => {
+            if (item.deliveryDto) {
+              item.deliveryDto.traces = item.deliveryDto.traces ? item.deliveryDto.traces.reverse() : item.deliveryDto.traces
+            }
+          })
+          this.dataForm = data
+          this.deliveryExpresse = this.dataForm.deliveryExpresses[0]
+        })
+      }
+    },
+    getDataList () {
+      this.$http({
+        url: this.$http.adornUrl(`/platform/orderDelivery/orderInfo/${this.dataForm.orderNumber}`),
+        method: 'get',
+        params: this.$http.adornParams()
+      }).then(({ data }) => {
+        this.dataForm = data
+        this.deliveryExpresse = this.dataForm.deliveryExpresses[0]
+      })
+    },
+    /**
+     * 物流事件
+     */
+    onClickListDelivery (delivery, index) {
+      this.$http({
+        url: this.$http.adornUrl(`/platform/orderDelivery/deliveryOrder/${delivery.orderDeliveryId}`),
+        method: 'get'
+      }).then(({ data }) => {
+        this.deliveryExpresse = data
+        // console.log('onClickListDelivery-data', data)
+      })
+      this.indexs = index
+    },
+    // 表单提交
+    dataFormSubmit () {
+    },
+    // 修改地址
+    changeUserAddrOrder (userAddrOrder) {
+      this.orderAddrUpdateVisible = true
+      this.$nextTick(() => {
+        this.$refs.orderAddrUpdate.init(this.dataForm)
+      })
+    },
+    // 修改备注
+    changeRemarks () {
+      this.orderRemarkUpdateVisible = true
+      this.$nextTick(() => {
+        this.$refs.orderRemarkUpdate.init(this.dataForm)
+      })
+    }
+  }
+}
+</script>
+
+
+<style>
+.detail-dialog .el-dialog {
+  min-width: 950px;
+  margin-top: 10vh !important;
+}
+
+.detail-dialog .goods-list .has-gutter th.is-leaf {
+  background: #f7f8fa;
+  color: #333;
+  border-bottom: 1px solid #ebeef5;
+  font-weight: 400;
+  border-right: 0;
+}
+
+.detail-dialog .goods-list .el-table td {
+  border-right: 0;
+}
+
+.left-line {
+  /* padding-left: 30px;
+  padding-bottom: 10px;
+  padding-top: 15px;
+  margin-left: -30px;
+  margin-top: -10px !important;
+  background-color: #fff; */
+  border-left: 1px solid #fff !important;
+}
+</style>
+
+<style  lang="scss" scoped>
+.new-page-title {
+  justify-content: flex-start;
+}
+.mod-order-orderInfo {
+  height: 100%;
+  width: 100%;
+  font: 14px Arial, "PingFang SC", "Hiragino Sans GB", STHeiti,
+    "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
+  color: #333;
+
+  .order-number {
+    display: flex;
+    align-items: center;
+    font-size: 14px;
+  }
+
+  .order-number .text {
+    color: #999;
+  }
+
+  .order-number .number,
+  .order-number .time {
+    display: flex;
+    align-items: center;
+  }
+
+  .order-number .time {
+    margin: 0 15px;
+  }
+
+  .order-state {
+    position: relative;
+    margin-top: 15px;
+    border: 1px solid #eee;
+    display: flex;
+    align-items: center;
+  }
+
+  .order-state .state-box {
+    padding: 20px 15px;
+    width: 40%;
+    border-right: 1px solid #eee;
+  }
+
+  .order-state .state-box .state {
+    font-size: 20px;
+    font-weight: 700;
+    line-height: 28px;
+  }
+
+  .order-state .state-box .state-des {
+    margin-top: 10px;
+    color: #999;
+  }
+
+  .order-state .state-box .actions {
+    margin-top: 15px;
+  }
+
+  .order-state .state-box .actions .item {
+    display: flex;
+    align-items: center;
+  }
+
+  .order-state .state-box .actions .item .el-button--text {
+    cursor: pointer;
+  }
+
+  .order-state .state-box .actions .item .item-btn {
+    padding: 3px 10px;
+    border: 1px solid #eee;
+    border-radius: 2px;
+  }
+
+  .order-state .state-steps {
+    flex: 1;
+    margin-left: -80px;
+  }
+
+  .order-state .state-steps .el-form-item {
+    margin-bottom: 0;
+  }
+
+  .packages {
+    margin-top: 15px;
+  }
+
+  .packages .p-tab {
+    border-bottom: 1px solid #eee;
+    display: flex;
+    align-items: center;
+  }
+
+  .packages .p-tab .item {
+    // background: #f2f2f2;
+    // border: 1px solid #eee;
+    // margin-right: -1px;
+    // margin-bottom: -1px;
+    // position: relative;
+    // padding: 8px 20px;
+    // cursor: pointer;
+    background: #F7F8FA;
+    margin-right: -1px;
+    margin-bottom: -1px;
+    position: relative;
+    text-align: center;
+    line-height: 44px;
+    width: 90px;
+    cursor: pointer;
+    font-size: 12px;
+    font-weight: bold;
+    height: 44px;
+  }
+
+  .packages .p-tab .item:first-child {
+    border-radius: 3px 0 0 0;
+  }
+
+  .packages .p-tab .item:last-child {
+    border-radius: 0 3px 0 0;
+  }
+
+  .packages .p-tab .item.active {
+    background: #fff;
+    border-bottom: 1px solid #fff;
+  }
+
+  .packages .p-con {
+    border: 1px solid #eee;
+    border-top: 0;
+    padding: 20px;
+    display: flex;
+  }
+
+  .packages .p-con .deliver-msg {
+    width: 40%;
+  }
+
+  .packages .p-con .deliver-msg .d-item {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+  }
+
+  .packages .p-con .deliver-msg .d-item .text {
+    width: 80px;
+  }
+
+  .packages .p-con .deliver-msg .d-goods {
+    position: relative;
+    width: 334px;
+  }
+
+  .packages .p-con .deliver-msg .d-goods.over {
+    padding: 0 32px;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .arrow-box {
+    position: absolute;
+    top: 40%;
+    -webkit-transform: translateY(-50%);
+    -moz-transform: translateY(-50%);
+    transform: translateY(-50%);
+    left: 0;
+    width: 100%;
+    display: none;
+  }
+
+  .packages .p-con .deliver-msg .d-goods.over .arrow-box {
+    display: block;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .arrow-box .arrow {
+    width: 22px;
+    height: 22px;
+    background: #eee;
+    position: absolute;
+    z-index: 2;
+    border-radius: 50%;
+    cursor: pointer;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .arrow-box .arrow.disable {
+    opacity: 0.5;
+    cursor: not-allowed;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .arrow-box .arrow.prev {
+    left: 0;
+    transform: rotate(180deg);
+  }
+
+  .packages .p-con .deliver-msg .d-goods .arrow-box .arrow.next {
+    right: 0;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .arrow-box .arrow::before,
+  .packages .p-con .deliver-msg .d-goods .arrow-box .arrow::after {
+    position: absolute;
+    top: 6px;
+    display: block;
+    width: 0;
+    height: 0;
+    content: " ";
+    font-size: 0;
+    border: 5px solid transparent;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .arrow-box .arrow::before {
+    left: 10px;
+    border-left: 5px solid #999;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .arrow-box .arrow::after {
+    left: 8px;
+    border-left: 5px solid #eee;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .goods-box {
+    display: flex;
+    overflow: hidden;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .goods-box .item {
+    margin-right: 10px;
+    font-size: 12px;
+    cursor: pointer;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .goods-box .item:last-child {
+    margin: 0;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .goods-box .item .img {
+    width: 60px;
+    height: 60px;
+    font-size: 0;
+    margin-bottom: 3px;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .goods-box .item .img img {
+    width: 100%;
+    height: 100%;
+  }
+
+  .packages .p-con .deliver-msg .d-goods .goods-box .item .name,
+  .packages .p-con .deliver-msg .d-goods .goods-box .item .number {
+    width: 60px;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    color: #999;
+  }
+
+  .packages .p-con .logistics {
+    flex: 1;
+  }
+
+  .packages .p-con .logistics .l-tit {
+    display: flex;
+  }
+
+  .packages .p-con .logistics .l-tit .l-state {
+    color: #c00;
+  }
+
+  .packages .p-con .logistics .logistics-box {
+    height: 175px;
+    overflow-y: scroll;
+    position: relative;
+    margin-top: 15px;
+  }
+
+  .packages .p-con .logistics .logistics-box::before {
+    position: absolute;
+    left: 0;
+    top: 0;
+    display: block;
+    width: 10px;
+    height: 10px;
+    content: " ";
+    font-size: 0;
+    background: #fff;
+    z-index: 1;
+  }
+
+  .packages .p-con .logistics .logistics-box::after {
+    position: absolute;
+    left: 6px;
+    top: 0;
+    display: block;
+    // width: 1px;
+    height: 100%;
+    content: " ";
+    font-size: 0;
+    background: #eee;
+    z-index: 0;
+  }
+
+  .packages .p-con .logistics .logistics-box .item {
+    padding: 0px 0 40px 25px;
+    position: relative;
+    margin-left: 6px;
+    border-left: 1px solid #eee;
+  }
+
+  .packages .p-con .logistics .logistics-box .item::before {
+    position: absolute;
+    left: -10px;
+    top: 0px;
+    display: block;
+    width: 19px;
+    height: 19px;
+    border-radius: 50%;
+    content: " ";
+    font-size: 0;
+    background: #ccc;
+    border: 5px solid #fff;
+    z-index: 2;
+  }
+
+  .packages .p-con .logistics .logistics-box .item:first-child:before {
+    background: #c00;
+  }
+
+  .packages .p-con .logistics .logistics-box .item .time {
+    color: #999;
+  }
+
+  .packages .p-con .logistics .logistics-box .item .text {
+    margin-top: 5px;
+    width: 400px;
+  }
+
+  .order-info {
+    background: #f7f8fa;
+    margin-top: 20px;
+    display: flex;
+    padding: 20px;
+  }
+
+  .order-info .info-item {
+    width: 25%;
+    padding-right: 30px;
+  }
+
+  .order-info .info-item .item-tit {
+    font-weight: 600;
+  }
+
+  .order-info .info-item .item {
+    margin-top: 10px;
+    display: flex;
+    line-height: 20px;
+  }
+
+  .order-info .info-item .item .text {
+    width: auto;
+    max-width: 130px;
+    white-space: nowrap;
+  }
+  .order-info .info-item .item .res {
+    word-break: break-word;
+  }
+
+  .goods-list {
+    margin-top: 20px;
+  }
+
+  .goods-list .df {
+    display: flex;
+    align-items: center;
+  }
+
+  .goods-list .df .name {
+    margin-left: 10px;
+    line-height: 20px;
+  }
+
+  .goods-list .goods-total {
+    display: flex;
+    justify-content: flex-end;
+    margin-top: 20px;
+  }
+
+  .goods-list .goods-total .item {
+    display: flex;
+    align-items: center;
+    color: #999;
+    margin-top: 5px;
+  }
+
+  .goods-list .goods-total .item .text {
+    width: 180px;
+    text-align: right;
+  }
+
+  .goods-list .goods-total .item .number {
+    width: 120px;
+    text-align: right;
+  }
+
+  .goods-list .goods-total .item.act-price {
+    margin-top: 20px;
+    color: #333;
+    font-weight: 600;
+  }
+
+  .goods-list .goods-total .item.act-price .number {
+    color: #c00;
+    width: 120px;
+  }
+
+  .order-log {
+    margin-top: 20px;
+    border-top: 1px dashed #e9eaec;
+    padding: 20px 10px;
+  }
+
+  .order-log .log-title {
+    height: 30px;
+    width: 100%;
+    line-height: 30px;
+    font-weight: bold;
+  }
+
+  .order-log .log-cont {
+    color: #02a1e9;
+    margin-top: 20px;
+  }
+}
+</style>
+
+
+

+ 528 - 0
src/views/modules/score/score-config.vue

@@ -0,0 +1,528 @@
+<template >
+  <div class="distribution-积分设置-set gray-box top-redius border-bottom-gray">
+    <div class="title">积分获取设置</div>
+    <el-form
+      label-width="180px"
+      class="set-form"
+      :rules="dataRule"
+      :model="dataForm"
+      ref="dataForm"
+      size="mini"
+    >
+      <!-- <el-form-item label="奖励设置"> -->
+      <!-- <el-checkbox v-model="dataForm.awardSwitch"
+                     :false-label='0'
+      :true-label='1'>默认奖励</el-checkbox>-->
+      <!-- </el-form-item> -->
+      <!-- <el-checkbox v-model="dataForm.levelSetConditionsSwitch.boundCustomers">绑定客户数</el-checkbox>
+      <el-checkbox v-model="dataForm.levelSetConditionsSwitch.invitedVeeker">邀请分销员数</el-checkbox>-->
+      <br />
+      <!-- <el-button @click="addRow"                    :rules="[{required: true, message: '注册积分获取不能为空', trigger: 'blur'}]"
+      style="margin-top:15px">添加等级</el-button>-->
+      <el-form-item
+        label="连续签到1天可获取积分:"
+        style="width: 440px"
+        prop="signInScoreOne"
+      >
+        <!-- <el-input v-model="dataForm.signInScore"></el-input> -->
+        <el-input-number
+          v-model="signInScoreOne"
+          placeholder="积分"
+          controls-position="right"
+          size="small"
+          :precision="0"
+          :min="1"
+          :max="99999"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item
+        label="连续签到2天可获取积分:"
+        style="width: 440px"
+        prop="signInScoreTwo"
+      >
+        <!-- <el-input v-model="dataForm.signInScore"></el-input> -->
+        <el-input-number
+          v-model="signInScoreTwo"
+          controls-position="right"
+          size="small"
+          :precision="0"
+          :min="1"
+          :max="99999"
+          placeholder="积分"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item
+        label="连续签到3天可获取积分:"
+        style="width: 440px"
+        prop="signInScoreThree"
+      >
+        <!-- <el-input v-model="dataForm.signInScore"></el-input> -->
+        <el-input-number
+          v-model="signInScoreThree"
+          controls-position="right"
+          :precision="0"
+          :min="1"
+          :max="99999"
+          size="small"
+          placeholder="积分"
+          type="number"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item
+        label="连续签到4天可获取积分:"
+        style="width: 440px"
+        prop="signInScoreFour"
+      >
+        <!-- <el-input v-model="dataForm.signInScore"></el-input> -->
+        <el-input-number
+          v-model="signInScoreFour"
+          controls-position="right"
+          :precision="0"
+          :min="1"
+          :max="99999"
+          size="small"
+          placeholder="积分"
+          type="number"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item
+        label="连续签到5天可获取积分:"
+        style="width: 440px"
+        prop="signInScoreFive"
+      >
+        <!-- <el-input v-model="dataForm.signInScore"></el-input> -->
+        <el-input-number
+          v-model="signInScoreFive"
+          controls-position="right"
+          :precision="0"
+          :min="1"
+          :max="99999"
+          size="small"
+          placeholder="积分"
+          type="number"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item
+        label="连续签到6天可获取积分:"
+        style="width: 440px"
+        prop="signInScoreSix"
+      >
+        <!-- <el-input v-model="dataForm.signInScore"></el-input> -->
+        <el-input-number
+          v-model="signInScoreSix"
+          controls-position="right"
+          :precision="0"
+          :min="1"
+          :max="99999"
+          size="small"
+          placeholder="积分"
+          type="number"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item
+        label="连续签到7天可获取积分:"
+        style="width: 440px"
+        prop="signInScoreSeven"
+      >
+        <!-- <el-input v-model="dataForm.signInScore"></el-input> -->
+        <el-input-number
+          v-model="signInScoreSeven"
+          controls-position="right"
+          :precision="0"
+          :min="1"
+          :max="99999"
+          size="small"
+          placeholder="积分"
+          type="number"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item
+        label="注册可获取的积分:"
+        style="width: 440px"
+        prop="registerScore"
+      >
+        <el-input-number
+          v-model="dataForm.registerScore"
+          placeholder="积分"
+          :precision="0"
+          :min="1"
+          :max="99999"
+          controls-position="right"
+          size="small"
+          type="number"
+        ></el-input-number>
+      </el-form-item>
+      <!-- <div class="title">积分使用设置</div> -->
+      <!-- <br> -->
+      <el-form-item
+        label="购物使用积分开关:"
+        style="width: 440px"
+        prop="shopScoreSwitch"
+      >
+        <el-switch v-model="dataForm.shopScoreSwitch"></el-switch>
+      </el-form-item>
+      <el-form-item
+        v-if="dataForm.shopScoreSwitch"
+        label="购买商品每消费"
+        style="width: 440px"
+        prop="shopGetScore"
+      >
+        <el-input
+          v-model="dataForm.shopGetScore"
+          size="small"
+          type="number"
+          oninput="value=value.replace(/[^\d]/g,'')"
+          style="width:350px"
+          @change="setShopGetScore"
+        >
+          <template slot="append"
+            >元可获取1积分</template
+          >
+        </el-input>
+      </el-form-item>
+      <el-form-item
+        v-if="dataForm.shopScoreSwitch"
+        label="积分购买商品时每"
+        style="width: 440px"
+        placeholder="积分"
+        prop="shopUseScore"
+      >
+        <el-input
+          v-model="dataForm.shopUseScore"
+          size="small"
+          type="number"
+          :min="1"
+          :max="1000"
+          oninput="value=value.replace(/[^\d]/g,'')"
+          style="width:350px"
+          @change="setShopUseScore"
+        >
+          <template slot="append">积分可抵扣1元</template>
+        </el-input>
+      </el-form-item>
+      <el-form-item label="积分获取上限" style="width: 440px">
+        <el-radio-group v-model="getDiscountRange">
+          <el-radio :label="0">全平台比例</el-radio>
+          <el-radio :label="1">商品分类比例</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="积分使用上限" style="width: 440px">
+        <el-radio-group v-model="useDiscountRange">
+          <el-radio :label="0">全平台比例</el-radio>
+          <el-radio :label="1">商品分类比例</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item
+        label="获取比例上限(%)"
+        v-if="getDiscountRange === 0"
+      >
+        <el-input-number
+          v-model="dataForm.getDiscount"
+          controls-position="right"
+          :precision="1"
+          :min="0"
+          :step="0.1"
+          :max="100"
+          size="small"
+          placeholder="比例"
+          type="number"
+        ></el-input-number>
+      </el-form-item>
+      <el-form-item
+        label="使用比例上限(%)"
+        v-if="useDiscountRange === 0"
+      >
+        <el-input-number
+          v-model="dataForm.useDiscount"
+          controls-position="right"
+          :precision="1"
+          :min="0"
+          :step="0.1"
+          :max="100"
+          size="small"
+          placeholder="比例"
+          type="number"
+        ></el-input-number>
+      </el-form-item>
+      <!-- <el-form-item label="比例上限(%):" style="width:1840px"> -->
+      <el-table
+        :data="dataForm.categoryConfigs"
+        class="elTable"
+        style="width: 1002px"
+        v-if="useDiscountRange === 1 || getDiscountRange === 1"
+        border
+      >
+        <!-- width="700" -->
+        <el-table-column
+          prop="levelName"
+          header-align="center"
+          align="center"
+          width="250"
+          label="分类名称"
+        >
+          <template slot-scope="scope">
+            <span>{{ scope.row.categoryName }}</span>
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          prop="levelName"
+          header-align="center"
+          align="center"
+          width="250"
+          label="分类英文名称"
+        >
+          <template slot-scope="scope">
+            <span>{{ scope.row.categoryNameEn }}</span>
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          prop="presScore"
+          label="获取比例上限(%)"
+          align="center"
+          v-if="getDiscountRange === 1"
+          header-align="center"
+          width="250"
+        >
+          <template slot-scope="scope">
+            <div class="table-template">
+              <!-- <div class="table-input-box"> -->
+              <el-form-item
+                label-width="0px"
+                :prop="'categoryConfigs.' + scope.$index + '.getScoreLimit'"
+                align="center"
+              >
+                <el-input-number
+                  v-model="scope.row.getScoreLimit"
+                  size="medium"
+                  :max="100"
+                  :min="0"
+                  :precision="1"
+                ></el-input-number>
+              </el-form-item>
+              <!-- </div> -->
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="presScore"
+          label="使用比例上限(%)"
+          header-align="center"
+          align="center"
+          width="250"
+          v-if="useDiscountRange === 1"
+        >
+          <template slot-scope="scope">
+            <div class="table-template">
+              <!-- <div class="table-input-box"> -->
+              <el-form-item
+                label-width="0px"
+                :prop="'categoryConfigs.' + scope.$index + '.useScoreLimit'"
+                align="center"
+              >
+                <el-input-number
+                  v-model="scope.row.useScoreLimit"
+                  size="medium"
+                  :max="100"
+                  :min="0"
+                  :precision="1"
+                ></el-input-number>
+              </el-form-item>
+              <!-- </div> -->
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- </el-form-item> -->
+    </el-form>
+    <div class="default-btn" @click="dataFormSubmit()">保存</div>
+
+    <span slot="footer" class="dialog-footer">
+      <!-- <el-button @click="visible = false">取消</el-button> -->
+    </span>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      dataForm: {
+        id: null,
+        registerScore: 0,
+        useDiscountRange: 0,
+        getDiscountRange: 0,
+        signInScore: [],
+        shopGetScore: 0,
+        useDiscount: 0,
+        shopScoreSwitch: false,
+        getDiscount: 0,
+        shopUseScore: 0,
+        categoryConfigs: []
+      },
+      shopId: this.$store.state.user.shopId,
+      useDiscountRange: 0,
+      getDiscountRange: 0,
+      signInScoreOne: 0,
+      signInScoreTwo: 0,
+      signInScoreThree: 0,
+      signInScoreFour: 0,
+      signInScoreFive: 0,
+      signInScoreSix: 0,
+      signInScoreSeven: 0,
+      isConfig: false,
+      value: '',
+      dataRule: {
+        registerScore: [
+          { required: true, message: '注册积分获取不能为空', trigger: 'blur' }
+        ],
+        // signInScoreSeven: [
+        //   { required: true, message: '签到积分获取不能为空', trigger: 'blur' }
+        // ],
+        // signInScoreOne: [
+        //   { required: true, message: '签到积分获取不能为空', trigger: 'blur' }
+        // ],
+        // signInScoreTwo: [
+        //   { required: true, message: '签到积分获取不能为空', trigger: 'blur' }
+        // ],
+        // signInScoreThree: [
+        //   { required: true, message: '签到积分获取不能为空', trigger: 'blur' }
+        // ],
+        // signInScoreFour: [
+        //   { required: true, message: '签到积分获取不能为空', trigger: 'blur' }
+        // ],
+        // signInScoreFive: [
+        //   { required: true, message: '签到积分获取不能为空', trigger: 'blur' }
+        // ],
+        // signInScoreSix: [
+        //   { required: true, message: '签到积分获取不能为空', trigger: 'blur' }
+        // ],
+        shopGetScore: [
+          { required: true, message: this.$i18n.t('user.pointsOfShoppingCannotEmpty'), trigger: 'blur' }
+        ],
+        shopUseScore: [
+          { required: true, message: this.$i18n.t('user.shoppingPointsDeductedCannotEmpty'), trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  mounted () {
+    this.init()
+  },
+  methods: {
+    init () {
+      this.$nextTick(() => {
+        this.$http({
+          url: this.$http.adornUrl('/user/scoreConfig/info/' + 'SCORE_CONFIG_' + this.shopId),
+          method: 'get',
+          params: this.$http.adornParams()
+        }).then(({ data }) => {
+          if (data.signInScoreString) {
+            this.dataForm = data
+            this.signInScoreOne = data.signInScore[0]
+            this.signInScoreTwo = data.signInScore[1]
+            this.signInScoreThree = data.signInScore[2]
+            this.signInScoreFour = data.signInScore[3]
+            this.signInScoreFive = data.signInScore[4]
+            this.signInScoreSix = data.signInScore[5]
+            this.signInScoreSeven = data.signInScore[6]
+            if (!data.useDiscountRange) {
+              this.useDiscountRange = 0
+            } else {
+              this.useDiscountRange = this.dataForm.useDiscountRange
+            }
+            if (!data.getDiscountRange) {
+              this.getDiscountRange = 0
+            } else {
+              this.getDiscountRange = this.dataForm.getDiscountRange
+            }
+          }
+          this.dataForm.categoryConfigs = data.categoryConfigs
+        })
+      })
+    },
+    setShopGetScore () {
+      const num = Number(this.dataForm.shopGetScore).toFixed(2)
+      this.dataForm.shopGetScore = num < 1 ? 1 : num
+      if (num >= 100000000) {
+        this.dataForm.shopGetScore = 100000000
+      }
+    },
+    setShopUseScore () {
+      let num = Math.round(this.dataForm.shopUseScore)
+      this.dataForm.shopUseScore = num < 1 ? 1 : num
+      this.dataForm.shopUseScore = num > 1000 ? 1000 : num
+    },
+    comparaConfig () {
+      this.isConfig = false
+      this.dataForm.categoryConfigs.forEach(item => {
+        if (this.useDiscountRange === 1 && !item.useScoreLimit) {
+          this.value = '使用积分上限百分比不能为零或者空'
+          this.isConfig = true
+          return true
+        }
+        if (this.getDiscountRange === 1 && !item.getScoreLimit) {
+          this.value = '获取积分上限百分比不能为零或者空'
+          this.isConfig = true
+          return true
+        }
+      })
+    },
+    // 表单提交
+    dataFormSubmit () {
+      this.dataForm.signInScore = []
+      this.dataForm.useDiscountRange = this.useDiscountRange
+      this.dataForm.getDiscountRange = this.getDiscountRange
+      this.dataForm.getDiscount = !this.dataForm.getDiscount ? 0 : this.dataForm.getDiscount
+      this.dataForm.useDiscount = !this.dataForm.useDiscount ? 0 : this.dataForm.useDiscount
+      this.dataForm.signInScore.push(this.signInScoreOne || 0)
+      this.dataForm.signInScore.push(this.signInScoreTwo || 0)
+      this.dataForm.signInScore.push(this.signInScoreThree || 0)
+      this.dataForm.signInScore.push(this.signInScoreFour || 0)
+      this.dataForm.signInScore.push(this.signInScoreFive || 0)
+      this.dataForm.signInScore.push(this.signInScoreSix || 0)
+      this.dataForm.signInScore.push(this.signInScoreSeven || 0)
+      this.comparaConfig()
+      if (this.isConfig) {
+        this.errorMsg(this.value)
+        return
+      }
+      this.$refs['dataForm'].validate((valid) => {
+        if (valid) {
+          this.$http({
+            url: this.$http.adornUrl('/user/scoreConfig'),
+            method: 'post',
+            data: this.$http.adornData(this.dataForm)
+          }).then(({ data }) => {
+            this.$message({
+              message: this.$i18n.t('publics.operation'),
+              type: 'success',
+              duration: 1500,
+              onClose: () => {
+                this.init()
+              }
+            })
+          })
+        }
+      })
+    },
+    errorMsg (message) {
+      this.$message({
+        message: message,
+        type: 'error',
+        duration: 1500
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+div >>>.is-success .el-input-number__decrease,
+div >>>.is-success .el-input-number__increase,
+div >>>.is-error .el-input-number__decrease,
+div >>>.is-error .el-input-number__increase {
+  right: 1px !important;
+}
+</style>

+ 91 - 0
src/views/modules/score/score-growth-config.vue

@@ -0,0 +1,91 @@
+<template>
+  <div class="mod-marketing-distribution">
+    <el-tabs>
+      <el-tab-pane label="积分获取设置">
+        <score ref="basic" />
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+<script>
+import score from './score-config.vue'
+export default {
+  data () {
+    return {
+    }
+  },
+  methods: {
+
+  },
+  components: {
+    score
+  }
+}
+</script>
+<style lang="scss">
+/*
+通用样式
+*/
+.mod-marketing-distribution {
+  .sdp-top {
+    .IsdistributionText {
+      display: inline-block;
+      padding-left: 10px;
+    }
+  }
+  .footer-bar-pagination {
+    width: calc(100% + 30px);
+    background-color: white;
+    bottom: 0px;
+    position: fixed;
+    height: 50px;
+    text-align: center;
+    z-index: 100;
+    left: -30px;
+    line-height: 50px;
+  }
+  #tabs {
+    margin-top: 20px;
+  }
+
+  .tips {
+    color: #9797a1;
+    font-size: 12px;
+  }
+  .title {
+    font-size: 16px;
+    font-weight: 700;
+    display: inline-block;
+    vertical-align: middle;
+    padding-right: 20px;
+  }
+  .gray-box {
+    background: #f2f2f6;
+    padding: 20px 35px;
+    height: 100%;
+  }
+  .border-bottom-gray {
+    border-bottom: 1px solid #dddce2;
+  }
+  .bottom-redius {
+    border-bottom-left-radius: 6px;
+    border-bottom-right-radius: 6px;
+  }
+  .top-redius {
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+  }
+
+  .set-form {
+    margin-left: 20%;
+    margin: 20px;
+  }
+
+  .valid-input {
+    margin-left: 20px;
+    border-top-left-radius: 0px;
+  }
+
+}
+</style>
+

+ 16 - 5
src/views/modules/settlement/third-print-settlement.vue

@@ -93,7 +93,7 @@
               </div>
             </el-card>
           </el-col>
-          <el-col :span="4" v-if="employeeType === 0 || employeeId === 43">
+          <el-col :span="3" v-if="employeeType === 0 || employeeId === 43 || employeeId === 56 || employeeId === 57 || employeeId === 58 || employeeId === 59">
             <el-card :body-style="{padding:'10px'}"shadow="never">
               <div>
                 <span style="font-size: 16px">待结算物料金额</span>
@@ -104,7 +104,18 @@
               </div>
             </el-card>
           </el-col>
-          <el-col :span="4" v-if="">
+          <el-col :span="3" v-if="employeeType === 0 || employeeId === 43 || employeeId === 56 || employeeId === 57 || employeeId === 58 || employeeId === 59">
+            <el-card :body-style="{padding:'10px'}"shadow="never">
+              <div>
+                <span style="font-size: 16px">额外新增金额</span>
+                <div style="margin-top: 5px">
+                  <span v-if="stat.settleIncreaseAmount" style="color: green; font-weight: bold;font-size: 20px">+ ¥{{parseFloat(stat.settleIncreaseAmount).toFixed(2)}}</span>
+                  <span v-else style="color: green; font-weight: bold;font-size: 20px">+ ¥0</span>
+                </div>
+              </div>
+            </el-card>
+          </el-col>
+          <el-col :span="3" v-if="">
             <el-card :body-style="{padding:'10px'}"shadow="never">
               <div>
                 <span style="font-size: 16px">售后结算金额</span>
@@ -115,7 +126,7 @@
               </div>
             </el-card>
           </el-col>
-          <el-col :span="4">
+          <el-col :span="3">
             <el-card :body-style="{padding:'10px'}"shadow="never">
               <div>
                 <span style="font-size: 16px">额外扣减金额</span>
@@ -188,7 +199,7 @@
             width="120px"
             align="center"
             prop="settleMaterialAmount"
-            v-if="employeeId === 43 || employeeType === 0"
+            v-if="employeeId === 43 || employeeId === 56 || employeeId === 57 || employeeId === 58 || employeeId === 59 || employeeType === 0"
             label="物料结算金额">
             <template slot-scope="scope">
               <span style="color: green; font-weight: bold;font-size: 16px">+{{scope.row.settleMaterialAmount }}</span>
@@ -197,7 +208,7 @@
           <el-table-column
             align="center"
             width="110px"
-            :label="(employeeId === 43 || searchForm.printChannel === 'Lightning')? '打包快递结算金额(按件2.55元)':'人工结算金额(按件0.4元)'"
+            :label="(employeeId === 43 || employeeId === 56 || employeeId === 57 || employeeId === 58 || employeeId === 59 || searchForm.printChannel === 'Lightning')? '打包快递结算金额(按件2.55元)':'人工结算金额(按件0.4元)'"
             prop="settleLaborAmount">
             <template slot-scope="scope">
               <span style="color: green; font-weight: bold;font-size: 16px">+{{scope.row.settleLaborAmount + scope.row.settleDeliveryAmount }}</span>

+ 20 - 0
src/views/modules/shop/feature/create/edit/components/scroll-tab-nav/index.vue

@@ -69,6 +69,20 @@
                 <el-image :src="formData.bgImg" v-if="formData.bgImg"></el-image>
                 <div v-if="formData.bgImg" @click="formData.bgImg = ''" class="default-btn">删除</div>
               </el-form-item>
+              <el-form-item label="轮播配置">
+                <div>
+                  <el-radio v-model="formData.autoplay" :label="true">滚动</el-radio>
+                  <el-radio v-model="formData.autoplay" :label="false">不滚动</el-radio>
+                </div>
+                <el-input type="number" v-model="formData.interval" placeholder="自动切换时间间隔(毫秒)"></el-input>
+                <el-input type="number" v-model="formData.duration" placeholder="滑动动画时长(毫秒)"></el-input>
+                <div>
+                  <el-radio v-model="formData.interfaceMode" label="api">接口数据</el-radio>
+                  <el-radio v-model="formData.interfaceMode" label="manual">人工数据</el-radio>
+                  <el-input type="text" v-model="formData.interfaceApi" placeholder="请输入接口地址"></el-input>
+                  <el-input type="number" v-model="formData.dataSize" placeholder="接口数据数量"></el-input>
+                </div>
+              </el-form-item>
               <el-form-item label="查看更多的文本">
                 <div style="display: inline-flex;align-items: center">
                   <el-input style="width: 210px" type="text" v-model="formData.moreText"></el-input>
@@ -350,6 +364,12 @@ export default {
         marginBottom: '0',
         moreLink: "",
         moreTextSize: '',
+        autoplay: false,
+        interval: 0,
+        duration:0,
+        interfaceMode: "manual",
+        interfaceApi: "",
+        dataSize: 10
       },
       setCountsList: [
         {