seaProcess.vue 9.43 KB
Newer Older
1
<template>
huhaiqing106's avatar
huhaiqing106 committed
2
  <div class="app-seaProcess">
huhaiqing's avatar
huhaiqing committed
3
    <!-- 海运流程图 -->
huhaiqing106's avatar
huhaiqing106 committed
4
    <el-scrollbar :vertical="true" viewClass="shipping-chart">
huhaiqing's avatar
huhaiqing committed
5
      <div v-for="(nodes,index) in processData" :key="index" class="chart-nodes">
huhaiqing's avatar
huhaiqing committed
6
        <div class="node-area">
huhaiqing's avatar
huhaiqing committed
7
          <div v-for="node in nodes" :key="node.title" @click="nodeClick(index, node)" class="node-div">
huhaiqing's avatar
huhaiqing committed
8
            <div>
zhoutong's avatar
zhoutong committed
9
              <img :src="getImgSrc(node)" alt="" :width="width" :height="height">
huhaiiqng's avatar
huhaiiqng committed
10
              <p>{{node.title}}</p>
huhaiqing's avatar
huhaiqing committed
11
            </div>
12 13
          </div>
        </div>
huhaiqing's avatar
huhaiqing committed
14
        <div class="arrow-area" v-if="index !== (processData.length-1)">
huhaiqing's avatar
huhaiqing committed
15 16
          <img src="@/assets/images/shipping/jt-start.png" alt="" v-if="index >= currIndex">
          <img src="@/assets/images/shipping/jt-end.png" alt="" v-if="index < currIndex">
17 18
        </div>
      </div>
huhaiiqng's avatar
huhaiiqng committed
19
    </el-scrollbar>
huhaiqing's avatar
huhaiqing committed
20 21

    <!-- 弹窗 -->
22
    <el-dialog custom-class="shipping-dialog" :title="dialogConfig.title" :visible.sync="dialogConfig.dialogVisible" :width="dialogConfig.width" :fullscreen="dialogConfig.fullscreen" :close-on-click-modal=false :modal-append-to-body=false append-to-body>
23
      <component v-bind:is="currentComponent" v-if="dialogConfig.dialogVisible" @closeDialog="closeDialog" v-bind="$attrs" v-on="$listeners" :shipmentObj="shipmentObj" :currNode="currNode"></component>
huhaiiqng's avatar
huhaiiqng committed
24 25
    </el-dialog>
  </div>
26 27 28
</template>

<script>
huhaiqing's avatar
huhaiqing committed
29 30 31 32 33 34 35 36 37 38 39 40 41 42
import bookingWidget from "./nodePage/booking.vue";
import trailerWidget from "./nodePage/trailer.vue";
import preinstallWidget from "./nodePage/preinstall.vue";
import agentWidget from "./nodePage/agent.vue";
import cabinetWidget from "./nodePage/cabinet/index.vue";
import cusDeclarationWidget from "./nodePage/cusDeclaration.vue";
import shipWidget from "./nodePage/ship.vue";
import subMaterialWidget from "./nodePage/subMaterial.vue";
import bargeWidget from "./nodePage/barge.vue";
import departureWidget from "./nodePage/departure.vue";
import blCopyWidget from "./nodePage/blCopy.vue";
import clrDocumentWidget from "./nodePage/clrDocument.vue";
import arrivalWidget from "./nodePage/arrival.vue";
import cusClearanceWidget from "./nodePage/cusClearance.vue";
zhoutong's avatar
zhoutong committed
43 44
import twoWayTakeoffWidget from "./nodePage/twoWayTakeoff.vue";
import twoWayArrivalWidget from "./nodePage/twoWayArrival.vue";
huhaiqing's avatar
huhaiqing committed
45
import unloadingWidget from "./nodePage/unloading/index.vue";
huhaiqing's avatar
huhaiqing committed
46
import settlementWidget from "./nodePage/settlement.vue";
47 48
import reviewWidget from "./nodePage/review.vue";
import tallyWidget from "./nodePage/tally/index.vue";
huhaiiqng's avatar
huhaiiqng committed
49

huhaiqing's avatar
huhaiqing committed
50 51 52
/**
 * 海运流程图
 */
