1. 新增药品的ERP抓取数量倍数

This commit is contained in:
李琦
2026-07-14 08:24:27 +08:00
parent 9ed40a41c0
commit c9bcd77d82
2 changed files with 64 additions and 18 deletions

View File

@@ -32,6 +32,7 @@ namespace common\modelsgii\oldDb;
* @property string|null $drug_alias 药品别名
* @property string|null $place 产地
* @property int $decotion 煎法
* @property float $erp_qty_factor ERP抓取数量倍数默认1
* @property int $updated_at
* @property int $created_at
*/

View File

@@ -9,6 +9,7 @@ namespace platform\modules\v1\controllers;
use common\jobs\ProductOrderSendJob;
use common\jobs\templateMessage\ProductOrderSend;
use common\models\oldDb\ExpressNos;
use common\models\oldDb\Drug;
use common\models\oldDb\Prescription;
use common\models\oldDb\ProductOrder;
use common\models\oldDb\ProductOrderLog;
@@ -40,7 +41,7 @@ class ErpController extends Controller
ProductOrderLog::saveLog(0,'江奥川ERP拉取西(中成)药订单开始 startDate:'.$post['startDate'].' endDate:'.$post['endDate']);
$startDate = strtotime($post['startDate']);
$endDate = strtotime($post['endDate']) + 86400;
$productOrders = ProductOrder::find()->alias('po')->where([
'po.prescription_type' => 2,
'po.is_sync_erp' => 0,
@@ -53,6 +54,8 @@ class ErpController extends Controller
->with(['orderItems','store', 'prescription'])
->asArray()
->all();
// 批量加载药品 ERP 数量倍数,避免循环内逐条查询
$drugFactorMap = $this->buildDrugErpQtyFactorMap($productOrders);
//解析成erp所需参数订单详情是否需要改动 - 线上订单的展示)
$erpData = [];
$ids = [];
@@ -94,14 +97,7 @@ class ErpController extends Controller
$orderItems = [];
foreach($v['orderItems'] as $vk=>$vv){
// $drug = Drug::findOne($vv['drug_id']);
$orderItems[$vk] = [
'detailId' => $vv['id'],
'productSku' => $vv['drug_no'],
'quantity' => $vv['number'],
'paymentPrice' => $vv['buy_price'],
'price' => round($vv['number'] * $vv['buy_price'], 2)
];
$orderItems[$vk] = $this->buildErpOrderItem($vv, $drugFactorMap);
}
$erpData[$k]['orderItems'] = $orderItems;
@@ -140,14 +136,7 @@ class ErpController extends Controller
$orderItems = [];
foreach($v['orderItems'] as $vk=>$vv){
// $drug = Drug::findOne($vv['drug_id']);
$orderItems[$vk] = [
'detailId' => $vv['id'],
'productSku' => $vv['drug_no'],
'quantity' => $vv['number'],
'paymentPrice' => $vv['buy_price'],
'price' => round($vv['number'] * $vv['buy_price'], 2)
];
$orderItems[$vk] = $this->buildErpOrderItem($vv, $drugFactorMap);
}
$erpData[$k]['orderItems'] = $orderItems;
@@ -158,7 +147,7 @@ class ErpController extends Controller
}
}
// ds($erpData);
ds($erpData);
if(!empty($ids)){
//更新为已同步erp
\Yii::$app->db->createCommand()->update('yii_product_order', [
@@ -184,6 +173,62 @@ class ErpController extends Controller
return $erpData;
}
/**
* 从待同步订单中收集 drug_id批量查询 ERP 数量倍数
* @param array $productOrders
* @return array<int, float> drug_id => factor
*/
private function buildDrugErpQtyFactorMap(array $productOrders): array
{
$drugIds = [];
foreach ($productOrders as $order) {
if (empty($order['orderItems'])) {
continue;
}
foreach ($order['orderItems'] as $item) {
if (!empty($item['drug_id'])) {
$drugIds[] = (int) $item['drug_id'];
}
}
}
$drugIds = array_unique($drugIds);
if (empty($drugIds)) {
return [];
}
$rows = Drug::find()
->select(['id', 'erp_qty_factor'])
->where(['id' => $drugIds])
->asArray()
->all();
$map = [];
foreach ($rows as $row) {
$factor = (float) ($row['erp_qty_factor'] ?? 1);
$map[(int) $row['id']] = $factor > 0 ? $factor : 1;
}
return $map;
}
/**
* 构建 ERP 订单明细quantity 按药品倍数换算price 仍按原订单数量
* @param array $item 订单明细
* @param array<int, float> $drugFactorMap
* @return array
*/
private function buildErpOrderItem(array $item, array $drugFactorMap): array
{
$drugId = (int) ($item['drug_id'] ?? 0);
$factor = $drugFactorMap[$drugId] ?? 1;
$originQty = (int) ($item['number'] ?? 0);
$erpQty = (int) round($originQty * $factor);
return [
'detailId' => $item['id'],
'productSku' => $item['drug_no'],
'quantity' => $erpQty,
'paymentPrice' => $item['buy_price'],
'price' => round($originQty * $item['buy_price'], 2),
];
}
/**
* @author: liudiao
* @Date: 2023-08-01 14:10:45