1. 新增药品的ERP抓取数量倍数
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user