53
export default {
huhaiiqng's avatar
huhaiiqng committed
54
  name: "shippingChart",
huhaiqing's avatar
huhaiqing committed
55
  inheritAttrs: false,
huhaiqing's avatar
huhaiqing committed
56 57 58 59 60 61
  components: {
    bookingWidget,
    trailerWidget,
    preinstallWidget,
    agentWidget,
    cabinetWidget,
huhaiqing's avatar
huhaiqing committed
62
    cusDeclarationWidget,
huhaiqing's avatar
huhaiqing committed
63 64 65 66 67
    shipWidget,
    subMaterialWidget,
    bargeWidget,
    departureWidget,
    blCopyWidget,
huhaiqing's avatar
huhaiqing committed
68 69 70
    clrDocumentWidget,
    arrivalWidget,
    cusClearanceWidget,
zhoutong's avatar
zhoutong committed
71 72
    twoWayTakeoffWidget,
    twoWayArrivalWidget,
huhaiqing's avatar
huhaiqing committed
73
    unloadingWidget,
huhaiqing's avatar
huhaiqing committed
74
    settlementWidget,
75 76
    reviewWidget,
    tallyWidget,
huhaiqing's avatar
huhaiqing committed
77
  },
78
  props: {
huhaiqing's avatar
huhaiqing committed
79
    shipmentObj: Object,
huhaiqing106's avatar
huhaiqing106 committed
80
    seaBaseData: Array,
zhoutong's avatar
zhoutong committed
81 82
    width: {
      type: String,
huhaiqing's avatar
huhaiqing committed
83
      default: "76px",
zhoutong's avatar
zhoutong committed
84 85 86
    },
    height: {
      type: String,
huhaiqing's avatar
huhaiqing committed
87 88
      default: "76px",
    },
89 90 91
  },
  data() {
    return {
huhaiqing's avatar
huhaiqing committed
92
      // 弹窗配置
huhaiiqng's avatar
huhaiiqng committed
93 94 95
      dialogConfig: {
        dialogVisible: false,
        title: "",
huhaiqing's avatar
huhaiqing committed
96
        width: "",
huhaiqing's avatar
huhaiqing committed
97
        fullscreen: false,
huhaiiqng's avatar
huhaiiqng committed
98
      },
huhaiqing's avatar
huhaiqing committed
99 100
      // 当前组件
      currentComponent: "",
huhaiqing's avatar
huhaiqing committed
101 102
      // 当前步骤节点坐标
      currIndex: 0,
103 104
      // 当前节点
      currNode: {},
huhaiqing's avatar
huhaiqing committed
105 106
      // 数据
      processData: this.seaBaseData,
107 108
    };
  },
huhaiqing106's avatar
huhaiqing106 committed
109
  created() {},
huhaiqing's avatar
huhaiqing committed
110
  /* computed: {
huhaiqing's avatar
huhaiqing committed
111 112 113 114 115 116 117 118 119 120 121 122
    isShowAgent() {
      return (type) => {
        if (type === "agent") {
          const { preInstallInfo } = this.shipmentObj;
          const user = this.$store.state.user;
          if (preInstallInfo && preInstallInfo.noticeUser === user.id)
            return true;
          return false;
        }
        return true;
      };
    },
huhaiqing's avatar
huhaiqing committed
123
  }, */
124
  methods: {
huhaiqing's avatar
huhaiqing committed
125
    /** 关闭弹窗 */
126
    closeDialog(type) {
huhaiiqng's avatar
huhaiiqng committed
127
      this.$set(this.dialogConfig, "dialogVisible", false);
128 129 130
      if (type === "submit") {
        this.$emit("getBoxInfo");
      }
huhaiiqng's avatar
huhaiiqng committed
131
    },
huhaiqing's avatar
huhaiqing committed
132
    /** 节点点击 */
huhaiqing's avatar
huhaiqing committed
133
    nodeClick(currIndex, node) {
huhaiqing's avatar
huhaiqing committed
134
      if (currIndex > this.currIndex) {
135
        this.$message.error(this.$t("请先完成上一步"));
huhaiqing's avatar
huhaiqing committed
136
        return;
huhaiqing's avatar
huhaiqing committed
137
      }
138
      this.currNode = node;
huhaiqing's avatar
huhaiqing committed
139 140
      this.currentComponent = `${node.type}Widget`;
      this.$set(this.dialogConfig, "width", "500px");
huhaiqing's avatar
huhaiqing committed
141
      this.$set(this.dialogConfig, "title", node.title);
huhaiqing's avatar
huhaiqing committed
142
      this.$set(this.dialogConfig, "fullscreen", false);
huhaiiqng's avatar
huhaiiqng committed
143
      switch (node.type) {
huhaiqing's avatar
huhaiqing committed
144
        // 订舱
huhaiiqng's avatar
huhaiiqng committed
145
        case "booking":
huhaiqing's avatar
huhaiqing committed
146 147
        // 驳船
        case "barge":
huhaiqing's avatar
huhaiqing committed
148
        // 清关文件
huhaiqing's avatar
huhaiqing committed
149
        case "clrDocument":
huhaiqing's avatar
huhaiqing committed
150
          this.$set(this.dialogConfig, "width", "700px");
huhaiiqng's avatar
huhaiiqng committed
151
          break;
huhaiqing's avatar
huhaiqing committed
152
        // AGENT
huhaiiqng's avatar
huhaiiqng committed
153
        case "agent":
154
          this.$set(this.dialogConfig, "title", this.$t("代理商设置"));
huhaiqing's avatar
huhaiqing committed
155
          break;
156 157 158 159
        // 理货
        case "tally":
          this.$set(this.dialogConfig, "fullscreen", true);
          break;
huhaiqing's avatar
huhaiqing committed
160
        // 预装
huhaiiqng's avatar
huhaiiqng committed
161
        case "preinstall":
huhaiqing's avatar
huhaiqing committed
162
          // 预装反审
163
          const preStatus = this.shipmentObj[node.keyName];
164
          if ([25].includes(preStatus)) {
165
            this.currentComponent = `reviewWidget`;
huhaiqing's avatar
huhaiqing committed
166
            this.$set(this.dialogConfig, "width", "700px");
167
            this.$set(this.dialogConfig, "title", this.$t("预装反审"));
huhaiqing's avatar
huhaiqing committed
168 169
          } else {
            this.$set(this.dialogConfig, "fullscreen", true);
170
            this.$set(this.dialogConfig, "title", this.$t("出货安排(预装)"));
huhaiqing's avatar
huhaiqing committed
171
          }
huhaiqing's avatar
huhaiqing committed
172 173 174 175 176 177 178 179 180 181
        // 装柜
        case "cabinet":
          // 装柜反审
          const cabStatus = this.shipmentObj[node.keyName];
          if ([47].includes(cabStatus)) {
            this.currentComponent = `reviewWidget`;
            this.$set(this.dialogConfig, "width", "700px");
            this.$set(this.dialogConfig, "title", this.$t("装柜反审"));
          }
          break;
182 183 184 185
        // 卸柜
        case "unloading":
          // 卸柜反审
          const unStatus = this.shipmentObj[node.keyName];
186
          if ([186].includes(unStatus)) {
187
            this.currentComponent = `reviewWidget`;
188
            this.$set(this.dialogConfig, "width", "700px");
189
            this.$set(this.dialogConfig, "title", this.$t("卸柜反审"));
190
          }
huhaiiqng's avatar
huhaiiqng committed
191 192
          break;
      }
huhaiqing's avatar
huhaiqing committed
193
      this.$set(this.dialogConfig, "dialogVisible", true);
194
    },
huhaiqing106's avatar
huhaiqing106 committed
195 196 197 198
    /* 获取图片路径 */
    getImgSrc(node) {
      return node.imgSrc[node.currStatus ?? "start"];
    },
199
  },
huhaiqing's avatar
huhaiqing committed
200
  watch: {
huhaiqing's avatar
huhaiqing committed
201
    /* 监听发货对象 */
huhaiqing's avatar
huhaiqing committed
202
    shipmentObj(val) {
203 204
      let newNodes = [],
        finish = 0;
huhaiqing106's avatar
huhaiqing106 committed
205
      // 迭代每个节点
huhaiqing's avatar
huhaiqing committed
206 207 208 209 210
      for (let i = 0; i < this.seaBaseData.length; i++) {
        const nodes = this.seaBaseData[i];
        let nodeIndex = 0;
        for (let j = 0; j < nodes.length; j++) {
          const node = nodes[j];
huhaiqing's avatar
huhaiqing committed
211 212
          const { keyName, voName, status, type } = node;

213
          // agent
huhaiqing's avatar
huhaiqing committed
214 215 216 217 218 219 220 221 222
          if (!keyName && type === "agent") {
            if (val[voName]) {
              // 已完成agent节点
              node.currStatus = "end";
              ++nodeIndex;
            }
            continue;
          }

huhaiqing106's avatar
huhaiqing106 committed
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
          const { start, wait, end } = status;

          if (start.includes(val[keyName])) {
            node.currStatus = "start";
          }

          if (start.includes(val[keyName]) && val[voName]) {
            node.currStatus = "wait";
          }

          if (wait.includes(val[keyName])) {
            node.currStatus = "wait";
          }

          if (end.includes(val[keyName])) {
            node.currStatus = "end";
huhaiqing's avatar
huhaiqing committed
239
            // 判断是否存在异常未处理
huhaiqing's avatar
huhaiqing committed
240
            if (
huhaiqing's avatar
huhaiqing committed
241 242 243
              (type === "cusDeclaration" && val.customsHasAbnormal) ||
              (type === "departure" && val.shippingHasAbnormal) ||
              (type === "arrival" && val.arrivalHasAbnormal)
huhaiqing's avatar
huhaiqing committed
244
            ) {
huhaiqing's avatar
huhaiqing committed
245 246
              continue;
            }
247 248 249 250 251 252 253 254 255 256 257 258 259 260
            // 报关
            if (type === "cusDeclaration") {
              const { dcCustomsStatus, dcCheckStatus } = val;
              // 查验状态并且是退场/部分退场
              if (dcCustomsStatus === 3 && [1, 2].includes(dcCheckStatus)) {
                // 只有审核通过并且已处理才算完成
                if (val.checkExamineStatus === 2 && val.checkDealStatus === 1) {
                  // 已完成节点个数
                  ++nodeIndex;
                } else {
                  continue;
                }
              }
            }
huhaiqing's avatar
huhaiqing committed
261 262
            // 已完成节点个数
            ++nodeIndex;
huhaiqing106's avatar
huhaiqing106 committed
263 264
          }
        }
huhaiqing's avatar
huhaiqing committed
265
        // 如果相等标识该步骤已完成
huhaiqing's avatar
huhaiqing committed
266 267
        if (nodeIndex === nodes.length) {
          // 加1表示为已完成步骤后一步
268
          finish = finish + 1;
huhaiqing's avatar
huhaiqing committed
269
        }
huhaiqing's avatar
huhaiqing committed
270
        newNodes.push(nodes);
huhaiqing106's avatar
huhaiqing106 committed
271
      }
272
      this.currIndex = finish;
huhaiqing's avatar
huhaiqing committed
273
      this.processData = newNodes;
huhaiqing's avatar
huhaiqing committed
274 275
    },
  },
276 277 278
};
</script>

