Przeglądaj źródła

Merge branch 'master' into gugu

# Conflicts:
#	src/views/modules/afterSales/returnDelivery.vue
#	src/views/modules/order/order.vue
#	src/views/modules/order/orderInfo.vue
#	src/views/modules/settlement/print-settlement-add-or-update.vue
#	src/views/modules/settlement/third-print-settlement.vue
huangmp 2 lat temu
rodzic
commit
4e83bd725c

+ 2 - 0
package.json

@@ -23,10 +23,12 @@
     "moment": "^2.29.1",
     "pdf-lib": "^1.17.1",
     "qrcode": "^1.4.4",
+    "v-viewer": "^1.6.4",
     "video.js": "^7.8.4",
     "videojs-contrib-hls": "^5.15.0",
     "vue": "2.6.14",
     "vue-baidu-map": "^0.21.22",
+    "vue-canvas-draw": "^1.0.1",
     "vue-cookie": "1.1.4",
     "vue-i18n": "8.24.5",
     "vue-router": "3.5.2",

+ 326 - 0
src/components/canvas-preview/index.vue

@@ -0,0 +1,326 @@
+<template>
+  <el-dialog
+    :visible.sync="visible"
+    :append-to-body="visible"
+    :modal="false"
+    title="图片预览"
+    width="20%"
+    @opened="openCanvas"
+    @close="closeDialog"
+    style="display: flex; align-items: center;justify-content: center;"
+    v-if="visible">
+    <div>
+      <div v-if="prodType === '小卡'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0465 + 'px'}">
+      </div>
+      <div v-if="prodType === '拍立得'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0465 + 'px'}">
+      </div>
+      <div v-if="prodType === '直拍封面'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.02325 + 'px'}">
+      </div>
+      <div v-if="prodType === '票根'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0465 + 'px'}">
+      </div>
+      <div  v-if="prodType === '书签'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0264 + 'px'}">
+      </div>
+      <div v-if="prodType === '明信片'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0261 + 'px'}">
+      </div>
+      <div v-if="prodType === '方卡'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0232 + 'px'}">
+      </div>
+      <div v-if="prodType === '徽章'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0813 + 'px', borderRadius: 100 + '%'}">
+      </div>
+      <div v-if="prodType === '手幅'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0255 + 'px'}">
+      </div>
+      <el-image ref="previewImageRef" :src="previewPicUrl" alt="" @load="previewLoad" style="width: 100%; height: 100%"/>
+    </div>
+    <!--<div class="parent">
+      <canvas ref="canvas" :width="clientWidth" :height="clientHeight" id="myCanvas"></canvas>
+      <div class="blood" :style="{border: bloodWidth + 'px solid rgba(225,0,0, 0.3)' , width: clientWidth +'px', height: clientHeight + 'px', borderRadius: bloodRadius + '%'}"></div>
+    </div>
+    <div style="text-align: center;">
+      <el-button @click="cropImage">保存画布</el-button>
+    </div>-->
+
+  </el-dialog>
+
+</template>
+
+<script>
+  const statusConfig = {IDLE:0, DRAG_START:1, DRAGGING:2};
+  const prodSize = {'小卡': {width: 709, height: 1087, clientScale:0.5, bloodRadio: 0.0242}, '方卡':{width: 1252, height: 1252, clientScale:0.5}, '拍立得':{width: 709, height: 1087, clientScale:0.5, bloodRadio: 0.0242},
+                    '直拍封面':{width: 709, height: 1217, clientScale:0.5, bloodRadio: 0.02325}, '书签': {width: 638, height: 1819, clientScale:0.4, bloodRadio: 0.0264},'明信片':{width: 1252, height: 1819, clientScale:0.4, bloodRadio: 0.0261},
+                    '徽章':{width: 839, height: 839, clientScale:0.5, bloodRadio: 0.0813, bloodRadius:100},'票根':{width: 709, height: 1489, clientScale:0.5, bloodRadio: 0.0465},'手幅':{width: 1252, height: 3614, clientScale:0.25, bloodRadio: 0.0255}}
+  export default {
+    name: "CanvasPreview",
+    data() {
+      return {
+        visible: false,
+        prodType: null,
+        previewWidth: null,
+        previewHeight: null,
+        previewPicUrl: null,
+        side: null,
+        clientWidth: 709,
+        clientHeight: 1087,
+        clientScale: 0.5,
+        cardItem: null,
+        canvasParam:null,
+        bloodWidth: 20,
+        bloodRadius: 0,
+        canvasInfo:{
+          status: statusConfig.IDLE,
+          dragTarget: {x:0,y:0,w:0,h:0},
+          lastEvtPos: {x:null,y:null},
+          offsetEvtPos: {x:null,y:null},
+          offset: {x:0,y:0},
+          scale: 1,
+          scaleStep: 0.01,
+          minScale: 0.5,
+          maxScale: 2,
+        },
+        imgRef:null,
+        canvas:null,
+        context: null,
+      };
+    },
+    mounted() {
+    },
+    methods: {
+      openCanvas(){
+        this.initCanvas();
+        this.drawImage();
+        this.addMouseListeners();
+      },
+      init(cardItem, previewPicUrl, prodType, side){
+        this.visible = true;
+        this.previewPicUrl = previewPicUrl;
+        this.prodType = prodType;
+        this.side = side;
+        this.cardItem = cardItem;
+        if(side === 'front'){
+          this.canvasParam = JSON.parse(cardItem.frontCanvasParam);
+        }else if(side === 'back'){
+          this.canvasParam = JSON.parse(cardItem.backCanvasParam);
+        }
+        let prod = prodSize[prodType];
+        this.clientWidth = prod.width * prod.clientScale;
+        this.clientHeight = prod.height * prod.clientScale;
+        this.bloodRadius = prod.bloodRadius ? prod.bloodRadius : this.bloodRadius;
+        this.bloodWidth = prod.width * prod.bloodRadio;
+      },
+      previewLoad(event){
+        this.previewWidth = event.srcElement.clientWidth;
+        this.previewHeight = event.srcElement.clientHeight;
+      },
+      cropImage() {
+        this.$confirm('确认要保存当前画布状态吗?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          let canvasInfo = this.canvasInfo;
+          let cardItem = {cardItemId : this.cardItem.cardItemId};
+          let obj =  {scale: canvasInfo.scale, offsetX: canvasInfo.offset.x, offsetY: canvasInfo.offset.y, targetX: canvasInfo.dragTarget.x, targetY: canvasInfo.dragTarget.y}
+          let canvasParam = JSON.stringify(obj);
+          if(this.side === 'front'){
+            cardItem.frontCanvasParam = canvasParam;
+          }else if(this.side === 'back'){
+            cardItem.backCanvasParam = canvasParam;
+          }
+          this.$http({
+            url: this.$http.adornUrl('/prod/orderCardItem/saveOrUpdateCanvasParam'),
+            method: 'post',
+            data: cardItem
+          }).then(({ data }) =>{
+            if(data){
+              this.$message.success("保存成功");
+            }else{
+              this.$message.error("保存失败");
+            }
+          })
+        });
+      },
+      initCanvas() {
+        this.canvas = this.$refs.canvas;
+        this.context = this.canvas.getContext('2d'); // 获取画布上下文
+      },
+      getCanvasPosition(e, offset = {x:0,y:0}){
+        return {
+          x: e.offsetX - offset.x,
+          y: e.offsetY - offset.y
+        }
+      },
+      render(){
+        this.canvas.width = this.clientWidth;
+        this.context.setTransform(this.canvasInfo.scale, 0, 0, this.canvasInfo.scale, this.canvasInfo.offset.x, this.canvasInfo.offset.y);
+        this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
+        this.drawImage();
+      },
+      ifInImage(pos){
+        let dx = this.getDistanceX(pos.x, this.imgRef.x);
+        let dy = this.getDistanceY(pos.y, this.imgRef.y);
+        if(dx <= this.imgRef.width && dy <=this.imgRef.height){
+          return true;
+        }else{
+          return false;
+        }
+      },
+      getDistanceX(x1, x2){
+        return Math.abs((x1 - x2));
+      },
+      getDistanceY(y1, y2){
+        return Math.abs((y1 - y2));
+      },
+      drawImage() {
+        if(!this.imgRef){
+          this.imgRef = new Image();
+          this.imgRef.src = this.previewPicUrl;
+          if(this.canvasParam){
+            this.canvasInfo.scale = this.canvasParam.scale;
+            this.canvasInfo.offset.x = this.canvasParam.offsetX;
+            this.canvasInfo.offset.y = this.canvasParam.offsetY;
+            this.canvasInfo.dragTarget.x = this.canvasParam.targetX;
+            this.canvasInfo.dragTarget.y = this.canvasParam.targetY;
+          }else{
+            let scaleImgWidth = this.imgRef.width * this.canvasInfo.scale;
+            let scaleImgHeight = this.imgRef.height * this.canvasInfo.scale;
+            if (scaleImgWidth > this.canvas.width && scaleImgHeight > this.canvas.height) {
+              if(scaleImgWidth > scaleImgHeight){
+                this.canvasInfo.scale =  this.canvas.height / scaleImgHeight;
+              }else{
+                this.canvasInfo.scale =  this.canvas.width / scaleImgWidth;
+              }
+            }else if(scaleImgWidth < this.canvas.width && scaleImgHeight < this.canvas.height){
+              if(scaleImgWidth > scaleImgHeight){
+                this.canvasInfo.scale =  this.canvas.height / scaleImgHeight;
+              }else{
+                this.canvasInfo.scale =  this.canvas.width / scaleImgWidth;
+              }
+            }
+          }
+          this.context.setTransform(this.canvasInfo.scale, 0,0, this.canvasInfo.scale, this.canvasInfo.offset.x,this.canvasInfo.offset.y)
+          this.context.drawImage(this.imgRef, this.canvasInfo.dragTarget.x, this.canvasInfo.dragTarget.y, this.imgRef.width, this.imgRef.height); // 在画布上绘制图片
+        }else{
+          this.context.drawImage(this.imgRef, this.canvasInfo.dragTarget.x, this.canvasInfo.dragTarget.y, this.imgRef.width, this.imgRef.height); // 在画布上绘制图片
+        }
+      },
+      addMouseListeners() {
+        let canvas = this.$refs.canvas;
+        // 监听鼠标按下事件
+        canvas.addEventListener('mousedown', e => {
+          let canvasPosition = this.getCanvasPosition(e, this.canvasInfo.offset);
+          console.log("画笔位置", canvasPosition);
+          if(this.ifInImage(canvasPosition)){
+            let scaleImgWidth = this.imgRef.width * this.canvasInfo.scale;
+            let scaleImgHeight = this.imgRef.height * this.canvasInfo.scale;
+            if(scaleImgWidth <= this.canvas.width || scaleImgHeight <= this.canvas.height){
+              return;
+            }
+            this.canvasInfo.status = statusConfig.DRAG_START;
+            this.canvasInfo.lastEvtPos = canvasPosition;
+            this.canvasInfo.offsetEvtPos = canvasPosition;
+          }
+        });
+
+        //监听鼠标移动事件
+        canvas.addEventListener('mousemove', e => {
+          let canvasPosition = this.getCanvasPosition(e, this.canvasInfo.offset);
+          if(this.canvasInfo.status === statusConfig.DRAG_START && (this.getDistanceX(canvasPosition.x, this.canvasInfo.lastEvtPos.x) > 5 || this.getDistanceY(canvasPosition.y, this.canvasInfo.lastEvtPos.y) > 5)){
+            this.canvasInfo.status = statusConfig.DRAGGING;
+            this.canvasInfo.offsetEvtPos = canvasPosition;
+          }else if(this.canvasInfo.status === statusConfig.DRAGGING){
+            let dragTarget = this.canvasInfo.dragTarget;
+            dragTarget.x += (canvasPosition.x - this.canvasInfo.offsetEvtPos.x);
+            dragTarget.y += (canvasPosition.y - this.canvasInfo.offsetEvtPos.y);
+            this.render();
+            this.canvasInfo.offsetEvtPos = canvasPosition;
+          }
+        });
+
+        // 监听鼠标松开事件
+        canvas.addEventListener('mouseup', () => {
+          if(this.canvasInfo.status === statusConfig.DRAGGING){
+            this.canvasInfo.status = statusConfig.IDLE;
+          }
+        });
+
+        // 监听鼠标松开事件
+        canvas.addEventListener('mouseout', (e) => {
+          this.canvasInfo.status = statusConfig.IDLE;
+          let canvasPosition = this.getCanvasPosition(e, this.canvasInfo.offset);
+          this.canvasInfo.lastEvtPos = canvasPosition;
+          this.canvasInfo.offsetEvtPos = canvasPosition;
+        });
+
+        // 监听鼠标滚轮事件
+        canvas.addEventListener('wheel', (e) => {
+          // e.preventDefault();
+          let canvasPosition = this.getCanvasPosition(e, this.canvasInfo.offset);
+          let deltaX = canvasPosition.x / this.canvasInfo.scale * this.canvasInfo.scaleStep;
+          let deltaY = canvasPosition.y / this.canvasInfo.scale * this.canvasInfo.scaleStep;
+          let scaleImgWidth = this.imgRef.width * this.canvasInfo.scale;
+          let scaleImgHeight = this.imgRef.height * this.canvasInfo.scale;
+          if(e.wheelDelta > 0 && this.canvasInfo.scale <= this.canvasInfo.maxScale){
+            this.canvasInfo.offset.x -= deltaX;
+            this.canvasInfo.offset.y -= deltaY;
+            this.canvasInfo.scale += this.canvasInfo.scaleStep;
+          }else{
+            if (scaleImgWidth <= this.canvas.width || scaleImgHeight <= this.canvas.height) {
+              return;
+            }else{
+              this.canvasInfo.offset.x += deltaX;
+              this.canvasInfo.offset.y += deltaY;
+              this.canvasInfo.scale -= this.canvasInfo.scaleStep;
+              if (scaleImgWidth <= this.canvas.width || scaleImgHeight <= this.canvas.height) {
+                // 达到限制条件,不再缩小
+                  return;
+              }
+            }
+          }
+          this.render();
+        });
+      },
+      closeDialog(){
+        this.canvas = null;
+        this.context = null;
+        this.imgRef = null;
+        this.visible = false;
+        this.canvasInfo = {
+          status: statusConfig.IDLE,
+            dragTarget: {x:0,y:0,w:0,h:0},
+          lastEvtPos: {x:null,y:null},
+          offsetEvtPos: {x:null,y:null},
+          offset: {x:0,y:0},
+          scale: 1,
+            scaleStep: 0.01,
+            minScale: 0.5,
+            maxScale: 2,
+        };
+      }
+    },
+  }
+</script>
+
+<style scoped>
+  .previewClass{
+    position:absolute;
+    border-style:solid;
+    border-color:red;
+    opacity:0.3;
+    z-index:3;
+  }
+
+  #myCanvas {
+    display: block;
+    margin: 0 auto; /* 水平居中 */
+  }
+  .parent{
+    position: relative; /* 设置父元素的position为relative */
+    background-color: white;
+  }
+  .blood {
+    position: absolute; /* 设置相框的position为absolute */
+    top: 50%; /* 距离父元素顶部50% */
+    left: 50%; /* 距离父元素左侧50% */
+    transform: translate(-50%, -50%) ; /* 将相框自身向左和向上移动50%,使其居中 */
+    background-color: transparent; /* 设置相框背景为透明 */
+    pointer-events:none;
+  }
+</style>

