InvoiceItem.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. namespace app\admin\controller;
  3. use app\admin\model\InvoiceGood;
  4. use app\admin\model\InvoiceOrder;use app\admin\model\OrderCategory;
  5. use app\admin\model\PayInfo;
  6. use think\App;
  7. use think\facade\Validate;
  8. class InvoiceItem extends Base{
  9. public function __construct(App $app) {
  10. $this->novalidate = ["*"];
  11. parent::__construct($app);
  12. }
  13. //查询
  14. public function cgdListByPayNo(){
  15. $param = $this->request->param(["payNo"=>"","merge_code"=>"","inv_good_name"=>""],"post","trim");
  16. $where=[["a.status","=",1],["a.is_del","=",0]];
  17. if($param["payNo"]!=="") $where[]=["a.payNo","=",$param["payNo"]];
  18. if($param["merge_code"]!=="") $where[]=["c.merge_code","=",$param["merge_code"]];
  19. if($param["inv_good_name"]!=="") $where[]=["c.inv_good_name","like","%{$param["inv_good_name"]}%"];
  20. $list = PayInfo::alias('a')
  21. ->join('cgd_info b','a.cgdNo=b.sequenceNo',"left")
  22. ->join('order_category c','b.sequenceNo=c.code and b.goodNo=c.spuCode and c.order_type=2',"left")
  23. ->where($where)
  24. ->field("b.sequenceNo,b.goodNo,b.goodName,(b.goodNum-thNum) as goodNum,b.goodPrice,b.totalPrice,
  25. c.merge_code,c.cat_code,c.cat_name,c.short_name,c.tax,c.inv_good_name")
  26. ->select();
  27. $list->each(function (&$item){
  28. $item['balance_amount']= bcsub($item['totalPrice'],InvoiceOrder::getInvoiceOrderTotalFee($item['sequenceNo']),2);
  29. });
  30. $this->success('获取成功',$list);
  31. }
  32. //查询
  33. public function qrdListByInvNo(){
  34. $param = $this->request->param(["invNo"=>"","merge_code"=>"","inv_good_name"=>""],"post","trim");
  35. $where=[["a.goodNum",">",0],["a.is_del","=",0]];
  36. if($param["invNo"]!=="") $where[]=["a.invNo","=",$param["invNo"]];
  37. if($param["merge_code"]!=="") $where[]=["c.merge_code","=",$param["merge_code"]];
  38. if($param["inv_good_name"]!=="") $where[]=["c.inv_good_name","like","%{$param["inv_good_name"]}%"];
  39. $list= InvoiceGood::alias('a')
  40. ->join('qrd_info b','a.orderCode=b.sequenceNo','left')
  41. ->join('order_category c','b.sequenceNo=c.code and b.goodNo=c.spuCode and c.order_type=1','left')
  42. ->where($where)
  43. ->field("b.sequenceNo,b.goodNo,b.goodName,a.goodNum,a.goodPrice,a.totalPrice,
  44. c.merge_code,c.cat_code,c.cat_name,c.short_name,c.tax,c.inv_good_name")
  45. ->select();
  46. $list->each(function (&$item){
  47. $item['balance_amount']= bcsub($item['totalPrice'],InvoiceOrder::getInvoiceOrderTotalFee($item['sequenceNo']),2);
  48. });
  49. $this->success('获取成功',$list);
  50. }
  51. //添加发票明细对应关系
  52. public function create(){
  53. $param = $this->request->param(["itemId"=>"","orderArr"=>[]],"post","trim");
  54. $valid=Validate::rule([
  55. 'itemId|发票明细id' => 'require|number|gt:0',
  56. 'orderArr|订单信息' => 'require|array',
  57. ]);
  58. if(!$valid->check($param))$this->error($valid->getError());
  59. $valids=Validate::rule([
  60. 'code|订单号' => 'require|max:255',
  61. 'spuCode|商品编码' => 'require|max:255',
  62. 'good_name|商品名称' => 'require|max:255',
  63. 'num|数量' => 'require|float|gt:0',
  64. 'good_price|商品价格' => 'require|float|gt:0',
  65. 'total_amount|总金额' => 'require|float|gt:0',
  66. 'remark|备注' => 'max:255',
  67. ]);
  68. $item = \app\admin\model\InvoiceItem::where(['id'=>$param["itemId"]])->findOrEmpty();
  69. if($item->isEmpty())$this->error("发票明细不存在");
  70. $save=[];
  71. $amount = $item['balance_amount'];
  72. foreach ($param["orderArr"] as $k=>$v){
  73. if(!$valids->check($v))$this->error($valids->getError());
  74. $taxInfo = OrderCategory::where(['code'=>$v['code'],'spuCode'=>$v['spuCode']])->findOrEmpty();
  75. if($taxInfo->isEmpty())$this->error("商品编码{$v['spuCode']}税目信息不存在");
  76. $balance="0";
  77. if($amount<$v['total_amount']){
  78. $balance = bcsub($v['total_amount'],$amount,2);
  79. $amount="0";
  80. }else{
  81. $balance = "0";
  82. $amount = bcsub($amount,$v['total_amount'],2);
  83. }
  84. $diff=[];
  85. $tax_diff=1;
  86. $cat_diff=1;
  87. if(str_replace("%","",$item['tax'])!=$taxInfo['tax']){
  88. $diff["tax"] = [
  89. "inv_tax"=>str_replace('%','',$item['tax']),
  90. "order_tax"=>$taxInfo['tax'],
  91. ];
  92. $tax_diff=2;
  93. }
  94. if($item['cat_code']!=$taxInfo['merge_code']){
  95. $diff["cat_code"] = [
  96. "inv_cat_code"=>$item['cat_code'],
  97. "order_cat_code"=>$taxInfo['merge_code'],
  98. ];
  99. $cat_diff=2;
  100. }
  101. $save[]=[
  102. "itemId"=>$param["itemId"],
  103. "code"=>$v["code"],
  104. "spuCode"=>$v["spuCode"],
  105. "good_name"=>$v['good_name'],
  106. "num"=>$v["num"],
  107. "good_price"=>$v["good_price"],
  108. "total_amount"=>$v["total_amount"],
  109. "tax_diff"=> $tax_diff,
  110. "cat_diff"=>$cat_diff,
  111. "balance_amount"=>$balance,
  112. "diff_info"=>$diff,
  113. "status"=>$balance>0?2:1,
  114. "remark"=>$v["remark"],
  115. "apply_id"=>$this->uid,
  116. "apply_name"=>$this->uname
  117. ];
  118. }
  119. $item->startTrans();
  120. try{
  121. $res=(new \app\admin\model\InvoiceOrder)->saveAll($save);
  122. if($res){
  123. $item->balance_amount = $amount;
  124. $item->status = $amount>0?2:1; //已关联数据 $amont=0 2 还有余额则为1
  125. $item->save();
  126. }else throw new \Exception("添加失败");
  127. $item->commit();
  128. }catch (\Exception $e){
  129. $item->rollback();
  130. $this->error($e->getMessage());
  131. }
  132. $this->success('添加成功');
  133. }
  134. //删除发票明细对应关系
  135. public function delete(){
  136. $param = $this->request->param(["id"=>""],"post","trim");
  137. $valid=Validate::rule([
  138. 'id|发票明细对应id' => 'require|number|gt:0',
  139. ]);
  140. if(!$valid->check($param))$this->error($valid->getError());
  141. $info = \app\admin\model\InvoiceOrder::where(['id'=>$param["id"]])->findOrEmpty();
  142. if($info->isEmpty())$this->error("发票明细对应关系不存在");
  143. $item = \app\admin\model\InvoiceItem::where(['id'=>$info['itemId']])->findOrEmpty();
  144. if($item->isEmpty())$this->error("发票明细不存在");
  145. $info->startTrans();
  146. try{
  147. $res = $info->delete();
  148. if($res){
  149. $count = \app\admin\model\InvoiceOrder::where(['itemId'=>$info['itemId']])->count();
  150. $item->balance_amount = bcadd($item['balance_amount'],bcsub($info['total_amount'],$info['balance_amount'],2),2);
  151. $item->status = ($count==0) ? 0 : ($item->balance_amount==$item->total_amount?0:($item->balance_amount>0?2:1));
  152. $item->save();
  153. }else throw new \Exception("删除失败");
  154. $info->commit();
  155. }catch (\Exception $e){
  156. $info->rollback();
  157. }
  158. $this->success('删除成功');
  159. }
  160. public function getListByCode(){
  161. $param=$this->request->param(["code"=>"","status"=>"","size"=>100]);
  162. $where=[];
  163. if($param["code"]!=="") $where[]=["invoiceCode","=",$param["code"]];
  164. if($param["status"]!=="") $where[]=["status","=",$param["status"]];
  165. $list= \app\admin\model\InvoiceItem::with(["OrderInfo"])
  166. ->where($where)
  167. ->limit($param["size"])
  168. ->select();
  169. $this->success('获取成功',$list);
  170. }
  171. }