Files
OMS/app/console/lib/receipt/purchase.php
2026-01-04 19:08:31 +08:00

442 lines
16 KiB
PHP

<?php
/**
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
class console_receipt_purchase extends console_receipt_common{
private static $eo_status = array(
'PARTIN'=>'2',
'FINISH'=>'3',
);
private $_po= array();
private $_items = array();
function __construct() {
$this->poObj = app::get('purchase')->model('po');
$this->itemsObj = app::get('purchase')->model('po_items');
$this->_branproductObj = kernel::single('ome_branch_product');
}
/**
*
* 采购单更新方法
* @param array $data 采购单数据信息
*
*/
public function update(&$data,&$msg){
$Po = $this->_po;
$po_id = $Po['po_id'];
$items = $data['items'];
$iostock_update = true;
$io_status = $data['io_status'];
$iostock_data = array(
'memo'=>$data['memo'],
'operate_time'=>$data['operate_time'],
'arrival_no'=>$data['arrival_no'],
);
kernel::database()->beginTransaction();
$eo_status = self::$eo_status[$io_status];
#检查货品否都存在
$auto_iostock = false;
if ($items){
if(!$this->checkBnexist($po_id,$items)){
$msg = '有货品不存在!';
kernel::database()->rollBack();
return false;
}
$iostock_data['items'] = $this->__format_items($items,$iostock_update,$auto_iostock);
}
if($eo_status=='3' && $Po['eo_status']!='2' && $auto_iostock==true){
$this->poObj->update(array('receive_status'=>console_const::_FINISH_CODE),array('po_id'=>$po_id));
$msg = '入库数量大于申请数量,请在列表里操作!';
kernel::database()->commit();
return true;
}
if (count($iostock_data['items'])>0){
if(!$this->save_eo($po_id,'normal',$iostock_data)){
$msg = '入库单保存失败';
kernel::database()->rollBack();
return false;
}
}
$wsiMdl = app::get('console')->model('wms_stockin');
$wsiRow = $wsiMdl->db_dump(['stockin_bn'=>$Po['po_bn'], 'iso_status'=>'1'], 'id');
if($wsiRow) {
$wsiRs = $wsiMdl->update(['iso_id'=>$po_id, 'iso_status'=>'2'], ['id'=>$wsiRow['id'], 'iso_status'=>'1']);
if(!is_bool($wsiRs)) {
app::get('ome')->model('operation_log')->write_log('wms_stockin@console',$wsiRow['id'], '入库完成');
}
}
$eo_status = self::$eo_status[$io_status];
$po_update_data = array('eo_status'=>$eo_status);
if ($eo_status == '3'){#更新为入库完成
$po_update_data['po_status'] = '4';
}
#备注处理
if ($data['memo']){
$po_update_data['memo'] = $this->format_memo($data['memo']);
}
if (!$iostock_update){
$po_update_data['defective_status'] = '1';#未确认
}
if(!$this->poObj->update($po_update_data,array('po_id'=>$po_id))){
$msg = '采购单更新状态失败';
kernel::database()->rollBack();
return false;
}
kernel::database()->commit();
$this->cleanArriveStore($iostock_data['items'],$io_status);
return true;
}
private function __format_items($items,&$iostock_update,&$auto_iostock){
$iostock_items = array();
$iostock_autoConf = app::get('ome')->getConf('ome.iostock.auto_finish');
foreach($items as $item){
$po_item = $this->_items[$item['bn']];
$products_detail = $this->getProducts($item['bn']);
$defective_num = $item['defective_num']+$po_item['defective_num'];
$in_num = $item['normal_num']+$po_item['in_num'];
$effective_num = $po_item['num']-$po_item['in_num']-$po_item['out_num'];
$status = 1;
if($po_item['num']>$in_num+$po_item['out_num']){
$status = 2;
}else if($po_item['num']==$po_item['in_num']+$po_item['out_num']){
$status=3;
}
#更新采购单明细数量和状态
$item_data = array(
'defective_num'=>$defective_num,
'in_num'=>$in_num,
'status'=>$status,
);
if($item['batch']) {
$useLogModel = app::get('console')->model('useful_life_log');
$useful = [];
foreach ($item['batch'] as $bv) {
$tmpUseful = [];
$tmpUseful['product_id'] = $products_detail['product_id'];
$tmpUseful['bn'] = $item['bn'];
$tmpUseful['original_bn'] = $this->_po['po_bn'];
$tmpUseful['original_id'] = $this->_po['po_id'];
$tmpUseful['sourcetb'] = 'po';
$tmpUseful['business_bn'] = $this->_po['po_bn'];
$tmpUseful['bill_type'] = 'po';
$tmpUseful['create_time'] = time();
$tmpUseful['stock_status'] = '0';
$tmpUseful['num'] = $bv['num'];
$tmpUseful['normal_defective'] = $bv['normal_defective'];
$tmpUseful['product_time'] = $bv['product_time'];
$tmpUseful['expire_time'] = $bv['expire_time'];
$tmpUseful['purchase_code'] = $bv['purchase_code'];
$tmpUseful['produce_code'] = $bv['produce_code'];
$useful[] = $tmpUseful;
}
$useLogModel->db->exec(ome_func::get_insert_sql($useLogModel, $useful));
}
$this->itemsObj->update($item_data,array('item_id'=>$po_item['item_id']));
if($iostock_autoConf =='true'){
if(($in_num+$defective_num)>$po_item['num']){$auto_iostock = true;}
}
if ($item['normal_num']>0){
$iostock_items[] = array(
'name' => $products_detail['name'],
'bn' => $item['bn'],
'price' => $po_item['price'],
'purchase_num' => $po_item['num'],
'nums' => $item['normal_num'],
'is_new' => $po_item['is_new'],
'memo' => $data['memo'],
'product_id' => $products_detail['product_id'],
'goods_id' => $products_detail['goods_id'],
'unit' => $products_detail['unit'],
'item_id' => $po_item['item_id'],
'effective_num'=> $effective_num,
);
}
if($defective_num>0){#需要残损确认
$iostock_update = false;
}
}
return $iostock_items;
}
private function format_memo($memo){
if ($memo){#有备注更新
$oldmemo = $this->_po['memo'];
if (!$oldmemo){
$oldmemo= unserialize($oldmemo);
}
$memo = serialize($oldmemo.$oldmemo);
return $memo;
}
}
/**
*
* 采购单取消
* @param array $po_bn 采购单编号
*/
public function cancel($po_bn){
$po = $this->_po;
$po_data = array('po_status'=>'2','eo_status'=>'4');
$result = $this->poObj->update($po_data,array('po_id'=>$po['po_id']));
if ($result){
$items = $this->_items;
$this->cleanArriveStore($items);
}
return $result;
}
/**
*
* 检查需要入库的货号是否存在于采购单中
* @param array
*/
public function checkBnexist($po_id,$items){
$bn_array = array();
foreach($items as $item){
$bn_array[]=$item['bn'];
}
$bn_total = count($bn_array);
$bn_array = '\''.implode('\',\'',$bn_array).'\'';
$po_items = $this->poObj->db->selectrow('SELECT count(item_id) as count FROM sdb_purchase_po_items WHERE po_id='.$po_id.' AND bn in ('.$bn_array.')');
if ($bn_total!=$po_items['count']){#比较数目是否相等
return false;
}
return true;
}
/**
*
* 检查采购单是否存在判断
* @param array $po_bn 采购单编号
*/
public function checkExist($po_bn){
$oPo = app::get('purchase')->model("po");
$Po = $oPo->dump(array('po_bn'=>$po_bn),'po_id,po_bn,po_status,branch_id');
$this->_po = $Po;
$items = $this->itemsObj->getlist('*',array('po_id'=>$Po['po_id']));
foreach( $items as $item){
$bn = trim($item['bn']);
$this->_items[$bn] = $item;
}
return $Po;
}
/**
*
* 检查采购单是否有效
* @param $po_bn 采购单编号
* @param $status 根据传入状态判断对应状态是否可以操作
*/
public function checkValid($po_bn,$status,&$msg){
$po = $this->checkExist($po_bn);
if(!$po){
$msg = '采购单不存在!';
return false;
}
$po_status = $po['po_status'];
switch($status){
case 'PARTIN':
case 'FINISH':
if ($po_status=='2'){
$msg = '采购已取消不可以入库';
return false;
}
if ($po_status=='4'){
$msg = '已入库不可以再入库';
return false;
}
break;
case 'CANCEL':
case 'CLOSE':
if ($po_status=='4'){
$msg = '采购已完成不可以取消';
return false;
}
break;
}
return true;
}
/**
* 执行采购入库
* $po_id 采购单号
* type normal正常出入库 否则残损入库
* #为供应商与商品建立关联
*/
function save_eo($po_id,$type,$iostock_data){
$iostockObj = kernel::single('console_iostockdata');
$iostock_instance = kernel::single('console_iostockorder');
$Po = $this->poObj->dump($po_id,'*');
$branch_id = $Po['branch_id'];
if ($type == 'normal'){//采购
$type_id = 1;
}else{//残损
$type_id = 50;
$damagedbranch = $iostockObj->getDamagedbranch( $Po['branch_id'] );
$branch_id = $damagedbranch['branch_id'];
}
$amount = 0;
$shift_data = array();
foreach($iostock_data['items'] as $item){
$shift_data[$item['product_id']] = $item;
$amount+=$item['price']*$item['nums'];
}
$eo_data = array (
'iostockorder_name' => date('Ymd').'入库单',
'supplier' => $supplier['name'],
'supplier_id' => $Po['supplier_id'],
'supplier' => $this->getSupplier($Po['supplier_id']),
'branch' => $branch_id,
'iso_price' => $Po['delivery_cost'],
'memo' => $iostock_data['memo'],
'operate_time' => $iostock_data['operate_time'],
'operator' => $data['operator'],
'products' => $shift_data,
'original_bn' => $Po['po_bn'],
'original_id' => $po_id,
'confirm' => 'Y',
'type_id' => $type_id,
'po_type' => $Po['po_type'],
'orig_type_id' => '1',
'arrival_no' => $iostock_data['arrival_no'],
);
$eo_data['eo_id'] = $iostock_instance->save_iostockorder($eo_data, $msg);
$eo_data['eo_bn'] = $iostock_instance->getIoStockOrderBn();
if ($eo_data['eo_id']){
$eorder_data = array(
'eo_id' => $eo_data['eo_id'],
'supplier_id' => $Po['supplier_id'],
'eo_bn' => $eo_data['eo_bn'],
'po_id' => $Po['po_id'],
'amount' => $amount,
'entry_time' => time(),
'operator' => $Po['operator'],
'branch_id' => $branch_id,
);
app::get('purchase')->model("eo")->save($eorder_data);
if ($type_id == '1'){
foreach($iostock_data['items'] as $k2=>$v2){
$v2['supplier_id'] = $Po['supplier_id'];
$v2['eo_id'] = $eo_data['eo_id'];
$v2['eo_bn'] = $eo_data['eo_bn'];
$v2['purchase_time']= time();
$v2['in_num'] = $v2['nums'];
$v2['branch_id'] = $branch_id;
app::get('purchase')->model("branch_product_batch")->save($v2);
}
}
return true;
}else{
return false;
}
}
/**
* 扣减在途库存
*
*/
function cleanArriveStore($items,$io_status=''){
$po = $this->_po;
$_items = $this->_items;
$productIds = array();
$changeItems = [];
foreach ((array)$items as $item) {
$effective_num = isset($item['effective_num']) ? $item['effective_num'] : ($item['num']-$item['in_num']-$item['out_num']);
$num = 0;
if ($io_status == 'FINISH' || $io_status == ''){
$num = $effective_num;
}else{
$num = $effective_num>0 ? $item['nums'] : $effective_num;
}
if($num>0){
$changeItems[] = ['product_id'=>$item['product_id'], 'num'=>$num];
}
}
if($changeItems) {
$storeManageLib = kernel::single('ome_store_manage');
$storeManageLib->loadBranch(array('branch_id' => $po['branch_id']));
$params = array();
$params['node_type'] = 'changeArriveStore';
$params['params'] = array(
'obj_id' => $po['po_id'],
'branch_id' => $po['branch_id'],
'obj_type' => 'purchase',
'operator' => '-'
);
$params['params']['items'] = $changeItems;
$storeManageLib->processBranchStore($params, $err_msg);
}
//当状态为全部入库时需将未产生过出入库记录释放在途库存
if ($io_status == 'FINISH'){
//取消在途
$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',
);
$storeManageLib->processBranchStore($params, $err_msg);
}
}
}