+ 71 - 43
src/components/order-card-item/index.vue

@@ -13,7 +13,7 @@
               <div style="padding: 3px; text-align: center">
                 <span>正面</span>
               </div>
-              <el-image style="width: 100px; height: 100px;" v-if="mode=='view'" :src="resourcesUrl + item.frontPic" @click="previewPic(item.frontPic, item.prodName)"/>
+              <el-image style="width: 100px; height: 100px;" v-if="mode=='view'" :src="resourcesUrl + item.frontPic" @click="previewPic(item, item.frontPic, item.prodName, 'front')"/>
               <el-upload v-else
                 class="avatar-uploader"
                 accept="image/jpg"
@@ -32,7 +32,7 @@
               <div style="padding: 3px; text-align: center">
                 <span>背面</span>
               </div>
-              <el-image v-if="mode=='view'" :src="resourcesUrl + item.backPic" style="width: 100px; height: 100px;" @click="previewPic(item.backPic, item.prodName)"/>
+              <el-image v-if="mode=='view'" :src="resourcesUrl + item.backPic" style="width: 100px; height: 100px;" @click="previewPic(item, item.backPic, item.prodName, 'back')"/>
               <el-upload v-else
                          class="avatar-uploader"
                          :before-upload="(file, fileList)=>handleBeforeUpload(file, fileList,item)"
