mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-22 18:35:35 +08:00
442 lines
16 KiB
PHP
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);
|
|
}
|
|
|
|
}
|
|
}
|