1. 【新增】售后单售后原因类型支持搜索

2. 【新增】手工创建订单折扣可输入正数

3. 【优化】盘点申请单确认

4. 【修复】采购退货单模拟出库失败问题

5. 【新增】订单金额客户实付与结算金额

6. 【优化】仓库发货统计报表物料名称显示

7. 【优化】自有仓储虚拟发货逻辑

8. 【修复】基础物料分类管理问题
This commit is contained in:
chenping
2026-04-01 11:59:17 +08:00
parent 9341122827
commit 61783b7d01
754 changed files with 46179 additions and 5700 deletions

758
app/ome/lib/reshipping.php Normal file
View File

@@ -0,0 +1,758 @@
<?php
/**
* 补寄申请业务逻辑处理
*/
class ome_reshipping extends ome_abstract
{
/**
* 同意补寄申请
*
* @param int $reshipping_id 补寄申请单ID
* @param array $items_detail 商品明细信息actual_product_id, actual_product_bn, actual_nums
* @return array
*/
public function agree($reshipping_id, $items_detail = array())
{
$reshippingModel = app::get('ome')->model('return_reshipping');
$operationLogModel = app::get('ome')->model('operation_log');
// 获取补寄申请单信息
$reshipping = $reshippingModel->db_dump($reshipping_id);
if (empty($reshipping)) {
return array('rsp' => 'fail', 'msg' => '补寄申请单不存在');
}
// 检查状态
if ($reshipping['status'] != '0') {
return array('rsp' => 'fail', 'msg' => '补寄申请单状态不正确,无法同意');
}
// 先做校验并保存商品明细
$validateResult = $this->_validateAndSaveItemsDetail($reshipping_id, $reshipping, $items_detail);
if ($validateResult['rsp'] == 'fail') {
return $validateResult;
}
// 校验通过后,调用矩阵同意接口
$apiResult = kernel::single('erpapi_router_request')->set('shop', $reshipping['shop_id'])->reshipping_agree(array(
'dispute_id' => $reshipping['reshipping_bn'],
));
if ($apiResult['rsp'] == 'fail') {
// 清除写入的明细
$itemsDetailModel = app::get('ome')->model('return_reshipping_items_detail');
$itemsDetailModel->delete(array('reshipping_id' => $reshipping_id));
return array('rsp' => 'fail', 'msg' => '调用同意接口失败:' . (isset($apiResult['msg']) ? $apiResult['msg'] : '未知错误'));
}
// 更新补寄申请单状态
$updateData = array(
'status' => '1', // 等待卖家发货
'is_confirm_goods' => '1', // 商品已确认
'up_time' => date('Y-m-d H:i:s'),
);
$rs = $reshippingModel->update($updateData, array('reshipping_id' => $reshipping_id, 'status' => '0'));
if(is_bool($rs)) {
return array('rsp' => 'fail', 'msg' => '更新补寄申请单状态失败');
}
// 记录操作日志
$operationLogModel->write_log('return_reshipping@ome', $reshipping_id, '同意补寄申请');
// 生成补发订单
$orderResult = $this->createReissueOrder($reshipping_id);
if ($orderResult['rsp'] == 'fail') {
// 生成补发订单失败时,记录日志但不报错,继续执行
$errorMsg = '生成补发订单失败:' . (isset($orderResult['msg']) ? $orderResult['msg'] : '未知错误');
$operationLogModel->write_log('return_reshipping@ome', $reshipping_id, $errorMsg);
}
return array('rsp' => 'succ', 'msg' => '同意补寄申请成功');
}
/**
* 拒绝补寄申请
*
* @param int $reshipping_id 补寄申请单ID
* @param array $refuseData 拒绝数据refuse_reason_id, refuse_reason, leave_message_pics, leave_message
* @return array
*/
public function refuse($reshipping_id, $refuseData)
{
$reshippingModel = app::get('ome')->model('return_reshipping');
$operationLogModel = app::get('ome')->model('operation_log');
// 获取补寄申请单信息
$reshipping = $reshippingModel->db_dump($reshipping_id);
if (empty($reshipping)) {
return array('rsp' => 'fail', 'msg' => '补寄申请单不存在');
}
// 检查状态
if ($reshipping['status'] != '0') {
return array('rsp' => 'fail', 'msg' => '补寄申请单状态不正确,无法拒绝');
}
// 验证必填字段
if (empty($refuseData['refuse_reason_id'])) {
return array('rsp' => 'fail', 'msg' => '拒绝原因不能为空');
}
if (empty($refuseData['leave_message'])) {
return array('rsp' => 'fail', 'msg' => '拒绝留言不能为空');
}
if (empty($refuseData['leave_message_pics'])) {
return array('rsp' => 'fail', 'msg' => '凭证图片不能为空');
}
// 调用矩阵拒绝接口
$apiResult = kernel::single('erpapi_router_request')->set('shop', $reshipping['shop_id'])->reshipping_refuse(array(
'dispute_id' => $reshipping['reshipping_bn'],
'seller_refuse_reason_id' => $refuseData['refuse_reason_id'],
'leave_message_pics' => $refuseData['leave_message_pics'], // 单个 base64 字符串
'leave_message' => $refuseData['leave_message'],
));
if ($apiResult['rsp'] == 'fail') {
return array('rsp' => 'fail', 'msg' => '调用拒绝接口失败:' . (isset($apiResult['msg']) ? $apiResult['msg'] : '未知错误'));
}
// 更新补寄申请单
$updateData = array(
'status' => '4', // 卖家拒绝补寄
'refuse_reason_id' => $refuseData['refuse_reason_id'],
'refuse_reason' => $refuseData['refuse_reason'],
'up_time' => date('Y-m-d H:i:s'),
);
$rs = $reshippingModel->update($updateData, array('reshipping_id' => $reshipping_id, 'status' => '0'));
if(is_bool($rs)) {
return array('rsp' => 'fail', 'msg' => '更新补寄申请单状态失败');
}
// 记录操作日志
$memo = '拒绝补寄申请,原因:' . $refuseData['refuse_reason'];
$operationLogModel->write_log('return_reshipping@ome', $reshipping_id, $memo);
return array('rsp' => 'succ', 'msg' => '拒绝补寄申请成功');
}
/**
* 商品信息确认(淘宝平台同意场景)
*
* @param int $reshipping_id 补寄申请单ID
* @param array $items_detail 商品明细信息
* @return array
*/
public function confirmGoods($reshipping_id, $items_detail = array())
{
$reshippingModel = app::get('ome')->model('return_reshipping');
$operationLogModel = app::get('ome')->model('operation_log');
// 获取补寄申请单信息
$reshipping = $reshippingModel->db_dump($reshipping_id);
if (empty($reshipping)) {
return array('rsp' => 'fail', 'msg' => '补寄申请单不存在');
}
// 检查is_confirm_goods状态
if ($reshipping['is_confirm_goods'] == '1') {
return array('rsp' => 'fail', 'msg' => '商品信息已确认');
}
// 验证并保存商品明细
$validateResult = $this->_validateAndSaveItemsDetail($reshipping_id, $reshipping, $items_detail);
if ($validateResult['rsp'] == 'fail') {
return $validateResult;
}
// 更新补寄申请单
$updateData = array(
'is_confirm_goods' => '1', // 商品已确认
'up_time' => date('Y-m-d H:i:s'),
);
$rs = $reshippingModel->update($updateData, array('reshipping_id' => $reshipping_id, 'status' => '1', 'is_confirm_goods' => '0'));
if(is_bool($rs)) {
app::get('ome')->model('return_reshipping_items_detail')->delete(array('reshipping_id' => $reshipping_id));
return array('rsp' => 'fail', 'msg' => '更新补寄申请单状态失败');
}
// 记录操作日志
$operationLogModel->write_log('return_reshipping@ome', $reshipping_id, '商品信息确认成功');
// 生成补发订单(失败时只记录日志,不报错)
$orderResult = $this->createReissueOrder($reshipping_id);
if ($orderResult['rsp'] == 'fail') {
$errorMsg = '生成补发订单失败:' . (isset($orderResult['msg']) ? $orderResult['msg'] : '未知错误');
$operationLogModel->write_log('return_reshipping@ome', $reshipping_id, $errorMsg);
}
return array('rsp' => 'succ', 'msg' => '商品信息确认成功');
}
/**
* 验证并保存商品明细(共同逻辑)
*
* @param int $reshipping_id 补寄申请单ID
* @param array $reshipping 补寄申请单信息
* @param array $items_detail 商品明细信息
* @return array
*/
private function _validateAndSaveItemsDetail($reshipping_id, $reshipping, $items_detail)
{
$reshippingItemsModel = app::get('ome')->model('return_reshipping_items');
$reshippingItemsDetailModel = app::get('ome')->model('return_reshipping_items_detail');
$salesMaterialModel = app::get('material')->model('sales_material');
// 获取商品明细
$items = $reshippingItemsModel->getList('*', array('reshipping_id' => $reshipping_id));
// 用于保存校验阶段查询到的sm_id避免重复查询
$itemSmIdMap = array();
// 校验所有商品项的销售物料编码
foreach ($items as $item) {
// 只从sales_material_bn获取销售物料编码如果不存在则报错
if (!isset($items_detail[$item['item_id']]['sales_material_bn']) ||
empty(trim($items_detail[$item['item_id']]['sales_material_bn']))) {
return array('rsp' => 'fail', 'msg' => '商品项ID ' . $item['item_id'] . ' 的销售物料编码不能为空');
}
$sales_material_bn = trim($items_detail[$item['item_id']]['sales_material_bn']);
// 根据sales_material_bn查询销售物料表获取sm_id
$salesMaterialList = $salesMaterialModel->getList(
'sm_id',
array('sales_material_bn' => $sales_material_bn, 'shop_id' => array($reshipping['shop_id'], '_ALL_'), 'sales_material_type' => ['1', '2', '3']),
0,
1
);
// 如果查询不到sm_id报错
if (!$salesMaterialList || !isset($salesMaterialList[0]['sm_id'])) {
return array('rsp' => 'fail', 'msg' => '销售物料编码 ' . $sales_material_bn . ' 不存在或不属于该店铺');
}
// 保存查询到的sm_id供后续使用
$itemSmIdMap[$item['item_id']] = $salesMaterialList[0]['sm_id'];
}
// 校验通过后保存商品明细到items_detail表
foreach ($items as $item) {
$sales_material_bn = trim($items_detail[$item['item_id']]['sales_material_bn']);
// 直接使用校验阶段保存的sm_id不再查询
$sm_id = $itemSmIdMap[$item['item_id']];
$detailData = array(
'reshipping_id' => $reshipping_id,
'item_id' => $item['item_id'],
'sm_id' => $sm_id,
'sales_material_bn' => $sales_material_bn,
'nums' => isset($items_detail[$item['item_id']]['nums']) ? $items_detail[$item['item_id']]['nums'] : $item['nums'],
'price' => $item['price'],
);
$reshippingItemsDetailModel->insert($detailData);
}
return array('rsp' => 'succ', 'msg' => '');
}
/**
* 创建补发订单
*
* @param int $reshipping_id 补寄申请单ID
* @return array
*/
public function createReissueOrder($reshipping_id)
{
$reshippingModel = app::get('ome')->model('return_reshipping');
$reshippingItemsDetailModel = app::get('ome')->model('return_reshipping_items_detail');
$orderModel = app::get('ome')->model('orders');
$salesMaterialModel = app::get('material')->model('sales_material');
$result = array('rsp' => 'fail', 'msg' => '');
// 获取补寄申请单信息
$reshipping = $reshippingModel->db_dump($reshipping_id);
if (empty($reshipping)) {
$result['msg'] = '补寄申请单不存在';
return $result;
}
// 检查是否已经创建过补发订单
if ($reshipping['reissue_order_id']) {
$result['msg'] = '补发订单已存在';
return $result;
}
// 获取原订单信息
$originalOrder = $orderModel->dump($reshipping['order_id']);
if (empty($originalOrder)) {
$result['msg'] = '原订单不存在';
return $result;
}
// 获取商品明细(已确认的商品)
$itemsDetail = $reshippingItemsDetailModel->getList('*', array('reshipping_id' => $reshipping_id));
if (empty($itemsDetail)) {
$result['msg'] = '补寄商品明细不存在';
return $result;
}
// 构建补发订单数据(复制原订单信息)
$bufaOrderSdf = array(
'order_bn'=>$reshipping['reshipping_bn'],
'member_id'=>$originalOrder['member_id'],
'currency'=>'CNY',
'title'=>'',
'createtime'=>time(),
'last_modified'=>time(),
'confirm'=>'N',
'status'=>'active',
'pay_status'=>'1',
'ship_status'=>'0',
'is_delivery'=>'Y',
'shop_id'=>$originalOrder['shop_id'],
'itemnum'=>0,
'relate_order_bn'=>$originalOrder['order_bn'],
'shipping'=>array(
'shipping_id'=>$originalOrder['shipping']['shipping_id'],
'is_cod'=>'false',
'shipping_name'=>$originalOrder['shipping']['shipping_name'],
'cost_shipping'=>0,
'is_protect'=>$originalOrder['shipping']['is_protect'],
'cost_protect'=>0,
),
'mark_type' => 'b1',
'source' => 'local',
'order_type' => 'bufa',
'createway' => 'after',
'is_tax' => $originalOrder["is_tax"],
'tax_title' => $originalOrder["tax_title"],
'shop_type' => $originalOrder["shop_type"],
);
//平台订单号
if($originalOrder['platform_order_bn']){
$bufaOrderSdf['platform_order_bn'] = $originalOrder['platform_order_bn'];
}
// 重置订单信息
$bufaOrderSdf['pay_bn'] = $reshipping['reshipping_bn']; // 支付单号,使用补寄申请单号
$bufaOrderSdf['createtime'] = time();
$bufaOrderSdf['paytime'] = time();
$bufaOrderSdf['modifytime'] = time();
$bufaOrderSdf['is_modify'] = 'false';
$bufaOrderSdf['logi_no'] = '';
$bufaOrderSdf['source_status'] = '';
$bufaOrderSdf['payed'] = 0.00;
$bufaOrderSdf['total_amount'] = 0.00;
$bufaOrderSdf['final_amount'] = 0.00;
$bufaOrderSdf['cost_item'] = 0.00;
$bufaOrderSdf['custom_mark'] = '';
$bufaOrderSdf['mark_text'] = '';
// 收货人信息(使用补寄申请单的购买人信息)
$consignee = $this->_formatReshippingConsignee($reshipping);
$bufaOrderSdf['consignee'] = $consignee;
// 构建订单明细
// $orderObjs 对应销售物料,$order_items 对应销售物料下的基础物料
$order_objects = array();
$salesBasicMaterialModel = app::get('material')->model('sales_basic_material');
$basicMaterialModel = app::get('material')->model('basic_material');
foreach ($itemsDetail as $itemDetail) {
// 获取销售物料信息
$salesMaterial = $salesMaterialModel->db_dump($itemDetail['sm_id'], 'sm_id,sales_material_name,sales_material_bn,sales_material_type');
if (empty($salesMaterial)) {
continue;
}
// 创建销售物料对应的 order_objects
$orderObjs = array(
'obj_type' => $salesMaterial['sales_material_type'] == '2' ? 'pkg' : ($salesMaterial['sales_material_type'] == '3' ? 'gift' : 'goods'),
'obj_alias' => $salesMaterial['sales_material_name'],
'goods_id' => $salesMaterial['sm_id'],
'name' => $salesMaterial['sales_material_name'],
'bn' => $itemDetail['sales_material_bn'],
'quantity' => $itemDetail['nums'],
'price' => 0.00,
'pmt_price' => 0.00,
'sale_price' => 0.00,
'order_items' => array(),
);
// 获取销售物料关联的基础物料
$salesBasicMaterials = $salesBasicMaterialModel->getList('*', array('sm_id' => $salesMaterial['sm_id']), 0, -1);
// 如果没有关联基础物料,跳过该销售物料
if (empty($salesBasicMaterials)) {
continue;
}
// 为每个基础物料创建 order_items
foreach ($salesBasicMaterials as $salesBasicMaterial) {
// 获取基础物料信息
$basicMaterial = $basicMaterialModel->db_dump($salesBasicMaterial['bm_id'], 'bm_id,material_name,material_bn,type');
if (empty($basicMaterial)) {
continue;
}
$order_item = array(
'product_id' => $basicMaterial['bm_id'] ? $basicMaterial['bm_id'] : 0,
'bn' => $basicMaterial['material_bn'],
'name' => $basicMaterial['material_name'],
'quantity' => $salesBasicMaterial['number'] * $itemDetail['nums'],
'addon' => '',
'item_type' => $salesMaterial['sales_material_type'] == '2' ? 'pkg' : 'product',
'price' => 0.00,
'pmt_price' => 0.00,
'sale_price' => 0.00,
'delete' => 'false',
);
$orderObjs['order_items'][] = $order_item;
}
if (empty($orderObjs['order_items'])) {
continue;
}
$order_objects[] = $orderObjs;
}
if (empty($order_objects)) {
$result['msg'] = '没有有效的补寄商品';
return $result;
}
$bufaOrderSdf['order_objects'] = $order_objects;
// 创建补发订单
$error_msg = '';
$orderResult = $orderModel->create_order($bufaOrderSdf, $error_msg);
if (!$orderResult) {
$result['msg'] = '创建补发订单失败:' . $error_msg;
return $result;
}
// 更新为已支付0元订单创建时是未支付
$orderModel->update(array('pay_status' => '1'), array('order_id' => $bufaOrderSdf['order_id']));
// 保存收件人敏感数据
$this->_saveReshippingReceiverEncrypt($bufaOrderSdf['order_id'], $reshipping);
// 计算最晚发货时间(同意时间+24小时
$agreeTime = strtotime($reshipping['up_time'] ? $reshipping['up_time'] : date('Y-m-d H:i:s'));
$latestDeliveryTime = $agreeTime + 24 * 3600; // 24小时后
// 更新ome_order_extend表的最晚发货时间
$orderExtendModel = app::get('ome')->model('order_extend');
$extendData = array(
'order_id' => $bufaOrderSdf['order_id'],
'latest_delivery_time' => $latestDeliveryTime,
);
$orderExtendModel->save($extendData);
// 更新补寄申请单,关联补发订单
$reshippingModel->update(array(
'reissue_order_id' => $bufaOrderSdf['order_id'],
'reissue_order_bn' => $bufaOrderSdf['order_bn'],
), array('reshipping_id' => $reshipping_id));
$result['rsp'] = 'succ';
$result['order_id'] = $bufaOrderSdf['order_id'];
$result['order_bn'] = $bufaOrderSdf['order_bn'];
$result['msg'] = '补发订单创建成功';
return $result;
}
/**
* 处理转退款
* 当补寄申请单状态更新为6转退款时调用
*
* @param int $reshipping_id 补寄申请单ID
* @return array
*/
public function handleTransformToRefund($reshipping_id)
{
$reshippingModel = app::get('ome')->model('return_reshipping');
$orderModel = app::get('ome')->model('orders');
$deliveryModel = app::get('ome')->model('delivery');
$operationLogModel = app::get('ome')->model('operation_log');
$result = array('rsp' => 'fail', 'msg' => '');
// 获取补寄申请单信息
$reshipping = $reshippingModel->db_dump($reshipping_id);
if (empty($reshipping)) {
$result['msg'] = '补寄申请单不存在';
return $result;
}
// 检查状态
if ($reshipping['status'] != '6') {
$result['msg'] = '补寄申请单状态不是转退款';
return $result;
}
// 查询补寄申请单关联的补发订单
if (empty($reshipping['reissue_order_id'])) {
// 没有补发订单,直接返回成功
$result['rsp'] = 'succ';
$result['msg'] = '没有补发订单,无需处理';
return $result;
}
$reissue_order_id = $reshipping['reissue_order_id'];
// 获取补发订单信息
$reissueOrder = $orderModel->db_dump($reissue_order_id, 'order_id,ship_status,order_bn');
if (empty($reissueOrder)) {
$result['msg'] = '补发订单不存在';
return $result;
}
// 打标签:补发转退款
$error_msg = '';
$labelResult = kernel::single('ome_bill_label')->markBillLabel(
$reissue_order_id,
'',
'SOMS_BUFA_REFUND',
'order',
$error_msg
);
if (!$labelResult) {
// 打标签失败,记录日志但不中断流程
$operationLogModel->write_log('return_reshipping@ome', $reshipping_id, '打标签失败:' . ($error_msg ? $error_msg : '未知错误'));
}
// 判断是否已发货
$isShipped = in_array($reissueOrder['ship_status'], array('1', '2')); // 1=已发货2=部分发货
if ($isShipped) {
// 已发货,不取消订单
$memo = '转退款处理完成,补发订单已发货,不取消订单';
$operationLogModel->write_log('return_reshipping@ome', $reshipping_id, $memo);
$result['rsp'] = 'succ';
$result['msg'] = '转退款处理成功,补发订单已发货,未取消';
return $result;
}
// 未发货,取消订单
$cancelMemo = '补寄转退款,取消补发订单';
$cancelResult = $orderModel->cancel($reissue_order_id, $cancelMemo, false, 'async', false);
if ($cancelResult['rsp'] == 'success') {
$memo = '转退款处理完成,补发订单已取消';
$operationLogModel->write_log('return_reshipping@ome', $reshipping_id, $memo);
$result['rsp'] = 'succ';
$result['msg'] = '转退款处理成功,补发订单已取消';
} else {
// 取消失败,记录错误日志但不中断流程
$errorMsg = '取消补发订单失败:' . (isset($cancelResult['msg']) ? $cancelResult['msg'] : '未知错误');
$operationLogModel->write_log('return_reshipping@ome', $reshipping_id, $errorMsg);
$result['rsp'] = 'succ';
$result['msg'] = '转退款处理完成,但取消补发订单失败';
}
return $result;
}
/**
* 撤销发货单
*
* @param int $delivery_id 发货单ID
* @return array
*/
private function _cancelDelivery($delivery_id)
{
$deliveryModel = app::get('ome')->model('delivery');
$delivery = $deliveryModel->db_dump($delivery_id, 'delivery_id,delivery_bn,status,branch_id');
if (empty($delivery)) {
return array('rsp' => 'fail', 'msg' => '发货单不存在');
}
// 调用发货单撤销接口
$branchModel = app::get('ome')->model('branch');
$branch = $branchModel->db_dump($delivery['branch_id'], 'wms_id');
$wms_id = $branch ? $branch['wms_id'] : 0;
if ($wms_id) {
$data = array(
'delivery_bn' => $delivery['delivery_bn'],
'memo' => '补寄转退款,撤销发货单',
);
$cancelResult = kernel::single('ome_event_trigger_delivery')->cancel('wms', $wms_id, $data, true);
if ($cancelResult['rsp'] != 'succ') {
return array('rsp' => 'fail', 'msg' => isset($cancelResult['msg']) ? $cancelResult['msg'] : '撤销发货单失败');
}
}
return array('rsp' => 'succ', 'msg' => '撤销发货单成功');
}
/**
* 拦截发货单
*
* @param int $delivery_id 发货单ID
* @return array
*/
private function _interceptDelivery($delivery_id)
{
$deliveryModel = app::get('ome')->model('delivery');
$delivery = $deliveryModel->db_dump($delivery_id, 'delivery_id,delivery_bn,status,branch_id');
if (empty($delivery)) {
return array('rsp' => 'fail', 'msg' => '发货单不存在');
}
// 调用发货单拦截接口
$branchModel = app::get('ome')->model('branch');
$branch = $branchModel->db_dump($delivery['branch_id'], 'wms_id');
$wms_id = $branch ? $branch['wms_id'] : 0;
if ($wms_id) {
$data = array(
'delivery_bn' => $delivery['delivery_bn'],
);
$interceptResult = kernel::single('ome_event_trigger_delivery')->cut('wms', $wms_id, $data);
if ($interceptResult['rsp'] != 'succ') {
return array('rsp' => 'fail', 'msg' => isset($interceptResult['msg']) ? $interceptResult['msg'] : '拦截发货单失败');
}
}
return array('rsp' => 'succ', 'msg' => '拦截发货单成功');
}
/**
* 处理上传的文件
*
* @param array $file 文件信息
* @param array $allowedTypes 允许的文件类型
* @param object $storager 存储对象
* @return string|false 文件URL或false失败时返回false错误信息通过异常抛出
* @throws Exception 文件验证失败时抛出异常
*/
public function processUploadedFile($file, $allowedTypes, $storager)
{
// 检查文件是否上传
if ($file['error'] != UPLOAD_ERR_OK || empty($file['name'])) {
return false;
}
// 检查文件大小500K限制
if ($file['size'] > 512000) {
throw new Exception('上传文件不能超过500K');
}
// 检查文件类型
$imgext = strtolower($this->fileext($file['name']));
if (!in_array($imgext, $allowedTypes)) {
$text = implode(",", $allowedTypes);
throw new Exception("您只能上传以下类型文件{$text}");
}
// 上传文件
$msg = '';
$id = $storager->save_upload($file, "file", "", $msg);
if (!$id) {
throw new Exception('图片上传失败:' . ($msg ? $msg : '未知错误'));
}
// 获取文件URL
$picUrl = $storager->getUrl($id, "file");
return $picUrl ? $picUrl : false;
}
/**
* 获取文件扩展名
*
* @param string $filename 文件名
* @return string 扩展名
*/
private function fileext($filename)
{
return substr(strrchr($filename, '.'), 1);
}
/**
* 格式化补寄申请单的收货人信息
* 参考 dealExchangeEncrypt 方法处理密文 oaid
*
* @param array $reshipping 补寄申请单信息
* @return array 收货人信息
*/
private function _formatReshippingConsignee($reshipping)
{
$subfix = '';
// 处理 oaid 密文
if ($reshipping['oaid']) {
$subfix = '>>' . $reshipping['oaid'] . kernel::single('ome_security_hash')->get_code();
}
// 构建地址区域
$ship_area = '';
if ($reshipping['buyer_province']) {
$ship_area = $reshipping['buyer_province'];
if ($reshipping['buyer_city']) {
$ship_area .= '/' . $reshipping['buyer_city'];
}
if ($reshipping['buyer_district']) {
$ship_area .= '/' . $reshipping['buyer_district'];
}
if ($reshipping['buyer_town']) {
$ship_area .= '/' . $reshipping['buyer_town'];
}
}
// 验证地址区域
if ($ship_area) {
kernel::single('ome_func')->region_validate($ship_area);
}
// 构建收货人信息
$consignee = array(
'name' => strpos($reshipping['buyer_name'], '*') !== false ? $reshipping['buyer_name'] . $subfix : $reshipping['buyer_name'],
'addr' => strpos($reshipping['buyer_address'], '*') !== false ? $reshipping['buyer_address'] . $subfix : $reshipping['buyer_address'],
'zip' => '',
'telephone' => '',
'mobile' => strpos($reshipping['buyer_phone'], '*') !== false ? $reshipping['buyer_phone'] . $subfix : $reshipping['buyer_phone'],
'email' => '',
'area' => $ship_area,
);
return $consignee;
}
/**
* 保存补寄申请单的收件人敏感数据
* 参考 dealExchangeEncrypt 方法处理密文 oaid
*
* @param int $order_id 补发订单ID
* @param array $reshipping 补寄申请单信息
* @return bool
*/
private function _saveReshippingReceiverEncrypt($order_id, $reshipping)
{
$receiverObj = app::get('ome')->model('order_receiver');
// 构建收件人敏感数据
$receiverData = array(
'order_id' => $order_id,
);
// 如果有 oaid保存到 receiver 表
if ($reshipping['oaid']) {
$receiverData['encrypt_source_data'] = json_encode(array('oaid' => $reshipping['oaid']));
}
// 保存收件人敏感数据
$receiverObj->save($receiverData);
return true;
}
}