Система управления складом
by Isabella
Складская логистика.
О чем мы будем говорить?
- о современных и не очень технологиях и оборудовании, техники; об их плюсах и минусах не только физических, но и тех, которые влияют на затраты (стоимость складской обработки)
- адресное хранение, инвентарный контроль, управление очередью, управление задачами работников и другие моменты, которые, как показывает опыт, вы можете сами создать у себя (аналог WMS). Но если решитесь покупать, то будете понимать, как это должно работать, что необходимо требовать при внедрении и как сформулировать ваши "хотелки";
- как организовать работу персонала, мотивировать их и вовлечь в работу.
Оформить заявку >>>
Бизнес-программа:
Технологии складов
- Технологии комплектации заказов
- Информационное обеспечение работников склада
- Помещения складов – специфика их подбора
- Размещения стеллажного оборудования
- Полезный объем и площадь склада
- Техника: ее потребность, ограничения при использовании
- Паспорт склада
ИТ обеспечение складских процессов
- Эволюция вашей ИТ системы управления складом:
Практический кейс:
- зарождение: постановка натурального учета ТМЦ
- адресная система и эволюция к оптимизации маршрутов
- перерождение адресной системы
- IMS: управление остатками в ячейках
- управление ресурсами
- WMS: динамическое планирование ресурсов
Адресное хранения и управление топологией
- Задачи, решаемые при адресном хранении
Практический кейс:
- Ячейки и ее параметры
- Физическое выделение ячейки
- Стандартная ячейка или индивидуальный размер
- Учет остатков товаров по каждой ячейке хранения
- Топология ячеек (Планограмма)
Приемка ТМЦ на склад и размещение на складе
- Какие задачи мы ставим перед сотрудниками приемки
- Качественно и быстро
- Практический кейс: источники ошибок при приемке и практические методы их устранения
- Ошибка идентификации
- Сроки годности и/или партии
- Внутритарные недовложения
- Весовой товар: проблема усреднения веса одного грузового места
- Размещение на складе: актуальность весогабаритных характеристик
Комплектация заказов:
- Скорость, качество и стоимость
- Какие метрики лучше использовать
- Picking Практические аспекты внедрения
- формирование маршрутов сборки для оптимизации пробегов
- когда АВС расположения товаров наносит вред и как не допустить данных ошибок
- проблема корректной мотивации на производительность: «за что платим, то и наработаем»
- управление электронной очередью
Контроль комплектации:
- Дилемма: контроль при комплектации или проверка позже
- Практические аспекты: о причинах возникновения ошибок при комплектации
- Цена ошибки и цена контроля
- Пару слов о недобросовестных контрагентах
- О практических методах контроля
- Упаковочный лист
Отгрузка заказов:
- Упаковка и размещение в транспортном средстве
- Практические аспекты: как мы учили обматывать паллеты
- Практические аспекты: учимся играть в Тетрис или о качестве сборки паллеты
- Практические аспекты: грузовые места и их контроль
- Взаимодействием с водителем-экспедитором.
Инвентарный контроль: как организовать его, чтобы он был эффективен
- В чем важность регулярного инвентарного контроля на складе
- Инвентарный контроль и дополнительные задачи
- Практический кейс: Организация инвентарного контроля без адресной системы хранения
Складской персонал:
- Пару слов о текущей ситуации с персоналом для складов
- Управление загрузкой персонала и справедливой оплатой
- Компетенции работников склада
- Адаптация и аттестация персонала
- Мотивация и стимуляция их отличие
- 12 мотивационных факторов
- Материальное и нематериальное поощрение
- Организация коллективной/бригадной работы
- Роль руководителя подразделения на общую мотивацию коллектива
Расходные материалы на складе: учет, нормирование, контроль эффективного использования.
- Упаковочные материалы и их учет при работе склада
- Нормированный учет, учет по использованию
- Практический кейс: автоматическое списание стрейтч пленки
Работа с оборотной тарой
- Особенности учета и организации возврата (паллеты, ящики, в т.ч. гофро)
- Возвращать, восстанавливать и другие методы оптимизации затрат на возвратную тару. Цена вопроса.
Оформить заявку >>>
Если у Вас будут возникать какие-либо вопросы, Вы всегда сможете обратиться в Службу Поддержки, мы будем рады помочь. Не забудьте подписаться на наши PUSH и соц сети, там Вы сможете найти много интересной и полезной информации.
Желаем Вам успехов и надеемся на будущее взаимовыгодное сотрудничество.
Менеджмент
Интернет
Недвижимость
Отказаться от подписки.
List-Unsubscribe или пожаловаться на Spam
2 years, 9 months
[GIT PULL] libnvdimm fixes for v5.4-rc1
by Dan Williams
Hi Linus, please pull from:
git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm
tags/libnvdimm-fixes-5.4-rc1
...to receive the completion of the work to fixup libnvdimm operation
on powerpc as well as a collection of typical -rc class fixes. This
powerpc work missed the initial libnvdimm pull last week due to a late
discovered compile breakage (missing symbol export), but it's all
fixed up now, and has appeared in -next releases over the past week
with no issues. The touch of arch/powerpc/ has an ack from Michael.
---
The following changes since commit 5b26db95fee3f1ce0d096b2de0ac6f3716171093:
libnvdimm: Use PAGE_SIZE instead of SZ_4K for align check
(2019-09-05 16:11:14 -0700)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm
tags/libnvdimm-fixes-5.4-rc1
for you to fetch changes up to 4c806b897d6075bfa5067e524fb058c57ab64e7b:
libnvdimm/region: Enable MAP_SYNC for volatile regions (2019-09-24
10:33:19 -0700)
----------------------------------------------------------------
libnvdimm fixes v5.4-rc1
- Complete the reworks to interoperate with powerpc dynamic huge page sizes
- Fix a crash due to missed accounting for the powerpc 'struct
page'-memmap mapping granularity.
- Fix badblock initialization for volatile (DRAM emulated) pmem ranges.
- Stop triggering request_key() notifications to userspace when
NVDIMM-security is disabled / not present.
- Miscellaneous small fixups.
----------------------------------------------------------------
Aneesh Kumar K.V (6):
powerpc/book3s64: Export has_transparent_hugepage() related functions.
libnvdimm/dax: Pick the right alignment default when creating dax devices
libnvdimm: Fix endian conversion issues
libnvdimm/altmap: Track namespace boundaries in altmap
libnvdimm/region: Initialize bad block for volatile namespaces
libnvdimm/region: Enable MAP_SYNC for volatile regions
Dave Jiang (1):
libnvdimm: prevent nvdimm from requesting key when security is disabled
Nathan Chancellor (1):
libnvdimm/nfit_test: Fix acpi_handle redefinition
arch/powerpc/include/asm/book3s/64/radix.h | 8 +++-
arch/powerpc/mm/book3s64/hash_pgtable.c | 2 +
arch/powerpc/mm/book3s64/radix_pgtable.c | 7 ---
arch/powerpc/mm/init_64.c | 17 ++++++-
drivers/nvdimm/btt.c | 8 ++--
drivers/nvdimm/bus.c | 2 +-
drivers/nvdimm/namespace_devs.c | 7 +--
drivers/nvdimm/nd.h | 6 +--
drivers/nvdimm/pfn_devs.c | 77 ++++++++++++++++++++++--------
drivers/nvdimm/region.c | 4 +-
drivers/nvdimm/region_devs.c | 7 ++-
drivers/nvdimm/security.c | 4 ++
include/linux/huge_mm.h | 7 ++-
include/linux/memremap.h | 1 +
tools/testing/nvdimm/test/nfit_test.h | 4 +-
15 files changed, 110 insertions(+), 51 deletions(-)
2 years, 9 months
[RFC PATCH 1/2] libnvdimm/nsio: differentiate between probe mapping and runtime mapping
by Aneesh Kumar K.V
nvdimm core currently maps the full namespace to an ioremap range
while probing the namespace mode. This can result in probe failures
on architectures that have limited ioremap space.
nvdimm core can avoid this failure by only mapping the reserver block area to
check for pfn superblock type and map the full namespace resource only before
using the namespace. nvdimm core use ioremap range only for the raw and btt
namespace and we can limit the max namespace size for these two modes. For
both fsdax and devdax this change enables nvdimm to map namespace larger
that ioremap limit.
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar(a)linux.ibm.com>
---
drivers/nvdimm/blk.c | 2 +-
drivers/nvdimm/btt.c | 13 ++++++++++++-
drivers/nvdimm/claim.c | 2 +-
drivers/nvdimm/nd.h | 2 +-
drivers/nvdimm/pfn.h | 6 ++++++
drivers/nvdimm/pfn_devs.c | 5 -----
drivers/nvdimm/pmem.c | 2 +-
7 files changed, 22 insertions(+), 10 deletions(-)
diff --git a/drivers/nvdimm/blk.c b/drivers/nvdimm/blk.c
index 677d6f45b5c4..755192332269 100644
--- a/drivers/nvdimm/blk.c
+++ b/drivers/nvdimm/blk.c
@@ -302,7 +302,7 @@ static int nd_blk_probe(struct device *dev)
ndns->rw_bytes = nsblk_rw_bytes;
if (is_nd_btt(dev))
- return nvdimm_namespace_attach_btt(ndns);
+ return nvdimm_namespace_attach_btt(dev, ndns);
else if (nd_btt_probe(dev, ndns) == 0) {
/* we'll come back as btt-blk */
return -ENXIO;
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index a8d56887ec88..45717e891ff6 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1668,9 +1668,12 @@ static void btt_fini(struct btt *btt)
}
}
-int nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns)
+int nvdimm_namespace_attach_btt(struct device *dev,
+ struct nd_namespace_common *ndns)
{
+ struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev);
struct nd_btt *nd_btt = to_nd_btt(ndns->claim);
+ struct resource *res = &nsio->res;
struct nd_region *nd_region;
struct btt_sb *btt_sb;
struct btt *btt;
@@ -1685,6 +1688,14 @@ int nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns)
if (!btt_sb)
return -ENOMEM;
+ /*
+ * Remove the old mapping and do the full mapping.
+ */
+ devm_memunmap(dev, nsio->addr);
+ nsio->addr = devm_memremap(dev, res->start, resource_size(res),
+ ARCH_MEMREMAP_PMEM);
+ if (IS_ERR(nsio->addr))
+ return -ENXIO;
/*
* If this returns < 0, that is ok as it just means there wasn't
* an existing BTT, and we're creating a new one. We still need to
diff --git a/drivers/nvdimm/claim.c b/drivers/nvdimm/claim.c
index 2985ca949912..9f2e6646fcd4 100644
--- a/drivers/nvdimm/claim.c
+++ b/drivers/nvdimm/claim.c
@@ -318,7 +318,7 @@ int devm_nsio_enable(struct device *dev, struct nd_namespace_io *nsio)
nvdimm_badblocks_populate(to_nd_region(ndns->dev.parent), &nsio->bb,
&nsio->res);
- nsio->addr = devm_memremap(dev, res->start, resource_size(res),
+ nsio->addr = devm_memremap(dev, res->start, info_block_reserve(),
ARCH_MEMREMAP_PMEM);
return PTR_ERR_OR_ZERO(nsio->addr);
diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h
index e89af4b2d8e9..cad05a40a009 100644
--- a/drivers/nvdimm/nd.h
+++ b/drivers/nvdimm/nd.h
@@ -367,7 +367,7 @@ struct resource *nvdimm_allocate_dpa(struct nvdimm_drvdata *ndd,
resource_size_t nvdimm_namespace_capacity(struct nd_namespace_common *ndns);
bool nvdimm_namespace_locked(struct nd_namespace_common *ndns);
struct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev);
-int nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns);
+int nvdimm_namespace_attach_btt(struct device *dev, struct nd_namespace_common *ndns);
int nvdimm_namespace_detach_btt(struct nd_btt *nd_btt);
const char *nvdimm_namespace_disk_name(struct nd_namespace_common *ndns,
char *name);
diff --git a/drivers/nvdimm/pfn.h b/drivers/nvdimm/pfn.h
index acb19517f678..f4856c87d01c 100644
--- a/drivers/nvdimm/pfn.h
+++ b/drivers/nvdimm/pfn.h
@@ -36,4 +36,10 @@ struct nd_pfn_sb {
__le64 checksum;
};
+static inline u32 info_block_reserve(void)
+{
+ return ALIGN(SZ_8K, PAGE_SIZE);
+}
+
+
#endif /* __NVDIMM_PFN_H */
diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c
index bb9cc5cf0873..9205825931f3 100644
--- a/drivers/nvdimm/pfn_devs.c
+++ b/drivers/nvdimm/pfn_devs.c
@@ -602,11 +602,6 @@ int nd_pfn_probe(struct device *dev, struct nd_namespace_common *ndns)
}
EXPORT_SYMBOL(nd_pfn_probe);
-static u32 info_block_reserve(void)
-{
- return ALIGN(SZ_8K, PAGE_SIZE);
-}
-
/*
* We hotplug memory at sub-section granularity, pad the reserved area
* from the previous section base to the namespace base address.
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index f9f76f6ba07b..69956e49ec56 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -501,7 +501,7 @@ static int nd_pmem_probe(struct device *dev)
return -ENXIO;
if (is_nd_btt(dev))
- return nvdimm_namespace_attach_btt(ndns);
+ return nvdimm_namespace_attach_btt(dev, ndns);
if (is_nd_pfn(dev))
return pmem_attach_disk(dev, ndns);
--
2.21.0
2 years, 9 months
I want you. Write me
by badia@beverlyheels.com
Whazzap sweet. I’ve seen, found your picture gallery and loved your sexy body so much. I can not stop thinking of u . I want to know you more. Find my gorgeous photos on that website
2 years, 9 months
I want to find true happiness - I want love!
by adamasjuior@gotmail.com
Dear,
It's a beautiful day and i'am in a hurry to get in touch with you asap!
My name is Sevgi, and I'm from Turkey.
I really do believe in a destiny with a bright future for myself and that you could become a part of it become my true soulmate.
I do want to be next to a loving man.
I love traveling, movies, pop music, seafood, and doing crazy things, but i feel like loneliness is swallowing me intensely lonely sometimes.
I wish to find for my second half, who a man that will give me a real hope and true love!
Hope you're interested in becoming a part of my adventure and will reply back soon.
Please write me back using my personal email: r_oken(a)aol.com
Your true soul,
Sevgi.
2 years, 9 months
[PATCH 1/2] mm/memunmap: Use the correct start and end pfn when removing pages from zone
by Aneesh Kumar K.V
With altmap, all the resource pfns are not initialized. While initializing
pfn, altmap reserve space is skipped. Hence when removing pfn from zone skip
pfns that were never initialized.
Update memunmap_pages to calculate start and end pfn based on altmap
values. This fixes a kernel crash that is observed when destroying namespace.
[ 74.745056] BUG: Unable to handle kernel data access at 0xc00c000001400000
[ 74.745256] Faulting instruction address: 0xc0000000000b58b0
cpu 0x2: Vector: 300 (Data Access) at [c00000026ea93580]
pc: c0000000000b58b0: memset+0x68/0x104
lr: c0000000003eb008: page_init_poison+0x38/0x50
...
current = 0xc000000271c67d80
paca = 0xc00000003fffd680 irqmask: 0x03 irq_happened: 0x01
pid = 3665, comm = ndctl
[link register ] c0000000003eb008 page_init_poison+0x38/0x50
[c00000026ea93830] c0000000004754d4 remove_pfn_range_from_zone+0x64/0x3e0
[c00000026ea938a0] c0000000004b8a60 memunmap_pages+0x300/0x400
[c00000026ea93930] c0000000009e32a0 devm_action_release+0x30/0x50
...
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar(a)linux.ibm.com>
---
mm/memremap.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/mm/memremap.c b/mm/memremap.c
index 390bb3544589..76b98110031e 100644
--- a/mm/memremap.c
+++ b/mm/memremap.c
@@ -113,7 +113,8 @@ static void dev_pagemap_cleanup(struct dev_pagemap *pgmap)
void memunmap_pages(struct dev_pagemap *pgmap)
{
struct resource *res = &pgmap->res;
- unsigned long pfn = PHYS_PFN(res->start);
+ unsigned long start_pfn, end_pfn;
+ unsigned long pfn, nr_pages;
int nid;
dev_pagemap_kill(pgmap);
@@ -121,14 +122,18 @@ void memunmap_pages(struct dev_pagemap *pgmap)
put_page(pfn_to_page(pfn));
dev_pagemap_cleanup(pgmap);
+ start_pfn = pfn_first(pgmap);
+ end_pfn = pfn_end(pgmap);
+ nr_pages = end_pfn - start_pfn;
+
/* pages are dead and unused, undo the arch mapping */
- nid = page_to_nid(pfn_to_page(pfn));
+ nid = page_to_nid(pfn_to_page(start_pfn));
mem_hotplug_begin();
- remove_pfn_range_from_zone(page_zone(pfn_to_page(pfn)), pfn,
- PHYS_PFN(resource_size(res)));
+ remove_pfn_range_from_zone(page_zone(pfn_to_page(start_pfn)),
+ start_pfn, nr_pages);
if (pgmap->type == MEMORY_DEVICE_PRIVATE) {
- __remove_pages(pfn, PHYS_PFN(resource_size(res)), NULL);
+ __remove_pages(start_pfn, nr_pages, NULL);
} else {
arch_remove_memory(nid, res->start, resource_size(res),
pgmap_altmap(pgmap));
--
2.21.0
2 years, 9 months
[PATCH V3] libnvdimm/namsepace: Don't set claim_class on error
by ira.weiny@intel.com
From: Ira Weiny <ira.weiny(a)intel.com>
Don't leave claim_class set to an invalid value if an error occurs in
btt_claim_class().
While we are here change the return type of __holder_class_store() to be
clear about the values it is returning.
This was found via code inspection.
Reported-by: Dan Carpenter <dan.carpenter(a)oracle.com>
Reviewed-by: Vishal Verma <vishal.l.verma(a)intel.com>
Signed-off-by: Ira Weiny <ira.weiny(a)intel.com>
---
V1->V2
Add space after variable declaration...
V2->V3
Fix oneliner
Rebase without Dan Carpenter's patch and give him Reported-by
credit
drivers/nvdimm/namespace_devs.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
index a16e52251a30..eef885c59f47 100644
--- a/drivers/nvdimm/namespace_devs.c
+++ b/drivers/nvdimm/namespace_devs.c
@@ -1510,16 +1510,20 @@ static ssize_t holder_show(struct device *dev,
}
static DEVICE_ATTR_RO(holder);
-static ssize_t __holder_class_store(struct device *dev, const char *buf)
+static int __holder_class_store(struct device *dev, const char *buf)
{
struct nd_namespace_common *ndns = to_ndns(dev);
if (dev->driver || ndns->claim)
return -EBUSY;
- if (sysfs_streq(buf, "btt"))
- ndns->claim_class = btt_claim_class(dev);
- else if (sysfs_streq(buf, "pfn"))
+ if (sysfs_streq(buf, "btt")) {
+ int rc = btt_claim_class(dev);
+
+ if (rc < NVDIMM_CCLASS_NONE)
+ return rc;
+ ndns->claim_class = rc;
+ } else if (sysfs_streq(buf, "pfn"))
ndns->claim_class = NVDIMM_CCLASS_PFN;
else if (sysfs_streq(buf, "dax"))
ndns->claim_class = NVDIMM_CCLASS_DAX;
@@ -1528,10 +1532,6 @@ static ssize_t __holder_class_store(struct device *dev, const char *buf)
else
return -EINVAL;
- /* btt_claim_class() could've returned an error */
- if (ndns->claim_class < 0)
- return ndns->claim_class;
-
return 0;
}
@@ -1539,7 +1539,7 @@ static ssize_t holder_class_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t len)
{
struct nd_region *nd_region = to_nd_region(dev->parent);
- ssize_t rc;
+ int rc;
nd_device_lock(dev);
nvdimm_bus_lock(dev);
@@ -1547,7 +1547,7 @@ static ssize_t holder_class_store(struct device *dev,
rc = __holder_class_store(dev, buf);
if (rc >= 0)
rc = nd_namespace_label_update(nd_region, dev);
- dev_dbg(dev, "%s(%zd)\n", rc < 0 ? "fail " : "", rc);
+ dev_dbg(dev, "%s(%d)\n", rc < 0 ? "fail " : "", rc);
nvdimm_bus_unlock(dev);
nd_device_unlock(dev);
--
2.20.1
2 years, 9 months
[PATCH] bnvdimm/namsepace: Don't set claim_class on error
by ira.weiny@intel.com
From: Ira Weiny <ira.weiny(a)intel.com>
Don't leave claim_class set to an invalid value if an error occurs in
btt_claim_class().
While we are here change the return type of __holder_class_store() to be
clear about the values it is returning.
This was found via code inspection.
Signed-off-by: Ira Weiny <ira.weiny(a)intel.com>
---
drivers/nvdimm/namespace_devs.c | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
index 5b22cecefc99..a020c166e1e7 100644
--- a/drivers/nvdimm/namespace_devs.c
+++ b/drivers/nvdimm/namespace_devs.c
@@ -1510,16 +1510,19 @@ static ssize_t holder_show(struct device *dev,
}
static DEVICE_ATTR_RO(holder);
-static ssize_t __holder_class_store(struct device *dev, const char *buf)
+static int __holder_class_store(struct device *dev, const char *buf)
{
struct nd_namespace_common *ndns = to_ndns(dev);
if (dev->driver || ndns->claim)
return -EBUSY;
- if (sysfs_streq(buf, "btt"))
- ndns->claim_class = btt_claim_class(dev);
- else if (sysfs_streq(buf, "pfn"))
+ if (sysfs_streq(buf, "btt")) {
+ int rc = btt_claim_class(dev);
+ if (rc < NVDIMM_CCLASS_NONE)
+ return rc;
+ ndns->claim_class = rc;
+ } else if (sysfs_streq(buf, "pfn"))
ndns->claim_class = NVDIMM_CCLASS_PFN;
else if (sysfs_streq(buf, "dax"))
ndns->claim_class = NVDIMM_CCLASS_DAX;
@@ -1528,10 +1531,6 @@ static ssize_t __holder_class_store(struct device *dev, const char *buf)
else
return -EINVAL;
- /* btt_claim_class() could've returned an error */
- if ((int)ndns->claim_class < 0)
- return ndns->claim_class;
-
return 0;
}
@@ -1539,7 +1538,7 @@ static ssize_t holder_class_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t len)
{
struct nd_region *nd_region = to_nd_region(dev->parent);
- ssize_t rc;
+ int rc;
nd_device_lock(dev);
nvdimm_bus_lock(dev);
@@ -1547,7 +1546,7 @@ static ssize_t holder_class_store(struct device *dev,
rc = __holder_class_store(dev, buf);
if (rc >= 0)
rc = nd_namespace_label_update(nd_region, dev);
- dev_dbg(dev, "%s(%zd)\n", rc < 0 ? "fail " : "", rc);
+ dev_dbg(dev, "%s(%d)\n", rc < 0 ? "fail " : "", rc);
nvdimm_bus_unlock(dev);
nd_device_unlock(dev);
--
2.20.1
2 years, 9 months
全国各地出口香港散货拼车,整柜运输
by 全国各地出口香港散货拼车,整柜运输
全国各地出口香港运输,安全快捷,操作简单,价格公道入仓交收、货柜车装拆、大陆车装拆、机场交收、代报关
■ 本公司专营大陆出口香港散货拼车,整柜运输
■ 代客买单报关,单证报关,商检等一条龙服务
■ 中国内地全区可以上门提货,代客验货等服务
■ 香港代客送机场,码头,写字楼,工业大厦等
■ 免费签回单,代客寄送货单,尾纸,收据等等
中港物流有限公司
联系人:Jack
大陆手机 :+86-13642980935香港电话 :+852 5101 5550
Q Q : 2905650779E-mail :wuliu56sales01@hotmail.com
2 years, 9 months