Jelajahi Sumber

Merge branch 'Haozi'

# Conflicts:
#	app/Providers/AppServiceProvider.php
zhouzhendong 4 tahun lalu
induk
melakukan
069a4dbee3

+ 0 - 0
.htaccess


+ 84 - 0
app/Http/Controllers/HandInStorageController.php

@@ -0,0 +1,84 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Components\AsyncResponse;
+use App\OracleDOCASNHeader;
+use App\Services\HandInStorageService;
+use Illuminate\Http\Request;
+
+class HandInStorageController extends Controller
+{
+    use AsyncResponse;
+    /**
+     * 搜索查詢asn
+     */
+    public function selectAsn(Request $request)
+    {
+        /** @var HandInStorageService $handInStorageService  */
+        $handInStorageService=app('HandInStorageService');
+        $asnno= $request->input('asnno');
+        $asns =$handInStorageService->selectAsn($asnno);
+        if ($asns->count()>0){
+            $this->success($asns);
+        }else{
+            $this->error('未搜索到ASN单');
+        }
+    }
+    /**
+     * @param $asnno
+     * 跳转到收货明细页面
+     */
+    public function receiveDetailPage($asnno,$customerid)
+    {
+        /** @var HandInStorageService $handInStorageService  */
+        $handInStorageService=app('HandInStorageService');
+        if (!$customerid||$customerid=='undefined')
+            $customerid=OracleDOCASNHeader::query()->where('asnno',$asnno)->value('customerid');
+        $qualityStatus=$handInStorageService->getQualityStatus();
+        $attributeLocations=$handInStorageService->getAttributeLocation();
+        return view('store.handInStorage.receiveDetailPage')
+            ->with(['asnno'=>$asnno,'customerid'=>$customerid,'qualityStatus'=>$qualityStatus,'attributeLocations'=>$attributeLocations]);
+    }
+
+    /**
+     * @param Request $request
+     * 查询富勒asn_detail(集合)
+     */
+    public function selectAsnDetails(Request $request)
+    {
+        $asnno= $request->input('asnno');
+        $asnDetails =app('HandInStorageService')->selectAsnDetails($asnno);
+        if ($asnDetails->count()>0)$this->success($asnDetails);
+        else $this->error('未搜索到ASN详情单');
+
+    }
+    /**
+     * @param Request $request
+     * 查询富勒bas_sku 并关联 bas_lotid
+     */
+    public function getBasSkuWithLot(Request $request): array
+    {
+        $customerid= $request->input('customerid');
+        $sku= $request->input('sku');
+        $asnno= $request->input('asnno');
+        $asnDetail=app('HandInStorageService')->getAsnDetail($asnno,$sku);
+        $basSku =app('HandInStorageService')->getBasSkuLotId($customerid,$sku);
+        if (isset($basSku)&&isset($asnDetail))return ['success'=>true,'basSku'=>$basSku,'asnDetail'=>$asnDetail];
+        else $this->error('无效条码');
+    }
+
+    public function fluxHandIn(Request $request)
+    {
+        $info=$request->input('info');
+//        dd($info);
+        if (!$info['customerid']||!$info['sku']||!$info['asnno']) $this->error('参数错误');
+        if ($info['amount']+$info['receivedqty']>$info['expectedqty'])$this->error('收货数大于预期数');
+        /** @var HandInStorageService $handInStorageService  */
+        $handInStorageService=app('HandInStorageService');
+        $handInStorageService->fluxHandIn($info);
+//        dd($result,"111");
+    }
+
+
+}

+ 7 - 0
app/Http/Controllers/TestController.php

@@ -40,6 +40,7 @@ use App\MeasuringMachine;
 use App\Menu;
 use App\Menu;
 use App\Notifications\SendEmailNotification;
 use App\Notifications\SendEmailNotification;
 use App\OracleActAllocationDetails;
 use App\OracleActAllocationDetails;
+use App\OracleBasLotId;
 use App\OracleDOCASNHeader;
 use App\OracleDOCASNHeader;
 use App\Order;
 use App\Order;
 use App\OrderBin;
 use App\OrderBin;
@@ -112,6 +113,7 @@ use App\ValueStore;
 use App\Waybill;
 use App\Waybill;
 use Carbon\Carbon;
 use Carbon\Carbon;
 use Carbon\CarbonPeriod;
 use Carbon\CarbonPeriod;
+use Cassandra\Uuid;
 use ChangeColumnOrderIdToOrderIssues;
 use ChangeColumnOrderIdToOrderIssues;
 use Doctrine\DBAL\Exception\DatabaseObjectExistsException;
 use Doctrine\DBAL\Exception\DatabaseObjectExistsException;
 use Doctrine\DBAL\Query\QueryBuilder;
 use Doctrine\DBAL\Query\QueryBuilder;
@@ -1350,4 +1352,9 @@ TEXT;
             app('LogService')->log(__METHOD__,"采购管理-生成月账单报表",json_encode($totalBill));
             app('LogService')->log(__METHOD__,"采购管理-生成月账单报表",json_encode($totalBill));
         }
         }
     }
     }
+
+    public function uuid()
+    {
+        dd(md5( date("Y-m-d H:i:s")));
+    }
 }
 }

+ 21 - 0
app/OracleBasLotId.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App;
+
+use App\Traits\ModelTimeFormat;
+use Illuminate\Database\Eloquent\Model;
+use App\Traits\ModelLogChanging;
+
+/**
+ * DB:      FLUX/WMS_USER
+ * TABLE:   BAS_LOTID
+ * EXPLAIN: 批次属性规则表
+ */
+class OracleBasLotId extends Model
+{
+    use ModelTimeFormat;
+    use ModelLogChanging;
+
+    protected $connection="oracle";
+    protected $table="BAS_LOTID";
+}

+ 5 - 1
app/OracleBasSKU.php

@@ -9,7 +9,6 @@ use Illuminate\Database\Eloquent\Model;
  * EXPLAIN: 商品
  * EXPLAIN: 商品
  */
  */
 use App\Traits\ModelTimeFormat;
 use App\Traits\ModelTimeFormat;
-
 use App\Traits\ModelLogChanging;
 use App\Traits\ModelLogChanging;
 
 
 class OracleBasSKU extends Model
 class OracleBasSKU extends Model
@@ -26,4 +25,9 @@ class OracleBasSKU extends Model
      *         Descr_C 商品名称
      *         Descr_C 商品名称
      *
      *
      * */
      * */
+    public function lotId()
+    {
+        return $this->hasOne(OracleBasLotId::class,'lotid','lotid')
+            ->select('lotid','lotkey01','lotkey02','lotkey03','lotkey04','lotkey05','lotkey08');
+    }
 }
 }

+ 0 - 1
app/OracleDOCASNHeader.php

@@ -4,7 +4,6 @@ namespace App;
 
 
 use App\Traits\ModelTimeFormat;
 use App\Traits\ModelTimeFormat;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Model;
-
 use App\Traits\ModelLogChanging;
 use App\Traits\ModelLogChanging;
 
 
 class OracleDOCASNHeader extends Model
 class OracleDOCASNHeader extends Model

+ 3 - 0
app/OwnerMaterial.php