huhaiiqng's avatar
huhaiiqng committed
279
<style lang="scss">
huhaiqing106's avatar
huhaiqing106 committed
280 281
.app-seaProcess {
  .shipping-chart {
282
    display: flex;
283
    padding: 10px 10px;
huhaiqing's avatar
huhaiqing committed
284 285
    min-width: 1300px;
    width: max-content;
286

huhaiqing106's avatar
huhaiqing106 committed
287
    .chart-nodes {
huhaiqing's avatar
huhaiqing committed
288 289
      display: flex;
      align-items: center;
huhaiqing106's avatar
huhaiqing106 committed
290 291 292 293 294
      justify-content: center;
      .node-area {
        display: flex;
        flex-direction: column;
        align-items: center;
huhaiqing's avatar
huhaiqing committed
295

huhaiqing106's avatar
huhaiqing106 committed
296
        .node-div {
huhaiqing's avatar
huhaiqing committed
297
          text-align: center;
huhaiqing106's avatar
huhaiqing106 committed
298 299 300 301 302 303 304
          margin-top: 10px;
          cursor: pointer;
          p {
            margin-top: -10px;
            margin-bottom: 0px;
            text-align: center;
          }
huhaiqing's avatar
huhaiqing committed
305
        }
huhaiiqng's avatar
huhaiiqng committed
306
      }
huhaiqing106's avatar
huhaiqing106 committed
307
      .arrow-area {
zhoutong's avatar
zhoutong committed
308
        margin: 0 6px;
huhaiqing106's avatar
huhaiqing106 committed
309
      }
huhaiqing's avatar
huhaiqing committed
310
    }
311 312 313
  }
}
</style>