MerchantReconciliationRepository.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <?php
  2. namespace app\common\repositories\store\order;
  3. use app\common\model\store\order\MerchantReconciliationOrder;
  4. use app\common\model\system\merchant\Merchant;
  5. use app\common\repositories\BaseRepository;
  6. use app\common\dao\store\order\MerchantReconciliationDao as dao;
  7. use app\common\repositories\store\order\StoreOrderRepository;
  8. use app\common\repositories\store\order\StoreRefundOrderRepository;
  9. use app\common\repositories\system\admin\AdminRepository;
  10. use app\common\repositories\system\merchant\FinancialRecordRepository;
  11. use app\common\repositories\system\merchant\MerchantRepository;
  12. use ln\services\SwooleTaskService;
  13. use think\exception\ValidateException;
  14. use think\facade\Db;
  15. use FormBuilder\Factory\Elm;
  16. use think\facade\Route;
  17. class MerchantReconciliationRepository extends BaseRepository
  18. {
  19. public function __construct(dao $dao)
  20. {
  21. $this->dao = $dao;
  22. }
  23. public function getWhereCountById($id)
  24. {
  25. $where = ['reconciliation_id' => $id,'status' => 2];
  26. return $this->dao->getWhereCount($where) > 0 ;
  27. }
  28. public function merWhereCountById($id,$merId)
  29. {
  30. $where = ['reconciliation_id' => $id,'mer_id' => $merId,'is_accounts' => 0,'status' => 0];
  31. return ($this->dao->getWhereCount($where) > 0) ;
  32. }
  33. /**
  34. * TODO 列表
  35. * @param $where
  36. * @param $page
  37. * @param $limit
  38. * @return array
  39. * @author Qinii
  40. * @day 2020-06-15
  41. */
  42. public function getList($where,$page,$limit)
  43. {
  44. $query = $this->dao->search($where)->with([
  45. 'merchant' => function($query){
  46. $query->field('mer_id,mer_name');
  47. },
  48. 'admin' =>function($query){
  49. $query->field('admin_id,real_name');
  50. }]);
  51. $count = $query->count();
  52. $list = $query->page($page,$limit)->select()->append(['charge'])->each(function($item){
  53. if($item->type == 1) return $item->price = '-'.$item->price;
  54. });
  55. return compact('count','list');
  56. }
  57. /**
  58. * TODO 创建对账单
  59. * @param $id
  60. * @param $data
  61. * @author Qinii
  62. * @day 2020-06-15
  63. */
  64. public function create(int $id, array $data)
  65. {
  66. $orderMake = app()->make(StoreOrderRepository::class);
  67. $refundMake = app()->make(StoreRefundOrderRepository::class);
  68. $bank = merchantConfig($id,'bank');
  69. $bank_name = merchantConfig($id,'bank_name');
  70. $bank_number = merchantConfig($id,'bank_number');
  71. $bank_address = merchantConfig($id,'bank_address');
  72. if( !$bank || !$bank_name || !$bank_number || !$bank_address )
  73. throw new ValidateException('商户未填写银行卡信息');
  74. $order_ids = $data['order_ids'];
  75. $refund_order_ids = $data['refund_order_ids'];
  76. if($data['order_type']) { //全选
  77. $order_ids = $orderMake->search([
  78. 'date' => $data['date'],
  79. 'mer_id' => $id,
  80. 'reconciliation_type' => 0,
  81. 'paid' => 1,
  82. 'order_id'
  83. ], null
  84. )->whereNotIn('order_id', $data['order_out_ids'])->column('order_id');
  85. }
  86. if($data['refund_type']){ //全选
  87. $refund_order_ids = $refundMake->search([
  88. 'date' => $data['date'],
  89. 'mer_id' => $id,
  90. 'reconciliation_type' => 0,
  91. 'status' => 3
  92. ])->whereNotIn('refund_order_id',$data['refund_out_ids'])->column('refund_order_id');
  93. }
  94. if(is_array($order_ids) && (count($order_ids) < 1) && is_array($refund_order_ids) && (count($refund_order_ids) < 1)){
  95. throw new ValidateException('没有数据可对账');
  96. }
  97. $compute = $this->compute($id,$order_ids,$refund_order_ids);
  98. $createData = [
  99. 'status' => 0,
  100. 'mer_id' => $id,
  101. 'is_accounts' => 0,
  102. 'mer_admin_id' => 0,
  103. 'bank' => $bank,
  104. 'bank_name' => $bank_name,
  105. 'bank_number' => $bank_number,
  106. 'bank_address' => $bank_address,
  107. 'admin_id' => $data['adminId'],
  108. 'price' => round($compute['price'],2),
  109. 'order_price' => round($compute['order_price'],2),
  110. 'refund_price' => round($compute['refund_price'],2),
  111. //'refund_rate' => round($compute['refund_rate'],2),
  112. 'order_rate' => round($compute['order_rate'],2),
  113. 'order_extension' => round($compute['order_extension'],2),
  114. 'refund_extension' => round($compute['refund_extension'],2),
  115. ];
  116. Db::transaction(function()use($order_ids,$refund_order_ids,$orderMake,$refundMake,$createData){
  117. $res = $this->dao->create($createData);
  118. $orderMake->updates($order_ids,['reconciliation_id' => $res['reconciliation_id']]);
  119. $refundMake->updates($refund_order_ids,['reconciliation_id' => $res['reconciliation_id']]);
  120. $this->reconciliationOrder($order_ids,$refund_order_ids,$res['reconciliation_id']);
  121. SwooleTaskService::merchant('notice', [
  122. 'type' => 'accoubts',
  123. 'data'=>[
  124. 'title' => '新对账',
  125. 'message' => '您有一条新的对账单',
  126. 'id' => $res['reconciliation_id']
  127. ]
  128. ], $createData['mer_id']);
  129. });
  130. }
  131. /**
  132. * TODO 计算对账单金额
  133. * @param $merId
  134. * @param $order_ids
  135. * @param $refund_order_ids
  136. * @return array
  137. * @author Qinii
  138. * @day 2020-06-23
  139. */
  140. public function compute($merId,$order_ids,$refund_order_ids)
  141. {
  142. $order_price = $refund_price = $order_extension = $refund_extension = $order_rate = $refund_rate =0;
  143. $orderMake = app()->make(StoreOrderRepository::class);
  144. $refundMake = app()->make(StoreRefundOrderRepository::class);
  145. foreach($order_ids as $item){
  146. if(!$order = $orderMake->getWhere(['order_id' => $item,'mer_id' => $merId,'paid' => 1]))
  147. throw new ValidateException('订单信息不存在或状态错误');
  148. if($order['reconciliation_id']) throw new ValidateException('订单重复提交');
  149. //(实付金额 - 一级佣金 - 二级佣金) * 抽成
  150. $commission_rate = ($order['commission_rate'] / 100);
  151. //佣金
  152. $_order_extension = bcadd($order['extension_one'],$order['extension_two'],3);
  153. $order_extension = bcadd($order_extension,$_order_extension,3);
  154. //手续费 = (实付金额 - 一级佣金 - 二级佣金) * 比例
  155. $_order_rate = bcmul(bcsub($order['pay_price'],$_order_extension,3),$commission_rate,3);
  156. $order_rate = bcadd($order_rate,$_order_rate,3);
  157. //金额
  158. $_order_price = bcsub(bcsub($order['pay_price'],$_order_extension,3),$_order_rate,3);
  159. $order_price = bcadd($order_price,$_order_price,3);
  160. }
  161. foreach($refund_order_ids as $item){
  162. if(!$refundOrder = $refundMake->getWhere(['refund_order_id' => $item,'mer_id' => $merId,'status' => 3],'*',['order']))
  163. throw new ValidateException('退款订单信息不存在或状态错误');
  164. if($refundOrder['reconciliation_id']) throw new ValidateException('退款订单重复提交');
  165. //退款金额 + 一级佣金 + 二级佣金
  166. $refund_commission_rate = ($refundOrder['order']['commission_rate'] / 100);
  167. //佣金
  168. $_refund_extension = bcadd($refundOrder['extension_one'],$refundOrder['extension_two'],3);
  169. $refund_extension = bcadd($refund_extension,$_refund_extension,3);
  170. //手续费
  171. // $_refund_rate = bcmul(bcsub($refundOrder['refund_price'],$_refund_extension,3),$refund_commission_rate,3);
  172. // $refund_rate = bcadd($refund_rate,$_refund_rate,3);
  173. //金额
  174. $_refund_price = bcadd($refundOrder['refund_price'],$_refund_extension,3);
  175. $refund_price = bcadd($refund_price,$_refund_price,3);
  176. }
  177. $price = bcsub($order_price,$refund_price,3);
  178. return compact('price','refund_price','order_extension','refund_extension','order_price','order_rate');
  179. }
  180. /**
  181. * TODO
  182. * @param $order_ids
  183. * @param $refund_ids
  184. * @param $reconciliation_id
  185. * @return mixed
  186. * @author Qinii
  187. * @day 2020-06-23
  188. */
  189. public function reconciliationOrder($order_ids,$refund_ids,$reconciliation_id)
  190. {
  191. $data = [];
  192. foreach ($order_ids as $item){
  193. $data[] = [
  194. 'order_id' => $item,
  195. 'reconciliation_id' => $reconciliation_id,
  196. 'type' => 0,
  197. ];
  198. }
  199. foreach ($refund_ids as $item) {
  200. $data[] = [
  201. 'order_id' => $item,
  202. 'reconciliation_id' => $reconciliation_id,
  203. 'type' => 1,
  204. ];
  205. }
  206. return app()->make(MerchantReconciliationOrderRepository::class)->insertAll($data);
  207. }
  208. /**
  209. * TODO 修改状态
  210. * @param $id
  211. * @param $data
  212. * @param $type
  213. * @author Qinii
  214. * @day 2020-06-15
  215. */
  216. public function switchStatus($id,$data)
  217. {
  218. Db::transaction(function()use($id,$data){
  219. if(isset($data['status']) && $data['status'] == 1){
  220. app()->make(StoreRefundOrderRepository::class)->reconciliationUpdate($id);
  221. app()->make(StoreOrderRepository::class)->reconciliationUpdate($id);
  222. }
  223. $this->dao->update($id,$data);
  224. });
  225. $res = $this->dao->get($id);
  226. $mer = app()->make(MerchantRepository::class)->get($res['mer_id']);
  227. if(isset($data['is_accounts']) && $data['is_accounts']){
  228. // $make = app()->make(FinancialRecordRepository::class);
  229. //
  230. // $make->dec([
  231. // 'order_id' => $id,
  232. // 'order_sn' => $id,
  233. // 'user_info' => $mer['mer_name'],
  234. // 'user_id' => $res['mer_id'],
  235. // 'financial_type' => 'sys_accoubts',
  236. // 'number' => $res->price,
  237. // ],0);
  238. //
  239. // $make->inc([
  240. // 'order_id' => $id,
  241. // 'order_sn' => $id,
  242. // 'user_info' => '总平台',
  243. // 'user_id' => 0,
  244. // 'financial_type' => 'mer_accoubts',
  245. // 'number' => $res->price,
  246. // ],$res->mer_id);
  247. SwooleTaskService::merchant('notice', [
  248. 'type' => 'accoubts',
  249. 'data'=>[
  250. 'title' => '新对账打款',
  251. 'message' => '您有一条新对账打款通知',
  252. 'id' => $id
  253. ]
  254. ], $res['mer_id']);
  255. }
  256. }
  257. public function markForm($id)
  258. {
  259. $data = $this->dao->get($id);
  260. $form = Elm::createForm(Route::buildUrl('merchantReconciliationMark', ['id' => $id])->build());
  261. $form->setRule([
  262. Elm::text('mark', '备注',$data['mark'])->required(),
  263. ]);
  264. return $form->setTitle('修改备注');
  265. }
  266. public function adminMarkForm($id)
  267. {
  268. $data = $this->dao->get($id);
  269. $form = Elm::createForm(Route::buildUrl('systemMerchantReconciliationMark', ['id' => $id])->build());
  270. $form->setRule([
  271. Elm::text('admin_mark', '备注',$data['admin_mark'])->required(),
  272. ]);
  273. return $form->setTitle('修改备注');
  274. }
  275. }