Browse Source

Merge branch 'master' of http://gitlab.frkj.cc/php/zhjwxt

# Conflicts:
#	niucloud/app/api/route/route.php
master
于宏哲PHP 9 months ago
parent
commit
bf3e053c9f
  1. 36
      admin/src/app/views/communication_records/communication_records.vue
  2. 48
      admin/src/app/views/communication_records/components/communication-records-edit.vue
  3. 24
      admin/src/app/views/customer_resources/components/customer-resources-edit.vue
  4. 1
      niucloud/app/api/controller/apiController/CustomerResources.php
  5. 58
      niucloud/app/api/controller/member/Member.php
  6. 3
      niucloud/app/api/route/member.php
  7. 4
      niucloud/app/api/route/route.php
  8. 2
      niucloud/app/common.php
  9. 10
      niucloud/app/model/resource_sharing/ResourceSharing.php
  10. 2
      niucloud/app/service/api/apiService/CommonService.php
  11. 32
      niucloud/app/service/api/apiService/ResourceSharingService.php
  12. 11
      niucloud/app/service/api/login/LoginService.php
  13. 51
      niucloud/app/service/api/member/MemberService.php

36
admin/src/app/views/communication_records/communication_records.vue

@ -94,12 +94,12 @@
:show-overflow-tooltip="true" :show-overflow-tooltip="true"
/> />
<el-table-column <!-- <el-table-column-->
prop="resource_type" <!-- prop="resource_type"-->
:label="t('resourceType')" <!-- :label="t('resourceType')"-->
min-width="120" <!-- min-width="120"-->
:show-overflow-tooltip="true" <!-- :show-overflow-tooltip="true"-->
/> <!-- />-->
<el-table-column <el-table-column
:label="t('communicationType')" :label="t('communicationType')"
@ -145,18 +145,18 @@
:show-overflow-tooltip="true" :show-overflow-tooltip="true"
/> />
<el-table-column <!-- <el-table-column-->
:label="t('tag')" <!-- :label="t('tag')"-->
min-width="180" <!-- min-width="180"-->
align="center" <!-- align="center"-->
:show-overflow-tooltip="true" <!-- :show-overflow-tooltip="true"-->
> <!-- >-->
<template #default="{ row }"> <!-- <template #default="{ row }">-->
<div v-for="(item, index) in tagList"> <!-- <div v-for="(item, index) in tagList">-->
<div v-if="item.value == row.tag">{{ item.name }}</div> <!-- <div v-if="item.value == row.tag">{{ item.name }}</div>-->
</div> <!-- </div>-->
</template> <!-- </template>-->
</el-table-column> <!-- </el-table-column>-->
<el-table-column <el-table-column
:label="t('operation')" :label="t('operation')"

48
admin/src/app/views/communication_records/components/communication-records-edit.vue

@ -35,14 +35,14 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('resourceType')" prop="resource_type"> <!-- <el-form-item :label="t('resourceType')" prop="resource_type">-->
<el-input <!-- <el-input-->
v-model="formData.resource_type" <!-- v-model="formData.resource_type"-->
clearable <!-- clearable-->
:placeholder="t('resourceTypePlaceholder')" <!-- :placeholder="t('resourceTypePlaceholder')"-->
class="input-width" <!-- class="input-width"-->
/> <!-- />-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item :label="t('communicationType')" prop="communication_type"> <el-form-item :label="t('communicationType')" prop="communication_type">
<el-select <el-select
@ -106,22 +106,22 @@
class="input-width" class="input-width"
/> />
</el-form-item> </el-form-item>
<el-form-item :label="t('tag')"> <!-- <el-form-item :label="t('tag')">-->
<el-select <!-- <el-select-->
class="input-width" <!-- class="input-width"-->
v-model="formData.tag" <!-- v-model="formData.tag"-->
clearable <!-- clearable-->
:placeholder="t('tagPlaceholder')" <!-- :placeholder="t('tagPlaceholder')"-->
> <!-- >-->
<el-option label="请选择" value=""></el-option> <!-- <el-option label="请选择" value=""></el-option>-->
<el-option <!-- <el-option-->
v-for="(item, index) in tagList" <!-- v-for="(item, index) in tagList"-->
:key="index" <!-- :key="index"-->
:label="item.name" <!-- :label="item.name"-->
:value="item.value" <!-- :value="item.value"-->
/> <!-- />-->
</el-select> <!-- </el-select>-->
</el-form-item> <!-- </el-form-item>-->
</el-form> </el-form>
<template #footer> <template #footer>

