|
|
@@ -10,7 +10,10 @@ use App\Model\ReminderDetails;
|
|
|
use App\Model\ReminderRecord;
|
|
|
use App\Model\ReminderRecordDetails;
|
|
|
use App\Model\TodoList;
|
|
|
+use App\Model\WxEmployeeOfficial;
|
|
|
+use App\Service\Weixin\WxTemplateMessageService;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
+use Illuminate\Support\Facades\Log;
|
|
|
|
|
|
class OrderService extends Service
|
|
|
{
|
|
|
@@ -562,13 +565,98 @@ class OrderService extends Service
|
|
|
|
|
|
public function reminderSendWx($data, $user){
|
|
|
if(empty($data['id'])) return [false, 'ID不能为空'];
|
|
|
+ $appid = config("wx_msg.f_appid");
|
|
|
|
|
|
- $customer = Reminder::where('del_time',0)
|
|
|
+ $reminders = Reminder::where('del_time',0)
|
|
|
->whereIn('id',$data['id'])
|
|
|
->get()->toArray();
|
|
|
- if(empty($customer)) return [false,'催单数据不存在或已被删除'];
|
|
|
+ if(empty($reminders)) return [false,'催单数据不存在或已被删除'];
|
|
|
+ if(count($reminders) >= 10) return [false, '批量操作一次最多10条'];
|
|
|
|
|
|
- return [true, ''];
|
|
|
+ $details = ReminderDetails::from('reminder_details as a')
|
|
|
+ ->leftjoin('wx_employee_official as b','b.employee_id','a.customer_supply_id')
|
|
|
+ ->where('a.del_time',0)
|
|
|
+ ->where('b.type',WxEmployeeOfficial::login_type_one)
|
|
|
+ ->where('b.appid',$appid)
|
|
|
+ ->whereIn('a.reminder_id', array_column($reminders,'id'))
|
|
|
+ ->select('a.reminder_id','a.customer_supply_id','a.open_id')
|
|
|
+ ->get()->toArray();
|
|
|
+ if (empty($details)) return [false, '未找到任何可发送的微信消息的供应商'];
|
|
|
+
|
|
|
+ // 按 reminder_id 分组
|
|
|
+ $detailMap = [];
|
|
|
+ foreach ($details as $d) {
|
|
|
+ if (! empty($d['open_id'])) {
|
|
|
+ $detailMap[$d['reminder_id']][] = [
|
|
|
+ 'open_id' => $d['open_id'],
|
|
|
+ 'employee_id' => $d['customer_supply_id'],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $wxService = new WxTemplateMessageService();
|
|
|
+
|
|
|
+ $total = 0;
|
|
|
+ $success = 0;
|
|
|
+ $fail = 0;
|
|
|
+ $failList = [];
|
|
|
+
|
|
|
+ // ③ 循环发送每条催单的每个人
|
|
|
+ foreach ($reminders as $reminder) {
|
|
|
+ $reminderId = $reminder['id'];
|
|
|
+ $d_array = $detailMap[$reminderId] ?? [];
|
|
|
+ if (empty($d_array)) continue;
|
|
|
+
|
|
|
+ foreach ($d_array as $value) {
|
|
|
+ $openid = $value['open_id'];
|
|
|
+ $employee_id = $value['employee_id'];
|
|
|
+ $params = [
|
|
|
+ 'order_number' => $reminder['order_number'] ?? '',
|
|
|
+ 'product_detail' => $reminder['product_detail'] ?? '',
|
|
|
+ 'order_no' => $reminder['order_no'] ?? '',
|
|
|
+ ];
|
|
|
+
|
|
|
+ // URL 可自定义跳转地址
|
|
|
+ $options = [
|
|
|
+ 'url' => 'https://xlkj.qingyaokeji.com/#/wxDetailGet?openid='.$openid.'&employee_id='.$employee_id,
|
|
|
+ 'openid' => $openid,
|
|
|
+ ];
|
|
|
+
|
|
|
+ $total++;
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 调用微信发送
|
|
|
+ [$res, $msg] = $wxService->sendTemplateMessage('supply_reminder', $params, $options);
|
|
|
+
|
|
|
+ if ($res) {
|
|
|
+ $success++;
|
|
|
+ } else {
|
|
|
+ $fail++;
|
|
|
+ $failList[] = [
|
|
|
+ 'reminder_id' => $reminderId,
|
|
|
+ 'openid' => $openid,
|
|
|
+ 'error' => $msg,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ $fail++;
|
|
|
+ $failList[] = [
|
|
|
+ 'reminder_id' => $reminderId,
|
|
|
+ 'openid' => $openid,
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ④ 结果统计返回
|
|
|
+ $resultMsg = "共需发送 {$total} 条模板消息,成功 {$success} 条,失败 {$fail} 条。";
|
|
|
+ if ($fail > 0) {
|
|
|
+ $resultMsg .= ' 失败详情见日志。';
|
|
|
+ Log::error('微信模板消息发送失败详情', $failList);
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true, $resultMsg];
|
|
|
}
|
|
|
//催单管理---------------------------------------------
|
|
|
|
|
|
@@ -684,7 +772,10 @@ class OrderService extends Service
|
|
|
->orderby('id', 'desc');
|
|
|
|
|
|
if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
|
|
|
- if(! empty($data['id'])) $model->whereIn('id', $data['id']);
|
|
|
+ if(! empty($data['id'])) {
|
|
|
+ if(! is_array($data['id'])) $data['id'] = [$data['id']];
|
|
|
+ $model->whereIn('id', $data['id']);
|
|
|
+ }
|
|
|
if(isset($data['status'])) $model->where('status', $data['status']);
|
|
|
if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
|
|
|
$return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
|
|
|
@@ -742,6 +833,39 @@ class OrderService extends Service
|
|
|
return [true, $data];
|
|
|
}
|
|
|
|
|
|
+ public function toDoFinished($data, $user)
|
|
|
+ {
|
|
|
+ if (empty($data['id'])) return [false, 'ID不能为空'];
|
|
|
+
|
|
|
+ // 确保 id 是数组
|
|
|
+ $ids = is_array($data['id']) ? $data['id'] : [$data['id']];
|
|
|
+ if (empty($ids)) return [false, 'ID不能为空'];
|
|
|
+
|
|
|
+ // 查询待办事项
|
|
|
+ $orders = TodoList::whereIn('id', $ids)
|
|
|
+ ->where('del_time', 0)
|
|
|
+ ->where('status', '<', TodoList::status_two)
|
|
|
+ ->get();
|
|
|
+
|
|
|
+ if ($orders->isEmpty()) return [false, '未找到可操作的待办事项'];
|
|
|
+
|
|
|
+ try {
|
|
|
+ DB::beginTransaction();
|
|
|
+
|
|
|
+ // 批量更新
|
|
|
+ TodoList::whereIn('id', $orders->pluck('id'))
|
|
|
+ ->update(['status' => TodoList::status_two]);
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ DB::rollBack();
|
|
|
+ return [false, $e->getMessage()];
|
|
|
+ }
|
|
|
+
|
|
|
+ $count = count($orders);
|
|
|
+ return [true, "成功完成 {$count} 条待办事项"];
|
|
|
+ }
|
|
|
+
|
|
|
public function fillToDoData($data, $user, $search){
|
|
|
if(empty($data['data'])) return $data;
|
|
|
|