makeLadingBill.vue 10.1 KB
Newer Older
huhaiqing's avatar
huhaiqing committed
1 2 3
<template>
  <el-row class="shipping-makeLadingBill">
    <el-row>
4
      <div class="title-orderNo">{{$t('订单号')}}{{orderNo}}</div>
huhaiqing's avatar
huhaiqing committed
5
    </el-row>
huhaiqing's avatar
huhaiqing committed
6
    <el-row class="ueditor-row">
dragondean@qq.com's avatar
dragondean@qq.com committed
7
      <vue-ueditor-wrap v-model="billContent" :config="editorConfig" editor-id="billUeditor"  />
huhaiqing's avatar
huhaiqing committed
8
    </el-row>
huhaiqing's avatar
huhaiqing committed
9 10 11 12

    <!-- 审核流程 -->
    <el-row class="process-area">
      <div class="process">
13
        <div>{{$t('审批流程')}}</div>
huhaiqing's avatar
huhaiqing committed
14 15 16
        <work-flow xmlkey="bill_lading" v-model="selectedUsers"></work-flow>
      </div>
      <div v-if="currRow.status === 1">
17
        <el-button type="primary" @click="jumpReviewDetail">{{$t('审核中')}}</el-button>
18 19
        <el-button plain type="primary" @click="canclAudit">{{$t('取消审核')}}</el-button>
        <el-button plain type="primary" @click="showLoaingTemplate">{{$t('提单预览')}}</el-button>
huhaiqing's avatar
huhaiqing committed
20 21
      </div>
      <div v-if="currRow.status !== 1">
22
        <el-button type="primary" @click="createPdf">{{$t('提交审核')}}</el-button>
23
        <el-button type="primary" @click="showLoaingTemplate">{{$t('提单预览')}}</el-button>
huhaiqing's avatar
huhaiqing committed
24 25 26
      </div>
    </el-row>

27 28 29 30 31
    <!-- htm2canvas 容器 -->
    <div style="height:0; overflow: hidden;">
      <div id="html2canvas-container" v-html="billContent"></div>
    </div>

32
    <el-dialog :title="dialogCfg.title" :visible.sync="visible" width="1000px" append-to-body class="shippingSea-dialog">
huhaiqing's avatar
huhaiqing committed
33 34 35 36 37 38 39 40 41 42 43 44 45
      <previewBill v-if="visible" :contentHtml="billContent" :currRow="currRow" :type="dialogCfg.type" />
    </el-dialog>
  </el-row>
</template>

