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

901 lines
34 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_stock
{
private $_isoObj = null;
private $_itemsObj = null;
private $_isoInfo = array();
private $_items = array();
private static $iso_status = array(
'PARTIN' => 2,
'FINISH' => 3,
'CLOSE' => 4,
'CANCEL' => 4,
'FAILED' => 4,
);
/**
* __construct
* @return mixed 返回值
*/
public function __construct()
{
$this->_isoObj = app::get('taoguaniostockorder')->model("iso");
$this->_itemsObj = app::get('taoguaniostockorder')->model("iso_items");
$this->_branchLib = kernel::single('ome_branch');
}
/**
* 出入库据保存
* io 0 出库 1 入库
* 入库会有残损
* 出库不会
* $array $data
*/
public function do_save($data, $io, &$msg)
{
set_time_limit(0);
$iostock_update = true;
$auto_iostock = false;
$io_status = $data['io_status'];
// $shippackages = $data['shippackages'];
$approMdl = app::get('taoguanallocate')->model('appropriation');
$wmsdata =$data;
kernel::database()->beginTransaction();
//更新主表,让并发分出先后
$this->_isoObj->update(['iso_id' => $this->_isoInfo['iso_id']], array('iso_id' => $this->_isoInfo['iso_id']));
$iostockData = $this->_format_items($data, $io, $iostock_update, $auto_iostock,$diff_status);
if ($auto_iostock == true && $this->_isoInfo['iso_status'] == '1' && $io_status == 'FINISH') {
$msg = '因仓库反馈数量大于申请数量,人工介入';
$iso__update = array('receive_status' => console_const::_FINISH_CODE);
if (!$iostock_update) {
//是否需要确认
$iso__update['defective_status'] = '1'; #未确认
}
$iso_result = $this->_isoObj->update($iso__update, array('iso_id' => $this->_isoInfo['iso_id']));
kernel::database()->commit();
return true;
}
if ($io == '0') {
$stockLib = kernel::single('siso_receipt_iostock_stockout');
$wsoMdl = app::get('console')->model('wms_stockout');
$wsoRow = $wsoMdl->db_dump(['stockout_bn'=>$this->_isoInfo['iso_bn'], 'iso_status'=>'1'], 'id');
if($wsoRow) {
$wsoRs = $wsoMdl->update(['iso_id'=>$this->_isoInfo['iso_id'], 'iso_status'=>'2'], ['id'=>$wsoRow['id'], 'iso_status'=>'1']);
if(!is_bool($wsoRs)) {
app::get('ome')->model('operation_log')->write_log('wms_stockout@console',$wsoRow['id'], '出库完成');
}
}
} else {
$stockLib = kernel::single('siso_receipt_iostock_stockin');
$wsiMdl = app::get('console')->model('wms_stockin');
$wsiRow = $wsiMdl->db_dump(['stockin_bn'=>$this->_isoInfo['iso_bn'], 'iso_status'=>'1'], 'id');
if($wsiRow) {
$wsiRs = $wsiMdl->update(['iso_id'=>$this->_isoInfo['iso_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'], '入库完成');
}
}
}
$stockLib->_typeId = $this->_isoInfo['type_id'];
if ($iostockData['items']) {
$result = $stockLib->create($iostockData, $data, $msg);
if (!$result) {
$msg = '出入库失败';
kernel::database()->rollBack();
return false;
}
}
$oper = kernel::single('ome_func')->getDesktopUser();
$io_update_data = array(
'iso_status' => self::$iso_status[$io_status],
'confirm' => 'Y',
'operator' => $oper['op_name'],
'complete_time' => time(),
);
if (!$iostock_update) {
//是否需要确认
$io_update_data['defective_status'] = '1'; #未确认
}
if ($io_status == 'FINISH' && $diff_status) {
$io_update_data['diff_status'] = $diff_status; #未确认
}
//是否有备注
if ($data['memo']) {
$memo = '';
if (!$this->_isoInfo['memo']) {
$memo .= $this->_isoInfo['memo'];
}
$memo .= htmlspecialchars($data['memo']);
$io_update_data['memo'] = $memo;
}
if($wmsdata['logi_no']){
$io_update_data['logi_no'] = $wmsdata['logi_no'];
}
if($wmsdata['logi_id']){
$io_update_data['logi_code'] = $wmsdata['logi_id'];
}
$iso_result = $this->_isoObj->update($io_update_data, array('iso_id' => $this->_isoInfo['iso_id'], 'iso_status|notin'=>['3','4']));
if (is_bool($iso_result)) {
$msg = '出入库单据状态更新失败';
kernel::database()->rollBack();
return false;
}
kernel::database()->commit();
if ($io == '0') {
//减冻结
$this->clear_stockout_store_freeze($iostockData, $io_status);
}
if ($io != '0' && $io_status == 'FINISH') {
$this->reduceArriveStore();
}
if ($this->_isoInfo['type_id'] == '4' && $io_status == 'FINISH') {
$filter = array('appropriation_no' => $this->_isoInfo['appropriation_no']);
$approMdl->update(array('process_status' => 5, 'delivery_time' => time()), $filter);
}
if ($this->_isoInfo['type_id'] == '40' && $io_status == 'FINISH') {
#调拔出库且为完成时执行调拔入库
$stockin_id = kernel::single('console_iostockdata')->allocate_out($this->_isoInfo['iso_id']);
//如果是补货自动审核
if($stockin_id && in_array($this->_isoInfo['bill_type'],array('transfer','replenishment','o2otransfer','returnnormal'))){
kernel::single('console_iostockorder')->doCkeck($stockin_id, 1);
}
}
if ($this->_isoInfo['type_id'] == '70' && $io_status == 'FINISH') {
if($this->_isoInfo['bill_type'] == 'oms_reship_diff') {
kernel::single('console_reship')->addReshipDiff($this->_isoInfo['iso_id']);
}
if ($this->_isoInfo['bill_type'] == 'vopjitrk' && app::get('billcenter')->is_installed()) {
kernel::single('console_vopreturn')->finishStockin($this->_isoInfo['iso_id']);
}
}
//JDL处理
if(in_array($this->_isoInfo['bill_type'],array('jdlreturn')) && $io_status == 'FINISH'){
kernel::single('ediws_jdlvmi')->dealStockinItems($this->_isoInfo['iso_id']);
}
if ($io_status == 'FINISH' && $wmsdata['packages']) {
$this->_processPackage($this->_isoInfo['iso_id'],$wmsdata['packages']);
}
return true;
}
/**
*
* 出入库单取消
* @param $data 出入库单数据
* @param $io 出 入标识
*/
public function cancel($data, $io)
{
$iostockdata = $this->_isoInfo;
$result = $this->_isoObj->update(array('iso_status' => '4'), array('iso_id' => $iostockdata['iso_id'], 'iso_status|notin'=>['3','4']));
if(is_bool($result)) {
return false;
}
//释放冻结库存
if ($io == '0') {
$iostockdata['items'] = $this->_items;
$this->clear_stockout_store_freeze($iostockdata, '');
}
//取消在途
if ($io != '0') {
$this->reduceArriveStore();
}
return $result;
}
/**
* 检查传过来的货号是否都存在于单据中
* @param iso_id 出入库单ID
* @param items array 货品明细
*/
public function checkBnexist($iso_id, $items)
{
#taoguaniostockorder_iso
$bn_array = array();
foreach ($items as $item) {
$bn_array[] = $item['bn'];
}
$bn_total = count($bn_array);
$bn_array = '\'' . implode('\',\'', $bn_array) . '\'';
$iso_items = $this->_isoObj->db->selectrow('SELECT count(iso_items_id) as count FROM sdb_taoguaniostockorder_iso_items WHERE iso_id=' . $iso_id . ' AND bn in (' . $bn_array . ')');
if ($bn_total != $iso_items['count']) {
#比较数目是否相等
return false;
}
return true;
}
/**
*
* 检查出入库单是否有效
* @param $iso_bn 出入库单编号
* @param $status 需要执行状态
* @msg 返回结果
*
*/
public function checkValid($iso_bn, $status, &$msg)
{
$iso = $this->checkExist($iso_bn);
if (!$iso) {
$msg = '单据号不存在!';
return false;
}
$iso_status = $iso['iso_status'];
switch ($status) {
case 'PARTIN':
case 'FINISH':
if ($iso_status == '3') {
$msg = '单据已完成,不可以入库';
return false;
}
if ($iso_status == '4') {
$msg = '单据已取消,不可以入库';
return false;
}
break;
case 'CANCEL':
case 'CLOSE':
if ($iso_status == '3' || $iso_status == '2') {
$msg = '单据已部分或全部入库,不可以取消';
return false;
}
if ($iso_status == '4') {
$msg = '单据已取消,不可以再次取消';
return false;
}
break;
}
return true;
}
/**
* 释放冻结库存
*
* array data 当有明细时,操作对应明细,否则操作所有
*/
public function clear_stockout_store_freeze($data, $io_status = '')
{
//$basicMaterialStock = kernel::single('material_basic_material_stock');
//$libBranchProduct = kernel::single('ome_branch_product');
$branch_id = $data['branch_id'];
//库存管控处理
$storeManageLib = kernel::single('ome_store_manage');
$storeManageLib->loadBranch(array('branch_id' => $branch_id));
$params = array();
$params['node_type'] = 'finishStockout';
$params['params'] = array('iso_id' => $data['iso_id'], 'branch_id' => $branch_id);
//释放冻结
$_items = $this->_items;
$productBns = array();
$items = $data['items'];
foreach ((array) $items as $item) {
if ($item['nums'] <= 0) {
continue;
}
$effective_num = isset($item['effective_num']) ? $item['effective_num'] : ($item['nums'] - $item['normal_num']);
$num = 0;
if ($io_status == 'FINISH' || $io_status == '') {
$num = $effective_num;
} else {
$num = $effective_num > 0 ? $item['nums'] : $effective_num;
}
$product_id = $item['product_id'];
if ($num > 0) {
$productBns[$item['bn']] = $item['bn'];
//库存管控处理
$params['params']['product_id'] = $product_id;
$params['params']['num'] = $num;
$params['params']['bn'] = $item['bn'];
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
}
}
//当状态为全部完成时需将未产生过出入库记录释放冻结
if ($io_status == 'FINISH') {
$iostock_list = $this->getIostockList($this->_isoInfo['type_id'], $data['iso_id']);
foreach ($_items as $_item) {
$num = 0;
if ($_item['normal_num'] == 0 && !in_array($_item['bn'], $iostock_list)) {
$num = $_item['nums'] - $_item['normal_num'];
}
//处理之前部分出库
if (($_item['normal_num'] > 0 && $_item['nums'] > $_item['normal_num']) && in_array($_item['bn'], $iostock_list) && (in_array($_item['bn'], $productBns) == false)) {
$num = $_item['nums'] - $_item['normal_num'];
}
if ($num > 0) {
//库存管控处理
$params['params']['product_id'] = $_item['product_id'];
$params['params']['num'] = $num;
$params['params']['bn'] = $_item['bn'];
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
}
}
}
//删除预占流水
if ($io_status == 'FINISH' || $io_status == '') {
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
$basicMStockFreezeLib->delOtherFreeze($data['iso_id'], material_basic_material_stock_freeze::__STOCKOUT);
}
}
/**
* 判断出入库明细是否存在
*
*/
public function checkExist($io_bn)
{
$iso = $this->_isoObj->dump(array('iso_bn' => $io_bn), '*');
if ($iso) {
$this->_isoInfo = $iso;
$iso_id = $iso['iso_id'];
$_items = $this->_itemsObj->getList('iso_id,iso_items_id,defective_num,normal_num,nums,price,product_id,bn', array('iso_id' => $iso_id));
$this->_items = array();
foreach ($_items as $k => $item) {
$this->_items[$item['bn']] = $item;
}
}
return $iso;
}
/**
* 查看差异数据
*/
public function difference_stock($iso_bn)
{
$iso = $this->_isoObj->dump(array('iso_bn' => $iso_bn), 'iso_id');
$iso_id = $iso['iso_id'];
$sql = 'SELECT i.nums,i.normal_num,i.defective_num,i.bn, p.material_name AS name FROM sdb_taoguaniostockorder_iso_items as i
LEFT JOIN sdb_material_basic_material as p ON i.bn=p.material_bn
WHERE i.iso_id=' . $iso_id . ' AND (i.normal_num!=i.nums OR i.defective_num>0)';
$iso_item = $this->_isoObj->db->select($sql);
return $iso_item;
}
public function _format_items($data, $io, &$iostock_update, &$auto_iostock, &$diff_status)
{
$itemDetailMdl = app::get('taoguaniostockorder')->model('iso_items_detail');
$isoItemDetailList = [];
foreach ($itemDetailMdl->getList('*', array('iso_id' => $this->_isoInfo['iso_id'])) as $detail) {
if (!$detail['iso_items_id']) continue;
// num > normal_num + defective_num
if ($detail['nums'] == $detail['normal_num'] + $detail['defective_num']) {
continue;
}
$detail['extendpro'] = $detail['extendpro'] ? @unserialize($detail['extendpro']) : [];
$isoItemDetailList[$detail['iso_items_id']][$detail['id']] = $detail;
}
$iostock_autoConf = app::get('ome')->getConf('ome.iostock.auto_finish');
$items = array();
$iostock = array(
'iso_id' => $this->_isoInfo['iso_id'],
'type_id' => $this->_isoInfo['type_id'],
'iso_bn' => $this->_isoInfo['iso_bn'],
'memo' => $data['memo'],
'operate_time' => $data['operate_time'],
'branch_id' => $this->_isoInfo['branch_id'],
);
foreach ($data['items'] as $item) {
$num = $io == '0' ? intval($item['num']) : intval($item['normal_num']);
if ($this->_items[$item['bn']]) {
$itemdata = array();
if ($num > 0) {
$itemdata['normal_num'] = $this->_items[$item['bn']]['normal_num'] + $num;
$effective_num = $this->_items[$item['bn']]['nums'] - $this->_items[$item['bn']]['normal_num'];
}
if ($item['defective_num'] > 0) {
$itemdata['defective_num'] = $this->_items[$item['bn']]['defective_num'] + $item['defective_num'];
$iostock_update = false;
}
if (($itemdata['normal_num'] + $itemdata['defective_num']) > $this->_items[$item['bn']]['nums']) {
//入库单允许超收
if ($iostock['type_id'] != '4' && $iostock_autoConf == 'true') {
$auto_iostock = true;
}
}
if (($itemdata['normal_num'] + $itemdata['defective_num']) != $this->_items[$item['bn']]['nums']) {
$diff_status = '1';
}
$this->_itemsObj->update($itemdata, array('iso_items_id' => $this->_items[$item['bn']]['iso_items_id'], 'iso_id' => $this->_items[$item['bn']]['iso_id']));
// 更新ISO DETAIL 明细
if ($item['details'] && $isoItemDetail = $isoItemDetailList[$this->_items[$item['bn']]['iso_items_id']]) {
if ($itemdata['normal_num'] == $this->_items[$item['bn']]['nums']) {
$itemDetailMdl->update([
'normal_num_upset_sql' => '`nums`',
],[
'iso_id' => $this->_items[$item['bn']]['iso_id'],
'iso_items_id' => $this->_items[$item['bn']]['iso_items_id'],
]);
} elseif ($itemdata['defective_num'] == $this->_items[$item['bn']]['nums']) {
$itemDetailMdl->update([
'defective_num_upset_sql' => '`nums`',
],[
'iso_id' => $this->_items[$item['bn']]['iso_id'],
'iso_items_id' => $this->_items[$item['bn']]['iso_items_id'],
]);
} elseif (in_array($this->_isoInfo['bill_type'],['vopjitrk'])) {
foreach ($item['details'] as $detail) {
$detail['normal_num'] = intval($detail['normal_num']);
$detail['defective_num'] = intval($detail['defective_num']);
if ($isoItemDetail[$detail['orderLineNo']]) {
$itemDetailMdl->update([
'normal_num_upset_sql' => '`normal_num` + '.$detail['normal_num'],
'defective_num_upset_sql' => '`defective_num` + '.$detail['defective_num'],
],[
'id' => $isoItemDetail[$detail['orderLineNo']]['id'],
'iso_id' => $this->_items[$item['bn']]['iso_id'],
'iso_items_id' => $this->_items[$item['bn']]['iso_items_id'],
'filter_sql' => '`nums` >= (`normal_num` + `defective_num` + '. $detail['normal_num'].' + '.$detail['defective_num'].')',
]);
}
}
}
}
if($num>0){
$items[$item['bn']] = array(
'bn' => $item['bn'],
'nums' => $num, #请求入库数量
'price' => $this->_items[$item['bn']]['price'],
'iso_items_id' => $this->_items[$item['bn']]['iso_items_id'],
'product_id' => $this->_items[$item['bn']]['product_id'],
'effective_num' => $effective_num,
);
}
if($item['batch']) {
$useLogModel = app::get('console')->model('useful_life_log');
$useful = [];
foreach ($item['batch'] as $bv) {
$tmpUseful = [];
$tmpUseful['product_id'] = $this->_items[$item['bn']]['product_id'];
$tmpUseful['bn'] = $item['bn'];
$tmpUseful['original_bn'] = $this->_isoInfo['iso_bn'];
$tmpUseful['original_id'] = $this->_isoInfo['iso_id'];
$tmpUseful['business_bn'] = $this->_isoInfo['business_bn'] ? $this->_isoInfo['business_bn'] : $this->_isoInfo['iso_bn'];
$tmpUseful['bill_type'] = 'iso';
$tmpUseful['sourcetb'] = 'iso';
$tmpUseful['create_time'] = time();
$tmpUseful['stock_status'] = '0';
$tmpUseful['num'] = $bv['num'];
$tmpUseful['normal_defective'] = $bv['normal_defective'];
$tmpUseful['product_time'] = $bv['product_time']?$bv['product_time']:0;
$tmpUseful['expire_time'] = $bv['expire_time']?$bv['expire_time']:0;
$tmpUseful['purchase_code'] = $bv['purchase_code'];
$tmpUseful['produce_code'] = $bv['produce_code'];
$useful[] = $tmpUseful;
}
$useLogModel->db->exec(ome_func::get_insert_sql($useLogModel, $useful));
}
}else{
//新差异处理使用,暂时跳过(下面代码先注释)
continue;
// todo 表里新增商品明细,$items也拼接上明细
// if ($iostock['type_id'] == '4') {
// $isoItemsMdl = app::get('taoguaniostockorder')->model("iso_items");
// $materialMdl = app::get('material')->model("basic_material");
// $materialExtMdl = app::get('material')->model("basic_material_ext");
// $materialInfo = $materialMdl->db_dump(array('material_bn' => $item['bn']), 'bm_id,material_bn,material_name');
// $extInfo = $materialExtMdl->db_dump(['bm_id' => $materialInfo['bm_id']], 'bm_id,retail_price');
// $moreItem = array(
// 'iso_id' => $iostock['iso_id'],
// 'iso_bn' => $iostock['iso_bn'],
// 'product_id' => $materialInfo['bm_id'],
// 'product_name' => $materialInfo['material_name'],
// 'bn' => $item['bn'],
// 'price' => $extInfo['retail_price'],
// 'nums' => 0,
// 'normal_num' => $item['normal_num'],
// 'defective_num' => $item['defective_num'] ? $item['defective_num'] : 0,
// );
// $isoItemsMdl->insert($moreItem);
//
// $items[$item['bn']] = array(
// 'bn' => $moreItem['bn'],
// 'nums' => $moreItem['normal_num'], #请求入库数量
// 'price' => $moreItem['price'],
// 'iso_items_id' => $moreItem['iso_items_id'],
// 'product_id' => $moreItem['product_id'],
// 'effective_num' => 0,
// );
// }
}
}
$iostock['items'] = $items;
return $iostock;
}
/**
* 扣除在途库存
*
* @return void
* @author
* */
private function reduceArriveStore()
{
$iso = $this->_isoInfo;
$items = $this->_items;
//取消在途
$storeManageLib = kernel::single('ome_store_manage');
$storeManageLib->loadBranch(array('branch_id' => $iso['branch_id']));
$params = array();
$params['node_type'] = 'deleteArriveStore';
$params['params'] = array(
'obj_id' => $iso['iso_id'],
'branch_id' => $iso['branch_id'],
'obj_type' => 'iostockorder',
);
$storeManageLib->processBranchStore($params, $err_msg);
}
public function getIostockList($type_id, $iso_id)
{
$db = kernel::database();
$sql = "SELECT bn FROM sdb_ome_iostock WHERE type_id in(" . $type_id . ") AND original_id=" . $iso_id . " AND nums>0";
$items = array();
$iso = $db->select($sql);
foreach ($iso as $v) {
$items[] = $v['bn'];
}
return $items;
}
//判断转仓单据是否存在 并获取数据
/**
* 检查ExistWarehouse
* @param mixed $io_bn io_bn
* @return mixed 返回验证结果
*/
public function checkExistWarehouse($io_bn){
$isoObj = app::get('warehouse')->model("iso");
$itemsObj = app::get('warehouse')->model("iso_items_simple");
$iso = $isoObj->dump(array('iso_bn'=>$io_bn),'*');
if ($iso){
$this->_isoInfo = $iso;
$iso_id = $iso['iso_id'];
$_items = $itemsObj->getList('iso_items_simple_id,iso_id,defective_num,normal_num,nums,price,product_id,bn',array('iso_id'=>$iso_id));
$this->_items= array();
foreach ($_items as $k=>$item){
$current_item_key = $item['bn'];
$this->_items[$current_item_key] = $item;
}
}
return $iso;
}
/**
* 检查出仓库单是否有效
* @param $iso_bn 出入库单编号
* @param $status 需要执行状态
* @msg 返回结果
*/
public function checkValidWarehouse($iso_bn,$status,&$msg){
$iso = $this->checkExistWarehouse($iso_bn);
if (!$iso){
$msg = '单据号不存在!';
return false;
}
$iso_status = $iso['iso_status'];
switch($status){
case 'PARTIN':
case 'FINISH':
if ($iso_status=='3'){
$msg = '单据已完成,不可以入库';
return false;
}
if ($iso_status == '4'){
$msg = '单据已取消,不可以入库';
return false;
}
break;
case 'CANCEL':
case 'CLOSE':
if ($iso_status=='3' || $iso_status=='2'){
$msg = '单据已部分或全部入库,不可以取消';
return false;
}
if ($iso_status == '4'){
$msg = '单据已取消,不可以再次取消';
return false;
}
break;
}
return true;
}
/**
*
* 出入库单取消
* @param $io_bn 出入库单号
* @param $io 出 入标识
*/
public function cancel_warehouse($io_bn){
$isoObj = app::get('warehouse')->model("iso");
$result = $isoObj->update(array('iso_status'=>'4'),array('iso_bn'=>$io_bn));
return $result;
}
/**
* 出入库据保存
* 入库会有残损
* 出库不会
* $array $data
*/
public function do_save_warehouse($data,&$msg){
set_time_limit(0);
$iostock_update = true;
$auto_iostock = false;
$io_status = $data['io_status'];
kernel::database()->beginTransaction();
$iostockData = $this->_format_items_warehouse($data,$iostock_update,$auto_iostock);
$isoObj = app::get('warehouse')->model("iso");
if($auto_iostock == true && $this->_isoInfo['iso_status']=='1' && $io_status == 'FINISH'){
$msg = '因仓库反馈数量大于申请数量,人工介入';
//$iso__update = array('receive_status'=>console_const::_FINISH_CODE);
if (!$iostock_update){#是否需要确认
$iso__update['defective_status'] = '1';#未确认
}
$iso_result = $isoObj->update($iso__update,array('iso_id'=>$this->_isoInfo['iso_id']));
kernel::database()->commit();
return true;
}
$stockLib = kernel::single('siso_receipt_iostock_stockinwarehouse');
$stockLib->_typeId = $this->_isoInfo['type_id'];
if($iostockData['items']){
$result = $stockLib->create($iostockData, $data, $msg);
if (!$result){
$msg = '出入库失败';
kernel::database()->rollBack();
return false;
}
}
$io_update_data = array('iso_status'=>self::$iso_status[$io_status],'confirm'=>'Y');
if (!$iostock_update){#是否需要确认
$io_update_data['defective_status'] = '1';#未确认
}
#是否有备注
if ($data['memo']){
$memo = '';
if (!$this->_isoInfo['memo']){
$memo.= $_isoInfo['memo'];
}
$memo.=htmlspecialchars($data['memo']);
$io_update_data['memo'] = $memo;
}
//当完成时更新完成时间
if($io_status == 'FINISH'){
$io_update_data["complete_time"] = time();
}
$iso_result = $isoObj->update($io_update_data,array('iso_id'=>$this->_isoInfo['iso_id']));
if (!$iso_result){
$msg = '出入库单据状态更新失败';
kernel::database()->rollBack();
return false;
}
kernel::database()->commit();
return true;
}
function _format_items_warehouse($data,&$iostock_update,&$auto_iostock){
$itemsObj = app::get('warehouse')->model("iso_items_simple");
$iostock_autoConf = app::get('ome')->getConf('ome.iostock.auto_finish');
$items = array();
$iostock = array(
'iso_id'=>$this->_isoInfo['iso_id'],
'type_id'=>$this->_isoInfo['type_id'],
'iso_bn'=>$this->_isoInfo['iso_bn'],
'memo'=>$data['memo'],
'operate_time'=>$data['operate_time'],
'branch_id'=>$this->_isoInfo['branch_id'],
);
foreach ($data['items'] as $item){
$num = intval($item['normal_num']);
$current_item_key = $item['bn'];
if($this->_items[$current_item_key]){ //存在的数据库明细数据
$itemdata = array();
if($num>0){
$itemdata['normal_num'] = $this->_items[$current_item_key]['normal_num']+$num;
}
if ($item['defective_num']>0){
$itemdata['defective_num'] = $this->_items[$current_item_key]['defective_num']+$item['defective_num'];
$iostock_update = false;
}
if(($itemdata['normal_num']+$itemdata['defective_num'])>$this->_items[$current_item_key]['nums']){
if($iostock_autoConf=='true'){
$auto_iostock = true;
}
}
$itemsObj->update($itemdata,array('iso_items_simple_id'=>$this->_items[$current_item_key]['iso_items_simple_id'],'iso_id'=>$this->_items[$current_item_key]['iso_id']));
$items[$current_item_key] = array(
'bn' => $item['bn'],
'nums' => $num,#请求入库数量
'price' => $this->_items[$current_item_key]['price'],
'iso_items_id' => $this->_items[$current_item_key]['iso_items_simple_id'],
'product_id' => $this->_items[$current_item_key]['product_id'],
);
}
}
$iostock['items'] = $items;
return $iostock;
}
function _processPackage($iso_id,$packages){
$bn_packages = $package_data = array();
foreach ($packages as $value) {
$bn =$value['bn'];
if($value['package_code']){
$bn_packages[$bn]['bn'] = $value['bn'];
$bn_packages[$bn]['package_code'] = $value['package_code'];
}
}
$items = $this->_itemsObj->getList('iso_id,iso_items_id,nums,product_id,bn', array('iso_id' => $iso_id));
$detailMdl = app::get('taoguaniostockorder')->model('iso_items_detail');
$items_details = $detailMdl->getlist('id,bn,extendpro',array('iso_id' => $iso_id));
if($items_details){
foreach($items_details as $iv){
$bn = $iv['bn'];
$package_code = $bn_packages[$bn] ? $bn_packages[$bn]['package_code'] : '';
if($package_code){
$extendpro = array('package_code'=>$package_code);
$extendpro = serialize($extendpro);
$updata = array('extendpro'=>$extendpro);
$detailMdl->update($updata,array('id'=>$iv['id']));
}
}
}else{
foreach($items as $v){
$bn = $v['bn'];
if($bn_packages[$bn]){
$package_code = $bn_packages[$bn]['package_code'];
$extendpro = array('package_code'=>$package_code);
$extendpro = serialize($extendpro);
$package_data[] = array(
'iso_items_id' => $v['iso_items_id'],
'iso_id' => $v['iso_id'],
'product_id' => $v['product_id'],
'product_name' => $v['product_name'],
'bn' => $v['bn'],
'nums' => $v['nums'],
'price' => $v['price'] ? $v['price'] : 0,
'extendpro' => $extendpro,
);
}
}
if($package_data){
$sql = kernel::single('ome_func')->get_insert_sql($detailMdl, $package_data);
$detailMdl->db->exec($sql);
}
}
//
}
}