order-action.js 6.57 KB
/* eslint-disable operator-linebreak */
/* eslint-disable space-before-function-paren */
import { orderActionsMap, ownType } from 'constants/order-constants';
import { createNamespacedHelpers } from 'vuex';
import DialogConfirmInfo from '../components/dialog-confirm-info';

const { mapActions, mapMutations } = createNamespacedHelpers('order/orderList');

export default {
  data() {
    return {
      // 求购调价
      changePrice: 0,
    };
  },
  methods: {
    ...mapActions([
      'cancelTradeConfirmInfo',
      'cancelTrade',
      'deleteOrder',
      'computeChangePrice',
      'confirmChangePrice',
    ]),
    ...mapMutations(['filterOrderList', 'resetData']),

    async onAction({ action, order, isDetail = false } = {}) {
      const { owner = ownType.SELL } = this.$route.params;
      const {
        orderCode,
        realPrice = '',
        bidDepositInfo = {},
        goodsInfo = {},
        priceInfo = {},
      } = order;

      switch (action.name) {
        case orderActionsMap.DEL_ORDER.name:
          this.$createConfirmDialog({
            content: '确认删除订单?',
            confirmBtn: { style: { color: '#D0021B' } },
            cancelBtn: { active: true },
            onConfirm: async () => {
              const isOk = await this.deleteOrder({
                orderCode,
                owner,
              });

              if (isOk) {
                if (isDetail) {
                  this.$router.back();
                } else {
                  this.filterOrderList(orderCode);
                }
              }
              const txt = isOk ? '删除成功' : '删除失败';

              this.$createToast({ txt, type: 'txt' }).show();
            },
          }).show();
          break;

        case orderActionsMap.CANCEL_ORDER.name: {
          let confirmInfo = await this.cancelTradeConfirmInfo({
            orderCode,
            owner,
          });

          if (Array.isArray(confirmInfo)) {
            confirmInfo = { confirmDesc: '确定取消求购' };
          }

          const confirmBtnText = confirmInfo.needPenalty
            ? '赔付并取消订单'
            : '取消订单';

          this.$createConfirmDialog(
            {
              confirmBtn: { text: confirmBtnText, style: { color: '#D0021B' } },
              cancelBtn: { text: '保留订单', active: true },
              onConfirm: async () => {
                const isOk = await this.cancelTrade({
                  orderCode,
                  owner,
                });

                if (isOk) {
                  if (isDetail) {
                    this.fetchOrderDetail(this.$route.params);
                  } else {
                    this.resetData(this.$route.params);
                    this.fetchData(this.$route.params);
                  }
                }
                const txt = isOk ? '取消成功' : '取消失败';

                this.$createToast({ txt, type: 'txt' }).show();
              },
            },
            createElement => {
              return [
                createElement(DialogConfirmInfo, {
                  props: { info: confirmInfo },
                  slot: 'content',
                }),
              ];
            },
          ).show();
          break;
        }

        case orderActionsMap.NOW_BUY.name: {
          let price = realPrice,
            pageBackName = 'OrderList';

          if (isDetail) {
            price = priceInfo.realPayPrice;
            pageBackName = 'buyOrderDetail';
          }
          this.$createOrderPayType({
            orderCode,
            price: parseFloat(price || ''),
            desc: '',
            extra: JSON.stringify({
              back: {
                name: pageBackName,
                params: {
                  owner,
                  orderCode,
                },
              },
            }),
          }).show();
          break;
        }

        case orderActionsMap.PAY_DEPOSIT.name: {
          this.$createOrderPayType({
            orderCode,
            price: parseFloat(bidDepositInfo.depositAmount),
            desc: '支付定金',
            extra: JSON.stringify({
              forward: {
                name: 'OrderList',
                params: {
                  owner: 'buy',
                },
              },
            }),
          }).show();
          break;
        }

        case orderActionsMap.CONFIRM_DELIVERY.name: {
          this.$createConfirmDialog({
            content: '确认收货?',
            confirmBtn: { style: { color: '#D0021B' } },
            cancelBtn: { active: true },
            onConfirm: async () => {
              const isOk = await this.confirmReceipt({
                orderCode,
                owner,
              });

              if (isOk) {
                if (isDetail) {
                  this.fetchOrderDetail(this.$route.params);
                } else {
                  this.resetData(this.$route.params);
                  this.fetchData(this.$route.params);
                }
              }
            },
          }).show();
          break;
        }

        case orderActionsMap.CHANGE_BID_PRICE.name: {
          const { goodPrice } = goodsInfo;
          const { code, message, data } = await this.computeChangePrice({
            orderCode,
            price: goodPrice,
          });

          let isStr = false;

          if (code !== 200) {
            isStr = true;
            this.$createToast({
              type: 'alert',
              txt: message,
              mask: true,
            }).show();

            // 有未完成调价
            if (code === 401) {
              return;
            }
          }
          let that = this;

          this.$createChangeBidPriceDialog({
            computePriceInfo: isStr ? { promotionFormulaList: [] } : data,
            goodsInfo,
            orderCode,
            onCloseAction() {},
            onConfirmAction: async price => {
              const { isOk, errMsg = '' } = await that.confirmChangePrice({
                price: price,
                orderCode,
              });

              if (isOk) {
                if (isDetail) {
                  that.$router.back();
                } else {
                  that.resetData(this.$route.params);
                  that.fetchData(this.$route.params);
                }
              } else {
                if (errMsg) {
                  that.$createToast({
                    type: 'alert',
                    txt: errMsg,
                  });
                }
              }
            },
          }).show();
          break;
        }
        default:
          return;
      }
    },
  },
};