24
admin/src/app/views/customer_resources/components/customer-resources-edit.vue

@ -158,19 +158,17 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <!-- <el-col :span="12">-->
<el-form-item :label="t('status')" prop="status"> <!-- <el-form-item :label="t('status')" prop="status">-->
<el-select class="input-width" v-model="formData.status" clearable <!-- <el-select class="input-width" v-model="formData.status" clearable-->
:placeholder="t('statusPlaceholder')"> <!-- :placeholder="t('statusPlaceholder')">-->
<el-option label="请选择" value=""></el-option> <!-- <el-option label="请选择" value=""></el-option>-->
<el-option v-for="(item, index) in statusList" :key="index" :label="item.name" <!-- <el-option v-for="(item, index) in statusList" :key="index" :label="item.name"-->
:value="item.value" /> <!-- :value="item.value" />-->
</el-select> <!-- </el-select>-->
</el-form-item> <!-- </el-form-item>-->
</el-col> <!-- </el-col>-->
<el-col :span="12"> <el-col :span="12" v-if="formData.id">
<el-form-item label="会员标签"> <el-form-item label="会员标签">
<el-select v-model="formData.member_label" multiple collapse-tags <el-select v-model="formData.member_label" multiple collapse-tags
placeholder="请选择会员标签" class="input-width"> placeholder="请选择会员标签" class="input-width">

1
niucloud/app/api/controller/apiController/CustomerResources.php

