request->getHeaders(); // $userid = $headers->get('userid'); $secret = $headers->get('secret'); $jacErpConfig = \Yii::$app->params['jac_erp']; if($secret != $jacErpConfig['secret']){ throw new Exception('非法请求'); } $rawData = \Yii::$app->request->rawBody; $post = Json::decode($rawData); if(!$post['startDate'] || !$post['endDate']){ throw new Exception('startDate或endDate不能为空'); } try { 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, ]) ->andWhere([ 'in','po.status',[1,2,3,6,7] ]) ->andWhere(['BETWEEN', 'po.created_at', $startDate, $endDate]) // ->joinWith('approvedPrescription') ->with(['orderItems','store', 'prescription']) ->asArray() ->all(); //解析成erp所需参数(订单详情是否需要改动 - 线上订单的展示) $erpData = []; $ids = []; foreach($productOrders as $k=>$v){ // 如果是商城订单 if ($v['order_type'] == 2) { $erpData[$k]['orderId'] = $v['order_no']; $erpData[$k]['createTime'] = date('Y-m-d H:i:s', $v['created_at']); // $erpData[$k]['userId'] = $v['store']['erp_id']; // 商城订单暂时都用11007诊所来接收订单 $erpData[$k]['userId'] = '37757'; $erpData[$k]['orderStatus'] = $v['status']; $erpData[$k]['orderType'] = $v['type']; $erpData[$k]['totalAmount'] = $v['total_pay_price']; // $erpData[$k]['deliveryAmount'] = $v['trans_expenses']; if($v['delivery_method'] == 1){ //到店自取 // if (!in_array($v['order_type'], [2])) { // $prescriptionContent = Json::decode($v['prescription']['content']); // $erpData[$k]['deliveryName'] = $prescriptionContent['patient']['name']?? ''; // $erpData[$k]['deliveryMobile'] = $prescriptionContent['patient']['mobile']?? ''; // $erpData[$k]['deliveryAddress'] = $v['store']['position']?? ''; // } else { // $erpData[$k]['deliveryName'] = $v['store']['name']?? ''; // $erpData[$k]['deliveryMobile'] = $v['store']['mobile']?? ''; // $erpData[$k]['deliveryAddress'] = $v['store']['position']?? ''; // } $erpData[$k]['deliveryName'] = $v['store']['name']?? ''; $erpData[$k]['deliveryMobile'] = $v['store']['mobile']?? ''; $erpData[$k]['deliveryAddress'] = $v['store']['position']?? ''; } else {//快递到家 $erpData[$k]['deliveryName'] = $v['express_name']; $erpData[$k]['deliveryMobile'] = $v['express_mobile']; $erpData[$k]['deliveryAddress'] = $v['express_region'].$v['express_address']; } $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) ]; } $erpData[$k]['orderItems'] = $orderItems; $ids[]=$v['id']; ProductOrderLog::saveLog(0,'江奥川ERP拉取西(中成)药订单数据:'. $v['id']. ':'. json_encode($orderItems)); // ProductOrderLog::saveLog(0,'江奥川ERP拉取西(中成)药订单数据:'. $v['id']); } else { // 如果是处方订单 if (!empty($v['prescription'])) { // 如果是处方药或者挂号药 if ($v['prescription']['status'] == 1) { $erpData[$k]['orderId'] = $v['order_no']; $erpData[$k]['createTime'] = date('Y-m-d H:i:s', $v['created_at']); $erpData[$k]['userId'] = $v['store']['erp_id']; $erpData[$k]['orderStatus'] = $v['status']; $erpData[$k]['totalAmount'] = $v['total_pay_price']; // $erpData[$k]['deliveryAmount'] = $v['trans_expenses']; if($v['delivery_method'] == 1){ //到店自取 $prescriptionContent = Json::decode($v['prescription']['content']); $erpData[$k]['deliveryName'] = $prescriptionContent['patient']['name']?? ''; $erpData[$k]['deliveryMobile'] = $prescriptionContent['patient']['mobile']?? ''; $erpData[$k]['deliveryAddress'] = $v['store']['position']?? ''; } else {//快递到家 $erpData[$k]['deliveryName'] = $v['express_name']; $erpData[$k]['deliveryMobile'] = $v['express_mobile']; $erpData[$k]['deliveryAddress'] = $v['express_region'].$v['express_address']; } $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) ]; } $erpData[$k]['orderItems'] = $orderItems; $ids[]=$v['id']; ProductOrderLog::saveLog(0,'江奥川ERP拉取西(中成)药订单数据:'. $v['id']. ':'. json_encode($orderItems)); } } } } // ds($erpData); if(!empty($ids)){ //更新为已同步erp \Yii::$app->db->createCommand()->update('yii_product_order', [ 'is_sync_erp' => 1 ], ['in', 'id',$ids])->execute(); } ProductOrderLog::saveLog(0,'江奥川ERP拉取西(中成)药订单结束,拉取订单数量:'.count($productOrders).', 拉取的订单ids:'.implode(',',$ids)); } catch (\Exception $e) { // ds([ // 'e' => $e->getMessage(), // 'trace' => $e->getTraceAsString(), // 'file' => $e->getFile(), // 'line' => $e->getLine(), // 'code' => $e->getCode(), // 'traceAsString' => $e->getTraceAsString(), // ]); ProductOrderLog::saveLog(0,'江奥川ERP拉取西(中成)药订单异常:'.$e->getMessage(). '在:'. $e->getFile(). '行:'. $e->getLine()); throw new Exception('获取处方异常'.$e->getMessage()); } return $erpData; } /** * @author: liudiao * @Date: 2023-08-01 14:10:45 * @Description: erp发货推送物流信息 * @return {*} */ public function actionExpressNotify(){ ProductOrderLog::saveLog(0,'江奥川ERP发货推送订单物流信息开始'); $t = \Yii::$app->db->beginTransaction(); try { $headers = \Yii::$app->request->getHeaders(); $secret = $headers->get('secret'); $jacErpConfig = \Yii::$app->params['jac_erp']; if($secret != $jacErpConfig['secret']){ throw new Exception('非法请求'); } $rawData = \Yii::$app->request->rawBody; $post = Json::decode($rawData); if(!$post['order_type'] || !$post['order_no'] || !$post['express_company'] || !$post['express_no'] || !$post['express_mobile']){ throw new Exception('order_type/order_no/express_company/express_no/express_mobile不能为空'); } if(!in_array($post['express_company'], ['邮政快递','顺丰速运'])){ throw new Exception('仅支持顺丰速运和邮政快递'); } if($post['order_type'] == 1){ //中药/颗粒药 order_no为处方号 $prescription = Prescription::find()->where(['prescription_no' => $post['order_no']])->one(); if(empty($prescription)){ throw new Exception('订单不存在'); } $productOrder = ProductOrder::find()->where(['p_id' =>$prescription->id, 'status' => 1])->one(); } else { $productOrder = ProductOrder::find()->where(['order_no' =>$post['order_no'], 'status' => 1])->one(); } if(!$productOrder){ throw new Exception('订单不存在.'); } //快递单号信息 $ExpressNos = new ExpressNos(); $ExpressNos->express_company_name = $post['express_company']; $ExpressNos->express_company_code = $post['express_company'] == '邮政快递' ? 'youzhengguonei' : 'shunfeng'; $ExpressNos->express_no = $post['express_no']; $ExpressNos->mobile = $post['express_mobile']; $ExpressNos->state = null; $ExpressNos->sync_at = null; $ExpressNos->created_at = date('Y-m-d H:i:s', time()); $ExpressNos->updated_at = date('Y-m-d H:i:s', time()); $ExpressNos->saveOrFail(); //更新订单为发货状态 $productOrder->is_send = 1; $productOrder->status = 2; $productOrder->send_time = date('Y-m-d H:i:s', time()); $productOrder->express_no_id = $ExpressNos->id; $productOrder->saveOrFail(); //订单发货订阅消息通知 \Yii::$app->queue->push(new ProductOrderSend([ 'orderId' => $productOrder->id, ])); //订单发货后分账结算 if($productOrder->type == 2){ //易票联支付的产品订单 $config = \Yii::$app->params; $orderAutoSettlementTime = isset($config['product_order']['settlement_time']) ? $config['product_order']['settlement_time'] : 72*3600; \Yii::$app->queue->delay($orderAutoSettlementTime)->push(new ProductOrderSendJob([ 'orderId' => $productOrder->id ])); } $t->commit(); //获取最新快递信息 (new Client(['http_errors' => false]))->get("https://shop.xiaokang88.com/t/express_update", [ 'query' => [ 'id' => $ExpressNos->id, ], ]); ProductOrderLog::saveLog(0,'江奥川ERP发货推送订单物流信息成功,:订单id'.$productOrder->id); return ['success']; } catch (\Exception $e) { $t->rollBack(); ProductOrderLog::saveLog(0,'江奥川ERP发货推送订单物流信息异常:'.$e->getMessage()); throw new Exception($e->getMessage()); } } }