Files
code-bang/backend/application/common/service/SubscribeMessageService.php
T
2026-10-28 16:59:16 +08:00

277 lines
12 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace app\common\service;
use think\Log;
class SubscribeMessageService
{
const MSG_TEMP_DEMAND_RECEIVE = 'JGQJ3a-enop3Jfrcb7av4e5bX8p0Cah_5txloDHhBNw'; //接单成功
const MSG_TEMP_DEMAND_MATCH_SUCCESS = 'dhLlEFPxhLkhrqKcDzvMA3tngRiyzDBy9nwxvqIAASg'; //工单匹配成功
const MSG_TEMP_DEMAND_SETTLE = 'Xpqqk4si-Jh6HqfD-1VS9IH2AtlgVgGJLzgVS7RRMFk'; //工单结算
const MSG_TEMP_WORK_START = 'fuSe71gltzwYTjNrc6N2bWg4cuO4qlhYjgo-09D3Gg8'; //项目开工
const MSG_TEMP_WORK_ACCEPT = 'Gl_t3R5a_NoAvmVaDLeERCfFmTLiHURv9eIixtnOKYI'; //工单验收
const MSG_TEMP_WORK_ACCEPT_RESULT = '0H4GVHXI9G8RtZ1FuS_BuWN8yzOiBQ0-47ym6f08X_I'; //验收结果
const MSG_TEMP_CONTRACT_PAY = 'RxZ1VlzI5cFl_q8fF-WfQlkUqMKp1HGhDCGzAYcmRtk'; //合同付款
const MSG_TEMP_CONTRACT_SIGN = '1Yz9jAXFaySOQyeUfM1V2utomImvVKBRx7m-9FvQ3xo'; //合同签约
const MSG_TEMP_ORDER_SHIPPED = 'jGxNQ11on1yD0d5tGwk4S8jP_CEdddfAkrp9-xVeeZY'; //订单发货
const MSG_TEMP_CONFIRM_RECEIPT = 'Utj3mlCNu0uiwshpoCeTPVMggXWYC6hVGqFBgGm9TFk'; //确认收货通知
const MSG_TEMP_DEVELOPER_JOIN = '0LRwQET1LgJohEok6EbcfMTnikuICe6-NZ7pc0WSbOY'; //申请入驻
const PAGE_DEMAND_LIST = 'pages/demand/list/index';
const PAGE_DEMAND_DETAIL = 'pages/demand/detail/index';
const PAGE_ORDER_LIST = 'pages/order/order-list/index';
const PAGE_ORDER_DETAIL = 'pages/order/order-detail/index';
const PAGE_HOME = 'pages/home/home';
const MSG_MAP = [
self::MSG_TEMP_DEMAND_RECEIVE => [
'name' => '接单成功通知', //站内消息标题
'message_type' => MessageService::TYPE_DEMAND, //站内消息类型
'page' => self::PAGE_DEMAND_LIST . '?opType=myQuote', //我的报价需求列表
'remark' => '恭喜中标,请到我投标的需求确认接单!',
/*
工单号:JG202003310001
服务项目:logo设计
任务名称:共享精英团队logo设计
备注:接单成功,请尽快安排排产
*/
'fields' => ['character_string1', 'thing9', 'thing10', 'thing4'],
'valueNames' => ['工单号', '服务项目', '任务名称', '备注'], //与fields一一对应,用于站内消息内容组装
],
self::MSG_TEMP_DEMAND_MATCH_SUCCESS => [
'name' => '工单匹配成功通知',
'message_type' => MessageService::TYPE_DEMAND,
'page' => self::PAGE_DEMAND_LIST . '?opType=my', //我发布的需求列表
'remark' => '匹配工程师成功,请到需求详情查看沟通',
/*
匹配服务方:字节
服务类别:安装预约
温馨提醒:您的工单已成功匹配,请您电话保持畅通。
*/
'fields' => ['thing1', 'phrase2', 'thing5'],
'valueNames' => ['匹配服务方', '服务类别', '温馨提醒'],
],
self::MSG_TEMP_DEMAND_SETTLE => [
'name' => '工单结算通知',
'message_type' => MessageService::TYPE_DEMAND,
'page' => self::PAGE_DEMAND_LIST . '?opType=myQuote', //我报价的需求列表
'remark' => '该工单已结算完成',
/*
订单编号:200912162851392635fdbf4149
结算金额:¥99.9
结算说明:订单已收货结算完成
*/
'fields' => ['character_string4', 'amount1', 'thing2'],
'valueNames' => ['订单编号', '结算金额', '结算说明'],
],
self::MSG_TEMP_WORK_START => [
'name' => '项目开工通知',
'message_type' => MessageService::TYPE_DEMAND,
'page' => self::PAGE_DEMAND_LIST . '?opType=myQuote', //我报价的需求列表
'remark' => '客户已支付预付款,可以开始工作',
/*
项目名称:比克大厦四期
工作日期:2020.12.02 ~ 2020.12.08
备注:请在上下班时间安排对工人进行考勤
*/
'fields' => ['thing1', 'time2', 'thing4'],
'valueNames' => ['项目名称', '工作日期', '备注'],
],
self::MSG_TEMP_WORK_ACCEPT => [
'name' => '工单验收通知',
'message_type' => MessageService::TYPE_DEMAND,
'page' => self::PAGE_DEMAND_LIST . '?opType=my', //我发布的需求列表
'remark' => '需求开发工作已完成,请前去验收成果',
/*
工单编号:11021024307548
工单标题:电脑问题
验收内容:验收工单以及现场完工图
温馨提醒:登录平台确保验收,给予工程师中肯评价吧~
*/
'fields' => ['character_string1', 'thing8', 'thing2', 'thing5'],
'valueNames' => ['工单编号', '工单标题', '验收内容', '温馨提醒'],
],
self::MSG_TEMP_WORK_ACCEPT_RESULT => [
'name' => '验收结果通知',
'message_type' => MessageService::TYPE_DEMAND,
'page' => self::PAGE_DEMAND_LIST . '?opType=myQuote', //我报价的需求列表
'remark' => '客户已验收并支付尾款,可以发送源码',
'remarkFail' => '客户验收未通过,请根据要求修改',
/*
验收阶段:第一阶段(1/2)
验收结果:拒绝
备注:阶段结算金额7日后即可提现
原因:不符合需求描述的内容
*/
'fields' => ['thing1', 'thing3', 'thing5', 'thing4'],
'valueNames' => ['验收阶段', '验收结果', '备注', '原因'],
],
self::MSG_TEMP_CONTRACT_PAY => [
'name' => '合同付款通知',
'message_type' => MessageService::TYPE_DEMAND,
'page' => self::PAGE_ORDER_LIST, //我的订单列表
'remark' => '请到我的订单完成合同尾款支付',
/*
项目名称:峰爆剧组
合同编号:Q001
结算金额:1.23元
结算周期:2025.01.01~2025.03.31
备注:您有以上合同需要付款,请及时发起流程
*/
'fields' => ['thing1', 'character_string2', 'amount5', 'time4', 'thing3'],
'valueNames' => ['项目名称', '合同编号', '结算金额', '结算周期', '备注'],
],
self::MSG_TEMP_CONTRACT_SIGN => [
'name' => '合同签约通知',
'message_type' => MessageService::TYPE_DEMAND,
'page' => self::PAGE_DEMAND_LIST . '?opType=my', //我发布的需求列表
'remark' => '需求已确认,请前去完成合同签约',
/*
合同编号:2019年合字001号
项目名称:某某项目
签约金额:3000
备注:【签约成功】请及时缴纳首期款办理入住
*/
'fields' => ['thing1', 'thing2', 'amount12', 'thing5'],
'valueNames' => ['合同编号', '项目名称', '签约金额', '备注'],
],
self::MSG_TEMP_ORDER_SHIPPED => [
'name' => '订单发货通知',
'message_type' => MessageService::TYPE_DEMAND,
'page' => self::PAGE_ORDER_LIST, //订单列表
'remark' => '发货成功,请到订单详情查看激活码',
/*
订单号:A12345678984
商品名称:2019秋冬女装春装新款上衣连衣裙加绒蕾丝
订单状态:充值成功
备注:快递配送中,请留意电话或者短信
*/
'fields' => ['character_string2', 'thing1', 'phrase19', 'thing6'],
'valueNames' => ['订单号', '商品名称', '订单状态', '备注'],
],
self::MSG_TEMP_CONFIRM_RECEIPT => [
'name' => '确认收货通知',
'message_type' => MessageService::TYPE_DEMAND,
'page' => self::PAGE_DEMAND_DETAIL, //需求详情(发送时携带需求id)
'remark' => '开发成果已交付,请查看交付内容并确认收货',
/*
产品名称:JG202609300001(注:character_string 字段不支持中文,产品名称填需求编号)
订单号:A12345678984
付款金额:1750.00
备注:开发成果已交付,请查看交付内容并确认收货
*/
'fields' => ['character_string1', 'character_string2', 'amount3', 'thing5'],
'valueNames' => ['产品名称', '订单号', '付款金额', '备注'],
],
self::MSG_TEMP_DEVELOPER_JOIN => [
'name' => '入驻审核通知',
'message_type' => MessageService::TYPE_SYSTEM, //入驻审核属系统消息
'page' => self::PAGE_HOME, //首页
'remark' => '开发者入驻成功,前去接单大厅接单',
/*
申请人:周星星
申请时间:2021-10-16 00:00:00
状态:审核通过
备注:备注说明
*/
'fields' => ['thing2', 'time3', 'phrase4', 'thing5'],
'valueNames' => ['申请人', '申请时间', '状态', '备注'],
],
];
/**
* 订阅消息
* @param $user_id
* @param $template_ids
* @return mixed
* @throws \Exception
*/
public static function subMsg($user_id, $template_ids)
{
$template_ids = explode(',', $template_ids);
foreach ($template_ids as $template_id) {
if (!isset(self::MSG_MAP[$template_id])) {
throw new \Exception('该模板消息未定义');
}
$data = [
'user_id' => $user_id,
'template_id' => $template_id,
'page' => self::MSG_MAP[$template_id]['page'] ?? '',
];
}
return true;
}
/**
* @param $user_id
* @param $template_id
* @param array $param
* @return array
*/
public static function packMsg($user_id, $template_id, array $param = [])
{
$paramStr = http_build_query($param['param'] ?? []);
$user = UserService::getOne(['id' => $user_id]);
$page = $param['page'] ?? (self::MSG_MAP[$template_id]['page'] ?? '');
return [
'template_id' => $template_id,
'touser' => $user->openid ?? '',
'page' => $page && $paramStr ? $page . '?' . $paramStr : $page,
'data' => self::packData($template_id, $param['values'] ?? []),
];
}
/**
* @param $template_id
* @param $values
* @return array
*/
public static function packData($template_id, $values): array
{
$fields = self::MSG_MAP[$template_id]['fields'] ?? [];
$param_data = [];
foreach ($fields as $key => $field) {
$value = $values[$key] ?? '';
//微信 amount 类型不带币种符号时会固定展示 5 位小数,如 2.37 显示成 2.37000
if (strpos($field, 'amount') === 0) {
$value = self::formatAmount($value);
}
$param_data[$field] = ['value' => $value];
}
return $param_data;
}
/**
* 订阅消息金额:最多两位小数,去掉末尾多余的 0,并加上币种符号。
* 微信 amount 类型不带币种符号时会把 2.37 展示成 2.37000。
* @param mixed $amount
* @return string 如 ¥2.37、¥2.3、¥2
*/
public static function formatAmount($amount): string
{
if ($amount === '' || $amount === null || !is_numeric($amount)) {
return (string)$amount;
}
$number = (string)$amount;
if (stripos($number, 'e') !== false) {
$number = sprintf('%.8F', (float)$amount);
}
$negative = strncmp($number, '-', 1) === 0;
if ($negative) {
$number = substr($number, 1);
}
//先加 0.005 再截到 2 位,等价于四舍五入,避免 bcmath 直接截断
$rounded = bcadd($number, '0.005', 2);
$rounded = rtrim(rtrim($rounded, '0'), '.');
if ($rounded === '') {
$rounded = '0';
}
return '¥' . ($negative ? '-' : '') . $rounded;
}
}