因快递100电子面单打印机无法通过正规渠道进行购买,从而兼容其他品牌热敏标签打印机;已经测试汉印N31C 80MM USB电脑版本打印机;其他品牌打印机暂没有测试,不过从理论来讲只要能打印80MM USE电脑版热敏标签打印机都可以使用;
增加字段
ALTER TABLE `eb_store_order` ADD `kuaidi_label` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '快递单号图片' AFTER `express_dump`;
需要调整文件:crmeb/crmeb/services/express/storage/Express.php
public function dump($data)
{
$param = $data;
$param['com'] = $data['com'] ?? '';
if (!$param['com']) throw new AdminException(400713);
$param['to_name'] = $data['to_name'] ?? '';
$param['to_tel'] = $data['to_tel'] ?? '';
$param['order_id'] = $data['order_id'] ?? '';
$param['to_addr'] = $data['to_addr'] ?? '';
if (!$param['to_addr'] || !$param['to_tel'] || !$param['to_name']) throw new AdminException(400714);
$param['from_name'] = $data['from_name'] ?? '';
$param['from_tel'] = $data['from_tel'] ?? '';
$param['from_addr'] = $data['from_addr'] ?? '';
if (!$param['from_name'] || !$param['from_tel'] || !$param['from_addr']) throw new AdminException(400715);
$param['temp_id'] = $data['temp_id'] ?? '';
if (!$param['temp_id']) {
throw new AdminException(400712);
}
$param['siid'] = sys_config('config_export_siid');
//修改注释掉打印机设置id,现在不为必填
// if (!$param['siid']) {
// throw new AdminException(400716);
// }
$param['count'] = $data['count'] ?? '';
$param['cargo'] = $data['cargo'] ?? '';
if (!$param['count']) {
throw new AdminException(400717);
}
/** @var ExpressServices $expressServices */
$expressServices = app()->make(ExpressServices::class);
$expressData = $expressServices->getOneByWhere(['code' => $param['com']])->toArray();
if (isset($data['cargo'])) $param['cargo'] = $data['cargo'];
if ($expressData['partner_id'] == 1) $param['partner_id'] = $expressData['account'];
if ($expressData['partner_key'] == 1) $param['partner_key'] = $expressData['key'];
if ($expressData['net'] == 1) $param['net'] = $expressData['net_name'];
if ($expressData['check_man'] == 1) $param['checkMan'] = $expressData['courier_name'];
if ($expressData['partner_name'] == 1) $param['partnerName'] = $expressData['customer_name'];
if ($expressData['is_code'] == 1) $param['code'] = $expressData['code_name'];
//修改没有打印机的时候print_type=IMAGE,就会返回面单图片
if (!$data['siid']) {
$param['print_type'] = 'IMAGE';
}
//修改增加header版本号,兼容旧版和新版
return $this->accessToken->httpRequest(self::EXPRESS_DUMP, $param, 'POST', true, ['version:v1.1']);
}
修改:crmeb/app/services/order/StoreOrderDeliveryServices.php
public function orderDeliverGoods(int $id, array $data, $orderInfo, $storeTitle)
{
/** @var StoreOrderCartInfoServices $orderInfoServices */
$orderInfoServices = app()->make(StoreOrderCartInfoServices::class);
if (!$data['delivery_name']) {
throw new AdminException(400007);
}
//修改
$dump = [];
$data['delivery_type'] = 'express';
if ($data['express_record_type'] == 2) {//电子面单
if (!$data['delivery_code']) {
throw new AdminException(400476);
}
if (!$data['express_temp_id']) {
throw new AdminException(400527);
}
if (!$data['to_name']) {
throw new AdminException(400008);
}
if (!$data['to_tel']) {
throw new AdminException(400477);
}
if (!$data['to_addr']) {
throw new AdminException(400478);
}
/** @var ServeServices $expressService */
$expressService = app()->make(ServeServices::class);
$expData['com'] = $data['delivery_code'];
$expData['to_name'] = $orderInfo->real_name;
$expData['to_tel'] = $orderInfo->user_phone;
$expData['to_addr'] = $orderInfo->user_address;
$expData['from_name'] = $data['to_name'];
$expData['from_tel'] = $data['to_tel'];
$expData['from_addr'] = $data['to_addr'];
$expData['siid'] = sys_config('config_export_siid');
$expData['temp_id'] = $data['express_temp_id'];
$expData['count'] = $orderInfo->total_num;
$expData['weight'] = $this->getOrderSumWeight($id);
$expData['cargo'] = $orderInfoServices->getCarIdByProductTitle((int)$orderInfo->id, true);
$expData['order_id'] = $orderInfo->order_id;
if (!sys_config('config_export_open', 0)) {
throw new AdminException(400528);
}
$dump = $expressService->express()->dump($expData);
$orderInfo->delivery_id = $dump['kuaidinum'];
$data['express_dump'] = json_encode([
'com' => $expData['com'],
'from_name' => $expData['from_name'],
'from_tel' => $expData['from_tel'],
'from_addr' => $expData['from_addr'],
'temp_id' => $expData['temp_id'],
'cargo' => $expData['cargo'],
]);
$data['delivery_id'] = $dump['kuaidinum'];
//修改快递面单图片写入数据库
if (!empty($dump['label'])) {
$data['kuaidi_label'] = $dump['label'];
}
} else {
if (!$data['delivery_id']) {
throw new AdminException(400531);
}
$orderInfo->delivery_id = $data['delivery_id'];
}
$data['status'] = 1;
$orderInfo->delivery_type = $data['delivery_type'];
$orderInfo->delivery_name = $data['delivery_name'];
$orderInfo->status = $data['status'];
/** @var StoreOrderStatusServices $services */
$services = app()->make(StoreOrderStatusServices::class);
$this->transaction(function () use ($id, $data, $services) {
$res = $this->dao->update($id, $data);
$res = $res && $services->save([
'oid' => $id,
'change_time' => time(),
'change_type' => 'delivery_goods',
'change_message' => '已发货 快递公司:' . $data['delivery_name'] . ' 快递单号:' . $data['delivery_id']
]);
if (!$res) {
throw new AdminException(400529);
}
});
//修改 返回$dump
return $dump;
}
修改crmeb/app/services/order/StoreOrderDeliveryServices.php
public function doDelivery(int $id, $orderInfo, array $data)
{
$type = (int)$data['type'];
unset($data['type']);
//获取购物车内的商品标题
/** @var StoreOrderCartInfoServices $orderInfoServices */
$orderInfoServices = app()->make(StoreOrderCartInfoServices::class);
$storeName = $orderInfoServices->getCarIdByProductTitle((int)$orderInfo->id);
//修改返回数据
$res = [];
switch ($type) {
case 1://快递发货
$res = $this->orderDeliverGoods($id, $data, $orderInfo, $storeName);
event('NoticeListener', [['orderInfo' => $orderInfo, 'storeName' => $storeName, 'data' => $data], 'order_postage_success']);
break;
case 2://配送
$this->orderDelivery($id, $data, $orderInfo, $storeName);
event('NoticeListener', [['orderInfo' => $orderInfo, 'storeName' => $storeName, 'data' => $data], 'order_deliver_success']);
break;
case 3://虚拟发货
$this->orderVirtualDelivery($id, $data, $orderInfo, $storeName);
break;
default:
throw new AdminException(400522);
}
//到期自动收货
event('OrderDeliveryListener', [$orderInfo, $storeName, $data, $type]);
//修改返回数据
return $res;
}
修改:crmeb/app/services/order/StoreOrderDeliveryServices.php
public function delivery(int $id, array $data)
{
$orderInfo = $this->dao->get($id, ['*'], ['pink']);
if (!$orderInfo) {
throw new AdminException(400470);
}
if ($orderInfo->is_del) {
throw new AdminException(400471);
}
if ($orderInfo->status) {
throw new AdminException(400472);
}
if ($orderInfo->shipping_type == 2) {
throw new AdminException(400473);
}
if (isset($orderInfo['pinkStatus']) && $orderInfo['pinkStatus'] != 2) {
throw new AdminException(400474);
}
if ($data['type'] == 1) {
// 检测快递公司编码
/** @var ExpressServices $expressServices */
$expressServices = app()->make(ExpressServices::class);
if (!$expressServices->be(['code' => $data['delivery_code']])) {
throw new AdminException(410324);
}
}
/** @var StoreOrderRefundServices $storeOrderRefundServices */
$storeOrderRefundServices = app()->make(StoreOrderRefundServices::class);
if ($storeOrderRefundServices->count(['store_order_id' => $id, 'refund_type' => [1, 2, 4, 5], 'is_cancel' => 0, 'is_del' => 0])) {
throw new AdminException(400475);
}
//修改返回打印订单数据
return $this->doDelivery($id, $orderInfo, $data);
}
修改:crmeb/app/adminapi/controller/v1/order/StoreOrder.php
public function update_delivery($id, StoreOrderDeliveryServices $services)
{
$data = $this->request->postMore([
['type', 1],
['delivery_name', ''],//快递公司名称
['delivery_id', ''],//快递单号
['delivery_code', ''],//快递公司编码
['express_record_type', 2],//发货记录类型
['express_temp_id', ""],//电子面单模板
['to_name', ''],//寄件人姓名
['to_tel', ''],//寄件人电话
['to_addr', ''],//寄件人地址
['sh_delivery_name', ''],//送货人姓名
['sh_delivery_id', ''],//送货人电话
['sh_delivery_uid', ''],//送货人ID
['fictitious_content', '']//虚拟发货内容
]);
//修改 返回电子面单打印数据
return app('json')->success(100010, $services->delivery((int)$id, $data));
}
后台前端文件先安装插件
npm i printjs
后台前端前端文件修改:template/admin/src/pages/order/orderList/handle/orderSend.vue;只列出被修改的部分,对比进行修改
//修改引入打印扩展
import printJS from 'print-js';
export default {
methods: {
//修改增加打印方法
printImg(url) {
printJS({
printable: url,
type: 'image',
documentTitle: '快递信息',
style: `img{
width: 100%;
height: 476px;
}`,
});
},
// 提交
putSend(name) {
let data = {
id: this.orderId,
datas: this.formItem,
};
if (this.formItem.type === '1' && this.formItem.express_record_type === '2') {
if (this.formItem.delivery_name === '') {
return this.$Message.error('快递公司不能为空');
} else if (this.formItem.express_temp_id === '') {
return this.$Message.error('电子面单不能为空');
} else if (this.formItem.to_name === '') {
return this.$Message.error('寄件人姓名不能为空');
} else if (this.formItem.to_tel === '') {
return this.$Message.error('寄件人电话不能为空');
} else if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(this.formItem.to_tel)) {
return this.$Message.error('请输入正确的手机号码');
} else if (this.formItem.to_addr === '') {
return this.$Message.error('寄件人地址不能为空');
}
}
if (this.formItem.type === '1' && this.formItem.express_record_type === '1') {
if (this.formItem.delivery_name === '') {
return this.$Message.error('快递公司不能为空');
} else if (this.formItem.delivery_id === '') {
return this.$Message.error('快递单号不能为空');
}
}
if (this.formItem.type === '2') {
if (this.formItem.sh_delivery === '') {
return this.$Message.error('送货人不能为空');
}
}
if (this.splitSwitch) {
data.datas.cart_ids = [];
this.selectData.forEach((v) => {
data.datas.cart_ids.push({
cart_id: v.cart_id,
cart_num: v.num || v.surplus_num,
});
});
splitDelivery(data)
.then((res) => {
this.modals = false;
this.$Message.success(res.msg);
this.$emit('submitFail');
this.reset();
this.splitSwitch = false;
//修改增加打印机打印
if (res.data.label) this.printImg(res.data.label);
})
.catch((res) => {
this.$Message.error(res.msg);
});
} else {
putDelivery(data)
.then(async (res) => {
this.modals = false;
this.$Message.success(res.msg);
this.splitSwitch = false;
this.$emit('submitFail');
this.reset();
////修改增加打印机打印
if (res.data.label) this.printImg(res.data.label);
})
.catch((res) => {
this.$Message.error(res.msg);
});
}
},
},
};
后台前端文件修改:template/admin/src/pages/order/orderList/components/tableList.vue
import printJS from 'print-js';
export default {
name: 'table_list',
mounted() {},
created() {
this.getList();
},
watch: {
orderType: function () {
this.page.pageNum = 1;
this.getList();
},
},
methods: {
...mapMutations('order', ['getIsDel', 'getisDelIdListl']),
// 操作
changeMenu(row, name) {
this.orderId = row.id;
switch (name) {
case '1':
this.delfromData = {
title: '修改立即支付',
url: `/order/pay_offline/${row.id}`,
method: 'post',
ids: '',
};
this.$modalSure(this.delfromData)
.then((res) => {
this.$Message.success(res.msg);
this.$emit('changeGetTabs');
this.getList();
})
.catch((res) => {
this.$Message.error(res.msg);
});
// this.modalTitleSs = '修改立即支付';
break;
case '2':
this.getData(row.id);
break;
case '3':
this.$refs.record.modals = true;
this.$refs.record.getList(row.id);
break;
case '4':
this.$refs.remarks.modals = true;
this.$refs.remarks.formValidate.remark = row.remark;
break;
case '5':
this.getRefundData(row.id);
break;
case '6':
this.getRefundIntegral(row.id);
break;
case '7':
this.getNoRefundData(row.id);
break;
case '8':
this.delfromData = {
title: '修改确认收货',
url: `/order/take/${row.id}`,
method: 'put',
ids: '',
};
this.$modalSure(this.delfromData)
.then((res) => {
this.$Message.success(res.msg);
this.getList();
})
.catch((res) => {
this.$Message.error(res.msg);
});
// this.modalTitleSs = '修改确认收货';
break;
case '10':
this.delfromData = {
title: '立即打印订单',
info: '您确认打印此订单吗?',
url: `/order/print/${row.id}`,
method: 'get',
ids: '',
};
this.$modalSure(this.delfromData)
.then((res) => {
this.$Message.success(res.msg);
this.$emit('changeGetTabs');
this.getList();
})
.catch((res) => {
this.$Message.error(res.msg);
});
break;
case '11':
this.delfromData = {
title: '立即打印电子面单',
info: '您确认打印此电子面单吗?',
url: `/order/order_dump/${row.id}`,
method: 'get',
ids: '',
};
this.$modalSure(this.delfromData)
.then((res) => {
this.$Message.success(res.msg);
this.getList();
})
.catch((res) => {
this.$Message.error(res.msg);
});
break;
case '12':
this.printImg(row.kuaidi_label);
break;
default:
this.delfromData = {
title: '删除订单',
url: `/order/del/${row.id}`,
method: 'DELETE',
ids: '',
};
// this.modalTitleSs = '删除订单';
this.delOrder(row, this.delfromData);
}
},
printImg(url) {
printJS({
printable: url,
type: 'image',
documentTitle: '快递信息',
style: `img{
width: 100%;
height: 476px;
}`,
});
},
// 立即支付 /确认收货//删除单条订单
submitModel() {
this.getList();
},
pageChange(index) {
this.page.pageNum = index;
this.getList();
},
limitChange(limit) {
this.page.pageSize = limit;
this.getList();
},
// 订单列表
getList(res) {
this.page.pageNum = res === 1 ? 1 : this.page.pageNum;
this.loading = true;
orderList({
page: this.page.pageNum,
limit: this.page.pageSize,
status: this.orderStatus,
pay_type: this.orderPayType,
data: this.orderTime,
real_name: this.orderNum,
field_key: this.fieldKey,
type: this.orderType === 0 ? '' : this.orderType,
})
.then(async (res) => {
let data = res.data;
this.orderList = data.data;
this.orderCards = data.stat;
this.page.total = data.count;
this.$nextTick(() => {
//确保dom加载完毕
this.setChecked();
});
this.$emit('on-changeCards', data.stat);
this.loading = false;
})
.catch((res) => {
this.loading = false;
this.$Message.error(res.msg);
});
},
//全选和取消全选时触发
handleSelectAll(selection) {
if (selection.length === 0) {
//获取table的数据;
let data = this.$refs.table.data;
data.forEach((item) => {
if (this.selectedIds.has(item.id)) {
this.selectedIds.delete(item.id);
}
});
} else {
selection.forEach((item) => {
this.selectedIds.add(item.id);
});
}
this.isDel(selection);
this.$nextTick(() => {
//确保dom加载完毕
this.setChecked();
});
},
// 选中某一行
handleSelectRow(selection, row) {
this.isDel(selection);
this.selectedIds.add(row.id);
this.$nextTick(() => {
//确保dom加载完毕
this.setChecked();
});
},
// 取消某一行
handleCancelRow(selection, row) {
this.isDel(selection);
this.selectedIds.delete(row.id);
this.$nextTick(() => {
//确保dom加载完毕
this.setChecked();
});
},
setChecked() {
//将new Set()转化为数组
let ids = [...this.selectedIds];
this.getisDelIdListl(ids);
// 找到绑定的table的ref对应的dom,找到table的objData对象,objData保存的是当前页的数据
let objData = this.$refs.table.objData;
for (let index in objData) {
if (this.selectedIds.has(objData[index].id)) {
objData[index]._isChecked = true;
}
}
},
isDel(selection) {
if (selection.findIndex((target) => target.is_del === 0) == -1) {
this.getIsDel(1);
} else {
this.getIsDel(0);
}
},
// 编辑
edit(row) {
this.getOrderData(row.id);
},
// 删除单条订单
delOrder(row, data) {
if (row.is_del === 1) {
this.$modalSure(data)
.then((res) => {
this.$Message.success(res.msg);
this.getList();
})
.catch((res) => {
this.$Message.error(res.msg);
});
} else {
const title = '错误!';
const content = '您选择的的订单存在用户未删除的订单,无法删除用户未删除的订单!';
this.$Modal.error({
title: title,
content: content,
});
}
},
splitOrderDetail(row) {
this.$router.push({
path: 'split_list',
query: {
id: row.id,
},
});
},
// 获取编辑表单数据
getOrderData(id) {
getOrdeDatas(id)
.then(async (res) => {
if (res.data.status === false) {
return this.$authLapse(res.data);
}
this.$authLapse(res.data);
this.FromData = res.data;
this.$refs.edits.modals = true;
})
.catch((res) => {
this.$Message.error(res.msg);
});
},
// 获取详情表单数据
getData(id) {
getDataInfo(id)
.then(async (res) => {
this.$refs.details.modals = true;
this.orderDatalist = res.data;
if (this.orderDatalist.orderInfo.refund_reason_wap_img) {
try {
this.orderDatalist.orderInfo.refund_reason_wap_img = JSON.parse(
this.orderDatalist.orderInfo.refund_reason_wap_img,
);
} catch (e) {
this.orderDatalist.orderInfo.refund_reason_wap_img = [];
}
}
})
.catch((res) => {
this.$Message.error(res.msg);
});
},
// 修改成功
submitFail() {
this.getList();
this.$emit('changeGetTabs');
},
// 获取退款表单数据
getRefundData(id) {
this.$modalForm(getRefundFrom(id)).then(() => {
this.getList();
this.$emit('changeGetTabs');
});
},
// 获取退积分表单数据
getRefundIntegral(id) {
refundIntegral(id)
.then(async (res) => {
this.FromData = res.data;
this.$refs.edits.modals = true;
})
.catch((res) => {
this.$Message.error(res.msg);
});
},
// 不退款表单数据
getNoRefundData(id) {
this.$modalForm(getnoRefund(id)).then(() => {
this.getList();
this.$emit('changeGetTabs');
});
},
// 发送货
sendOrder(row) {
this.$refs.send.total_num = row.total_num;
this.$refs.send.modals = true;
this.orderId = row.id;
this.status = row._status;
this.pay_type = row.pay_type;
this.virtual_type = row.virtual_type;
this.$refs.send.getList();
this.$refs.send.getDeliveryList();
this.$nextTick((e) => {
this.$refs.send.getCartInfo(row._status, row.id);
});
},
// 配送信息表单数据
delivery(row) {
getDistribution(row.id)
.then(async (res) => {
this.FromData = res.data;
this.$refs.edits.modals = true;
})
.catch((res) => {
this.$Message.error(res.msg);
});
},
change(status) {},
// 数据导出;
exportData: function () {
this.$refs.table.exportCsv({
filename: '商品列表',
});
},
// 核销订单
bindWrite(row) {
let self = this;
this.$Modal.confirm({
title: '提示',
content: '确定要核销该订单吗?',
cancelText: '取消',
closable: true,
maskClosable: true,
onOk: function () {
writeUpdate(row.order_id)
.then((res) => {
self.$Message.success(res.msg);
self.getList();
})
.catch((res) => {
self.$Message.error(res.msg);
});
},
});
},
},
};
{{item.user_info.nickname ? item.user_info.nickname : item.user_name}}
作者 管理员 企业
{{itemf.name}}
{{itemc.user_info.nickname}}
{{itemc.user_name}}
回复 {{itemc.comment_user_info.nickname}}
{{itemf.name}}