BaseData.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <?php
  2. namespace app\extra\dyLife\data;
  3. use app\extra\dyLife\BasicLife;
  4. use yzh52521\EasyHttp\Http;
  5. use function DI\string;
  6. class BaseData extends BasicLife
  7. {
  8. /**
  9. * 创建团购商品
  10. * https://bytedance.larkoffice.com/docx/doxcnnyH289B98IgcPiLWxpSChc
  11. * https://partner.open-douyin.com/docs/resource/zh-CN/local-life/develop/OpenAPI/general-capabilities/goods/save
  12. * https://open.douyin.com/goodlife/v1/goods/product/save/
  13. */
  14. public function createGoodsData(array $data = [],array $sku = [],array $store = [],array $valMap = []): array
  15. {
  16. $product_attrs = $sku_attrs = [];
  17. foreach ($valMap['product_attrs'] as $val) {
  18. $keyVal = $this->getProductAttrs($val['key'],$data);
  19. if (!empty($keyVal)) {
  20. $product_attrs[$val['key']] = $keyVal;
  21. }
  22. }
  23. foreach ($valMap['sku_attrs'] as $val) {
  24. $keyVal = $this->getProductAttrs($val['key'],$data);
  25. if (!empty($keyVal)) {
  26. $sku_attrs[$val['key']] = $keyVal;
  27. }
  28. }
  29. $param = [
  30. "account_id" => $store['store_id'], // 商家id
  31. "product" => [
  32. "account_name" => $store['poi_name'], // 商家名
  33. "biz_line" => 5, // 业务线 固定 5 小程序
  34. "category_id" => $data['category_id']??0, // 品类id
  35. "product_name" => $data['product_name'], // 商品名
  36. "product_type" => $data['product_type'], // 商品类型
  37. "attr_key_value_map" => $product_attrs,
  38. "out_id" => $data['product_id'], // 第三方id
  39. "out_url" => json_encode([
  40. "app_id" => sConf("wechat.mini_appid"),
  41. "params" => json_encode(['goods' => $data['product_id']]),
  42. "path" => "pages/goods/detail"
  43. ]), // 第三方跳转链接,小程序商品必填
  44. "pois" => [
  45. [
  46. "poi_id" => $store['poi_id'], // 门店POI
  47. ]
  48. ],
  49. "sold_end_time" => strtotime($data['sold_start_times'][1]), // 售卖结束时间
  50. "sold_start_time" => strtotime($data['sold_start_times'][0]), // 售卖开始时间
  51. "spu_id" => (string)$data['spu_id'], // spuid
  52. "account_id" => $store['store_id'], // 商家id
  53. ]
  54. ];
  55. if (empty($sku)) { // 单sku
  56. $param['sku'] = [
  57. "attr_key_value_map" => $sku_attrs,
  58. "actual_amount" => $data['price'], // 售价 实际支付价格
  59. "sku_name" => $data['product_name'], // sku名
  60. "origin_amount" => $data['line_price'],
  61. "status" => 1,
  62. "stock" => [
  63. "limit_type" => $data['limit_use_rule'], // 库存上限类型,为2时stock_qty和avail_qty字段无意义 1 有限库存 2 无限库存
  64. "avail_qty" => $data['use_num_per_consume']??0, // 可用库存,limit_type=2时无意义,始终保证stock_qty=avail_qty+frozen_qty+sold_qty
  65. ]
  66. ];
  67. } else { // 多sku
  68. }
  69. echo "商品提交给API信息\n";
  70. print_r($param);
  71. return $this->curlPostApi("goodlife/v1/goods/product/save/",$param);
  72. }
  73. /**
  74. * 参数处理
  75. * @param string $key
  76. * @param array $data
  77. * @return string
  78. */
  79. protected function getProductAttrs(string $key = "",array $data = []): string
  80. {
  81. switch ($key)
  82. {
  83. case "trade_url": // 小程序提单页跳转
  84. return json_encode([
  85. "app_id" => sConf("wechat.mini_appid"),
  86. "params" => json_encode(['goods' => $data['product_id']]),
  87. "path" => "pages/goods/detail"
  88. ]);
  89. break;
  90. case "commodity": // 商品搭配
  91. $specs = json_decode($data['specs'],true);
  92. $commodity = [];
  93. foreach ($specs as $key=>$val) {
  94. $commodity[$key] = [
  95. "group_name" => $val['name'],
  96. "total_count" => count($val['list']),
  97. "option_count" => $val['num']==0?count($val['list']):$val['num']
  98. ];
  99. foreach ($val['list'] as $sKey=>$sub) {
  100. $commodity[$key]['item_list'][$sKey] = [
  101. "name" => $sub['name'],
  102. "price" => $sub['price'] * 100,
  103. "count" => 1,
  104. "unit" => "份"
  105. ];
  106. }
  107. }
  108. $return = json_encode($commodity);
  109. break;
  110. case "customer_reserved_info":
  111. if ($data['customer_reserved_info'] == 1) { // 不需要留资
  112. $return = json_encode([
  113. "allow" => false
  114. ]);
  115. } else {
  116. $return = json_encode([
  117. "allow" => true,
  118. "allow_tel" => true,
  119. "require_for_tel" => true
  120. ]);
  121. }
  122. break;
  123. case "appointment": // 预约规则
  124. if ($data['booking_type'] == 1) { // 无需预约
  125. $return = json_encode([
  126. "need_appointment" => false
  127. ]);
  128. } else {
  129. if ($data['booking_unit'] == 1) {
  130. $return = json_encode([
  131. "need_appointment" => true,
  132. "ahead_day_num" => $data['booking_date']
  133. ]);
  134. } else {
  135. $return = json_encode([
  136. "need_appointment" => true,
  137. "ahead_hour_num" => $data['booking_date']
  138. ]);
  139. }
  140. }
  141. break;
  142. case "EntryType": // 入口类型 1:H5 2:小程序 3:抖音 4:lynx
  143. $return = "2";
  144. break;
  145. case "market_price": // 划线价格
  146. $return = (string)$data['line_price'];
  147. break;
  148. case "can_no_use_date": // 不可使用日期
  149. if ($data['can_no_use_date'] == 1) {
  150. $return = json_encode(["enable" => false]);
  151. } else { // 指定日期
  152. $noUse = ["enable" => true];
  153. if ($data['can_no_use_week']) { // 每周几不可用
  154. $noUse['days_of_week'] = $data['no_use_weeks'];
  155. }
  156. if ($data['can_no_use_holiday']) { // 节假日不可用
  157. $noUse['holidays'] = $data['no_use_weeks'];
  158. }
  159. if ($data['can_no_use_day']) { // 指定某天不可用
  160. $noUse['date_list'] = $data['no_use_days'];
  161. }
  162. $return = json_encode($noUse);
  163. }
  164. break;
  165. case "image_list": // 封面图 图片比例:375:280
  166. $image_list = json_decode($data['image_list'],true);
  167. $return = json_encode([
  168. [
  169. "url" => $image_list[0]['url']
  170. ]
  171. ]);
  172. break;
  173. case "limit_use_rule": // 限制使用规则
  174. if ($data['rec_person_type']==1) {
  175. $return = json_encode(["is_limit_use" => false]);
  176. } else {
  177. $return = json_encode(['is_limit_use' => true, 'use_num_per_consume' => $data['rec_person_num_max']??0]);
  178. }
  179. break;
  180. case "show_channel":
  181. $return = (string) $data['show_channel'];
  182. break;
  183. case "use_date": // 使用日期 券码的可以核销日期,履约核销强依赖
  184. if ($data['use_date_type'] == 1) { // 指定天数
  185. $return = json_encode([
  186. "use_date_type" => 2,
  187. "day_duration" => $data['day_duration']
  188. ]);
  189. } else { // 指定日期
  190. $return = json_encode([
  191. "use_date_type" => 1,
  192. "use_start_date" => $data['use_times'][0],
  193. "use_end_date" => $data['use_times'][0]
  194. ]);
  195. }
  196. break;
  197. case "use_time": // 使用时间 用户可以消费的时间
  198. $return = json_encode([
  199. "use_time_type" => 1
  200. ]);
  201. break;
  202. case "Notification": // 使用规则
  203. $return = $data['notification'];
  204. break;
  205. case "RefundPolicy": // 退款政策 1-允许退款 2-不可退款 3-有条件退
  206. $return = "1";
  207. break;
  208. case "refund_need_merchant_confirm": // 退款是否需商家审核
  209. $return = "true";
  210. break;
  211. case "code_source_type": // 券码生成方式 "1-抖音码 2-三方码 3-预导码
  212. $return = $data['code_source_type']?(string)$data['code_source_type']:"1";
  213. break;
  214. case "settle_type": // 收款方式 1-总店结算 2-分店结算
  215. $return = $data['code_source_type']?(string)$data['code_source_type']:"2";
  216. break;
  217. case "limit_rule": // 限制购买
  218. if ($data['limit_rule_type'] == 2) {
  219. $return = json_encode(['is_limit' => true,"total_buy_num" => $data['limit_rule']]);
  220. } else {
  221. $return = json_encode(['is_limit' => false]);
  222. }
  223. break;
  224. case "auto_renew":
  225. $return = $data['auto_renew']==1?'true':'false';
  226. break;
  227. default:
  228. $return = "";
  229. break;
  230. }
  231. return $return;
  232. }
  233. /**
  234. * 获取来客绑定的所有门店
  235. * 一页最多50条
  236. */
  237. public function getStoreData(string $account,int $page = 1,int $size = 50): array
  238. {
  239. $data = [
  240. "account_id" => $account,
  241. "page" => $page,
  242. "size" => $size
  243. ];
  244. return $this->curlGetApi("goodlife/v1/shop/poi/query/",$data);
  245. }
  246. /**
  247. * 获取来客绑定的所有分类
  248. */
  249. public function getStoreCategoryData(string $account): array
  250. {
  251. $data = [
  252. "account_id" => $account,
  253. "query_category_type" => 1
  254. ];
  255. return $this->curlGetApi("goodlife/v1/goods/category/get/",$data);
  256. }
  257. /**
  258. * 查下商品模板
  259. */
  260. public function getStoreCategoryTemplate(string $category_id,int $product_type = 1): array
  261. {
  262. $data = compact("category_id","product_type");
  263. return $this->curlGetApi("goodlife/v1/goods/template/get/",$data);
  264. }
  265. /**
  266. * https://open.douyin.com/goodlife/v1/goods/product/operate/
  267. * 商品上下架
  268. * @param int $type 1-上线 2-下线 3 -删除(商品删除以后无法恢复,需要创建新的商品)
  269. * @param string $account
  270. * @param string $productId
  271. * @return array
  272. */
  273. public function goodsOffOn(int $type = 1,string $account = "",string $productId = ""): array
  274. {
  275. $data = [
  276. "op_type" => $type,
  277. "account_id" => $account,
  278. "product_id" => $productId
  279. ];
  280. return $this->curlPostApi("goodlife/v1/goods/product/operate/",$data);
  281. }
  282. }