@ -149,6 +149,7 @@ class CustomerResources extends BaseApiService
//客户资源数据 //客户资源数据
$customer_resources_data = [ $customer_resources_data = [
"campus" => $request->param('campus', ''),
"source_channel" => $request->param('source_channel', ''),//来源渠道 "source_channel" => $request->param('source_channel', ''),//来源渠道
"source" => $request->param('source', ''),//来源 "source" => $request->param('source', ''),//来源
"name" => $request->param('name', ''),//姓名 "name" => $request->param('name', ''),//姓名

58
niucloud/app/api/controller/member/Member.php

@ -26,7 +26,7 @@ class Member extends BaseApiController
*/ */
public function info() public function info()
{ {
return success(( new MemberService() )->getInfo()); return success((new MemberService())->getInfo());
} }
/** /**
@ -35,7 +35,7 @@ class Member extends BaseApiController
*/ */
public function center() public function center()
{ {
return success(( new MemberService() )->center()); return success((new MemberService())->center());
} }
/** /**
@ -46,12 +46,12 @@ class Member extends BaseApiController
public function modify($field) public function modify($field)
{ {
$data = $this->request->params([ $data = $this->request->params([
[ 'value', '' ], ['value', ''],
[ 'field', $field ], ['field', $field],
]); ]);
$data[ $field ] = $data[ 'value' ]; $data[$field] = $data['value'];
$this->validate($data, 'app\validate\member\Member.modify'); $this->validate($data, 'app\validate\member\Member.modify');
( new MemberService() )->modify($field, $data[ 'value' ]); (new MemberService())->modify($field, $data['value']);
return success('MODIFY_SUCCESS'); return success('MODIFY_SUCCESS');
} }
@ -62,9 +62,9 @@ class Member extends BaseApiController
public function edit() public function edit()
{ {
$data = $this->request->params([ $data = $this->request->params([
[ 'data', [] ], ['data', []],
]); ]);
( new MemberService() )->edit($data[ 'data' ]); (new MemberService())->edit($data['data']);
return success('MODIFY_SUCCESS'); return success('MODIFY_SUCCESS');
} }
@ -75,10 +75,10 @@ class Member extends BaseApiController
public function mobile() public function mobile()
{ {
$data = $this->request->params([ $data = $this->request->params([
[ 'mobile', '' ], ['mobile', ''],
[ 'mobile_code', '' ], ['mobile_code', ''],
]); ]);
return success(( new AuthService() )->bindMobile($data[ 'mobile' ], $data[ 'mobile_code' ])); return success((new AuthService())->bindMobile($data['mobile'], $data['mobile_code']));
} }
/** /**
@ -88,11 +88,11 @@ class Member extends BaseApiController
public function log() public function log()
{ {
$data = $this->request->params([ $data = $this->request->params([
[ 'route', '' ], ['route', ''],
[ 'params', '' ], ['params', ''],
[ 'pre_route', '' ] ['pre_route', '']
]); ]);
( new MemberLogService() )->log($data); (new MemberLogService())->log($data);
return success(); return success();
} }
@ -101,7 +101,7 @@ class Member extends BaseApiController
*/ */
public function qrcode() public function qrcode()
{ {
return success(( new MemberService() )->getQrcode()); return success((new MemberService())->getQrcode());
} }
/** /**
@ -111,12 +111,30 @@ class Member extends BaseApiController
public function getMobile() public function getMobile()
{ {
$data = $this->request->params([ $data = $this->request->params([
[ 'mobile_code', '' ], ['mobile_code', ''],
]); ]);
return success(( new AuthService() )->getMobile($data[ 'mobile_code' ])); return success((new AuthService())->getMobile($data['mobile_code']));
} }
public function get_campuses_list(){ public function get_campuses_list()
return success(( new MemberService() )->get_campuses_list()); {
return success((new MemberService())->get_campuses_list());
}
public function list_call_up()
{
$data = $this->request->params([
['sales_id', ''],
]);
return success((new MemberService())->list_call_up($data['sales_id']));
}
public function update_call_up()
{
$data = $this->request->params([
['id', ''],
['remarks', ''],
]);
return success((new MemberService())->update_call_up($data['id'], $data['remarks']));
} }
} }

3
niucloud/app/api/route/member.php

@ -105,9 +105,6 @@ Route::group('member', function () {
//获取签到设置 //获取签到设置
Route::get('sign/config', 'member.MemberSign/signConfig'); Route::get('sign/config', 'member.MemberSign/signConfig');
})->middleware(ApiChannel::class) })->middleware(ApiChannel::class)
->middleware(ApiCheckToken::class, true) ->middleware(ApiCheckToken::class, true)
->middleware(ApiLog::class); ->middleware(ApiLog::class);

4
niucloud/app/api/route/route.php

@ -340,6 +340,9 @@ Route::group(function () {
Route::get('course/scheduleList', 'apiController.course/schedule_list'); Route::get('course/scheduleList', 'apiController.course/schedule_list');
Route::get('per_list_call_up', 'member.Member/list_call_up');
Route::post('per_update_call_up', 'member.Member/update_call_up');
})->middleware(ApiChannel::class) })->middleware(ApiChannel::class)
->middleware(ApiPersonnelCheckToken::class, true) ->middleware(ApiPersonnelCheckToken::class, true)
->middleware(ApiLog::class); ->middleware(ApiLog::class);
@ -417,6 +420,7 @@ Route::group(function () {
})->middleware(ApiChannel::class) })->middleware(ApiChannel::class)
->middleware(ApiCheckToken::class, true) ->middleware(ApiCheckToken::class, true)
->middleware(ApiLog::class); ->middleware(ApiLog::class);

2
niucloud/app/common.php

@ -1237,7 +1237,7 @@ function get_dict_value($key, $value)
$map[$item['value']] = $item['name']; $map[$item['value']] = $item['name'];
} }
return $map[$value] ?? '未知'; return $map[$value] ?? '';
} }

10
niucloud/app/model/resource_sharing/ResourceSharing.php

@ -12,6 +12,7 @@
namespace app\model\resource_sharing; namespace app\model\resource_sharing;
use app\model\customer_resources\CustomerResources; use app\model\customer_resources\CustomerResources;
use app\model\six_speed\SixSpeed;
use core\base\BaseModel; use core\base\BaseModel;
use think\model\concern\SoftDelete; use think\model\concern\SoftDelete;
use think\model\relation\HasMany; use think\model\relation\HasMany;
@ -125,6 +126,11 @@ class ResourceSharing extends BaseModel
{ {
return $this->hasOne(CustomerResources::class, 'id', 'resource_id'); return $this->hasOne(CustomerResources::class, 'id', 'resource_id');
} }
/**
* 关联six_speed表(一对一)
*/
public function sixSpeed(): HasOne
{
return $this->hasOne(SixSpeed::class, 'resource_id', 'resource_id');
}
} }