@@ -72,26 +72,14 @@
         </el-button>
       </div>
     </div>
-    <el-dialog :visible.sync="previewPicDialogVisible" :modal="false" title="图片预览" width="20%" top="3vh">
-      <div v-if="prodType === '小卡'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0465 + 'px'}">
-      </div>
-      <div  v-if="prodType === '书签'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0264 + 'px'}">
-      </div>
-      <div v-if="prodType === '明信片'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0261 + 'px'}">
-      </div>
-      <div v-if="prodType === '方卡'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0232 + 'px'}">
-      </div>
-      <div v-if="prodType === '徽章'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0813 + 'px', borderRadius: 100 + '%'}">
-      </div>
-      <div v-if="prodType === '手幅'" class="previewClass" :style="{width: previewWidth + 'px', height: previewHeight + 'px', borderWidth: previewWidth * 0.0255 + 'px'}">
-      </div>
-      <el-image ref="previewImageRef" :src="previewPicUrl" alt="" @load="previewLoad" style="width: 100%; height: 100%"/>
-    </el-dialog>
+    <CanvasPreview v-if= "previewPicDialogVisible" ref="canvasPreviewRef"></CanvasPreview>
   </div>
 </template>
 
 <script>
+  import CanvasPreview from "../canvas-preview/index";
   export default {
+    components: {CanvasPreview},
     data () {
       return {
         lang: localStorage.getItem('lang') || 'zh_CN',
@@ -99,6 +87,7 @@
         previewPicUrl: null,
         prodType: null,
         previewPicDialogVisible: false,
+        side:null,
         resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
         mode: 'view',
         previewWidth: 0,
@@ -135,27 +124,54 @@
         }
         let isSize = true;
         //如果当前是编辑的小卡,就需要判断是否符合尺寸
-        if(item.prodName.indexOf("小卡") != -1){
-          isSize = new Promise(function(resolve, reject) {
-            let width = 709;
-            let height = 1087;
-            let _URL = window.URL || window.webkitURL;
-            let img = new Image();
-            img.onload = function() {
-              let valid = img.width == width && img.height == height;
-              valid ? resolve() : reject();
-            };
-            img.src = _URL.createObjectURL(file);
-          }).then(
-            () => {
-              return file;
-            },
-            () => {
-              this.$message.error("上传的图片宽高必须是709*1087!");
-              return Promise.reject();
-            }
-          );
-        }
+        let width = 709;
+        let height = 1087;
+        let prodName = item.prodName;
+        isSize = new Promise(function(resolve, reject) {
+          if(prodName.indexOf("小卡") !== -1 || prodName.indexOf("仿拍立得") !== -1){
+            width = 709;
+            height = 1087;
+          }else if(prodName.indexOf("票根") !== -1){
+            width = 780;
+            height = 1489;
+          }else if(prodName.indexOf("直拍封面") !== -1){
+            width = 697;
+            height = 1217;
+          }else if(prodName.indexOf("明信片") !== -1){
+            width = 1252;
+            height = 1819;
+          }else if(prodName.indexOf("书签") !== -1){
+            width = 638;
+            height = 1819;
+          }else if(prodName.indexOf("方卡") !== -1){
+            width = 1217;
+            height = 1217;
+          }else if(prodName.indexOf("手幅") !== -1){
+            width = 1252;
+            height = 3614;
+          }else if(prodName.indexOf("毛绒徽章") !== -1){
+            width = 827;
+            height = 827;
+          }else if(prodName.indexOf("手幅") !== -1){
+            width = 1252;
+            height = 3614;
+          }
+          let _URL = window.URL || window.webkitURL;
+          let img = new Image();
+          img.onload = function() {
+            let valid = img.width == width && img.height == height;
+            valid ? resolve() : reject();
+          };
+          img.src = _URL.createObjectURL(file);
+        }).then(
+          () => {
+            return file;
+          },
+          () => {
+            this.$message.error("上传的图片宽高必须是" + width + "*" + height);
+            return Promise.reject();
+          }
+        );
         return isJpg && isSize;
       },
       deleteCardItem(item, index){
@@ -242,22 +258,34 @@
             }
           })
       },
-      previewPic(picUrl, prodName){
+      previewPic(cardItem, picUrl, prodName, side){
         this.previewPicUrl = this.resourcesUrl + picUrl
         this.previewPicDialogVisible = true;
+        this.side = side;
         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){
+          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){
+        }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)
+        })
       },
       getDataList () {
         this.$http({
@@ -272,7 +300,7 @@
                   )
           )
         }).then(({data}) => {
-          this.cardItemList = data.records
+          this.cardItemList = data.records;
         })
       },
     }

+ 1 - 0
src/views/modules/afterSales/returnDelivery-add-or-update.vue

@@ -26,6 +26,7 @@
               <el-option label="已联系待重发" :value="2"></el-option>
               <el-option label="已重发" :value="3"></el-option>
               <el-option label="地址异常" :value="4"></el-option>
+              <el-option label="无需处理" :value="5"></el-option>
             </el-select>
           </el-form-item>
         </el-col>

+ 8 - 0
src/views/modules/afterSales/returnDelivery.vue

@@ -28,6 +28,7 @@
               <el-option label="已联系待重发" :value="2"></el-option>
               <el-option label="已重发" :value="3"></el-option>
               <el-option label="地址异常" :value="4"></el-option>
+              <el-option label="无需处理" :value="5"></el-option>
             </el-select>
           </el-form-item>
           <el-form-item label="补交运费" class="search-form-item">
@@ -107,6 +108,7 @@
               <el-tag v-if="scope.row.status === 2" type="warning">已联系待重发</el-tag>
               <el-tag v-if="scope.row.status === 3" type="success">已重发</el-tag>
               <el-tag v-if="scope.row.status === 4" type="danger">地址异常</el-tag>
+              <el-tag v-if="scope.row.status === 5" type="info">无需处理</el-tag>
             </template>
           </el-table-column>
           <!-- 退件原因 -->
@@ -121,6 +123,12 @@
               <span>{{ scope.row.remark}}</span>
             </template>
           </el-table-column>
+          <!-- 登记时间 -->
+          <el-table-column label="登记时间" prop="createTime" align="center">
+            <template slot-scope="scope">
+              <span>{{ scope.row.createTime}}</span>
+            </template>
+          </el-table-column>
           <!-- 是否补交运费,0未补,1已补交 -->
           <el-table-column label="补交运费" prop="isPayed" align="center">
             <template slot-scope="scope">

+ 0 - 1
src/views/modules/afterSales/thirdAfterSales-add-or-update.vue

