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

View File

@@ -54,6 +54,7 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
'xiaomi' => 'XMYP',
'dewu' => 'DW',
'wxshipin' => 'WXSPHXD',
'aikucun' => 'AKC',
);
public function delivery_cancel($sdf){
@@ -189,7 +190,9 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
}
//订单来源标识
if ($sdf['shop_type'] == 'taobao' && $sdf['shop_id'] && $sdf['createway'] == 'matrix') {
if (($sdf['shop_type'] == 'taobao' && $sdf['shop_id'] && $sdf['createway'] == 'matrix') || ($sdf['order_source'] == 'platformexchange' && $order_source)) {
//矩阵下发的淘宝订单 或 平台换货生成的新订单
$params['order_source'] = $order_source;
//判断是不是天猫
$shopInfo = $shopObj->dump(array('shop_id'=>$sdf['shop_id'],'tbbusiness_type'=>'B'));
if ($shopInfo) {
@@ -198,9 +201,6 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
}elseif ($sdf['platform_encrypt'] == true && $order_source){
//平台加密订单
$params['order_source'] = $order_source;
}elseif($sdf['order_source'] == 'platformexchange' && $order_source){
//平台换货生成的新订单
$params['order_source'] = $order_source;
}
}
@@ -301,8 +301,29 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
if (in_array(kernel::single('ome_bill_label')->isExpressMust(), (array)$labelCode)) {
$order_flag[] = 'MODIFYTRANSPORT';
}
// 国补订单(京东平台国补拍照信息gov_photo_check)
if(in_array($sdf['shop_type'], ['360buy', 'jd'])){
$guoBuLabelInfo = [];
$tempOrderBns = explode('|', $sdf['order_bn']);
$order_bn = $tempOrderBns[0];
$orderInfo = app::get('ome')->model('orders')->dump(array('order_bn'=>$order_bn), 'order_id,order_bn');
if($orderInfo){
$guoBuLabelInfo = kernel::single('ome_bill_label')->getBillLabelInfo($orderInfo['order_id'], 'order', 'SOMS_GB');
}
// 国补订单拍照信息
if($guoBuLabelInfo && $guoBuLabelInfo['label_value'] & 0x0400){
$extend_props['gov_photo_check'] = '国补拍照';
// flag
$params['remark'] = '[国补拍照]'. $params['remark'];
}
}
$params['extendProps'] = json_encode($extend_props);
$params['order_flag'] = implode(',', $order_flag);
// 如果三级区不存在,直接使用二级市
$params['receiver_state'] = $this->_formate_receiver_province($params['receiver_state'],$params['receiver_district']);
@@ -336,6 +357,10 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
$params['tid'] = explode('|', $sdf['order_bn']);
$params['tid'] = $params['tid'][0];
}
}elseif(in_array($sdf['shop_type'], ['weimobr', 'weimobv'])){
//@todo必须传tid给美诺WMS侧;当微盟订单没有oaid时必须传tid给美诺WMS侧;
$tempOrders = explode('|', $sdf['order_bn']);
$params['tid'] = $tempOrders[0];
}
// 唯品会,判断是否有优先发货的标签
@@ -372,6 +397,16 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
$params = $this->_get_wms_cross_shop_waybill($params, $sdf);
$params['seller_message'] = $sdf['memo'];
//@todo美诺WMS最多允许传255个字符(一个汉字为3个字符),超出部分需要截取,否则推送报错;
if(strlen($params['seller_message']) > 255){
$params['seller_message'] = kernel::single('ome_func')->substrStringSafe($params['seller_message'], 255);
}
if(strlen($params['remark']) > 255){
$params['remark'] = kernel::single('ome_func')->substrStringSafe($params['remark'], 255);
}
$params['buyer_message'] = $sdf['custom_mark'];
$receiver_name = $params['receiver_name'];
@@ -419,18 +454,57 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
$params['operate_time'] = date('Y-m-d H:i:s');
// 发货单明细详情
$detailItems = [];
$detailItemBns = [];
$dlyDetailMdl = app::get('ome')->model('delivery_items_detail');
$tempItems = $dlyDetailMdl->getList('item_detail_id,delivery_id,delivery_item_id,order_item_id,price,actually_amount,bn,number', array('delivery_id'=>$sdf['delivery_id']));
foreach ($tempItems as $tempItemVal)
{
$product_bn = $tempItemVal['bn'];
$detail_delivery_id = $tempItemVal['delivery_id'];
$delivery_item_id = $tempItemVal['delivery_item_id'];
$actually_amount = is_null($tempItemVal['actually_amount']) ? 0 : $tempItemVal['actually_amount'];
// items
$detailItems[$detail_delivery_id][$delivery_item_id] = $tempItemVal;
// 按货号纬度累加:客户实付
if(!isset($detailItemBns[$product_bn])){
$detailItemBns[$product_bn] = [
'bn' => $product_bn,
'number' => 0,
'actually_amount' => 0,
];
}
$detailItemBns[$product_bn]['number'] += $tempItemVal['number'];
$detailItemBns[$product_bn]['actually_amount'] += $actually_amount;
}
$items = array('item'=>array()); $delivery_items = $sdf['delivery_items'];
if ($delivery_items){
sort($delivery_items);
foreach ($delivery_items as $k => $v){
foreach ($delivery_items as $k => $v)
{
$product_bn = $v['bn'];
$qimen_delivery_id = $v['qimen_delivery_id'];
$delivery_item_id = $v['delivery_items_id'];
// 客户实付(合并发货单,按货号纬度累加后的金额)
$actually_amount = $detailItemBns[$product_bn]['actually_amount'];
// foreign_sku
$foreignsku = app::get('console')->model('foreign_sku')->dump(array('wms_id'=>$this->__channelObj->wms['channel_id'],'inner_sku'=>$v['bn']));
//订单拆单后,回传奇门平台单号要唯一
$productInfo = $arrProductData[$v['product_id']];
//取明细order_item_id
$items_detail = $shopObj->db->selectrow("SELECT order_item_id FROM sdb_ome_delivery_items_detail WHERE delivery_id=".$v['qimen_delivery_id']." AND delivery_item_id=".$v['delivery_items_id']);
//$items_detail = $shopObj->db->selectrow("SELECT order_item_id FROM sdb_ome_delivery_items_detail WHERE delivery_id=".$v['qimen_delivery_id']." AND delivery_item_id=".$v['delivery_items_id']);
$items_detail = $detailItems[$qimen_delivery_id][$delivery_item_id];
//[兼容]合并发货单超过50个字符需要截取
if($appkey && in_array($appkey,array('31417025'))){
$trade_code = $sdf['order_bn'];
@@ -443,6 +517,7 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
{
//$sub_trade_code .= '_'. $v['qimen_delivery_id'];
}
$_item = array(
'item_code' => $foreignsku['oms_sku'] ? $foreignsku['oms_sku'] : $v['bn'],
'item_name' => $v['product_name'],
@@ -458,7 +533,9 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
'item_sale_price' => (float)$v['sale_price'],//成交额
'sub_source_order_code' => $sub_trade_code,
'ownerCode' => $sdf['owner_code'],
'item_actually_amount' => $actually_amount, // 客户实付
);
// 唯品会,判断是否有重点检查
if ($quality_check_itemcode && in_array($_item['item_code'], $quality_check_itemcode)) {
$_item['extendProps'] = ['quality_check_itemcode'=>true];
@@ -559,12 +636,11 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
/**
* 合并订单发货时format格式化明细
* @todoitems明细中第一个订单号必须与receiver_address加密订单一致否则第三方WMS无法解密;
*
*
* @param $sdf
* @param $items
* @return void
*/
public function _formatMergeItems($sdf, $items)
{
$first_order_bn = current(explode('|', $sdf['order_bn']));
@@ -588,7 +664,7 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
/**
* 预售付尾款通知wms接口
*
*
* @param $sdf
* @return string
*/
@@ -599,7 +675,7 @@ class erpapi_wms_matrix_qimen_request_delivery extends erpapi_wms_request_delive
/**
* 预售付尾款通知wms参数
*
*
* @param $sdf
* @return array
*/

View File

@@ -17,19 +17,13 @@
/**
* 退货单推送
*
* @category
* @package
* @category
* @package
* @author chenping<chenping@shopex.cn>
* @version $Id: Z
*/
class erpapi_wms_matrix_qimen_request_reship extends erpapi_wms_request_reship
{
/**
* reship_cancel
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function reship_cancel($sdf){
$title = $this->__channelObj->wms['channel_name'].'退货单取消';
@@ -96,6 +90,7 @@ class erpapi_wms_matrix_qimen_request_reship extends erpapi_wms_request_reship
'item_remark' => '',// TODO: 商品备注
'inventory_type' => $sdf['branch_type'] == 'damaged' ? '101' : '1',// TODO: 库存类型1可销售库存101类型用来定义残次品201冻结类型库存301在途库存
'ownerCode' => $sdf['owner_code'],
'sn' => $v['sn'] ? ['sn' => $v['sn']] : '',
);
}
}
@@ -121,4 +116,4 @@ class erpapi_wms_matrix_qimen_request_reship extends erpapi_wms_request_reship
return $params;
}
}
}

View File

@@ -17,30 +17,18 @@
/**
* 入库单推送
*
* @category
* @package
* @category
* @package
* @author chenping<chenping@shopex.cn>
* @version $Id: Z
*/
class erpapi_wms_matrix_qimen_request_stockin extends erpapi_wms_request_stockin
{
/**
* stockin_cancel
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function stockin_cancel($sdf){
$stockin_bn = $sdf['io_bn'];
$title = $this->__channelObj->wms['channel_name'] . '入库单取消';
$params = array(
'order_type' => $this->transfer_stockin_type($sdf['io_type']),
'out_order_code' => $stockin_bn,
'warehouse_code' => $this->get_warehouse_code($this->__channelObj->wms['channel_id'],$sdf['branch_bn']),
'order_id' => $sdf['out_iso_bn'],
);
protected function _format_stockin_cancel_params($sdf)
{
$params = parent::_format_stockin_cancel_params($sdf);
$params['warehouse_code'] = $this->get_warehouse_code($this->__channelObj->wms['channel_id'],$sdf['branch_bn']);
$params['order_id'] = $sdf['out_iso_bn'];
if (isset($sdf['owner_code'])) {
$params['ownerCode'] = $sdf['owner_code'];
}
@@ -50,7 +38,7 @@ class erpapi_wms_matrix_qimen_request_stockin extends erpapi_wms_request_stockin
$params['order_type'] = $this->transfer_stockin_type('PURCHASE');
}
return $this->__caller->call(WMS_ORDER_CANCEL, $params, null, $title, 10, $stockin_bn);
return $params;
}
protected function _format_stockin_create_params($sdf)
@@ -171,4 +159,4 @@ class erpapi_wms_matrix_qimen_request_stockin extends erpapi_wms_request_stockin
return $params;
}
}
}

View File

@@ -17,19 +17,13 @@
/**
* 出库单推送
*
* @category
* @package
* @category
* @package
* @author chenping<chenping@shopex.cn>
* @version $Id: Z
*/
class erpapi_wms_matrix_qimen_request_stockout extends erpapi_wms_request_stockout
{
/**
* stockout_cancel
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function stockout_cancel($sdf){
$stockout_bn = $sdf['io_bn'];
@@ -210,8 +204,15 @@ class erpapi_wms_matrix_qimen_request_stockout extends erpapi_wms_request_stocko
// $params['extendProps'] = $extendProps;
}
// 仓库自定义字段-活动号
$extend_props = [];
if (isset($sdf['activity_no'])) {
$extend_props['activity_no'] = $sdf['activity_no'];
}
if ($extend_props) {
$params['extendProps'] = json_encode($extend_props);
}
return $params;
}
}
}

View File

@@ -29,20 +29,19 @@ class erpapi_wms_request_delivery extends erpapi_wms_request_abstract
/**
* 发货单暂停
*
*
* @return void
* @author
* */
**/
public function delivery_pause($sdf)
{}
/**
* 发货单暂停恢复
*
*
* @return void
* @author
* */
**/
public function delivery_renew($sdf)
{}
@@ -88,14 +87,15 @@ class erpapi_wms_request_delivery extends erpapi_wms_request_abstract
}
/**
* 发货单创建
*
*
* @return void
* @author
* */
**/
public function delivery_create($sdf)
{
$delivery_bn = $sdf['outer_delivery_bn'];
$channel_id = $this->__channelObj->wms['channel_id'];
$iscancel = kernel::single('ome_interface_delivery')->iscancel($delivery_bn);
if ($iscancel) {
return $this->succ('发货单已取消,终止同步');
@@ -107,13 +107,54 @@ class erpapi_wms_request_delivery extends erpapi_wms_request_abstract
if ($sdf['member']['name'] && $encrytPos = strpos($sdf['member']['name'] , '>>')){
$sdf['member']['name'] = substr($sdf['member']['name'] , 0, $encrytPos);
}
// 自发货标记调用selfwms渠道自动完成发货
//@todo发货单明细里都是虚拟商品,则打标记为虚拟发货单并推送selfwms接口自动完成发货
if(isset($sdf['is_self_shipment']) && $sdf['is_self_shipment'] === true){
// params
$responseData = [
'delivery_bn' => $delivery_bn, // 发货单号
'status' => 'delivery',
'logi_id' => $sdf['logi_id'], // 物流公司ID直接使用发货单上的物流公司ID
'logistics' => $sdf['logi_id'], // 物流公司ID直接使用发货单上的物流公司ID
'logi_no' => $delivery_bn, // 物流单号:直接使用发货单号作为虚拟物流单号
];
// delivery_items
if($sdf['delivery_items']){
$itemList = [];
foreach($sdf['delivery_items'] as $itemVal)
{
$itemList[] = array(
'product_bn' => $itemVal['bn'],
'num' => $itemVal['number'],
);
}
$responseData['item'] = json_encode($itemList);
}
return kernel::single('erpapi_router_response')->set_channel_id($channel_id)->set_api_name('wms.delivery.status_update')->dispatch($responseData);
}
// 加密推送
if ($this->_needEncryptOriginData($sdf)) {
$this->_getEncryptOriginData($sdf);
}
$title = $this->__channelObj->wms['channel_name'] . '发货单添加';
// 通过 service 处理不同 APP 的参数格式化
$params = $this->_format_delivery_create_params($sdf);
// 调用 service 进行参数扩展或修改
if ($service = kernel::servicelist('erpapi.service.wms.delivery.params.format')) {
foreach ($service as $object => $instance) {
if (method_exists($instance, 'format_delivery_create_params')) {
$params = $instance->format_delivery_create_params($sdf, $params, $this->__channelObj);
}
}
}
if (!$params) {
return $this->error('参数为空,终止同步');
}
@@ -163,7 +204,7 @@ class erpapi_wms_request_delivery extends erpapi_wms_request_abstract
/**
* 发货单创建接口名
*
*
* @return void
* @author
*/
@@ -352,12 +393,6 @@ class erpapi_wms_request_delivery extends erpapi_wms_request_abstract
return $params;
}
/**
* delivery_create_callback
* @param mixed $response response
* @param mixed $callback_params 参数
* @return mixed 返回值
*/
public function delivery_create_callback($response, $callback_params)
{
$deliveryObj = app::get('ome')->model('delivery');
@@ -418,10 +453,10 @@ class erpapi_wms_request_delivery extends erpapi_wms_request_abstract
/**
* 发货单取消
*
*
* @return void
* @author
* */
**/
public function delivery_cancel($sdf)
{
$delivery_bn = $sdf['outer_delivery_bn'];
@@ -445,10 +480,10 @@ class erpapi_wms_request_delivery extends erpapi_wms_request_abstract
/**
* 发货单查询
*
*
* @return void
* @author
* */
**/
public function delivery_search($sdf)
{
$delivery_bn = $sdf['delivery_bn'];
@@ -532,11 +567,6 @@ class erpapi_wms_request_delivery extends erpapi_wms_request_abstract
}
# 发货单截单
/**
* delivery_cut
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function delivery_cut($sdf){
$deliveryBn = $sdf['outer_delivery_bn'];
$title = $this->__channelObj->channel['channel_name'] . '发货单截单';
@@ -568,9 +598,9 @@ class erpapi_wms_request_delivery extends erpapi_wms_request_abstract
}
/**
/**
* 预售付尾款通知wms接口
*
*
* @param $sdf
* @return string
*/
@@ -607,12 +637,6 @@ class erpapi_wms_request_delivery extends erpapi_wms_request_abstract
return array();
}
/**
* delivery_notify_callback
* @param mixed $response response
* @param mixed $callback_params 参数
* @return mixed 返回值
*/
public function delivery_notify_callback($response, $callback_params)
{
$rsp = $response['rsp'];

View File

@@ -17,8 +17,8 @@
/**
* 商品分配推送
*
* @category
* @package
* @category
* @package
* @author chenping<chenping@shopex.cn>
* @version $Id: Z
*/
@@ -27,11 +27,10 @@ class erpapi_wms_request_goods extends erpapi_wms_request_abstract
/**
* 商品添加
*
*
* @return void
* @author
* */
**/
public function goods_add($sdf){
$title = $this->__channelObj->wms['channel_name'] . '商品添加';
@@ -57,12 +56,6 @@ class erpapi_wms_request_goods extends erpapi_wms_request_abstract
return $this->__caller->call(WMS_ITEM_ADD, $params, $callback, $title,10);
}
/**
* goods_callback
* @param mixed $response response
* @param mixed $callback_params 参数
* @return mixed 返回值
*/
public function goods_callback($response, $callback_params)
{
$rsp = $response['rsp'];
@@ -143,10 +136,10 @@ class erpapi_wms_request_goods extends erpapi_wms_request_abstract
/**
* 商品编辑
*
*
* @return void
* @author
* */
**/
public function goods_update($sdf){
$title = $this->__channelObj->wms['channel_name'] . '商品编辑';
@@ -223,27 +216,17 @@ class erpapi_wms_request_goods extends erpapi_wms_request_abstract
return $params;
}
/**
* goods_addCombination
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function goods_addCombination($sdf) {
return $this->error('没有该接口');
}
/**
* goods_syncMap
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function goods_syncMap($sdf) {
return $this->error('没有该接口');
}
/**
* 同步库存
*
*
* @return void
* @author
*/
@@ -287,9 +270,16 @@ class erpapi_wms_request_goods extends erpapi_wms_request_abstract
$rs = $this->__caller->call(WMS_STOCK_QUERY, $params, [],$title,10,$sdf['wms_branch_bn']);
if(isset($rs['data'])) {
$data = @json_decode($rs['data'], 1);
$rs['total_count'] = $data['succ'][0]['total_count'];
$data = $data['succ'][0]['item_list'] ? : [];
// total_count
$rs['total_count'] = isset($data['succ'][0]['total_count']) ? intval($data['succ'][0]['total_count']) : 0;
$data = isset($data['succ'][0]['item_list']) ? $data['succ'][0]['item_list'] : [];
$rs['data'] = [];
// check
if(empty($data)){
return $rs;
}
foreach ($data as $v) {
$rs['data'][] = [

View File

@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 退货单推送
*
@@ -45,6 +44,19 @@ class erpapi_wms_request_reship extends erpapi_wms_request_abstract
$title = $this->__channelObj->wms['channel_name'] . '退货单添加';
$params = $this->_format_reship_create_params($sdf);
// 调用 service 进行参数扩展或修改
if ($service = kernel::servicelist('erpapi.service.wms.reship.params.format')) {
foreach ($service as $object => $instance) {
if (method_exists($instance, 'format_reship_create_params')) {
$params = $instance->format_reship_create_params($sdf, $params, $this->__channelObj);
}
}
}
if (!$params) {
return $this->error('参数为空,终止同步');
}
$callback = array(
'class' => get_class($this),
@@ -173,6 +185,7 @@ class erpapi_wms_request_reship extends erpapi_wms_request_abstract
'is_gift' => '0', // TODO: 判断是否为赠品0:不是1:是
'item_remark' => '', // TODO: 商品备注
'inventory_type' => $sdf['branch_type'] == 'damaged' ? '101' : '1', // TODO: 库存类型1可销售库存101类型用来定义残次品201冻结类型库存301在途库存
'sn' => $v['sn'] ? ['sn' => $v['sn']] : '',
);
}
}

View File

@@ -43,11 +43,10 @@ class erpapi_wms_request_stockin extends erpapi_wms_request_abstract
/**
* 入库单创建
*
*
* @return void
* @author
* */
**/
public function stockin_create($sdf){
$stockin_bn = $sdf['io_bn'];
@@ -90,6 +89,12 @@ class erpapi_wms_request_stockin extends erpapi_wms_request_abstract
$params['item_total_num'] = $total;
$params['line_total_count'] = $total;
// 增加service
foreach(kernel::servicelist('erpapi.service.wms.stockin.create.params') as $service){
if(method_exists($service, 'format_stockin_create_params')){
$params = $service->format_stockin_create_params($sdf, $params);
}
}
$callback = array(
'class' => get_class($this),
@@ -109,12 +114,6 @@ class erpapi_wms_request_stockin extends erpapi_wms_request_abstract
} while (true);
}
/**
* stockin_create_callback
* @param mixed $response response
* @param mixed $callback_params 参数
* @return mixed 返回值
*/
public function stockin_create_callback($response, $callback_params)
{
// 更新外部编码
@@ -244,7 +243,14 @@ class erpapi_wms_request_stockin extends erpapi_wms_request_abstract
$params = $this->_format_stockin_cancel_params($sdf);
return $this->__caller->call(WMS_INORDER_CANCEL, $params, null, $title, 10, $stockin_bn);
// 增加service
foreach(kernel::servicelist('erpapi.service.wms.stockin.cancel.params') as $service){
if(method_exists($service, 'format_stockin_cancel_params')){
$params = $service->format_stockin_cancel_params($sdf, $params);
}
}
return $this->__caller->call(WMS_ORDER_CANCEL, $params, null, $title, 10, $stockin_bn);
}
protected function _format_stockin_cancel_params($sdf)

View File

@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* WMS 发货单
*
@@ -40,7 +39,7 @@ class erpapi_wms_response_delivery extends erpapi_wms_response_abstract
$batch_logi_no = array_filter(explode(';', $batch_logi_no));
$logi_no = array_pop($batch_logi_no);
if ($this->__channelObj->wms['adapter'] != 'selfwms' && $params['status'] == 'DELIVERY' && !$logi_no) {
if ($this->__channelObj->wms['adapter'] != 'selfwms' && $params['status'] == 'DELIVERY' && $params['logistics'] && !$logi_no) {
$this->__apilog['result']['msg'] = '缺少运单号';
return false;
}

View File

@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 发货
*
@@ -99,6 +98,30 @@ class erpapi_wms_response_process_delivery
}
}
// WMS 回传无物流公司、无运单号时:非大件物流须报错(大件在 OMS 内会用发货单号兜底运单号)
if ($params['status'] == 'delivery') {
$logiIdEmpty = empty($params['logi_id']);
$logiNoEmpty = trim((string)($params['logi_no'] ?? '')) === '';
$billHasLogi = !empty($params['bill_logi_no']) && is_array($params['bill_logi_no'])
&& array_filter(array_map('trim', $params['bill_logi_no']));
if ($logiIdEmpty && $logiNoEmpty && !$billHasLogi) {
$deliveryRow = app::get('ome')->model('delivery')->dump(
array('delivery_bn' => $params['delivery_bn']),
'logi_id'
);
if (empty($deliveryRow['logi_id'])) {
return array('rsp' => 'fail', 'msg' => '缺少物流公司');
}
$corpRow = app::get('ome')->model('dly_corp')->dump(
array('corp_id' => $deliveryRow['logi_id']),
'corp_model'
);
if (empty($corpRow['corp_model']) || $corpRow['corp_model'] != 'heavy') {
return array('rsp' => 'fail', 'msg' => '缺少物流公司运单号');
}
}
}
// 如果发货提前触发AG
if ($params['status'] == 'delivery' && $params['node_type'] == 'yjdf') {
$this->delivery_refundAg($params['delivery_bn'], $params['status']);

View File

@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 库存对账
*
@@ -47,7 +46,7 @@ class erpapi_wms_response_process_stock
$isFail = false;
$msg = [];
foreach ($items as $item) {
$uniqueBn = sha1($item['order_code'].'-|-'.$item['order_type'].'-|-'.$item['batch_code'].'-|-'.$item['warehouse'].'-|-'.$item['product_bn'].'-|-'.$item['wms_node_id'].'-|-'.$item['normal_num'].'-|-'.$item['defective_num']);
$uniqueBn = sha1($item['order_code'].'-|-'.$item['order_type'].'-|-'.$item['batch_code'].'-|-'.$item['warehouse'].'-|-'.$item['product_bn'].'-|-'.$item['wms_node_id'].'-|-'.$item['normal_num'].'-|-'.$item['defective_num'].'-|-'.$item['out_biz_code']);
$item['unique_bn'] = $uniqueBn;
if (!$item['change_time']){

View File

@@ -43,6 +43,7 @@ class erpapi_wms_response_process_storeprocess {
}
private function _dealStatus($sdf){
$tmp = $this->tmp_dealStatus($sdf);
return $tmp;
}

View File

@@ -17,8 +17,8 @@
/**
* 退货单
*
* @category
* @package
* @category
* @package
* @author chenping<chenping@shopex.cn>
* @version $Id: Z
*/
@@ -26,9 +26,8 @@ class erpapi_wms_response_reship extends erpapi_wms_response_abstract
{
/**
* wms.reship.status_update
*
* */
*
**/
public function status_update($params){
$this->__apilog['title'] = $this->__channelObj->wms['channel_name'] . '退货单' . $params['reship_bn'];
@@ -73,14 +72,32 @@ class erpapi_wms_response_reship extends erpapi_wms_response_abstract
if($items){
foreach($items as $key=>$val){
if (!$val['product_bn']) continue;
$reship_items[$val['product_bn']]['bn'] = $val['product_bn'];
$reship_items[$val['product_bn']]['normal_num'] = (int)$reship_items[$val['product_bn']]['normal_num'] + (int)$val['normal_num'];
$reship_items[$val['product_bn']]['defective_num'] = (int)$reship_items[$val['product_bn']]['defective_num'] + (int)$val['defective_num'];
$key = trim($val['product_bn']);
if(app::get('ome')->getConf('wms.goods.type.branch') == 1) {
if(empty($val['inventoryType'])) {
$this->__apilog['result']['msg'] = '缺少商品库位';
return false;
}
$arrTypeBranch = [];
if(!$arrTypeBranch[$val['inventoryType']]) {
$arrTypeBranch[$val['inventoryType']] = kernel::single('ome_branch_type')->getBranchByTypeWms($val['inventoryType'], $this->__channelObj->wms['channel_id'], $params['warehouse']);
}
if(!$arrTypeBranch[$val['inventoryType']]) {
$this->__apilog['result']['msg'] = '商品库位对应的仓库不存在';
return false;
}
$key = $key . '-|-' . $arrTypeBranch[$val['inventoryType']]['branch_id'];
$reship_items[$key]['branch_id'] = $arrTypeBranch[$val['inventoryType']]['branch_id'];
$val['normal_num'] = (int)$val['normal_num'] + (int)$val['defective_num'];
$val['defective_num'] = 0;
}
$reship_items[$key]['bn'] = $val['product_bn'];
$reship_items[$key]['normal_num'] = (int)$reship_items[$key]['normal_num'] + (int)$val['normal_num'];
$reship_items[$key]['defective_num'] = (int)$reship_items[$key]['defective_num'] + (int)$val['defective_num'];
if(is_array($val['sn_list']) && $val['sn_list']['sn']) {
$sn_list = is_array($val['sn_list']['sn']) ? $val['sn_list']['sn'] : [$val['sn_list']['sn']];
$reship_items[$val['product_bn']]['sn_list'] = $reship_items[$val['product_bn']]['sn_list'] ? array_merge($reship_items[$val['product_bn']]['sn_list'], $sn_list) : $sn_list;
$reship_items[$key]['sn_list'] = $reship_items[$key]['sn_list'] ? array_merge($reship_items[$key]['sn_list'], $sn_list) : $sn_list;
}
if($val['batch']) {
$v = $val['batch'];
@@ -89,7 +106,7 @@ class erpapi_wms_response_reship extends erpapi_wms_response_abstract
foreach ($v as $vv) {
if ($vv['actualQty'] == 0) continue;
$reship_items[$val['product_bn']]['batch'][] = array(
$reship_items[$key]['batch'][] = array(
'purchase_code' => $vv['batchCode'],
'produce_code' => $vv['produceCode'],
'product_time' => strtotime($vv['productDate']),
@@ -101,7 +118,7 @@ class erpapi_wms_response_reship extends erpapi_wms_response_abstract
} else {
if ($v['actualQty'] == 0) continue;
$reship_items[$val['product_bn']]['batch'][] = array(
$reship_items[$key]['batch'][] = array(
'purchase_code' => $v['batchCode'],
'produce_code' => $v['produceCode'],
'product_time' => strtotime($v['productDate']),
@@ -113,11 +130,69 @@ class erpapi_wms_response_reship extends erpapi_wms_response_abstract
}
}
}
$virtualItems = $this->_getVirtualItems($data['reship_bn']);
if(!empty($virtualItems)) {
$reship_items = array_merge($reship_items, $virtualItems);
}
$data['items'] = $reship_items;
return $data;
}
protected function _getVirtualItems($reship_bn) {
// 获取退货单信息
$reshipMdl = app::get('ome')->model('reship');
$reshipInfo = $reshipMdl->db_dump(array('reship_bn' => $reship_bn), 'reship_id');
if (empty($reshipInfo)) {
return array();
}
// 获取退货明细
$reshipItemMdl = app::get('ome')->model('reship_items');
$reshipItems = $reshipItemMdl->getList('bn, num', array(
'reship_id' => $reshipInfo['reship_id'],
'is_del' => 'false'
));
if (empty($reshipItems)) {
return array();
}
// 提取所有bn
$bns = array_column($reshipItems, 'bn');
if (empty($bns)) {
return array();
}
// 查询虚拟类型的基础物料
$basicMaterialMdl = app::get('material')->model('basic_material');
$virtualMaterials = $basicMaterialMdl->getList('material_bn', array(
'material_bn' => $bns,
'type' => 5, // 虚拟类型
'disabled' => 'false'
));
if (empty($virtualMaterials)) {
return array();
}
// 获取虚拟物料的bn列表
$virtualBns = array_column($virtualMaterials, 'material_bn');
// 组装结果数据
$result = array();
foreach ($reshipItems as $item) {
if (in_array($item['bn'], $virtualBns)) {
$result[] = array(
'bn' => $item['bn'],
'normal_num' => (int)$item['num']
);
}
}
return $result;
}
protected function _dealWMSParams($params) {
if(empty($params['reship_bn']) && empty($params['return_order_id'])) {
return [false, ['msg'=>'缺少参数']];
@@ -150,7 +225,7 @@ class erpapi_wms_response_reship extends erpapi_wms_response_abstract
$inData['logistics'] = $params['logistics'];
$inData['logi_no'] = $params['logi_no'];
$inData['remark'] = $params['remark'];
$inData['extend_props'] = $params['extend_props'];
$inData['extend_props'] = $params['extendProps'];
$inData['order_type'] = $params['order_type'];
$inData['warehouse'] = $params['warehouse'];
$id = $wrMdl->insert($inData);
@@ -164,12 +239,13 @@ class erpapi_wms_response_reship extends erpapi_wms_response_abstract
$inItems[] = [
'wr_id' => $id,
'product_bn' => $val['product_bn'],
'inventory_type' => $val['inventoryType'],
'normal_num' => $val['normal_num'],
'defective_num' => $val['defective_num'],
'sn_list' => $val['sn_list'] ? json_encode($val['sn_list'], JSON_UNESCAPED_UNICODE) : '',
'batch' => $val['batch'] ? json_encode($val['batch'], JSON_UNESCAPED_UNICODE) : '',
'wms_item_id' => $val['item_id'],
'extend_props' => $val['extend_props'],
'extend_props' => $val['extendProps'],
];
}
$wriMdl = app::get('console')->model('wms_reship_items');
@@ -181,11 +257,6 @@ class erpapi_wms_response_reship extends erpapi_wms_response_abstract
}
#wms.reship.add_complete
/**
* 添加_complete
* @param mixed $params 参数
* @return mixed 返回值
*/
public function add_complete($params) {
$this->__apilog['title'] = $this->__channelObj->channel['channel_name'] . '新建与完成退货单';
$this->__apilog['original_bn'] = $params['returnOrderId'];

View File

@@ -14,8 +14,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 库存对账
*
* @copyright shopex.cn 2013.04.08
* @author dongqiujing<123517746@qq.com>
*/
class erpapi_wms_response_stock extends erpapi_wms_response_abstract
{
/**
@@ -87,6 +91,7 @@ class erpapi_wms_response_stock extends erpapi_wms_response_abstract
'produce_code' => $val['produceCode'],
'expire_date' => $val['expireDate'],
'change_time' => $val['changeTime'],
'out_biz_code' => $val['outBizCode'],
'sn_list' => $val['sn_list'] ? json_encode($val['sn_list'], JSON_UNESCAPED_UNICODE) : '',
'wms_node_id' => $this->__channelObj->wms['node_id'],

View File

@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 入库单
*
@@ -194,6 +193,7 @@ class erpapi_wms_response_stockin extends erpapi_wms_response_abstract
'sn_list' => $val['sn_list'] ? json_encode($val['sn_list'], JSON_UNESCAPED_UNICODE) : '',
'batch' => $val['batch'] ? json_encode($val['batch'], JSON_UNESCAPED_UNICODE) : '',
'wms_item_id' => $val['item_id'],
'inventoryType' => $val['inventoryType'] ? $val['inventoryType'] : '',
];
}
$wriMdl = app::get('console')->model('wms_stockin_items');

View File

@@ -17,8 +17,8 @@
/**
* 供应商推送
*
* @category
* @package
* @category
* @package
* @author chenping<chenping@shopex.cn>
* @version $Id: Z
*/
@@ -31,12 +31,6 @@ abstract class erpapi_wms_selfwms_request_abstract
public $__apilog;
/**
* 初始化
* @param erpapi_channel_abstract $channel channel
* @return mixed 返回值
*/
public function init(erpapi_channel_abstract $channel)
{
$this->__channelObj = $channel;
@@ -45,37 +39,33 @@ abstract class erpapi_wms_selfwms_request_abstract
}
/**
* succ
* @param mixed $msg msg
* @param mixed $msgcode msgcode
* @param mixed $data 数据
* @return mixed 返回值
*/
* 成功输出
*
* @return void
* @author
**/
final public function succ($msg='', $msgcode='', $data=null)
{
return array('rsp'=>'succ', 'msg'=>$msg, 'msg_code'=>$msgcode, 'data'=>$data);
}
/**
* error
* @param mixed $msg msg
* @param mixed $msgcode msgcode
* @param mixed $data 数据
* @return mixed 返回值
*/
* 失败输出
*
* @return void
* @author
**/
final public function error($msg, $msgcode, $data=null)
{
return array('rsp'=>'fail','msg'=>$msg,'msg_code'=>$msgcode,'data'=>$data);
}
/**
* 保存_api_fail
* @param mixed $obj_bn obj_bn
* @param mixed $obj_type obj_type
* @param mixed $method method
* @param mixed $err_msg err_msg
* @return mixed 返回操作结果
*/
* 失败日志
*
* @return void
* @author
**/
final public function save_api_fail($obj_bn,$obj_type,$method,$err_msg)
{
$failApiModel = app::get('erpapi')->model('api_fail');
@@ -96,10 +86,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* undocumented function
*
*
* @return void
* @author
* */
**/
private function request($wms_class,$wms_method,$wms_params)
{
try {
@@ -148,10 +138,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 发货单创建
*
*
* @return void
* @author
* */
**/
public function delivery_create($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '发货单添加';
@@ -179,6 +169,35 @@ abstract class erpapi_wms_selfwms_request_abstract
}elseif($rs['rsp'] == 'succ'){
$failApiModel->delete(array('obj_bn'=>$sdf['outer_delivery_bn'],'obj_type'=>'delivery'));
$consoleDlyLib->update_sync_status($deliverys['delivery_id'], 'send_succ', $msg);
// 自发货标记(selfwms自有仓储自动完成发货)
if($sdf['is_self_shipment'] === true){
$wms_id = $this->__channelObj->wms['channel_id'];
$delivery_bn = $sdf['delivery_bn'];
// params
$data = [];
$data['delivery_bn'] = $delivery_bn; // 发货单号
$data['status'] = 'delivery';
$data['logi_id'] = $sdf['logi_id']; // 物流公司ID直接使用发货单上的物流公司ID
$data['logi_no'] = $delivery_bn; // 物流单号:直接使用发货单号作为虚拟物流单号
// delivery_items
if($sdf['delivery_items']){
$itemList = [];
foreach($sdf['delivery_items'] as $itemVal)
{
$itemList[] = array(
'product_bn' => $itemVal['bn'],
'num' => $itemVal['number'],
);
}
$data['item'] = json_encode($itemList);
}
return kernel::single('erpapi_router_response')->set_channel_id($wms_id)->set_api_name('wms.delivery.status_update')->dispatch($data);
}
}
return $rs;
@@ -186,10 +205,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 发货单暂停
*
*
* @return void
* @author
* */
**/
public function delivery_pause($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '发货单暂停';
$this->original_bn = $sdf['outer_delivery_bn'];
@@ -199,10 +218,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 发货单暂停恢复
*
*
* @return void
* @author
* */
**/
public function delivery_renew($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '发货单恢复';
$this->original_bn = $sdf['outer_delivery_bn'];
@@ -212,10 +231,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 发货单取消
*
*
* @return void
* @author
* */
**/
public function delivery_cancel($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '发货单撤销';
$this->original_bn = $sdf['outer_delivery_bn'];
@@ -225,10 +244,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 商品添加
*
*
* @return void
* @author
* */
**/
public function goods_add($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '添加物料';
@@ -237,10 +256,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 商品编辑
*
*
* @return void
* @author
* */
**/
public function goods_update($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '更新物料';
@@ -249,10 +268,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 退货单创建
*
*
* @return void
* @author
* */
**/
public function reship_create($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '退货单创建';
$this->original_bn = $sdf['reship_bn'];
@@ -262,10 +281,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 退货单创建取消
*
*
* @return void
* @author
* */
**/
public function reship_cancel($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '退货单取消';
$this->original_bn = $sdf['reship_bn'];
@@ -275,10 +294,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 转储单创建
*
*
* @return void
* @author
* */
**/
public function stockdump_create($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '转储单创建';
$this->original_bn = $sdf['stockdump_bn'];
@@ -288,10 +307,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 转储单取消
*
*
* @return void
* @author
* */
**/
public function stockdump_cancel($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '转储单取消';
$this->original_bn = $sdf['stockdump_bn'];
@@ -301,10 +320,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 入库单创建
*
*
* @return void
* @author
* */
**/
public function stockin_create($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '入库单创建';
$this->original_bn = $sdf['io_bn'];
@@ -340,10 +359,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 入库单取消
*
*
* @return void
* @author
* */
**/
public function stockin_cancel($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '入库单取消';
$this->original_bn = $sdf['io_bn'];
@@ -373,10 +392,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 出库单创建
*
*
* @return void
* @author
* */
**/
public function stockout_create($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '出库单创建';
$this->original_bn = $sdf['io_bn'];
@@ -407,10 +426,10 @@ abstract class erpapi_wms_selfwms_request_abstract
/**
* 出库单取消
*
*
* @return void
* @author
* */
**/
public function stockout_cancel($sdf){
$this->title = $this->__channelObj->wms['channel_name'] . '出库单取消';
$this->original_bn = $sdf['io_bn'];
@@ -437,83 +456,43 @@ abstract class erpapi_wms_selfwms_request_abstract
return $this->request($wms_class,$wms_method,$sdf);
}
/**
* supplier_create
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function supplier_create($sdf)
{
return $this->error('接口方法不存在','w402');
}
/**
* branch_getlist
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function branch_getlist($sdf)
{
return $this->error('接口方法不存在','w402');
}
/**
* logistics_getlist
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function logistics_getlist($sdf)
{
return $this->error('接口方法不存在','w402');
}
/**
* delivery_search
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function delivery_search($sdf)
{
return $this->error('接口方法不存在','w402');
}
/**
* reship_search
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function reship_search($sdf)
{
return $this->error('接口方法不存在','w402');
}
/**
* stockin_search
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function stockin_search($sdf)
{
return $this->error('接口方法不存在','w402');
}
/**
* stockout_search
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function stockout_search($sdf)
{
return $this->error('接口方法不存在','w402');
}
/**
* delivery_cut
* @param mixed $sdf sdf
* @return mixed 返回值
*/
public function delivery_cut($sdf)
{
return $this->error('接口方法不存在','w402');
}
}
}

View File

@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 发货单推送
*
@@ -25,4 +24,5 @@
*/
class erpapi_wms_selfwms_request_delivery extends erpapi_wms_selfwms_request_abstract
{
}
}