FinancialManager.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. <?php
  2. namespace app\cxinv\model;
  3. use think\facade\Log;use think\Model;use think\model\concern\SoftDelete;
  4. class FinancialManager extends Base{
  5. use SoftDelete;
  6. protected $schema=[
  7. 'id'=>'int',//主键,自动递增
  8. 'code'=>'string',//订单或记录的唯一标识符
  9. 'invoiceCode'=>'string',//订单或记录的唯一标识符
  10. 'type'=>'int',//记录类型 1入库2出库 3入库红冲 4 出库红冲
  11. 'source'=>'int',//数据来源,1结算 2 线下订单
  12. 'channel'=>'int',//渠道 1订单导入 2 非订单商品导入 3 c端无发票导入
  13. 'seller_code'=>'string',//卖方代码
  14. 'seller_name'=>'string',//卖方名称
  15. 'buyer_code'=>'string',//买方代码
  16. 'buyer_name'=>'string',//买方名称
  17. 'orderCode'=>'string',//订单编号
  18. 'cxCode'=>'string',//客户编号
  19. 'poCode'=>'string',//采购订单编号
  20. 'platform_type'=>'int',//平台类型,1ToB 2ToC
  21. 'goodType'=>'int',//商品类型 1库存 2非库存 3采返
  22. 'goodNo'=>'string',//商品编号
  23. 'goodName'=>'string',//商品名称
  24. 'unit'=>'string',//商品单位
  25. 'num'=>'int',//商品数量
  26. 'goodPrice'=>'decimal',//商品单价
  27. 'totalPrice'=>'decimal',//商品总价
  28. 'cat_code'=>'string',//商品分类代码
  29. 'cat_name'=>'string',//商品分类名称
  30. 'tax'=>'decimal',//税率或税费
  31. 'inv_fee'=>'decimal',//发票费用
  32. 'inv_seller_code'=>'string',//发票卖方代码
  33. 'inv_seller_name'=>'string',//发票卖方名称
  34. 'inv_buyer_code'=>'string',//发票买方代码
  35. 'inv_buyer_name'=>'string',//发票买方名称
  36. 'inv_number'=>'string',//发票编号
  37. 'inv_type'=>'string',//发票类型
  38. 'inv_item_id'=>'int',//发票项目ID
  39. 'inv_good_name'=>'string',//发票商品名称
  40. 'inv_cat_code'=>'string',//发票商品分类代码
  41. 'inv_spec'=>'string',//发票商品规格
  42. 'inv_unit'=>'string',//发票商品单位
  43. 'inv_num'=>'decimal',//发票商品数量
  44. 'inv_subprice'=>'decimal',//发票商品子项单价
  45. 'inv_subtotal'=>'decimal',//发票商品子项总价
  46. 'inv_tax'=>'decimal',//发票税额
  47. 'inv_tax_total'=>'decimal',//发票总税额
  48. 'inv_price'=>'decimal',//发票单价
  49. 'inv_total'=>'decimal',//发票总价
  50. 'inv_open_date'=>'datetime',
  51. 'cat_diff'=>'int',//分类差异
  52. 'tax_diff'=>'int',//税费差异
  53. 'remark'=>'string',//备注或说明
  54. 'error_remark'=>'string',//备注或说明
  55. 'status'=>'int',//1 待处理 2 正常 3计提 4 异常
  56. 'balance_num'=>'decimal',//库存数量
  57. 'total_num'=>'decimal',//总库存数量,
  58. 'check_fee'=>'decimal',
  59. 'is_checkOrder'=>'int',
  60. 'fz_date'=>'varchar',
  61. 'apply_id'=>'int',
  62. 'apply_name'=>'string',
  63. 'create_time'=>'datetime',
  64. 'update_time'=>'datetime',
  65. 'delete_time'=>'datetime',
  66. ];
  67. protected $createTime='create_time';
  68. protected $updateTime='update_time';
  69. protected $deleteTime='delete_time';
  70. public static $ManagerType=[1=>'入库',2=>'出库',3=>'入库红冲',4=>'出库红冲'];
  71. public static $ManagerSource=[1=>'结算',2=>'线下订单'];
  72. public static $PlatformType=[1=>'ToB',2=>'ToC'];
  73. public static $StatusCn=[1=>'待处理',2=>'正常',3=>'计提',4=>'异常'];
  74. public function ProductRela(){
  75. return $this->hasMany(ManagerProduct::class,'manager_id','id');
  76. }
  77. public function setErrorRemarkAttr($value,$data){
  78. return ($data['status']==4|| $data['status']==1)?$value:'';
  79. }
  80. public function CreateData($data){
  81. if(!empty($data)){
  82. switch ($data['channel']){
  83. case 1:
  84. $this->OrderImport($data);
  85. break;
  86. case 2:
  87. $this->OfflineImport($data);
  88. break;
  89. case 3:
  90. $this->CImport($data);
  91. break;
  92. default:
  93. throw new \Exception('导入渠道不存在');
  94. break;
  95. }
  96. }
  97. return true;
  98. }
  99. // 订单导入
  100. public function OrderImport($data){
  101. $data['total_num'] = $data['balance_num'] =$data['inv_num'];
  102. if(!empty($data['idArr'])) $product=array_map(function ($item) use($data){
  103. $temp=[];
  104. $temp['product_id']=$item['id'];
  105. $temp['type']=$data['type'];
  106. $temp['num']=$item['num'];
  107. $temp['apply_id'] = $data['apply_id'];
  108. $temp['apply_name'] = $data['apply_name'];
  109. $temp['status'] = 0;
  110. return $temp;
  111. },$data['idArr']);
  112. // self::startTrans();
  113. // try{
  114. // if($data['inv_num']==0) throw new \Exception('发票商品数量不能为0');
  115. // if($data['type']==1){
  116. // $product= $this->inProduct($data);
  117. // $data['error_remark'] = $data['balance_num']!='0'?'入库数量不正确':'';
  118. // }
  119. // if($data['type']==2){
  120. // $product= $this->outProduct($data);
  121. // $data['error_remark'] = $data['balance_num']!='0'?'出库数量不正确':'';
  122. // }
  123. // if($data['balance_num']!=$data['total_num'] && $data['balance_num']!='0') throw new \Exception($data['error_remark']);
  124. // $data['status']=$data['balance_num']==$data['total_num']?1:2;
  125. // self::commit();
  126. // }catch (\Exception $e){
  127. // self::rollback();
  128. // if(!empty($data['idArr'])) $product=array_map(function ($item) use($data){
  129. // $temp=[];
  130. // $temp['product_id']=$item['id'];
  131. // $temp['type']=$data['type'];
  132. // $temp['num']=$item['num'];
  133. // $temp['apply_id'] = $data['apply_id'];
  134. // $temp['apply_name'] = $data['apply_name'];
  135. // $temp['status'] = 0;
  136. // return $temp;
  137. // },$data['idArr']);
  138. // $data['status'] =4;
  139. // $data['error_remark'] = $e->getMessage();
  140. // }
  141. $info=$this->create($data);
  142. if($info->isEmpty()) throw new \Exception('添加失败');
  143. if (isset($product)) ManagerProduct::AddProduct($info->id,$product);
  144. }
  145. // 线下订单导入入库
  146. public function inProduct(&$data){
  147. $productID=[];
  148. try{
  149. $product = FinancialProducts::with(['productStock','ProductsCombind'])->where($this->getCondition($data))->findOrEmpty();
  150. if($product->isEmpty()){
  151. if($data['type']==4) throw new \Exception('红冲未找到财务商品信息');
  152. if($data['channel']==2 || $data['channel']==3) throw new \Exception('入库未找到财务商品信息');
  153. else{
  154. $product_data=[
  155. 'skuCode'=>$data['goodNo'],
  156. 'goodName'=>$data['goodName'],
  157. 'buyer_name'=>$data['inv_buyer_name'],
  158. 'buyer_code'=>$data['inv_buyer_code'],
  159. 'seller_name'=>$data['inv_seller_name'],
  160. 'seller_code'=>$data['inv_seller_code'],
  161. 'good_source'=>1,
  162. 'good_type'=>$data['goodType'],
  163. 'inv_good_name'=>$data['inv_good_name'],
  164. 'unit'=>$data['inv_unit'],
  165. 'unit_price'=>$data['inv_price'],
  166. 'subunit_price'=>$data['inv_subprice'],
  167. 'unit_weight'=>$data['unit_weight']??0,
  168. 'cat_code'=>$data['inv_cat_code'],
  169. 'cat_tax'=>$data['inv_tax'],
  170. "spec"=>$data['inv_spec'],
  171. 'inv_type'=>$data['inv_type'],
  172. "is_combind"=>0,
  173. 'basic_status'=>1,
  174. 'spectral'=>'',
  175. 'apply_id'=>$data['apply_id'],
  176. 'apply_name'=>$data['apply_name'],
  177. 'status'=>1
  178. ];
  179. $product = FinancialProducts::create($product_data);
  180. }
  181. }
  182. if($product->status!=1) throw new \Exception('商品未启用');
  183. if($product->is_combind==1){
  184. $rednum=$data['balance_num'];
  185. if($product->ProductsCombind->isEmpty()) throw new \Exception('组合商品未找到明细');
  186. $product->ProductsCombind->each(function ($item) use ($rednum, &$productID,$data) {
  187. ProductStock::AddStock($item->child_id, $rednum * $item->child_num);
  188. $productID[] = ['product_id' => $item->child_id, 'type'=>1,'status'=>1,'num' => $rednum * $item->child_num,'apply_id'=>$data['apply_id'], 'apply_name'=>$data['apply_name']];
  189. });
  190. }else{
  191. ProductStock::AddStock($product->id,$data['balance_num']);
  192. $productID[]=["product_id"=>$product->id,"type"=>1,'status'=>1,"num"=>$data['balance_num'],'apply_id'=>$data['apply_id'], 'apply_name'=>$data['apply_name']];
  193. }
  194. $data['balance_num']="0";
  195. $data['status']=2;
  196. return $productID;
  197. }catch (\Exception $e){
  198. throw new \Exception($e->getMessage());
  199. }
  200. }
  201. // 出库
  202. public function outProduct(&$data){
  203. $productID=[];
  204. try{
  205. if(($data['channel'] == 1 || $data['channel']==3) && empty($data['relaArr'])) {
  206. $product = FinancialProducts::with(['productStock','ProductsCombind'])->where($this->getCondition($data))->findOrEmpty();
  207. if($product->isEmpty()) throw new \Exception('出库未找到财务商品信息');
  208. if($product->status!=1) throw new \Exception('商品未启用');
  209. if($data['balance_num']>$product->residue_stock) throw new \Exception('出库数量大于库存');
  210. $item=['id'=>$product->id,'num'=> $data['balance_num']];
  211. $this->processSingleProduct($item, $productID,$data);
  212. } else {
  213. if (isset($data['relaArr']) && is_array($data['relaArr'])&& !empty($data['relaArr'])) {
  214. if(floatval($data['balance_num'])!= floatval(array_sum(array_column($data['relaArr'], 'num')))){
  215. throw new \Exception('出库商品数量不正确');
  216. }else{
  217. foreach ($data['relaArr'] as $item) {
  218. if (!isset($item['id']) || !isset($item['num'])) {
  219. throw new \Exception('relaArr 中的元素缺少 id 或 num');
  220. }
  221. $this->processSingleProduct($item, $productID, $data);
  222. }
  223. }
  224. } else {
  225. throw new \Exception('relaArr 为空或格式不正确');
  226. }
  227. }
  228. if($data['balance_num']=='0')$data['status']=2;
  229. }catch (\Exception $e){
  230. throw new \Exception($e->getMessage());
  231. }
  232. return $productID;
  233. }
  234. // 单商品处理
  235. private function processSingleProduct($data, &$productID, &$mainData = null) {
  236. $product = FinancialProducts::with(['productStock',"ProductsCombind"])->findOrEmpty($data['id']);
  237. if (!$product->isEmpty()) {
  238. if($product->status!=1) throw new \Exception('商品未启用');
  239. if($mainData['type']!=2 && $product->basic_status==2) throw new \Exception($product->skuCode.'商品不可为预估成本商品');
  240. $rednum = $data['num'];
  241. if($mainData['balance_num']< $data['num']) throw new \Exception('出库数量大于订单数量');
  242. if ($product->residue_stock < $data['num']) {
  243. if($mainData['type']==3) throw new \Exception($product->skuCode.'商品库存不足');
  244. $rednum = $product->residue_stock;
  245. if ($mainData !== null) {
  246. $mainData['balance_num'] = bcsub($mainData['balance_num'], $product->residue_stock, 8);
  247. }
  248. } else {
  249. if ($mainData !== null) {
  250. $mainData['balance_num'] = bcsub($mainData['balance_num'], $data['num'], 8);
  251. }
  252. }
  253. if($product->is_combind==1 ){
  254. if($product->ProductsCombind->isEmpty()) throw new \Exception('组合商品未找到明细');
  255. $productID=ProductsCombind::CombindSubStock($product->id,$rednum);
  256. array_map(function (&$item) use ($mainData){
  257. ProductStock::OutStock($item['product_id'], $item['num']);
  258. $item['status']=1;
  259. $item['apply_id']=$mainData['apply_id'];
  260. $item['apply_name']=$mainData['apply_name'];
  261. },$productID);
  262. }else{
  263. ProductStock::OutStock($product->id, $rednum);
  264. $productID[] = ['product_id' => $product->id, 'type'=>2,'status'=>1,'num' => $rednum,'apply_id'=>$mainData['apply_id'], 'apply_name'=>$mainData['apply_name']];
  265. }
  266. // $mainData['manager_status']=$mainData['balance_num']=='0'?1:2;
  267. } else {
  268. throw new \Exception('出库未找到财务商品信息');
  269. }
  270. }
  271. public function getCondition($data){
  272. $where=[];
  273. if(($data['channel']==1|| $data['channel']==3) && (empty($data['relaArr'])|| !isset($data['relaArr']))) {
  274. $where=[
  275. 'skuCode'=>$data['goodNo'],
  276. 'goodName'=>$data['goodName'],
  277. 'good_type'=>$data['goodType'],
  278. 'seller_code'=>$data['inv_seller_code'],
  279. 'buyer_code'=>$data['inv_buyer_code'],
  280. 'inv_good_name'=>$data['inv_good_name'],
  281. 'unit'=>$data['inv_unit'],
  282. 'unit_price'=>$data['inv_price'],
  283. 'subunit_price'=>$data['inv_subprice'],
  284. 'inv_type'=>$data['inv_type'],
  285. 'cat_tax'=>$data['inv_tax'],
  286. 'cat_code'=>$data['inv_cat_code'],
  287. "basic_status"=>1
  288. ];
  289. if($data['type']==2){
  290. $good_source = $data['channel']==2?2:1;
  291. $where=[
  292. ['skuCode',"=",$data['goodNo']],
  293. ['good_type',"=",$data['goodType']],
  294. ['good_source',"=",$good_source],
  295. ['buyer_code',"=",$data['inv_seller_code']],
  296. ['basic_status',"=",1],
  297. ];
  298. }
  299. }
  300. else $where[]=[
  301. 'id','in',array_column($data['relaArr'],"id")
  302. ];
  303. return $where;
  304. }
  305. // 线下订单导入
  306. public function OfflineImport($data){
  307. $data['total_num'] = $data['balance_num'] =$data['relaArr'][0]['num'];
  308. if($data['orderCode']=="")$data['orderCode']=makeNo("PQR");
  309. if(!empty($data['idArr'])) $product=array_map(function ($item) use($data){
  310. $temp=[];
  311. $temp['product_id']=$item['id'];
  312. $temp['type']=$data['type'];
  313. $temp['num']=$item['num'];
  314. $temp['apply_id'] = $data['apply_id'];
  315. $temp['apply_name'] = $data['apply_name'];
  316. $temp['status'] = 0;
  317. return $temp;
  318. },$data['idArr']);
  319. // self::startTrans();
  320. // try{
  321. // if($data['type']==1){
  322. // $product=$this->inProduct($data);
  323. // $data['error_remark'] = $data['balance_num']!='0'?'入库数量不正确':'';
  324. // }
  325. // if($data['type']==2){
  326. // $product=$this->outProduct($data);
  327. // $data['error_remark'] = $data['balance_num']!='0'?'出库数量不正确':'';
  328. // }
  329. // if($data['balance_num']!=$data['total_num'] && $data['balance_num']!='0') throw new \Exception($data['error_remark']);
  330. // $data['status']=$data['balance_num']==$data['total_num']?1:2;
  331. // self::commit();
  332. // }catch (\Exception $e){
  333. // self::rollback();
  334. // if(!empty($data['idArr'])) $product=array_map(function ($item) use($data){
  335. // $temp=[];
  336. // $temp['product_id']=$item['id'];
  337. // $temp['type']=$data['type'];
  338. // $temp['num']=$item['num'];
  339. // $temp['apply_id'] = $data['apply_id'];
  340. // $temp['apply_name'] = $data['apply_name'];
  341. // $temp['status'] = 0;
  342. // return $temp;
  343. // },$data['idArr']);
  344. // $data['status'] =4;
  345. // $data['error_remark'] = $e->getMessage();
  346. // }
  347. $info=$this->create($data);
  348. if($info->isEmpty()) throw new \Exception('添加失败');
  349. if(isset($product) && !empty($product))ManagerProduct::AddProduct($info->id,$product);
  350. }
  351. // c端无发票导入
  352. public function CImport($data){
  353. $data['total_num'] = $data['balance_num'] =$data['num'];
  354. if(!empty($data['idArr'])) $product=array_map(function ($item) use($data){
  355. $temp=[];
  356. $temp['product_id']=$item['id'];
  357. $temp['type']=$data['type'];
  358. $temp['num']=$item['num'];
  359. $temp['apply_id'] = $data['apply_id'];
  360. $temp['apply_name'] = $data['apply_name'];
  361. $temp['status'] = 0;
  362. return $temp;
  363. },$data['idArr']);
  364. // self::startTrans();
  365. // try{
  366. // if($data['type']==1){
  367. // $product=$this->inProduct($data);
  368. // $data['error_remark'] = $data['balance_num']!='0'?'入库数量不正确':'';
  369. // }
  370. // if($data['type']==2){
  371. // $product=$this->outProduct($data);
  372. // $data['error_remark'] = $data['balance_num']!='0'?'出库数量不正确':'';
  373. // }
  374. // if($data['balance_num']!=$data['total_num'] && $data['balance_num']!='0') throw new \Exception($data['error_remark']);
  375. // $data['status']=$data['balance_num']==$data['total_num']?1:2;
  376. // self::commit();
  377. // }catch (\Exception $e){
  378. // self::rollback();
  379. // if(!empty($data['idArr'])) $product=array_map(function ($item) use($data){
  380. // $temp=[];
  381. // $temp['product_id']=$item['id'];
  382. // $temp['type']=$data['type'];
  383. // $temp['num']=$item['num'];
  384. // $temp['apply_id'] = $data['apply_id'];
  385. // $temp['apply_name'] = $data['apply_name'];
  386. // $temp['status'] = 0;
  387. // return $temp;
  388. // },$data['idArr']);
  389. // $data['status'] =4;
  390. // $data['error_remark'] = $e->getMessage();
  391. // }
  392. $info=$this->create($data);
  393. if($info->isEmpty()) throw new \Exception('添加失败');
  394. if(isset($product) && !empty($product))ManagerProduct::AddProduct($info->id,$product);
  395. }
  396. // 校验数据
  397. public function CheckDatas($data){
  398. $error=[];
  399. $invoice = PayInvoice::where('hpNo',$data['invoiceCode'])->findOrEmpty();
  400. if($invoice->isEmpty()){
  401. $invoice = InvoicePool::where("invNo",$data['invoiceCode'])->findOrEmpty();
  402. if($invoice->isEmpty()){
  403. $error[] = ['code'=>$data['invoiceCode'],'msg'=>'发票号未找到数据'];
  404. }
  405. }
  406. if(!$invoice->isEmpty() && $invoice->status!=4) $error[] = ['code'=>$data['invoiceCode'],'msg'=>'发票状态不正确'];
  407. $order = CgdInfo::where("sequenceNo",$data['orderCode'])->findOrEmpty();
  408. if($order->isEmpty()){
  409. $order = QrdInfo::where("sequenceNo",$data['orderCode'])->findOrEmpty();
  410. if($order->isEmpty())$error[] = ['code'=>$data['orderCode'],'msg'=>'订单未找到数据'];
  411. }
  412. $good = Good::where("spuCode",$data['goodNo'])->findOrEmpty();
  413. if($good->isEmpty()) $error[] = ['code'=>$data['goodNo'],'msg'=>'采销商品未找到数据'];
  414. if(!$order->isEmpty() && $order->cxCode!=$data['cxCode']) $error[] = ['code'=>$data['orderCode'],'msg'=>'订单主单号不一致'];
  415. return $error;
  416. }
  417. public function OutKet(&$data)
  418. {
  419. $productID=[];
  420. try{
  421. if (isset($data['relaArr']) && is_array($data['relaArr'])) {
  422. $ketArr=[];
  423. foreach ($data['relaArr'] as $item) {
  424. if (!isset($item['id']) || !isset($item['num'])) {
  425. throw new \Exception('relaArr 中的元素缺少 id 或 num');
  426. }
  427. $ket=$this->processKtProduct($item, $productID, $data);
  428. if(!empty($ket)) $ketArr[]=$ket;
  429. }
  430. if(!empty($ketArr)){
  431. $create=[
  432. 'manager_id'=>$data['id'],
  433. 'ktCode'=>makeNo('CL'),
  434. 'apply_id'=>$data['cl_uid'],
  435. 'apply_name'=>$data['cl_uname'],
  436. 'num'=>"0",
  437. 'out_fee'=>"0",
  438. 'check_fee'=>0,
  439. 'status'=>1,
  440. ];
  441. FinancialTz::MakeInfo($ketArr,$create);
  442. }
  443. if($data['balance_num']==0) $data['status']=empty($ketArr)?2:3; //计提
  444. } else {
  445. throw new \Exception('relaArr 为空或格式不正确');
  446. }
  447. }catch (\Exception $e){
  448. throw new \Exception($e->getMessage());
  449. }
  450. return $productID;
  451. }
  452. public function processKtProduct($item, &$productID, &$data)
  453. {
  454. $kt=[];
  455. $product = FinancialProducts::with(['productStock',"ProductsCombind"])->findOrEmpty($item['id']);
  456. if (!$product->isEmpty()) {
  457. if($product->status!=1) throw new \Exception('商品未启用');
  458. if($product->is_combind==0){
  459. if($product->residue_stock<$item['num']){
  460. $kt=["product_id"=>$product->id,"type"=>1,'num'=>bcsub($item['num'],$product->residue_stock,8),"subunit_price"=>$product->subunit_price,"unit_price"=>$product->unit_price];
  461. }
  462. ProductStock::OutStock($product->id,$item['num'],2);
  463. $productID[]=["product_id"=>$product->id,'num'=>$item['num'],'type'=>2,'apply_id'=>$data['cl_uid'],'apply_name'=>$data['cl_uname']];
  464. $data['balance_num']=bcsub($data['balance_num'],$item['num'],8);
  465. }else{
  466. $productID=ProductsCombind::CombindSubStock($product->id,$item['num'],2);
  467. if($product->combind_stock<$item['num']) $kt =['product_id'=>$product->id,'type'=>1,'num'=>bcsub($item['num'],$product->combind_stock,8),'subunit_price'=>$product->subunit_price,'unit_price'=>$product->unit_price];
  468. array_map(function (&$item)use(&$kt,$data){
  469. ProductStock::OutStock($item['product_id'], $item['num'],2);
  470. $item['apply_id']=$data['cl_uid'];
  471. $item['apply_name']=$data['cl_uname'];
  472. },$productID);
  473. $data['balance_num']=bcsub($data['balance_num'],$item['num'],8);
  474. }
  475. }else{
  476. throw new \Exception('商品未找到');
  477. }
  478. return $kt;
  479. }
  480. }