diff --git a/common/modelsgii/oldDb/Drug.php b/common/modelsgii/oldDb/Drug.php index e28da74..8f78868 100644 --- a/common/modelsgii/oldDb/Drug.php +++ b/common/modelsgii/oldDb/Drug.php @@ -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 */ diff --git a/platform/modules/v1/controllers/ErpController.php b/platform/modules/v1/controllers/ErpController.php index 7c5df4d..261ceb4 100644 --- a/platform/modules/v1/controllers/ErpController.php +++ b/platform/modules/v1/controllers/ErpController.php @@ -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 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 $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