@@ -38,6 +38,9 @@ class OwnerMaterial extends Model
     public function getSpecificationAttribute($value){
     public function getSpecificationAttribute($value){
         return str_replace(array("\r\n","\n","\r","\"","&quot;"),' ',$value);
         return str_replace(array("\r\n","\n","\r","\"","&quot;"),' ',$value);
     }
     }
+    public function getSpecialAttribute($value){
+        return str_replace(array("\r\n","\n","\r","\"","&quot;"),' ',$value);
+    }
 
 
     public function scopeFilter($query,$filters)
     public function scopeFilter($query,$filters)
     {
     {

+ 2 - 0
app/Providers/AppServiceProvider.php

@@ -152,6 +152,7 @@ use App\Services\DbOpenService;
 use App\Services\DeliveryTypeService;
 use App\Services\DeliveryTypeService;
 use App\Services\ErrorPushService;
 use App\Services\ErrorPushService;
 use App\Services\MaterialBoxModelService;
 use App\Services\MaterialBoxModelService;
+use App\Services\HandInStorageService;
 
 
 class AppServiceProvider extends ServiceProvider
 class AppServiceProvider extends ServiceProvider
 {
 {
@@ -247,6 +248,7 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('ForeignHaiRoboticsService',ForeignHaiRoboticsService::class);
         app()->singleton('ForeignHaiRoboticsService',ForeignHaiRoboticsService::class);
         app()->singleton('ForeignZhenCangService',ForeignZhenCangService::class);
         app()->singleton('ForeignZhenCangService',ForeignZhenCangService::class);
         app()->singleton('GoodScanWeightService',GoodScanWeightService::class);
         app()->singleton('GoodScanWeightService',GoodScanWeightService::class);
+        app()->singleton('HandInStorageService',HandInStorageService::class);
         app()->singleton('HaoChuangWeightService',HaoChuangWeightService::class);
         app()->singleton('HaoChuangWeightService',HaoChuangWeightService::class);
         app()->singleton('HengLiWeightService',HengLiWeightService::class);
         app()->singleton('HengLiWeightService',HengLiWeightService::class);
         app()->singleton('InventoryAccountMissionService', InventoryAccountMissionService::class);
         app()->singleton('InventoryAccountMissionService', InventoryAccountMissionService::class);

+ 393 - 0
app/Services/HandInStorageService.php

@@ -0,0 +1,393 @@
+<?php
+
+namespace App\Services;
+
+use App\OracleBasCode;
+use App\OracleBasSKU;
+use App\OracleDOCASNDetail;
+use App\OracleDOCASNHeader;
+use App\OracleInvLotAtt;
+use App\Traits\ServiceAppAop;
+use App\ValueStore;
+use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Collection;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\DB;
+
+class HandInStorageService
+{
+    use ServiceAppAop;
+
+    /**
+     * @param $asn
+     * @return Builder[]|Collection
+     * 获取富勒asn_header
+     *
+     */
+    public function selectAsn($asn)
+    {
+        if ($asn) return OracleDOCASNHeader::query()
+            ->with('asnStatus')
+            ->select(['asnno','asnreference1','asnstatus','addtime','customerid'])
+            ->where('asnno',$asn)
+            ->get();
+
+        return OracleDOCASNHeader::query()
+            ->select(['asnno','asnreference1','asnstatus','addtime','customerid'])
+            ->with('asnStatus')
+            ->where('asnstatus','00')
+            ->orderByDesc('addtime')
+            ->limit(50)
+            ->get();
+    }
+
+    /**
+     * @param $asnno
+     * @return Builder[]|Collection
+     * 获取富勒asn_detail (集合)
+     */
+    public function selectAsnDetails($asnno)
+    {
+        return OracleDOCASNDetail::query()
+            ->select(['sku','expectedqty','skudescrc','asnlineno','asnno','receivedqty'])
+            ->where('asnno',$asnno)
+            ->get();
+    }
+
+    /**
+     * @param $asnno
+     * @param $sku
+     * @return Builder|Model|object|null
+     *
+     */
+    public function getAsnDetail($asnno,$sku)
+    {
+        return OracleDOCASNDetail::query()
+            ->select(['sku','expectedqty','skudescrc','asnlineno','asnno','receivedqty'])
+            ->where('asnno',$asnno)
+            ->where('sku',$sku)
+            ->first();
+    }
+
+    /**
+     * @return mixed
+     * 获取质量状态
+     */
+    public function getQualityStatus()
+    {
+        return Cache::remember('BAS_CODE_QLT_STS', 600, function () {
+            return OracleBasCode::query()->select(['codeid','code','codename_c'])
+                ->where('codeid','QLT_STS')
+                ->get();
+        });
+    }
+
+    /**
+     * @return mixed
+     * 获取属性仓
+     */
+    public function getAttributeLocation()
+    {
+        return Cache::remember('BAS_CODE_CUS_UDFPC', 600, function () {
+            return OracleBasCode::query()->select(['codeid','code','codename_c'])
+                ->where('codeid','CUS_UDFPC')
+                ->get();
+        });
+    }
+
+    /**
+     * @param $customerid
+     * @param $sku
+     * @return mixed
+     * 根据customerid和sku 查询商品关联的批次属性规则
+     */
+    public function getBasSkuLotId($customerid,$sku)
+    {
+        return Cache::remember('bas_sku_lot_'.$customerid.'_'.$sku, 600, function ()use($customerid,$sku) {
+            return OracleBasSKU::query()->select(['customerid','sku','lotid'])
+                ->where('customerid',$customerid)
+                ->where('sku',$sku)
+                ->with('lotId')
+                ->first();
+        });
+    }
+
+    /**
+     * @throws \Throwable
+     */
+    public function fluxHandIn(array $info)
+    {
+        $lotatt=array_filter($info,function ($key){
+            return strpos($key,'lotatt')===0;
+        },ARRAY_FILTER_USE_KEY);
+        $invlotatt=[];
+        for ($i=1;$i<=8;$i++){$invlotatt["lotatt0{$i}"]=null;}
+        foreach ($invlotatt as $key=>&$item){
+            foreach ($lotatt as $key1=>$item1){
+                if ($key===$key1) $item=$item1;
+            }
+        }
+        $who= 'WAS'.(Auth::user() ? '-'.Auth::user()["name"] : '');
+        $time=Carbon::now()->toDateTimeString();
+//        return DB::connection("oracle")->transaction(function ()use ($info,$invlotatt,$who,$time){
+            //flux 批次号
+//            $lotNum=$this->getOrCreateLotNum($info,$invlotatt,$who,$time);
+//            if (!$lotNum) return false;
+            //flux 创建入库事务
+//            $actTransactionLog=$this->setFluxActTransactionLog($info,$lotNum,$who,$time);
+//            if (!$actTransactionLog)return false;
+            //flux 创建上架任务
+//            $this->setFluxTskTaskListPA($info,$invlotatt, $actTransactionLog, $who, $time);
+            //flux 完善库存余量
+//            $this->updateFluxInv($info,$lotNum,$who,$time,$actTransactionLog);
+            //flux 更新asn_detail 和 asn_header 状态
+            $re=$this->updateFluxAsn($info,$invlotatt,$time,$who);
+            dd($re);
+//            return true;
+//        });
+
+    }
+
+    /**
+     * @throws \Throwable
+     */
+    public function updateFluxAsn(array $info, array $invlotatt, $time, $who): bool
+    {
+        $db=DB::connection("oracle");
+        $asn=OracleDOCASNHeader::query()
+            ->withCount('asnDetails')
+            ->with('asnDetails')
+            ->where('asnno',$info['asnno'])
+            ->first();
+        if (!$asn||!$asn->asnDetails||!$asn->asn_details_count) return false;
+        $asnDetails=$asn->asnDetails;
+        $receiveAsn=null;
+        foreach ($asnDetails as $asnDetail){
+            if ($asnDetail['asnno']==$info['asnno'] &&
+                $asnDetail['asnlineno']==$info['asnlineno'] &&
+                $asnDetail['customerid']==$info['customerid'] &&
+                $asnDetail['sku']==$info['sku']) $receiveAsn=$asnDetail;
+        }
+        return $db->transaction(function ()use($db,$info,$receiveAsn,$invlotatt,$time,$who){
+            if ($receiveAsn && (int)$receiveAsn['receivedqty']+(int)$info['amount']<(int)$receiveAsn['expectedqty']){
+                //asn_detail 收货数量+已收数量<预期数量
+                $db->update(DB::raw("UPDATE DOC_ASN_DETAILS SET linestatus = '30',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ?,
+             lotatt01=?,lotatt02=?,lotatt03=?,lotatt04=?,lotatt05=?,lotatt06=?,lotatt07=?,lotatt08=? WHERE asnno = ?"),
+                    [$time,$who,$invlotatt['lotatt01'],$invlotatt['lotatt02'],$invlotatt['lotatt03'],$invlotatt['lotatt04'],
+                        $invlotatt['lotatt05'],$invlotatt['lotatt06'],$invlotatt['lotatt07'],$invlotatt['lotatt08'],$info['asnno']]);
+                //asn_header 部分收货状态
+                $db->update(DB::raw("UPDATE DOC_ASN_HEADER SET asnstatus = '30',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ? WHERE asnno = ?"),
+                    [$time,$who,$info['asnno']]);
+            }elseif ($receiveAsn && (int)$receiveAsn['receivedqty']+(int)$info['amount']==(int)$receiveAsn['expectedqty']){
+                //asn_detail 收货数量+已收数量=预期数量
+                $db->update(DB::raw("UPDATE DOC_ASN_DETAILS SET linestatus = '40',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ?,
+             lotatt01=?,lotatt02=?,lotatt03=?,lotatt04=?,lotatt05=?,lotatt06=?,lotatt07=?,lotatt08=? WHERE asnno = ?"),
+                    [$time,$who,$invlotatt['lotatt01'],$invlotatt['lotatt02'],$invlotatt['lotatt03'],$invlotatt['lotatt04'],
+                        $invlotatt['lotatt05'],$invlotatt['lotatt06'],$invlotatt['lotatt07'],$invlotatt['lotatt08'],$info['asnno']]);
+                //当asn_detail 所有状态都为完全收货是  asn_header 状态修改为 完全收货(asnstatus=40)
+                if (OracleDOCASNDetail::query()->where('asnno',$info['asnno'])->where('linestatus',40)->count()==$asn->asn_details_count){
+                    $db->update(DB::raw("UPDATE DOC_ASN_HEADER SET asnstatus = '40',edittime = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),editwho = ? WHERE asnno = ?"),
+                        [$time,$who,$info['asnno']]);
+                }
+            }
+            return true;
+        });
+    }
+    /**
+     * @throws \Throwable
+     */
+    public function updateFluxInv(array $info, $lotNum, $who, $time, array $actTransactionLog)
+    {
+        $db = DB::connection("oracle");
+        $db->transaction(function ()use ($db,$info,$lotNum,$actTransactionLog,$who,$time){
+            //更新 inv_lot 批次 库存表
+            $invLot=$db->selectOne(DB::raw("SELECT * FROM INV_LOT WHERE lotnum = ? AND customerid = ? AND sku = ? "),[
+                $lotNum,$info['customerid'],$info['sku']
+            ]);
+            if ($invLot)$db->update(DB::raw("UPDATE INV_LOT SET qty = qty+?,edittime=?,editwho=? WHERE lotnum = ? AND customerid = ? AND sku = ?"),[
+                (int)$info['amount'],$time,$who,$lotNum,$info['customerid'],$info['sku'],
+            ]);
+            else $db->insert(DB::raw("INSERT INTO INV_LOT VALUES(?,?,?,?,0,0,0,0,0,0,0,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?)"),[
+                $lotNum,$info['customerid'],$info['sku'],$info['amount'],$time,$who, $time,$who
+            ]);
+            //更新 inv_lot_loc_id 批次/库位/跟踪号 库存表
+            $invLotId = $db->selectOne(DB::raw("SELECT * FROM inv_lot_loc_id WHERE lotnum = ? AND locationid = ? AND customerid = ? AND sku = ? AND traceid = ? FOR UPDATE"),[
+                $lotNum,$actTransactionLog['location'],$actTransactionLog['customerid'],$actTransactionLog['sku'],$actTransactionLog['trackid']
+            ]);
+
+            if ($info['location']){ //存在目标库位
+                $invLotIdHasPreLocation = $db->selectOne(DB::raw("SELECT * FROM inv_lot_loc_id WHERE lotnum = ? AND locationid = ? AND customerid = ? AND sku = ? AND traceid = ? FOR UPDATE"),[
+                    $lotNum,$info['location'],$actTransactionLog['customerid'],$actTransactionLog['sku'],$actTransactionLog['trackid']
+                ]);
+
+                if ($invLotIdHasPreLocation)$db->update(DB::raw("UPDATE inv_lot_loc_id SET qtypa = qtypa+?,edittime=?,editwho=? WHERE lotnum = ? AND locationid = ? AND traceid = ?"),[
+                    (int)$info['amount'],$time,$who,$lotNum,$info['location'],$actTransactionLog['trackid']
+                ]);
+                else $db->insert(DB::raw("INSERT INTO inv_lot_loc_id VALUES(?,?,?,?,?,?,0,0,0,0,0,0,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,0,0,0,0,0,'*',?,null)"),[
+                    $lotNum,$info['location'],$actTransactionLog['trackid'],$actTransactionLog['customerid'],$actTransactionLog['sku'],0,$time,$who,$time,$who,(int)$info['amount']
+                ]);
+
+                if ($invLotId)$db->update(DB::raw("UPDATE inv_lot_loc_id SET qty = qty+?,qtymvout = qtymvout+?,edittime=?,editwho=? WHERE lotnum = ? AND locationid = ? AND traceid = ?"),[
+                    (int)$info['amount'],(int)$info['amount'],$time,$who,$lotNum,$actTransactionLog['location'],$actTransactionLog['trackid']
+                ]);
+                else $db->insert(DB::raw("INSERT INTO inv_lot_loc_id VALUES(?,?,?,?,?,?,0,0,0,0,?,0,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,0,0,0,0,0,'*',0,null)"),[
+                    $lotNum,$actTransactionLog['location'],$actTransactionLog['trackid'],$actTransactionLog['customerid'],$actTransactionLog['sku'],(int)$info['amount'],(int)$info['amount'],
+                    $time,$who,$time,$who,
+                ]);
+
+            }else{
+                if ($invLotId)$db->update(DB::raw("UPDATE inv_lot_loc_id SET qty = qty+?,edittime=?,editwho=? WHERE lotnum = ? AND locationid = ? AND traceid = ?"),[
+                    (int)$info['amount'],$time,$who,$lotNum,$actTransactionLog['location'],$actTransactionLog['trackid']
+                ]);
+                else $db->insert(DB::raw("INSERT INTO inv_lot_loc_id VALUES(?,?,?,?,?,?,0,0,0,0,0,0,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,0,0,0,0,0,'*',0,null)"),[
+                    $lotNum,$actTransactionLog['location'],$actTransactionLog['trackid'],$actTransactionLog['customerid'],$actTransactionLog['sku'],(int)$info['amount'],$time,$who,$time,$who,
+                ]);
+            }
+        });
+    }
+
+    /**
+     * @throws \Throwable
+     */
+    public function setFluxTskTaskListPA(array $info, array $invlotatt, $actTransactionLog, $who, $time)
+    {
+        $db = DB::connection("oracle");
+        $db->transaction(function ()use ($db,$info,$invlotatt,$actTransactionLog,$who,$time){
+            $sql = <<<sql
+INSERT INTO TSK_TASKLISTS VALUES(?,'1','PA',?,?,'ASN',?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,null,null,?,?,?,?,?,?,?,?,null,null,null,null,
+    0,0,0,0,null,?,null,null,null,?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),null,null,?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),'N',null,null,
+    ?,?,?,'N',null,?,'*',null,null,null,'N',null,null)
+sql;
+            $db->insert(DB::raw($sql),[
+                $actTransactionLog['tsid'],$actTransactionLog['customerid'],$actTransactionLog['sku'],$actTransactionLog['docno'],$actTransactionLog['doclineno'],
+                $actTransactionLog['lotNum'],$actTransactionLog['packid'],'EA',$info['amount'],$info['amount'],$actTransactionLog['location'],$actTransactionLog['location'],
+                $actTransactionLog['trackid'],$actTransactionLog['lotNum'],$actTransactionLog['packid'],'EA',$info['amount'],$info['amount'],
+                $info['location'],$info['location'],$actTransactionLog['trackid'],'00','Putaway Task','3',$invlotatt['lotatt01'],$invlotatt['lotatt02'],$invlotatt['lotatt03'],$invlotatt['lotatt04'],
+                $invlotatt['lotatt05'],$invlotatt['lotatt06'],$invlotatt['lotatt07'],$invlotatt['lotatt08'],$actTransactionLog['trid'],$who,$time,null,null,null,null,
+                $actTransactionLog['userdefine1'],$actTransactionLog['userdefine2'],$actTransactionLog['userdefine3'],$actTransactionLog['warehouseid']
+            ]);
+        });
+    }
+
+    /**
+     * @param array $info
+     * @param $lotNum
+     * @param $who
+     * @param $time
+     * @return mixed
+     * @throws \Throwable
+     * 创建入库事务
+     */
+    public function setFluxActTransactionLog(array $info,$lotNum,$who,$time)
+    {
+        $db = DB::connection("oracle");
+        return $db->transaction(function ()use ($db,$info,$lotNum,$time,$who){
+            if ($info['trackNumber'])$trackNumber=$info['trackNumber'];
+            else $trackNumber=substr(md5($time),0,30);
+            $asnHeader=OracleDOCASNHeader::query()->where('asnno',$info['asnno'])->first();
+            $asnDetail=OracleDOCASNDetail::query()->where('asnno',$info['asnno'])->where('sku',$info['sku'])->first();
+            $sql = <<<sql
+INSERT INTO ACT_TRANSACTION_LOG VALUES(?,'IN',?,?,?,?,'ASN',?,?,?,?,?,?,?,?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,
+TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,0,0,0,0,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,?,null,null,null,?,?,?,?,?,?,?,?,
+?,?,?,?,'1','Y',null,?,?,?,?,null,null,?,null,null)
+sql;
+            list($trid,$max) = app('StorageService')->getTrNumber();
+            list($tsid,$max) = $this->getTsNum();
+            $db->insert(DB::raw($sql),[
+                $trid,$asnDetail->customerid,$asnDetail->sku,
+                $asnDetail->asnno,$asnDetail->asnlineno,$lotNum,$asnDetail->receivinglocation,'*',$asnDetail->packid,'EA',$info['amount'],$info['amount'],'99',$time,$who,
+                $time,$who,$time,$asnDetail->customerid,$asnDetail->sku,$trackNumber,$asnDetail->receivinglocation,$who,$asnDetail->packid,'EA',$info['amount'],$info['amount'],$lotNum,
+                '*','0','N',$tsid,substr($asnDetail->receivinglocation,-4),$asnHeader->userdefine1,$asnHeader->userdefine2,
+                $asnHeader->userdefine3,'O'
+            ]);
+            app('StorageService')->setTrNumber();
+            $this->setTsNum();
+            $actTransactionLog=[
+                'trid'=>$trid,'docno'=>$asnDetail->asnno,'customerid'=>$asnDetail->customerid,'sku'=>$asnDetail->sku,'doclineno'=>$asnDetail->asnlineno,'lotNum'=>$lotNum,'location'=>$asnDetail->receivinglocation,
+                'packid'=>$asnDetail->packid,'tsid'=>$tsid,'warehouseid'=>substr($asnDetail->receivinglocation,-4),'userdefine1'=>$asnHeader->userdefine1,'userdefine2'=>$asnHeader->userdefine2,
+                'userdefine3'=>$asnHeader->userdefine3,'trackid'=>$trackNumber
+            ];
+            return $actTransactionLog;
+        });
+    }
+    /**
+     * @param array $info
+     * @return mixed
+     * @throws \Throwable
+     * 或去flux 批次号
+     */
+    public function getOrCreateLotNum(array $info,array $invlotatt,$who,$time)
+    {
+        $invlotatt['customerid']=$info['customerid'];
+        $invlotatt['sku']=$info['sku'];
+        //根据批次规则查询或新建批次
+        $lotnum=OracleInvLotAtt::query()->where($invlotatt)->value('lotnum');
+        if ($lotnum) return $lotnum;
+
+        $db = DB::connection("oracle");
+        list($num,$max)=$this->getLtNum();
+        return $db->transaction(function ()use($db,$info,$invlotatt,$num,$who,$time){
+           $sql = <<<sql
+INSERT INTO INV_LOT_ATT VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,
+TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?,TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),?)
+sql;
+           $db->insert(DB::raw($sql),[
+               $num,$info['customerid'],$info['sku'],$invlotatt['lotatt01'],$invlotatt['lotatt02'],$invlotatt['lotatt03'],$invlotatt['lotatt04'],
+               $invlotatt['lotatt05'],$invlotatt['lotatt06'],$invlotatt['lotatt07'],$invlotatt['lotatt08'],null,null,null,null,$time,$who,$time,$who,$time,null
+           ]);
+           $this->setLtNum();
+           return $num;
+       });
+
+    }
+
+    /**
+     * 获取批次号
+     * @return array
+     */
+    private function getLtNum()
+    {
+        $val = ValueStore::query()->select("value")->where("name","flux_lt_number")->lockForUpdate()->first();
+        if (!$val)$val = ValueStore::query()->create(["name"=>"flux_lt_number","value"=>'0']);
+        $max = $val->value+1;
+        $number = sprintf("%07d", $max);
+        return array ('WLT'.$number,$max);
+    }
+
+    /**
+     * 设置批次号
+     */
+    private function setLtNum()
+    {
+        ValueStore::query()
+            ->select("value")
+            ->where("name","flux_lt_number")
+            ->update(["value"=>DB::raw("value+1")]);
+    }
+    /**
+     * 获取批次号
+     * @return array
+     */
+    private function getTsNum()
+    {
+        $val = ValueStore::query()->select("value")->where("name","flux_ts_number")->lockForUpdate()->first();
+        if (!$val)$val = ValueStore::query()->create(["name"=>"flux_ts_number","value"=>'0']);
+        $max = $val->value+1;
+        $number = sprintf("%07d", $max);
+        return array ('WTS'.$number,$max);
+    }
+
+    /**
+     * 设置批次号
+     */
+    private function setTsNum()
+    {
+        ValueStore::query()
+            ->select("value")
+            ->where("name","flux_ts_number")
+            ->update(["value"=>DB::raw("value+1")]);
+    }
+}

+ 7 - 7
app/Services/StorageService.php

@@ -408,7 +408,7 @@ sql;
                 '*','0','N','*',$task->taskid_sequence,$task->warehouseid,$task->userdefine1,$task->userdefine2,
                 '*','0','N','*',$task->taskid_sequence,$task->warehouseid,$task->userdefine1,$task->userdefine2,
                 $task->userdefine3,'O'
                 $task->userdefine3,'O'
             ]);
             ]);
