CheckService.php 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400
  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. $top_depart_id = Storehouse::where('id', $order['storehouse_id'])->value('top_depart_id');
  957. $result = $lock_number = [];
  958. foreach ($record as $value){
  959. $key = $value['product_id'] . $value['storehouse_id'];
  960. if(isset($result[$key])){
  961. $result[$key]['number'] += $value['number'];
  962. }else{
  963. $result[$key] = [
  964. 'product_id' => $value['product_id'],
  965. 'number' => $value['number'],
  966. 'crt_time' => $value['crt_time'],
  967. 'storehouse_id' => $value['storehouse_id'],
  968. 'top_depart_id' => $top_depart_id,
  969. ];
  970. }
  971. if($value['number'] < 0){
  972. if(isset($lock_number[$key])){
  973. $lock_number[$key] += $value['number'];
  974. }else{
  975. $lock_number[$key] = $value['number'];
  976. }
  977. }
  978. }
  979. //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
  980. $lock = $user['is_check_stock'];
  981. $result = array_values($result);
  982. foreach ($result as $key => $value){
  983. $keys = $value['product_id'] . $value['storehouse_id'];
  984. $m = ProductInventory::where('product_id',$value['product_id'])
  985. ->where('storehouse_id',$value['storehouse_id'])
  986. ->select('product_id','number','storehouse_id')
  987. ->first();
  988. if(empty($m)){
  989. ProductInventory::insert($result[$key]);
  990. }else{
  991. //锁定数量
  992. $lock_number_tmp = 0;
  993. if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
  994. ProductInventory::where('product_id',$m->product_id)
  995. ->where('storehouse_id',$m->storehouse_id)
  996. ->lockForUpdate()
  997. ->update([
  998. 'number' => DB::raw('number + ('. $value['number'] . ')'),
  999. 'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
  1000. ]);
  1001. }
  1002. }
  1003. return [true,''];
  1004. }
  1005. //业务单据审批通过后 驳回 更新库存
  1006. public function changeInventoryReject($data,$order,$user){
  1007. $number_symbol = "";
  1008. if(in_array($data['opt_case'],self::$in_opt)){
  1009. $number_symbol = "<";
  1010. }elseif (in_array($data['opt_case'],self::$out_opt)){
  1011. $number_symbol = ">";
  1012. }
  1013. //获取单据最新数据时间 正常审核的数据
  1014. $latest = InOutRecord::where('del_time',0)
  1015. ->where('order_number',$order['order_number'])
  1016. ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
  1017. return $query->where('number', $number_symbol,0);
  1018. })
  1019. ->select('crt_time')
  1020. ->orderBy('crt_time', 'desc')
  1021. ->first();
  1022. $model = InOutRecord::where('del_time',0)
  1023. ->where('order_number',$order['order_number'])
  1024. ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
  1025. return $query->where('number', $number_symbol,0);
  1026. })
  1027. ->select('number','crt_time','product_id','storehouse_id','top_depart_id');
  1028. if(! empty($latest)) {
  1029. $t = $latest->toArray();
  1030. $model->where('crt_time',$t['crt_time']);
  1031. }
  1032. $record = $model->get()->toArray();
  1033. if (empty($record)) return [false,'流水记录不存在'];
  1034. $top_depart_id = Storehouse::where('id', $order['storehouse_id'])->value('top_depart_id');
  1035. $result = $lock_number = [];
  1036. foreach ($record as $value){
  1037. $key = $value['product_id'] . $value['storehouse_id'];
  1038. if(isset($result[$key])){
  1039. $result[$key]['number'] += $value['number'];
  1040. }else{
  1041. $result[$key] = [
  1042. 'product_id' => $value['product_id'],
  1043. 'number' => $value['number'],
  1044. 'crt_time' => $value['crt_time'],
  1045. 'storehouse_id' => $value['storehouse_id'],
  1046. 'top_depart_id' => $top_depart_id,
  1047. ];
  1048. }
  1049. if($value['number'] > 0){
  1050. if(isset($lock_number[$key])){
  1051. $lock_number[$key] += $value['number'];
  1052. }else{
  1053. $lock_number[$key] = $value['number'];
  1054. }
  1055. }
  1056. }
  1057. //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
  1058. $lock = $user['is_check_stock'];
  1059. $result = array_values($result);
  1060. foreach ($result as $key => $value){
  1061. $keys = $value['product_id'] . $value['storehouse_id'];
  1062. $m = ProductInventory::where('product_id',$value['product_id'])
  1063. ->where('storehouse_id',$value['storehouse_id'])
  1064. ->select('product_id','number','storehouse_id')
  1065. ->first();
  1066. if(empty($m)){
  1067. ProductInventory::insert($result[$key]);
  1068. }else{
  1069. //锁定数量
  1070. $lock_number_tmp = 0;
  1071. if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
  1072. ProductInventory::where('product_id',$m->product_id)
  1073. ->where('storehouse_id',$m->storehouse_id)
  1074. ->lockForUpdate()
  1075. ->update([
  1076. 'number' => DB::raw('number + ('. $value['number'] . ')'),
  1077. 'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
  1078. ]);
  1079. }
  1080. }
  1081. return [true,''];
  1082. }
  1083. public function createRecordAndInventory($data = []){
  1084. if(empty($data['type']) || empty($data['opt_case']) || empty($data['order_number'])) return [false, '传递参数缺少'];
  1085. $user = $data['user_data'] ?? [];
  1086. if($data['type'] == self::TYPE_THREE){
  1087. //通过后弃审
  1088. if(! isset(self::$opt_case_reject[$data['opt_case']])) return [false, '该操作不存在'];
  1089. //具体方法
  1090. $function = self::$opt_case_reject[$data['opt_case']];
  1091. //流水
  1092. $function2 = self::$reject_record[$data['opt_case']] ?? '';
  1093. try{
  1094. DB::beginTransaction();
  1095. //更新单据的状态
  1096. list($bool,$msg) = $this->$function($data);
  1097. if(! $bool){
  1098. DB::rollBack();
  1099. return [false, $msg];
  1100. }
  1101. $order = $msg;
  1102. if($function2) {
  1103. //流水
  1104. list($boolean,$msg) = $this->$function2($data,$order);
  1105. if(! $boolean) {
  1106. DB::rollBack();
  1107. return [false, $msg];
  1108. }
  1109. //库存
  1110. list($bool,$msg) = $this->changeInventoryReject($data,$order,$user);
  1111. if(! $bool){
  1112. DB::rollBack();
  1113. return [false, $msg];
  1114. }
  1115. }
  1116. if(! empty(self::$operation_order_reject[$data['opt_case']])){
  1117. $type = self::$operation_order_reject[$data['opt_case']];
  1118. (new OrderOperationService())->add([
  1119. 'order_number' => $order['order_number'],
  1120. 'msg' => OrderOperation::$type[$type],
  1121. 'type' => $type
  1122. ],$user);
  1123. }
  1124. DB::commit();
  1125. return [true, ''];
  1126. }catch (\Throwable $exception){
  1127. DB::rollBack();
  1128. return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
  1129. }
  1130. }else{
  1131. //具体方法
  1132. $function = self::$opt_case[$data['opt_case']] ?? "";
  1133. $record = self::$record[$data['opt_case']] ?? "";
  1134. $create = self::$create[$data['opt_case']] ?? "";
  1135. try{
  1136. DB::beginTransaction();
  1137. list($bool,$msg) = $this->$function($data);
  1138. if(! $bool){
  1139. DB::rollBack();
  1140. return [false, $msg];
  1141. }
  1142. $order = $msg;
  1143. if($data['type'] == self::TYPE_ONE){
  1144. if($record) {
  1145. //流水
  1146. $bool = $this->$record($data, $order);
  1147. if(! $bool) {
  1148. DB::rollBack();
  1149. return [false, $msg];
  1150. }
  1151. //库存
  1152. $bool = $this->changeInventory($data, $order, $user);
  1153. if(! $bool) {
  1154. DB::rollBack();
  1155. return [false, $msg];
  1156. }
  1157. }
  1158. if($create) {
  1159. $bool = $this->$create($order,$user);
  1160. if(! $bool) {
  1161. DB::rollBack();
  1162. return [false, $msg];
  1163. }
  1164. }
  1165. }
  1166. if(! empty(self::$operation_order[$data['opt_case']])){
  1167. $user = $data['user_data'] ?? [];
  1168. $type = self::$operation_order[$data['opt_case']];
  1169. (new OrderOperationService())->add([
  1170. 'order_number' => $order['order_number'],
  1171. 'msg' => OrderOperation::$type[$type],
  1172. 'type' => $type
  1173. ],$user);
  1174. }
  1175. DB::commit();
  1176. return [true, ''];
  1177. }catch (\Throwable $exception){
  1178. DB::rollBack();
  1179. return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
  1180. }
  1181. }
  1182. }
  1183. //不需要走审批流 直接调用
  1184. public function createRecordAndInventoryMy($data = [],$user = [],$order = []){
  1185. if(! empty($data['type']) && $data['type'] == self::TYPE_THREE){
  1186. }else{
  1187. //具体方法
  1188. $record = self::$record[$data['opt_case']] ?? "";
  1189. try{
  1190. DB::beginTransaction();
  1191. if($record) {
  1192. //流水
  1193. list($bool,$msg) = $this->$record($data, $order);
  1194. if(! $bool) {
  1195. DB::rollBack();
  1196. return [false, $msg];
  1197. }
  1198. //库存
  1199. list($bool,$msg) = $this->changeInventory($data, $order, $user);
  1200. if(! $bool) {
  1201. DB::rollBack();
  1202. return [false, $msg];
  1203. }
  1204. }
  1205. if(! empty(self::$operation_order[$data['opt_case']])){
  1206. $type = self::$operation_order[$data['opt_case']];
  1207. (new OrderOperationService())->add([
  1208. 'order_number' => $order['order_number'],
  1209. 'msg' => OrderOperation::$type[$type],
  1210. 'type' => $type
  1211. ],$user);
  1212. }
  1213. DB::commit();
  1214. return [true, ''];
  1215. }catch (\Throwable $exception){
  1216. DB::rollBack();
  1217. return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
  1218. }
  1219. }
  1220. }
  1221. }