Verify.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace app\model\verify;
  11. use app\model\BaseModel;
  12. /**
  13. * 核销编码管理
  14. */
  15. class Verify extends BaseModel
  16. {
  17. public $verifyFrom = [
  18. 'shop' => '商家后台',
  19. 'store' => '门店后台',
  20. 'mobile' => '手机端',
  21. ];
  22. /**
  23. * 获取核销类型
  24. */
  25. public function getVerifyType()
  26. {
  27. $verify_type = event("VerifyType", []);
  28. $type = [
  29. 'pickup' => [
  30. 'name' => '订单自提',
  31. ],
  32. 'virtualgoods' => [
  33. 'name' => '虚拟商品',
  34. ]
  35. ];
  36. foreach ($verify_type as $k => $v) {
  37. $type = array_merge($type, $v);
  38. }
  39. return $type;
  40. }
  41. /**
  42. * 添加待核销记录
  43. * @param $type
  44. * @param $site_id
  45. * @param $site_name
  46. * @param $content_array
  47. * @param int $expire_time
  48. * @param int $verify_total_count
  49. * @param int $store_id
  50. * @param int $member_id
  51. * @return array
  52. */
  53. public function addVerify($type, $site_id, $site_name, $content_array, $expire_time = 0, $verify_total_count = 1, $store_id = 0, $member_id = 0)
  54. {
  55. $code = $this->getCode();
  56. $type_array = $this->getVerifyType();
  57. $data = [
  58. 'site_id' => $site_id,
  59. 'site_name' => $site_name,
  60. 'verify_code' => $code,
  61. 'verify_type' => $type,
  62. 'verify_type_name' => $type_array[ $type ][ 'name' ],
  63. 'verify_content_json' => json_encode($content_array, JSON_UNESCAPED_UNICODE),
  64. 'create_time' => time(),
  65. 'expire_time' => $expire_time,
  66. 'verify_total_count' => $verify_total_count,
  67. 'store_id' => $store_id,
  68. 'member_id' => $member_id
  69. ];
  70. $res = model("verify")->add($data);
  71. return $this->success([ 'verify_code' => $code, 'verify_id' => $res ]);
  72. }
  73. /**
  74. * 编辑待核销记录
  75. * @param $data
  76. * @param $condition
  77. * @return array
  78. */
  79. public function editVerify($data, $condition)
  80. {
  81. $res = model("verify")->update($data, $condition);
  82. return $this->success($res);
  83. }
  84. /**
  85. * 获取code值
  86. */
  87. public function getCode()
  88. {
  89. return random_keys(12);
  90. }
  91. /**
  92. * 执行核销
  93. * @param $verifier_info
  94. * @param $code
  95. * @return array|mixed|void
  96. */
  97. public function verify($verifier_info, $code)
  98. {
  99. $verifier_info[ 'store_id' ] = $verifier_info[ 'store_id' ] ?? 0;
  100. model('verify')->startTrans();
  101. try {
  102. $verify_info = model("verify")->getInfo([ [ 'verify_code', '=', $code ] ], 'id, site_id, verify_code, verify_type, verify_type_name, verify_content_json, verifier_id, verifier_name, is_verify, expire_time, verify_total_count, verify_use_num, store_id');
  103. if (empty($verify_info)) {
  104. model('verify')->rollback();
  105. return $this->error();
  106. }
  107. if ($verify_info[ 'is_verify' ] == 0) {
  108. if ($verify_info[ 'expire_time' ] > 0 && $verify_info[ 'expire_time' ] < time()) {
  109. model('verify')->rollback();
  110. return $this->error('', '核销码已过期');
  111. }
  112. if ($verify_info[ 'store_id' ] && $verifier_info[ 'store_id' ] && $verify_info[ 'store_id' ] != $verifier_info[ 'store_id' ]) {
  113. model('verify')->rollback();
  114. return $this->error('', '没有核销该核销码的权限');
  115. }
  116. $verify_total_count = $verify_info[ 'verify_total_count' ];
  117. $verify_use_num = $verify_info[ 'verify_use_num' ];
  118. $now_verify_use_num = $verify_use_num + 1;
  119. //开始核销
  120. $data_verify = [
  121. 'verifier_id' => $verifier_info[ "verifier_id" ],
  122. 'verifier_name' => $verifier_info[ 'verifier_name' ],
  123. 'verify_from' => isset($verifier_info[ 'verify_from' ]) ? $verifier_info[ 'verify_from' ] : '',
  124. 'verify_remark' => isset($verifier_info[ 'verify_remark' ]) ? $verifier_info[ 'verify_remark' ] : '',
  125. 'verify_use_num' => $now_verify_use_num
  126. ];
  127. if ($verify_total_count > 0 && $now_verify_use_num >= $verify_total_count) {
  128. $data_verify[ 'is_verify' ] = 1;
  129. $data_verify[ 'verify_time' ] = time();
  130. }
  131. $res = model("verify")->update($data_verify, [ [ 'id', '=', $verify_info[ 'id' ] ] ]);
  132. $result = event("Verify", [ 'verify_type' => $verify_info[ 'verify_type' ], 'verify_code' => $code, 'verify_id' => $verify_info[ 'id' ], 'store_id' => $verifier_info[ 'store_id' ] ], true);
  133. if (!empty($result) && $result[ 'code' ] < 0) {
  134. model('verify')->rollback();
  135. return $result;
  136. }
  137. $site_id = $verify_info[ 'site_id' ];
  138. $verify_record_model = new VerifyRecord();
  139. $verify_record_data = [
  140. 'site_id' => $site_id,
  141. 'verify_code' => $code,
  142. 'verifier_id' => $verifier_info[ "verifier_id" ],
  143. 'verifier_name' => $verifier_info[ 'verifier_name' ],
  144. 'verify_time' => time(),
  145. 'verify_from' => $verifier_info[ 'verify_from' ] ?? '',
  146. 'verify_remark' => $verifier_info[ 'verify_remark' ] ?? '',
  147. 'store_id' => $verifier_info[ 'store_id' ]
  148. ];
  149. $verify_record_model->addVerifyRecord($verify_record_data);
  150. } else {
  151. model('verify')->rollback();
  152. return $this->error('', "IS_VERIFYED");
  153. }
  154. model('verify')->commit();
  155. return $this->success();
  156. } catch (\Exception $e) {
  157. model('verify')->rollback();
  158. return $this->error('', $e->getMessage());
  159. }
  160. }
  161. /**
  162. * 获取核销信息
  163. * @param $condition
  164. * @param string $field
  165. * @return array
  166. */
  167. public function getVerifyInfo($condition, $field = '*')
  168. {
  169. $res = model('verify')->getInfo($condition, $field);
  170. //验证是否存在
  171. if (!empty($res)) {
  172. if ($res[ 'is_verify' ] == 2) {
  173. return $this->error([], "订单已退款!");
  174. }
  175. $json_array = json_decode($res[ "verify_content_json" ], true); //格式化存储数据
  176. $res[ "data" ] = $json_array;
  177. return $this->success($res);
  178. } else {
  179. return $this->error([], "找不到核销码信息!");
  180. }
  181. }
  182. /**
  183. * 获取核销列表
  184. * @param array $condition
  185. * @param string $field
  186. * @param string $order
  187. * @param null $limit
  188. * @return array
  189. */
  190. public function getVerifyList($condition = [], $field = '*', $order = '', $limit = null)
  191. {
  192. $list = model('verify')->getList($condition, $field, $order, '', '', '', $limit);
  193. return $this->success($list);
  194. }
  195. /**
  196. * 获取核销分页列表
  197. * @param array $condition
  198. * @param int $page
  199. * @param int $page_size
  200. * @param string $order
  201. * @param string $field
  202. * @return array
  203. */
  204. public function getVerifyPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
  205. {
  206. $list = model('verify')->pageList($condition, $field, $order, $page, $page_size);
  207. foreach ($list[ "list" ] as $k => $v) {
  208. $temp = json_decode($v[ 'verify_content_json' ], true);
  209. $list[ "list" ][ $k ][ "item_array" ] = $temp[ "item_array" ];
  210. $list[ "list" ][ $k ][ "remark_array" ] = $temp[ "remark_array" ];
  211. if ($v[ 'verify_type' ] == 'pickup' || $v[ 'verify_type' ] == 'virtualgoods') {
  212. $list[ "list" ][ $k ][ 'order_no' ] = $temp[ 'remark_array' ][ 1 ][ 'value' ];
  213. $order_info = model('order')->getInfo([ [ 'order_no', '=', $temp[ 'remark_array' ][ 1 ][ 'value' ] ] ], 'order_id,member_id,name,order_name');
  214. $list[ 'list' ][ $k ][ 'order_info' ] = $order_info;
  215. $list[ 'list' ][ $k ][ 'name' ] = model('member')->getValue([ [ 'member_id', '=', $list[ 'list' ][ $k ][ 'order_info' ][ 'member_id' ] ] ], 'username');
  216. $list[ 'list' ][ $k ][ 'sku_image' ] = "";
  217. if ($v[ 'verify_type' ] == "virtualgoods") {
  218. $order_goods_info = model('order_goods')->getInfo([ [ 'order_id', '=', $order_info[ 'order_id' ] ] ], "sku_image");
  219. $list[ 'list' ][ $k ][ 'sku_image' ] = $order_goods_info[ 'sku_image' ];
  220. }
  221. } else {
  222. $list[ 'list' ][ $k ][ 'sku_image' ] = $temp[ "item_array" ][ 0 ][ 'img' ];
  223. $list[ 'list' ][ $k ][ 'sku_name' ] = $temp[ "item_array" ][ 0 ][ 'name' ];
  224. $list[ 'list' ][ $k ][ 'name' ] = model('member_goods_card_item')->getInfo([ [ 'mgci.member_verify_id', '=', $v[ 'id' ] ] ], 'm.username', 'mgci', [ [ 'member m', 'm.member_id = mgci.member_id', 'left' ] ])[ 'username' ] ?? '';
  225. }
  226. unset($list[ "list" ][ $k ][ "verify_content_json" ]);
  227. $list[ 'list' ][ $k ][ 'verifyFrom' ] = $this->verifyFrom[ $v[ 'verify_from' ] ?? '' ] ?? '';
  228. }
  229. return $this->success($list);
  230. }
  231. /**
  232. * 验证数据详情
  233. * @param $item_array
  234. * @param $remark_array
  235. * @return array
  236. */
  237. public function getVerifyJson($item_array, $remark_array)
  238. {
  239. $json_array = array (
  240. "item_array" => $item_array,
  241. "remark_array" => $remark_array,
  242. );
  243. return $json_array;
  244. }
  245. /**
  246. * 检测会员是否具备当前核销码的核销权限
  247. * @param $member_id
  248. * @param $verify_code
  249. * @return array
  250. */
  251. public function checkMemberVerify($member_id, $verify_code)
  252. {
  253. $verify_info = model("verify")->getInfo([ [ "verify_code", "=", $verify_code ] ]);
  254. if (empty($verify_info))
  255. return $this->error([], "当前核销码不存在!");
  256. $site_id = $verify_info[ "site_id" ];
  257. //验证核销员身份
  258. $condition = array (
  259. [ "member_id", "=", $member_id ],
  260. [ "site_id", "=", $site_id ]
  261. );
  262. $verifier_info = model("verifier")->getInfo($condition, "verifier_id,verifier_name,store_id,verifier_type");
  263. if (empty($verifier_info))
  264. return $this->error([], "没有店铺" . $verify_info[ "site_name" ] . "的核销权限!");
  265. //权限验证
  266. switch ( $verify_info[ 'verify_type' ] ) {
  267. case 'virtualgoods':
  268. //虚拟订单权限
  269. if ($verifier_info[ 'verifier_type' ] != 0) {
  270. return $this->error([], "没有该订单的核销权限!");
  271. }
  272. break;
  273. case 'pickup':
  274. //门店自提权限
  275. if ($verifier_info[ 'verifier_type' ] != 0) {
  276. $condition = array (
  277. [ 'delivery_store_id', '=', $verifier_info[ 'store_id' ] ],
  278. [ 'delivery_code', '=', $verify_code ],
  279. [ 'site_id', '=', $site_id ]
  280. );
  281. $order_count = model('order')->getCount($condition, "order_id");
  282. if (empty($order_count)) return $this->error([], "没有该门店的核销权限!");
  283. }
  284. break;
  285. }
  286. $temp = json_decode($verify_info[ 'verify_content_json' ], true);
  287. $verify_info[ "item_array" ] = $temp[ "item_array" ];
  288. $verify_info[ "remark_array" ] = $temp[ "remark_array" ];
  289. unset($verify_info[ "verify_content_json" ]);
  290. $data = array (
  291. "verify" => $verify_info,
  292. "verifier" => $verifier_info,
  293. );
  294. return $this->success($data);
  295. }
  296. /**
  297. * 生成核销码二维码
  298. * @param $code
  299. * @param $app_type
  300. * @param $verify_type
  301. * @param $site_id
  302. * @param string $type
  303. * @return array
  304. */
  305. public function qrcode($code, $app_type, $verify_type, $site_id, $type = 'create')
  306. {
  307. $page = '/pages_tool/verification/detail';
  308. $params = [
  309. 'site_id' => $site_id,
  310. 'data' => [
  311. "code" => $code
  312. ],
  313. 'page' => $page,
  314. 'promotion_type' => '',
  315. 'h5_path' => $page . '?code=' . $code,
  316. 'qrcode_path' => 'upload/qrcode/' . $verify_type,
  317. 'qrcode_name' => $verify_type . '_' . $code . '_' . $site_id
  318. ];
  319. $solitaire = event('ExtensionInformation', $params, true);
  320. return $this->success($solitaire);
  321. }
  322. /**
  323. * 获取核销码字段和
  324. * @param $condition
  325. * @param $field
  326. * @return array
  327. */
  328. public function getVerifySum($condition, $field)
  329. {
  330. $res = model('verify')->getSum($condition, $field);
  331. return $this->success($res);
  332. }
  333. /**
  334. * 获取核销码数量
  335. * @param $condition
  336. * @param $field
  337. * @return array
  338. */
  339. public function getVerifyCount($condition, $field)
  340. {
  341. $res = model('verify')->getCount($condition, $field);
  342. return $this->success($res);
  343. }
  344. }