2
niucloud/app/service/api/apiService/CommonService.php

@ -40,7 +40,7 @@ class CommonService extends BaseApiService
$res = $model->field($field)->find();//员工信息 $res = $model->field($field)->find();//员工信息
if($res){ if($res){
$res = $res->toArray(); $res = $res->toArray()['dictionary'];
}else{ }else{
$res = []; $res = [];
} }

32
niucloud/app/service/api/apiService/ResourceSharingService.php

@ -13,6 +13,7 @@ namespace app\service\api\apiService;
use app\model\campus\Campus; use app\model\campus\Campus;
use app\model\campus_person_role\CampusPersonRole; use app\model\campus_person_role\CampusPersonRole;
use app\model\communication_records\CommunicationRecords;
use app\model\customer_resources\CustomerResources; use app\model\customer_resources\CustomerResources;
use app\model\order_table\OrderTable; use app\model\order_table\OrderTable;
use app\model\resource_sharing\ResourceSharing; use app\model\resource_sharing\ResourceSharing;
@ -90,23 +91,36 @@ class ResourceSharingService extends BaseApiService
$model = $model->whereOr('shared_by', $where['shared_by']); $model = $model->whereOr('shared_by', $where['shared_by']);
} }
//分页查询 //分页查询
$res = $model->with([ $res = $model->with(['customerResource','sixSpeed'])
'customerResource' => function ($query) { ->withJoin(['customerResource','sixSpeed'])
$query->append(['initial_intent_name']);
}
])
->withJoin(['customerResource'])
->order('customerResource.updated_at', 'desc') ->order('customerResource.updated_at', 'desc')
->paginate([ ->paginate([
'list_rows' => $limit, 'list_rows' => $limit,
'page' => $page, 'page' => $page,
])->toArray(); ])->toArray();
// 获取列表中的campus_ids
$campus_ids = array_unique(array_column(array_column($res['data'],'customerResource'), 'campus'));
$campus = new Campus(); $campus = new Campus();
$campus_name = $campus->whereIn('id', $campus_ids)->column('campus_name', 'id');
// 获取客户资源沟通记录
$customer_resource_ids = array_unique(array_column($res['data'], 'resource_id'));
// 2. 构建子查询:获取每个 resource_id 的最大 communication_time
$subQuery = CommunicationRecords::field('resource_id, max(communication_time) as max_time')
->whereIn('resource_id', $customer_resource_ids) // 只查询指定的 resource_id
->group('resource_id')
->select()
->toArray();
$resultdata = [];
foreach ($subQuery as $item) {
$resultdata[$item['resource_id']] = $item['max_time'];
}
foreach ($res['data'] as &$item){ foreach ($res['data'] as &$item){
$item['customerResource']['source'] = get_dict_value('source',$item['customerResource']['source']);
$item['customerResource']['source_channel'] = get_dict_value('source',$item['customerResource']['source_channel']); $item['customerResource']['source_channel'] = get_dict_value('source',$item['customerResource']['source_channel']);
$item['customerResource']['campus_name'] = $campus->where(['id' =>$item['customerResource']['campus']])->value("campus_name"); $item['customerResource']['campus_name'] = $campus_name[$item['customerResource']['campus']] ?? '';
$item['customerResource']['communication_time'] = $resultdata[$item['resource_id']] ?? '';
} }
return $res; return $res;

11
niucloud/app/service/api/login/LoginService.php

