lib/wechat/mini_program/nearby_poi.ex

defmodule WeChat.MiniProgram.NearbyPOI do
  @moduledoc """
  附件的小程序
  """

  import Jason.Helpers
  import WeChat.Utils, only: [doc_link_prefix: 0]

  @typedoc """
  门店图片

  最多9张,最少1张,上传门店图片如门店外景、环境设施、商品服务等,图片将展示在微信客户端的门店页。
  图片链接通过[文档](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738729)中的《上传图文消息内的图片获取URL》接口获取。
  文件格式为bmp、png、jpeg、jpg或gif,大小不超过5M `pic_list` 是字符串,内容是一个json
  """
  @type pic_list :: String.t()
  @typedoc """
  服务标签列表

  需要填写

  - 服务标签ID
  - 服务类型tpye
  - 服务名称name
  - APPID
  - 对应服务落地页的path路径:path路径页面要与对应的服务标签一致,例如选取外卖服务,path路径应该是小程序的外卖对应的那个页面,path路径获取咨询开发或者到小程序管理后台-工具-生成小程序码页面获取
  - 新增服务描述desc:描述服务内容,例如满减、折扣等优惠信息或新品、爆品等商品信息,仅标准服务都可添加,10个字符以内。

  《服务标签id编号、类型与服务名称表》

  | ID   | type | name(服务名称)                           |
  | ---- | ---- | ---------------------------------------- |
  | 0    | 2    | 自定义服务,可自定义名称(10个字符以内) |
  | 1    | 1    | 外送                                     |
  | 2    | 1    | 快递                                     |
  | 3    | 1    | 充电                                     |
  | 4    | 1    | 预约                                     |
  | 5    | 1    | 挂号                                     |
  | 6    | 1    | 点餐                                     |
  | 7    | 1    | 优惠                                     |
  | 8    | 1    | 乘车                                     |
  | 9    | 1    | 会员                                     |
  | 10   | 1    | 买单                                     |
  | 11   | 1    | 排队                                     |
  | 12   | 1    | 缴费                                     |
  | 13   | 1    | 购票                                     |
  | 14   | 1    | 到店自提                                 |
  | 15   | 1    | 预订                                     |

  service_infos是字符串,内容是一个json
  """
  @type service_infos :: String.t()
  @typedoc """
  客服信息

  可自定义服务头像与昵称,具体填写字段见下方示例kf_info kf_info是字符串,内容是一个json
  """
  @type kf_info :: String.t()
  @typedoc """
  门店名字

  门店名称需按照所选地理位置自动拉取腾讯地图门店名称,不可修改,如需修改请重现选择地图地点或重新创建地点。
  """
  @type store_name :: String.t()
  @typedoc """
  营业时间

  格式`11:11-12:12`
  """
  @type hour :: String.t()
  @typedoc "地址"
  @type address :: String.t()
  @typedoc "如果创建新的门店,poi_id字段为空 如果更新门店,poi_id参数则填对应门店的poi_id"
  @type poi_id :: String.t()
  @typedoc "主体名字"
  @type company_name :: String.t()
  @typedoc "门店电话"
  @type contract_phone :: String.t()
  @typedoc """
  资质号

  15位营业执照注册号或9位组织机构代码
  """
  @type credential :: String.t()
  @typedoc """
  证明材料

  如果company_name和该小程序主体不一致,需要填qualification_list,
  详细规则见: [附近的小程序使用指南-如何证明门店的经营主体跟公众号或小程序帐号主体相关](http://kf.qq.com/faq/170401MbUnim17040122m2qY.html)
  """
  @type qualification_list :: String.t()
  @typedoc """
  腾讯地图对于poi的唯一标识

  对应《在腾讯地图中搜索门店》中的sosomap_poi_uid字段

  腾讯地图那边有些数据不一致,如果不填map_poi_id的话,小概率会提交失败!

  注:
  `poi_id` 与 `map_poi_id` 关系:
  `map_poi_id` 是腾讯地图对于poi的唯一标识
  `poi_id` 是门店进驻附近后的门店唯一标识
  """
  @type map_poi_id :: String.t()
  @type add_options :: %{
          required(:pic_list) => pic_list,
          required(:service_infos) => service_infos,
          required(:store_name) => store_name,
          required(:hour) => hour,
          required(:address) => address,
          required(:company_name) => company_name,
          required(:contract_phone) => contract_phone,
          required(:credential) => credential,
          optional(:kf_info) => kf_info,
          optional(:poi_id) => poi_id
        }
  @typedoc """
  是否展示

  - 0: 不展示
  - 1: 展示
  """
  @type status :: 0 | 1

  @doc_link "#{doc_link_prefix()}/miniprogram/dev/api-backend/open-api/nearby-poi/"

  @doc """
  添加地点 -
  [官方文档](#{@doc_link}/nearbyPoi.add.html){:target="_blank"}
  """
  @spec add(WeChat.client(), add_options) :: WeChat.response()
  def add(client, options) do
    client.post(
      "/wxa/addnearbypoi",
      Map.put(options, :is_comm_nearby, "1"),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  删除地点 -
  [官方文档](#{@doc_link}/nearbyPoi.delete.html){:target="_blank"}
  """
  @spec delete(WeChat.client(), poi_id) :: WeChat.response()
  def delete(client, poi_id) do
    client.post(
      "/wxa/delnearbypoi",
      json_map(poi_id: poi_id),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  查看地点列表 -
  [官方文档](#{@doc_link}/nearbyPoi.getList.html){:target="_blank"}
  """
  @spec get_list(WeChat.client(), start :: non_neg_integer, limit :: 1..1000) :: WeChat.response()
  def get_list(client, start \\ 1, limit \\ 10) do
    client.get(
      "/wxa/getnearbypoilist",
      query: [page: start, page_rows: limit, access_token: client.get_access_token()]
    )
  end

  @doc """
  展示/取消展示附近小程序 -
  [官方文档](#{@doc_link}/nearbyPoi.setShowStatus.html){:target="_blank"}
  """
  @spec set_show_status(WeChat.client(), poi_id, status) :: WeChat.response()
  def set_show_status(client, poi_id, status) do
    client.post(
      "/wxa/setnearbypoishowstatus",
      json_map(poi_id: poi_id, status: status),
      query: [access_token: client.get_access_token()]
    )
  end
end