<script>
import VueUeditorWrap from "vue-ueditor-wrap";
import WorkFlow from "@/components/WorkFlow";
import {
  createBillService,
  updateBillService,
  cancelBillService,
} from "@/api/ecw/box";
46
import { serviceMsg, toReviewDetail } from "../shippingSea/utils";
huhaiqing's avatar
huhaiqing committed
47 48
import previewBill from "./previewBill.vue";
import { getToken } from "@/utils/auth";
49 50 51
import html2canvas from 'html2canvas';
import { jsPDF } from "jspdf";
import {uploadFile} from '@/api/infra/file'
52
import FileSaver from 'file-saver'
53
import {getOrder, getOrderDetail} from "@/api/ecw/order";
54
window.html2canvas = html2canvas
huhaiqing's avatar
huhaiqing committed
55 56 57 58 59 60 61 62 63 64 65
export default {
  name: "makeLadingBill",
  components: {
    VueUeditorWrap,
    WorkFlow,
    previewBill,
  },
  props: {
    currData: Object,
    currRow: Object,
    dialogCfg: Object,
66
    selfNo: String
huhaiqing's avatar
huhaiqing committed
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
  },
  data() {
    return {
      orderNo: "",
      billContent: "",
      editorConfig: {
        UEDITOR_HOME_URL: "/static/plugins/ueditor/",
        autoHeightEnabled: false,
        initialFrameHeight: 500,
        initialFrameWidth: "100%",
        zIndex: 9999,
        toolbars: [
          [
            "anchor", //锚点
            "undo", //撤销
            "redo", //重做
            "bold", //加粗
            "indent", //首行缩进
dragondean@qq.com's avatar
dragondean@qq.com committed
85
            //"snapscreen", //截图
huhaiqing's avatar
huhaiqing committed
86 87 88 89 90 91 92 93 94 95 96 97 98 99
            "italic", //斜体
            "underline", //下划线
            "strikethrough", //删除线
            "subscript", //下标
            "fontborder", //字符边框
            "superscript", //上标
            "formatmatch", //格式刷
            "source", //源代码
            "blockquote", //引用
            "pasteplain", //纯文本粘贴模式
            "selectall", //全选
            "preview", //预览
            "horizontal", //分隔线
            "removeformat", //清除格式
dragondean@qq.com's avatar
dragondean@qq.com committed
100 101 102
            //"time", //时间
            //"date", //日期
            //"unlink", //取消链接
huhaiqing's avatar
huhaiqing committed
103 104 105 106 107 108 109 110 111 112 113 114 115 116
            "insertrow", //前插入行
            "insertcol", //前插入列
            "mergeright", //右合并单元格
            "mergedown", //下合并单元格
            "deleterow", //删除行
            "deletecol", //删除列
            "splittorows", //拆分成行
            "splittocols", //拆分成列
            "splittocells", //完全拆分单元格
            "deletecaption", //删除表格标题
            "inserttitle", //插入标题
            "mergecells", //合并多个单元格
            "deletetable", //删除表格
            "cleardoc", //清空文档
Marcus's avatar
Marcus committed
117
            "insertparagraphbeforetable", //this.$t("表格前插入行")
dragondean@qq.com's avatar
dragondean@qq.com committed
118
            //"insertcode", //代码语言
huhaiqing's avatar
huhaiqing committed
119 120 121 122 123 124 125
            "fontfamily", //字体
            "fontsize", //字号
            "paragraph", //段落格式
            "simpleupload", //单图上传
            "insertimage", //多图上传
            "edittable", //表格属性
            "edittd", //单元格属性
dragondean@qq.com's avatar
dragondean@qq.com committed
126 127
            //"link", //超链接
            //"emotion", //表情
huhaiqing's avatar
huhaiqing committed
128
            "spechars", //特殊字符
dragondean@qq.com's avatar
dragondean@qq.com committed
129 130
            //"searchreplace", //查询替换
            //"insertvideo", //视频
huhaiqing's avatar
huhaiqing committed
131 132 133 134 135 136 137 138 139 140 141 142 143 144
            "justifyleft", //居左对齐
            "justifyright", //居右对齐
            "justifycenter", //居中对齐
            "justifyjustify", //两端对齐
            "forecolor", //字体颜色
            "backcolor", //背景色
            "insertorderedlist", //有序列表
            "insertunorderedlist", //无序列表
            "fullscreen", //全屏
            "directionalityltr", //从左向右输入
            "directionalityrtl", //从右向左输入
            "rowspacingtop", //段前距
            "rowspacingbottom", //段后距
            "pagebreak", //分页
dragondean@qq.com's avatar
dragondean@qq.com committed
145
            //"insertframe", //插入Iframe
huhaiqing's avatar
huhaiqing committed
146 147 148
            "imagenone", //默认
            "imageleft", //左浮动
            "imageright", //右浮动
dragondean@qq.com's avatar
dragondean@qq.com committed
149
            //"attachment", //附件
huhaiqing's avatar
huhaiqing committed
150 151 152
            "imagecenter", //居中
            "wordimage", //图片转存
            "lineheight", //行间距
dragondean@qq.com's avatar
dragondean@qq.com committed
153
            //"edittip ", //编辑提示
huhaiqing's avatar
huhaiqing committed
154 155
            "customstyle", //自定义标题
            "autotypeset", //自动排版
dragondean@qq.com's avatar
dragondean@qq.com committed
156 157
            //"touppercase", //字母大写
            //"tolowercase", //字母小写
huhaiqing's avatar
huhaiqing committed
158
            "background", //背景
dragondean@qq.com's avatar
dragondean@qq.com committed
159 160
            //"scrawl", //涂鸦
            //"music", //音乐
huhaiqing's avatar
huhaiqing committed
161 162
            "inserttable", //插入表格
            "drafts", // 从草稿箱加载
dragondean@qq.com's avatar
dragondean@qq.com committed
163
            //"charts", // 图表
huhaiqing's avatar
huhaiqing committed
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
          ],
        ],
        serverUrl:
          process.env.VUE_APP_BASE_API +
          "/admin-api/infra/file/editor?api_token=" +
          getToken().replace("Bearer ", ""),
      },
      visible: false,
      selectedUsers: [],
    };
  },
  methods: {
    showLoaingTemplate() {
      this.visible = true;
    },
179
    // 先获取订单信息,pdf用 订单号+唛头命名
180
    createPdf(){
181 182 183 184
      // 空运的由接口生成pdf,所以直接提交即可
      if(this.$route.fullPath.toLowerCase().indexOf('air') > -1){
        return this.submit()
      }
185 186 187 188 189
      getOrder(this.currRow.orderId).then(res => {
        this.afterCreatePdf(res.data)
      })
    },
    afterCreatePdf(orderData){
190
      let loading = this.$loading()
191
      html2canvas(document.querySelector("#html2canvas-container"), {dpi:144, useCORS: true}).then(canvas => {
192 193 194 195
        const doc = new jsPDF('p','pt','a4',true);

        const imgWidth = canvas.width
        const imgHeight = canvas.height
dragondean@qq.com's avatar
dragondean@qq.com committed
196
        console.log(imgHeight, imgWidth)
197 198 199 200 201 202 203 204
        let _w = 595.28;
		    let _h = 595.28/imgWidth*imgHeight;
        if(_h>841.89){
          _h = 841.89;
          _w = _h/imgHeight*imgWidth
        }
        const _left = (595.28-_w)/2;
        doc.addImage(canvas, 'PNG', _left, 0, _w,_h, '', 'FAST');
205 206
        /* doc.save("a4.pdf");
        return Promise.reject() */
207
        let form = new FormData()
208 209
        const dst = this.$l(orderData.logisticsInfoDto, 'destTitle')
        let file = this.selfNo + "-" + this.currRow.tidanNo + ' ' + orderData.marks + '-' + dst + '.pdf' //this.selfNo + '-' + this.currRow.tidanNo + '.pdf'
dragondean@qq.com's avatar
dragondean@qq.com committed
210

211
        form.append('file', new File([doc.output('arraybuffer')], file, {type: 'application/pdf'}))
212
        form.append('path', `admin/shipment/${this.selfNo}/pdf/${file}`) // 最前面不能有/,否则返回的url会有两个/
213 214

        /* let blob = new Blob([doc.output('arraybuffer')], {type: "application/pdf"})
215
        FileSaver.saveAs(blob, file);
dragondean@qq.com's avatar
dragondean@qq.com committed
216
        return */
217 218 219 220 221 222 223 224
        return uploadFile(form)
      }).then(res => {
        return this.submit(res.data)
      }).finally(res => {
        loading.close()
      })
    },
    submit(imgUrl) {
huhaiqing's avatar
huhaiqing committed
225 226 227 228 229
      let params = {
        billContent: this.billContent,
        orderId: this.currRow.orderId,
        copyUserId: this.selectedUsers,
      };
230 231 232 233 234 235
      // 有pdf地址则提交,没有则指定后端生成
      if(imgUrl){
        params.imgUrl = imgUrl
      }else{
        params.needBackend = true
      }
236
      if (["makeBill", "resetBill"].includes(this.dialogCfg.type)) {
huhaiqing's avatar
huhaiqing committed
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
        createBillService({ ...params, status: 1 }).then((res) => {
          serviceMsg(res, this).then((res) => {
            this.close("query");
          });
        });
      } else {
        updateBillService({
          ...params,
          id: this.currRow.id,
          status: 1,
        }).then((res) => {
          serviceMsg(res, this).then((res) => {
            this.close("query");
          });
        });
      }
    },
    /* 取消审核 */
    canclAudit() {
      cancelBillService(this.currRow.id).then((res) => {
        serviceMsg(res, this).then(() => {
          this.close("query");
        });
      });
    },
    close(type) {
      this.$emit("closeDialog", type);
    },
265
    jumpReviewDetail() {
266
      this.close('close')
267 268 269
      const { bpmProcessId } = this.currData;
      toReviewDetail.apply(this, [bpmProcessId]);
    },
huhaiqing's avatar
huhaiqing committed
270 271 272 273 274 275 276 277 278 279 280 281 282 283
  },
  watch: {
    currData: {
      immediate: true,
      handler(val) {
        this.billContent = val?.billContent ?? "";
        this.orderNo = val.orderNo;
      },
    },
  },
};
</script>

