InvoiceItem.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <?php
  2. namespace app\admin\controller;
  3. use app\admin\model\InvoiceGood;
  4. use app\admin\model\InvoiceOrder;
  5. use app\admin\model\OrderCategory;
  6. use app\admin\model\PayInfo;
  7. use think\App;
  8. use think\facade\Db;use think\facade\Validate;
  9. class InvoiceItem extends Base{
  10. public function __construct(App $app) {
  11. # $this->novalidate = ["*"];
  12. parent::__construct($app);
  13. }
  14. //查询
  15. public function cgdListByPayNo(){
  16. $param = $this->request->param(["payNo"=>"","merge_code"=>"","inv_good_name"=>""],"post","trim");
  17. $where=[["a.status","=",1],["a.is_del","=",0]];
  18. if($param["payNo"]!=="") $where[]=["a.payNo","=",$param["payNo"]];
  19. if($param["merge_code"]!=="") $where[]=["c.merge_code","=",$param["merge_code"]];
  20. if($param["inv_good_name"]!=="") $where[]=["c.inv_good_name","like","%{$param["inv_good_name"]}%"];
  21. $list = PayInfo::alias('a')
  22. ->join('cgd_info b','a.cgdNo=b.sequenceNo',"left")
  23. ->join('order_category c','b.sequenceNo=c.code and b.goodNo=c.spuCode and c.order_type=2',"left")
  24. ->where($where)
  25. ->field("b.sequenceNo,b.goodNo,b.goodName,(b.goodNum-thNum) as goodNum,b.goodPrice,b.totalPrice,
  26. c.merge_code,c.cat_code,c.cat_name,c.short_name,c.tax,c.inv_good_name")
  27. ->select();
  28. $list->each(function (&$item){
  29. $item['balance_amount']= bcsub($item['totalPrice'],InvoiceOrder::getInvoiceOrderTotalFee($item['sequenceNo']),2);
  30. });
  31. $this->success('获取成功',$list);
  32. }
  33. //查询
  34. public function qrdListByInvNo(){
  35. $param = $this->request->param(["invNo"=>"","merge_code"=>"","inv_good_name"=>""],"post","trim");
  36. $where=[["a.goodNum",">",0],["a.is_del","=",0]];
  37. if($param["invNo"]!=="") $where[]=["a.invNo","=",$param["invNo"]];
  38. if($param["merge_code"]!=="") $where[]=["c.merge_code","=",$param["merge_code"]];
  39. if($param["inv_good_name"]!=="") $where[]=["c.inv_good_name","like","%{$param["inv_good_name"]}%"];
  40. $list= InvoiceGood::alias('a')
  41. ->join('qrd_info b','a.orderCode=b.sequenceNo','left')
  42. ->join('order_category c','b.sequenceNo=c.code and b.goodNo=c.spuCode and c.order_type=1','left')
  43. ->where($where)
  44. ->field("b.sequenceNo,b.goodNo,b.goodName,a.goodNum,a.goodPrice,a.totalPrice,
  45. c.merge_code,c.cat_code,c.cat_name,c.short_name,c.tax,c.inv_good_name")
  46. ->select();
  47. $list->each(function (&$item){
  48. $item['balance_amount']= bcsub($item['totalPrice'],InvoiceOrder::getInvoiceOrderTotalFee($item['sequenceNo']),2);
  49. });
  50. $this->success('获取成功',$list);
  51. }
  52. //添加发票明细对应关系
  53. public function create(){
  54. $param = $this->request->param(["itemId"=>"","orderArr"=>[]],"post","trim");
  55. $valid=Validate::rule([
  56. 'itemId|发票明细id' => 'require|number|gt:0',
  57. 'orderArr|订单信息' => 'require|array',
  58. ]);
  59. if(!$valid->check($param))$this->error($valid->getError());
  60. $valids=Validate::rule([
  61. 'code|订单号' => 'require|max:255',
  62. 'spuCode|商品编码' => 'require|max:255',
  63. 'good_name|商品名称' => 'require|max:255',
  64. 'num|数量' => 'require|float|gt:0',
  65. 'good_price|商品价格' => 'require|float|gt:0',
  66. 'total_amount|总金额' => 'require|float|gt:0',
  67. 'remark|备注' => 'max:255',
  68. ]);
  69. $item = \app\admin\model\InvoiceItem::where(['id'=>$param["itemId"]])->findOrEmpty();
  70. if($item->isEmpty())$this->error("发票明细不存在");
  71. $save=[];
  72. $amount = $item['balance_amount'];
  73. foreach ($param["orderArr"] as $k=>$v){
  74. if(!$valids->check($v))$this->error($valids->getError());
  75. $taxInfo = OrderCategory::where(['code'=>$v['code'],'spuCode'=>$v['spuCode']])->findOrEmpty();
  76. if($taxInfo->isEmpty())$this->error("商品编码{$v['spuCode']}税目信息不存在");
  77. $balance="0";
  78. if($amount<$v['total_amount']){
  79. $balance = bcsub($v['total_amount'],$amount,2);
  80. $amount="0";
  81. }else{
  82. $balance = "0";
  83. $amount = bcsub($amount,$v['total_amount'],2);
  84. }
  85. $diff=[];
  86. $tax_diff=1;
  87. $cat_diff=1;
  88. if(str_replace("%","",$item['tax'])!=$taxInfo['tax']){
  89. $diff["tax"] = [
  90. "inv_tax"=>str_replace('%','',$item['tax']),
  91. "order_tax"=>$taxInfo['tax'],
  92. ];
  93. $tax_diff=2;
  94. }
  95. if($item['cat_code']!=$taxInfo['merge_code']){
  96. $diff["cat_code"] = [
  97. "inv_cat_code"=>$item['cat_code'],
  98. "order_cat_code"=>$taxInfo['merge_code'],
  99. ];
  100. $cat_diff=2;
  101. }
  102. $save[]=[
  103. "itemId"=>$param["itemId"],
  104. "code"=>$v["code"],
  105. "spuCode"=>$v["spuCode"],
  106. "good_name"=>$v['good_name'],
  107. "num"=>$v["num"],
  108. "good_price"=>$v["good_price"],
  109. "total_amount"=>$v["total_amount"],
  110. "tax_diff"=> $tax_diff,
  111. "cat_diff"=>$cat_diff,
  112. "balance_amount"=>$balance,
  113. "diff_info"=>$diff,
  114. "status"=>$balance>0?2:1,
  115. "remark"=>$v["remark"],
  116. "apply_id"=>$this->uid,
  117. "apply_name"=>$this->uname
  118. ];
  119. }
  120. $item->startTrans();
  121. try{
  122. $res=(new \app\admin\model\InvoiceOrder)->saveAll($save);
  123. if($res){
  124. $item->balance_amount = $amount;
  125. $item->status = $amount>0?2:1; //已关联数据 $amont=0 2 还有余额则为1
  126. $item->save();
  127. }else throw new \Exception("添加失败");
  128. $item->commit();
  129. }catch (\Exception $e){
  130. $item->rollback();
  131. $this->error($e->getMessage());
  132. }
  133. $this->success('添加成功');
  134. }
  135. //删除发票明细对应关系
  136. public function delete(){
  137. $param = $this->request->param(["id"=>""],"post","trim");
  138. $valid=Validate::rule([
  139. 'id|发票明细对应id' => 'require|number|gt:0',
  140. ]);
  141. if(!$valid->check($param))$this->error($valid->getError());
  142. $info = \app\admin\model\InvoiceOrder::where(['id'=>$param["id"]])->findOrEmpty();
  143. if($info->isEmpty())$this->error("发票明细对应关系不存在");
  144. $item = \app\admin\model\InvoiceItem::where(['id'=>$info['itemId']])->findOrEmpty();
  145. if($item->isEmpty())$this->error("发票明细不存在");
  146. $info->startTrans();
  147. try{
  148. $res = $info->delete();
  149. if($res){
  150. $count = \app\admin\model\InvoiceOrder::where(['itemId'=>$info['itemId']])->count();
  151. $item->balance_amount = bcadd($item['balance_amount'],bcsub($info['total_amount'],$info['balance_amount'],2),2);
  152. $item->status = ($count==0) ? 0 : ($item->balance_amount==$item->total_amount?0:($item->balance_amount>0?2:1));
  153. $item->save();
  154. }else throw new \Exception("删除失败");
  155. $info->commit();
  156. }catch (\Exception $e){
  157. $info->rollback();
  158. }
  159. $this->success('删除成功');
  160. }
  161. public function getListByCode(){
  162. $param=$this->request->param(["code"=>"","status"=>"","size"=>100]);
  163. $where=[];
  164. if($param["code"]!=="") $where[]=["invoiceCode","=",$param["code"]];
  165. if($param["status"]!=="") $where[]=["status","=",$param["status"]];
  166. $list= \app\admin\model\InvoiceItem::with(["OrderInfo"])
  167. ->where($where)
  168. ->limit($param["size"])
  169. ->select();
  170. $this->success('获取成功',$list);
  171. }
  172. public function importOrder(){
  173. $param=$this->request->param([ "order_type"=>"","list"=>[]],"post","trim");
  174. $valid = Validate::rule([
  175. 'order_type|订单类型' => 'require|in:1,2',
  176. 'list|发票明细' => 'require|array',
  177. ]);
  178. if(!$valid->check($param))$this->error($valid->getError());
  179. $listValid = Validate::rule([
  180. "itemId|发票明细ID"=>'require|number|gt:0',
  181. 'code|订单编码' => 'require|max:20',
  182. 'num|数量' => 'require|float|gt:0',
  183. 'good_price|商品价格' => 'require|float|gt:0',
  184. 'total_amount|总金额' => 'require|float|gt:0',
  185. 'remark|备注' =>'max:255',
  186. ]);
  187. $itemArr= \app\admin\model\InvoiceItem::whereIn('id',array_column($param['list'],"itemId"))->column("id,invoiceCode,balance_amount,cat_code,tax","id");
  188. $orderInfo=[];
  189. $orderItem=[];
  190. foreach($param["list"] as $v){
  191. if(!$listValid->check($v))$this->error($listValid->getError());
  192. if(!isset($itemArr[$v['itemId']]))$this->error("发票明细不存在");
  193. if(!isset($orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v["code"]])){
  194. $orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v['code']]= \app\admin\model\InvoiceOrder::getOrderInfo( $itemArr[$v['itemId']]['invoiceCode'],$v['code'],$param['order_type']);
  195. }
  196. if($orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v['code']]->isEmpty())$this->error("发票{$itemArr[$v['itemId']]['invoiceCode']}关联订单{$v['code']}信息不存在");
  197. if($orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v['code']]['balance_amount']<$v['total_amount'])$this->error("{$v["code"]}订单金额不足");
  198. if($orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v['code']]['merge_code']=="")$this->error("{$v["code"]}订单税目信息不存在");
  199. if($itemArr[$v['itemId']]['balance_amount']<$v['total_amount']){
  200. $balance = bcsub($v['total_amount'],$itemArr[$v['itemId']]['balance_amount'],2);
  201. $itemArr[$v['itemId']]['balance_amount']='0';
  202. }else{
  203. $balance = '0';
  204. $itemArr[$v['itemId']]['balance_amount'] = bcsub($itemArr[$v['itemId']]['balance_amount'],$v['total_amount'],2);
  205. }
  206. $orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v['code']]['balance_amount'] =
  207. bcsub($orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v['code']]['balance_amount'],bcsub($v['total_amount'],$balance,2),2);
  208. $tax = $orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v['code']]['tax'];
  209. $merge_code = $orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v['code']]['merge_code'];
  210. $diff=[];
  211. $tax_diff=1;
  212. $cat_diff=1;
  213. if(str_replace('%','',$itemArr[$v['itemId']]['tax'])!=$tax ){
  214. $diff['tax'] = [
  215. 'inv_tax'=>str_replace('%','',$itemArr[$v['itemId']]['tax']),
  216. 'order_tax'=>$tax ,
  217. ];
  218. $tax_diff=2;
  219. }
  220. if($itemArr[$v['itemId']]['cat_code']!=$merge_code){
  221. $diff['cat_code'] = [
  222. 'inv_cat_code'=>$itemArr[$v['itemId']]['cat_code'],
  223. 'order_cat_code'=>$merge_code,
  224. ];
  225. $cat_diff=2;
  226. }
  227. $itemArr[$v['itemId']]['status'] = ($itemArr[$v['itemId']]['balance_amount']>0?2:1);
  228. $orderItem[]=[
  229. 'itemId'=>$v['itemId'],
  230. 'code'=>$v['code'],
  231. 'spuCode'=>$orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v['code']]['goodNo'],
  232. 'good_name'=>$orderInfo[$itemArr[$v['itemId']]['invoiceCode'].$v['code']]['goodName'],
  233. 'num'=>$v['num'],
  234. 'good_price'=>$v['good_price'],
  235. 'total_amount'=>$v['total_amount'],
  236. 'tax_diff'=> $tax_diff,
  237. 'cat_diff'=>$cat_diff,
  238. 'balance_amount'=>$balance,
  239. 'diff_info'=>$diff,
  240. 'status'=>$balance>0?2:1,
  241. 'remark'=>$v['remark'],
  242. 'apply_id'=>$this->uid,
  243. 'apply_name'=>$this->uname
  244. ];
  245. }
  246. $orderItemModel = new \app\admin\model\InvoiceItem();
  247. $orderItemModel->startTrans();
  248. try{
  249. $num=$orderItemModel->saveAll(array_values($orderItem));
  250. if($num>0){
  251. (new InvoiceOrder())->saveAll($orderItem);
  252. }else throw new \Exception("导入失败");
  253. }catch (\Exception $e){
  254. $orderItemModel->rollback();
  255. $this->error($e->getMessage());
  256. }
  257. $orderItemModel->commit();
  258. $this->success("导入成功");
  259. }
  260. }