<?php
namespace app\controller ;
use app\controller\Acl;
use think\Model;
use app\model\{Goods,Warehouse};
use think\facade\{Db,Filesystem};
use think\exception\ValidateException;
class Inventory extends Acl {
public function record(){
$input=input('post.');
if(existFull($input,['page','limit']) && isset($input['warehouse']) && is_array($input['warehouse'])){
$warehouse = Db::name('warehouse')->where(empty($input['warehouse'])?sqlAuth('warehouse',[]):[['id','in',$input['warehouse']]])->order(['id'=>'desc'])->select()->toArray();
$column=[];
foreach ($warehouse as $warehouseVo) {
$column[]=['id'=>$warehouseVo['id'],'key'=>'stock_'.$warehouseVo['id'],'name'=>$warehouseVo['name']];
}
$sql=fastSql($input,[
[['name'=>'name|py'],'fullLike'],
['number','fullLike'],
['spec','fullLike'],
['brand','fullEq'],
['code','fullLike'],
['data','fullLike']
]) $sql[]=['type','=',0];
$sqlOr=existFull($input,['code'])?[['id','in',array_column(Db::name('attr')->where([['code','=',$input['code']]])->select()->toArray(),'pid')]]:[];
existFull($input,['category'])&&$sql[]=['category','in',findTreeArr('category',$input['category'],'id')];
$count = Goods::where($sql)->whereOr($sqlOr)->count();
$info = Goods::with(['categoryData','attr'])->where($sql)->whereOr($sqlOr)->order(['id'=>'desc'])->page($input['page'],$input['limit'])->append(['extension'])->select()->toArray();
foreach ($info as $infoKey=>$infoVo) {
$info[$infoKey]['key']=$infoVo['id'];
foreach ($infoVo['attr'] as $attrKey=>$attrVo) {
$info[$infoKey]['attr'][$attrKey]['key']=$infoVo['id'].'.'.$attrVo['id'];
if(existFull($input,['code']) && !in_array($input['code'],[$infoVo['code'],$attrVo['code']])){
unset($info[$infoKey]['attr'][$attrKey]);
}
}
$info[$infoKey]['attr']=array_values($info[$infoKey]['attr']);
}
$room=Db::name('room')->where([['warehouse','in',array_column($warehouse,'id')],['goods','in',array_column($info,'id')]])->select()->toArray();
$gather=['g'=>[],'wg'=>[],'ga'=>[],'wga'=>[]];
foreach ($room as $roomVo) {
$g=md5_16($roomVo['goods']);
$gather['g'][$g]=math()->chain($gather['g'][$g]??0)->add($roomVo['nums'])->done();
$wg=md5_16($roomVo['warehouse'].'&'.$roomVo['goods']);
$gather['wg'][$wg]=math()->chain($gather['wg'][$wg]??0)->add($roomVo['nums'])->done();
if(!empty($roomVo['attr'])){
$ga=md5_16($roomVo['goods'].'&'.$roomVo['attr']);
$gather['ga'][$ga]=math()->chain($gather['ga'][$ga]??0)->add($roomVo['nums'])->done();
$wga=md5_16($roomVo['warehouse'].'&'.$roomVo['goods'].'&'.$roomVo['attr']);
$gather['wga'][$wga]=math()->chain($gather['wga'][$wga]??0)->add($roomVo['nums'])->done();
}
}
foreach ($info as $infoKey=>$infoVo) {
$g=md5_16($infoVo['id']);
$info[$infoKey]['summary']=isset($gather['g'][$g])?($infoVo['unit']=='-1'?unitSwitch($gather['g'][$g],$infoVo['units']):$gather['g'][$g]):0;
$record=[];
if($infoVo['unit']=='-1'){
$enter=[];
$unit=array_reverse(array_merge([['name'=>$infoVo['units'][0]['source']]],$infoVo['units']));
foreach ($unit as $unitVo) {
$enter[]=['name'=>$unitVo['name'],'nums'=>''];
}
}else{
$enter='';
}
foreach ($column as $columnVo) {
$wg=md5_16($columnVo['id'].'&'.$infoVo['id']);
$record['stock_'.$columnVo['id']]=[
'warehouse'=>$columnVo['id'],
'basis'=>$gather['wg'][$wg]??0,
'basisAlias'=>isset($gather['wg'][$wg])?($infoVo['unit']=='-1'?unitSwitch($gather['wg'][$wg],$infoVo['units']):$gather['wg'][$wg]):0,
'enter'=>$enter,
'diff'=>0,
'diffAlias'=>''
];
}
$info[$infoKey]['record']=$record;
foreach ($infoVo['attr'] as $attrKey=>$attrVo) {
$ga=md5_16($infoVo['id'].'&'.$attrVo['name']);
$info[$infoKey]['attr'][$attrKey]['summary']=isset($gather['ga'][$ga])?($infoVo['unit']=='-1'?unitSwitch($gather['ga'][$ga],$infoVo['units']):$gather['ga'][$ga]):0;
$record=[];
foreach ($column as $columnVo) {
$wga=md5_16($columnVo['id'].'&'.$infoVo['id'].'&'.$attrVo['name']);
$record['stock_'.$columnVo['id']]=[
'warehouse'=>$columnVo['id'],
'basis'=>$gather['wga'][$wga]??0,
'basisAlias'=>isset($gather['wga'][$wga])?($infoVo['unit']=='-1'?unitSwitch($gather['wga'][$wga],$infoVo['units']):$gather['wga'][$wga]):0,
'enter'=>$enter,
'diff'=>0,
'diffAlias'=>''
];
}
$info[$infoKey]['attr'][$attrKey]['record']=$record;
}
}
$result=[
'state'=>'success',
'count'=>$count,
'info'=>$info,
'column'=>$column
] }else{
$result=['state'=>'error','info'=>'传入参数不完整!'];
}
return json($result);
}
public function exports(){
$input=input('get.');
pushLog('导出库存盘点单') $sql=fastSql($input,[
[['name'=>'name|py'],'fullLike'],
['number','fullLike'],
['spec','fullLike'],
['brand','fullEq'],
['code','fullLike'],
['data','fullLike']
]) $sql[]=['type','=',0];
$sqlOr=existFull($input,['code'])?[['id','in',array_column(Db::name('attr')->where([['code','=',$input['code']]])->select()->toArray(),'pid')]]:[];
existFull($input,['category'])&&$sql[]=['category','in',findTreeArr('category',$input['category'],'id')];
$info = Goods::with(['categoryData','attr'])->where($sql)->whereOr($sqlOr)->order(['id'=>'desc'])->append(['extension'])->select()->toArray();
foreach ($info as $infoKey=>$infoVo) {
foreach ($infoVo['attr'] as $attrKey=>$attrVo) {
if(existFull($input,['code']) && !in_array($input['code'],[$infoVo['code'],$attrVo['code']])){
unset($info[$infoKey]['attr'][$attrKey]);
}
}
$info[$infoKey]['attr']=array_values($info[$infoKey]['attr']);
}
$source=[];
foreach ($info as $infoVo) {
$infoVo['enter']='';
$source[]=$infoVo;
if(!empty($infoVo['attr'])){
foreach ($infoVo['attr'] as $attrVo) {
$attrVo['name']='|- '.$attrVo['name'];
$attrVo['enter']='';
$source[]=$attrVo;
}
}
}
$excel=[] $excel[]=['type'=>'title','info'=>'库存盘点单'];
$field=['name'=>'商品名称','enter'=>'盘点数','number'=>'商品编号','spec'=>'规格型号','categoryData|name'=>'商品分类','brand'=>'商品品牌','extension|unit'=>'商品单位','code'=>'商品条码','data'=>'商品备注'];
$thead=array_values($field) $tbody=[] foreach ($source as $sourceVo) {
$rowData=[];
foreach (array_keys($field) as $fieldVo) {
$rowData[]=arraySeek($sourceVo,$fieldVo) }
$tbody[]=$rowData }
$excel[]=['type'=>'table','info'=>['thead'=>$thead,'tbody'=>$tbody]] buildExcel('库存盘点单',$excel);
}
public function buildEntry(){
$input=input('post.');
if(existFull($input,['info'])){
$class=['total'=>0,'type'=>1];
$fun=getSys('fun');
$list=[
'goods'=>Goods::where([['id','in',array_unique(array_column($input['info'],'goods'))]])->select()->toArray(),
'warehouse'=>Warehouse::where([['id','in',array_unique(array_column($input['info'],'warehouse'))]])->select()->toArray(),
];
foreach ($input['info'] as $infoVo) {
$record=[];
$goods=search($list['goods'])->where([['id','=',$infoVo['goods']]])->find();
$warehouse=search($list['warehouse'])->where([['id','=',$infoVo['warehouse']]])->find();
$record['goods']=$infoVo['goods'];
$record['goodsData']=$goods;
$record['attr']=$infoVo['attr'];
$record['unit']=$infoVo['unit'];
$record['warehouse']=$infoVo['warehouse'];
$record['warehouseData']=$warehouse;
$record['batch']='';
$record['mfd']='';
$record['price']=$goods['buy'];
$record['nums']=$infoVo['nums'];
$record['serial']=[];
$record['total']=math()->chain($record['price'])->mul($record['nums'])->round($fun['digit']['money'])->done();
$record['data']='';
$info[]=$record;
$class['total']=math()->chain($class['total'])->add($record['total'])->done() }
$result=['state'=>'success','info'=>['class'=>$class,'info'=>$info]];
}else{
$result=['state'=>'error','info'=>'传入参数不完整!'];
}
return json($result);
}
public function buildExtry(){
$input=input('post.');
if(existFull($input,['info']) && is_array($input['info'])){
$class=['total'=>0,'type'=>1];
$fun=getSys('fun');
$list=[
'goods'=>Goods::where([['id','in',array_unique(array_column($input['info'],'goods'))]])->select()->toArray(),
'warehouse'=>Warehouse::where([['id','in',array_unique(array_column($input['info'],'warehouse'))]])->select()->toArray(),
];
foreach ($input['info'] as $infoVo) {
$record=[];
$goods=search($list['goods'])->where([['id','=',$infoVo['goods']]])->find();
$warehouse=search($list['warehouse'])->where([['id','=',$infoVo['warehouse']]])->find();
$record['goods']=$infoVo['goods'];
$record['goodsData']=$goods;
$record['attr']=$infoVo['attr'];
$record['unit']=$infoVo['unit'];
$record['warehouse']=$infoVo['warehouse'];
$record['warehouseData']=$warehouse;
$record['batch']='';
$record['mfd']='';
$record['price']=$goods['buy'];
$record['nums']=abs($infoVo['nums']);
$record['serial']=[];
$record['total']=math()->chain($record['price'])->mul($record['nums'])->round($fun['digit']['money'])->done();
$record['data']='';
$info[]=$record;
$class['total']=math()->chain($class['total'])->add($record['total'])->done() }
$result=['state'=>'success','info'=>['class'=>$class,'info'=>$info]];
}else{
$result=['state'=>'error','info'=>'传入参数不完整!'];
}
return json($result);
}
}