<style lang="scss" scoped>
284
::v-deep #html2canvas-container{
285
  padding: 3rem;
286
  word-break:initial;
287 288 289
  p{
    margin: 0;
  }
290 291 292
  td{
    word-break:initial;
  }
293
}
huhaiqing's avatar
huhaiqing committed
294 295 296
.shipping-makeLadingBill {
  .title-orderNo {
    text-align: center;
dragondean@qq.com's avatar
dragondean@qq.com committed
297
    font-size: 18px;
huhaiqing's avatar
huhaiqing committed
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
    font-weight: normal;
    margin-bottom: 10px;
  }
  .process-area {
    margin-top: 15px;
    .process {
      display: flex;
      flex-direction: column;
      > :first-child {
        color: #606266;
        font-weight: bolder;
        font-size: 16px;
      }
    }
    > :last-child {
      text-align: center;
    }
  }
huhaiqing's avatar
huhaiqing committed
316 317 318 319
  .ueditor-row {
    display: flex;
    justify-content: center;
  }
huhaiqing's avatar
huhaiqing committed
320
}
dragondean@qq.com's avatar
dragondean@qq.com committed
321 322 323 324
.shippingSea-dialog{
  ::v-deep .el-dialog__body{
    padding-top: 0;
  }
325

dragondean@qq.com's avatar
dragondean@qq.com committed
326
}
huhaiqing's avatar
huhaiqing committed
327
</style>