Files
OMS/app/material/lib/receipt/storagelife.php
2026-01-04 17:22:44 +08:00

843 lines
35 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright 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.
*/
/**
* 基础物料保质期明细生成Lib
*
* @author kamisama.xia@gmail.com
* @version 0.1
*/
class material_receipt_storagelife{
/**
*
* 保质期明细生成方法
* @param array $sdf 批次信息
* bill_type follow siso_receipt_iostock_abstract iosotck_types,例如:1-采购入库
* bill_io_type 1-入库 2-出库
*/
public function generate($sdf,&$msg){
//校验传入参数
if(!$this->checkParams($sdf,$msg)){
return false;
}
$basicMaterialStorageLifeObj = app::get('material')->model('basic_material_storage_life');
$basicMaterialStorageLifeBillsObj = app::get('material')->model('basic_material_storage_life_bills');
$codebaseObj = app::get('material')->model('codebase');
$operationLogObj = app::get('ome')->model('operation_log');
//事务开启
$basicMaterialStorageLifeObj->db->beginTransaction();
//循环每行批次明细进行保存
foreach($sdf as $row){
$data = array();
$data['bm_id'] = $row['bm_id'];
$data['material_bn'] = $row['material_bn'];
$data['material_bn_crc32'] = sprintf('%u',crc32($row['material_bn']));
$data['expire_bn'] = $row['expire_bn'];
$data['production_date'] = strtotime($row['production_date']);
$data['guarantee_period'] = $row['guarantee_period'];
switch($row['date_type']){
case 'day':
$data['expiring_date'] = strtotime('+'.$row['guarantee_period'].' days',$data['production_date'])+86399;
$data['date_type'] = 1;
break;
case 'month':
$data['expiring_date'] = strtotime('+'.$row['guarantee_period'].' months',$data['production_date'])+86399;
$data['date_type'] = 2;
break;
case 'year':
$data['expiring_date'] = strtotime('+'.$row['guarantee_period'].' years',$data['production_date'])+86399;
$data['date_type'] = 3;
break;
case 'date':
$data['guarantee_period'] = (strtotime($row['expiring_date']) - $data['production_date'])/86400;
$data['expiring_date'] = strtotime($row['expiring_date'])+86399;
$data['date_type'] = 1;
break;
case 'change':
$data['expiring_date'] = $row['expiring_date'];
$data['date_type'] = ($data['set_date_type'] ? $data['set_date_type'] : 1);
break;
}
$data['warn_day'] = $row['warn_day'];
$data['warn_date'] = $data['expiring_date'] - $row['warn_day']*86400;
$data['quit_day'] = $row['quit_day'];
$data['quit_date'] = $data['expiring_date'] - $row['quit_day']*86400;
$data['in_num'] = $row['in_num'];
$data['balance_num'] = $row['in_num'];
$data['branch_id'] = $row['branch_id'];
//保质期批次号已存在_则更新
$storageLifeInfo = $basicMaterialStorageLifeObj->dump(array('branch_id'=>$row['branch_id'], 'bm_id'=>$row['bm_id'], 'expire_bn'=>$row['expire_bn']),'*');
if($storageLifeInfo)
{
$update['difference_num'] = $row['in_num'];#累加数量
$update['bill_id'] = $row['bill_id'];
$update['bill_bn'] = $row['bill_bn'];
$update['bill_type'] = $row['bill_type'];
$update['bill_io_type'] = $row['bill_io_type'];
$update_num = "in_num=in_num+".$update['difference_num'].",balance_num=balance_num+".$update['difference_num'];
$sql = 'UPDATE sdb_material_basic_material_storage_life SET '.$update_num.' WHERE bmsl_id='.$storageLifeInfo['bmsl_id'];
if(!$basicMaterialStorageLifeObj->db->exec($sql)){
$basicMaterialStorageLifeObj->db->rollBack();
return false;
}else{
//生成相应的采购入库流水单据信息
$tmp_bill_data = array(
'bmsl_id' => $storageLifeInfo['bmsl_id'],
'bm_id' => $storageLifeInfo['bm_id'],
'material_bn' => $storageLifeInfo['material_bn'],
'material_bn_crc32' => $storageLifeInfo['material_bn_crc32'],
'expire_bn' => $storageLifeInfo['expire_bn'],
'nums' => $update['difference_num'],
'branch_id' => $storageLifeInfo['branch_id'],
'bill_id' => $update['bill_id'],
'bill_bn' => $update['bill_bn'],
'bill_type' => $update['bill_type'],
'bill_io_type' => $update['bill_io_type'],
);
if(!$basicMaterialStorageLifeBillsObj->save($tmp_bill_data)){
$basicMaterialStorageLifeObj->db->rollBack();
return false;
}
unset($tmp_bill_data);
}
$iostock_types = kernel::single('siso_receipt_iostock')->get_iostock_types();
$operation_msg = isset($iostock_types[$update['bill_type']]) ? $iostock_types[$update['bill_type']]['info'] : '入库';
//记录日志
$operationLogObj->write_log('storage_life_chg@wms', $storageLifeInfo['bmsl_id'], "物料保质期批次变更,关联单据号:".$update['bill_bn'].",".$operation_msg.":".$update['difference_num']);
}else{
//新增保质期处理逻辑
if(!$basicMaterialStorageLifeObj->save($data)){
$basicMaterialStorageLifeObj->db->rollBack();
return false;
}else{
//生成相应的采购入库流水单据信息
$tmp_bill_data = array(
'bmsl_id' => $data['bmsl_id'],
'bm_id' => $data['bm_id'],
'material_bn' => $data['material_bn'],
'material_bn_crc32' => $data['material_bn_crc32'],
'expire_bn' => $data['expire_bn'],
'nums' => $data['in_num'],
'branch_id' => $data['branch_id'],
'bill_id' => $row['bill_id'],
'bill_bn' => $row['bill_bn'],
'bill_type' => $row['bill_type'],
'bill_io_type' => $row['bill_io_type'],
);
if(!$basicMaterialStorageLifeBillsObj->save($tmp_bill_data)){
$basicMaterialStorageLifeObj->db->rollBack();
return false;
}
unset($tmp_bill_data);
//码表存入对应物料批次码
$code_type = material_codebase::getStorageListType();
$codeInfo = $codebaseObj->dump(array('code'=>$data['expire_bn'], 'type'=>$code_type), '*');
if(empty($codeInfo)){
$tmp_code = array(
'bm_id' => $data['bm_id'],
'type' => $code_type,
'code' => $data['expire_bn'],
);
if(!$codebaseObj->insert($tmp_code)){
$msg[] = '批次码已被占用:'.$data['expire_bn'];
$basicMaterialStorageLifeObj->db->rollBack();
return false;
}
}else{
if($codeInfo['bm_id'] !=$data['bm_id']){
$msg[] = '批次码已被占用:'.$data['expire_bn'];
$basicMaterialStorageLifeObj->db->rollBack();
return false;
}
}
}
//记录日志
$operationLogObj->write_log('storage_life_add@wms', $data['bmsl_id'], "物料保质期批次新增,关联单据号".$row['bill_bn']."");
}
}
$basicMaterialStorageLifeObj->db->commit();
return true;
}
/**
* 批次明细参数校验
* @param array $params 批次明细参数信息
* @param array $msg 批次明细校验错误信息
*/
private function checkParams($params,&$msg){
$msg = is_array($msg) ? $msg : array();
$mustHas = array('material_bn','bm_id','expire_bn','production_date','guarantee_period','warn_day','quit_day','in_num','branch_id','bill_id','bill_bn','bill_type','bill_io_type');
if($params){
foreach($params as $key=>$row){
$arrI = array_keys($row);
if(count(array_diff($mustHas,$arrI)) > 0){
$msg[] ='行' . $key .'-' . '必填字段不全';
}else{
foreach($row as $field=>$value){
if(in_array($field,$mustHas)){
if(is_null($value) || $value === ''){
$msg[] = '行:'.$key .'-字段:'. $field.'-不能为空';
}
}
switch ($field){
case 'in_num':
if(is_numeric($value) && $value>0){
//do nothing
} else{
$msg[] = '行:'.$key .'-字段:'. $field.'-非数字类型';
}
break;
}
}
}
}
if(count($msg)>0){
return false;
}
}else{
$msg[] = '没有传入参数';
return false;
}
return true;
}
/**
*
* 保质期明细生成方法
* @param array $data 批次信息
*/
public function update($data,&$msg){
//校验传入参数
if(!$this->checkUpdateParams($data,$msg)){
return false;
}
$basicMaterialStorageLifeObj = app::get('material')->model('basic_material_storage_life');
$basicMaterialStorageLifeBillsObj = app::get('material')->model('basic_material_storage_life_bills');
$operationLogObj = app::get('ome')->model('operation_log');
//事务开启
$basicMaterialStorageLifeObj->db->beginTransaction();
foreach($data as $row){
$storageLifeInfo = $basicMaterialStorageLifeObj->dump(array('branch_id'=>$row['branch_id'], 'bm_id'=>$row['bm_id'], 'expire_bn'=>$row['expire_bn']),'*');
if($storageLifeInfo){
if($row['bill_io_type'] == 1){
$update_num = "in_num=in_num+".$row['difference_num'].",balance_num=balance_num+".$row['difference_num'];
}else{
$update_num = "out_num=out_num+".$row['difference_num'].",balance_num=balance_num-".$row['difference_num'];
}
$sql = 'UPDATE sdb_material_basic_material_storage_life SET '.$update_num.' WHERE bmsl_id='.$storageLifeInfo['bmsl_id'];
if(!$basicMaterialStorageLifeObj->db->exec($sql)){
$basicMaterialStorageLifeObj->db->rollBack();
return false;
}else{
//生成相应的采购入库流水单据信息
$tmp_bill_data = array(
'bmsl_id' => $storageLifeInfo['bmsl_id'],
'bm_id' => $row['bm_id'],
'material_bn' => $storageLifeInfo['material_bn'],
'material_bn_crc32' => $storageLifeInfo['material_bn_crc32'],
'expire_bn' => $row['expire_bn'],
'nums' => $row['difference_num'],
'branch_id' => $row['branch_id'],
'bill_id' => $row['bill_id'],
'bill_bn' => $row['bill_bn'],
'bill_type' => $row['bill_type'],
'bill_io_type' => $row['bill_io_type'],
);
if(!$basicMaterialStorageLifeBillsObj->save($tmp_bill_data)){
$basicMaterialStorageLifeObj->db->rollBack();
return false;
}
unset($tmp_bill_data);
}
//记录日志
$event_type = $row['bill_io_type'] == 1 ? '入库' : '出库';
$operationLogObj->write_log('storage_life_chg@wms', $storageLifeInfo['bmsl_id'], "物料保质期批次变更,关联单据号:".$row['bill_bn'].",".$event_type.":".$row['difference_num']);
}else{
$msg[] = '批次信息不存在:'.$row['expire_bn'];
$basicMaterialStorageLifeObj->db->rollBack();
return false;
}
}
$basicMaterialStorageLifeObj->db->commit();
return true;
}
/**
* 更新时批次明细参数校验
* @param array $params 批次明细参数信息
* @param string $msg 批次明细校验错误信息
*/
private function checkUpdateParams($params,&$msg){
$mustHas = array('branch_id','bm_id','expire_bn','difference_num','bill_id','bill_bn','bill_type','bill_io_type');
if($params){
foreach($params as $key=>$row){
$arrI = array_keys($row);
if(count(array_diff($mustHas,$arrI)) > 0){
$msg[] ='行' . $key .'-' . '必填字段不全';
}else{
foreach($row as $field=>$value){
if(in_array($field,$mustHas)){
if(is_null($value) || $value === ''){
$msg[] = '行:'.$key .'-字段:'. $field.'-不能为空';
}
}
switch ($field){
case 'difference_num':
if(is_numeric($value) && $value>0){
//do nothing
} else{
$msg[] = '行:'.$key .'-字段:'. $field.'-非数字类型';
}
break;
}
}
}
}
if(count($msg)>0){
return false;
}
}else{
$msg[] = '没有传入参数';
return false;
}
return true;
}
/**
*
* 预占保质期明细物料数量
* @param array $data 批次信息
*/
public function freeze(&$data,&$msg){
//校验传入参数
if(!$this->checkFreezeParams($data,$msg)){
return false;
}
$nowTime = time();
$basicMaterialStorageLifeObj = app::get('material')->model('basic_material_storage_life');
$basicMaterialStorageLifeBillsObj = app::get('material')->model('basic_material_storage_life_bills');
$operationLogObj = app::get('ome')->model('operation_log');
foreach($data['items'] as $k => $item){
$now_bm_num = $item['num'];
$is_end = false;
while($now_bm_num > 0){
$sql = 'SELECT * FROM sdb_material_basic_material_storage_life WHERE branch_id='.$data['branch_id'].' and bm_id='.$item['bm_id'].' and balance_num - freeze_num >0 and quit_date > '.$nowTime.' ORDER BY expiring_date ASC';
$row = $basicMaterialStorageLifeObj->db->selectrow($sql);
if($row){
$can_use_store = $row['balance_num'] - $row['freeze_num'];
if($can_use_store >= $now_bm_num){
$freeze_num = $now_bm_num;
$is_end = true;
}else{
$freeze_num = $can_use_store;
$now_bm_num -= $can_use_store;
}
$update_sql = 'UPDATE sdb_material_basic_material_storage_life SET freeze_num=freeze_num+'.$freeze_num.' WHERE bmsl_id='.$row['bmsl_id'];
$basicMaterialStorageLifeObj->db->exec($update_sql);
$affect_row = $basicMaterialStorageLifeObj->db->affect_row();
if(!(is_numeric($affect_row) && $affect_row > 0)){
return false;
}else{
//生成相应的采购入库流水单据信息
$tmp_bill_data = array(
'bmsl_id' => $row['bmsl_id'],
'bm_id' => $row['bm_id'],
'material_bn' => $row['material_bn'],
'material_bn_crc32' => $row['material_bn_crc32'],
'expire_bn' => $row['expire_bn'],
'nums' => $freeze_num,
'branch_id' => $row['branch_id'],
'bill_id' => $data['bill_id'],
'bill_bn' => $data['bill_bn'],
'bill_type' => $data['bill_type'],
'bill_io_type' => 2,//写死类型为2冻结批次类型单据
);
if(!$basicMaterialStorageLifeBillsObj->save($tmp_bill_data)){
return false;
}
unset($tmp_bill_data);
//重组原数据明细的关联批次信息引用返回,做应用层程序的暂存所用
$data['items'][$k]['expire_bns_info'][] = array('expire_bn'=>$row['expire_bn'], 'nums'=>$freeze_num);
}
//记日志
$operationLogObj->write_log('storage_life_freeze@wms', $row['bmsl_id'], "物料保质期批次预占,关联单据号:".$data['bill_bn'].",数量:".$freeze_num);
//跳出死循环处理下一个保质期物料
if($is_end){
break;
}
}else{
$msg = "物料找不到对应的仓库保质期批次信息";
return false;
}
}
}
return true;
}
/**
* 冻结时批次明细参数校验
* @param array $params 批次明细参数信息
* @param string $msg 批次明细校验错误信息
*/
private function checkFreezeParams($params,&$msg){
$mustHas = array('branch_id','bill_id','bill_bn','bill_type','items');
$itemMustHas = array('bm_id','num');
if($params){
$arrI = array_keys($params);
if(count(array_diff($mustHas,$arrI)) > 0){
$msg[] ='必填字段不全';
}
foreach($params as $field => $val){
switch ($field){
case 'items':
if(!is_array($val)){
$msg[] = '字段:'. $field.'-非数组类型';
}
foreach($params['items'] as $key =>$item){
$arrI = array_keys($item);
if(count(array_diff($itemMustHas,$arrI)) > 0){
$msg[] ='明细行' . $key .'-' . '必填字段不全';
}else{
foreach($item as $ifield=>$value){
switch ($ifield){
case 'num':
if(is_numeric($value) && $value>0){
//do nothing
} else{
$msg[] = '行:'.$key .'-字段:'. $ifield.'-非数字类型';
}
break;
}
}
}
}
break;
}
}
if ($msg && count($msg) > 0){
return false;
}
}else{
$msg[] = '没有传入参数';
return false;
}
return true;
}
/**
*
* 释放保质期明细物料数量
* @param array $data 批次信息
*/
public function unfreeze($data,&$msg){
//校验传入参数
if(!$this->checkUnfreezeParams($data,$msg)){
return false;
}
$basicMaterialStorageLifeObj = app::get('material')->model('basic_material_storage_life');
$basicMaterialStorageLifeBillsObj = app::get('material')->model('basic_material_storage_life_bills');
$operationLogObj = app::get('ome')->model('operation_log');
$need_freeze = array();
$storageLifeBills = $basicMaterialStorageLifeBillsObj->getList('bmsl_id,nums,bill_bn',array('branch_id'=>$data['branch_id'],'bill_id'=>$data['bill_id'],'bill_type'=>$data['bill_type'],'bill_io_type'=>2));
if($storageLifeBills){
foreach($storageLifeBills as $storageLifeBill){
if(isset($need_freeze[$storageLifeBill['bmsl_id']])){
$need_freeze[$storageLifeBill['bmsl_id']] += $storageLifeBill['nums'];
}else{
$need_freeze[$storageLifeBill['bmsl_id']] = $storageLifeBill['nums'];
}
}
if($need_freeze){
foreach($need_freeze as $id => $num){
$update_str = "freeze_num=IF(CAST((freeze_num -$num) AS SIGNED)>0,freeze_num-$num,0)";
$update_sql = 'UPDATE sdb_material_basic_material_storage_life SET '.$update_str.' WHERE bmsl_id='.$id;
$basicMaterialStorageLifeObj->db->exec($update_sql);
$affect_row = $basicMaterialStorageLifeObj->db->affect_row();
if(!(is_numeric($affect_row) && $affect_row > 0)){
return false;
}
//记日志
$operationLogObj->write_log('storage_life_unfreeze@wms', $id, "物料保质期批次释放预占,关联单据号:".$storageLifeBills[0]['bill_bn'].",数量:".$num);
}
$basicMaterialStorageLifeBillsObj->update(array('bill_io_type'=>3),array('branch_id'=>$data['branch_id'],'bill_id'=>$data['bill_id'],'bill_type'=>$data['bill_type'],'bill_io_type'=>2));
}
}
return true;
}
/**
* 释放冻结时批次明细参数校验
* @param array $params 批次明细参数信息
* @param string $msg 批次明细校验错误信息
*/
private function checkUnfreezeParams($params,&$msg){
$mustHas = array('branch_id','bill_id','bill_type');
if($params){
$arrI = array_keys($params);
if(count(array_diff($mustHas,$arrI)) > 0){
$msg[] ='必填字段不全';
}
if(is_array($msg) && count($msg)>0){
return false;
}
}else{
$msg[] = '没有传入参数';
return false;
}
return true;
}
/**
*
* 保质期明细物料数量扣减,冻结释放
* @param array $data 批次信息
*/
public function consign($data, &$out_storagelife, &$msg){
//校验传入参数
if(!$this->checkConsignParams($data,$msg)){
return false;
}
$basicMaterialObj = app::get('material')->model('basic_material');
$basicMaterialStorageLifeObj = app::get('material')->model('basic_material_storage_life');
$basicMaterialStorageLifeBillsObj = app::get('material')->model('basic_material_storage_life_bills');
$operationLogObj = app::get('ome')->model('operation_log');
$consign_num = array();
$storageLifeBills = $basicMaterialStorageLifeBillsObj->getList('bmsl_id,bm_id,material_bn,expire_bn,nums,bill_bn',array('branch_id'=>$data['branch_id'],'bill_id'=>$data['bill_id'],'bill_type'=>$data['bill_type'],'bill_io_type'=>2), 0, -1);
if($storageLifeBills){
foreach($storageLifeBills as $k => $storageLifeBill){
$basicMaterialInfo = $basicMaterialObj->getList('material_name', array('material_bn' => $storageLifeBill['material_bn']), 0, 1);
if($basicMaterialInfo){
$storageLifeBills[$k]['product_name'] = $basicMaterialInfo[0]['material_name'];
}
unset($basicMaterialInfo);
if(isset($consign_num[$storageLifeBill['bmsl_id']])){
$consign_num[$storageLifeBill['bmsl_id']] += $storageLifeBill['nums'];
}else{
$consign_num[$storageLifeBill['bmsl_id']] = $storageLifeBill['nums'];
}
}
if($consign_num){
foreach($consign_num as $id => $num){
$update_str = "balance_num=IF(CAST((balance_num -$num) AS SIGNED)>0,balance_num-$num,0), freeze_num=IF(CAST((freeze_num -$num) AS SIGNED)>0,freeze_num-$num,0), out_num=out_num+$num";
$update_sql = 'UPDATE sdb_material_basic_material_storage_life SET '.$update_str.' WHERE bmsl_id='.$id;
$basicMaterialStorageLifeObj->db->exec($update_sql);
$affect_row = $basicMaterialStorageLifeObj->db->affect_row();
if(!(is_numeric($affect_row) && $affect_row > 0)){
return false;
}
//记日志
$operationLogObj->write_log('storage_life_consign@wms', $id, "物料保质期批次出库,关联单据号:".$storageLifeBills[0]['bill_bn'].",数量:".$num);
}
unset($consign_num);
$basicMaterialStorageLifeBillsObj->update(array('bill_io_type'=>0),array('branch_id'=>$data['branch_id'],'bill_id'=>$data['bill_id'],'bill_type'=>$data['bill_type'],'bill_io_type'=>2));
}
$out_storagelife = $storageLifeBills;
}
return true;
}
/**
* 出库时批次明细参数校验
* @param array $params 批次明细参数信息
* @param string $msg 批次明细校验错误信息
*/
private function checkConsignParams($params,&$msg){
$mustHas = array('branch_id','bill_id','bill_type');
if($params){
$arrI = array_keys($params);
if(count(array_diff($mustHas,$arrI)) > 0){
$msg[] ='必填字段不全';
}
if(is_array($msg) && count($msg)>0){
return false;
}
}else{
$msg[] = '没有传入参数';
return false;
}
return true;
}
/**
*
* 保质期延保日期更新
* @param array $data 批次延保信息
*
*/
public function updatePeriodValidity($data, &$msg)
{
#校验传入参数
if(!$this->checkPeriodValidityParams($data, $msg)){
return false;
}
$basicMaterialStorageLifeObj = app::get('material')->model('basic_material_storage_life');
$oOperation_log = app::get('ome')->model('operation_log');
$date_type = array(1=>'天', '月', '年');
#数据处理
$bmsl_ids = $data['bmsl_ids'];
$data['production_date'] = strtotime($data['production_date']);
$data['guarantee_period'] = $data['guarantee_period'];
switch($data['date_type']){
case 'day':
$data['expiring_date'] = strtotime('+'.$data['guarantee_period'].' days',$data['production_date'])+86399;
$data['date_type'] = 1;
break;
case 'month':
$data['expiring_date'] = strtotime('+'.$data['guarantee_period'].' months',$data['production_date'])+86399;
$data['date_type'] = 2;
break;
case 'year':
$data['expiring_date'] = strtotime('+'.$data['guarantee_period'].' years',$data['production_date'])+86399;
$data['date_type'] = 3;
break;
case 'date':
$data['guarantee_period'] = (strtotime($data['expiring_date']) - $data['production_date'])/86400;
$data['expiring_date'] = strtotime($data['expiring_date'])+86399;
$data['date_type'] = 1;
break;
}
$field = 'bmsl_id, expire_bn, bm_id, material_bn, production_date, guarantee_period, date_type, expiring_date, warn_date, quit_date, warn_day, quit_day';
$dataList = $basicMaterialStorageLifeObj->getList($field, array('bmsl_id'=>$bmsl_ids));
if(empty($dataList))
{
$msg[] = '没有找到相关记录';
return false;
}
#检验保质期天数是否有效
$fail_array = array();
$updateData = array();
$logsData = array();
$diff_date = ($data['expiring_date'] - $data['production_date']) / 86400;
$diff_date = intval($diff_date);
foreach ($dataList as $key => $row)
{
if($diff_date <= $row['quit_day'])
{
$fail_array[$row['bm_id']] = $row['material_bn'];
}
# [更新]预警日期&&自动退出库存日期
$warn_date = $data['expiring_date'] - $row['warn_day']*86400;
$quit_date = $data['expiring_date'] - $row['quit_day']*86400;
$updateData[$row['bmsl_id']] = array(
'production_date' => $data['production_date'],
'guarantee_period' => $data['guarantee_period'],
'date_type' => $data['date_type'],
'expiring_date' => $data['expiring_date'],
'warn_date' => $warn_date,
'quit_date' => $quit_date,
);
$logsData[$row['bmsl_id']] = array(
'expire_bn' => $row['expire_bn'],
'production_date' => $row['production_date'],
'guarantee_period' => $row['guarantee_period'],
'date_type' => $row['date_type'],
'expiring_date' => $row['expiring_date'],
'warn_date' => $row['warn_date'],
'quit_date' => $row['quit_date'],
);
}
if($fail_array)
{
$msg[] = '物料编码:'. implode(',', $fail_array) .'的保质期天数必须大于自动退出库存天数';
return false;
}
#事务开启
$basicMaterialStorageLifeObj->db->beginTransaction();
#保存
foreach ($updateData as $update_id => $update_row)
{
$logsRow = $logsData[$update_id];#日志数据
if(!$basicMaterialStorageLifeObj->update($update_row, array('bmsl_id'=>$update_id)))
{
$basicMaterialStorageLifeObj->db->rollBack();
$msg[] = '保质期编码:'. $logsRow['expire_bn'] .'更新失败';
return false;
}
#记录日志
$log_msg = "保质期编码:". $logsRow['expire_bn'] ."更新成功,生产日期(". date('Y-m-d', $logsRow['production_date']) ." => ". date('Y-m-d', $update_row['production_date']) .")";
$log_msg .= ", 保质期时长(". $logsRow['guarantee_period'] . $date_type[$logsRow['date_type']] ." => ". $update_row['guarantee_period'] . $date_type[$update_row['date_type']] .")";
$log_msg .= ",<br> 过期日期(". date('Y-m-d', $logsRow['expiring_date']) ." => ". date('Y-m-d', $update_row['expiring_date']) .")";
$log_msg .= ", 预警日期(". date('Y-m-d', $logsRow['warn_date']) ." => ". date('Y-m-d', $update_row['warn_date']) .")";
$log_msg .= ", 自动退出库存日期(". date('Y-m-d', $logsRow['quit_date']) ." => ". date('Y-m-d', $update_row['quit_date']) .")";
$oOperation_log->write_log('storage_life_edit@wms', $update_id, $log_msg);
}
#销毁
unset($data, $dataList, $updateData, $logsData, $logsRow, $log_msg);
$basicMaterialStorageLifeObj->db->commit();
return true;
}
/**
* 更新保质期状态
* @param string $msg 校验错误信息
*/
function updateStatusPeriodValidity($data,$action, &$msg){
$bmsl_id=$data["bmsl_ids"];
if(empty($bmsl_id)){
$msg[] = '无效操作';
return false;
}
$basicMaterialStorageLifeObj = app::get('material')->model('basic_material_storage_life');
$oOperation_log = app::get('ome')->model('operation_log');
$row = $basicMaterialStorageLifeObj->dump(array('bmsl_id'=>$bmsl_id));
if(empty($row)){
$msg[] = '没有找到相关记录';
return false;
}
//"status" field => 1:active 2:deactive
$updateStatus=2;
$log_msg="物料保质期批次状态关闭";
if($action=="active"){
$updateStatus=1;
$log_msg="物料保质期批次状态激活";
}
$basicMaterialStorageLifeObj->db->beginTransaction();
$update_sql = 'UPDATE sdb_material_basic_material_storage_life SET status='.$updateStatus.' WHERE bmsl_id='.$bmsl_id;
$basicMaterialStorageLifeObj->db->exec($update_sql);
$oOperation_log->write_log('storage_life_statusUpdate@wms', $bmsl_id, $log_msg);
$basicMaterialStorageLifeObj->db->commit();
return true;
}
/**
* 保质期延保参数校验
* @param array $params 延保参数
* @param string $msg 校验错误信息
*
*/
private function checkPeriodValidityParams($params, &$msg)
{
$mustHas = array('bmsl_ids','production_date','date_type','guarantee_period','expiring_date');
if($params)
{
$arrI = array_keys($params);
if(count(array_diff($mustHas,$arrI)) > 0){
$msg[] ='必填字段不全';
}
if(is_array($msg) && count($msg)>0){
return false;
}
}else{
$msg[] = '没有传入参数';
return false;
}
return true;
}
}