@@ -278,7 +278,6 @@ export default {
       })
     },
     searchOrder(orderNumber){
-      debugger
       if(orderNumber){
         this.$http({
           url: this.$http.adornUrl('/order/thirdPrintOrder/info/' + orderNumber),

+ 1 - 1
src/views/modules/marketing/coupon.vue

@@ -51,7 +51,7 @@
       <div class="operation-bar">
         <div
           class="default-btn primary-btn"
-          v-if="isAuth('seckill:seckill:save')"
+          v-if="isAuth('admin:coupon:save')"
           @click="addOrUpdateHandle()"
           >{{ $t("crud.addTitle") }}
         </div>

+ 38 - 1
src/views/modules/order/order.vue

@@ -27,11 +27,14 @@
                 placeholder="产品名称">
                 <el-option key="yj" label="圆角小卡" value="圆角小卡"></el-option>
                 <el-option key="zj" label="直角小卡" value="直角小卡"></el-option>
+                <el-option key="zpfm" label="直拍封面" value="直拍封面"></el-option>
+                <el-option key="pg" label="票根" value="票根"></el-option>
                 <el-option key="sq" label="书签" value="书签"></el-option>
                 <el-option key="mxp" label="明信片" value="明信片"></el-option>
                 <el-option key="fk" label="方卡" value="方卡"></el-option>
                 <el-option key="hz" label="徽章" value="徽章"></el-option>
                 <el-option key="sf" label="手幅" value="手幅"></el-option>
+                <el-option key="tz" label="贴纸" value="贴纸"></el-option>
               </el-select>
             </template>
           </el-form-item>
@@ -348,7 +351,7 @@
           </ul>
           <ul class="nav-right"></ul>
         </div>
-        <el-checkbox @change="checked=>handleSelectAll(checked)" class="all-check-btn" >全选 </el-checkbox>
+        <el-checkbox @change="checked=>handleSelectAll(checked)" class="all-check-btn" v-model="selectAll">全选 </el-checkbox>
         <span v-if="dataListSelections.size" class="had-selected">已选 {{dataListSelections.size}}</span>
         <div
             class="default-btn"
@@ -368,6 +371,9 @@
         <el-button style="margin-left: 20px" size="small" type="primary" @click="openPromotionDialog">
           推广数据
         </el-button>
+        <el-button style="margin-left: 20px" size="small" type="primary" :loading="exportDeliveryLoading" @click="handleExportDelivery">
+          导出发货信息
+        </el-button>
         <!-- 列标题 -->
         <div :class="['tit', showHeadScroll ? 'fixed-top' : '']">
           <el-row style="width: 100%">
@@ -1026,6 +1032,8 @@ import OrderInfo from "./orderInfo";
 import TopTask from '@/components/top-task';
 import InputNumberRange from '@/components/input-number-range';
 import OrderPromotion from './orderPromotion';
+import {} from "@/utils/excel";
+import {downloadXls} from "@/utils/excel";
 
 export default {
   data () {
@@ -1245,6 +1253,25 @@ export default {
 
   },
   methods: {
+    scanDelivery(order){
+
+    },
+    handleExportDelivery(){
+      this.exportDeliveryLoading = true;
+      this.$http({
+        url: this.$http.adornUrl('/order/order/exportDeliveryInfo'),
+        method: 'GET',
+        params: this.$http.adornParams({startTime: this.dateRange[0], endTime: this.dateRange[1]}),
+        responseType: 'blob'
+      }).then(({data}) => {
+        this.exportDeliveryLoading = false;
+        let fileName = "微信发货订单信息";
+        downloadXls(data, fileName + ".xlsx");
+      }).catch((error) => {
+        this.exportDeliveryLoading = false;
+        this.$message.error(error)
+      })
+    },
     openGeneratePrintPdfBatchDialog(){
       this.generatePrintPdfBatchVisible = true;
     },
@@ -1890,6 +1917,16 @@ export default {
     },
     // 搜索查询
     searchChange (newData = false) {
+      let it = this;
+      this.dataList.forEach((item, index) => {
+        it.$set(item,'checkStatus',false)
+        it.dataListSelections.delete(item.orderNumber);
+        it.selectAll = false;
+        it.checked = false;
+      })
+      this.dataListSelections = new Set();
+      this.selectAll = false;
+      this.selectSheets = 0;
       this.page.currentPage = 1
       // this.getDataList(this.page, null, newData)
       if(this.status === 8){

+ 10 - 11
src/views/modules/order/orderInfo.vue

@@ -500,7 +500,6 @@
                   <div class="text">商户单号:</div>
                   <div class="res" v-if="payNo != null">{{ payNo }}</div>
                 </div>
-
               </div>
               <div :class="['info-item',$t('language') === 'English'?'small-width':'']">
                 <div class="item-tit">{{ $t("order.buyerInformation") }}</div>
@@ -999,16 +998,6 @@ export default {
         })
       }
     },
-    getWxPayNoByOrderNumber(orderNumber){
-      this.$http({
-        url: this.$http.adornUrl(`/order/order/getWxPyaNoByOrderNumber`),
-        method: 'get',
-        params: this.$http.adornParams({orderNumber, orderNumber})
-      }).then(({ data }) => {
-        this.payNo = data.payNo;
-      })
-    },
-
     initPrintOrder() {
       if (this.dataForm.orderNumber) {
         this.$http({
@@ -1033,6 +1022,15 @@ export default {
         })
       }
     },
+    getWxPayNoByOrderNumber(orderNumber){
+      this.$http({
+        url: this.$http.adornUrl(`/order/order/getWxPyaNoByOrderNumber`),
+        method: 'get',
+        params: this.$http.adornParams({orderNumber, orderNumber})
+      }).then(({ data }) => {
+        this.payNo = data.payNo;
+      })
+    },
     modifyBuyerRemarks(){
       this.$http({
         url: this.$http.adornUrl('/order/order/modifyRemarks'),
@@ -1066,6 +1064,7 @@ export default {
         }),
       }).then(({ data }) => {
         if(data){
+          this.modifyCreateTimeVisible = false;
           this.$message({
             message: "修改成功",
             type: 'success'

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

@@ -233,6 +233,7 @@ export default {
   methods: {
     closeDialog(){
       this.visible = false;
+      this.$emit('printOrderClose');
     },
     init (params) {
       this.dataForm.orderNumber = params.orderNumber || 0

+ 29 - 5
src/views/modules/print/print-order.vue

@@ -39,6 +39,8 @@
                 placeholder="产品名称">
                 <el-option key="yjxk" label="圆角小卡" value="圆角小卡"></el-option>
                 <el-option key="zjxk" label="直角小卡" value="直角小卡"></el-option>
+                <el-option key="pld" label="拍立得" value="拍立得"></el-option>
+                <el-option key="zpfm" label="直拍封面" value="直拍封面"></el-option>
                 <el-option key="sq" label="书签" value="书签"></el-option>
                 <el-option key="mxp" label="明信片" value="明信片"></el-option>
                 <el-option key="fk" label="方卡" value="方卡"></el-option>
@@ -54,7 +56,7 @@
                 size="small"
                 clearable
                 placeholder="覆膜工艺">
-                <el-option key="lm" label="亮膜" value="亮膜"></el-option>
+                <el-option key="lm" label="镜面膜" value="镜面膜"></el-option>
                 <el-option key="ym" label="哑膜" value="哑膜"></el-option>
                 <el-option key="ls" label="斜杠镭射" value="斜杠镭射"></el-option>
                 <el-option key="mtx" label="满天星" value="满天星"></el-option>
@@ -62,6 +64,9 @@
                 <el-option key="bls" label="玻璃碎" value="玻璃碎"></el-option>
                 <el-option key="zgz" label="珠光" value="珠光"></el-option>
                 <el-option key="xx" label="星星" value="星星"></el-option>
+                <el-option key="szxs" label="十字星闪" value="十字星闪"></el-option>
+                <el-option key="wjx" label="五角旗星" value="五角旗星"></el-option>
+                <el-option key="yhm" label="烟花膜" value="烟花膜"></el-option>
               </el-select>
             </template>
           </el-form-item>
@@ -306,6 +311,10 @@
                       v-else-if="order.status === 4"
                       type="warning"
                     >异常</el-tag>
+                    <el-tag
+                      v-else-if="order.status === 11"
+                      type="info"
+                    >已取消</el-tag>
                   </span>
                 </div>
               </el-col>
@@ -330,6 +339,10 @@
                       class="default-btn text-btn operate-btn"
                       @click="updateStatus(order, 1)"
                       v-if="order.status === 4">标记正常</div>
+                    <div
+                      class="default-btn text-btn operate-btn"
+                      @click="updateStatus(order, 11)">取消订单
+                    </div>
                   </div>
                 </div>
               </el-col>
@@ -413,7 +426,7 @@
       </div>
     </el-dialog>
     <!-- 订单详情 -->
-    <print-order-info ref="printOrderInfo"></print-order-info>
+    <print-order-info ref="printOrderInfo" v-if="printOrderDialogVisible" @printOrderClose="printOrderClose"></print-order-info>
     <!-- 波次订单 -->
     <wave-print-order ref="wavePrintOrder"></wave-print-order>
 
@@ -469,6 +482,10 @@
             value: 4,
             label: "异常"
           },
+          {
+            value: 11,
+            label: "已取消"
+          },
           ],
         refund: [
           {
@@ -560,6 +577,10 @@
 
     },
     methods: {
+      printOrderClose(){
+        this.printOrderDialogVisible = false;
+      },
+
       wavePrintOrderClose(){
         this.wavePrintOrderVisible = false;
       },
@@ -567,9 +588,12 @@
         this.$refs.wavePrintOrder.openAndQueryPrintOrder({orderNumber: orderNumber, waveId: waveId})
       },
       openPrintOrderDialog(orderNumber){
-        this.$refs.printOrderInfo.init({
-          orderNumber: orderNumber,
-        })
+        this.printOrderDialogVisible = true;
+        this.$nextTick(() => {
+          this.$refs.printOrderInfo.init({
+            orderNumber: orderNumber,
+          })
+        });
       },
       openGenerateWaveDialog(){
         if(this.dataListSelections.size === 0){

+ 164 - 0
src/views/modules/print/third-print-sku-add-or-update.vue

@@ -0,0 +1,164 @@
+<template>
+  <el-dialog
+    :title="!dataForm.templateId ? this.$i18n.t('crud.addTitle') : this.$i18n.t('temp.modify')"
+    :close-on-click-modal="false"
+    :visible.sync="visible">
+    <el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()" label-width="100px">
+      <el-form-item label="三方skuID" prop="thirdSkuId">
+        <el-input v-model="dataForm.thirdSkuId" style="width: 185px"/>
+      </el-form-item>
+      <el-form-item label="三方sku名称" prop="thirdSkuName">
+        <el-input v-model="dataForm.thirdSkuName" style="width: 185px"/>
+      </el-form-item>
+      <!-- 产品类型 -->
+      <el-form-item label="产品类型" prop="prodType">
+        <el-select v-model="dataForm.prodType" clearable filterable >
+          <el-option key="smallcard" label="小卡" value="smallcard"></el-option>
+          <el-option key="squarecard" label="方卡" value="squarecard"></el-option>
+          <el-option key="badge" label="马口铁徽章" value="badge"></el-option>
+          <el-option key="plushbadge" label="毛绒徽章" value="plushbadge"></el-option>
+          <el-option key="postcard" label="明信片" value="postcard"></el-option>
+          <el-option key="bookmark" label="书签" value="bookmark"></el-option>
+          <el-option key="tipscard" label="迷你手幅" value="tipscard"></el-option>
+          <el-option key="polaroid" label="花式拍立得" value="polaroid"></el-option>
+          <el-option key="covercard" label="直拍封面" value="covercard"></el-option>
+          <el-option key="stub" label="票根" value="stub"></el-option>
+          <el-option key="transformcard" label="变换卡" value="transformcard"></el-option>
+          <el-option key="transpolaroid" label="透明胶片拍立得" value="transpolaroid"></el-option>
+          <el-option key="rectanglesticker" label="长形贴纸" value="rectanglesticker"></el-option>
+          <el-option key="squaresticker" label="方形贴纸" value="squaresticker"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="关联产品" prop="prodId">
+        <el-select v-model="dataForm.prodId" clearable filterable @change="prodChange">
+          <el-option v-for="(item, index) in prodList"
+             :key="index"
+             :label="item.prodName"
+             :value="item.prodId">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="产品SKU" prop="skuId">
+        <el-select v-model="dataForm.skuId" clearable filterable>
+          <el-option v-for="(item, index) in skuList"
+               :key="index"
+               :label="item.skuName"
+               :value="item.skuId">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="三方产品类型编号" prop="prodTypeNo">
+        <el-input v-model="dataForm.prodTypeNo" style="width: 185px"/>
+      </el-form-item>
+      <el-form-item label="三方SKU编号" prop="skuNo">
+        <el-input v-model="dataForm.skuNo" style="width: 185px"/>
+      </el-form-item>
+      <el-form-item label="产品角型" prop="prodAngle">
+        <el-select v-model="dataForm.prodAngle" clearable filterable>
+          <el-option key="1" lable="圆角" value="圆角"/>
+          <el-option key="2" lable="直角" value="直角"/>
+        </el-select>
+      </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 {
+  data () {
+    return {
+      visible: false,
+      dataForm: {
+        id: null,
+        prodId: null,
+        prodType: null,
+        thirdSkuName: null,
+        skuId: null,
+        thirdSkuId: null,
+        prodTypeNo: null,
+        prodAngle: null,
+        skuNo: null,
+        prodName: null,
+      },
+      prodList: [],
+      skuList: [],
+      dataRule: {
+      }
+    }
+  },
+  created(){
+    this.getProdList();
+  },
+  methods: {
+    init (id) {
+      this.dataForm.id = id || 0
+      this.visible = true
+      this.$nextTick(() => {
+        this.$refs['dataForm'].resetFields()
+        if (this.dataForm.id) {
+          this.$http({
+            url: this.$http.adornUrl('/prod/thirdPrintSku/info/' + this.dataForm.id),
+            method: 'get',
+            params: this.$http.adornParams()
+          }).then(({data}) => {
+            this.dataForm = data
+          })
+        }
+      })
+    },
+    prodChange(prodId){
+      this.prodList.map(item =>{
+        if(item.prodId === prodId){
+          this.dataForm.prodName = item.prodName;
+        }
+      });
+      this.getSkuList()
+    },
+    getSkuList(){
+      this.$http({
+        url: this.$http.adornUrl('/sku/getEnableSkuList'),
+        method: 'GET',
+        params: this.$http.adornParams({prodId:this.dataForm.prodId})
+      }).then(({data}) => {
+        this.skuList = data
+      })
+    },
+    getProdList(){
+      this.$http({
+        url: this.$http.adornUrl('/prod/prod/simpleList'),
+        method: 'GET',
+        params: this.$http.adornParams({customized:0})
+      }).then(({data}) => {
+        this.prodList = data
+      })
+    },
+    // 表单提交
+    dataFormSubmit () {
+      this.$refs['dataForm'].validate((valid) => {
+        if (valid) {
+          this.$http({
+            url: this.$http.adornUrl('/prod/thirdPrintSku'),
+            method: this.dataForm.id ? 'put' : 'post',
+            data: this.$http.adornData(this.dataForm)
+          }).then(({data}) => {
+            this.$message({
+              message: this.$i18n.t('publics.operation'),
+              type: 'success',
+              duration: 200,
+              onClose: () => {
+                this.visible = false
+                this.$emit('refreshDataList')
+              }
+            })
+          })
+        }
+      })
+    }
+  }
+}
+</script>

+ 253 - 0
src/views/modules/print/third-print-sku.vue

@@ -0,0 +1,253 @@
+<template>
+  <div class="mod-print-printPicLib">
+    <!-- 搜索相关区域 -->
+    <div class="search-bar">
+      <el-form :inline="true" class="search-form" ref="searchForm" :model="searchForm" label-width="auto" size="small">
+        <div class="input-row">
+          <el-form-item prop="prodType" label="产品类型" class="search-form-item">
+            <el-select v-model="searchForm.prodType" clearable filterable >
+              <el-option key="smallcard" label="小卡" value="smallcard"></el-option>
+              <el-option key="squarecard" label="方卡" value="squarecard"></el-option>
+              <el-option key="badge" label="马口铁徽章" value="badge"></el-option>
+              <el-option key="plushbadge" label="毛绒徽章" value="plushbadge"></el-option>
+              <el-option key="postcard" label="明信片" value="postcard"></el-option>
+              <el-option key="bookmark" label="书签" value="bookmark"></el-option>
+              <el-option key="tipscard" label="迷你手幅" value="tipscard"></el-option>
+              <el-option key="polaroid" label="花式拍立得" value="polaroid"></el-option>
+              <el-option key="covercard" label="直拍封面" value="covercard"></el-option>
+              <el-option key="stub" label="票根" value="stub"></el-option>
+              <el-option key="transformcard" label="变换卡" value="transformcard"></el-option>
+              <el-option key="transpolaroid" label="透明胶片拍立得" value="transpolaroid"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="prodAngle" label="产品角型" class="search-form-item">
+            <el-select v-model="searchForm.prodAngle" clearable filterable >
+              <el-option key="1" label="圆角" value="圆角"></el-option>
+              <el-option key="2" label="直角" value="直角"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="prodId" label="产品名称" class="search-form-item">
+            <el-select v-model="searchForm.prodId" clearable filterable >
+              <el-option v-for="(item, index) in prodList"
+                         :key="index" :label="item.prodName" :value="item.prodId"></el-option>
+            </el-select>
+          </el-form-item>
+          <div class="default-btn primary-btn" @click="searchChange">{{$t('crud.searchBtn')}}</div>
+          <div class="default-btn" @click="resetSearchForm('searchForm')">{{$t('shop.resetMap')}}</div>
+        </div>
+
+      </el-form>
+    </div>
+    <!-- 列表相关区域 -->
+    <div class="main-container">
+      <div class="operation-bar">
+        <div class="default-btn primary-btn" @click="addOrUpdateHandle()">{{$t("crud.addTitle")}}</div>
+      </div>
+      <div class="table-con spec-table">
+        <el-table
+          ref="specListTable"
+          :data="dataList"
+          header-cell-class-name="table-header"
+          row-class-name="table-row"
+          style="width: 100%">
+          <!-- 正面图 -->
+          <el-table-column label="三方skuId" prop="thirdSkuId" align="center">
+            <template slot-scope="scope">
+              <span>{{scope.row.thirdSkuId}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="三方SKU名称" prop="thirdSkuName" align="center">
+            <template slot-scope="scope">
+              <span>{{scope.row.thirdSkuName}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="三方SKU编号" prop="skuNo" align="center">
+            <template slot-scope="scope">
+              <span>{{scope.row.skuNo}}</span>
+            </template>
+          </el-table-column>
+          <!-- 背面图 -->
+          <el-table-column label="产品类型" prop="prodType" align="center">
+            <template slot-scope="scope">
+              <span v-if="scope.row.prodType === 'smallcard'">小卡</span>
+              <span v-if="scope.row.prodType === 'squarecard'">方卡</span>
+              <span v-if="scope.row.prodType === 'badge'">马口铁徽章</span>
+              <span v-if="scope.row.prodType === 'plushbadge'">毛绒徽章</span>
+              <span v-if="scope.row.prodType === 'postcard'">明信片</span>
+              <span v-if="scope.row.prodType === 'bookmark'">书签</span>
+              <span v-if="scope.row.prodType === 'tipscard'">迷你手幅</span>
+              <span v-if="scope.row.prodType === 'polaroid'">仿拍立得</span>
+              <span v-if="scope.row.prodType === 'covercard'">直拍封面</span>
+              <span v-if="scope.row.prodType === 'stub'">票根</span>
+              <span v-if="scope.row.prodType === 'transformcard'">变换卡</span>
+              <span v-if="scope.row.prodType === 'transpolaroid'">透明胶片拍立得</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="产品类型名称" prop="prodName" align="center">
+            <template slot-scope="scope">
+              <span>{{scope.row.prodName}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="产品角型" prop="prodAngle" align="center">
+            <template slot-scope="scope">
+              <span>{{scope.row.prodAngle}}</span>
+            </template>
+          </el-table-column>
+
+          <!--&lt;!&ndash; 关联的产品ID &ndash;&gt;
+          <el-table-column label="关联产品" prop="prodId" align="center">
+            <template slot-scope="scope">
+              <span>{{ scope.row.prodId}}</span>
+            </template>
+          </el-table-column>-->
+          <!-- 产品名称 -->
+          <el-table-column label="关联产品" prop="prodName" align="center">
+            <template slot-scope="scope">
+              <span>{{ scope.row.prodName}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" fixed="right" :label="$t('publics.operating')" width="auto">
+            <template slot-scope="scope">
+              <div class="text-btn-con">
+                <div class="default-btn text-btn" @click="addOrUpdateHandle(scope.row.id)">{{$t("crud.updateBtn")}}</div>
+                <div class="default-btn text-btn" @click.stop="deleteHandle(scope.row.id)">{{$t("text.delBtn")}}</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>
+    <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>
+</template>
+
+<script>
+import AddOrUpdate from './third-print-sku-add-or-update'
+export default {
+  data () {
+    return {
+      dataList: [],
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      prodList:[],
+      previewPicUrl: null,
+      previewPicDialogVisible: false,
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+      searchForm: {
+        prodType: null,
+        prodId: null,
+        prodAngle: null
+      }, // 搜索
+      dataListLoading: false,
+      addOrUpdateVisible: false
+    }
+  },
+  components: {
+    AddOrUpdate
+  },
+  created () {
+    this.getDataList();
+    this.getProdList();
+  },
+  mounted () {
+  },
+  methods: {
+    getProdList(){
+      this.$http({
+        url: this.$http.adornUrl('/prod/prod/simpleList'),
+        method: 'GET',
+        params: this.$http.adornParams({customized:0})
+      }).then(({data}) => {
+        this.prodList = data
+      })
+    },
+    resetSearchForm (formName) {
+      this.$refs[formName].resetFields()
+    },
+    getDataList (page) {
+      this.dataListLoading = true
+      this.$http({
+        url: this.$http.adornUrl('/prod/thirdPrintSku/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.searchForm
+          )
+        )
+      }).then(({data}) => {
+        this.dataList = data.records
+        this.page.total = data.total
+        this.dataListLoading = false
+      })
+    },
+    // 新增 / 修改
+    addOrUpdateHandle (id) {
+      this.addOrUpdateVisible = true
+      this.$nextTick(() => {
+        this.$refs.addOrUpdate.init(id)
+      })
+    },
+    deleteHandle (id) {
+      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('/print/printPicLib/' + id),
+          method: 'delete',
+          data: this.$http.adornData({})
+        }).then(({ data }) => {
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success',
+            duration: 200,
+            onClose: () => {
+              this.refreshChange()
+            }
+          })
+        })
+      }).catch(() => { })
+    },
+    // 刷新回调
+    refreshChange () {
+      this.page.currentPage = 1
+      this.getDataList(this.page)
+    },
+    searchChange (params) {
+      this.getDataList(this.page)
+    },
+    handleSizeChange (val) {
+      this.page.pageSize = val
+      this.getDataList()
+    },
+    handleCurrentChange (val) {
+      this.page.currentPage = val
+      this.getDataList()
+    }
+  }
+}
+</script>
+<style lang="scss">
+.mod-print-printPicLib {
+}
+</style>

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

@@ -229,6 +229,7 @@
                   <span v-if="scope.row.status == 1">待打印</span>
                   <span v-if="scope.row.status == 2">待发货</span>
                   <span v-if="scope.row.status == 3">已发货</span>
+                  <span v-if="scope.row.status == 11">已取消</span>
                 </template>
               </el-table-column>
               <el-table-column

+ 8 - 1
src/views/modules/prod/post-product/posting-edit-product.vue

@@ -195,6 +195,12 @@
               <el-radio :label="1">非定制</el-radio>
             </el-radio-group>
           </el-form-item>
+          <el-form-item v-if="dataForm.prodType !== 5 && dataForm.customized == 0" label="定制类型">
+            <el-radio-group v-model="dataForm.customType">
+              <el-radio :label="1">上传定制</el-radio>
+              <el-radio :label="2">图库定制</el-radio>
+            </el-radio-group>
+          </el-form-item>
           <div class="prod-name-box">
             <el-form-item label="起订量" class="prod-name-con">
               <el-input type="number" v-model="dataForm.setNum"></el-input>
@@ -600,7 +606,8 @@ export default {
           //   parameterValueEn: ''
           // }
         ],
-        customized: 0
+        customized: 0,
+        customType: 1
       },
       dataRule: {
         prodNameCn: [

+ 180 - 0
src/views/modules/prod/printPicLib-add-or-update.vue

@@ -0,0 +1,180 @@
+<template>
+  <el-dialog
+    :title="!dataForm.templateId ? this.$i18n.t('crud.addTitle') : this.$i18n.t('temp.modify')"
+    :close-on-click-modal="false"
+    :visible.sync="visible">
+    <el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()" label-width="100px">
+      <el-form-item label="关联产品" prop="prodId">
+        <el-select v-model="dataForm.prodId" clearable filterable @change="prodChange">
+          <el-option v-for="(item, index) in prodList"
+             :key="index"
+             :label="item.prodName"
+             :value="item.prodId">
+          </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>
+      <el-row>
+        <el-col :span="6">
+            <el-form-item label="正面" prop="frontUrl">
+              <img-upload v-model="dataForm.frontUrl" :limit="1"></img-upload>
+            </el-form-item>
+          </el-col>
+        <el-col :span="6">
+          <el-form-item label="背面" prop="backUrl">
+            <img-upload v-model="dataForm.backUrl" :limit="1"></img-upload>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-form-item label="是否禁用" prop="isDelete">
+        <el-select v-model="dataForm.isDelete" clearable filterable>
+          <el-option key="1" label="启用" :value=0 ></el-option>
+          <el-option key="0" label="禁用" :value=1 ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="排序" prop="seq">
+        <el-input v-model="dataForm.seq" style="width: 185px" type="number"/>
+      </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>
+  import ImgUpload from '@/components/imgs-upload'
+export default {
+  components: {
+    ImgUpload
+  },
+  data () {
+    return {
+      visible: false,
+      dataForm: {
+        id: null,
+        frontUrl: null,
+        backUrl: null,
+        prodId: null,
+        prodName: null,
+        seq: null,
+        isDelete: 0,
+        category:null
+      },
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+      prodList: [],
+      dataRule: {
+      }
+    }
+  },
+  created(){
+    this.getProdList();
+  },
+  methods: {
+    init (id) {
+      this.dataForm.id = id || 0
+      this.visible = true
+      this.$nextTick(() => {
+        this.$refs['dataForm'].resetFields()
+        if (this.dataForm.id) {
+          this.$http({
+            url: this.$http.adornUrl('/print/printPicLib/info/' + this.dataForm.id),
+            method: 'get',
+            params: this.$http.adornParams()
+          }).then(({data}) => {
+            this.dataForm = data
+          })
+        }
+      })
+    },
+    prodChange(prodId){
+      this.prodList.map(item =>{
+        if(item.prodId === prodId){
+          this.dataForm.prodName = item.prodName;
+        }
+      });
+    },
+    getProdTypeSize(){
+      let width = 0;
+      let height = 0;
+      let prodName = this.dataForm.prodName;
+      if(prodName.indexOf('小卡') !== -1 || prodName.indexOf("仿拍立得") !== -1){
+        width = 709;
+        height = 1087;
+      }else if(prodName.indexOf("票根") !== -1){
+        width = 780;
+        height = 1489;
+      }else if(prodName.indexOf("圆形徽章") !== -1){
+        width = 850;
+        height = 850;
+      }else if(prodName.indexOf("明信片") !== -1){
+        width = 1252;
+        height = 1819;
+      }
+      return {width, height};
+    },
+    //验证图片尺寸
+    checkImageSize(imageStr, index) {
+      let width = this.getProdTypeSize().width;
+      let height = this.getProdTypeSize().height;
+      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;
+      });
+    },
+
+    getProdList(){
+      this.$http({
+        url: this.$http.adornUrl('/prod/prod/simpleList'),
+        method: 'GET',
+        params: this.$http.adornParams({customized:0})
+      }).then(({data}) => {
+        this.prodList = data
+      })
+    },
+    // 表单提交
+    async dataFormSubmit () {
+      try{
+        let imgs = [];
+        imgs[0] = this.dataForm.frontUrl ? this.dataForm.frontUrl:null;
+        if(this.dataForm.backUrl){
+          imgs[1] = this.dataForm.backUrl ? this.dataForm.backUrl:null;
+        }
+        await Promise.all(imgs.map(this.checkImageSize));
+        this.$http({
+          url: this.$http.adornUrl('/print/printPicLib'),
+          method: this.dataForm.id ? 'put' : 'post',
+          data: this.$http.adornData(this.dataForm)
+        }).then(({data}) => {
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success',
+            duration: 200,
+            onClose: () => {
+              this.visible = false
+              this.$emit('refreshDataList')
+            }
+          })
+        })
+      }catch (error) {
+        this.$message.error(`第 ${error + 1} 张图片不符合尺寸要求。`)
+      }
+
+    }
+  }
+}
+</script>

+ 236 - 0
src/views/modules/prod/printPicLib.vue

@@ -0,0 +1,236 @@
+<template>
+  <div class="mod-print-printPicLib">
+    <!-- 搜索相关区域 -->
+    <div class="search-bar">
+      <el-form :inline="true" class="search-form" ref="searchForm" :model="searchForm" label-width="auto" size="small">
+        <!-- 表单项 -->
+        <div class="input-row">
+          <el-form-item prop="prodId" label="关联产品">
+            <el-select v-model="searchForm.prodId" clearable filterable>
+              <el-option
+                v-for="node in prodList"
+                :key="node.prodId"
+                :label="node.prodName"
+                :value="node.prodId"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="category" label="分类">
+            <el-input v-model="searchForm.category"></el-input>
+          </el-form-item>
+          <el-form-item>
+            <div class="default-btn primary-btn" @click="searchChange()">{{ $t('crud.searchBtn') }}</div>
+            <div class="default-btn" @click="resetForm()">{{ $t('shop.resetMap') }}</div>
+          </el-form-item>
+        </div>
+      </el-form>
+    </div>
+    <!-- 列表相关区域 -->
+    <div class="main-container">
+      <div class="operation-bar">
+        <div class="default-btn primary-btn" @click="addOrUpdateHandle()">{{$t("crud.addTitle")}}</div>
+      </div>
+      <div class="table-con spec-table">
+        <el-table
+          ref="specListTable"
+          :data="dataList"
+          header-cell-class-name="table-header"
+          row-class-name="table-row"
+          style="width: 100%">
+          <!-- 正面图 -->
+          <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="prodName" align="center">
+            <template slot-scope="scope">
+              <span>{{ scope.row.prodName}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="分类" prop="category" align="center">
+            <template slot-scope="scope">
+              <span>{{ scope.row.category}}</span>
+            </template>
+          </el-table-column>
+          <!-- 排序序号 -->
+          <el-table-column label="序号" prop="seq" align="center">
+            <template slot-scope="scope">
+              <span>{{ scope.row.seq}}</span>
+            </template>
+          </el-table-column>
+          <!-- 是否删除,0正常,1删除 -->
+          <el-table-column label="是否删除" prop="isDelete" align="center">
+            <template slot-scope="scope">
+              <el-tag v-if="scope.row.isDelete === 1" type="danger">已删除</el-tag>
+              <el-tag v-if="scope.row.isDelete === 0" type="success">正常</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" fixed="right" :label="$t('publics.operating')" width="auto">
+            <template slot-scope="scope">
+              <div class="text-btn-con">
+                <div class="default-btn text-btn" @click="addOrUpdateHandle(scope.row.id)">{{$t("crud.updateBtn")}}</div>
+                <div class="default-btn text-btn" @click.stop="deleteHandle(scope.row.id)">{{$t("text.delBtn")}}</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>
+    <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>
+</template>
+
+<script>
+import AddOrUpdate from './printPicLib-add-or-update'
+export default {
+  data () {
+    return {
+      dataList: [],
+      page: {
+        total: 0, // 总页数
+        currentPage: 1, // 当前页数
+        pageSize: 10 // 每页显示多少条
+      },
+      categoryList:[],
+      prodList:[],
+      previewPicUrl: null,
+      previewPicDialogVisible: false,
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
+      searchForm: {
+        prodId: null
+      }, // 搜索
+      dataListLoading: false,
+      addOrUpdateVisible: false
+    }
+  },
+  components: {
+    AddOrUpdate
+  },
+  created () {
+    this.getDataList();
+    this.getProdList();
+  },
+  mounted () {
+  },
+  methods: {
+    getProdList(){
+      this.$http({
+        url: this.$http.adornUrl('/prod/prod/simpleList'),
+        method: 'GET',
+        params: this.$http.adornParams({customized:0})
+      }).then(({data}) => {
+        this.prodList = data
+      })
+    },
+    previewPic(url){
+      this.previewPicUrl = this.resourcesUrl + url;
+      this.previewPicDialogVisible = true;
+    },
+    getDataList (page) {
+      this.dataListLoading = true;
+      this.$http({
+        url: this.$http.adornUrl('/print/printPicLib/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.searchForm
+          )
+        )
+      }).then(({data}) => {
+        this.dataList = data.records
+        this.page.total = data.total
+        this.dataListLoading = false
+      })
+    },
+    // 新增 / 修改
+    addOrUpdateHandle (id) {
+      this.addOrUpdateVisible = true;
+      this.$nextTick(() => {
+        this.$refs.addOrUpdate.init(id)
+      })
+    },
+    deleteHandle (id) {
+      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('/print/printPicLib/' + id),
+          method: 'delete',
+          data: this.$http.adornData({})
+        }).then(({ data }) => {
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success',
+            duration: 1500,
+            onClose: () => {
+              this.refreshChange()
+            }
+          })
+        })
+      }).catch(() => { })
+    },
+    // 刷新回调
+    refreshChange () {
+      this.page.currentPage = 1
+      this.getDataList(this.page)
+    },
+    resetForm () {
+      this.searchForm = {
+        prodId: null,
+      }
+    },
+    searchChange (params) {
+      this.getDataList(this.page)
+    },
+    handleSizeChange (val) {
+      this.page.pageSize = val
+      this.getDataList()
+    },
+    handleCurrentChange (val) {
+      this.page.currentPage = val
+      this.getDataList()
+    }
+  }
+}
+</script>
+<style lang="scss">
+.mod-print-printPicLib {
+}
+</style>

+ 74 - 27
src/views/modules/prod/prodTemplate-add-or-update.vue

@@ -19,6 +19,8 @@
           <el-option key="bookmark" label="书签" value="bookmark"></el-option>
           <el-option key="tipscard" label="手幅" value="tipscard"></el-option>
           <el-option key="polaroid" label="拍立得" value="polaroid"></el-option>
+          <el-option key="covercard" label="直拍封面" value="covercard"></el-option>
+          <el-option key="stub" label="票根" value="stub"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="模板风格" prop="templateStyle">
@@ -88,6 +90,7 @@ export default {
         templateUsage: null,
         seq: 1
       },
+      resourcesUrl: process.env.VUE_APP_RESOURCES_URL,
       seriesList: [],
       styleList: [],
       usageList:[],
@@ -117,41 +120,85 @@ export default {
         }
       })
     },
+    //验证图片尺寸
+    checkImageSize(imageStr, index) {
+      let width = 0;
+      let height = 0;
+      let templateUsage = this.usageList.join(",");
+      let isBack = this.dataForm.templateSide === 'Back';
+      return new Promise((resolve, reject) => {
+        let image = new Image();
+        image.onload = function() {
+          if(templateUsage.indexOf("smallcard") !== -1 || templateUsage.indexOf("polaroid") !== -1){
+            width = 709;
+            height = 1087;
+          }else if(templateUsage.indexOf("stub") !== -1){
+            width = 780;
+            height = 1489;
+          }else if(templateUsage.indexOf("bookmark") !== -1){
+            width = 638;
+            height = 1819;
+          }else if(templateUsage.indexOf("postcard") !== -1){
+            width = 1252;
+            height = 1819;
+          }
+          if(isBack){
+            let imageFormat = imageStr.split('.').pop();
+            if(imageFormat != 'jpg'){
+              reject(index);
+            }
+          }else if(!isBack && templateUsage.indexOf("polaroid") !== -1){
+            let imageFormat = imageStr.split('.').pop();
+            if(imageFormat != 'png'){
+              reject(index);
+            }
+          }
+          if ((image.width === width && image.height === height)) {
+            resolve();
+          } else {
+            reject(index);
+          }
+        };
+        image.src = this.resourcesUrl + imageStr;
+      });
+    },
     // 表单提交
-    dataFormSubmit () {
-      this.$refs['dataForm'].validate((valid) => {
-        if (valid) {
-          this.handleStyleName(this.dataForm.templateStyleId);
-          this.handleSeriesName(this.dataForm.templateSeriesId);
-          this.dataForm.templateUsage = this.usageList.join(",");
-          this.$http({
-            url: this.$http.adornUrl('/prod/prodTemplate'),
-            method: this.dataForm.templateId ? 'put' : 'post',
-            data: this.$http.adornData(this.dataForm)
-          }).then(({data}) => {
-            this.$message({
-              message: this.$i18n.t('publics.operation'),
-              type: 'success',
-              duration: 1500,
-              onClose: () => {
-                this.visible = false
-                this.$emit('refreshDataList')
-              }
-            })
+    async dataFormSubmit () {
+      try{
+        let imgUrlArr = this.dataForm.templatePic.split(",");
+        await Promise.all(imgUrlArr.map(this.checkImageSize));
+        this.handleStyleName(this.dataForm.templateStyleId);
+        this.handleSeriesName(this.dataForm.templateSeriesId);
+        this.dataForm.templateUsage = this.usageList.join(",");
+        this.$http({
+          url: this.$http.adornUrl('/prod/prodTemplate'),
+          method: this.dataForm.templateId ? 'put' : 'post',
+          data: this.$http.adornData(this.dataForm)
+        }).then(({data}) => {
+          this.$message({
+            message: this.$i18n.t('publics.operation'),
+            type: 'success',
+            duration: 200,
+            onClose: () => {
+              this.visible = false;
+              this.$emit('refreshDataList')
+            }
           })
-        }
-      })
+        })
+      }catch (error) {
+        this.$message.error(`第 ${error + 1} 张图片不符合尺寸要求。`)
+      }
     },
     getStyleList () {
       this.$http({
         url: this.$http.adornUrl('/prod/prodTemplateStyle/page'),
         method: 'get',
         params: this.$http.adornParams(
-                Object.assign({
-                  size: 100,
-                  shopId: this.$store.state.user.shopId
-                }
-                )
+          Object.assign({
+              size: 100,
+              shopId: this.$store.state.user.shopId
+            }
+          )
         )
       }).then(({data}) => {
         this.styleList = data.records

+ 3 - 0
src/views/modules/prod/prodTemplateSeries-add-or-update.vue

@@ -7,6 +7,9 @@
       <el-form-item label="系列名称" prop="seriesName">
         <el-input v-model="dataForm.seriesName"></el-input>
       </el-form-item>
+      <el-form-item label="排序" prop="seq">
+        <el-input v-model="dataForm.seq" type="number"></el-input>
+      </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>

+ 5 - 6
src/views/modules/prod/prodTemplateSeries.vue

@@ -33,12 +33,11 @@
               <span>{{ scope.row.seriesName}}</span>
             </template>
           </el-table-column>
-          <!-- 商家ID -->
-<!--          <el-table-column :label="$t('prodTemplateSeries.shopId')" prop="shopId" align="center">-->
-<!--            <template slot-scope="scope">-->
-<!--              <span>{{ scope.row.shopId}}</span>-->
-<!--            </template>-->
-<!--          </el-table-column>-->
+          <el-table-column label="排序" prop="seq" align="center">
+            <template slot-scope="scope">
+              <span>{{ scope.row.seq}}</span>
+            </template>
+          </el-table-column>
           <el-table-column align="center" fixed="right" :label="$t('publics.operating')" width="auto">
             <template slot-scope="scope">
               <div class="text-btn-con">

+ 1 - 3
src/views/modules/settlement/print-settlement-add-or-update.vue

@@ -127,10 +127,8 @@
             this.$message({
               message: '提交成功',
               type: 'success',
-              onClose: () => {
-                this.dialogClose();
-              }
             })
+            this.dialogClose();
           }else{
             this.$message({
               message: '提交失败',

+ 8 - 0
src/views/modules/settlement/third-print-settlement-detail.vue

@@ -173,6 +173,14 @@
       },
       dialogClose(){
 
+      },
+      handleSizeChange (val) {
+        this.page.pageSize = val
+        this.getDetailDataList(this.page, false)
+      },
+      handleCurrentChange (val) {
+        this.page.currentPage = val
+        this.getDetailDataList(this.page, false)
       }
     }
   }