123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632 |
- <?php
- namespace App\Service;
- use App\Model\Construction;
- use App\Model\ConstructionProductInfo;
- use App\Model\InOutRecord;
- use App\Model\InvoiceOrder;
- use App\Model\InvoiceOrderInfo;
- use App\Model\KqLeave;
- use App\Model\KqOvertime;
- use App\Model\OrderOperation;
- use App\Model\PaymentReceipt;
- use App\Model\PaymentReceiptInfo;
- use App\Model\ProductInventory;
- use App\Model\ProductInventorySet;
- use App\Model\PurchaseOrder;
- use App\Model\PurchaseOrderInfo;
- use App\Model\PurchaseOrderSpecial;
- use App\Model\PurchaseOrderSpecialInfo;
- use App\Model\ReturnExchangeOrder;
- use App\Model\ReturnExchangeOrderProductInfo;
- use App\Model\SalesOrder;
- use App\Model\SalesOrderInfo;
- use App\Model\SalesOrderOtherFee;
- use App\Model\SalesOrderProductInfo;
- use App\Model\SeeRange;
- use App\Model\SportsBag;
- use App\Model\Storehouse;
- use App\Model\Supplier;
- use App\Service\OaService;
- use Illuminate\Support\Facades\DB;
- class CheckService extends Service
- {
- //特殊操作数
- const minus_one = -1;//跳出库存流水
- //审批操作对应的数值
- const one = 1;
- const two = 2;
- const three = 3;
- const four = 4;
- const five = 5;
- const six = 6;
- const seven = 7;
- const eight = 8;
- const nine = 9;
- const ten = 10;
- const eve = 11;
- const twl = 12;
- //中文对照
- public $map = [
- self::one => '请假申请',
- self::two => '加班申请',
- self::three => '',
- self::four => '',
- self::five => '',
- self::six => '',
- self::seven => '',
- self::eight => '',
- self::nine => '',
- self::ten => '',
- self::eve => '',
- self::twl => '',
- ];
- //入库操作
- public static $in_opt = [
- ];
- //出库操作
- public static $out_opt = [
- ];
- const TYPE_ONE = 1;//通过
- const TYPE_TWO = 2;//不通过
- const TYPE_THREE = 3;//通过后驳回
- //改为待审核状态
- public static $opt_1case = [
- self::one => 'leave',
- self::two => 'overtime',
- ];
- //改为最终状态
- public static $opt_case = [
- self::one => 'leave_final',
- self::two => 'overtime_final',
- ];
- //审核通过后 弃审
- public static $opt_case_reject = [
- ];
- //直接完成
- public static $finished = [
- ];
- //单据库存流水
- public static $record = [
- ];
- //审核通过后 驳回 产生流水
- public static $reject_record = [
- ];
- //旅程日志 同意
- public static $operation_order = [
- self::eight => OrderOperation::three,
- ];
- //旅程日志 驳回
- public static $operation_order_reject = [
- self::four => OrderOperation::four,
- ];
- //以下具体方法----------------------------------------------------------------------------------------
- //改为待审核---------------------------------
- public function leave($data){
- $model = KqLeave::where('order_number',$data['order_number'])
- ->where('del_time',0)
- ->first();
- if(empty($model)) return [false, '请假申请不存在或已被删除'];
- if($model->state != KqLeave::STATE_ZERO) return [false, '请确认请假申请状态,操作失败'];
- KqLeave::where('del_time',0)
- ->where('id',$data['id'])
- ->update(['state' => KqLeave::STATE_ONE]);
- return [true, $model->toArray()];
- }
- public function overtime($data){
- $model = KqOvertime::where('order_number',$data['order_number'])
- ->where('del_time',0)
- ->first();
- if(empty($model)) return [false, '加班申请不存在或已被删除'];
- if($model->state != KqOvertime::STATE_ZERO) return [false, '请确认加班申请状态,操作失败'];
- KqOvertime::where('del_time',0)
- ->where('id',$data['id'])
- ->update(['state' => KqOvertime::STATE_ONE]);
- return [true, $model->toArray()];
- }
- //改为待审核---------------------------------
- //改为最终结果---------------------------------
- public function leave_final($data){
- $model = KqLeave::where('order_number',$data['order_number'])
- ->where('del_time',0)
- ->first();
- if(empty($model)) return [false, '请假申请不存在或已被删除'];
- if($model->state != KqLeave::STATE_ONE) return [false, '请确认请假申请的状态,操作失败'];
- if($data['type'] == self::TYPE_ONE){
- //通过
- $model->state = KqLeave::STATE_TWO;
- $model->save();
- }else{
- //驳回
- $model->state = KqLeave::State_minus_one;
- $model->save();
- }
- return [true, $model->toArray()];
- }
- public function overtime_final($data){
- $model = KqOvertime::where('order_number',$data['order_number'])
- ->where('del_time',0)
- ->first();
- if(empty($model)) return [false, '加班申请不存在或已被删除'];
- if($model->state != KqLeave::STATE_ONE) return [false, '请确认加班申请的状态,操作失败'];
- if($data['type'] == self::TYPE_ONE){
- //通过
- $model->state = KqOvertime::STATE_TWO;
- $model->save();
- }else{
- //驳回
- $model->state = KqOvertime::State_minus_one;
- $model->save();
- }
- return [true, $model->toArray()];
- }
- //改为最终结果---------------------------------
- //通过后弃审
- //通过后弃审
- public function getOrderDetail($data,$user){
- if(empty($data['order_number'])) return [false,'必传参数不能为空'];
- $array = [];
- foreach (Construction::$prefix as $value){
- $array[$value] = "\App\Service\\ConstructionService";
- }
- foreach (ReturnExchangeOrder::$prefix as $value){
- $array[$value] = "\App\Service\\ReturnExchangeOrderService";
- }
- foreach (SalesOrder::$prefix as $value){
- $array[$value] = "\App\Service\\SalesOrderService";
- }
- $status = true;
- $msg = [];
- foreach ($array as $key => $value){
- if(strpos($data['order_number'],$key) !== false) {
- list($status, $msg) = (new $value)->detail($data);
- return [$status, $msg];
- }
- }
- if(strpos($data['order_number'],PurchaseOrder::prefix) !== false){
- $service = "\App\Service\\PurchaseOrderService";
- list($status, $msg) = (new $service)->detail($data,$user);
- return [$status, $msg];
- }
- return [$status, $msg];
- }
- public function checkAll($data,$user){
- if(empty($data['id']) || empty($data['order_number'])|| empty($data['opt_case'])) return [false,'必传参数不能为空或者参数值错误!'];
- list($status,$msg) = $this->limitingSendRequestBackgExpire($data['order_number'] . $data['opt_case']);
- if(! $status) return [false,$msg];
- //走审批流 单据状态改为待审批方法
- $function = self::$opt_1case[$data['opt_case']] ?? '';
- //单据不走审批流 直接完成
- $function2 = self::$finished[$data['opt_case']] ?? '';
- try{
- DB::beginTransaction();
- //不走审批流,更新完直接返回
- if($function2) {
- list($bool,$msg) = $this->$function2($data,$user);
- if($bool) {
- $order = $msg;
- list($bool,$err) = $this->createRecordAndInventoryMy($data,$user,$order);
- if($bool){
- DB::commit();
- return [true, ''];
- }else{
- DB::rollBack();
- return [false, $err];
- }
- }else{
- DB::rollBack();
- return [false, $msg];
- }
- }
- //需要审批流,从未审核变成待审核
- if($function){
- list($bool,$msg) = $this->$function($data);
- if(! $bool){
- DB::rollBack();
- return [false, $msg];
- }
- //创建审批流
- $args = [
- 'order_no' => $data['order_number'],
- 'menu_id' => $data['menu_id'] ?? 0,
- 'opt_case' => $data['opt_case'],
- 'order' => $msg,
- ];
- $oa = new OaService($user);
- list($bool,$msg) = $oa->createOaOrder($args);
- if(! $bool) {
- DB::rollBack();
- if($msg) return [false,$msg];
- }
- }
- DB::commit();
- return [true, ''];
- }catch (\Throwable $exception){
- DB::rollBack();
- return [false, $exception->getMessage() . $exception->getFile(). $exception->getLine()];
- }
- }
- //更新库存
- public function changeInventory($data,$order,$user){
- $number_symbol = "";
- if(in_array($data['opt_case'],self::$in_opt)){
- $number_symbol = ">";
- }elseif (in_array($data['opt_case'],self::$out_opt)){
- $number_symbol = "<";
- }
- //获取单据最新数据时间 正常审核的数据
- $latest = InOutRecord::where('del_time',0)
- ->where('order_number',$order['order_number'])
- ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
- return $query->where('number', $number_symbol,0);
- })
- ->select('crt_time')
- ->orderBy('crt_time', 'desc')
- ->first();
- $model = InOutRecord::where('del_time',0)
- ->where('order_number',$order['order_number'])
- ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
- return $query->where('number', $number_symbol,0);
- })
- ->select('number','crt_time','product_id','storehouse_id','top_depart_id');
- if(! empty($latest)) {
- $t = $latest->toArray();
- $model->where('crt_time',$t['crt_time']);
- }
- $record = $model->get()->toArray();
- if (empty($record)) return [false,'流水记录不存在'];
- $top_depart_id = Storehouse::where('id', $order['storehouse_id'])->value('top_depart_id');
- $result = $lock_number = [];
- foreach ($record as $value){
- $key = $value['product_id'] . $value['storehouse_id'];
- if(isset($result[$key])){
- $result[$key]['number'] += $value['number'];
- }else{
- $result[$key] = [
- 'product_id' => $value['product_id'],
- 'number' => $value['number'],
- 'crt_time' => $value['crt_time'],
- 'storehouse_id' => $value['storehouse_id'],
- 'top_depart_id' => $top_depart_id,
- ];
- }
- if($value['number'] < 0){
- if(isset($lock_number[$key])){
- $lock_number[$key] += $value['number'];
- }else{
- $lock_number[$key] = $value['number'];
- }
- }
- }
- //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
- $lock = $user['is_check_stock'];
- $result = array_values($result);
- foreach ($result as $key => $value){
- $keys = $value['product_id'] . $value['storehouse_id'];
- $m = ProductInventory::where('product_id',$value['product_id'])
- ->where('storehouse_id',$value['storehouse_id'])
- ->select('product_id','number','storehouse_id')
- ->first();
- if(empty($m)){
- ProductInventory::insert($result[$key]);
- }else{
- //锁定数量
- $lock_number_tmp = 0;
- if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
- ProductInventory::where('product_id',$m->product_id)
- ->where('storehouse_id',$m->storehouse_id)
- ->lockForUpdate()
- ->update([
- 'number' => DB::raw('number + ('. $value['number'] . ')'),
- 'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
- ]);
- }
- }
- return [true,''];
- }
- //业务单据审批通过后 驳回 更新库存
- public function changeInventoryReject($data,$order,$user){
- $number_symbol = "";
- if(in_array($data['opt_case'],self::$in_opt)){
- $number_symbol = "<";
- }elseif (in_array($data['opt_case'],self::$out_opt)){
- $number_symbol = ">";
- }
- //获取单据最新数据时间 正常审核的数据
- $latest = InOutRecord::where('del_time',0)
- ->where('order_number',$order['order_number'])
- ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
- return $query->where('number', $number_symbol,0);
- })
- ->select('crt_time')
- ->orderBy('crt_time', 'desc')
- ->first();
- $model = InOutRecord::where('del_time',0)
- ->where('order_number',$order['order_number'])
- ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
- return $query->where('number', $number_symbol,0);
- })
- ->select('number','crt_time','product_id','storehouse_id','top_depart_id');
- if(! empty($latest)) {
- $t = $latest->toArray();
- $model->where('crt_time',$t['crt_time']);
- }
- $record = $model->get()->toArray();
- if (empty($record)) return [false,'流水记录不存在'];
- $top_depart_id = Storehouse::where('id', $order['storehouse_id'])->value('top_depart_id');
- $result = $lock_number = [];
- foreach ($record as $value){
- $key = $value['product_id'] . $value['storehouse_id'];
- if(isset($result[$key])){
- $result[$key]['number'] += $value['number'];
- }else{
- $result[$key] = [
- 'product_id' => $value['product_id'],
- 'number' => $value['number'],
- 'crt_time' => $value['crt_time'],
- 'storehouse_id' => $value['storehouse_id'],
- 'top_depart_id' => $top_depart_id,
- ];
- }
- if($value['number'] > 0){
- if(isset($lock_number[$key])){
- $lock_number[$key] += $value['number'];
- }else{
- $lock_number[$key] = $value['number'];
- }
- }
- }
- //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
- $lock = $user['is_check_stock'];
- $result = array_values($result);
- foreach ($result as $key => $value){
- $keys = $value['product_id'] . $value['storehouse_id'];
- $m = ProductInventory::where('product_id',$value['product_id'])
- ->where('storehouse_id',$value['storehouse_id'])
- ->select('product_id','number','storehouse_id')
- ->first();
- if(empty($m)){
- ProductInventory::insert($result[$key]);
- }else{
- //锁定数量
- $lock_number_tmp = 0;
- if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
- ProductInventory::where('product_id',$m->product_id)
- ->where('storehouse_id',$m->storehouse_id)
- ->lockForUpdate()
- ->update([
- 'number' => DB::raw('number + ('. $value['number'] . ')'),
- 'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
- ]);
- }
- }
- return [true,''];
- }
- public function createRecordAndInventory($data = []){
- if(empty($data['type']) || empty($data['opt_case']) || empty($data['order_number'])) return [false, '传递参数缺少'];
- $user = $data['user_data'] ?? [];
- if($data['type'] == self::TYPE_THREE){
- //通过后弃审
- if(! isset(self::$opt_case_reject[$data['opt_case']])) return [false, '该操作不存在'];
- //具体方法
- $function = self::$opt_case_reject[$data['opt_case']];
- //流水
- $function2 = self::$reject_record[$data['opt_case']] ?? '';
- try{
- DB::beginTransaction();
- //更新单据的状态
- list($bool,$msg) = $this->$function($data);
- if(! $bool){
- DB::rollBack();
- return [false, $msg];
- }
- $order = $msg;
- if($function2) {
- //流水
- list($boolean,$msg) = $this->$function2($data,$order);
- if(! $boolean) {
- DB::rollBack();
- return [false, $msg];
- }
- if($msg != self::minus_one){
- //库存
- list($bool,$msg) = $this->changeInventoryReject($data,$order,$user);
- if(! $bool){
- DB::rollBack();
- return [false, $msg];
- }
- }
- }
- if(! empty(self::$operation_order_reject[$data['opt_case']])){
- $type = self::$operation_order_reject[$data['opt_case']];
- (new OrderOperationService())->add([
- 'order_number' => $order['order_number'],
- 'msg' => OrderOperation::$type[$type],
- 'type' => $type
- ],$user);
- }
- DB::commit();
- return [true, ''];
- }catch (\Throwable $exception){
- DB::rollBack();
- return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
- }
- }else{
- //具体方法
- $function = self::$opt_case[$data['opt_case']] ?? "";
- $record = self::$record[$data['opt_case']] ?? "";
- try{
- DB::beginTransaction();
- list($bool,$msg) = $this->$function($data);
- if(! $bool){
- DB::rollBack();
- return [false, $msg];
- }
- $order = $msg;
- if($data['type'] == self::TYPE_ONE){
- if($record) {
- //流水
- list($bool,$msg) = $this->$record($data, $order);
- if(! $bool) {
- DB::rollBack();
- return [false, $msg];
- }
- if($msg != self::minus_one){
- //库存
- list($bool,$msg) = $this->changeInventory($data, $order, $user);
- if(! $bool) {
- DB::rollBack();
- return [false, $msg];
- }
- }
- }
- }
- if(! empty(self::$operation_order[$data['opt_case']])){
- $user = $data['user_data'] ?? [];
- $type = self::$operation_order[$data['opt_case']];
- (new OrderOperationService())->add([
- 'order_number' => $order['order_number'],
- 'msg' => OrderOperation::$type[$type],
- 'type' => $type
- ],$user);
- }
- DB::commit();
- return [true, ''];
- }catch (\Throwable $exception){
- DB::rollBack();
- return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
- }
- }
- }
- //不需要走审批流 直接调用
- public function createRecordAndInventoryMy($data = [],$user = [],$order = []){
- if(! empty($data['type']) && $data['type'] == self::TYPE_THREE){
- }else{
- //具体方法
- $record = self::$record[$data['opt_case']] ?? "";
- try{
- DB::beginTransaction();
- if($record) {
- //流水
- list($bool,$msg) = $this->$record($data, $order);
- if(! $bool) {
- DB::rollBack();
- return [false, $msg];
- }
- if($msg != self::minus_one){
- //库存
- list($bool,$msg) = $this->changeInventory($data, $order, $user);
- if(! $bool) {
- DB::rollBack();
- return [false, $msg];
- }
- }
- }
- if(! empty(self::$operation_order[$data['opt_case']])){
- $type = self::$operation_order[$data['opt_case']];
- (new OrderOperationService())->add([
- 'order_number' => $order['order_number'],
- 'msg' => OrderOperation::$type[$type],
- 'type' => $type
- ],$user);
- }
- DB::commit();
- return [true, ''];
- }catch (\Throwable $exception){
- DB::rollBack();
- return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
- }
- }
- }
- }
|