model('po'); $aRow = $mdl_po->dump($po_id, '*', array('po_items' => array('product_id,num'))); if (!$aRow) { return array(false, '采购单不存在'); } if ($aRow['check_status'] == '2') { return array(false, '采购单已审核'); } // 生成在途 $storeManageLib = kernel::single('ome_store_manage'); $storeManageLib->loadBranch(array('branch_id' => $aRow['branch_id'])); $params = array(); $params['node_type'] = 'changeArriveStore'; $params['params'] = array( 'obj_id' => $aRow['po_id'], 'branch_id' => $aRow['branch_id'], 'obj_type' => 'purchase', 'operator' => '+' ); $params['params']['items'] = $aRow['po_items']; $storeManageLib->processBranchStore($params, $err_msg); $payObj = app::get('purchase')->model('purchase_payments'); $pay_bn = $payObj->gen_id(); $row = array(); $row['payment_bn'] = $pay_bn; $row['po_id'] = $aRow['po_id']; $row['po_type'] = $aRow['po_type']; $row['add_time'] = time(); $row['supplier_id'] = $aRow['supplier_id']; $oper = kernel::single('ome_func')->getDesktopUser(); $row['operator'] = $oper['op_name']; if ($aRow['po_type'] == 'cash') { //现购,生成付款单 $row['payable'] = $aRow['product_cost'] + $aRow['delivery_cost']; $row['deposit'] = 0; $row['product_cost'] = $aRow['product_cost']; $row['delivery_cost'] = $aRow['delivery_cost']; $payObj->save($row); } elseif ($aRow['po_type'] == 'credit' && $aRow['deposit'] > 0) { //赊购,预付款不为0时生成付款单 $row['payable'] = $aRow['deposit']; $row['deposit'] = $aRow['deposit']; $row['product_cost'] = 0; $row['delivery_cost'] = 0; $payObj->save($row); } $rs = app::get('purchase')->model('po')->update(array( 'check_status' => 2, 'eo_status' => 1, 'check_time' => time(), 'check_operator' => $oper['op_name'], ), array('po_id' => $po_id, 'check_status' => 1)); if(is_bool($rs)) { return array(false, '采购单状态已改变,不能再审核'); } kernel::single('console_event_trigger_purchase')->create(array('po_id' => $po_id), false); $log_msg = '审核完成'; $opObj = app::get('ome')->model('operation_log'); $opObj->write_log('purchase_modify@purchase', $po_id, $log_msg); return array(true, '审核完成'); } /** * 采购单取消(先取消WMS,成功后再处理退货退款) * * @param int $po_id 采购单ID * @param string $operator 操作员 * @param string $memo 备注 * @return array [bool, string] 是否成功和消息 * @author **/ public function do_cancel($po_id, $operator, $memo = '') { if (empty($po_id)) { return array(false, '采购单ID不能为空'); } if (empty($operator)) { return array(false, '操作员不能为空'); } $poObj = app::get('purchase')->model('po'); $po = $poObj->dump($po_id, '*', array('po_items' => array('*'))); if (!$po) { return array(false, '采购单不存在'); } if ($po['eo_status'] >= 3) { return array(false, '此采购单已完成入库,请走采购退货流程'); } // 检查是否需要取消WMS if ($po['check_status'] == '2') { // 已审核,需要请求第三方取消 if ($po['eo_status'] == '2' || $po['eo_status'] == '3' || $po['eo_status'] == '4') { return array(false, '单据所在状态不允许此次操作'); } // 调用第三方取消 $po_bn = $po['po_bn']; $purchaseObj = kernel::single('console_event_trigger_purchase'); $branch_id = $po['branch_id']; $data = array( 'io_type' => 'PURCHASE', 'io_bn' => $po_bn, 'branch_id' => $branch_id, 'out_iso_bn' => $po['out_iso_bn'], ); $result = $purchaseObj->cancel($data, true); // 如果WMS取消失败,直接返回 if (!empty($result['rsp']) && $result['rsp'] == 'fail') { return array(false, $result['err_msg'] ? $result['err_msg'] : 'WMS取消失败'); } } // WMS取消成功或无需取消WMS,继续处理退货退款逻辑 return $this->processRefund($po_id, $po, $operator, $memo); } /** * 处理采购单退货退款逻辑 * * @param int $po_id 采购单ID * @param array $po 采购单数据 * @param string $operator 操作员 * @param string $memo 备注 * @return array [bool, string] * @author **/ private function processRefund($po_id, $po, $operator, $memo) { // 开启事务 kernel::database()->beginTransaction(); try { $poObj = app::get('purchase')->model('po'); $po_itemObj = app::get('purchase')->model('po_items'); $returnObj = app::get('purchase')->model('returned_purchase'); $paymentObj = app::get('purchase')->model('purchase_payments'); $refundObj = app::get('purchase')->model('purchase_refunds'); $rp_itemObj = app::get('purchase')->model('returned_purchase_items'); $return_flag = false; // 无任何操作时,不生成退款单标志 $pay = $paymentObj->dump(array('po_id' => $po_id), '*'); if ($po['eo_status'] == '1' && $pay['statement_status'] != '2') { // 没有入库并且没有结算付款单 $return_flag = true; if ($pay['payment_id']) { $paym['payment_id'] = $pay['payment_id']; $paym['statement_status'] = '3'; $paymentObj->save($paym); } } // 生成退货单 $return['supplier_id'] = $po['supplier_id']; $return['operator'] = $operator; $return['po_type'] = $po['po_type']; $return['purchase_time'] = $po['purchase_time']; $return['returned_time'] = time(); $return['branch_id'] = $po['branch_id']; $return['arrive_time'] = $po['arrive_time']; $return['amount'] = 0; $return['rp_type'] = 'po'; $return['object_id'] = $po_id; $rp_id = $returnObj->createReturnPurchase($return); if (!$rp_id) { throw new Exception('生成退货单失败'); } // 处理退货明细 $po_items = $po['po_items']; $money = 0; if ($po_items) { foreach ($po_items as $item) { $num = $item['num'] - $item['in_num'] - $item['out_num']; $num = $num < 0 ? 0 : $num; if (($item['status'] == '1' || $item['status'] == '2') && $num != 0) { // 判断此商品是否可以取消入库 $row['rp_id'] = $rp_id; $row['product_id'] = $item['product_id']; $row['num'] = $num; $row['price'] = $item['price']; $money += $item['price'] * $num; $row['bn'] = $item['bn']; $row['name'] = $item['name']; $row['spec_info'] = $item['spec_info']; $rp_itemObj->save($row); $row = null; $r['item_id'] = $item['item_id']; $r['out_num'] = $item['out_num'] + $num; $r['status'] = ($r['out_num'] + $item['in_num']) >= $item['num'] ? '3' : $item['status']; $po_itemObj->save($r); $r = null; } } } // 取消在途 $storeManageLib = kernel::single('ome_store_manage'); $storeManageLib->loadBranch(array('branch_id' => $po['branch_id'])); $params = array(); $params['node_type'] = 'deleteArriveStore'; $params['params'] = array( 'obj_id' => $po['po_id'], 'branch_id' => $po['branch_id'], 'obj_type' => 'purchase', ); $err_msg = ''; $result = $storeManageLib->processBranchStore($params, $err_msg); if (!$result) { $error_info = $err_msg ? ': ' . $err_msg : ''; throw new Exception('取消在途库存失败' . $error_info); } // 更新退货单金额 $data['rp_id'] = $rp_id; $data['amount'] = $money; $data['product_cost'] = $money; $returnObj->save($data); // 日志备注 $log_msg = ''; $return_bn = $returnObj->dump($rp_id, 'rp_bn'); $log_msg .= '
生成了一张编号为:' . $return_bn['rp_bn'] . '的退货单'; $refund_id = null; if ($return_flag == false) { // 生成退款单 $refund['add_time'] = time(); $refund['po_type'] = $po['po_type']; $refund['delivery_cost'] = 0; $refund['type'] = 'po'; $refund['rp_id'] = $rp_id; $refund['supplier_id'] = $po['supplier_id']; if ($po['po_type'] == 'cash') { $refund['refund'] = $money; $refund['product_cost'] = $money; } elseif ($po['po_type'] == 'credit' && $po['deposit_balance'] != 0) { $refund['refund'] = $po['deposit_balance']; $refund['product_cost'] = 0; } $refund_id = $refundObj->createRefund($refund); if (!$refund_id) { throw new Exception('生成退款单失败'); } $poo['amount'] = $po['amount'] - $money; $poo['product_cost'] = $po['product_cost'] - $money; $poo['deposit_balance'] = 0; } else { $poo['amount'] = 0; $poo['product_cost'] = 0; } // 更新采购单 $poo['po_id'] = $po_id; if ($memo) { $oldmemo = unserialize($po['memo']); $memo_arr = array(); if ($oldmemo) { foreach ($oldmemo as $k => $v) { $memo_arr[] = $v; } } $memo_arr[] = array('op_name' => $operator, 'op_time' => date('Y-m-d H:i', time()), 'op_content' => htmlspecialchars($memo)); $poo['memo'] = serialize($memo_arr); } if ($po['po_status'] == '1') { $poo['po_status'] = '2'; // 入库取消 } if ($po['eo_status'] == '2') { $poo['eo_status'] = '3'; // 已入库 } elseif ($po['eo_status'] == '1' || $po['eo_status'] == '0') { $poo['eo_status'] = '4'; // 未入库 } $poObj->save($poo); // 记录日志 if ($refund_id) { $refund_bn = $refundObj->dump($refund_id, 'refund_bn'); $log_msg .= '
生成了一张编号为:' . $refund_bn['refund_bn'] . '的退款单'; } $log_msg2 = '对采购单编号为:' . $po['po_bn'] . '进行了入库取消
'; $opObj = app::get('ome')->model('operation_log'); $opObj->write_log('purchase_cancel@purchase', $po_id, $log_msg2 . $log_msg); // 提交事务 kernel::database()->commit(); return array(true, '入库取消已完成'); } catch (Exception $e) { // 事务回滚 kernel::database()->rollBack(); return array(false, '入库取消失败: ' . $e->getMessage()); } } }