ComonOrder.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\admin\controller;
  4. use app\admin\model\CgdInfo;use app\admin\model\CompanyInfo;
  5. use app\admin\model\InvoiceGood;
  6. use app\admin\model\InvoicePay;
  7. use app\admin\model\InvoicePool;
  8. use app\admin\model\InvoicePoolInfo;
  9. use app\admin\model\Pay;
  10. use app\admin\model\PayInfo;
  11. use app\admin\model\QrdInfo;
  12. use app\admin\model\ReportCode;
  13. use app\admin\model\SupplierInfo;
  14. use app\admin\model\TagLog;
  15. use think\App;
  16. use think\Exception;
  17. use think\facade\Config;
  18. use think\facade\Db;
  19. use think\facade\Validate;
  20. //通用订单处理
  21. class ComonOrder extends Base
  22. {
  23. public $model=null;
  24. protected $typename;
  25. protected $invoiceType;
  26. protected $invName;
  27. protected $kingInvoice;
  28. protected $novalidate=["*"];
  29. public function __construct(App $app) {
  30. parent::__construct($app);
  31. $this->model = new \app\admin\model\ComonOrder();
  32. $invoice =Config::get('invoiceType');
  33. $this->invoiceType = $invoice['invoiceName'];
  34. $this->invName = $invoice['invoiceType'];
  35. $this->typename = $invoice['KingName'];
  36. $this->kingInvoice = $invoice['KingInvoice'];
  37. }
  38. public function list(){
  39. $post = $this->request->only(["start"=>"","end"=>"","cxCode"=>"","customerNo"=>"","companyNo"=>"",'status'=>'',
  40. 'relaComNo'=>'','platform_type'=>'','inv_status'=>'','pay_status'=>'','page'=>1,'size'=>15],"post","trim");
  41. $where=[];
  42. $post['start']==''?:$where[]=["comon_order.addtime",">=",date("Y-m-d 00:00:00",strtotime($post['start']))];
  43. $post['end']==''?:$where[]=["comon_order.addtime","<=",date("Y-m-d 23:59:59",strtotime($post['end']))];
  44. $post['cxCode']==''?:$where[]=["comon_order.cxCode","like","%{$post['cxCode']}%"];
  45. $post['customerNo']==''?:$where[]=["comon_order.customerNo","=",$post['customerNo']];
  46. $post['status']==''?:$where[]=["comon_order.status","=",$post['status']];
  47. $post['inv_status']==''?:$where[]=["qrd.inv_status","=",$post['inv_status']];
  48. $post['pay_status']==''?:$where[]=["qrd.pay_status","=",$post['pay_status']];
  49. // $post['status']==''?:$where[]=["comon_order.status","=",$post['status']];
  50. $post['platform_type']==''?:$where[]=["comon_order.platform_type","=",$post['platform_type']];
  51. $post['companyNo']==''?:$where[]=["comon_order.companyNo|comon_order.supplierNo","=",$post['companyNo']];
  52. $post['relaComNo']==''?:$where[]=["comon_order.companyNo|comon_order.supplierNo|comon_order.customerNo","=",
  53. $post['relaComNo']];
  54. $list=$this->model->withJoin(["qrd","cgd"],"left")->where($where)->order("id desc")->paginate
  55. (["page"=>$post['page'],"list_rows"=>$post['size']]);
  56. $this->success("0",["list"=>$list->items(),"count"=>$list->total()]);
  57. }
  58. //通用订单创建对账单
  59. public function PayCreate(){
  60. $param=$this->request->only(["common_ids"=>[]],"post","trim");
  61. $valid=Validate::rule(["common_ids|通用订单id集合"=>"require|array"]);
  62. if($valid->check($param)==false)$this->error($valid->getError());
  63. $obj = $this->model->with(['cgd'])->where(["id"=>$param['common_ids']])->select();
  64. if($obj->isEmpty())$this->error("未找到相关数据");
  65. $list = $obj->toArray();
  66. $status = array_unique(array_column($list,"status"));
  67. $supplierNo = array_unique(array_column($list,"supplierNo"));
  68. $customerNo = array_unique(array_column($list,"customerNo"));
  69. $goodNo = array_unique(array_column($list,"goodNo"));
  70. if(in_array(1,$status)|| in_array(2,$status))$this->error('提交数据存在已对账或对账中的数据');
  71. $supplierName = \app\admin\model\SupplierInfo::whereIn("code",$supplierNo)->value("name",'');
  72. $customerName = \app\admin\model\CompanyInfo::whereIn("companyNo",$customerNo)->value("company_name",'');
  73. if(count($supplierNo)>1)$this->error('提交数据采购供应商存在不一致');
  74. if(count($customerNo)>1)$this->error('提交数据销售客户存在不一致');
  75. $good_info = \app\admin\model\Good::where(['spuCode'=>$goodNo])->column('status','spuCode');
  76. if(empty($good_info))$this->error('商品开票类目信息不存在');
  77. if(in_array(0,$good_info)){
  78. $key = array_search(0,$good_info);
  79. $this->error("商品 $key 采购未确认开票类目");
  80. }
  81. if(in_array(1,$good_info)){
  82. $key = array_search(1,$good_info);
  83. $this->error("商品 $key 财务未确认开票类目");
  84. }
  85. $payNo= makeNo("PAY");
  86. $this->model->startTrans();
  87. try {
  88. $paydata=[
  89. 'payNo'=>$payNo,
  90. 'apply_id'=>$this->uid,
  91. 'apply_name'=>$this->uname,
  92. 'total_fee'=>"0",
  93. 'supplierNo'=>$supplierNo[0],
  94. 'supplierName'=>$supplierName,
  95. 'companyNo'=>$customerNo[0],
  96. 'companyName'=>$customerName,
  97. 'wpay_fee'=>"0",
  98. 'apay_fee'=>'0',
  99. 'ainv_fee'=>'0',
  100. 'winv_fee'=>'0',
  101. 'remark'=>'',
  102. 'is_comon'=>1,
  103. 'status'=>1,
  104. 'addtime'=>date('Y-m-d H:i:s'),
  105. 'updatetime'=>date('Y-m-d H:i:s'),
  106. ];
  107. foreach ($list as $item){
  108. if(!isset($item['cgd']) || empty($item['cgd'])) throw new Exception("采购单信息未找到");
  109. $value= $item['cgd'];
  110. $temp=[];
  111. $temp['cgdNo']=$value['sequenceNo'];
  112. $temp['total_fee']=$value['totalPrice'];
  113. $temp['apay_fee']=$value['apay_fee'];
  114. $temp['wpay_fee']=$value['wpay_fee'];
  115. $temp['winv_fee']=$value['winv_fee'];
  116. $temp['ainv_fee']=$value['ainv_fee'];
  117. $temp['payNo']=$payNo;
  118. $temp['addtime']=date('Y-m-d H:i:s');
  119. $temp['updatetime']=date('Y-m-d H:i:s');
  120. $data[]=$temp;
  121. $paydata['total_fee']= bcadd($paydata['total_fee'],$temp['total_fee'],2);
  122. $paydata['apay_fee']= bcadd($paydata['apay_fee'],$temp['apay_fee'],2);
  123. $paydata['wpay_fee']= bcadd($paydata['wpay_fee'],$temp['wpay_fee'],2);
  124. $paydata['ainv_fee']=bcadd($paydata['ainv_fee'],$temp['ainv_fee'],2);
  125. $paydata['winv_fee']= bcadd($paydata['winv_fee'],$temp['winv_fee'],2);
  126. }
  127. if(empty($data))throw new Exception('采购单对账信息不能为空');
  128. $save= (new \app\admin\model\PayInfo)->saveAll($data);
  129. if($save->count()==0)throw new Exception('采购单对账信息录入失败');
  130. $payIn =Pay::create($paydata);
  131. if($payIn->id>0){
  132. $this->model->where(['id'=>$param['common_ids']])->save(["status"=>1]);
  133. CgdInfo::where(["sequenceNo"=>array_column($list,"cgdNo")])->save(['status'=>1]);
  134. $report =ReportCode::where(['cgdNo'=>array_column($list,'cgdNo')])->select();
  135. if($report->isEmpty()==false)$report->update(['payNo'=>Db::raw("CONCAT(payNo,',','{$payNo}')")]);
  136. $this->model->commit();
  137. }else throw new Exception('采购单对账单创建失败');
  138. }catch (\Exception $exception){
  139. $this->model->rollback();
  140. $this->error($exception->getMessage());
  141. }
  142. $this->success("对账单创建成功");
  143. }
  144. //通用订单修改对账单
  145. public function PaySave(){
  146. $param=$this->request->only(['common_ids'=>[],"payNo"=>""],'post','trim');
  147. $valid=Validate::rule([
  148. 'common_ids|通用订单id集合'=>'require|array',
  149. 'payNo|通用订单对账单编号'=>'require',
  150. ]);
  151. if($valid->check($param)==false)$this->error($valid->getError());
  152. $obj = $this->model->with(['cgd'])->where(['id'=>$param['common_ids']])->select();
  153. if($obj->isEmpty())$this->error('未找到相关数据');
  154. $payinfo = Pay::where(['payNo'=>$param['payNo'],'is_del'=>0])->findOrEmpty();
  155. if($payinfo->isEmpty())$this->error('未找到对账单数据');
  156. if($payinfo->status!=1)$this->error('对账单数据已提交审核');
  157. $cgdNo =payInfo::where([['payNo','=',$param['payNo']],['is_del','=',0]])->column('cgdNo');
  158. $list = $obj->toArray();
  159. $cgdArr=array_column($list,'cgdNo');
  160. $status = array_unique(array_column($list,'status'));
  161. $supplierNo = array_unique(array_column($list,'supplierNo'));
  162. $customerNo = array_unique(array_column($list,'customerNo'));
  163. $goodNo = array_unique(array_column($list,'goodNo'));
  164. // if(in_array(1,$status)|| in_array(2,$status)){
  165. // $this->error('提交数据存在已对账或对账中的数据');
  166. // }
  167. $supplierName = \app\admin\model\SupplierInfo::whereIn('code',$supplierNo)->value('name','');
  168. $customerName = \app\admin\model\CompanyInfo::whereIn('companyNo',$customerNo)->value('company_name','');
  169. if(count($supplierNo)>1)$this->error('提交数据采购供应商存在不一致');
  170. if(count($customerNo)>1)$this->error('提交数据销售客户存在不一致');
  171. $good_info = \app\admin\model\Good::where(['spuCode'=>$goodNo])->column('status','spuCode');
  172. if(empty($good_info))$this->error("商品开票类目信息不存在");
  173. if(in_array(0,$good_info)){
  174. $key = array_search(0,$good_info);
  175. $this->error("商品 $key 采购未确认开票类目");
  176. }
  177. if(in_array(1,$good_info)){
  178. $key = array_search(1,$good_info);
  179. $this->error("商品 $key 财务未确认开票类目");
  180. }
  181. $add=[];
  182. $remove=[];
  183. if(!empty($cgdNo)){
  184. $remove = array_diff($cgdNo,$cgdArr);
  185. $add = array_diff($cgdArr,$cgdNo);
  186. }
  187. $data=[];
  188. $this->model->startTrans();
  189. try {
  190. $paydata=[
  191. 'total_fee'=>'0',
  192. 'supplierNo'=>$supplierNo,
  193. 'supplierName'=>$supplierName,
  194. 'companyNo'=>$customerNo,
  195. 'companyName'=>$customerName,
  196. 'wpay_fee'=>'0',
  197. 'apay_fee'=>'0',
  198. 'ainv_fee'=>'0',
  199. 'winv_fee'=>'0',
  200. 'remark'=>'',
  201. 'is_comon'=>1,
  202. 'status'=>1,
  203. 'updatetime'=>date('Y-m-d H:i:s'),
  204. ];
  205. foreach ($list as $item){
  206. if(!isset($item['cgd']) || empty($item['cgd'])) throw new Exception('采购单信息未找到');
  207. $value= $item['cgd'];
  208. if(!empty($add)&& in_array($value['sequenceNo'],$add)){
  209. $temp=[];
  210. $temp['cgdNo']=$value['sequenceNo'];
  211. $temp['total_fee']=$value['totalPrice'];
  212. $temp['apay_fee']=$value['apay_fee'];
  213. $temp['wpay_fee']=$value['wpay_fee'];
  214. $temp['winv_fee']=$value['winv_fee'];
  215. $temp['ainv_fee']=$value['ainv_fee'];
  216. $temp['payNo']=$param['payNo'];
  217. $temp['addtime']=date('Y-m-d H:i:s');
  218. $temp['updatetime']=date('Y-m-d H:i:s');
  219. $data[]=$temp;
  220. }
  221. $paydata['total_fee']= bcadd($paydata['total_fee'],$temp['total_fee'],2);
  222. $paydata['apay_fee']= bcadd($paydata['apay_fee'],$temp['apay_fee'],2);
  223. $paydata['wpay_fee']= bcadd($paydata['wpay_fee'],$temp['wpay_fee'],2);
  224. $paydata['ainv_fee']=bcadd($paydata['ainv_fee'],$temp['ainv_fee'],2);
  225. $paydata['winv_fee']= bcadd($paydata['winv_fee'],$temp['winv_fee'],2);
  226. }
  227. if(!empty($data)){
  228. $save= (new \app\admin\model\PayInfo)->saveAll($data);
  229. if($save->count()==0)throw new Exception('采购单对账信息录入失败');
  230. }
  231. $payIn =Pay::where($payinfo)->save($paydata);
  232. if($payIn){
  233. $this->model->where(['id'=>$param['common_ids']])->save(['status'=>1]);
  234. $this->model->where(['cgdNo'=>$remove])->save(['status'=>0]);
  235. CgdInfo::where(['sequenceNo'=>$add])->save(['status'=>1]);
  236. CgdInfo::where(['sequenceNo'=>$remove])->save(['status'=>0]);
  237. $report =ReportCode::where(['cgdNo'=>$add])->select();
  238. if($report->isEmpty()==false)$report->update(['payNo'=>Db::raw("CONCAT(payNo,',','{$param['payNo']}')")]);
  239. $reports =ReportCode::where(['cgdNo'=>$remove])->select();
  240. if($reports->isEmpty()==false)$reports->update(['payNo'=>Db::raw("REPLACE(payNo,',{$param['payNo']}','')")]);
  241. $this->model->commit();
  242. }else throw new Exception('采购单对账单创建失败');
  243. }catch (\Exception $exception){
  244. $this->model->rollback();
  245. $this->error($exception->getMessage());
  246. }
  247. $this->success('对账单创建成功');
  248. }
  249. //通用对账单信息
  250. public function PayInfo()
  251. {
  252. $param=$this->request->only(['payNo'=>''],"post","trim");
  253. $valid=Validate::rule(['payNo|通用订单对账单编号'=>'require']);
  254. if($valid->check($param)==false)$this->error($valid->getError());
  255. $payinfo =Pay::where(['payNo'=>$param['payNo'],'is_del'=>0])->append(["cgdlist","qrdlist"])->findOrEmpty();
  256. if($payinfo->isEmpty())$this->error("对账单数据未找到");
  257. if($payinfo->is_comon==0)$this->error('非通用对账单数据无法访问数据');
  258. $pay = PayInfo::where(['payNo'=>$param['payNo'],'is_del'=>0])->select();
  259. if($pay->isEmpty())$this->error('对账单订单数据未找到');
  260. $cgdlist = [];
  261. $qrdlist = [];
  262. foreach ($pay as $item){
  263. $list=$this->model->with(['qrd',"cgd"])->where(["cgdNo"=>$item->cgdNo])->findOrEmpty();
  264. if($list->isEmpty())continue;
  265. $list->cgd->catInfo = json_decode($list->cgd->catInfo,true);
  266. $list->qrd->catInfo = json_decode($list->qrd->catInfo,true);
  267. $cgdlist[] =$list->cgd->toArray();
  268. $invArr = Db::name('assoc')
  269. ->alias('a')
  270. ->leftJoin('invoice_good b', 'a.viceCode=b.invNo AND b.orderCode =a.orderCode')
  271. ->where(['a.status' => [1, 2], 'a.is_del' => 0, 'a.type' => 1, 'a.orderCode' => $list->qrd->sequenceNo])->group
  272. ('a.status')->column('sum(b.goodNum) as goodNum', 'a.status');
  273. $list->qrd->goodNum =$list->qrd->goodNum - $list->qrd->thNum;
  274. $list->qrd->inv_num = $invArr[1]??0;
  275. $list->qrd->ainv_num = $invArr[2]??0;
  276. $list->qrd->winv_num =$list->qrd->goodNum- $list->qrd->inv_num-$list->qrd->ainv_num;
  277. $qrdlist[] =$list->qrd->toArray();
  278. }
  279. $payinfo->cgdlist =$cgdlist;
  280. $payinfo->qrdlist =$qrdlist;
  281. $payinfo['pay_type']=SupplierInfo::where('code',$payinfo['supplierNo'])->value('pay_method','');
  282. $tag =TagLog::alias('a')->leftJoin('order_tag b','a.tag_id=b.id')->where
  283. (['code'=>$param['payNo'],'a.status'=>1])->column('b.tag_name,a.tag_img,a.tag_remark','b.type');
  284. $payinfo['inv_tag_name']=$tag[2]['tag_name']??'';
  285. $payinfo['pay_tag_name']=$tag[1]['tag_name']??'';
  286. $payinfo['pay_tag_img']=$tag[1]['tag_img']??'';
  287. $payinfo['pay_tag_remark']=$tag[1]['tag_remark']??'';
  288. $payinfo['inv_tag_img']=$tag[2]['tag_img']??'';
  289. $payinfo['inv_tag_remark']=$tag[2]['tag_remark']??'';
  290. $this->success('获取成功',$payinfo);
  291. }
  292. /**
  293. * 对账单开票申请
  294. */
  295. public function invAdd(){
  296. $param=$this->request->only(["payNo"=>"","orderArr"=>[],"invtype"=>"","email"=>"","remark"=>"",
  297. 'exam_remark'=>''],"post","trim");
  298. $valid =Validate::rule([
  299. "payNo|对账单编号"=>"require",
  300. "orderArr|订单数据"=>"require|array",
  301. "invtype|开票类型"=>["require","in"=>$this->invName],
  302. "email|邮箱"=>"email",
  303. ]);
  304. if($valid->check($param)==false) $this->error($valid->getError());
  305. $valide = Validate::rule([
  306. "sequenceNo|销售订单号"=>"require",
  307. "num|商品开票数量"=>"require|number|gt:0",
  308. "inv_fee|商品开票金额"=>"require|float|gt:0",
  309. ]);
  310. $qrdinfo = QrdInfo::whereIn('sequenceNo',array_column($param['orderArr'],"sequenceNo"))
  311. ->column("id,sequenceNo,customerNo,customerName,companyNo,companyName,goodNo,goodNum,thNum,inv_fee,winv_fee,
  312. status,goodUnit,goodName,thirdCat,totalPrice,tax,platform_type","sequenceNo");
  313. if(empty($qrdinfo))$this->error("订单信息不存在");
  314. $goodInfo= \app\admin\model\Good::whereIn("spuCode",array_unique(array_column($qrdinfo,"goodNo")))
  315. ->column("inv_good_name,inv_cat_name,inv_cat_code,inv_tax,is_discount,addTax,inv_tag,status","spuCode");
  316. if(empty($goodInfo))$this->error('商品类目信息不存在');
  317. $assoc=[];
  318. $invoiceGood=[];
  319. $invNo=makeNo('INV');
  320. $invfee=array_sum(array_column($param['orderArr'],'inv_fee'));
  321. $companyArr = array_unique(array_column($qrdinfo,'companyName','companyNo'));
  322. $customerArr = array_unique(array_column($qrdinfo,'customerName','customerNo'));
  323. if(count($companyArr)>1)$this->error("订单业务公司不一致");
  324. if(count($customerArr)>1)$this->error("订单客户公司不一致");
  325. $company = CompanyInfo::whereIn("companyNo",array_keys($companyArr))->findOrEmpty();
  326. if($company->isEmpty())$this->error('订单业务公司开票信息未找到');
  327. $customer = CompanyInfo::whereIn('companyNo',array_keys($customerArr))->findOrEmpty();
  328. if($customer->isEmpty())$this->error('订单客户公司开票信息未找到');
  329. if($company['denomination']!=''&& $invfee>intval($company['denomination'])*10000){
  330. $this->error("开票面额不能超过{$company['denomination']}万元");
  331. }
  332. $platform = array_column($qrdinfo,'platform_type');
  333. if(count(array_unique($platform))!=1){
  334. $this->error("订单平台类型不一致");
  335. // return error_show(1004,'订单平台类型不一致');
  336. }
  337. foreach ($param['orderArr'] as $i=>$item){
  338. if($valide->check($item)==false) $this->error($valide->getError());
  339. if(!isset($qrdinfo[$item['sequenceNo']]))$this->error("订单 {$item['sequenceNo']} 信息不存在");
  340. if($qrdinfo[$item['sequenceNo']]['status']==2)$this->error("订单 {$item['sequenceNo']} 不参与对账");
  341. if($qrdinfo[$item['sequenceNo']]['winv_fee']<$item['inv_fee'])$this->error("订单 {$item['sequenceNo']} 待开票金额不足");
  342. $total = InvoicePool::alias("a")->leftJoin('invoice_good b', 'a.invNo=b.invNo and b.is_del=0')
  343. ->where(['a.status' => [0, 1, 2, 3, 4], 'b.orderCode' => $item['sequenceNo']])
  344. ->sum('b.goodNum');
  345. if($total+$item['num']>($qrdinfo[$item['sequenceNo']]['goodNum']-$qrdinfo[$item['sequenceNo']]['thNum']))$this->error("订单 {$item['sequenceNo']} 待开票数量不足");
  346. if(!isset($goodInfo[$qrdinfo[$item['sequenceNo']]['goodNo']]))$this->error("订单 {$item['sequenceNo']} 商品类目信息不存在");
  347. if($goodInfo[$qrdinfo[$item['sequenceNo']]['goodNo']]['status']!=2)$this->error("订单 {$item['sequenceNo']} 未确认开票类目信息");
  348. $num = \app\admin\model\Assoc::alias('a')
  349. ->leftJoin('invoice_good b', 'a.viceCode=b.invNo AND b.orderCode=a.orderCode')
  350. ->where(['a.status' => [1, 2], 'a.is_del' => 0, 'a.type' => 1, 'a.orderCode' => $item['sequenceNo']])
  351. ->sum('b.goodNum');
  352. if($num+$item['num']>($qrdinfo[$item['sequenceNo']]['goodNum']-$qrdinfo[$item['sequenceNo']]['thNum']))$this->error("订单 {$item['sequenceNo']} 待开票数量不足");
  353. $assoc[]=[
  354. 'assocNo'=>substr(makeNo('AS'),0,-4).str_pad(strval($i+1),4,'0',STR_PAD_LEFT),
  355. 'apply_id'=>$this->uid,
  356. 'apply_name'=>$this->uname,
  357. 'type'=>1,
  358. 'orderCode'=>$item['sequenceNo'],
  359. 'customerNo'=>$qrdinfo[$item['sequenceNo']]['customerNo'],
  360. 'viceCode'=>$invNo,
  361. 'order_total'=>$qrdinfo[$item['sequenceNo']]['totalPrice'],
  362. 'vice_total'=>$invfee,
  363. 'cancel_fee'=>$item['inv_fee'],
  364. 'status'=>1,
  365. 'addtime'=>date('Y-m-d H:i:s'),
  366. 'updatetime'=>date('Y-m-d H:i:s')
  367. ];
  368. $invoiceGood[]=[
  369. 'invNo'=>$invNo,
  370. 'orderCode'=>$item['sequenceNo'],
  371. 'goodNo'=>$qrdinfo[$item['sequenceNo']]['goodNo'],
  372. 'goodName'=>$good_info[$qrdinfo[$item['sequenceNo']]['goodNo']]['inv_good_name']??$qrdinfo[$item['sequenceNo']]['goodName'] ,
  373. 'catName'=>$good_info[$qrdinfo[$item['sequenceNo']]['goodNo']]['inv_cat_name']??$qrdinfo[$item['sequenceNo']]['thirdCat'],
  374. 'catNo'=>$good_info[$qrdinfo[$item['sequenceNo']]['goodNo']]['inv_cat_code']??'',
  375. 'goodPrice'=>round($item['inv_fee']/$item['num'],8),
  376. 'unitName'=>$qrdinfo[$item['sequenceNo']]['goodUnit'],
  377. 'goodNum'=>$item['num'],
  378. 'specInfo'=>$item['sequenceNo'],
  379. 'totalPrice'=>$item['inv_fee'],
  380. 'totalTax'=>$item['inv_fee'],
  381. 'tax'=>$good_info[$qrdinfo[$item['sequenceNo']]['goodNo']]['inv_tax']??$qrdinfo[$item['sequenceNo']]['tax'],
  382. 'is_discount'=>$good_info[$qrdinfo[$item['sequenceNo']]['goodNo']]['is_discount']??0,
  383. 'addTax'=>$good_info[$qrdinfo[$item['sequenceNo']]['goodNo']]['addTax']??'',
  384. 'inv_tag'=>$good_info[$qrdinfo[$item['sequenceNo']]['goodNo']]['inv_tag']??'',
  385. 'taxPrice'=>round($item['inv_fee']*($good_info[$qrdinfo[$item['sequenceNo']]['goodNo']]['inv_tax']??$qrdinfo[$item['sequenceNo']]['tax']),2),
  386. 'addtime'=>date('Y-m-d H:i:s'),
  387. 'updatetime'=>date('Y-m-d H:i:s')
  388. ];
  389. $qrdinfo[$item['sequenceNo']]["inv_fee"] = $qrdinfo[$item['sequenceNo']]['inv_fee']+$item['inv_fee'];
  390. $qrdinfo[$item['sequenceNo']]["winv_fee"] = $qrdinfo[$item['sequenceNo']]['winv_fee']-$item['inv_fee'];
  391. $qrdinfo[$item['sequenceNo']]["inv_status"] = 2;
  392. $qrdinfo[$item['sequenceNo']]["status"] = 1;
  393. }
  394. $inv=[
  395. 'invNo'=>$invNo,
  396. 'inv_value'=>$invfee,
  397. 'inv_out'=> array_keys($companyArr)[0],
  398. 'inv_company'=> $company['invoice_title']??'',
  399. 'apply_id'=>$this->uid,
  400. 'is_comon'=>1,
  401. 'apply_name'=>$this->uname,
  402. 'inv_type'=>$param['invtype'],//发票类型 专用 普通 电子专用 电子普通 全电子票
  403. 'open_type'=>0, //开票类型 金税开票 金税线下 纯线下
  404. 'platform_type'=>$platform[0]??0, //开票类型 金税开票 金税线下 纯线下
  405. 'is_ticket'=>$company['out_ticket'], //是否支持金税开票
  406. 'company_type'=> $customer['company_type']??'01', //类型01 企业,02 机关事业单位,03 个人, 04 其他
  407. 'remark'=>$param['remark'], //申请备注
  408. 'exam_remark'=>$param['exam_remark'], //审核备注
  409. 'ainv_fee'=>0,//已核销金额
  410. 'winv_fee'=>$invfee,//未核销金额
  411. 'status'=>1,// 带财务审核
  412. 'is_del'=>0,
  413. 'email'=>$param['email'],
  414. 'addtime'=>date('Y-m-d H:i:s'),
  415. 'updatetime'=>date('Y-m-d H:i:s')
  416. ];
  417. $invinfo=[
  418. 'buyer_title'=>$customer['invoice_title'],
  419. 'buyer_code'=>$customer['company_license'],
  420. 'buyer_addr'=>$customer['company_address'],
  421. 'buyer_mobile'=>$customer['mobile'],
  422. 'buyer_bank'=>$customer['bank_name'],
  423. 'buyer_bankNo'=>$customer['bankNo'],
  424. 'seller_title'=>$company['invoice_title'],
  425. 'seller_code'=>$company['company_license'],
  426. 'seller_addr'=>$company['company_address'],
  427. 'seller_mobile'=>$company['mobile'],
  428. 'seller_bank'=>$company['bank_name'],
  429. 'seller_bankNo'=>$company['bankNo'],
  430. 'invNo'=>$invNo,
  431. 'voider'=>$company['voider'],
  432. 'payee'=>$company['payee'],
  433. 'drawer'=>$company['drawer'],
  434. 'reviewer'=>$company['reviewer'],
  435. 'ownerPlace'=>$company['ownerPlace'],
  436. 'addtime'=>date('Y-m-d H:i:s')
  437. ];
  438. $this->model->startTrans();
  439. try{
  440. $assocSa=(new \app\admin\model\Assoc)->saveAll($assoc);
  441. if($assocSa->isEmpty()) throw new Exception("开票关联数据生成失败");
  442. $goodInv = (new \app\admin\model\InvoiceGood)->saveAll($invoiceGood);
  443. if($goodInv->isEmpty()) throw new Exception('开票商品明细数据生成失败');
  444. $qrdSave = (new \app\admin\model\QrdInfo)->saveAll($qrdinfo);
  445. if($qrdSave->isEmpty()) throw new Exception('销售单信息更新失败');
  446. $invoice = InvoicePool::create($inv);
  447. if($invoice->isEmpty()) throw new Exception('开票信息创建失败');
  448. $invoiceinf = InvoicePoolInfo::create($invinfo);
  449. if($invoiceinf->isEmpty()) throw new Exception('开票信息创建失败');
  450. $payIn = InvoicePay::create(["invNo"=>$invNo,"payNo"=>$param["payNo"]]);
  451. if($payIn->isEmpty()) throw new Exception('开票信息创建失败');
  452. $report =ReportCode::where(['qrdNo'=>array_column($param['orderArr'],'sequenceNo')])->select();
  453. if($report->isEmpty()==false)$report->update(["invNo"=>Db::raw("CONCAT(invNo,',','{$invNo}')")]);
  454. $this->model->commit();
  455. }catch (\Exception $exception){
  456. $this->model->rollback();
  457. $this->error($exception->getMessage());
  458. }
  459. $this->success("开票申请创建成功");
  460. }
  461. }