Vrorder.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. <?php
  2. namespace app\common\model;
  3. use think\facade\Db;
  4. use think\facade\Log;
  5. /**
  6. * ============================================================================
  7. * DSMall多用户商城
  8. * ============================================================================
  9. * 版权所有 2014-2028 长沙德尚网络科技有限公司,并保留所有权利。
  10. * 网站地址: http://www.csdeshang.com
  11. * ----------------------------------------------------------------------------
  12. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
  13. * 不允许对程序代码以任何形式任何目的的再发布。
  14. * ============================================================================
  15. * 数据层模型
  16. */
  17. class Vrorder extends BaseModel
  18. {
  19. public $page_info;
  20. /**
  21. * 取单条订单信息
  22. * @access public
  23. * @author csdeshang
  24. * @param type $condition 条件
  25. * @param type $fields 字段
  26. * @return type
  27. */
  28. public function getVrorderInfo($condition = [], $fields = '*')
  29. {
  30. $order_info = Db::name('vrorder')->field($fields)->where($condition)->find();
  31. if (empty($order_info)) {
  32. return [];
  33. }
  34. if (isset($order_info['order_state'])) {
  35. $state_desc = $this->_vrorderState($order_info['order_state']);
  36. $order_info['state_desc'] = $state_desc[0];
  37. $order_info['order_state_text'] = $state_desc[1];
  38. }
  39. if (isset($order_info['payment_code'])) {
  40. $order_info['payment_name'] = get_order_payment_name($order_info['payment_code']);
  41. }
  42. return $order_info;
  43. }
  44. /**
  45. * 新增订单
  46. * @access public
  47. * @author csdeshang
  48. * @param type $data 参数内容
  49. * @return type
  50. */
  51. public function addVrorder($data)
  52. {
  53. return Db::name('vrorder')->insertGetId($data);
  54. }
  55. /**
  56. * 新增订单
  57. * @access public
  58. * @author csdeshang
  59. * @param type $order_info 订单信息
  60. * @return boolean
  61. */
  62. public function addVrorderCode($order_info)
  63. {
  64. $vrc_num = Db::name('vrordercode')->where(['order_id' => $order_info['order_id']])->count();
  65. if (!empty($vrc_num) && intval($vrc_num) >= intval($order_info['goods_num']))
  66. return false;
  67. if (empty($order_info))
  68. return false;
  69. if ($order_info['goods_num'] == 0) {
  70. return false;
  71. }
  72. //均摊后每个兑换码支付金额
  73. $each_pay_price = ds_price_format($order_info['order_amount'] / $order_info['goods_num']);
  74. $code_list = [];
  75. if (empty($order_info['vr_code'])) {
  76. //取得店铺兑换码前缀
  77. $store_info = model('store')->getStoreInfoByID($order_info['store_id']);
  78. $virtual_code_perfix = $store_info['store_vrcode_prefix'] ? $store_info['store_vrcode_prefix'] : rand(100, 999);
  79. $code_list = $this->_makeVrordercode($virtual_code_perfix, $order_info['store_id'], $order_info['buyer_id'], $order_info['goods_num']);
  80. } else {
  81. $checkHost = config('ds_config.do_net_card_url');
  82. $url = $checkHost . '/api/coupon.code/load';
  83. Log::info("绑定虚拟订单卡号:".\think\facade\Request::controller().'-'.\think\facade\Request::action());
  84. $result = common_curl($url,
  85. [
  86. 'userId' => $order_info['buyer_id'],
  87. 'coupon_no' => $order_info['vr_code'],
  88. "quantity" => $order_info['goods_num'],
  89. ]
  90. );
  91. if ($result['code']) {
  92. Log::info('券码获取失败' . json_encode($result) . ' url:' . $url . '参数:' . json_encode([
  93. 'userId' => $order_info['buyer_id'],
  94. 'coupon_no' => $order_info['vr_code'],
  95. "quantity" => $order_info['goods_num'],
  96. ]));
  97. ds_json_encode(10001, $result['msg']);
  98. }
  99. $code_list = $result['data'];
  100. if (empty($code_list)) {
  101. ds_json_encode(10001, '券码获取失败');
  102. }
  103. }
  104. $code_type = ['no' => 1, 'secret' => 2, 'qrcode' => 3, 'barcode' => 4, 'url' => 5];
  105. // var_dump($code_list);exit();
  106. foreach ($code_list as $key => $value) {
  107. if (!isset($value['type'])) {
  108. $value['type'] = 'no';
  109. }
  110. $order_code[$key]['order_id'] = $order_info['order_id'];
  111. $order_code[$key]['store_id'] = $order_info['store_id'];
  112. $order_code[$key]['buyer_id'] = $order_info['buyer_id'];
  113. $order_code[$key]['coupon_cname'] = $value['cname'] ?? '';
  114. $vr_code = '';
  115. if (isset($value['code'])) {
  116. $vr_code = $value['code'];
  117. } else if (isset($value['no'])) {
  118. $vr_code = $value['no'];
  119. }
  120. $order_code[$key]['vr_code'] = $vr_code;
  121. $order_code[$key]['vr_secret'] = isset($value['secret']) ? $value['secret'] : '';
  122. $order_code[$key]['vr_qrcode'] = isset($value['qrcode']) ? $value['qrcode'] : '';
  123. $order_code[$key]['vr_barcode'] = isset($value['barcode']) ? $value['barcode'] : '';
  124. $order_code[$key]['vr_url'] = isset($value['url']) ? $value['url'] : '';
  125. $order_code[$key]['type'] = isset($code_type[$value['type']]) ? $code_type[$value['type']] : 1;
  126. $order_code[$key]['pay_price'] = $each_pay_price;
  127. $order_code[$key]['vr_start_time'] = isset($value['start_time']) ? $value['start_time'] : '';
  128. $order_code[$key]['vr_end_time'] = isset($value['end_time']) ? $value['end_time'] : '';
  129. $order_code[$key]['vr_indate'] = $order_info['vr_indate'];
  130. $order_code[$key]['vr_invalid_refund'] = $order_info['vr_invalid_refund'];
  131. }
  132. //将因舍出小数部分出现的差值补到最后一个商品的实际成交价中
  133. // $diff_amount = $order_info['order_amount'] - $each_pay_price * $order_info['goods_num'];
  134. // $order_code[$i-1]['pay_price'] += $diff_amount;
  135. return Db::name('vrordercode')->insertAll($order_code);
  136. }
  137. /**
  138. * 更改订单信息
  139. * @access public
  140. * @author csdeshang
  141. * @param array $data 数据
  142. * @param array $condition 条件
  143. * @param int $limit 限制
  144. * @return type
  145. */
  146. public function editVrorder($data, $condition, $limit = 0)
  147. {
  148. return Db::name('vrorder')->where($condition)->limit($limit)->update($data);
  149. }
  150. /**
  151. * 更新兑换码
  152. * @access public
  153. * @author csdeshang
  154. * @param type $data 数据
  155. * @param type $condition 条件
  156. * @return type
  157. */
  158. public function editVrorderCode($data, $condition)
  159. {
  160. return Db::name('vrordercode')->where($condition)->update($data);
  161. }
  162. /**
  163. * 兑换码列表
  164. * @access public
  165. * @author csdeshang
  166. * @param type $condition 条件
  167. * @param type $fields 字段
  168. * @param type $pagesize 分页
  169. * @param type $order 排序
  170. * @return type
  171. */
  172. public function getVrordercodeList($condition = [], $fields = '*', $pagesize = '', $order = 'rec_id desc')
  173. {
  174. if ($pagesize) {
  175. $res = Db::name('vrordercode')->field($fields)->where($condition)->order($order)->paginate(['list_rows' => $pagesize, 'query' => request()->param()], false);
  176. $this->page_info = $res;
  177. return $res->items();
  178. } else {
  179. return Db::name('vrordercode')->field($fields)->where($condition)->order($order)->select()->toArray();
  180. }
  181. }
  182. /**
  183. * 兑换码列表
  184. * @access public
  185. * @author csdeshang
  186. * @param type $condition 条件
  187. * @param type $fields 字段
  188. * @return type
  189. */
  190. public function getCodeUnusedList($condition = [], $fields = '*')
  191. {
  192. $condition[] = ['vr_state', '=', 0];
  193. $condition[] = ['refund_lock', '=', 0];
  194. return $this->getVrordercodeList($condition, $fields);
  195. }
  196. /**
  197. * 根据虚拟订单取没有使用的兑换码列表
  198. * @access public
  199. * @author csdeshang
  200. * @param type $order_list 订单列表
  201. * @return type
  202. */
  203. public function getCodeRefundList($order_list = [])
  204. {
  205. if (!empty($order_list) && is_array($order_list)) {
  206. $order_ids = []; //订单编号数组
  207. foreach ($order_list as $key => $value) {
  208. $order_id = $value['order_id'];
  209. $order_ids[$order_id] = $key;
  210. }
  211. $condition = [];
  212. $condition[] = ['order_id', 'in', array_keys($order_ids)];
  213. $condition[] = ['refund_lock', '=', '0'];//退款锁定状态:0为正常(能退款),1为锁定(待审核),2为同意
  214. $code_list = $this->getVrordercodeList($condition);
  215. if (!empty($code_list) && is_array($code_list)) {
  216. foreach ($code_list as $key => $value) {
  217. $order_id = $value['order_id']; //虚拟订单编号
  218. $rec_id = $value['rec_id']; //兑换码表编号
  219. if ($value['vr_state'] != '1') {//使用状态 0:未使用1:已使用2:已过期
  220. $order_key = $order_ids[$order_id];
  221. $order_list[$order_key]['code_list'][$rec_id] = $value;
  222. }
  223. }
  224. }
  225. }
  226. return $order_list;
  227. }
  228. /**
  229. * 取得兑换码列表
  230. * @access public
  231. * @author csdeshang
  232. * @param type $condition 条件
  233. * @param type $fields 字段
  234. * @return array
  235. */
  236. public function getShowVrordercodeList($condition = [], $fields = '*')
  237. {
  238. $code_list = $this->getVrordercodeList($condition);
  239. //进一步处理
  240. if (!empty($code_list)) {
  241. $i = 0;
  242. foreach ($code_list as $k => $v) {
  243. if ($v['vr_state'] == '1') {
  244. $content = '已使用,使用时间 ' . date('Y-m-d', $v['vr_usetime']);
  245. } else if ($v['vr_state'] == '0') {
  246. if ($v['vr_indate'] < TIMESTAMP) {
  247. $content = '已过期,过期时间 ' . date('Y-m-d', $v['vr_indate']);
  248. } else {
  249. $content = '未使用,有效期至 ' . date('Y-m-d', $v['vr_indate']);
  250. }
  251. }
  252. if ($v['refund_lock'] == '1') {
  253. $content = '退款审核中';
  254. } else if ($v['refund_lock'] == '2') {
  255. $content = '退款已完成';
  256. }
  257. $code_list[$k]['vr_code_desc'] = $content;
  258. if ($v['vr_state'] == '0')
  259. $i++;
  260. }
  261. $code_list[0]['vr_code_valid_count'] = $i;
  262. }
  263. return $code_list;
  264. }
  265. /**
  266. * 取得兑换码信息
  267. * @param type $condition 条件
  268. * @param type $fields 字段
  269. * @return type
  270. */
  271. public function getVrordercodeInfo($condition = [], $fields = '*')
  272. {
  273. return Db::name('vrordercode')->field($fields)->where($condition)->find();
  274. }
  275. /**
  276. * 取得兑换码数量
  277. * @access public
  278. * @author csdeshang
  279. * @param type $condition 条件
  280. * @return type
  281. */
  282. public function getVrordercodeCount($condition)
  283. {
  284. return Db::name('vrordercode')->where($condition)->count();
  285. }
  286. /**
  287. * 生成兑换码 长度 =3位 + 4位 + 2位 + 3位 + 1位 + 5位随机 = 18位
  288. * @access public
  289. * @author csdeshang
  290. * @param string $perfix 前缀
  291. * @param type $store_id 店铺id
  292. * @param type $member_id 会员id
  293. * @param type $num 数字
  294. * @return string
  295. */
  296. private function _makeVrordercode($perfix, $store_id, $member_id, $num)
  297. {
  298. $perfix .= sprintf('%04d', (int)$store_id * $member_id % 10000)
  299. . sprintf('%02d', (int)$member_id % 100)
  300. . sprintf('%03d', (float)microtime() * 1000);
  301. $code_list = [];
  302. for ($i = 0; $i < $num; $i++) {
  303. $code_list[$i]['code'] = $perfix . sprintf('%01d', (int)$i % 10) . random(5, 1);
  304. }
  305. return $code_list;
  306. }
  307. /**
  308. * 取得订单列表(所有)
  309. * @access public
  310. * @author csdeshang
  311. * @param type $condition 条件
  312. * @param type $pagesize 分页
  313. * @param type $field 字段
  314. * @param type $order 排序
  315. * @param type $limit 限制
  316. * @return type
  317. */
  318. public function getVrorderList($condition, $pagesize = '', $field = '*', $order = 'order_id desc', $limit = 0)
  319. {
  320. if ($pagesize) {
  321. $list = Db::name('vrorder')->field($field)->where($condition)->order($order)->limit($limit)->paginate(['list_rows' => $pagesize, 'query' => request()->param()], false);
  322. $this->page_info = $list;
  323. $list = $list->items();
  324. } else {
  325. $list = Db::name('vrorder')->field($field)->where($condition)->order($order)->limit($limit)->select()->toArray();
  326. }
  327. if (empty($list))
  328. return [];
  329. foreach ($list as $key => $order) {
  330. if (isset($order['order_state'])) {
  331. list($list[$key]['state_desc'], $list[$key]['order_state_text']) = $this->_vrorderState($order['order_state']);
  332. }
  333. if (isset($order['payment_code'])) {
  334. $list[$key]['payment_name'] = get_order_payment_name($order['payment_code']);
  335. }
  336. }
  337. return $list;
  338. }
  339. /**
  340. * 取得订单状态文字输出形式
  341. * @access public
  342. * @author csdeshang
  343. * @param type $order_state 订单状态
  344. * @return type
  345. */
  346. private function _vrorderState($order_state)
  347. {
  348. switch ($order_state) {
  349. case ORDER_STATE_CANCEL:
  350. $order_state = '<span style="color:#999">已取消</span>';
  351. $order_state_text = '已取消';
  352. break;
  353. case ORDER_STATE_NEW:
  354. $order_state = '<span style="color:#36C">待付款</span>';
  355. $order_state_text = '待付款';
  356. break;
  357. case ORDER_STATE_PAY:
  358. $order_state = '<span style="color:#999">已支付</span>';
  359. $order_state_text = '已支付';
  360. break;
  361. case ORDER_STATE_SUCCESS:
  362. $order_state = '<span style="color:#999">已完成</span>';
  363. $order_state_text = '已完成';
  364. break;
  365. }
  366. return [$order_state, $order_state_text];;
  367. }
  368. /**
  369. * 返回是否允许某些操作
  370. * @access public
  371. * @author csdeshang
  372. * @param type $operate 操作
  373. * @param type $order_info 订单信息
  374. * @return boolean
  375. */
  376. public function getVrorderOperateState($operate, $order_info)
  377. {
  378. $state = false;
  379. if (!is_array($order_info) || empty($order_info))
  380. return false;
  381. switch ($operate) {
  382. //买家取消订单
  383. case 'buyer_cancel':
  384. $state = $order_info['order_state'] == ORDER_STATE_NEW;
  385. break;
  386. //商家取消订单
  387. case 'store_cancel':
  388. $state = $order_info['order_state'] == ORDER_STATE_NEW;
  389. break;
  390. //平台取消订单
  391. case 'system_cancel':
  392. $state = $order_info['order_state'] == ORDER_STATE_NEW;
  393. break;
  394. //平台收款
  395. case 'system_receive_pay':
  396. $state = $order_info['order_state'] == ORDER_STATE_NEW;
  397. break;
  398. //支付
  399. case 'payment':
  400. $state = $order_info['order_state'] == ORDER_STATE_NEW;
  401. break;
  402. //评价
  403. case 'evaluation':
  404. $state = !$order_info['refund_state'] && !isset($order_info['lock_state']) && $order_info['evaluation_state'] == '0' && $order_info['use_state'] && $order_info['order_state'] == ORDER_STATE_SUCCESS;
  405. break;
  406. //买家退款
  407. case 'refund':
  408. $state = false;
  409. $code_list = isset($order_info['code_list']) ? $order_info['code_list'] : ''; //没有使用的兑换码列表
  410. if (!empty($code_list) && is_array($code_list)) {//没结算可以退款
  411. if ($order_info['vr_indate'] > TIMESTAMP) {//有效期内的能退款
  412. $state = true;
  413. }
  414. if ($order_info['vr_invalid_refund'] == 1 && ($order_info['vr_indate'] + 60 * 60 * 24 * config('ds_config.code_invalid_refund')) > TIMESTAMP) {//兑换码过期后可退款
  415. $state = true;
  416. }
  417. }
  418. break;
  419. }
  420. return $state;
  421. }
  422. /**
  423. * 订单详情页显示进行步骤
  424. * @access public
  425. * @author csdeshang
  426. * @param array $order_info 订单信息
  427. * @return array
  428. */
  429. public function getVrorderStep($order_info)
  430. {
  431. if (!is_array($order_info) || empty($order_info))
  432. return [];
  433. $step_list = [];
  434. // 第一步 下单完成
  435. $step_list['step1'] = true;
  436. //第二步 付款完成
  437. $step_list['step2'] = !empty($order_info['payment_time']);
  438. //第三步 兑换码使用中
  439. $step_list['step3'] = !empty($order_info['payment_time']);
  440. //第四步 使用完成或到期结束
  441. $step_list['step4'] = $order_info['order_state'] == ORDER_STATE_SUCCESS;
  442. return $step_list;
  443. }
  444. /**
  445. * 取得订单数量
  446. * @access public
  447. * @author csdeshang
  448. * @param array $condition 条件
  449. * @return int
  450. */
  451. public function getVrorderCount($condition)
  452. {
  453. return Db::name('vrorder')->where($condition)->count();
  454. }
  455. /**
  456. * 订单销售记录 订单状态为20、30、40时
  457. * @access public
  458. * @author csdeshang
  459. * @param type $condition 条件
  460. * @param type $field 字段
  461. * @param type $pagesize 分页
  462. * @param type $order 排序
  463. * @return type
  464. */
  465. public function getVrorderAndOrderGoodsSalesRecordList($condition, $field = "*", $pagesize = 0, $order = 'order_id desc')
  466. {
  467. $condition[] = ['order_state', 'in', [ORDER_STATE_PAY, ORDER_STATE_SUCCESS]];
  468. return $this->getVrorderList($condition, $pagesize, $field, $order);
  469. }
  470. }