-            $this->setTrNumber($max);
+            $this->setTrNumber();
             $sql = <<<sql
             $sql = <<<sql
 update TSK_TASKLISTS set TASKPROCESS = '99',REASONCODE = 'OK',PLANTOLOCATION = ?,PLANLOGICALTOSEQUENCE = ?,
 update TSK_TASKLISTS set TASKPROCESS = '99',REASONCODE = 'OK',PLANTOLOCATION = ?,PLANLOGICALTOSEQUENCE = ?,
 COMPLETED_TRANSACTIONID = ?,OPENWHO = ?,OPENTIME = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),
 COMPLETED_TRANSACTIONID = ?,OPENWHO = ?,OPENTIME = TO_DATE(?,'yyyy-mm-dd hh24:mi:ss'),
@@ -428,7 +428,8 @@ sql;
         }
         }
     }
     }
 
 
-    private function checkAsn($task)
+    private function
+    checkAsn($task)
     {
     {
         $sql = <<<SQL
         $sql = <<<SQL
 SELECT 1 FROM DOC_ASN_DETAILS WHERE ASNNO = ? AND LINESTATUS != '40'
 SELECT 1 FROM DOC_ASN_DETAILS WHERE ASNNO = ? AND LINESTATUS != '40'
@@ -480,9 +481,9 @@ SQL;
      *
      *
      * @return array
      * @return array
      */
      */
-    private function getTrNumber()
+    public function getTrNumber()
     {
     {
-        $val = ValueStore::query()->select("value")->where("name","flux_tr_number")->first();
+        $val = ValueStore::query()->select("value")->where("name","flux_tr_number")->lockForUpdate()->first();
         if (!$val)$val = ValueStore::query()->create(["name"=>"flux_tr_number","value"=>'0']);
         if (!$val)$val = ValueStore::query()->create(["name"=>"flux_tr_number","value"=>'0']);
         $max = $val->value+1;
         $max = $val->value+1;
         $number = sprintf("%09d", $max);
         $number = sprintf("%09d", $max);
@@ -492,11 +493,10 @@ SQL;
     /**
     /**
      * 设置事务现号
      * 设置事务现号
      *
      *
-     * @param integer $max
      */
      */
-    private function setTrNumber($max)
+    public function setTrNumber()
     {
     {
-        ValueStore::query()->select("value")->where("name","flux_tr_number")->update(["value"=>(string)((int)$max+1)]);
+        ValueStore::query()->select("value")->where("name","flux_tr_number")->update(["value"=>DB::raw("value+1")]);
     }
     }
 
 
     /**
     /**

+ 0 - 0
nginx.htaccess


+ 18 - 7
public/.htaccess

@@ -1,9 +1,20 @@
-Options +FollowSymLinks -Indexes
-RewriteEngine On
+<IfModule mod_rewrite.c>
+    <IfModule mod_negotiation.c>
+        Options +FollowSymLinks
+    </IfModule>
 
 
-RewriteCond %{HTTP:Authorization} .
-RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+    RewriteEngine On
 
 
-RewriteCond %{REQUEST_FILENAME} !-d
-RewriteCond %{REQUEST_FILENAME} !-f
-RewriteRule ^ index.php [L]
+    # Redirect Trailing Slashes If Not A Folder...
+    RewriteCond %{REQUEST_FILENAME} !-d
+    RewriteRule ^(.*)/$ /$1 [L,R=301]
+
+    # Handle Front Controller...
+    RewriteCond %{REQUEST_FILENAME} !-d
+    RewriteCond %{REQUEST_FILENAME} !-f
+    RewriteRule ^ index.php [L]
+
+    # Handle Authorization Header
+    RewriteCond %{HTTP:Authorization} .
+    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+</IfModule>

+ 0 - 1
public/index.php

@@ -1,5 +1,4 @@
 <?php
 <?php
-
 /**
 /**
  * Laravel - A PHP Framework For Web Artisans
  * Laravel - A PHP Framework For Web Artisans
  *
  *

+ 30 - 0
resources/views/store/handInStorage/androidIndex.blade.php

@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html lang="{{ str_replace('_', '-', app()->getLocale()) }}" class="h-100">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="icon" href="{{asset('icon/faviconc.ico')}}" type="image/x-icon"/>
+    <!-- CSRF Token -->
+    <meta name="csrf-token" content="{{ csrf_token() }}">
+    <title>手持入库首页</title>
+    <link href="{{ mix('css/app.css') }}" rel="stylesheet">
+</head>
+<body class="h-100">
+<div class="container-fluid h-100 text-center">
+    <div class="container-fluid h-25">
+        <a class="navbar-brand" href="{{ url('/control/panel/menu') }}" title="宝时 Warehouse Assistance System" style="vertical-align: text-bottom">
+            <img src="{{asset('icon/logo100b.png')}}" alt="宝时 Warehouse Assistance System" height="30" >
+        </a>
+    </div>
+    <div class="text-center h-75">
+        <div class="w-100 center h-75 row align-items-center justify-content-center">
+            <div class="w-100">
+                <a href="{{url('')}}"><button class="btn btn-info w-75 text-white" style="height: 60px"><h4>收货</h4></button></a>
+                <a href="{{url('')}}"><button class="btn btn-info w-75 mt-3 text-white" style="height: 60px"><h4>上架</h4></button></a>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="{{ mix('js/app.js') }}"></script>
+</body>
+</html>

+ 0 - 0
resources/views/store/handInStorage/putaway.blade.php


+ 124 - 0
resources/views/store/handInStorage/receive.blade.php

@@ -0,0 +1,124 @@
+@extends('layouts.app')
+@section('title')手持入库-收货@endsection
+
+@section('content')
+    <div class="d-none" id="container">
+        <div class="card offset-md-3 col-md-6">
+            <div class="card-header text-center mt-2 bg-transparent" id="header_title">
+                <span class="font-weight-bold h4">收货</span>
+            </div>
+            <div class="card-body" >
+                <div class="offset-2">
+                    <span class="font-weight-bold">ASN号:</span>
+                    <div class="form-group row mt-2">
+                        <label for="asn"></label>
+                        <input type="text" class="form-control col-8" id="asn"
+                               :class="errors.asn ? 'is-invalid' : ''" @keydown.enter="selectCustomerid($event)" v-model="info.asn">
+                        <span class="ml-2">
+                             <button type="button" id="select" class="btn btn-info" @click="selectAsn()">搜索</button>
+                        </span>
+                        <span class="invalid-feedback" role="alert" v-if="errors.asn">
+                            <strong>@{{ errors.asn[0] }}</strong>
+                        </span>
+                    </div>
+                </div>
+                <div style="overflow: auto;overflow-x: hidden" id="cardTable">
+                    <table class="table-sm table-striped table-bordered table-hover mb-3"
+                           style="background: rgb(255, 255, 255);">
+                        <tr v-for="(asn,i) in asns" @click="selectTrOne(i,asn)" :class="selectTr===i+1?'focusing' : ''">
+                            <td style="filter:grayscale(30%);">
+                                <div>
+                                    <div style="transform:scale(1)" class="pl-0">
+                                        <span><span class="text-danger font-weight-bold">ASN编号:</span><span class="text-black">@{{ asn.asnno }}</span></span>
+                                        <span><span class="font-weight-bold">交接状态:</span><span class="text-lowercase" v-if="asn.asn_status">@{{ asn.asn_status.codename_c }}</span></span>
+                                        <span><span class="text-lowercase">客户订单号1:</span><span class="text-lowercase">@{{ asn.asnreference1 }} </span></span>
+                                        <span><span class="text-black">创建时间:</span><span class="text-black-50">@{{ asn.addtime }}</span></span>
+                                    </div>
+                                </div>
+                            </td>
+                        </tr>
+                    </table>
+                </div>
+            </div>
+
+            <div class="card-footer bg-transparent">
+                <button type="button" id="confirm" class="btn btn-sm btn-outline-success float-right" @click="ensure()">确定</button>
+                <button type="button" id="cancel" class="btn btn-sm btn-outline-info float-left" @click="cancel()">取消</button>
+            </div>
+        </div>
+    </div>
+@stop
+
+@section('lastScript')
+    <script type="text/javascript">
+        new Vue({
+            el:"#container",
+            data:{
+                height:0,//屏幕高度
+                info:{},
+                errors:{},
+                asns:[],
+                selectTr:'',
+                isAndroid:false,
+            },
+            mounted(){
+                if (navigator.userAgent.indexOf("Android")!==-1)this.isAndroid = true;
+                this.pageInit();
+                $("#container").removeClass("d-none");
+                this.height=window.screen.availHeight;
+                document.getElementById('cardTable').style.height=this.height*0.50+'px';
+            },
+            methods:{
+                //页面初始化
+                pageInit(){
+                    if (!this.isAndroid)return;
+                    let element = document.getElementById("navbarSupportedContent").parentElement;
+                    element.className = "row";
+                    element.children[0].className += " col-5";
+                    element.innerHTML = element.children[0].outerHTML;
+                    let e1 = document.getElementById("menu");
+                    let e2 = document.getElementById("demand-div");
+                    if (e1)e1.remove();
+                    if (e2)e2.remove();
+                },
+                selectAsn(){
+                    let url = '{{url('store/handInStorage/selectAsn')}}';
+                    window.axios.post(url,{asnno:this.info.asn})
+                        .then(res=>{
+                            if (res.data.success){
+                                this.asns=res.data.data;
+                                this.$forceUpdate()
+                                return;
+                            }
+                            window.tempTip.setDuration(2000);
+                            window.tempTip.show(res.data.data);
+                        }).catch(err=>{
+                        window.tempTip.setDuration(2000);
+                        window.tempTip.show("网络错误:"+err);
+                    })
+                },
+                selectTrOne(i,asn){
+                    if (this.selectTr===i+1){
+                        this.selectTr=0
+                    }else {
+                        this.selectTr=i+1;
+                        this.info.asn=asn.asnno;
+                        this.info.customerid=asn.customerid;
+                    }
+                },
+                ensure(){
+                    let error = {};
+                    if (!this.info.asn)error.asn = ["ASN号必填"];
+                    if (this.info.asn && this.info.asn.length!==13)error.asn = ["无效ASN号"];
+                    if (JSON.stringify(error)!=='{}'){this.errors = error;return;}
+                    window.location.href="{{url('store/handInStorage/receiveDetailPage')}}/" + this.info.asn+'/'+ this.info.customerid;
+                },
+                cancel(){
+                    setTimeout(function () {
+                        window.location.reload();
+                    },100);
+                },
+            },
+        });
+    </script>
+@stop

+ 308 - 0
resources/views/store/handInStorage/receiveDetailPage.blade.php

@@ -0,0 +1,308 @@
+@extends('layouts.app')
+@section('title')手持入库-收货详情@endsection
+
+@section('content')
+    <div class="d-none" id="container">
+        <div class="card offset-md-3 col-md-6 col-sm-12">
+            <div class="card-header text-center mt-2 bg-transparent" id="header_title">
+                <span class="font-weight-bold h4">收货</span>
+            </div>
+            <div class="card-body">
+                <div class="form-group row m-1">
+                        <span class="text-right">
+                            <span class="fa fa-search fa-lg" aria-hidden="true" @click="selectAsnDetails()"></span>
+                            <label for="sku" class="text-right text-danger font-weight-bold">条码:</label>
+                        </span>
+                    <input type="text" class="form-control form-control-sm col-8" id="sku"
+                           :class="errors.sku ? 'is-invalid' : ''" @keydown.enter="enterVal($event)" v-model="info.sku" @blur="checkedSku()">
+                    <span class="invalid-feedback offset-3" role="alert" v-if="errors.sku">
+                            <strong>@{{ errors.sku[0] }}</strong>
+                    </span>
+                </div>
+                <div v-if="isInit">
+                    <div class="form-group row m-1">
+                        <label for="name" class="text-right">品名:</label>
+                        <span id="name" >@{{ info.name }}</span>
+                    </div>
+                    <div class="form-group row m-1">
+                        <label for="quantity" class="text-right">已收/预收数量:</label>
+                        <span>&nbsp;&nbsp;&nbsp;</span>
+                        <span id="quantity">@{{ info.receivedqty??0 }}/@{{ info.expectedqty??0 }}</span>
+                    </div>
+                    <div class="form-group row m-1">
+                        <label for="amount" class="text-right text-danger font-weight-bold">实收数量:</label>
+                        <input type="number" class="form-control form-control-sm col-8" id="amount"
+                               :class="errors.amount ? 'is-invalid' : ''" v-model="info.amount" @keydown.enter="enterVal($event)">
+                        <span class="invalid-feedback offset-3" role="alert" v-if="errors.amount">
+                            <strong>@{{ errors.amount[0] }}</strong>
+                        </span>
+                    </div>
+                    <div class="form-group row m-1">
+                        <label for="location" class="text-right">目标库位:</label>
+                        <input type="text" class="form-control form-control-sm col-8" id="location"
+                               @keydown.enter="enterVal($event)" v-model="info.location">
+                    </div>
+                    <div class="form-group row m-1">
+                        <label for="trackNumber" class="text-right">托盘号:</label>
+                        <input type="text" class="form-control form-control-sm col-8" id="trackNumber"
+                               @keydown.enter="enterVal($event)" v-model="info.trackNumber">
+                    </div>
+                </div>
+                <div style="overflow: auto;overflow-x: hidden" id="cardTable" v-if="!isInit">
+                    <table class="table-sm table-striped table-bordered table-hover mb-3"
+                           style="background: rgb(255, 255, 255);">
+                        <tr v-for="(asnDetail,i) in asnDetails" @click="selectTrOne(i,asnDetail.sku)" :class="selectTr===i+1?'focusing' : ''">
+                            <td style="filter:grayscale(30%);">
+                                <div>
+                                    <div style="transform:scale(1)" class="pl-0">
+                                        <span><span class="text-danger font-weight-bold">条码:</span><span class="text-black">@{{ asnDetail.sku }}</span></span>
+                                        <span><span class="font-weight-bold">行号:</span><span class="text-lowercase" >@{{ asnDetail.asnlineno }}</span></span>
+                                        <span class="text-right float-right">选中:<input type="checkbox" @click="checked(asnDetail)"></span>
+                                        <span><span class="text-lowercase">品名:</span><span class="text-lowercase">@{{ asnDetail.skudescrc }} </span></span>
+                                        <span><span class="text-black">预期数量:</span><span class="text-black-50">@{{ asnDetail.expectedqty }}</span></span>
+                                    </div>
+                                </div>
+                            </td>
+                        </tr>
+                    </table>
+                </div>
+            </div>
+            <div class="card-body border-top border-dark" v-if="basSku.lot_id">
+                <div class="form-group row">
+                    <span class="col-6" v-if="basSku.lot_id.lotkey01==='Y'">
+                        <label for="lotatt01" class=" text-right text-danger">生产日期:</label><br>
+                        <input type="date" class="form-control form-control-sm"
+                               :class="errors.lotatt01 ? 'is-invalid' : ''"  id="lotatt01" v-model="info.lotatt01">
+                        <span class="invalid-feedback offset-3" role="alert" v-if="errors.lotatt01">
+                            <strong>@{{ errors.lotatt01[0] }}</strong>
+                        </span>
+                    </span>
+                    <span class="col-6" v-if="basSku.lot_id.lotkey02==='Y'">
+                        <label for="lotatt02" class=" text-right text-danger">失效日期:</label>
+                        <input type="date" class="form-control form-control-sm"
+                               :class="errors.lotatt02 ? 'is-invalid' : ''" id="lotatt02" v-model="info.lotatt02">
+                        <span class="invalid-feedback offset-3" role="alert" v-if="errors.lotatt02">
+                            <strong>@{{ errors.lotatt02[0] }}</strong>
+                        </span>
+                    </span>
+                </div>
+                <div class="form-group row">
+                    <span class="col-6" v-if="basSku.lot_id.lotkey04==='Y'">
+                        <label for="lotatt04" class=" text-right text-danger">批号:</label><br>
+                        <input type="text" class="form-control form-control-sm" :class="errors.lotatt04 ? 'is-invalid' : ''"
+                               id="lotatt04" v-model="info.lotatt04">
+                         <span class="invalid-feedback offset-3" role="alert" v-if="errors.lotatt04">
+                            <strong>@{{ errors.lotatt04[0] }}</strong>
+                        </span>
+                    </span>
+                    <span class="col-6" v-if="basSku.lot_id.lotkey05==='Y'">
+                        <label for="lotatt05" class=" text-right text-danger">属性仓:</label>
+                       <select class="form-control form-control-sm" :class="errors.lotatt05 ? 'is-invalid' : ''"
+                               id="lotatt05" v-model="info.lotatt05">
+                             <option v-for="(attributeLocation,i) in attributeLocations"  :value="attributeLocation.code">@{{ attributeLocation.codename_c }}</option>
+                       </select>
+                         <span class="invalid-feedback offset-3" role="alert" v-if="errors.lotatt05">
+                            <strong>@{{ errors.lotatt05[0] }}</strong>
+                        </span>
+                    </span>
+                </div>
+                <div class="form-group row">
+                    <span class="col-6" v-if="basSku.lot_id.lotkey08==='Y'">
+                        <label for="lotatt08" class=" text-right text-danger">质量状态:</label>
+                       <select class="form-control form-control-sm"
+                               :class="errors.lotatt08 ? 'is-invalid' : ''" id="lotatt08" v-model="info.lotatt08">
+                           <option v-for="(quality,i) in qualityStatus"  :value="quality.code">@{{ quality.codename_c }}</option>
+                       </select>
+                         <span class="invalid-feedback offset-3" role="alert" v-if="errors.lotatt08">
+                            <strong>@{{ errors.lotatt08[0] }}</strong>
+                        </span>
+                    </span>
+                    <span class="col-6" v-if="basSku.lot_id.lotkey03==='Y'">
+                        <label for="lotatt03" class=" text-right text-danger">入库日期:</label>
+                        <input type="date" class="form-control form-control-sm"
+                               :class="errors.lotatt03 ? 'is-invalid' : ''" id="lotatt03" v-model="info.lotatt03">
+                         <span class="invalid-feedback offset-3" role="alert" v-if="errors.lotatt03">
+                            <strong>@{{ errors.lotatt03[0] }}</strong>
+                        </span>
+                    </span>
+                </div>
+            </div>
+            <div class="card-footer bg-transparent">
+                <button type="button" id="confirm" class="btn btn-sm btn-outline-success float-right" @click="ensure()">确定</button>
+                <button type="button" id="cancel" class="btn btn-sm btn-outline-info float-left" @click="cancel()">取消</button>
+            </div>
+        </div>
+    </div>
+@stop
+
+@section('lastScript')
+    <script type="text/javascript">
+        new Vue({
+            el:"#container",
+            data:{
+                asnno:'{!! $asnno !!}',
+                customerid:'{!! $customerid !!}',
+                qualityStatus:{!! $qualityStatus !!},
+                attributeLocations:{!! $attributeLocations !!},
+                basSku:{},
+                permissionList:[ //允许聚焦许可列表
+                    "sku","amount","trackNumber"
+                ],
+                asnDetails:[],
+                info:{},
+                errors:{},
+                isAndroid:false,
+                isInit:true,
+                element:[
+                    "sku","amount","location","trackNumber"
+                ],
+                selectTr:'',
+            },
+            mounted(){
+                if (navigator.userAgent.indexOf("Android")!==-1)this.isAndroid = true;
+                this.codeFocus();
+                this.pageInit();
+                $("#container").removeClass("d-none");
+            },
+            methods:{
+                //页面初始化
+                pageInit(){
+                    if (!this.isAndroid)return;
+                    let element = document.getElementById("navbarSupportedContent").parentElement;
+                    element.className = "row";
+                    element.children[0].className += " col-5";
+                    element.innerHTML = element.children[0].outerHTML;
+                    let e1 = document.getElementById("menu");
+                    let e2 = document.getElementById("demand-div");
+                    if (e1)e1.remove();
+                    if (e2)e2.remove();
+                },
+                selectTrOne(i,sku){
+                    if (this.selectTr===i+1){
+                        this.selectTr=0
+                    }else {
+                        this.selectTr=i+1;
+                        // this.info.sku=sku;
+                    }
+                },
+                checkedSku(){
+                    let url = '{{url('store/handInStorage/getBasSkuWithLot')}}';
+                    window.axios.post(url,{asnno:this.asnno,customerid:this.customerid,sku:this.info.sku})
+                        .then(res=>{
+                            if (res.data.success){
+                                this.fillInfo(res.data.asnDetail);
+                                this.basSku=res.data.basSku;
+                                this.$forceUpdate()
+                                return;
+                            }
+                            this.clearInfo();
+                            window.tempTip.setDuration(2000);
+                            window.tempTip.show(res.data.data);
+                        }).catch(err=>{
+                        window.tempTip.setDuration(2000);
+                        window.tempTip.show("网络错误:"+err);
+                    })
+                },
+                checked(asnDetail){
+                    this.isInit=true;
+                    this.fillInfo(asnDetail);
+                    let url = '{{url('store/handInStorage/getBasSkuWithLot')}}';
+                    window.axios.post(url,{asnno:this.asnno,customerid:this.customerid,sku:this.info.sku})
+                        .then(res=>{
+                            if (res.data.success){
+                                this.basSku=res.data.basSku;
+                                this.$forceUpdate()
+                                return;
+                            }
+                            window.tempTip.setDuration(2000);
+                            window.tempTip.show(res.data.data);
+                        }).catch(err=>{
+                        window.tempTip.setDuration(2000);
+                        window.tempTip.show("网络错误:"+err);
+                    })
+                },
+                clearInfo(){
+                    this.info.name='';
+                    this.info.expectedqty=0;
+                    this.info.receivedqty=0;
+                    this.$forceUpdate()
+                },
+                fillInfo(asnDetail){
+                    this.info.sku=asnDetail.sku;
+                    this.info.name=asnDetail.skudescrc;
+                    this.info.expectedqty=asnDetail.expectedqty;
+                    this.info.receivedqty=asnDetail.receivedqty;
+                    this.info.asnlineno=asnDetail.asnlineno;
+                },
+                //聚焦 白名单
+                codeFocus(){
+                    document.getElementById("sku").focus();
+                },
+                checkInfo(){
+                    let error = {};
+                    if (!this.info.sku)error.sku = ["条码必填"];
+                    if (!this.info.amount)error.amount = ["实收数量必填"];
+                    if (this.info.amount && ((Number(this.info.amount)+Number(this.info.receivedqty))>Number(this.info.expectedqty)))error.amount = ["总数不能超过预期数"];
+                    if (this.basSku.lot_id && this.basSku.lot_id.lotkey01==='Y' && !this.info.lotatt01) error.lotatt01=["生产日期为选"];
+                    if (this.basSku.lot_id && this.basSku.lot_id.lotkey02==='Y' && !this.info.lotatt02) error.lotatt02=["失效日期为选"];
+                    if (this.basSku.lot_id && this.basSku.lot_id.lotkey03==='Y' && !this.info.lotatt03) error.lotatt03=["入库日期为选"];
+                    if (this.basSku.lot_id && this.basSku.lot_id.lotkey04==='Y' && !this.info.lotatt04) error.lotatt04=["批号未填"];
+                    if (this.basSku.lot_id && this.basSku.lot_id.lotkey05==='Y' && !this.info.lotatt05) error.lotatt05=["属性仓未选"];
+                    if (this.basSku.lot_id && this.basSku.lot_id.lotkey08==='Y' && !this.info.lotatt08) error.lotatt08=["质量状态未选"];
+                    if (JSON.stringify(error)!=='{}'){this.errors = error;return;}
+                    if (!this.info.amount && this.info.maximum)this.info.amount = this.info.maximum;
+                },
+                enterVal(e){
+                    let index = this.element.indexOf(e.target.id)+1;
+                    let element = document.getElementById(this.element[index]);
+                    if (element)element.focus();
+                    e.preventDefault();
+                    return false;
+                },
+                selectAsnDetails(){
+                    this.isInit=false;
+                    this.info={};
+                    let url = '{{url('store/handInStorage/selectAsnDetails')}}';
+                    window.axios.post(url,{asnno:this.asnno})
+                        .then(res=>{
+                            if (res.data.success){
+                                this.asnDetails=res.data.data;
+                                this.$forceUpdate()
+                                return;
+                            }
+                            window.tempTip.setDuration(2000);
+                            window.tempTip.show(res.data.data);
+                        }).catch(err=>{
+                        window.tempTip.setDuration(2000);
+                        window.tempTip.show("网络错误:"+err);
+                    })
+                },
+                ensure(){
+                    this.checkInfo();
+                    this.info.customerid=this.customerid;
+                    this.info.asnno=this.asnno;
+                    console.log( this.info.trackNumber,this.info.location)
+                    if (this.info.trackNumber==''||this.info.trackNumber==null||this.info.trackNumber==undefined)this.info.trackNumber='';
+                    if (this.info.location==''||this.info.location==null||this.info.location==undefined)this.info.location='';
+                    // this.info.trackNumber='';
+                    // this.info.location='';
+                    console.log(this.info)
+                    let url = '{{url('store/handInStorage/fluxHandIn')}}';
+                    window.axios.post(url,{info:this.info})
+                        .then(res=>{
+                            if (res.data.success){
+                                // this.asnDetails=res.data.data;
+                                // this.$forceUpdate()
+                                return;
+                            }
+                            window.tempTip.setDuration(2000);
+                            window.tempTip.show(res.data.data);
+                        }).catch(err=>{
+                        window.tempTip.setDuration(2000);
+                        window.tempTip.show("网络错误:"+err);
+                    })
+                },
+            },
+        });
+    </script>
+@stop

+ 10 - 0
routes/web.php

@@ -481,6 +481,16 @@ Route::group(['middleware'=>'auth'],function ($route){
             Route::post('searchIde','StorageController@searchIde');
             Route::post('searchIde','StorageController@searchIde');
             Route::post('boxBindModel','StorageController@boxBindModel');
             Route::post('boxBindModel','StorageController@boxBindModel');
         });
         });
+        Route::group(['prefix'=>'handInStorage'],function() {
+            Route::get('receive',function (){return view('store.handInStorage.receive');});//收货页面
+            Route::get('putaway',function (){return view('store.handInStorage.putaway');});//上架页面
+            Route::get('android.index',function (){return view('store.handInStorage.androidIndex');});
+            Route::post('selectAsn','HandInStorageController@selectAsn');
+            Route::post('selectAsnDetails','HandInStorageController@selectAsnDetails');
+            Route::post('getBasSkuWithLot','HandInStorageController@getBasSkuWithLot');
+            Route::post('fluxHandIn','HandInStorageController@fluxHandIn');
+            Route::get('receiveDetailPage/{asnno}/{customerid}','HandInStorageController@receiveDetailPage');
+        });
         Route::group(['prefix'=>'fast'],function() {
         Route::group(['prefix'=>'fast'],function() {
             Route::resource('storeItem','StoreItemController');
             Route::resource('storeItem','StoreItemController');
         });
         });