CheckService.php 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403
  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. $tmp = $product_total + $order['other_fee'];
  376. $tmp = $tmp > 0 ? $tmp : 1;
  377. $rate = ($product_total + $order['other_fee'] - $order['discount_fee']) / $tmp;
  378. SalesOrder::where('id',$sales_order_id)->update([
  379. 'product_total' => $product_total,
  380. 'rate' =>$rate
  381. ]);
  382. return [true,''];
  383. }
  384. //自动生成-----------------------------------
  385. public function confirmInvoiceOrder($data){
  386. $model = InvoiceOrder::where('order_number',$data['order_number'])
  387. ->where('del_time',0)
  388. ->first();
  389. if(empty($model)) return [false, '发货单不存在或已被删除'];
  390. if($model->state != InvoiceOrder::STATE_ONE) return [false, '请确认发货单状态,操作失败'];
  391. if($data['type'] == self::TYPE_ONE){
  392. //通过
  393. $model->state = InvoiceOrder::STATE_TWO;
  394. $model->save();
  395. $sale = SalesOrder::where('id',$model->sales_order_id)->first();
  396. if($sale['sales_order_type'] == SalesOrder::Order_type_one){
  397. //安装件更新发货状态
  398. SalesOrder::where('id',$model->sales_order_id)
  399. ->update(['invoice_state' => SalesOrder::invoice_one]);
  400. }else{
  401. //快递件更新 单据状态 发货状态
  402. SalesOrder::where('id',$model->sales_order_id)
  403. ->update([
  404. 'state' => SalesOrder::State2_one,
  405. 'invoice_state' => SalesOrder::invoice_one
  406. ]);
  407. }
  408. }else{
  409. //驳回
  410. $model->state = InvoiceOrder::STATE_ZERO;
  411. $model->save();
  412. }
  413. return [true, $model->toArray()];
  414. }
  415. public function recordInvoiceOrder($data, $order){
  416. $result = InvoiceOrderInfo::where('del_time',0)
  417. ->where('order_number',$order['order_number'])
  418. ->get()->toArray();
  419. if(empty($result)) return [false,'发货单产品信息不存在或已被删除'];
  420. $insert = [];
  421. $time = time();
  422. foreach ($result as $value){
  423. $key = $value['product_id'] . $value['storehouse_id'];
  424. if(isset($insert[$key])){
  425. $insert[$key]['number'] += -($value['number']);
  426. }else{
  427. $insert[$key] = [
  428. 'product_id' => $value['product_id'],
  429. 'number' => -($value['number']),
  430. 'order_type' => InvoiceOrder::prefix,
  431. 'order_number' => $order['order_number'],
  432. 'crt_time' => $time,
  433. 'storehouse_id' => $value['storehouse_id'],
  434. 'depart_id' => $order['depart_id'],
  435. 'top_depart_id' => $order['top_depart_id'],
  436. ];
  437. }
  438. }
  439. $insert = array_values($insert);
  440. $bool = InOutRecord::insert($insert);
  441. if(! $bool) return [false,'流水写入失败'];
  442. return [true,''];
  443. }
  444. public function confirmPurchaseOrderState($data){
  445. $model = PurchaseOrder::where('order_number',$data['order_number'])
  446. ->where('del_time',0)
  447. ->first();
  448. if(empty($model)) return [false,'采购单不存在或已被删除'];
  449. if($model->state != PurchaseOrder::STATE_ONE) return [false,'请确认采购单状态,操作失败'];
  450. if($data['type'] == self::TYPE_ONE){
  451. $model->state = PurchaseOrder::STATE_TWO;
  452. $model->save();
  453. }else{
  454. $model->state = PurchaseOrder::STATE_ZERO;
  455. $model->save();
  456. }
  457. return [true, $model->toArray()];
  458. }
  459. public function confirmPurchaseOrder($data){
  460. $model = PurchaseOrder::where('order_number',$data['order_number'])
  461. ->where('del_time',0)
  462. ->first();
  463. if(empty($model)) return [false, '采购订单不存在或已被删除'];
  464. if($model->state != PurchaseOrder::STATE_TWO) return [false, '请确认采购订单状态,操作失败'];
  465. $model->state = PurchaseOrder::STATE_Four;
  466. $model->save();
  467. return [true, $model->toArray()];
  468. }
  469. public function recordPurchaseOrder($data, $order){
  470. $result = PurchaseOrderInfo::where('del_time',0)
  471. ->where('order_number',$order['order_number'])
  472. ->get()->toArray();
  473. if(empty($result)) return [false,'采购单产品信息不存在或已被删除'];
  474. $insert = [];
  475. $time = time();
  476. foreach ($result as $value){
  477. $key = $value['product_id'] . $value['storehouse_id'];
  478. if(isset($insert[$key])){
  479. $insert[$key]['number'] += $value['number'];
  480. }else{
  481. $insert[$key] = [
  482. 'product_id' => $value['product_id'],
  483. 'number' => $value['number'],
  484. 'order_type' => PurchaseOrder::prefix,
  485. 'order_number' => $order['order_number'],
  486. 'crt_time' => $time,
  487. 'storehouse_id' => $value['storehouse_id'],
  488. 'depart_id' => $order['depart_id'],
  489. 'top_depart_id' => $order['top_depart_id'],
  490. ];
  491. }
  492. }
  493. $insert = array_values($insert);
  494. $bool = InOutRecord::insert($insert);
  495. if(! $bool) return [false,'流水写入失败'];
  496. return [true,''];
  497. }
  498. public function confirmConstruction($data){
  499. $model = Construction::where('order_number',$data['order_number'])
  500. ->where('del_time',0)
  501. ->first();
  502. if(empty($model)) return [false, '施工单不存在或已被删除'];
  503. if($model->state != Construction::STATE_ONE) return [false, '请确认施工单状态,操作失败'];
  504. if($data['type'] == self::TYPE_ONE){
  505. $model->state = Construction::STATE_TWO;
  506. $model->save();
  507. //已下施工
  508. SalesOrder::where('id',$model->sales_order_id)->update(['state' => SalesOrder::State_five]);
  509. }else{
  510. $model->state = Construction::STATE_ZERO;
  511. $model->save();
  512. }
  513. return [true, $model->toArray()];
  514. }
  515. public function recordConstruction($data, $order){
  516. $result = ConstructionProductInfo::where('del_time',0)
  517. ->where('construction_id',$order['id'])
  518. ->get()->toArray();
  519. if(empty($result)) return [false,'施工单产品信息不存在或已被删除'];
  520. $insert = [];
  521. $time = time();
  522. foreach ($result as $value){
  523. $key = $value['product_id'] . $value['storehouse_id'];
  524. if(isset($insert[$key])){
  525. $insert[$key]['number'] += -($value['number']);
  526. }else{
  527. $insert[$key] = [
  528. 'product_id' => $value['product_id'],
  529. 'number' => -($value['number']),
  530. 'order_type' => Construction::$prefix[$order['model_type']] ?? '',
  531. 'order_number' => $order['order_number'],
  532. 'crt_time' => $time,
  533. 'storehouse_id' => $value['storehouse_id'],
  534. 'depart_id' => $order['depart_id'],
  535. 'top_depart_id' => $order['top_depart_id'],
  536. ];
  537. }
  538. }
  539. $insert = array_values($insert);
  540. $bool = InOutRecord::insert($insert);
  541. if(! $bool) return [false,'流水写入失败'];
  542. return [true,''];
  543. }
  544. public function confirmReturnExchangeOrder($data){
  545. $model = ReturnExchangeOrder::where('order_number',$data['order_number'])
  546. ->where('del_time',0)
  547. ->first();
  548. if(empty($model)) return [false, '退换货单不存在或已被删除'];
  549. if($model->state != ReturnExchangeOrder::State_one) return [false, '请确认退换货单状态,操作失败'];
  550. if($data['type'] == self::TYPE_ONE){
  551. $model->state = ReturnExchangeOrder::State_two;
  552. $model->save();
  553. if($model->data_type == ReturnExchangeOrder::Order_type){
  554. SalesOrder::where('id', $model->data_id)->update([
  555. 'state' => SalesOrder::State_six
  556. ]);
  557. }
  558. }else{
  559. $model->state = ReturnExchangeOrder::State_zero;
  560. $model->save();
  561. }
  562. return [true, $model->toArray()];
  563. }
  564. public function recordReturnExchangeOrder($data, $order){
  565. $result = ReturnExchangeOrderProductInfo::where('del_time',0)
  566. ->where('return_exchange_id',$order['id'])
  567. ->get()->toArray();
  568. if(empty($result)) return [false,'退换货单产品信息不存在或已被删除'];
  569. $insert = $insert2 = [];
  570. $time = time();
  571. foreach ($result as $value){
  572. $key = $value['product_id'] . $value['storehouse_id'];
  573. $prefix = ReturnExchangeOrder::$prefix[$value['return_or_exchange']] ?? '';
  574. if($value['return_or_exchange'] == ReturnExchangeOrderProductInfo::type_one){
  575. //退货
  576. if(isset($insert[$key])){
  577. $insert[$key]['number'] += $value['number'];
  578. }else{
  579. $insert[$key] = [
  580. 'product_id' => $value['product_id'],
  581. 'number' => $value['number'],
  582. 'order_type' => $prefix,
  583. 'order_number' => $order['order_number'],
  584. 'crt_time' => $time,
  585. 'storehouse_id' => $value['storehouse_id'],
  586. 'depart_id' => $order['depart_id'],
  587. 'top_depart_id' => $order['top_depart_id'],
  588. ];
  589. }
  590. }else{
  591. //换货
  592. if(isset($insert2[$key])){
  593. $insert2[$key]['number'] += -($value['number']);
  594. }else{
  595. $insert2[$key] = [
  596. 'product_id' => $value['product_id'],
  597. 'number' => -($value['number']),
  598. 'order_type' => $prefix,
  599. 'order_number' => $order['order_number'],
  600. 'crt_time' => $time,
  601. 'storehouse_id' => $value['storehouse_id'],
  602. 'depart_id' => $order['depart_id'],
  603. 'top_depart_id' => $order['top_depart_id'],
  604. ];
  605. }
  606. }
  607. }
  608. $insert = array_values($insert);
  609. $bool = InOutRecord::insert($insert);
  610. if(! $bool) return [false,'流水写入失败'];
  611. if(! empty($insert2)) {
  612. $insert2 = array_values($insert2);
  613. $bool = InOutRecord::insert($insert2);
  614. if(! $bool) return [false,'流水写入失败'];
  615. }
  616. return [true,''];
  617. }
  618. public function settleSalesOrder($data){
  619. $model = SalesOrder::where('order_number', $data['order_number'])
  620. ->where('del_time',0)
  621. ->first();
  622. if(empty($model)) return [false, '合同不存在或已被删除'];
  623. //安装件
  624. if($model->state <= SalesOrder::State_four || $model->state >= SalesOrder::State_seven) return [false, '请确认合同状态,操作失败'];
  625. SalesOrder::where('del_time',0)->where('order_number',$data['order_number'])
  626. ->update(['state' => SalesOrder::State_seven]);
  627. return [true, $model->toArray()];
  628. }
  629. public function settleSalesOrderCustomer($data){
  630. $model = SalesOrder::where('order_number', $data['order_number'])
  631. ->where('del_time',0)
  632. ->first();
  633. if(empty($model)) return [false, '合同不存在或已被删除'];
  634. if(empty($data['img'])) return [false,'图片不能为空'];
  635. //安装件
  636. if($model->state != SalesOrder::State_seven) return [false, '请确认合同状态,操作失败'];
  637. SalesOrder::where('del_time',0)->where('order_number',$data['order_number'])
  638. ->update(['state' => SalesOrder::State_eight]);
  639. SalesOrderInfo::insert([
  640. 'sales_order_id' => $model->id,
  641. 'type' => SalesOrderInfo::type_six,
  642. 'file' => $data['img'],
  643. 'crt_time' => time(),
  644. ]);
  645. return [true, $model->toArray()];
  646. }
  647. public function confirmSales($data){
  648. $model = SalesOrder::where('order_number', $data['order_number'])
  649. ->where('del_time',0)
  650. ->first();
  651. if(empty($model)) return [false, '合同不存在或已被删除'];
  652. if($model->state != SalesOrder::State_one) return [false, '请确认合同状态,操作失败'];
  653. if($data['type'] == self::TYPE_ONE){
  654. $state = SalesOrder::State_three;
  655. if($model->model_type == SalesOrder::Model_type_four){
  656. //线上订单
  657. $state = SalesOrder::State_two;
  658. }
  659. $model->state = $state;
  660. $model->save();
  661. }else{
  662. $model->state = SalesOrder::State_zero;
  663. $model->save();
  664. }
  665. return [true, $model->toArray()];
  666. }
  667. public function reject_sales($data){
  668. $model = SalesOrder::where('order_number', $data['order_number'])
  669. ->where('del_time',0)
  670. ->first();
  671. if(empty($model)) return [false, '合同不存在或已被删除'];
  672. //安装件
  673. if($model->model_type == SalesOrder::Model_type_four){
  674. //线上订单
  675. if($model->state != SalesOrder::State_two) return [false, '请确认合同状态,操作失败'];
  676. }else{
  677. //除线上订单之外
  678. if($model->state != SalesOrder::State_three) return [false, '请确认合同状态,操作失败'];
  679. }
  680. //未确认
  681. $model->state = SalesOrder::State_zero;
  682. $model->save();
  683. return [true, $model->toArray()];
  684. }
  685. public function reject_purchase($data){
  686. $model = PurchaseOrder::where('order_number', $data['order_number'])
  687. ->where('del_time',0)
  688. ->first();
  689. if(empty($model)) return [false, '采购单不存在或已被删除'];
  690. //安装件
  691. if($model->state != PurchaseOrder::STATE_Four) return [false, '请确认采购单状态,操作失败'];
  692. $model->state = PurchaseOrder::STATE_TWO;
  693. $model->save();
  694. return [true, $model->toArray()];
  695. }
  696. public function reject_purchase_confirm($data){
  697. $model = PurchaseOrder::where('order_number', $data['order_number'])
  698. ->where('del_time',0)
  699. ->first();
  700. if(empty($model)) return [false, '采购单不存在或已被删除'];
  701. //安装件
  702. if($model->state != PurchaseOrder::STATE_TWO) return [false, '请确认采购单状态,操作失败'];
  703. $model->state = PurchaseOrder::STATE_ZERO;
  704. $model->save();
  705. return [true, $model->toArray()];
  706. }
  707. public function reject_construction($data){
  708. $model = Construction::where('order_number', $data['order_number'])
  709. ->where('del_time',0)
  710. ->first();
  711. if(empty($model)) return [false, '施工单不存在或已被删除'];
  712. //安装件
  713. if($model->state != Construction::STATE_TWO) return [false, '请确认施工单状态,操作失败'];
  714. $model->state = Construction::STATE_ZERO;
  715. $model->save();
  716. return [true, $model->toArray()];
  717. }
  718. public function reject_return_exchange($data){
  719. $model = ReturnExchangeOrder::where('order_number', $data['order_number'])
  720. ->where('del_time',0)
  721. ->first();
  722. if(empty($model)) return [false, '退换货单不存在或已被删除'];
  723. if($model->state != ReturnExchangeOrder::State_two) return [false, '请确认退换货单状态,操作失败'];
  724. $model->state = ReturnExchangeOrder::State_zero;
  725. $model->save();
  726. return [true, $model->toArray()];
  727. }
  728. public function reject_record_construction($data,$order){
  729. //获取单据最新数据时间 正常施工数据
  730. $latest = InOutRecord::where('del_time',0)
  731. ->where('order_number',$data['order_number'])
  732. ->where('number','<',0)
  733. ->select('crt_time')
  734. ->orderBy('crt_time', 'desc')
  735. ->first();
  736. $latest = $latest->toArray();
  737. $result = InOutRecord::where('del_time',0)
  738. ->where('crt_time',$latest['crt_time'])
  739. ->where('order_number',$data['order_number'])
  740. ->where('number','<',0)
  741. ->select('product_id','storehouse_id','number','depart_id','order_number','top_depart_id','order_type')
  742. ->get()->toArray();
  743. if(empty($result)) return [false,'施工出库流水数据未找到'];
  744. //生成对冲数据
  745. $time = time();
  746. foreach ($result as $key => $value){
  747. $result[$key]['number'] = abs($value['number']);
  748. $result[$key]['crt_time'] = $time;
  749. }
  750. $bool = InOutRecord::insert($result);
  751. if(! $bool) return [false,'流水写入失败'];
  752. //写入流水
  753. return [true, ''];
  754. }
  755. public function reject_record_purchase($data,$order){
  756. //获取单据最新数据时间 正常采购入库数据
  757. $latest = InOutRecord::where('del_time',0)
  758. ->where('order_number',$data['order_number'])
  759. ->where('number','>',0)
  760. ->select('crt_time')
  761. ->orderBy('crt_time', 'desc')
  762. ->first();
  763. $latest = $latest->toArray();
  764. $result = InOutRecord::where('del_time',0)
  765. ->where('crt_time',$latest['crt_time'])
  766. ->where('order_number',$data['order_number'])
  767. ->where('number','>',0)
  768. ->select('product_id','storehouse_id','number','depart_id','order_number','top_depart_id','order_type')
  769. ->get()->toArray();
  770. if(empty($result)) return [false,'采购入库流水数据未找到'];
  771. //生成对冲数据
  772. $time = time();
  773. foreach ($result as $key => $value){
  774. $result[$key]['number'] = - $value['number'];
  775. $result[$key]['crt_time'] = $time;
  776. }
  777. $bool = InOutRecord::insert($result);
  778. if(! $bool) return [false,'流水写入失败'];
  779. //写入流水
  780. return [true, ''];
  781. }
  782. public function reject_record_return_exchange($data,$order){
  783. $result = ReturnExchangeOrderProductInfo::where('del_time',0)
  784. ->where('return_exchange_id',$order['id'])
  785. ->get()->toArray();
  786. if(empty($result)) return [false,'退换货单产品信息不存在或已被删除'];
  787. $insert = $insert2 = [];
  788. $time = time();
  789. foreach ($result as $value){
  790. $key = $value['product_id'] . $value['storehouse_id'];
  791. $prefix = ReturnExchangeOrder::$prefix[$value['return_or_exchange']] ?? '';
  792. if($value['return_or_exchange'] == ReturnExchangeOrderProductInfo::type_one){
  793. //退货 扣出
  794. if(isset($insert[$key])){
  795. $insert[$key]['number'] += -($value['number']);
  796. }else{
  797. $insert[$key] = [
  798. 'product_id' => $value['product_id'],
  799. 'number' => -($value['number']),
  800. 'order_type' => $prefix,
  801. 'order_number' => $order['order_number'],
  802. 'crt_time' => $time,
  803. 'storehouse_id' => $value['storehouse_id'],
  804. 'depart_id' => $order['depart_id'],
  805. 'top_depart_id' => $order['top_depart_id'],
  806. ];
  807. }
  808. }else{
  809. //换货 加回
  810. if(isset($insert2[$key])){
  811. $insert2[$key]['number'] += $value['number'];
  812. }else{
  813. $insert2[$key] = [
  814. 'product_id' => $value['product_id'],
  815. 'number' => $value['number'],
  816. 'order_type' => $prefix,
  817. 'order_number' => $order['order_number'],
  818. 'crt_time' => $time,
  819. 'storehouse_id' => $value['storehouse_id'],
  820. 'depart_id' => $order['depart_id'],
  821. 'top_depart_id' => $order['top_depart_id'],
  822. ];
  823. }
  824. }
  825. }
  826. $insert = array_values($insert);
  827. $bool = InOutRecord::insert($insert);
  828. if(! $bool) return [false,'流水写入失败'];
  829. if(! empty($insert2)) {
  830. $insert2 = array_values($insert2);
  831. $bool = InOutRecord::insert($insert2);
  832. if(! $bool) return [false,'流水写入失败'];
  833. }
  834. return [true,''];
  835. }
  836. public function getOrderDetail($data,$user){
  837. if(empty($data['order_number'])) return [false,'必传参数不能为空'];
  838. $array = [];
  839. foreach (Construction::$prefix as $value){
  840. $array[$value] = "\App\Service\\ConstructionService";
  841. }
  842. foreach (ReturnExchangeOrder::$prefix as $value){
  843. $array[$value] = "\App\Service\\ReturnExchangeOrderService";
  844. }
  845. foreach (SalesOrder::$prefix as $value){
  846. $array[$value] = "\App\Service\\SalesOrderService";
  847. }
  848. $status = true;
  849. $msg = [];
  850. foreach ($array as $key => $value){
  851. if(strpos($data['order_number'],$key) !== false) {
  852. list($status, $msg) = (new $value)->detail($data);
  853. return [$status, $msg];
  854. }
  855. }
  856. if(strpos($data['order_number'],PurchaseOrder::prefix) !== false){
  857. $service = "\App\Service\\PurchaseOrderService";
  858. list($status, $msg) = (new $service)->detail($data,$user);
  859. return [$status, $msg];
  860. }
  861. return [$status, $msg];
  862. }
  863. public function checkAll($data,$user){
  864. if(empty($data['id']) || empty($data['order_number'])|| empty($data['opt_case'])) return [false,'必传参数不能为空或者参数值错误!'];
  865. list($status,$msg) = $this->limitingSendRequestBackgExpire($data['order_number'].$data['opt_case']);
  866. if(! $status) return [false,$msg];
  867. //走审批流 单据校验
  868. $function_check = self::$opt_1case_check[$data['opt_case']] ?? '';
  869. //走审批流 单据状态改为待审批方法
  870. $function = self::$opt_1case[$data['opt_case']] ?? '';
  871. //单据不走审批流
  872. $function2 = self::$finished[$data['opt_case']] ?? '';
  873. try{
  874. DB::beginTransaction();
  875. //不走审批流,更新完直接返回
  876. if($function2) {
  877. list($bool,$msg) = $this->$function2($data);
  878. if($bool) {
  879. $order = $msg;
  880. list($bool,$err) = $this->createRecordAndInventoryMy($data,$user,$order);
  881. if($bool){
  882. DB::commit();
  883. return [true, ''];
  884. }else{
  885. DB::rollBack();
  886. return [false, $err];
  887. }
  888. }else{
  889. DB::rollBack();
  890. return [false, $msg];
  891. }
  892. }
  893. //需要审批流,校验
  894. if($function_check){
  895. list($bool,$msg) = $this->$function_check($data, $user);
  896. if(! $bool){
  897. DB::rollBack();
  898. return [false, $msg];
  899. }
  900. }
  901. //需要审批流,从未审核变成待审核
  902. if($function){
  903. list($bool,$msg) = $this->$function($data);
  904. if(! $bool){
  905. DB::rollBack();
  906. return [false, $msg];
  907. }
  908. //创建审批流
  909. $args = [
  910. 'order_no' => $data['order_number'],
  911. 'menu_id' => $data['menu_id'] ?? 0,
  912. 'opt_case' => $data['opt_case'],
  913. 'order' => $msg,
  914. ];
  915. $oa = new OaService($user);
  916. list($bool,$msg) = $oa->createOaOrder($args);
  917. if(! $bool) {
  918. DB::rollBack();
  919. if($msg) return [false,$msg];
  920. }
  921. }
  922. DB::commit();
  923. return [true, ''];
  924. }catch (\Throwable $exception){
  925. DB::rollBack();
  926. return [false, $exception->getMessage() . $exception->getFile(). $exception->getLine()];
  927. }
  928. }
  929. //更新库存
  930. public function changeInventory($data,$order,$user){
  931. $number_symbol = "";
  932. if(in_array($data['opt_case'],self::$in_opt)){
  933. $number_symbol = ">";
  934. }elseif (in_array($data['opt_case'],self::$out_opt)){
  935. $number_symbol = "<";
  936. }
  937. //获取单据最新数据时间 正常审核的数据
  938. $latest = InOutRecord::where('del_time',0)
  939. ->where('order_number',$order['order_number'])
  940. ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
  941. return $query->where('number', $number_symbol,0);
  942. })
  943. ->select('crt_time')
  944. ->orderBy('crt_time', 'desc')
  945. ->first();
  946. $model = InOutRecord::where('del_time',0)
  947. ->where('order_number',$order['order_number'])
  948. ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
  949. return $query->where('number', $number_symbol,0);
  950. })
  951. ->select('number','crt_time','product_id','storehouse_id','top_depart_id');
  952. if(! empty($latest)) {
  953. $t = $latest->toArray();
  954. $model->where('crt_time',$t['crt_time']);
  955. }
  956. $record = $model->get()->toArray();
  957. if (empty($record)) return [false,'流水记录不存在'];
  958. $top_depart_id = Storehouse::where('id', $order['storehouse_id'])->value('top_depart_id');
  959. $result = $lock_number = [];
  960. foreach ($record as $value){
  961. $key = $value['product_id'] . $value['storehouse_id'];
  962. if(isset($result[$key])){
  963. $result[$key]['number'] += $value['number'];
  964. }else{
  965. $result[$key] = [
  966. 'product_id' => $value['product_id'],
  967. 'number' => $value['number'],
  968. 'crt_time' => $value['crt_time'],
  969. 'storehouse_id' => $value['storehouse_id'],
  970. 'top_depart_id' => $top_depart_id,
  971. ];
  972. }
  973. if($value['number'] < 0){
  974. if(isset($lock_number[$key])){
  975. $lock_number[$key] += $value['number'];
  976. }else{
  977. $lock_number[$key] = $value['number'];
  978. }
  979. }
  980. }
  981. //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
  982. $lock = $user['is_check_stock'];
  983. $result = array_values($result);
  984. foreach ($result as $key => $value){
  985. $keys = $value['product_id'] . $value['storehouse_id'];
  986. $m = ProductInventory::where('product_id',$value['product_id'])
  987. ->where('storehouse_id',$value['storehouse_id'])
  988. ->select('product_id','number','storehouse_id')
  989. ->first();
  990. if(empty($m)){
  991. ProductInventory::insert($result[$key]);
  992. }else{
  993. //锁定数量
  994. $lock_number_tmp = 0;
  995. if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
  996. ProductInventory::where('product_id',$m->product_id)
  997. ->where('storehouse_id',$m->storehouse_id)
  998. ->lockForUpdate()
  999. ->update([
  1000. 'number' => DB::raw('number + ('. $value['number'] . ')'),
  1001. 'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
  1002. ]);
  1003. }
  1004. }
  1005. return [true,''];
  1006. }
  1007. //业务单据审批通过后 驳回 更新库存
  1008. public function changeInventoryReject($data,$order,$user){
  1009. $number_symbol = "";
  1010. if(in_array($data['opt_case'],self::$in_opt)){
  1011. $number_symbol = "<";
  1012. }elseif (in_array($data['opt_case'],self::$out_opt)){
  1013. $number_symbol = ">";
  1014. }
  1015. //获取单据最新数据时间 正常审核的数据
  1016. $latest = InOutRecord::where('del_time',0)
  1017. ->where('order_number',$order['order_number'])
  1018. ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
  1019. return $query->where('number', $number_symbol,0);
  1020. })
  1021. ->select('crt_time')
  1022. ->orderBy('crt_time', 'desc')
  1023. ->first();
  1024. $model = InOutRecord::where('del_time',0)
  1025. ->where('order_number',$order['order_number'])
  1026. ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
  1027. return $query->where('number', $number_symbol,0);
  1028. })
  1029. ->select('number','crt_time','product_id','storehouse_id','top_depart_id');
  1030. if(! empty($latest)) {
  1031. $t = $latest->toArray();
  1032. $model->where('crt_time',$t['crt_time']);
  1033. }
  1034. $record = $model->get()->toArray();
  1035. if (empty($record)) return [false,'流水记录不存在'];
  1036. $top_depart_id = Storehouse::where('id', $order['storehouse_id'])->value('top_depart_id');
  1037. $result = $lock_number = [];
  1038. foreach ($record as $value){
  1039. $key = $value['product_id'] . $value['storehouse_id'];
  1040. if(isset($result[$key])){
  1041. $result[$key]['number'] += $value['number'];
  1042. }else{
  1043. $result[$key] = [
  1044. 'product_id' => $value['product_id'],
  1045. 'number' => $value['number'],
  1046. 'crt_time' => $value['crt_time'],
  1047. 'storehouse_id' => $value['storehouse_id'],
  1048. 'top_depart_id' => $top_depart_id,
  1049. ];
  1050. }
  1051. if($value['number'] > 0){
  1052. if(isset($lock_number[$key])){
  1053. $lock_number[$key] += $value['number'];
  1054. }else{
  1055. $lock_number[$key] = $value['number'];
  1056. }
  1057. }
  1058. }
  1059. //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
  1060. $lock = $user['is_check_stock'];
  1061. $result = array_values($result);
  1062. foreach ($result as $key => $value){
  1063. $keys = $value['product_id'] . $value['storehouse_id'];
  1064. $m = ProductInventory::where('product_id',$value['product_id'])
  1065. ->where('storehouse_id',$value['storehouse_id'])
  1066. ->select('product_id','number','storehouse_id')
  1067. ->first();
  1068. if(empty($m)){
  1069. ProductInventory::insert($result[$key]);
  1070. }else{
  1071. //锁定数量
  1072. $lock_number_tmp = 0;
  1073. if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
  1074. ProductInventory::where('product_id',$m->product_id)
  1075. ->where('storehouse_id',$m->storehouse_id)
  1076. ->lockForUpdate()
  1077. ->update([
  1078. 'number' => DB::raw('number + ('. $value['number'] . ')'),
  1079. 'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
  1080. ]);
  1081. }
  1082. }
  1083. return [true,''];
  1084. }
  1085. public function createRecordAndInventory($data = []){
  1086. if(empty($data['type']) || empty($data['opt_case']) || empty($data['order_number'])) return [false, '传递参数缺少'];
  1087. $user = $data['user_data'] ?? [];
  1088. if($data['type'] == self::TYPE_THREE){
  1089. //通过后弃审
  1090. if(! isset(self::$opt_case_reject[$data['opt_case']])) return [false, '该操作不存在'];
  1091. //具体方法
  1092. $function = self::$opt_case_reject[$data['opt_case']];
  1093. //流水
  1094. $function2 = self::$reject_record[$data['opt_case']] ?? '';
  1095. try{
  1096. DB::beginTransaction();
  1097. //更新单据的状态
  1098. list($bool,$msg) = $this->$function($data);
  1099. if(! $bool){
  1100. DB::rollBack();
  1101. return [false, $msg];
  1102. }
  1103. $order = $msg;
  1104. if($function2) {
  1105. //流水
  1106. list($boolean,$msg) = $this->$function2($data,$order);
  1107. if(! $boolean) {
  1108. DB::rollBack();
  1109. return [false, $msg];
  1110. }
  1111. //库存
  1112. list($bool,$msg) = $this->changeInventoryReject($data,$order,$user);
  1113. if(! $bool){
  1114. DB::rollBack();
  1115. return [false, $msg];
  1116. }
  1117. }
  1118. if(! empty(self::$operation_order_reject[$data['opt_case']])){
  1119. $type = self::$operation_order_reject[$data['opt_case']];
  1120. (new OrderOperationService())->add([
  1121. 'order_number' => $order['order_number'],
  1122. 'msg' => OrderOperation::$type[$type],
  1123. 'type' => $type
  1124. ],$user);
  1125. }
  1126. DB::commit();
  1127. return [true, ''];
  1128. }catch (\Throwable $exception){
  1129. DB::rollBack();
  1130. return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
  1131. }
  1132. }else{
  1133. //具体方法
  1134. $function = self::$opt_case[$data['opt_case']] ?? "";
  1135. $record = self::$record[$data['opt_case']] ?? "";
  1136. $create = self::$create[$data['opt_case']] ?? "";
  1137. try{
  1138. DB::beginTransaction();
  1139. list($bool,$msg) = $this->$function($data);
  1140. if(! $bool){
  1141. DB::rollBack();
  1142. return [false, $msg];
  1143. }
  1144. $order = $msg;
  1145. if($data['type'] == self::TYPE_ONE){
  1146. if($record) {
  1147. //流水
  1148. $bool = $this->$record($data, $order);
  1149. if(! $bool) {
  1150. DB::rollBack();
  1151. return [false, $msg];
  1152. }
  1153. //库存
  1154. $bool = $this->changeInventory($data, $order, $user);
  1155. if(! $bool) {
  1156. DB::rollBack();
  1157. return [false, $msg];
  1158. }
  1159. }
  1160. if($create) {
  1161. $bool = $this->$create($order,$user);
  1162. if(! $bool) {
  1163. DB::rollBack();
  1164. return [false, $msg];
  1165. }
  1166. }
  1167. }
  1168. if(! empty(self::$operation_order[$data['opt_case']])){
  1169. $user = $data['user_data'] ?? [];
  1170. $type = self::$operation_order[$data['opt_case']];
  1171. (new OrderOperationService())->add([
  1172. 'order_number' => $order['order_number'],
  1173. 'msg' => OrderOperation::$type[$type],
  1174. 'type' => $type
  1175. ],$user);
  1176. }
  1177. DB::commit();
  1178. return [true, ''];
  1179. }catch (\Throwable $exception){
  1180. DB::rollBack();
  1181. return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
  1182. }
  1183. }
  1184. }
  1185. //不需要走审批流 直接调用
  1186. public function createRecordAndInventoryMy($data = [],$user = [],$order = []){
  1187. if(! empty($data['type']) && $data['type'] == self::TYPE_THREE){
  1188. }else{
  1189. //具体方法
  1190. $record = self::$record[$data['opt_case']] ?? "";
  1191. try{
  1192. DB::beginTransaction();
  1193. if($record) {
  1194. //流水
  1195. list($bool,$msg) = $this->$record($data, $order);
  1196. if(! $bool) {
  1197. DB::rollBack();
  1198. return [false, $msg];
  1199. }
  1200. //库存
  1201. list($bool,$msg) = $this->changeInventory($data, $order, $user);
  1202. if(! $bool) {
  1203. DB::rollBack();
  1204. return [false, $msg];
  1205. }
  1206. }
  1207. if(! empty(self::$operation_order[$data['opt_case']])){
  1208. $type = self::$operation_order[$data['opt_case']];
  1209. (new OrderOperationService())->add([
  1210. 'order_number' => $order['order_number'],
  1211. 'msg' => OrderOperation::$type[$type],
  1212. 'type' => $type
  1213. ],$user);
  1214. }
  1215. DB::commit();
  1216. return [true, ''];
  1217. }catch (\Throwable $exception){
  1218. DB::rollBack();
  1219. return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
  1220. }
  1221. }
  1222. }
  1223. }