Files
OMS/app/ome/lib/event/trigger/shop/vopbill.php
2026-01-04 17:22:44 +08:00

344 lines
16 KiB
PHP

<?php
/**
* Copyright 2026 ShopeX (https://www.shopex.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
class ome_event_trigger_shop_vopbill {
public function getBillNumber($startTime, $endTime, $shopId) {
$pageNo = 1;
$model = app::get('console')->model('vopbill');
do {
$sdf = ['start_time' => $startTime, 'end_time' => $endTime, 'page_no'=>$pageNo, 'page_size'=>'50'];
$result = kernel::single('erpapi_router_request')->set('shop', $shopId)->finance_getBillNumber($sdf);
if (empty($result['data'])) {
break;
}
foreach ($result['data'] as $v) {
if(!$model->db_dump(['bill_number'=>$v])) {
$data = ['bill_number'=>$v, 'shop_id'=>$shopId, 'get_time'=>$endTime, 'create_time'=>time()];
$model->insert($data);
}
}
$pageNo ++;
} while(true);
}
public function getBillDetail($row) {
if(empty($row['id']) || empty($row['bill_number']) || empty($row['shop_id'])) {
return [false, '数据不全'];
}
$mainObj = app::get('console')->model('vopbill');
$filter = [
'status' => '0',
'sync_status' => '0',
'id' => $row['id']
];
$rs = $mainObj->update(['sync_status'=>'1', 'last_modified'=>time()], $filter);
if(is_bool($rs)) {
return [false, '并发了'];
}
$pageNo = 1;
$start_time = $row['get_time'] - 90*86400;
$itemObj = app::get('console')->model('vopbill_items');
$amountObj = app::get('console')->model('vopbill_amount');
$basicObj = kernel::single('material_basic_material');
do {
$sdf = ['start_time' => $start_time, 'end_time' => $row['get_time'], 'bill_number'=>$row['bill_number'], 'page_no'=>$pageNo, 'page_size'=>'100'];
$result = kernel::single('erpapi_router_request')->set('shop', $row['shop_id'])->finance_getBillDetail($sdf);
if($result['rsp'] == 'fail'){
$mainObj->update(['sync_status'=>'0'], ['id'=>$row['id']]);
}
if (empty($result['data']['items'])) {
if ($result['data']['count'] === 0){
$mainObj->update(['sync_status'=>'2'], ['id'=>$row['id']]);
}
break;
}
if($result['data']['count']) {
$mainObj->update(['sku_count'=>$result['data']['count']], ['id'=>$row['id']]);
}
foreach ($result['data']['items'] as $v) {
if(!$itemObj->db_dump(['origin_id'=>$v['id']])) {
kernel::database()->beginTransaction();
$detailLineType = $v['detailLineType'] == 'DR_CUST_EXTRA' ? 'DR_CUST' : $v['detailLineType'];
if($v['detailLineType'] == 'OTHER') {
if($v['dataSign'] > 0) {
$detailLineType = 'CR_CUST';
} else {
$detailLineType = 'DR_CUST';
}
}
$insertItem = [
'bill_id' => $row['id'],
'origin_id' => $v['id'],
'barcode' => $v['itemNo'],
'product_name' => $v['itemDescription'],
'detail_line_type' => $detailLineType,
'detail_line_name' => $v['detailLineName'],
'shop_id' => $row['shop_id'],
'qty' => $v['quantity'],
'price' => $v['billTaxPrice'],
'totalbillamount'=>$v['totalBillAmount'],
'datasign' => $v['dataSign'],
'addon' => json_encode($v),
];
$itemObj->insert($insertItem);
if(!$insertItem['id']) {
kernel::database()->rollBack();
continue;
}
$updateBillSql = 'update sdb_console_vopbill set get_count=get_count+1 ';
if($v['detailLineType'] == 'OTHER') {
$updateBillSql .= ' ,other_amount=other_amount+'.($insertItem['datasign'] * $insertItem['totalbillamount']).',other_quantity=other_quantity+'.($v['quantity']*$insertItem['datasign']);
}elseif($insertItem['detail_line_type'] == 'CR_CUST') {
$updateBillSql .= ' ,cr_cust_amount=cr_cust_amount+'.$insertItem['totalbillamount'].',cr_cust_quantity=cr_cust_quantity+'.$insertItem['qty'];
}elseif($insertItem['detail_line_type'] == 'DR_CUST') {
$updateBillSql .= ' ,dr_cust_amount=dr_cust_amount+'.$insertItem['datasign']*$insertItem['totalbillamount'].',dr_cust_quantity=dr_cust_quantity+'.$insertItem['qty'];
}
$updateBillSql .= ' where id='.$row['id'];
$mainObj->db->exec($updateBillSql);
$amount = $insertItem['totalbillamount']*$insertItem['datasign'];
$insertAmount = [
'bill_id' => $row['id'],
'bm_id' => '0',
'bn' => '0',
'bill_number' => $row['bill_number'],
'barcode' => $insertItem['barcode'],
'product_name' => $insertItem['product_name'],
'detail_line_type' => $insertItem['detail_line_type'],
'detail_line_name' => $insertItem['detail_line_name'],
'shop_id' => $insertItem['shop_id'],
'qty' => $insertItem['qty']*$insertItem['datasign'],
'amount' => $amount,
];
$amountFilter = [
'detail_line_type' => $insertAmount['detail_line_type'],
'bill_id' => $insertAmount['bill_id'],
'barcode' => $insertAmount['barcode'],
];
$oldAmount = $amountObj->db_dump($amountFilter, 'id');;
if($oldAmount) {
$sql = 'update sdb_console_vopbill_amount
set qty=qty+'.$insertAmount['qty'].',amount=amount+'.$insertAmount['amount'].' where id='.$oldAmount['id'];
$amountObj->db->exec($sql);
$insertAmount['id'] = $oldAmount['id'];
} else {
$amountObj->insert($insertAmount);
}
$itemObj->update(['bill_amount_id'=>$insertAmount['id']], ['id'=>$insertItem['id']]);
kernel::database()->commit();
}
}
$nbRow = $mainObj->db_dump(['id'=>$row['id']], 'sku_count,get_count');
if($nbRow['get_count'] >= $nbRow['sku_count']) {
$mainObj->db->exec("UPDATE sdb_console_vopbill_amount SET total_amount=(amount+discount_amount) WHERE bill_id=".$row['id']."");
//做sum更新
$mainObj->update(['sync_status'=>'2'], ['id'=>$row['id']]);
break;
}
$pageNo ++;
} while(true);
return [true];
}
/**
* dataSign*totalBillAmount
*/
public function getBillDiscountDetail($row) {
$amountObj = app::get('console')->model('vopbill_amount');
$discountObj = app::get('console')->model('vopbill_discount');
$mainObj = app::get('console')->model('vopbill');
$filter = [
'status' => '0',
'discount_sync_status' => '0',
'id' => $row['id']
];
$rs = $mainObj->update(['discount_sync_status'=>'1', 'last_modified'=>time()], $filter);
if(is_bool($rs)) {
return [false, '并发了'];
}
$start_time = $row['get_time'] - 90*86400;
$pageNo = 1;
do {
$sdf = ['start_time' => $start_time, 'end_time' => $row['get_time'], 'bill_number'=>$row['bill_number'], 'page_no'=>$pageNo, 'page_size'=>'150'];
$result = kernel::single('erpapi_router_request')->set('shop', $row['shop_id'])->finance_getBillDiscountDetail($sdf);
if (empty($result['data']['items'])) {
if ($result['data']['count'] === 0){
$mainObj->update(['discount_sync_status'=>'2'], ['id'=>$row['id']]);
}
break;
}
if($result['data']['count']) {
$mainObj->update(['discount_count'=>$result['data']['count']], ['id'=>$row['id']]);
}
foreach ($result['data']['items'] as $v) {
if(!$discountObj->db_dump(['origin_id'=>$v['id']])) {
kernel::database()->beginTransaction();
$insertItem = [
'bill_id' => $row['id'],
'origin_id' => $v['id'],
'bill_amount_id' => $oldAmount['id'],
'bill_number' => $row['bill_number'],
'ordernum' => $v['orderNum'],
'barcode' => $v['itemNo'],
'product_name' => $v['itemDescription'],
'detail_line_type' => $v['detailLineType'],
'detail_line_name' => $v['detailLineName'],
'shop_id' => $row['shop_id'],
'datasign' => $v['dataSign'],
'totalbillamount' => $v['totalBillAmount'],
'addon' => json_encode($v),
];
$amountFilter = [
'bill_id' => $insertItem['bill_id'],
'barcode' => $insertItem['barcode'],
];
if($v['detailLineType'] == 'CR_CUST_DISCOUNT'){
$amountFilter['detail_line_type'] = 'CR_CUST';
}else if($v['detailLineType'] == 'DR_CUST_DISCOUNT'){
$amountFilter['detail_line_type'] = 'DR_CUST';
}
$oldAmount = $amountObj->db_dump($amountFilter, 'id');
$insertItem['bill_amount_id'] = $oldAmount['id'];
$discountObj->insert($insertItem);
if(!$insertItem['id']) {
kernel::database()->rollBack();
continue;
}
$discount_amount = $insertItem['datasign']*$insertItem['totalbillamount'];
if($oldAmount){//更新对应online_type行
$updateamountsql = 'update sdb_console_vopbill_amount SET discount_amount=discount_amount+'.$discount_amount.' WHERE id='.$oldAmount['id'];
$mainObj->db->exec($updateamountsql);
}
$updateBillSql = 'update sdb_console_vopbill set get_discount_count=get_discount_count+1,discount_amount=discount_amount+'.$discount_amount;
$updateBillSql .= ' where id='.$row['id'];
$mainObj->db->exec($updateBillSql);
kernel::database()->commit();
}
}
$nbRow = $mainObj->db_dump(['id'=>$row['id']], 'discount_count,get_discount_count');
if($nbRow['get_discount_count'] >= $nbRow['discount_count']) {
$mainObj->db->exec("UPDATE sdb_console_vopbill_amount SET total_amount=(amount+discount_amount) WHERE bill_id=".$row['id']."");
//做sum更新
$mainObj->update(['discount_sync_status'=>'2'], ['id'=>$row['id']]);
break;
}
$pageNo ++;
} while(true);
}
public function getItemSourceDetail($row){
$detailMdl = app::get('console')->model('vopbill_detail');
$pageNo = 1;
$start_time = $row['get_time'] - 90*86400;
do {
$sdf = ['start_time' => $start_time, 'end_time' => $row['get_time'], 'bill_number'=>$row['bill_number'], 'page_no'=>$pageNo, 'page_size'=>'50'];
$result = kernel::single('erpapi_router_request')->set('shop', $row['shop_id'])->finance_getItemSourceDetail($sdf);
if (empty($result['data']['items'])) {
if ($result['data']['count'] === 0){
}
break;
}
if($result['data']['count']) {
$mainObj->update(['detail_count'=>$result['data']['count']], ['id'=>$row['id']]);
}
foreach ($result['data']['items'] as $v) {
if(!$detailMdl->db_dump(['globalid'=>$v['globalId']])) {
kernel::database()->beginTransaction();
$insertItem = [
'bill_id' => $row['id'],
'bill_number' => $row['bill_number'],
'shop_id' => $row['shop_id'],
'globalid' => $v['globalId'],
'barcode' => $v['itemNo'],
'quantity' => $v['quantity'],
'source' => $v['source'],
'sourcetype' => $v['sourceType'],
'amount' => $v['amount'],
'targetamount' => $v['targetAmount'],
'expid' => $v['expId'],
'extordernum' => $v['extOrderNum'],
'feeitem' => $v['feeItem'],
'addon' => json_encode($v),
];
$detailMdl->insert($insertItem);
if(!$insertItem['id']) {
kernel::database()->rollBack();
continue;
}
$updateBillSql = 'update sdb_console_vopbill set get_detail_count=get_detail_count+1 where id='.$row['id'];
$mainObj->db->exec($updateBillSql);
kernel::database()->commit();
}
}
$nbRow = $mainObj->db_dump(['id'=>$row['id']], 'sku_count,get_count');
if($nbRow['detail_count'] >= $nbRow['get_detail_count']) {
//做sum更新
$mainObj->update(['sync_status'=>'2'], ['id'=>$row['id']]);
break;
}
$pageNo ++;
} while(true);
}
}