CheckService.php 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398
  1. <?php
  2. namespace App\Service;
  3. use App\Model\Construction;
  4. use App\Model\ConstructionProductInfo;
  5. use App\Model\Depart;
  6. use App\Model\Employee;
  7. use App\Model\InOutRecord;
  8. use App\Model\InvoiceOrder;
  9. use App\Model\InvoiceOrderInfo;
  10. use App\Model\OrderOperation;
  11. use App\Model\ProductInventory;
  12. use App\Model\ProductInventorySet;
  13. use App\Model\PurchaseOrder;
  14. use App\Model\PurchaseOrderInfo;
  15. use App\Model\PurchaseOrderSpecial;
  16. use App\Model\PurchaseOrderSpecialInfo;
  17. use App\Model\ReturnExchangeOrder;
  18. use App\Model\ReturnExchangeOrderProductInfo;
  19. use App\Model\SalesOrder;
  20. use App\Model\SalesOrderInfo;
  21. use App\Model\SalesOrderOtherFee;
  22. use App\Model\SalesOrderProductInfo;
  23. use App\Model\SeeRange;
  24. use App\Model\Storehouse;
  25. use App\Model\Supplier;
  26. use App\Service\OaService;
  27. use Illuminate\Support\Facades\DB;
  28. class CheckService extends Service
  29. {
  30. //审批操作对应的数值
  31. const one = 1; //收货
  32. const two = 2; //发货
  33. const three = 3; //采购单入库
  34. const four = 4; //合同公司完结
  35. const five = 5; //施工单
  36. const six = 6; //退换货单
  37. const seven = 7; //采购单确认
  38. const eight = 8; //合同确认
  39. const nine = 9; //合同客户完结
  40. //中文对照
  41. public $map = [
  42. self::one => '收货单',
  43. self::two => '发货单',//确认后出库
  44. self::three => '采购单',//确认后入库
  45. self::four => '合同', // 安装件 合同完结
  46. self::five => '施工单',//确认后出库
  47. self::six => '退换货单',//确认后出库或出库入库
  48. self::seven => '采购单确认',
  49. self::eight => '合同确认',
  50. ];
  51. //入库操作
  52. public static $in_opt = [
  53. self::three,
  54. ];
  55. //出库操作
  56. public static $out_opt = [
  57. self::two,
  58. self::five,
  59. ];
  60. const TYPE_ONE = 1;//通过
  61. const TYPE_TWO = 2;//不通过
  62. const TYPE_THREE = 3;//通过后驳回
  63. //改为待审核状态 校验
  64. public static $opt_1case_check = [
  65. self::five => 'checkConstruction',//施工单
  66. ];
  67. //改为待审核状态
  68. public static $opt_1case = [
  69. self::two => 'waitInvoice',//发货单
  70. // self::three => 'waitPurchase',//采购单 入库
  71. self::five => 'waitConstruction',//施工单
  72. self::six => 'waitReturnExchange',//退换货单
  73. self::seven => 'waitPurchaseConfirm', //采购单确认
  74. self::eight => 'waitSales', // 合同安装件 合同确认
  75. ];
  76. public static $finished = [
  77. self::three => 'confirmPurchaseOrder',//采购单 入库
  78. self::four => 'settleSalesOrder', // 合同 安装件 合同公司完结
  79. self::nine => 'settleSalesOrderCustomer', // 合同 安装件 合同客户完结
  80. ];
  81. //单据操作
  82. public static $opt_case = [
  83. self::two => 'confirmInvoiceOrder',
  84. // self::three => 'confirmPurchaseOrder',
  85. self::five => 'confirmConstruction',
  86. self::six => 'confirmReturnExchangeOrder',
  87. self::seven => 'confirmPurchaseOrderState',
  88. self::eight => 'confirmSales', // 合同 安装件 合同确认
  89. ];
  90. //单据库存流水
  91. public static $record = [
  92. self::two => 'recordInvoiceOrder',
  93. self::three => 'recordPurchaseOrder',
  94. self::five => 'recordConstruction',
  95. self::six => 'recordReturnExchangeOrder'
  96. ];
  97. //自动生成
  98. public static $create = [
  99. self::seven => 'createPurchaseOrderSales', //分社合同生成
  100. self::four => 'createPurchaseOrder', // 派给分社的合同确认以后生成虚拟采购单
  101. ];
  102. //审核通过后 驳回
  103. public static $opt_case_reject = [
  104. self::four => 'reject_sales', // 合同
  105. // self::three => 'reject_purchase', //采购入库
  106. self::seven => 'reject_purchase_confirm', //采购确认驳回
  107. self::five => 'reject_construction',//施工单
  108. self::six => 'reject_return_exchange',//退换货
  109. ];
  110. //审核通过后 驳回 产生流水
  111. public static $reject_record = [
  112. self::five => 'reject_record_construction', //施工单驳回
  113. self::three => 'reject_record_purchase', //采购
  114. self::six => 'reject_record_return_exchange',//退换货
  115. ];
  116. //旅程日志 同意
  117. public static $operation_order = [
  118. self::eight => OrderOperation::three, //合同确认
  119. self::two => OrderOperation::eight, //发货单确认
  120. self::six => OrderOperation::nine, //退换货审核通过
  121. self::five => OrderOperation::eve, //施工单通过
  122. self::seven => OrderOperation::thi,//采购单确认
  123. self::three => OrderOperation::fourteen,//采购单入库审核通过
  124. ];
  125. //旅程日志 驳回
  126. public static $operation_order_reject = [
  127. self::four => OrderOperation::four, //合同弃审
  128. self::six => OrderOperation::ten, //退换货弃审
  129. self::five => OrderOperation::twl, //施工单弃审
  130. self::three => OrderOperation::fif,//采购单入库弃审
  131. self::seven => OrderOperation::twenty,//采购单确认弃审
  132. ];
  133. //校验
  134. public function checkConstruction($data, $user){
  135. $order = Construction::where('del_time',0)
  136. ->where('order_number',$data['order_number'])
  137. ->first();
  138. if(empty($order)) return [false,'施工单不存在或已被删除'];
  139. $order = $order->toArray();
  140. //总社id
  141. $head = $user['head'] ?? [];
  142. $head = $head['id'] ?? 0;
  143. //分社自己的施工单 直接返回
  144. if($order['top_depart_id'] != $head) return [true, ''];
  145. //不校验库存
  146. if($user['is_check_stock'] == ProductInventorySet::type_two) return [true,''];
  147. //施工单产品
  148. $sub = ConstructionProductInfo::where('construction_id',$order['id'])
  149. ->where('del_time',0)
  150. ->get()->toArray();
  151. if(empty($sub)) return [false,'施工单产品不存在或已被删除'];
  152. $product_submit = $product_id = [];
  153. foreach ($sub as $value){
  154. $product_id[] = $value['product_id'];
  155. $key = $value['product_id'] . ',' . $value['storehouse_id'];
  156. if(isset($product_save[$key])){
  157. $product_submit[$key] += $value['number'];
  158. }else{
  159. $product_submit[$key] = $value['number'];
  160. }
  161. }
  162. //比较库存
  163. list($status,$msg) = (new ProductInventoryService())->compareStock($user,$product_id, $product_submit, []);
  164. if(! $status) return [false, $msg];
  165. //锁定库存
  166. ProductInventoryService::changeLockNumber($user,$product_submit);
  167. return [true, ''];
  168. }
  169. //改为待审核---------------------------------
  170. public function waitInvoice($data){
  171. $model = InvoiceOrder::where('id',$data['id'])
  172. ->where('del_time',0)
  173. ->first();
  174. if(empty($model)) return [false, '发货单不存在或已被删除'];
  175. if($model->state != InvoiceOrder::STATE_ONE) return [false, '请确认发货单状态,操作失败'];
  176. InvoiceOrder::where('del_time',0)->where('id',$data['id'])
  177. ->update(['state' => InvoiceOrder::STATE_ONE]);
  178. return [true, $model->toArray()];
  179. }
  180. public function waitPurchaseConfirm($data){
  181. $model = PurchaseOrder::where('id',$data['id'])
  182. ->where('del_time',0)
  183. ->first();
  184. if(empty($model)) return [false,'采购单不存在或已被删除'];
  185. if($model->state != PurchaseOrder::STATE_ZERO) return [false,'请确认采购单状态,操作失败'];
  186. //待确认
  187. PurchaseOrder::where('id',$data['id'])->update(['state' => PurchaseOrder::STATE_ONE]);
  188. return [true, $model->toArray()];
  189. }
  190. public function waitPurchase($data){
  191. $model = PurchaseOrder::where('id',$data['id'])
  192. ->where('del_time',0)
  193. ->first();
  194. if(empty($model)) return [false, '采购订单不存在或已被删除'];
  195. if($model->state != PurchaseOrder::STATE_TWO) return [false, '请确认采购订单状态,操作失败'];
  196. //待入库
  197. PurchaseOrder::where('del_time',0)->where('id',$data['id'])
  198. ->update(['state' => PurchaseOrder::STATE_Three]);
  199. return [true, $model->toArray()];
  200. }
  201. public function waitConstruction($data){
  202. $model = Construction::where('id',$data['id'])
  203. ->where('del_time',0)
  204. ->first();
  205. if(empty($model)) return [false, '施工单不存在或已被删除'];
  206. if($model->state != Construction::STATE_ZERO) return [false, '请确认施工单状态,操作失败'];
  207. //待确认
  208. Construction::where('del_time',0)->where('id',$data['id'])
  209. ->update(['state' => Construction::STATE_ONE]);
  210. return [true, $model->toArray()];
  211. }
  212. public function waitReturnExchange($data){
  213. $model = ReturnExchangeOrder::where('id',$data['id'])
  214. ->where('del_time',0)
  215. ->first();
  216. if(empty($model)) return [false, '退换货单不存在或已被删除'];
  217. if($model->state != ReturnExchangeOrder::State_zero) return [false, '请确认退换货单状态,操作失败'];
  218. //待确认
  219. ReturnExchangeOrder::where('del_time',0)->where('id',$data['id'])
  220. ->update(['state' => ReturnExchangeOrder::State_one]);
  221. return [true, $model->toArray()];
  222. }
  223. public function waitSales($data){
  224. $model = SalesOrder::where('id', $data['id'])
  225. ->where('del_time',0)
  226. ->first();
  227. if(empty($model)) return [false, '合同不存在或已被删除'];
  228. //安装件
  229. if($model->state != SalesOrder::State_zero) return [false, '请确认合同状态,操作失败'];
  230. SalesOrder::where('del_time',0)->where('id',$data['id'])
  231. ->update(['state' => SalesOrder::State_one]);
  232. return [true, $model->toArray()];
  233. }
  234. //改为待审核---------------------------------
  235. //自动生成-----------------------------------
  236. //总社派给分社的合同 完成生成虚拟采购单
  237. public function createPurchaseOrder($order,$user){
  238. //快递件
  239. if($order['sales_order_type'] == SalesOrder::Order_type_two) return [true,''];
  240. //不是总公司的合同
  241. $head = $user['head'] ?? [];
  242. $head = $head['id'] ?? 0; //总社id
  243. if($head != $order['top_depart_id']) return [true, ''];
  244. $see = SeeRange::where('del_time',0)
  245. ->where('data_id',$order['id'])
  246. ->where('data_type',SeeRange::type_seven)
  247. ->where('type',SeeRange::data_three)
  248. ->first();
  249. if(empty($see)) return [false, '未找到指派分社信息'];
  250. $depart_id = $see->param_id;//指派的分社
  251. //总社指派给自己
  252. if($depart_id == $head) return [true, ''];
  253. //获取指派分社时候的金额
  254. $fee = SalesOrderOtherFee::where('del_time',0)
  255. ->where('sales_order_id',$order['id'])
  256. ->first();
  257. if(empty($fee)) return [false, '未找到指派分社时填写的金额'];
  258. $fee = $fee->toArray();
  259. $order_number = (new OrderNoService())->createOrderNumber(PurchaseOrderSpecial::prefix);
  260. $storehouse = Storehouse::where('depart_id',$head)->value('id');
  261. $product = SalesOrderProductInfo::where('del_time',0)
  262. ->where('sales_order_id',$order['id'])
  263. ->select('product_id','number','retail_price')
  264. ->get()->toArray();
  265. $product_map = $rate = [];
  266. $total = 0;
  267. foreach ($product as $value){
  268. $total += $value['number'] * $value['retail_price'];
  269. if(isset($product_map[$value['product_id']])){
  270. $product_map[$value['product_id']] += $value['retail_price'] * $value['number'];
  271. }else{
  272. $product_map[$value['product_id']] = $value['retail_price'] * $value['number'];
  273. }
  274. }
  275. foreach ($product_map as $key => $value){
  276. $rate[$key] = sprintf("%.2f", round($value / $total, 2));
  277. }
  278. $model = new PurchaseOrderSpecial();
  279. $model->order_number = $order_number;
  280. $model->sales_order_id = $order['id'];
  281. $model->depart_id = $head;
  282. $model->top_depart_id = $head;
  283. $model->crt_id = Employee::SPECIAL_ADMIN;
  284. $model->purchase_id = Employee::SPECIAL_ADMIN;
  285. $model->purchase_total = $fee['other_fee_1'] ?? 0;
  286. $model->storehouse_id = $storehouse ?? 0;
  287. $model->save();
  288. if(empty($model->id)) return [false,'采购单主信息生成失败'];
  289. $purchase_order_id = $model->id;
  290. $insert = [];$product_total = 0;
  291. foreach ($product as $value){
  292. $rate_tmp = $rate[$value['product_id']] ?? 0;
  293. $price = sprintf("%.2f", round($rate_tmp * $fee['other_fee_1'] / $value['number'], 2));
  294. $product_total += $price * $value['number'];
  295. $insert[] = [
  296. 'purchase_order_special_id' => $purchase_order_id,
  297. 'product_id' => $value['product_id'],
  298. 'order_number' => $order_number,
  299. 'number' => $value['number'],
  300. 'price' => $price,
  301. 'storehouse_id' => $storehouse,
  302. ];
  303. }
  304. PurchaseOrderSpecialInfo::insert($insert);
  305. PurchaseOrderSpecial::where('id',$purchase_order_id)->update(['total' => $product_total]);
  306. return [true, ''];
  307. }
  308. //分社订货合同
  309. public function createPurchaseOrderSales($order,$user){
  310. //没有供应商 不创建合同
  311. if(empty($order['supplier'])) return [true, ''];
  312. //总公司的采购单 不创建合同
  313. $head = $user['head'] ?? [];
  314. $head = $head['id'] ?? 0; //总社id
  315. if($head == $order['top_depart_id']) return [true, ''];
  316. //分社公司的采购单 不向总供应商采购 不创建合同
  317. $is_create = Supplier::where('id',$order['supplier'])->value('is_main');
  318. if(empty($is_create)) return [true, ''];
  319. $prefix = SalesOrder::$prefix[SalesOrder::Model_type_two];
  320. $order_number = OrderNoService::createSalesOrderNumber($prefix);
  321. $product = PurchaseOrderInfo::where('del_time',0)
  322. ->where('purchase_order_id',$order['id'])
  323. ->get()->toArray();
  324. if(empty($product)) return [false, '采购订单产品数据不能为空'];
  325. $time = time();
  326. $depart_id = Depart::where('del_time',0)->where('parent_id',0)->where('is_main',1)->value('id');
  327. $model = new SalesOrder();
  328. $model->model_type = SalesOrder::Model_type_two;
  329. $model->sales_order_type = SalesOrder::Order_type_one;
  330. $model->order_number = $order_number;
  331. $model->crt_id = $order['crt_id'];
  332. $model->depart_id = $depart_id;
  333. $model->top_depart_id = $depart_id;
  334. $model->other_fee = $order['other_fee'];
  335. $model->discount_fee = $order['discount_fee'];
  336. $model->contract_fee = $order['purchase_total'];
  337. $model->sign_time = $time;
  338. $model->save();
  339. $sales_order_id = $model->id;
  340. //产品字典
  341. $product_map = (new ProductService())->getProductDetail(array_column($product,'product_id'));
  342. // //获取产品采购使用金额
  343. // $map = (new ProductService())->getProductPrice(array_column($product,'product_id'));
  344. // //获取部门目前使用的分社价
  345. // $basic_type_id = Depart::where('id',$order['top_depart_id'])->value('basic_type_id');
  346. // //产品对应的分社价
  347. // $new_map = [];
  348. // foreach ($map as $product_id => $value){
  349. // foreach ($value as $v){
  350. // if($v['basic_type_id'] == $basic_type_id && ! empty($v['price'])) $new_map[$product_id] = $v['price'];
  351. // }
  352. // }
  353. $insert = [];
  354. $product_total = 0;
  355. foreach ($product as $value){
  356. $tmp = $product_map[$value['product_id']] ?? [];
  357. // $fs_price = $new_map[$value['product_id']] ?? 0;
  358. //有分社价就是分社价格 没有就是零售
  359. // $price = $fs_price ? $fs_price : $tmp['retail_price'];
  360. $product_total += $value['price'] * $value['number'];
  361. $insert[] = [
  362. 'sales_order_id' => $sales_order_id,
  363. 'product_id' => $value['product_id'],
  364. 'number' => $value['number'],
  365. 'basic_type_id' => $value['basic_type_id'],
  366. 'price' => $value['price'],
  367. 'cost' => $tmp['cost'] ?? 0,
  368. 'retail_price' => $tmp['retail_price'] ?? 0,
  369. 'final_amount' => $value['price'] * $value['number'],
  370. ];
  371. }
  372. $bool = SalesOrderProductInfo::insert($insert);
  373. if(! $bool) return [false,'合同生成失败!'];
  374. //反写数据
  375. $rate = ($product_total + $order['other_fee'] - $order['discount_fee']) / ($product_total + $order['other_fee'] ?? 1);
  376. SalesOrder::where('id',$sales_order_id)->update([
  377. 'product_total' => $product_total,
  378. 'rate' =>$rate
  379. ]);
  380. return [true,''];
  381. }
  382. //自动生成-----------------------------------
  383. public function confirmInvoiceOrder($data){
  384. $model = InvoiceOrder::where('order_number',$data['order_number'])
  385. ->where('del_time',0)
  386. ->first();
  387. if(empty($model)) return [false, '发货单不存在或已被删除'];
  388. if($model->state != InvoiceOrder::STATE_ONE) return [false, '请确认发货单状态,操作失败'];
  389. if($data['type'] == self::TYPE_ONE){
  390. //通过
  391. $model->state = InvoiceOrder::STATE_TWO;
  392. $model->save();
  393. $sale = SalesOrder::where('id',$model->sales_order_id)->first();
  394. if($sale['sales_order_type'] == SalesOrder::Order_type_one){
  395. //安装件更新发货状态
  396. SalesOrder::where('id',$model->sales_order_id)
  397. ->update(['invoice_state' => SalesOrder::invoice_one]);
  398. }else{
  399. //快递件更新 单据状态 发货状态
  400. SalesOrder::where('id',$model->sales_order_id)
  401. ->update([
  402. 'state' => SalesOrder::State2_one,
  403. 'invoice_state' => SalesOrder::invoice_one
  404. ]);
  405. }
  406. }else{
  407. //驳回
  408. $model->state = InvoiceOrder::STATE_ZERO;
  409. $model->save();
  410. }
  411. return [true, $model->toArray()];
  412. }
  413. public function recordInvoiceOrder($data, $order){
  414. $result = InvoiceOrderInfo::where('del_time',0)
  415. ->where('order_number',$order['order_number'])
  416. ->get()->toArray();
  417. if(empty($result)) return [false,'发货单产品信息不存在或已被删除'];
  418. $insert = [];
  419. $time = time();
  420. foreach ($result as $value){
  421. $key = $value['product_id'] . $value['storehouse_id'];
  422. if(isset($insert[$key])){
  423. $insert[$key]['number'] += -($value['number']);
  424. }else{
  425. $insert[$key] = [
  426. 'product_id' => $value['product_id'],
  427. 'number' => -($value['number']),
  428. 'order_type' => InvoiceOrder::prefix,
  429. 'order_number' => $order['order_number'],
  430. 'crt_time' => $time,
  431. 'storehouse_id' => $value['storehouse_id'],
  432. 'depart_id' => $order['depart_id'],
  433. 'top_depart_id' => $order['top_depart_id'],
  434. ];
  435. }
  436. }
  437. $insert = array_values($insert);
  438. $bool = InOutRecord::insert($insert);
  439. if(! $bool) return [false,'流水写入失败'];
  440. return [true,''];
  441. }
  442. public function confirmPurchaseOrderState($data){
  443. $model = PurchaseOrder::where('order_number',$data['order_number'])
  444. ->where('del_time',0)
  445. ->first();
  446. if(empty($model)) return [false,'采购单不存在或已被删除'];
  447. if($model->state != PurchaseOrder::STATE_ONE) return [false,'请确认采购单状态,操作失败'];
  448. if($data['type'] == self::TYPE_ONE){
  449. $model->state = PurchaseOrder::STATE_TWO;
  450. $model->save();
  451. }else{
  452. $model->state = PurchaseOrder::STATE_ZERO;
  453. $model->save();
  454. }
  455. return [true, $model->toArray()];
  456. }
  457. public function confirmPurchaseOrder($data){
  458. $model = PurchaseOrder::where('order_number',$data['order_number'])
  459. ->where('del_time',0)
  460. ->first();
  461. if(empty($model)) return [false, '采购订单不存在或已被删除'];
  462. if($model->state != PurchaseOrder::STATE_TWO) return [false, '请确认采购订单状态,操作失败'];
  463. $model->state = PurchaseOrder::STATE_Four;
  464. $model->save();
  465. return [true, $model->toArray()];
  466. }
  467. public function recordPurchaseOrder($data, $order){
  468. $result = PurchaseOrderInfo::where('del_time',0)
  469. ->where('order_number',$order['order_number'])
  470. ->get()->toArray();
  471. if(empty($result)) return [false,'采购单产品信息不存在或已被删除'];
  472. $insert = [];
  473. $time = time();
  474. foreach ($result as $value){
  475. $key = $value['product_id'] . $value['storehouse_id'];
  476. if(isset($insert[$key])){
  477. $insert[$key]['number'] += $value['number'];
  478. }else{
  479. $insert[$key] = [
  480. 'product_id' => $value['product_id'],
  481. 'number' => $value['number'],
  482. 'order_type' => PurchaseOrder::prefix,
  483. 'order_number' => $order['order_number'],
  484. 'crt_time' => $time,
  485. 'storehouse_id' => $value['storehouse_id'],
  486. 'depart_id' => $order['depart_id'],
  487. 'top_depart_id' => $order['top_depart_id'],
  488. ];
  489. }
  490. }
  491. $insert = array_values($insert);
  492. $bool = InOutRecord::insert($insert);
  493. if(! $bool) return [false,'流水写入失败'];
  494. return [true,''];
  495. }
  496. public function confirmConstruction($data){
  497. $model = Construction::where('order_number',$data['order_number'])
  498. ->where('del_time',0)
  499. ->first();
  500. if(empty($model)) return [false, '施工单不存在或已被删除'];
  501. if($model->state != Construction::STATE_ONE) return [false, '请确认施工单状态,操作失败'];
  502. if($data['type'] == self::TYPE_ONE){
  503. $model->state = Construction::STATE_TWO;
  504. $model->save();
  505. //已下施工
  506. SalesOrder::where('id',$model->sales_order_id)->update(['state' => SalesOrder::State_five]);
  507. }else{
  508. $model->state = Construction::STATE_ZERO;
  509. $model->save();
  510. }
  511. return [true, $model->toArray()];
  512. }
  513. public function recordConstruction($data, $order){
  514. $result = ConstructionProductInfo::where('del_time',0)
  515. ->where('construction_id',$order['id'])
  516. ->get()->toArray();
  517. if(empty($result)) return [false,'施工单产品信息不存在或已被删除'];
  518. $insert = [];
  519. $time = time();
  520. foreach ($result as $value){
  521. $key = $value['product_id'] . $value['storehouse_id'];
  522. if(isset($insert[$key])){
  523. $insert[$key]['number'] += -($value['number']);
  524. }else{
  525. $insert[$key] = [
  526. 'product_id' => $value['product_id'],
  527. 'number' => -($value['number']),
  528. 'order_type' => Construction::$prefix[$order['model_type']] ?? '',
  529. 'order_number' => $order['order_number'],
  530. 'crt_time' => $time,
  531. 'storehouse_id' => $value['storehouse_id'],
  532. 'depart_id' => $order['depart_id'],
  533. 'top_depart_id' => $order['top_depart_id'],
  534. ];
  535. }
  536. }
  537. $insert = array_values($insert);
  538. $bool = InOutRecord::insert($insert);
  539. if(! $bool) return [false,'流水写入失败'];
  540. return [true,''];
  541. }
  542. public function confirmReturnExchangeOrder($data){
  543. $model = ReturnExchangeOrder::where('order_number',$data['order_number'])
  544. ->where('del_time',0)
  545. ->first();
  546. if(empty($model)) return [false, '退换货单不存在或已被删除'];
  547. if($model->state != ReturnExchangeOrder::State_one) return [false, '请确认退换货单状态,操作失败'];
  548. if($data['type'] == self::TYPE_ONE){
  549. $model->state = ReturnExchangeOrder::State_two;
  550. $model->save();
  551. if($model->data_type == ReturnExchangeOrder::Order_type){
  552. SalesOrder::where('id', $model->data_id)->update([
  553. 'state' => SalesOrder::State_six
  554. ]);
  555. }
  556. }else{
  557. $model->state = ReturnExchangeOrder::State_zero;
  558. $model->save();
  559. }
  560. return [true, $model->toArray()];
  561. }
  562. public function recordReturnExchangeOrder($data, $order){
  563. $result = ReturnExchangeOrderProductInfo::where('del_time',0)
  564. ->where('return_exchange_id',$order['id'])
  565. ->get()->toArray();
  566. if(empty($result)) return [false,'退换货单产品信息不存在或已被删除'];
  567. $insert = $insert2 = [];
  568. $time = time();
  569. foreach ($result as $value){
  570. $key = $value['product_id'] . $value['storehouse_id'];
  571. $prefix = ReturnExchangeOrder::$prefix[$value['return_or_exchange']] ?? '';
  572. if($value['return_or_exchange'] == ReturnExchangeOrderProductInfo::type_one){
  573. //退货
  574. if(isset($insert[$key])){
  575. $insert[$key]['number'] += $value['number'];
  576. }else{
  577. $insert[$key] = [
  578. 'product_id' => $value['product_id'],
  579. 'number' => $value['number'],
  580. 'order_type' => $prefix,
  581. 'order_number' => $order['order_number'],
  582. 'crt_time' => $time,
  583. 'storehouse_id' => $value['storehouse_id'],
  584. 'depart_id' => $order['depart_id'],
  585. 'top_depart_id' => $order['top_depart_id'],
  586. ];
  587. }
  588. }else{
  589. //换货
  590. if(isset($insert2[$key])){
  591. $insert2[$key]['number'] += -($value['number']);
  592. }else{
  593. $insert2[$key] = [
  594. 'product_id' => $value['product_id'],
  595. 'number' => -($value['number']),
  596. 'order_type' => $prefix,
  597. 'order_number' => $order['order_number'],
  598. 'crt_time' => $time,
  599. 'storehouse_id' => $value['storehouse_id'],
  600. 'depart_id' => $order['depart_id'],
  601. 'top_depart_id' => $order['top_depart_id'],
  602. ];
  603. }
  604. }
  605. }
  606. $insert = array_values($insert);
  607. $bool = InOutRecord::insert($insert);
  608. if(! $bool) return [false,'流水写入失败'];
  609. if(! empty($insert2)) {
  610. $insert2 = array_values($insert2);
  611. $bool = InOutRecord::insert($insert2);
  612. if(! $bool) return [false,'流水写入失败'];
  613. }
  614. return [true,''];
  615. }
  616. public function settleSalesOrder($data){
  617. $model = SalesOrder::where('order_number', $data['order_number'])
  618. ->where('del_time',0)
  619. ->first();
  620. if(empty($model)) return [false, '合同不存在或已被删除'];
  621. //安装件
  622. if($model->state <= SalesOrder::State_four || $model->state >= SalesOrder::State_seven) return [false, '请确认合同状态,操作失败'];
  623. SalesOrder::where('del_time',0)->where('order_number',$data['order_number'])
  624. ->update(['state' => SalesOrder::State_seven]);
  625. return [true, $model->toArray()];
  626. }
  627. public function settleSalesOrderCustomer($data){
  628. $model = SalesOrder::where('order_number', $data['order_number'])
  629. ->where('del_time',0)
  630. ->first();
  631. if(empty($model)) return [false, '合同不存在或已被删除'];
  632. if(empty($data['img'])) return [false,'图片不能为空'];
  633. //安装件
  634. if($model->state != SalesOrder::State_seven) return [false, '请确认合同状态,操作失败'];
  635. SalesOrder::where('del_time',0)->where('order_number',$data['order_number'])
  636. ->update(['state' => SalesOrder::State_eight]);
  637. SalesOrderInfo::insert([
  638. 'sales_order_id' => $model->id,
  639. 'type' => SalesOrderInfo::type_six,
  640. 'file' => $data['img'],
  641. 'crt_time' => time(),
  642. ]);
  643. return [true, $model->toArray()];
  644. }
  645. public function confirmSales($data){
  646. $model = SalesOrder::where('order_number', $data['order_number'])
  647. ->where('del_time',0)
  648. ->first();
  649. if(empty($model)) return [false, '合同不存在或已被删除'];
  650. if($model->state != SalesOrder::State_one) return [false, '请确认合同状态,操作失败'];
  651. if($data['type'] == self::TYPE_ONE){
  652. $state = SalesOrder::State_three;
  653. if($model->model_type == SalesOrder::Model_type_four){
  654. //线上订单
  655. $state = SalesOrder::State_two;
  656. }
  657. $model->state = $state;
  658. $model->save();
  659. }else{
  660. $model->state = SalesOrder::State_zero;
  661. $model->save();
  662. }
  663. return [true, $model->toArray()];
  664. }
  665. public function reject_sales($data){
  666. $model = SalesOrder::where('order_number', $data['order_number'])
  667. ->where('del_time',0)
  668. ->first();
  669. if(empty($model)) return [false, '合同不存在或已被删除'];
  670. //安装件
  671. if($model->model_type == SalesOrder::Model_type_four){
  672. //线上订单
  673. if($model->state != SalesOrder::State_two) return [false, '请确认合同状态,操作失败'];
  674. }else{
  675. //除线上订单之外
  676. if($model->state != SalesOrder::State_three) return [false, '请确认合同状态,操作失败'];
  677. }
  678. //未确认
  679. $model->state = SalesOrder::State_zero;
  680. $model->save();
  681. return [true, $model->toArray()];
  682. }
  683. public function reject_purchase($data){
  684. $model = PurchaseOrder::where('order_number', $data['order_number'])
  685. ->where('del_time',0)
  686. ->first();
  687. if(empty($model)) return [false, '采购单不存在或已被删除'];
  688. //安装件
  689. if($model->state != PurchaseOrder::STATE_Four) return [false, '请确认采购单状态,操作失败'];
  690. $model->state = PurchaseOrder::STATE_TWO;
  691. $model->save();
  692. return [true, $model->toArray()];
  693. }
  694. public function reject_purchase_confirm($data){
  695. $model = PurchaseOrder::where('order_number', $data['order_number'])
  696. ->where('del_time',0)
  697. ->first();
  698. if(empty($model)) return [false, '采购单不存在或已被删除'];
  699. //安装件
  700. if($model->state != PurchaseOrder::STATE_TWO) return [false, '请确认采购单状态,操作失败'];
  701. $model->state = PurchaseOrder::STATE_ZERO;
  702. $model->save();
  703. return [true, $model->toArray()];
  704. }
  705. public function reject_construction($data){
  706. $model = Construction::where('order_number', $data['order_number'])
  707. ->where('del_time',0)
  708. ->first();
  709. if(empty($model)) return [false, '施工单不存在或已被删除'];
  710. //安装件
  711. if($model->state != Construction::STATE_TWO) return [false, '请确认施工单状态,操作失败'];
  712. $model->state = Construction::STATE_ZERO;
  713. $model->save();
  714. return [true, $model->toArray()];
  715. }
  716. public function reject_return_exchange($data){
  717. $model = ReturnExchangeOrder::where('order_number', $data['order_number'])
  718. ->where('del_time',0)
  719. ->first();
  720. if(empty($model)) return [false, '退换货单不存在或已被删除'];
  721. if($model->state != ReturnExchangeOrder::State_two) return [false, '请确认退换货单状态,操作失败'];
  722. $model->state = ReturnExchangeOrder::State_zero;
  723. $model->save();
  724. return [true, $model->toArray()];
  725. }
  726. public function reject_record_construction($data,$order){
  727. //获取单据最新数据时间 正常施工数据
  728. $latest = InOutRecord::where('del_time',0)
  729. ->where('order_number',$data['order_number'])
  730. ->where('number','<',0)
  731. ->select('crt_time')
  732. ->orderBy('crt_time', 'desc')
  733. ->first();
  734. $latest = $latest->toArray();
  735. $result = InOutRecord::where('del_time',0)
  736. ->where('crt_time',$latest['crt_time'])
  737. ->where('order_number',$data['order_number'])
  738. ->where('number','<',0)
  739. ->select('product_id','storehouse_id','number','depart_id','order_number','top_depart_id','order_type')
  740. ->get()->toArray();
  741. if(empty($result)) return [false,'施工出库流水数据未找到'];
  742. //生成对冲数据
  743. $time = time();
  744. foreach ($result as $key => $value){
  745. $result[$key]['number'] = abs($value['number']);
  746. $result[$key]['crt_time'] = $time;
  747. }
  748. $bool = InOutRecord::insert($result);
  749. if(! $bool) return [false,'流水写入失败'];
  750. //写入流水
  751. return [true, ''];
  752. }
  753. public function reject_record_purchase($data,$order){
  754. //获取单据最新数据时间 正常采购入库数据
  755. $latest = InOutRecord::where('del_time',0)
  756. ->where('order_number',$data['order_number'])
  757. ->where('number','>',0)
  758. ->select('crt_time')
  759. ->orderBy('crt_time', 'desc')
  760. ->first();
  761. $latest = $latest->toArray();
  762. $result = InOutRecord::where('del_time',0)
  763. ->where('crt_time',$latest['crt_time'])
  764. ->where('order_number',$data['order_number'])
  765. ->where('number','>',0)
  766. ->select('product_id','storehouse_id','number','depart_id','order_number','top_depart_id','order_type')
  767. ->get()->toArray();
  768. if(empty($result)) return [false,'采购入库流水数据未找到'];
  769. //生成对冲数据
  770. $time = time();
  771. foreach ($result as $key => $value){
  772. $result[$key]['number'] = - $value['number'];
  773. $result[$key]['crt_time'] = $time;
  774. }
  775. $bool = InOutRecord::insert($result);
  776. if(! $bool) return [false,'流水写入失败'];
  777. //写入流水
  778. return [true, ''];
  779. }
  780. public function reject_record_return_exchange($data,$order){
  781. $result = ReturnExchangeOrderProductInfo::where('del_time',0)
  782. ->where('return_exchange_id',$order['id'])
  783. ->get()->toArray();
  784. if(empty($result)) return [false,'退换货单产品信息不存在或已被删除'];
  785. $insert = $insert2 = [];
  786. $time = time();
  787. foreach ($result as $value){
  788. $key = $value['product_id'] . $value['storehouse_id'];
  789. $prefix = ReturnExchangeOrder::$prefix[$value['return_or_exchange']] ?? '';
  790. if($value['return_or_exchange'] == ReturnExchangeOrderProductInfo::type_one){
  791. //退货 扣出
  792. if(isset($insert[$key])){
  793. $insert[$key]['number'] += -($value['number']);
  794. }else{
  795. $insert[$key] = [
  796. 'product_id' => $value['product_id'],
  797. 'number' => -($value['number']),
  798. 'order_type' => $prefix,
  799. 'order_number' => $order['order_number'],
  800. 'crt_time' => $time,
  801. 'storehouse_id' => $value['storehouse_id'],
  802. 'depart_id' => $order['depart_id'],
  803. 'top_depart_id' => $order['top_depart_id'],
  804. ];
  805. }
  806. }else{
  807. //换货 加回
  808. if(isset($insert2[$key])){
  809. $insert2[$key]['number'] += $value['number'];
  810. }else{
  811. $insert2[$key] = [
  812. 'product_id' => $value['product_id'],
  813. 'number' => $value['number'],
  814. 'order_type' => $prefix,
  815. 'order_number' => $order['order_number'],
  816. 'crt_time' => $time,
  817. 'storehouse_id' => $value['storehouse_id'],
  818. 'depart_id' => $order['depart_id'],
  819. 'top_depart_id' => $order['top_depart_id'],
  820. ];
  821. }
  822. }
  823. }
  824. $insert = array_values($insert);
  825. $bool = InOutRecord::insert($insert);
  826. if(! $bool) return [false,'流水写入失败'];
  827. if(! empty($insert2)) {
  828. $insert2 = array_values($insert2);
  829. $bool = InOutRecord::insert($insert2);
  830. if(! $bool) return [false,'流水写入失败'];
  831. }
  832. return [true,''];
  833. }
  834. public function getOrderDetail($data,$user){
  835. if(empty($data['order_number'])) return [false,'必传参数不能为空'];
  836. $array = [];
  837. foreach (Construction::$prefix as $value){
  838. $array[$value] = "\App\Service\\ConstructionService";
  839. }
  840. foreach (ReturnExchangeOrder::$prefix as $value){
  841. $array[$value] = "\App\Service\\ReturnExchangeOrderService";
  842. }
  843. foreach (SalesOrder::$prefix as $value){
  844. $array[$value] = "\App\Service\\SalesOrderService";
  845. }
  846. $status = true;
  847. $msg = [];
  848. foreach ($array as $key => $value){
  849. if(strpos($data['order_number'],$key) !== false) {
  850. list($status, $msg) = (new $value)->detail($data);
  851. return [$status, $msg];
  852. }
  853. }
  854. if(strpos($data['order_number'],PurchaseOrder::prefix) !== false){
  855. $service = "\App\Service\\PurchaseOrderService";
  856. list($status, $msg) = (new $service)->detail($data,$user);
  857. return [$status, $msg];
  858. }
  859. return [$status, $msg];
  860. }
  861. public function checkAll($data,$user){
  862. if(empty($data['id']) || empty($data['order_number'])|| empty($data['opt_case'])) return [false,'必传参数不能为空或者参数值错误!'];
  863. list($status,$msg) = $this->limitingSendRequestBackgExpire($data['order_number'].$data['opt_case']);
  864. if(! $status) return [false,$msg];
  865. //走审批流 单据校验
  866. $function_check = self::$opt_1case_check[$data['opt_case']] ?? '';
  867. //走审批流 单据状态改为待审批方法
  868. $function = self::$opt_1case[$data['opt_case']] ?? '';
  869. //单据不走审批流
  870. $function2 = self::$finished[$data['opt_case']] ?? '';
  871. try{
  872. DB::beginTransaction();
  873. //不走审批流,更新完直接返回
  874. if($function2) {
  875. list($bool,$msg) = $this->$function2($data);
  876. if($bool) {
  877. $order = $msg;
  878. list($bool,$err) = $this->createRecordAndInventoryMy($data,$user,$order);
  879. if($bool){
  880. DB::commit();
  881. return [true, ''];
  882. }else{
  883. DB::rollBack();
  884. return [false, $err];
  885. }
  886. }else{
  887. DB::rollBack();
  888. return [false, $msg];
  889. }
  890. }
  891. //需要审批流,校验
  892. if($function_check){
  893. list($bool,$msg) = $this->$function_check($data, $user);
  894. if(! $bool){
  895. DB::rollBack();
  896. return [false, $msg];
  897. }
  898. }
  899. //需要审批流,从未审核变成待审核
  900. if($function){
  901. list($bool,$msg) = $this->$function($data);
  902. if(! $bool){
  903. DB::rollBack();
  904. return [false, $msg];
  905. }
  906. //创建审批流
  907. $args = [
  908. 'order_no' => $data['order_number'],
  909. 'menu_id' => $data['menu_id'] ?? 0,
  910. 'opt_case' => $data['opt_case'],
  911. 'order' => $msg,
  912. ];
  913. $oa = new OaService($user);
  914. list($bool,$msg) = $oa->createOaOrder($args);
  915. if(! $bool) {
  916. DB::rollBack();
  917. if($msg) return [false,$msg];
  918. }
  919. }
  920. DB::commit();
  921. return [true, ''];
  922. }catch (\Throwable $exception){
  923. DB::rollBack();
  924. return [false, $exception->getMessage() . $exception->getFile(). $exception->getLine()];
  925. }
  926. }
  927. //更新库存
  928. public function changeInventory($data,$order,$user){
  929. $number_symbol = "";
  930. if(in_array($data['opt_case'],self::$in_opt)){
  931. $number_symbol = ">";
  932. }elseif (in_array($data['opt_case'],self::$out_opt)){
  933. $number_symbol = "<";
  934. }
  935. //获取单据最新数据时间 正常审核的数据
  936. $latest = InOutRecord::where('del_time',0)
  937. ->where('order_number',$order['order_number'])
  938. ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
  939. return $query->where('number', $number_symbol,0);
  940. })
  941. ->select('crt_time')
  942. ->orderBy('crt_time', 'desc')
  943. ->first();
  944. $model = InOutRecord::where('del_time',0)
  945. ->where('order_number',$order['order_number'])
  946. ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
  947. return $query->where('number', $number_symbol,0);
  948. })
  949. ->select('number','crt_time','product_id','storehouse_id','top_depart_id');
  950. if(! empty($latest)) {
  951. $t = $latest->toArray();
  952. $model->where('crt_time',$t['crt_time']);
  953. }
  954. $record = $model->get()->toArray();
  955. if (empty($record)) return [false,'流水记录不存在'];
  956. $result = $lock_number = [];
  957. foreach ($record as $value){
  958. $key = $value['product_id'] . $value['storehouse_id'];
  959. if(isset($result[$key])){
  960. $result[$key]['number'] += $value['number'];
  961. }else{
  962. $result[$key] = [
  963. 'product_id' => $value['product_id'],
  964. 'number' => $value['number'],
  965. 'crt_time' => $value['crt_time'],
  966. 'storehouse_id' => $value['storehouse_id'],
  967. 'top_depart_id' => $value['top_depart_id'],
  968. ];
  969. }
  970. if($value['number'] < 0){
  971. if(isset($lock_number[$key])){
  972. $lock_number[$key] += $value['number'];
  973. }else{
  974. $lock_number[$key] = $value['number'];
  975. }
  976. }
  977. }
  978. //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
  979. $lock = $user['is_check_stock'];
  980. $result = array_values($result);
  981. foreach ($result as $key => $value){
  982. $keys = $value['product_id'] . $value['storehouse_id'];
  983. $m = ProductInventory::where('product_id',$value['product_id'])
  984. ->where('storehouse_id',$value['storehouse_id'])
  985. ->select('product_id','number','storehouse_id')
  986. ->first();
  987. if(empty($m)){
  988. ProductInventory::insert($result[$key]);
  989. }else{
  990. //锁定数量
  991. $lock_number_tmp = 0;
  992. if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
  993. ProductInventory::where('product_id',$m->product_id)
  994. ->where('storehouse_id',$m->storehouse_id)
  995. ->lockForUpdate()
  996. ->update([
  997. 'number' => DB::raw('number + ('. $value['number'] . ')'),
  998. 'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
  999. ]);
  1000. }
  1001. }
  1002. return [true,''];
  1003. }
  1004. //业务单据审批通过后 驳回 更新库存
  1005. public function changeInventoryReject($data,$order,$user){
  1006. $number_symbol = "";
  1007. if(in_array($data['opt_case'],self::$in_opt)){
  1008. $number_symbol = "<";
  1009. }elseif (in_array($data['opt_case'],self::$out_opt)){
  1010. $number_symbol = ">";
  1011. }
  1012. //获取单据最新数据时间 正常审核的数据
  1013. $latest = InOutRecord::where('del_time',0)
  1014. ->where('order_number',$order['order_number'])
  1015. ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
  1016. return $query->where('number', $number_symbol,0);
  1017. })
  1018. ->select('crt_time')
  1019. ->orderBy('crt_time', 'desc')
  1020. ->first();
  1021. $model = InOutRecord::where('del_time',0)
  1022. ->where('order_number',$order['order_number'])
  1023. ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
  1024. return $query->where('number', $number_symbol,0);
  1025. })
  1026. ->select('number','crt_time','product_id','storehouse_id','top_depart_id');
  1027. if(! empty($latest)) {
  1028. $t = $latest->toArray();
  1029. $model->where('crt_time',$t['crt_time']);
  1030. }
  1031. $record = $model->get()->toArray();
  1032. if (empty($record)) return [false,'流水记录不存在'];
  1033. $result = $lock_number = [];
  1034. foreach ($record as $value){
  1035. $key = $value['product_id'] . $value['storehouse_id'];
  1036. if(isset($result[$key])){
  1037. $result[$key]['number'] += $value['number'];
  1038. }else{
  1039. $result[$key] = [
  1040. 'product_id' => $value['product_id'],
  1041. 'number' => $value['number'],
  1042. 'crt_time' => $value['crt_time'],
  1043. 'storehouse_id' => $value['storehouse_id'],
  1044. 'top_depart_id' => $value['top_depart_id'],
  1045. ];
  1046. }
  1047. if($value['number'] > 0){
  1048. if(isset($lock_number[$key])){
  1049. $lock_number[$key] += $value['number'];
  1050. }else{
  1051. $lock_number[$key] = $value['number'];
  1052. }
  1053. }
  1054. }
  1055. //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
  1056. $lock = $user['is_check_stock'];
  1057. $result = array_values($result);
  1058. foreach ($result as $key => $value){
  1059. $keys = $value['product_id'] . $value['storehouse_id'];
  1060. $m = ProductInventory::where('product_id',$value['product_id'])
  1061. ->where('storehouse_id',$value['storehouse_id'])
  1062. ->select('product_id','number','storehouse_id')
  1063. ->first();
  1064. if(empty($m)){
  1065. ProductInventory::insert($result[$key]);
  1066. }else{
  1067. //锁定数量
  1068. $lock_number_tmp = 0;
  1069. if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
  1070. ProductInventory::where('product_id',$m->product_id)
  1071. ->where('storehouse_id',$m->storehouse_id)
  1072. ->lockForUpdate()
  1073. ->update([
  1074. 'number' => DB::raw('number + ('. $value['number'] . ')'),
  1075. 'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
  1076. ]);
  1077. }
  1078. }
  1079. return [true,''];
  1080. }
  1081. public function createRecordAndInventory($data = []){
  1082. if(empty($data['type']) || empty($data['opt_case']) || empty($data['order_number'])) return [false, '传递参数缺少'];
  1083. $user = $data['user_data'] ?? [];
  1084. if($data['type'] == self::TYPE_THREE){
  1085. //通过后弃审
  1086. if(! isset(self::$opt_case_reject[$data['opt_case']])) return [false, '该操作不存在'];
  1087. //具体方法
  1088. $function = self::$opt_case_reject[$data['opt_case']];
  1089. //流水
  1090. $function2 = self::$reject_record[$data['opt_case']] ?? '';
  1091. try{
  1092. DB::beginTransaction();
  1093. //更新单据的状态
  1094. list($bool,$msg) = $this->$function($data);
  1095. if(! $bool){
  1096. DB::rollBack();
  1097. return [false, $msg];
  1098. }
  1099. $order = $msg;
  1100. if($function2) {
  1101. //流水
  1102. list($boolean,$msg) = $this->$function2($data,$order);
  1103. if(! $boolean) {
  1104. DB::rollBack();
  1105. return [false, $msg];
  1106. }
  1107. //库存
  1108. list($bool,$msg) = $this->changeInventoryReject($data,$order,$user);
  1109. if(! $bool){
  1110. DB::rollBack();
  1111. return [false, $msg];
  1112. }
  1113. }
  1114. if(! empty(self::$operation_order_reject[$data['opt_case']])){
  1115. $type = self::$operation_order_reject[$data['opt_case']];
  1116. (new OrderOperationService())->add([
  1117. 'order_number' => $order['order_number'],
  1118. 'msg' => OrderOperation::$type[$type],
  1119. 'type' => $type
  1120. ],$user);
  1121. }
  1122. DB::commit();
  1123. return [true, ''];
  1124. }catch (\Throwable $exception){
  1125. DB::rollBack();
  1126. return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
  1127. }
  1128. }else{
  1129. //具体方法
  1130. $function = self::$opt_case[$data['opt_case']] ?? "";
  1131. $record = self::$record[$data['opt_case']] ?? "";
  1132. $create = self::$create[$data['opt_case']] ?? "";
  1133. try{
  1134. DB::beginTransaction();
  1135. list($bool,$msg) = $this->$function($data);
  1136. if(! $bool){
  1137. DB::rollBack();
  1138. return [false, $msg];
  1139. }
  1140. $order = $msg;
  1141. if($data['type'] == self::TYPE_ONE){
  1142. if($record) {
  1143. //流水
  1144. $bool = $this->$record($data, $order);
  1145. if(! $bool) {
  1146. DB::rollBack();
  1147. return [false, $msg];
  1148. }
  1149. //库存
  1150. $bool = $this->changeInventory($data, $order, $user);
  1151. if(! $bool) {
  1152. DB::rollBack();
  1153. return [false, $msg];
  1154. }
  1155. }
  1156. if($create) {
  1157. $bool = $this->$create($order,$user);
  1158. if(! $bool) {
  1159. DB::rollBack();
  1160. return [false, $msg];
  1161. }
  1162. }
  1163. }
  1164. if(! empty(self::$operation_order[$data['opt_case']])){
  1165. $user = $data['user_data'] ?? [];
  1166. $type = self::$operation_order[$data['opt_case']];
  1167. (new OrderOperationService())->add([
  1168. 'order_number' => $order['order_number'],
  1169. 'msg' => OrderOperation::$type[$type],
  1170. 'type' => $type
  1171. ],$user);
  1172. }
  1173. DB::commit();
  1174. return [true, ''];
  1175. }catch (\Throwable $exception){
  1176. DB::rollBack();
  1177. return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
  1178. }
  1179. }
  1180. }
  1181. //不需要走审批流 直接调用
  1182. public function createRecordAndInventoryMy($data = [],$user = [],$order = []){
  1183. if(! empty($data['type']) && $data['type'] == self::TYPE_THREE){
  1184. }else{
  1185. //具体方法
  1186. $record = self::$record[$data['opt_case']] ?? "";
  1187. try{
  1188. DB::beginTransaction();
  1189. if($record) {
  1190. //流水
  1191. list($bool,$msg) = $this->$record($data, $order);
  1192. if(! $bool) {
  1193. DB::rollBack();
  1194. return [false, $msg];
  1195. }
  1196. //库存
  1197. list($bool,$msg) = $this->changeInventory($data, $order, $user);
  1198. if(! $bool) {
  1199. DB::rollBack();
  1200. return [false, $msg];
  1201. }
  1202. }
  1203. if(! empty(self::$operation_order[$data['opt_case']])){
  1204. $type = self::$operation_order[$data['opt_case']];
  1205. (new OrderOperationService())->add([
  1206. 'order_number' => $order['order_number'],
  1207. 'msg' => OrderOperation::$type[$type],
  1208. 'type' => $type
  1209. ],$user);
  1210. }
  1211. DB::commit();
  1212. return [true, ''];
  1213. }catch (\Throwable $exception){
  1214. DB::rollBack();
  1215. return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
  1216. }
  1217. }
  1218. }
  1219. }