From d25fa514db2c12fe085c92c487dfea77d6d18ca1 Mon Sep 17 00:00:00 2001 From: denghy Date: Wed, 6 Mar 2019 15:49:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=88=97=E8=A1=A8=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Real/Repositories/OrderRepository.php | 7 + app/Domains/Real/Services/OrderService.php | 4 +- app/Domains/Virtual/Services/OrderService.php | 2 +- app/Models/Real/Order.php | 2 +- app/Models/Virtual/Order.php | 1 + frontend/src/components/drawer/drawer.vue | 221 ++++++ frontend/src/components/drawer/index.js | 3 + frontend/src/components/table/table-body.vue | 8 - frontend/src/components/table/table.vue | 12 +- frontend/src/components/table/util.js | 2 +- frontend/src/mixins/emitter.js | 34 + frontend/src/mixins/mixins-scrollbar.js | 40 ++ frontend/src/store/module/order.js | 45 +- .../src/{components/table => utils}/assist.js | 0 .../src/{components/table => utils}/csv.js | 0 .../src/{components/table => utils}/dom.js | 0 frontend/src/utils/transfer-dom.js | 77 +++ frontend/src/views/virtual/orders/cards.vue | 16 +- frontend/src/views/virtual/orders/detail.vue | 2 +- frontend/src/views/virtual/orders/edit.vue | 7 +- frontend/src/views/virtual/orders/index.vue | 43 +- frontend/src/views/virtual/orders/js/cards.js | 131 ++-- frontend/src/views/virtual/orders/js/edit.js | 7 + frontend/src/views/virtual/orders/js/index.js | 622 ++++++++--------- .../src/views/virtual/orders/js/index.js.bak | 633 ++++++++++++++++++ frontend/vue.config.js | 2 +- 26 files changed, 1520 insertions(+), 401 deletions(-) create mode 100644 frontend/src/components/drawer/drawer.vue create mode 100644 frontend/src/components/drawer/index.js create mode 100755 frontend/src/mixins/emitter.js create mode 100644 frontend/src/mixins/mixins-scrollbar.js rename frontend/src/{components/table => utils}/assist.js (100%) rename frontend/src/{components/table => utils}/csv.js (100%) rename frontend/src/{components/table => utils}/dom.js (100%) create mode 100644 frontend/src/utils/transfer-dom.js create mode 100644 frontend/src/views/virtual/orders/js/index.js.bak diff --git a/app/Domains/Real/Repositories/OrderRepository.php b/app/Domains/Real/Repositories/OrderRepository.php index 50c1c4f9..d7869463 100644 --- a/app/Domains/Real/Repositories/OrderRepository.php +++ b/app/Domains/Real/Repositories/OrderRepository.php @@ -107,6 +107,13 @@ class OrderRepository extends Repository if (isset($conditions['endtime'])) { $query->where('order_at', '<=', Carbon::parse($conditions['endtime'])); } + + if (isset($conditions['used'])) { + $operator = $conditions['used'] ? '>' : '='; + $query->whereHas('cards', function ($relation) use ($conditions) { + $relation->withoutTrashed()->where('type', $conditions['type'])->where('virtual_order_id', '<>', 0); + }, $operator, 0); + } }); return $this; diff --git a/app/Domains/Real/Services/OrderService.php b/app/Domains/Real/Services/OrderService.php index 4d3d604f..36656c70 100644 --- a/app/Domains/Real/Services/OrderService.php +++ b/app/Domains/Real/Services/OrderService.php @@ -36,7 +36,9 @@ class OrderService extends Service $carrierOperators = app(Dicts::class)->get('carrier_operator'); - $res = $this->orderRepository->withConditions($conditions)->applyConditions()->paginate($limit); + $res = $this->orderRepository->withCount(['cards' => function ($query) { + $query->where('virtual_order_id', '<>', 0); + }])->withConditions($conditions)->applyConditions()->paginate($limit); $res->map(function ($item) use ($carrierOperators) { $item->pay_channel_name = CommonService::namePayChannel($item->pay_channel); diff --git a/app/Domains/Virtual/Services/OrderService.php b/app/Domains/Virtual/Services/OrderService.php index 7e6f9f2e..9c230245 100644 --- a/app/Domains/Virtual/Services/OrderService.php +++ b/app/Domains/Virtual/Services/OrderService.php @@ -134,7 +134,7 @@ class OrderService extends Service $attributes['product_id'] = $product->id; - $rule['required'][] = 'required'; + $rule['type'][] = 'required'; $rule['company_id'][] = 'required'; $rule['product_id'][] = 'required'; $rule['counts'][] = 'required'; diff --git a/app/Models/Real/Order.php b/app/Models/Real/Order.php index 60535741..f1e66dbf 100644 --- a/app/Models/Real/Order.php +++ b/app/Models/Real/Order.php @@ -68,6 +68,6 @@ class Order extends Model public function cards() { - return $this->belongsToMany(Card::class, 'real_order_cards', 'sim', 'sim'); + return $this->hasMany(OrderCardPartition::class, 'order_id', 'id'); } } diff --git a/app/Models/Virtual/Order.php b/app/Models/Virtual/Order.php index 2e71bb14..4cebc3a7 100644 --- a/app/Models/Virtual/Order.php +++ b/app/Models/Virtual/Order.php @@ -88,6 +88,7 @@ class Order extends Model protected $casts = [ 'extends' => 'array', + 'area' => 'array', ]; protected $fillable = [ diff --git a/frontend/src/components/drawer/drawer.vue b/frontend/src/components/drawer/drawer.vue new file mode 100644 index 00000000..cfee3dc2 --- /dev/null +++ b/frontend/src/components/drawer/drawer.vue @@ -0,0 +1,221 @@ + + diff --git a/frontend/src/components/drawer/index.js b/frontend/src/components/drawer/index.js new file mode 100644 index 00000000..78502917 --- /dev/null +++ b/frontend/src/components/drawer/index.js @@ -0,0 +1,3 @@ +import Drawer from './drawer.vue'; + +export default Drawer; \ No newline at end of file diff --git a/frontend/src/components/table/table-body.vue b/frontend/src/components/table/table-body.vue index 6dc5ad85..91ceab8e 100644 --- a/frontend/src/components/table/table-body.vue +++ b/frontend/src/components/table/table-body.vue @@ -235,11 +235,3 @@ export default { } }; - - - diff --git a/frontend/src/components/table/table.vue b/frontend/src/components/table/table.vue index f4d0394b..05834128 100644 --- a/frontend/src/components/table/table.vue +++ b/frontend/src/components/table/table.vue @@ -136,9 +136,9 @@ + + diff --git a/frontend/src/components/table/util.js b/frontend/src/components/table/util.js index c45d51a7..d1d5aa7c 100644 --- a/frontend/src/components/table/util.js +++ b/frontend/src/components/table/util.js @@ -1,4 +1,4 @@ -import { deepCopy } from './assist'; +import { deepCopy } from 'utils/assist'; const convertColumnOrder = (columns, fixedType) => { let list = []; diff --git a/frontend/src/mixins/emitter.js b/frontend/src/mixins/emitter.js new file mode 100755 index 00000000..e4bac478 --- /dev/null +++ b/frontend/src/mixins/emitter.js @@ -0,0 +1,34 @@ +function broadcast(componentName, eventName, params) { + this.$children.forEach(child => { + const name = child.$options.name; + + if (name === componentName) { + child.$emit.apply(child, [eventName].concat(params)); + } else { + // todo 如果 params 是空数组,接收到的会是 undefined + broadcast.apply(child, [componentName, eventName].concat([params])); + } + }); +} +export default { + methods: { + dispatch(componentName, eventName, params) { + let parent = this.$parent || this.$root; + let name = parent.$options.name; + + while (parent && (!name || name !== componentName)) { + parent = parent.$parent; + + if (parent) { + name = parent.$options.name; + } + } + if (parent) { + parent.$emit.apply(parent, [eventName].concat(params)); + } + }, + broadcast(componentName, eventName, params) { + broadcast.call(this, componentName, eventName, params); + } + } +}; \ No newline at end of file diff --git a/frontend/src/mixins/mixins-scrollbar.js b/frontend/src/mixins/mixins-scrollbar.js new file mode 100644 index 00000000..19df2e5d --- /dev/null +++ b/frontend/src/mixins/mixins-scrollbar.js @@ -0,0 +1,40 @@ +// used for Modal & $Spin & Drawer +import { getScrollBarSize } from 'utils/assist'; +export default { + methods: { + checkScrollBar () { + let fullWindowWidth = window.innerWidth; + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + const documentElementRect = document.documentElement.getBoundingClientRect(); + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left); + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth; + if (this.bodyIsOverflowing) { + this.scrollBarWidth = getScrollBarSize(); + } + }, + checkMaskInVisible () { + let masks = document.getElementsByClassName('ivu-modal-mask') || []; + return Array.from(masks).every(m => m.style.display === 'none' || m.classList.contains('fade-leave-to')); + }, + setScrollBar () { + if (this.bodyIsOverflowing && this.scrollBarWidth !== undefined) { + document.body.style.paddingRight = `${this.scrollBarWidth}px`; + } + }, + resetScrollBar () { + document.body.style.paddingRight = ''; + }, + addScrollEffect () { + this.checkScrollBar(); + this.setScrollBar(); + document.body.style.overflow = 'hidden'; + }, + removeScrollEffect() { + if (this.checkMaskInVisible()) { + document.body.style.overflow = ''; + this.resetScrollBar(); + } + } + } +}; diff --git a/frontend/src/store/module/order.js b/frontend/src/store/module/order.js index bae9627c..7b33b78e 100644 --- a/frontend/src/store/module/order.js +++ b/frontend/src/store/module/order.js @@ -4,7 +4,8 @@ const state = { real_orders: {}, cards: [], selected: [], - params: {} + orderParams: {}, + cardParams: {} }; const mutations = { @@ -17,17 +18,49 @@ const mutations = { SET_REAL_ORDER_SELECTED(state, data) { state.selected = data; }, - PUSH_REAL_ORDER_SELECTED(state, obj) { + PUSH_REAL_ORDER_SELECTED(state, { order_id, cards }) { + let obj = { id: order_id, cards }; state.selected.push(obj); }, - REMOVE_REAL_ORDER_SELECTED(state, orderId) { + REMOVE_REAL_ORDER_SELECTED(state, order_id) { let index = state.selected.findIndex(item => { - return item.id === orderId; + return item.id === order_id; }); if (index !== -1) { state.selected.splice(index, 1); } + }, + PUSH_CARD_SELECTED(state, { order_id, sim }) { + let select = state.selected.find(item => { + return item.id === order_id; + }); + + if (!select) { + state.selected.push({ id: order_id, cards: [sim] }); + } else { + select.cards.push(sim); + } + }, + REMOVE_CARD_SELECTED(state, { order_id, sim }) { + let select = state.selected.find(item => { + return item.id === order_id; + }); + + if (select) { + let index = select.cards.indexOf(sim); + + if (index !== -1) { + select.cards.splice(index, 1); + if (!select.cards.length) { + let i = state.selected.findIndex(item => { + return item.id === order_id; + }); + + state.selected.splice(i, 1); + } + } + } } }; @@ -41,11 +74,11 @@ const actions = { }, getCards(context, params) { return new Promise((resolve, reject) => { - if (JSON.stringify(this.params) == JSON.stringify(params)) { + if (JSON.stringify(this.cardParams) == JSON.stringify(params)) { return resolve(context.state.cards); } - this.params = params; + this.cardParams = params; API.cards(params).then(res => { if (res.code === 0) { diff --git a/frontend/src/components/table/assist.js b/frontend/src/utils/assist.js similarity index 100% rename from frontend/src/components/table/assist.js rename to frontend/src/utils/assist.js diff --git a/frontend/src/components/table/csv.js b/frontend/src/utils/csv.js similarity index 100% rename from frontend/src/components/table/csv.js rename to frontend/src/utils/csv.js diff --git a/frontend/src/components/table/dom.js b/frontend/src/utils/dom.js similarity index 100% rename from frontend/src/components/table/dom.js rename to frontend/src/utils/dom.js diff --git a/frontend/src/utils/transfer-dom.js b/frontend/src/utils/transfer-dom.js new file mode 100644 index 00000000..6c2a0cf0 --- /dev/null +++ b/frontend/src/utils/transfer-dom.js @@ -0,0 +1,77 @@ +// Thanks to: https://github.com/airyland/vux/blob/v2/src/directives/transfer-dom/index.js +// Thanks to: https://github.com/calebroseland/vue-dom-portal + +/** + * Get target DOM Node + * @param {(Node|string|Boolean)} [node=document.body] DOM Node, CSS selector, or Boolean + * @return {Node} The target that the el will be appended to + */ +function getTarget (node) { + if (node === void 0) { + node = document.body + } + if (node === true) { return document.body } + return node instanceof window.Node ? node : document.querySelector(node) +} + +const directive = { + inserted (el, { value }, vnode) { + if ( el.dataset && el.dataset.transfer !== 'true') return false; + el.className = el.className ? el.className + ' v-transfer-dom' : 'v-transfer-dom'; + const parentNode = el.parentNode; + if (!parentNode) return; + const home = document.createComment(''); + let hasMovedOut = false; + + if (value !== false) { + parentNode.replaceChild(home, el); // moving out, el is no longer in the document + getTarget(value).appendChild(el); // moving into new place + hasMovedOut = true + } + if (!el.__transferDomData) { + el.__transferDomData = { + parentNode: parentNode, + home: home, + target: getTarget(value), + hasMovedOut: hasMovedOut + } + } + }, + componentUpdated (el, { value }) { + if ( el.dataset && el.dataset.transfer !== 'true') return false; + // need to make sure children are done updating (vs. `update`) + const ref$1 = el.__transferDomData; + if (!ref$1) return; + // homes.get(el) + const parentNode = ref$1.parentNode; + const home = ref$1.home; + const hasMovedOut = ref$1.hasMovedOut; // recall where home is + + if (!hasMovedOut && value) { + // remove from document and leave placeholder + parentNode.replaceChild(home, el); + // append to target + getTarget(value).appendChild(el); + el.__transferDomData = Object.assign({}, el.__transferDomData, { hasMovedOut: true, target: getTarget(value) }); + } else if (hasMovedOut && value === false) { + // previously moved, coming back home + parentNode.replaceChild(el, home); + el.__transferDomData = Object.assign({}, el.__transferDomData, { hasMovedOut: false, target: getTarget(value) }); + } else if (value) { + // already moved, going somewhere else + getTarget(value).appendChild(el); + } + }, + unbind (el) { + if (el.dataset && el.dataset.transfer !== 'true') return false; + el.className = el.className.replace('v-transfer-dom', ''); + const ref$1 = el.__transferDomData; + if (!ref$1) return; + if (el.__transferDomData.hasMovedOut === true) { + el.__transferDomData.parentNode && el.__transferDomData.parentNode.appendChild(el) + } + el.__transferDomData = null + } +}; + +export default directive; \ No newline at end of file diff --git a/frontend/src/views/virtual/orders/cards.vue b/frontend/src/views/virtual/orders/cards.vue index 85f766a4..38b8180d 100644 --- a/frontend/src/views/virtual/orders/cards.vue +++ b/frontend/src/views/virtual/orders/cards.vue @@ -1,11 +1,12 @@ @@ -154,7 +160,7 @@ } >>> .ivu-table { - font-size: 11px; + font-size: 12px; } diff --git a/frontend/src/views/virtual/orders/detail.vue b/frontend/src/views/virtual/orders/detail.vue index fc613fdd..56160b5f 100644 --- a/frontend/src/views/virtual/orders/detail.vue +++ b/frontend/src/views/virtual/orders/detail.vue @@ -92,7 +92,7 @@