InvoiceItem.php 14 KB

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