@ -177,6 +177,7 @@ class LoginService extends BaseApiService
try { try {
$token_info = TokenAuth::parseToken($token, AppTypeDict::API); $token_info = TokenAuth::parseToken($token, AppTypeDict::API);
dd($token_info);
} catch (Throwable $e) { } catch (Throwable $e) {
// if(env('app_debug', false)){ // if(env('app_debug', false)){
// throw new AuthException($e->getMessage(), 401); // throw new AuthException($e->getMessage(), 401);
@ -206,11 +207,7 @@ class LoginService extends BaseApiService
try { try {
$token_info = TokenAuth::parseToken($token, AppTypeDict::PERSONNEL); $token_info = TokenAuth::parseToken($token, AppTypeDict::PERSONNEL);
} catch (Throwable $e) { } catch (Throwable $e) {
// if(env('app_debug', false)){
// throw new AuthException($e->getMessage(), 401);
// }else{
throw new AuthException('LOGIN_EXPIRE', 401); throw new AuthException('LOGIN_EXPIRE', 401);
// }
} }
if (!$token_info) { if (!$token_info) {
throw new AuthException('MUST_LOGIN', 401); throw new AuthException('MUST_LOGIN', 401);
@ -355,7 +352,7 @@ class LoginService extends BaseApiService
//查询员工信息 //查询员工信息
$member_info = (new Personnel())->where('phone', $params['phone'])->find(); $member_info = (new Personnel())->where('phone', $params['phone'])->find();
if(!$member_info){ if (!$member_info) {
throw new ApiException('账号不存在'); throw new ApiException('账号不存在');
} }
@ -371,10 +368,10 @@ class LoginService extends BaseApiService
$user->save(); $user->save();
$expire_time = env('system.api_token_expire_time') ?? 3600; $expire_time = env('system.api_token_expire_time') ?? 3600;
//生成token //生成token
$token_info = TokenAuth::createToken($member_info->id, AppTypeDict::PERSONNEL, ['id' => $member_info->id, 'member_id'=>$member_info->id, 'phone' => $member_info->phone, 'user_type' => $params['login_type']], $expire_time); $token_info = TokenAuth::createToken($member_info->id, AppTypeDict::PERSONNEL, ['id' => $member_info->id, 'member_id' => $member_info->id, 'phone' => $member_info->phone, 'user_type' => $params['login_type']], $expire_time);
//获取用户部门ids(1市场、2教师、3销售) //获取用户部门ids(1市场、2教师、3销售)
$depts = (new CampusPersonRole())->where('person_id', $member_info->id)->column('dept_id'); $depts = (new CampusPersonRole())->where('person_id', $member_info->id)->column('dept_id');
$user_type = in_array($params['login_type'],$depts) ? $params['login_type'] : ''; $user_type = in_array($params['login_type'], $depts) ? $params['login_type'] : '';
return [ return [
'token' => $token_info['token'],//token 'token' => $token_info['token'],//token

51
niucloud/app/service/api/member/MemberService.php

@ -12,6 +12,7 @@
namespace app\service\api\member; namespace app\service\api\member;
use app\model\campus\Campus; use app\model\campus\Campus;
use app\model\communication_records\CommunicationRecords;
use app\model\member\Member; use app\model\member\Member;
use app\service\core\member\CoreMemberService; use app\service\core\member\CoreMemberService;
use core\base\BaseApiService; use core\base\BaseApiService;
@ -35,7 +36,8 @@ class MemberService extends BaseApiService
/** /**
* 新增会员 * 新增会员
*/ */
public function add(array $data){ public function add(array $data)
{
return $this->model->create($data)?->member_id ?? 0; return $this->model->create($data)?->member_id ?? 0;
} }
@ -48,7 +50,7 @@ class MemberService extends BaseApiService
{ {
$member = $this->findMemberInfo(['member_id' => $this->member_id]); $member = $this->findMemberInfo(['member_id' => $this->member_id]);
if($member->isEmpty()) throw new ApiException('MEMBER_NOT_EXIST'); if ($member->isEmpty()) throw new ApiException('MEMBER_NOT_EXIST');
$member->allowField(['nickname', 'headimg', 'birthday', 'sex', 'last_visit_time'])->save($data); $member->allowField(['nickname', 'headimg', 'birthday', 'sex', 'last_visit_time'])->save($data);
return true; return true;
} }
@ -86,28 +88,29 @@ class MemberService extends BaseApiService
* @param array $data * @param array $data
* @return Member|array|mixed|Model !!! 仔细看,返回值是模型对象 如果想要判断是否为空 请用 $member->isEmpty() * @return Member|array|mixed|Model !!! 仔细看,返回值是模型对象 如果想要判断是否为空 请用 $member->isEmpty()
*/ */
public function findMemberInfo(array $data){ public function findMemberInfo(array $data)
{
//会员账号 //会员账号
if(!empty($data['username'])) if (!empty($data['username']))
$where[] = ['username', '=', $data['username']]; $where[] = ['username', '=', $data['username']];
//会员手机号 //会员手机号
if(!empty($data['mobile'])) if (!empty($data['mobile']))
$where[] = ['mobile', '=', $data['mobile']]; $where[] = ['mobile', '=', $data['mobile']];
//会员id //会员id
if(!empty($data['member_id'])) if (!empty($data['member_id']))
$where[] = ['member_id', '=', $data['member_id']]; $where[] = ['member_id', '=', $data['member_id']];
//微信公众号openid //微信公众号openid
if(!empty($data['wx_openid'])) if (!empty($data['wx_openid']))
$where[] = ['wx_openid', '=', $data['wx_openid']]; $where[] = ['wx_openid', '=', $data['wx_openid']];
//微信小程序openid //微信小程序openid
if(!empty($data['weapp_openid'])) if (!empty($data['weapp_openid']))
$where[] = ['weapp_openid', '=', $data['weapp_openid']]; $where[] = ['weapp_openid', '=', $data['weapp_openid']];
// 微信unionid // 微信unionid
if(!empty($data['wx_unionid'])) if (!empty($data['wx_unionid']))
$where[] = ['wx_unionid', '=', $data['wx_unionid']]; $where[] = ['wx_unionid', '=', $data['wx_unionid']];
if(!empty($data['username|mobile'])) if (!empty($data['username|mobile']))
$where[] = ['username|mobile', '=', $data['username|mobile']]; $where[] = ['username|mobile', '=', $data['username|mobile']];
if(empty($where)){ if (empty($where)) {
$where[] = ['member_id', '=', -1]; $where[] = ['member_id', '=', -1];
} }
return $this->model->where($where)->findOrEmpty(); return $this->model->where($where)->findOrEmpty();
@ -119,7 +122,8 @@ class MemberService extends BaseApiService
* @param $data * @param $data
* @return void * @return void
*/ */
public function editByFind($member, $data){ public function editByFind($member, $data)
{
return $member->save($data); return $member->save($data);
} }
@ -134,11 +138,12 @@ class MemberService extends BaseApiService
return (new CoreMemberService())->modify($this->member_id, $field, $data); return (new CoreMemberService())->modify($this->member_id, $field, $data);
} }
public function getQrcode(){ public function getQrcode()
{
// 生成会员二维码 // 生成会员二维码
$qrcode_dir = 'upload/member/temp'; $qrcode_dir = 'upload/member/temp';
if (!is_dir($qrcode_dir)) mkdir($qrcode_dir, intval('0755', 8), true); if (!is_dir($qrcode_dir)) mkdir($qrcode_dir, intval('0755', 8), true);
$id = "member-".$this->member_id; $id = "member-" . $this->member_id;
$qrcode_path = "{$qrcode_dir}/order_qrcode_{$this->member_id}.png"; $qrcode_path = "{$qrcode_dir}/order_qrcode_{$this->member_id}.png";
\core\util\QRcode::png($id, $qrcode_path, 'L', 16, 1); \core\util\QRcode::png($id, $qrcode_path, 'L', 16, 1);
@ -153,16 +158,30 @@ class MemberService extends BaseApiService
/** /**
* 初始化会员数据 * 初始化会员数据
*/ */
public function initMemberData(){ public function initMemberData()
{
if ($this->member_id) { if ($this->member_id) {
event("MemberLoginAfter", ['member_id' => $this->member_id]); event("MemberLoginAfter", ['member_id' => $this->member_id]);
} }
} }
public function get_campuses_list(){ public function get_campuses_list()
{
$campus = new Campus(); $campus = new Campus();
$list = $campus->select()->toArray(); $list = $campus->select()->toArray();
return $list; return $list;
} }
public function list_call_up($resource_id)
{
$campus = new CommunicationRecords();
return $campus->where('resource_id', $resource_id)->select()->toArray();
}
public function update_call_up($resource_id, $remarks)
{
$campus = new CommunicationRecords();
return $campus->where('resource_id', $resource_id)->update(['remarks' => $remarks]);
}
} }

Loading…
Cancel
Save