From 0a63e9d42ad7692ea28cf4af95dda956dd1aad7e Mon Sep 17 00:00:00 2001 From: dengbw Date: Fri, 17 Mar 2023 17:34:18 +0800 Subject: [PATCH] market_317 --- admin/controllers/receiver/CluesCfrom.php | 192 +++++++++ admin/views/receiver/cluescfrom/edit.php | 31 ++ admin/views/receiver/cluescfrom/lists.php | 225 ++++++++++ .../market/Market_sylive_activity_model.php | 7 +- .../market/Market_sylive_blacklist_model.php | 11 + .../market/Market_sylive_checkdata_model.php | 18 + .../market/Market_sylive_customer_model.php | 51 +++ market/controllers/api/sylive/Activity.php | 217 +++++++++- market/controllers/api/sylive/Goods.php | 11 +- .../controllers/api/sylive/GroupsCustomer.php | 287 +++++++++++++ .../controllers/api/sylive/GroupsExchange.php | 395 ++++++++++++++++++ www/market/temp/blacklist.xlsx | Bin 0 -> 8984 bytes www/market/temp/customer.xlsx | Bin 0 -> 9143 bytes www/market/temp/exchange.xlsx | Bin 0 -> 9134 bytes 14 files changed, 1431 insertions(+), 14 deletions(-) create mode 100644 admin/controllers/receiver/CluesCfrom.php create mode 100644 admin/views/receiver/cluescfrom/edit.php create mode 100644 admin/views/receiver/cluescfrom/lists.php create mode 100644 common/models/market/Market_sylive_blacklist_model.php create mode 100644 common/models/market/Market_sylive_checkdata_model.php create mode 100644 common/models/market/Market_sylive_customer_model.php create mode 100644 market/controllers/api/sylive/GroupsCustomer.php create mode 100644 market/controllers/api/sylive/GroupsExchange.php create mode 100644 www/market/temp/blacklist.xlsx create mode 100644 www/market/temp/customer.xlsx create mode 100644 www/market/temp/exchange.xlsx diff --git a/admin/controllers/receiver/CluesCfrom.php b/admin/controllers/receiver/CluesCfrom.php new file mode 100644 index 00000000..591d2f7d --- /dev/null +++ b/admin/controllers/receiver/CluesCfrom.php @@ -0,0 +1,192 @@ + ['title' => '客户标签', 'url' => '/receiver/tag'], + 2 => ['title' => '车主标签', 'url' => '/receiver/ownersTag'], + 3 => ['title' => '战败标签', 'url' => '/receiver/tag?tag_type=1'], + 4 => ['title' => '意向标签', 'url' => '/receiver/tag?tag_type=2'] + ]; + + public function __construct() + { + parent::__construct(); + $this->load->model('receiver/receiver_clues_cfrom_model', 'mdCluesCfrom'); + } + + //首页信息 + public function index() + { + return $this->lists(); + } + + //数据列表 + public function lists() + { + $params = $this->input->get(); + $params['page'] = $params['page'] ? intval($params['page']) : 1; + $params['size'] = $params['size'] ? intval($params['size']) : 20; + $lists = []; + $where = ["status<>" => -1, 'pid' => 0]; + if (strlen($params['status'])) { + $where['status'] = $params['status']; + } + if ($params['title']) { + $where['title'] = $params['title']; + } + $count = $this->mdCluesCfrom->count($where); + if ($count) { + $res = $this->mdCluesCfrom->select($where, "c_time desc", $params['page'], $params['size']); + foreach ($res as $key => $value) { + $setValue = []; + $setValue['id'] = $value['id']; + $setValue['name'] = $value['title']; + $options = ''; + $res_cfrom = $this->mdCluesCfrom->select(["status<>" => -1, 'pid' => $value['id']], "c_time desc", 0, 0, 'title'); + $res_cfrom && $options = implode(',', array_column($res_cfrom, 'title')); + $setValue['options'] = $options; + $lists[] = $setValue; + } + } + $this->data['lists'] = $lists; + $this->data['params'] = $params; + $this->data['_title'] = '线索来源列表'; + $this->data['pager'] = array('count' => ceil($count / $params['size']), 'curr' => $params['page'], 'totle' => $count); + return $this->show_view('receiver/cluescfrom/lists', true); + } + + public function get_options() + { + $id = intval($this->input->post('id')); + if (!$id) { + return $this->show_json(SYS_CODE_FAIL, '参数错误!'); + } + $res_tag = $this->mdCluesCfrom->select(["status" => 1, 'pid' => $id], "c_time desc", 0, 0, 'title as name'); + $this->data['lists'] = $res_tag; + return $this->show_json(SYS_CODE_SUCCESS); + } + + //展示单条数据 + public function get() + { + $id = intval($this->input->get('id')); + if ($id) { + $url = "receiver/CluesCfrom/edit"; + $re = $this->mdCluesCfrom->get(['id' => $id]); + if (!$re) { + return $this->show_json(SYS_CODE_FAIL, '数据不存在!'); + } + $name = $re['title']; + } else { + $url = "receiver/CluesCfrom/add"; + $name = ''; + } + $this->data['showInfo'] = ['id' => $id, 'name' => $name, 'url' => $url]; + return $this->show_view('receiver/cluescfrom/edit'); + } + + //添加单条数据 + public function add() + { + $params = $this->input->post(); + if (!$params['name']) { + return $this->show_json(SYS_CODE_FAIL, '名称不能为空!'); + } + $re = $this->mdCluesCfrom->get(['name' => $params['name'], 'pid' => 0, "status<>" => -1]); + if ($re) { + return $this->show_json(SYS_CODE_FAIL, '名称已存在了!'); + } + $id = $this->mdCluesCfrom->add(['name' => $params['name'], 'c_time' => time()]); + if (!$id) { + return $this->show_json(SYS_CODE_FAIL, '保存失败'); + } + return $this->show_json(SYS_CODE_SUCCESS, '保存成功'); + } + + //编辑单条数据 + public function edit() + { + $params = $this->input->post(); + if (!$params['id']) { + return $this->show_json(SYS_CODE_FAIL, '参数错误'); + } + if (!$params['name']) { + return $this->show_json(SYS_CODE_FAIL, '请输入名称'); + } + $re = $this->mdCluesCfrom->get(array('name' => $params['name'], 'pid' => 0, "status<>" => -1)); + if ($re && $re['id'] != $params['id']) { + return $this->show_json(SYS_CODE_FAIL, '名称已存在了!'); + } + $this->mdCluesCfrom->update(['name' => $params['name']], ['id' => $params['id']]); + return $this->show_json(SYS_CODE_SUCCESS, '保存成功'); + } + + //删除单条数据 + public function del() + { + $id = $this->input->post('id'); + if (!$id) { + $this->show_json(SYS_CODE_FAIL, '参数错误'); + } + $re = $this->mdCluesCfrom->get(['id' => $id]); + if (!$re) { + return $this->show_json(SYS_CODE_FAIL, '数据不存在!'); + } + $this->mdCluesCfrom->update(['status' => -1], ['id' => $id]); + return $this->show_json(SYS_CODE_SUCCESS, '操作成功'); + } + + //修改来源选项 + function edit_options() + { + $pid = $this->input->post('id'); + $options = $this->input->post('options'); + if (!$pid || !$options) { + return $this->show_json(SYS_CODE_FAIL, '参数错误!'); + } + $re = $this->mdCluesCfrom->get(['id' => $pid]); + if (!$re) { + return $this->show_json(SYS_CODE_FAIL, '数据不存在!'); + } + $add_tag = $edit_tag = []; + foreach ($options as $key => $value) { + $data = ['name' => $value['name'], 'status' => $value['status']]; + if ($value['name']) { + if ($value['id']) {//修改 + $this->mdCluesCfrom->update($data, ['id' => $value['id']]); + } else {//新增 + $add_tag[] = ['name' => $value['name'], 'c_time' => time()]; + $data['pid'] = $pid; + $this->mdCluesCfrom->add($data); + } + } + } + return $this->show_json(SYS_CODE_SUCCESS, '保存成功'); + } + + function edit_status() + { + $id = $this->input->post('id'); + $stauts = intval($this->input->post('status')); + if (!$id) { + $this->show_json(SYS_CODE_FAIL, '参数错误'); + } + $this->mdCluesCfrom->update(['status' => $stauts], ['id' => $id]); + return $this->show_json(SYS_CODE_SUCCESS, '操作成功'); + } + + //批量操作(默认修改状态) + public function batch() + { + + } + + //导出数据列表 + public function export() + { + + } +} \ No newline at end of file diff --git a/admin/views/receiver/cluescfrom/edit.php b/admin/views/receiver/cluescfrom/edit.php new file mode 100644 index 00000000..c73770c5 --- /dev/null +++ b/admin/views/receiver/cluescfrom/edit.php @@ -0,0 +1,31 @@ +
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + 越大越靠前 +
+
+
+ +
+
\ No newline at end of file diff --git a/admin/views/receiver/cluescfrom/lists.php b/admin/views/receiver/cluescfrom/lists.php new file mode 100644 index 00000000..f120ea33 --- /dev/null +++ b/admin/views/receiver/cluescfrom/lists.php @@ -0,0 +1,225 @@ +
+ +
+
共有条数据
+ + + + + + + + + + + + + + + + + + + + + + + + +
名称标签选项类型排序状态
+ 编辑选项 + 编辑标签 + + 关闭 + + + 开启 + + 删除 +
+ +
+
+
+
+
+ +
+
+
+ \ No newline at end of file diff --git a/common/models/market/Market_sylive_activity_model.php b/common/models/market/Market_sylive_activity_model.php index 858af198..60cf3492 100644 --- a/common/models/market/Market_sylive_activity_model.php +++ b/common/models/market/Market_sylive_activity_model.php @@ -20,10 +20,11 @@ class Market_sylive_activity_model extends HD_Model * @param $mch_id * @return string|string[] */ - public function pay_config($mch_id=''){ + public function pay_config($mch_id = '') + { $conf_arr = [ - '1614399682' => APPPATH."../api/third_party/WXconfig/dcz_WxPay.Config.php", //东创紫联支付配置 - '1604032585' => APPPATH."../api/third_party/WXconfig/hdy_WxPay.Config.php", //好店云支付配置 + '1614399682' => APPPATH . "../api/third_party/WXconfig/dcz_WxPay.Config.php", //东创紫联支付配置 + '1604032585' => APPPATH . "../api/third_party/WXconfig/hdy_WxPay.Config.php", //好店云支付配置 ]; return $mch_id ? $conf_arr[$mch_id] : $conf_arr; } diff --git a/common/models/market/Market_sylive_blacklist_model.php b/common/models/market/Market_sylive_blacklist_model.php new file mode 100644 index 00000000..8de28430 --- /dev/null +++ b/common/models/market/Market_sylive_blacklist_model.php @@ -0,0 +1,11 @@ +table_name, 'default'); + } +} \ No newline at end of file diff --git a/common/models/market/Market_sylive_checkdata_model.php b/common/models/market/Market_sylive_checkdata_model.php new file mode 100644 index 00000000..e32256c8 --- /dev/null +++ b/common/models/market/Market_sylive_checkdata_model.php @@ -0,0 +1,18 @@ +table_name, 'default'); + } + +} \ No newline at end of file diff --git a/common/models/market/Market_sylive_customer_model.php b/common/models/market/Market_sylive_customer_model.php new file mode 100644 index 00000000..119d39d3 --- /dev/null +++ b/common/models/market/Market_sylive_customer_model.php @@ -0,0 +1,51 @@ +table_name, 'default'); + } + + /** + * Notes:回访标签 + * Created on: 2023/2/27 14:46 + * Created by: dengbw + * @param string $id + * @return array|mixed + */ + public function visitTagAry($id = '') + { + $arr = [1 => '无效', 2 => '战败', 3 => '高意向', 4 => '有意向', 5 => '低意向', 6 => '无意向']; + if (strlen($id)) { + return $arr[$id]; + } else { + return $arr; + } + } + + /** + * Notes:支付状态 + * Created on: 2022/9/26 14:46 + * Created by: dengbw + * @param string $status + * @return array|mixed + */ + public function statusAry($status = '') + { + $arr = [0 => '待分配', 1 => '待回访', 2 => '已回访']; + if (strlen($status)) { + return $arr[$status]; + } else { + return $arr; + } + } +} \ No newline at end of file diff --git a/market/controllers/api/sylive/Activity.php b/market/controllers/api/sylive/Activity.php index 2a61d338..73ff823d 100644 --- a/market/controllers/api/sylive/Activity.php +++ b/market/controllers/api/sylive/Activity.php @@ -21,6 +21,8 @@ class Activity extends BaseController $this->load->model('market/Market_sylive_activity_team_model', 'mdSyliveActivityTeam'); $this->load->model('market/Market_sylive_groups_model', 'mdSyliveGroups'); $this->load->model('market/Market_sylive_groups_user_model', 'mdSyliveGroupsUser'); + $this->load->model('market/Market_sylive_customer_model', 'mdSyliveCustomer'); + $this->load->model('market/Market_sylive_blacklist_model', 'mdSyliveBlacklist'); } /** @@ -60,11 +62,14 @@ class Activity extends BaseController $dateRange = $v['timeStart'] != '0000-00-00 00:00:00' ? [$v['timeStart'], $v['timeEnd']] : ''; $status = intval($v['status']); $activityId = intval($v['activityId']); - $bgImg = $channelImg = $banner = $sharePhoto = $shareImg = $shareTitle = $pay = $bottoms = []; + $bgImg = $channelImg = $banner = $sharePhoto = $shareImg = $shareTitle = $pay = $bottoms = $showBlacklist = []; $item = ['itemImg' => [], 'title' => '', 'introduction' => '', 'price' => '', 'stock' => '', 'dateRange' => '']; $coupon = ['img' => [], 'title' => '', 'rules' => '', 'price' => '', 'dateRange' => '']; $draw = ['bgImg' => [], 'sms' => '', 'winNum' => [], 'winType' => []]; $pay = ['way' => 1, 'price' => '', 'img' => []]; + $signBespeak = ['status' => 0, 'title' => '', 'content' => '', 'itemId' => '']; + $barrage = ['color' => 0, 'title' => '']; + $button = ['title' => '']; $v['shareTitle'] && $shareTitle = json_decode($v['shareTitle'], true); $jsondata = $v['jsondata'] ? json_decode($v['jsondata'], true) : []; if ($jsondata['item']) { @@ -147,13 +152,16 @@ class Activity extends BaseController $re_gro = $this->mdSyliveGroups->get(['activityId' => $activityId, 'parentId' => 0, 'status>=' => 0]); $re_gro && $groups = 1; $blacklist = intval($jsondata['blacklist']); + $jsondata['signBespeak'] && $signBespeak = $jsondata['signBespeak']; + $jsondata['barrage'] && $barrage = $jsondata['barrage']; + $jsondata['button'] && $button = $jsondata['button']; //抽奖配置 $re_draw = $this->mdSyliveActivityDraw->get(['activityId' => $activityId]); if ($re_draw) { if ($re_draw['bgImg']) { $draw['bgImg'] = [['uid' => 1, 'fileUrl' => $re_draw['bgImg'], 'url' => build_qiniu_image_url($re_draw['bgImg']), 'status' => 'done']]; } - $re_draw['sms'] && $draw['sms'] = $re_draw['sms']; + $re_draw['sms'] && $draw['sms'] = $re_draw['sms']; $re_draw['winNum'] && $draw['winNum'] = json_decode($re_draw['winNum'], true); if ($re_draw['winType']) { $winType = []; @@ -166,12 +174,27 @@ class Activity extends BaseController $draw['winType'] = $winType; } } + //访问标签 + $visitTag = []; + $visitTagAry = $this->mdSyliveCustomer->visitTagAry(); + foreach ($visitTagAry as $k2 => $v2) { + $tag = $jsondata['visitTag'][$k2] ? $jsondata['visitTag'][$k2] : ''; + $visitTag[] = ['id' => $k2, 'title' => $v2, 'tag' => $tag]; + } + if ($blacklist) { + $res_bl = $this->mdSyliveBlacklist->select(['activityId' => $activityId], 'blacklistId desc', 0, 0, 'blacklistId,mobile'); + foreach ($res_bl as $k2 => $v2) { + $showBlacklist[] = ['id' => $v2['blacklistId'], 'mobile' => $v2['mobile'], 'type' => 'show']; + } + } $list[] = [ 'activityId' => $activityId, 'title' => $v['title'], 'channelId' => $v['channelId'], 'pay' => $pay, 'organizationId' => $organizationId, 'activityStart' => $activityStart, 'shareTitle' => $shareTitle, 'dateRange' => $dateRange, 'coupon' => $coupon, 'drawCode' => $v['drawCode'], 'bgImg' => $bgImg, 'channelImg' => $channelImg, 'banner' => $banner, 'sharePhoto' => $sharePhoto, 'shareImg' => $shareImg, 'item' => $item, 'url' => $url, - 'mchId' => $v['mchId'], 'protocolTitle' => $v['protocolTitle'], 'protocol' => $v['protocol'], 'serviceLink' => $serviceLink, 'bottoms' => $bottoms, 'draw' => $draw - , 's_time' => $v['timeStart'], 'e_time' => $v['timeEnd'], 'status' => $status, 'groups' => $groups, 'blacklist' => $blacklist, 'createTime' => $v['createTime']]; + 'mchId' => $v['mchId'], 'protocolTitle' => $v['protocolTitle'], 'protocol' => $v['protocol'], 'serviceLink' => $serviceLink, + 'bottoms' => $bottoms, 'draw' => $draw, 'visitTag' => $visitTag, 'blacklist' => $blacklist, 'showBlacklist' => $showBlacklist, + 'signBespeak' => $signBespeak, 'barrage' => $barrage, 'button' => $button, + 's_time' => $v['timeStart'], 'e_time' => $v['timeEnd'], 'status' => $status, 'groups' => $groups, 'createTime' => $v['createTime']]; } } $date = ['list' => $list, 'count' => $count]; @@ -203,7 +226,7 @@ class Activity extends BaseController $serviceLink = $this->input_param('serviceLink'); $activityStart = $this->input_param('activityStart'); $bottoms = $this->input_param('bottoms'); - $blacklist = intval($this->input_param('blacklist')); + $signBespeak = $this->input_param('signBespeak'); if (!$title) { $this->return_json('请输入活动标题'); } @@ -251,7 +274,11 @@ class Activity extends BaseController $setBottoms[] = $v; } $jsondata['bottoms'] = $setBottoms; - $jsondata['blacklist'] = $blacklist; + $jsondata['blacklist'] = intval($this->input_param('blacklist')); + !$signBespeak['status'] && $signBespeak = ['status' => 0, 'title' => '', 'content' => '', 'itemId' => '']; + $jsondata['signBespeak'] = $signBespeak; + $jsondata['barrage'] = $this->input_param('barrage'); + $jsondata['button'] = $this->input_param('button'); $jsondata = json_encode($jsondata, JSON_UNESCAPED_UNICODE); $createTime = date('Y-m-d H:i:s'); $addData = ['title' => $title, 'bgImg' => $bgImg, 'channelImg' => $channelImg, 'channelId' => $channelId, 'jsondata' => $jsondata @@ -298,7 +325,7 @@ class Activity extends BaseController $organizationId = intval($this->input_param('organizationId')); $activityStart = $this->input_param('activityStart'); $bottoms = $this->input_param('bottoms'); - $blacklist = intval($this->input_param('blacklist')); + $signBespeak = $this->input_param('signBespeak'); if (!$activityId) { $this->return_json('参数错误'); } @@ -347,7 +374,11 @@ class Activity extends BaseController $jsondata['pay'] = $pay; $jsondata['banner'] = $banner; $jsondata['serviceLink'] = $serviceLink; - $jsondata['blacklist'] = $blacklist; + $jsondata['blacklist'] = intval($this->input_param('blacklist')); + !$signBespeak['status'] && $signBespeak = ['status' => 0, 'title' => '', 'content' => '', 'itemId' => '']; + $jsondata['signBespeak'] = $signBespeak; + $jsondata['barrage'] = $this->input_param('barrage'); + $jsondata['button'] = $this->input_param('button'); $setBottoms = []; foreach ($bottoms as $v) { if ($v['urlType'] == 'link') { @@ -435,6 +466,51 @@ class Activity extends BaseController $this->return_response($groupsIds); } + /** + * Notes:活动信息 + * Created on: 2023/3/02 10:37 + * Created by: dengbw + */ + public function info_get() + { + $activityId = $this->input_param('activityId'); + $type = $this->input_param('type'); + if (!$activityId) { + $this->return_json('参数错误'); + } + $select = 'activityId,title,channelId'; + if ($type == 'customer') { + $select = 'title,jsondata'; + } + $re = $this->mdSyliveActivity->get(['activityId' => $activityId], $select); + if (!$re) { + $this->return_json('活动不存在'); + } + $info = []; + if ($type == 'customer') { + $info['title'] = $re['title']; + $statusAry = $visitTagAry = []; + $getStatusAry = $this->mdSyliveCustomer->statusAry(); + foreach ($getStatusAry as $k => $v) { + $statusAry[] = ['value' => $k, 'label' => $v]; + } + $jsonData = $re['jsondata'] ? json_decode($re['jsondata'], true) : []; + $getVisitTagAry = $this->mdSyliveCustomer->visitTagAry(); + foreach ($getVisitTagAry as $k => $v) { + $label = $v; + if ($jsonData['visitTag'][$k]) { + $label = $label . '(' . $jsonData['visitTag'][$k] . ')'; + } + $visitTagAry[] = ['value' => $k, 'label' => $label]; + } + $info['statusAry'] = $statusAry; + $info['visitTagAry'] = $visitTagAry; + } else { + $info = $re; + } + $this->return_response($info); + } + /** * Notes:活动详情 * Created on: 2022/9/29 10:37 @@ -582,6 +658,35 @@ class Activity extends BaseController $this->return_response(); } + /** + * Notes:修改回访标签 + * Created on: 2023/2/27 10:08 + * Created by: dengbw + */ + public function visit_tag_put() + { + $activityId = intval($this->input_param('activityId')); + if (!$activityId) { + $this->return_json('参数错误'); + } + $visitTag = $this->input_param('visitTag'); + $re = $this->mdSyliveActivity->get(['activityId' => $activityId], 'jsondata'); + $jsondata = $re['jsondata'] ? json_decode($re['jsondata'], true) : []; + $setVisitTag = []; + if ($visitTag) { + foreach ($visitTag as $v) { + $v['tag'] && $setVisitTag[$v['id']] = $v['tag']; + } + } + $jsondata['visitTag'] = $setVisitTag ? $setVisitTag : []; + $upDate['jsondata'] = json_encode($jsondata, JSON_UNESCAPED_UNICODE); + $ret = $this->mdSyliveActivity->update($upDate, ['activityId' => $activityId]); + if (!$ret) { + $this->return_json('修改回访标签失败'); + } + $this->return_response(); + } + /** * Notes:修改抽奖配置 * Created on: 2023/1/30 10:08 @@ -627,4 +732,100 @@ class Activity extends BaseController $this->return_response(); } + /** + * Notes:修改黑名单 + * Created on: 2023/3/03 10:08 + * Created by: dengbw + */ + public function blacklist_put() + { + $activityId = intval($this->input_param('activityId')); + if (!$activityId) { + $this->return_json('参数错误'); + } + $blacklist = $this->input_param('blacklist'); + $addDate = []; + $delId = ''; + foreach ($blacklist as $v) { + if ($v['type'] == 'add' && $v['mobile']) { + $re = $this->mdSyliveBlacklist->get(['activityId' => $activityId, 'mobile' => $v['mobile']]); + if (!$re) { + $addDate[] = ['mobile' => $v['mobile'], 'activityId' => $activityId, 'createTime' => date('Y-m-d H:i:s')]; + } + } else if ($v['type'] == 'del' && $v['id']) { + $delId = $delId ? $delId . ',' . $v['id'] : $v['id']; + } + } + if (count($addDate)) { + $this->mdSyliveBlacklist->add_batch($addDate); + } + if ($delId) { + $this->mdSyliveBlacklist->delete(["blacklistId in({$delId})" => null]); + } + $this->return_response(); + } + + /** + * Notes:导入黑名单 + * Created on: 2023/3/06 17:24 + * Created by: dengbw + * @throws PHPExcel_Exception + * @throws PHPExcel_Reader_Exception + */ + public function blacklist_import_post() + { + require_once COMMPATH . '/third_party/PHPExcel/IOFactory.php'; + $res = $this->upload(); + if (!$res['code']) { + return $this->return_json($res['message']); + } + $file = $res['path']; + if ($res['file_ext'] == '.xls') { + $reader = \PHPExcel_IOFactory::createReader('Excel5'); // 读取 excel 文档 + } elseif ($res['file_ext'] == '.xlsx') { + $reader = \PHPExcel_IOFactory::createReader('Excel2007'); // 读取 excel 文档 + } else { + return $this->return_json('文件无法识别'); + } + $PHPExcel = $reader->load($file); // 文档名称 + $objWorksheet = $PHPExcel->getActiveSheet(); + $rowCnt = $objWorksheet->getHighestRow(); //获取总行数 + if ($rowCnt > 800) { + @unlink($file); + $this->return_json('数据大于800请拆分多个表格导入'); + } + $activityId = $_POST['activityId']; + $addDate = []; + for ($_row = 2; $_row <= $rowCnt; $_row++) { //读取内容 + $mobile = $objWorksheet->getCell('A' . $_row)->getValue(); + if ($mobile) { + $re = $this->mdSyliveBlacklist->get(['activityId' => $activityId, 'mobile' => $mobile]); + if (!$re) { + $addDate[] = ['mobile' => $mobile, 'activityId' => $activityId, 'createTime' => date('Y-m-d H:i:s')]; + } + } + } + $count = count($addDate); + if ($count) { + $this->mdSyliveBlacklist->add_batch($addDate); + } + @unlink($file); + $this->return_response('', "成功新增{$count}个黑名单"); + } + + private function upload() + { + $config['upload_path'] = $_SERVER['DOCUMENT_ROOT'] . '/temp/'; + $config['allowed_types'] = '*'; + $config['max_size'] = 5120; + $config['file_name'] = 'blacklist_' . time() . rand(1, 99999); + $this->load->library('upload', $config); + if (!$this->upload->do_upload('file')) { + return ['code' => SYS_CODE_FAIL, 'message' => $this->upload->display_errors('', '')]; + } else { + $data = $this->upload->data(); + return ['code' => SYS_CODE_SUCCESS, 'path' => $data['full_path'], 'file_ext' => $data['file_ext']]; + } + } + } diff --git a/market/controllers/api/sylive/Goods.php b/market/controllers/api/sylive/Goods.php index bff0d7d8..9826fa43 100644 --- a/market/controllers/api/sylive/Goods.php +++ b/market/controllers/api/sylive/Goods.php @@ -72,7 +72,8 @@ class Goods extends BaseController $list[] = ['itemId' => $v['itemId'], 'activityId' => $v['activityId'], 'title' => $v['title'], 'banner' => $banner , 'dateRange' => $dateRange, 'useRange' => $useRange, 'descrip' => $v['descrip'], 'price' => $v['price'], 'stock' => $v['stock'] , 'timeStart' => $timeStart, 'sort' => $v['sort'], 'status' => intval($v['status']), 'createTime' => $v['createTime'] - , 'ifAddress' => intval($v['ifAddress']), 'type' => intval($v['type']), 'typeName' => $this->mdSyliveItems->typeAry($v['type']), 'url' => $url]; + , 'ifAddress' => intval($v['ifAddress']), 'ifCode' => intval($v['ifCode']), 'type' => intval($v['type']), + 'typeName' => $this->mdSyliveItems->typeAry($v['type']), 'url' => $url]; } } $date = ['list' => $list, 'count' => $count]; @@ -88,9 +89,11 @@ class Goods extends BaseController { $activityId = intval($this->input_param('activityId')); $type = $this->input_param('type'); + $price = $this->input_param('price'); $where['status>='] = 0; $where['activityId'] = $activityId; strlen($type) && $where['type'] = $type; + strlen($price) && $where['price'] = $price; $list = $this->mdSyliveItems->select($where, 'sort asc,itemId desc', 0, 0, 'itemId,title'); $this->return_response_list($list); } @@ -110,6 +113,7 @@ class Goods extends BaseController $stock = $this->input_param('stock'); $sort = $this->input_param('sort'); $ifAddress = intval($this->input_param('ifAddress')); + $ifCode = intval($this->input_param('ifCode')); $dateRange = $this->input_param('dateRange'); $useRange = $this->input_param('useRange'); $type = intval($this->input_param('type')); @@ -120,7 +124,7 @@ class Goods extends BaseController $this->return_json('请输入商品标题'); } $addDate = ['activityId' => $activityId, 'title' => $title, 'price' => $price, 'stock' => $stock, 'sort' => $sort - , 'ifAddress' => $ifAddress, 'descrip' => $descrip, 'type' => $type, 'createTime' => date('Y-m-d H:i:s')]; + , 'ifAddress' => $ifAddress, 'ifCode' => $ifCode, 'descrip' => $descrip, 'type' => $type, 'createTime' => date('Y-m-d H:i:s')]; $addDate['timeStart'] = $dateRange[0] ? $dateRange[0] : '0000-00-00 00:00:00'; $addDate['timeEnd'] = $dateRange[1] ? $dateRange[1] : '0000-00-00 00:00:00'; $addDate['useStart'] = $useRange[0] ? $useRange[0] : '0000-00-00 00:00:00'; @@ -155,6 +159,7 @@ class Goods extends BaseController $stock = $this->input_param('stock'); $sort = intval($this->input_param('sort')); $ifAddress = intval($this->input_param('ifAddress')); + $ifCode = intval($this->input_param('ifCode')); $dateRange = $this->input_param('dateRange'); $useRange = $this->input_param('useRange'); $type = intval($this->input_param('type')); @@ -169,7 +174,7 @@ class Goods extends BaseController $this->return_json('商品不存在'); } $upDate = ['title' => $title, 'price' => $price, 'stock' => $stock, 'sort' => $sort - , 'ifAddress' => $ifAddress, 'descrip' => $descrip, 'type' => $type]; + , 'ifAddress' => $ifAddress, 'ifCode' => $ifCode, 'descrip' => $descrip, 'type' => $type]; $upDate['timeStart'] = $dateRange[0] ? $dateRange[0] : '0000-00-00 00:00:00'; $upDate['timeEnd'] = $dateRange[1] ? $dateRange[1] : '0000-00-00 00:00:00'; $upDate['useStart'] = $useRange[0] ? $useRange[0] : '0000-00-00 00:00:00'; diff --git a/market/controllers/api/sylive/GroupsCustomer.php b/market/controllers/api/sylive/GroupsCustomer.php new file mode 100644 index 00000000..94ff78d5 --- /dev/null +++ b/market/controllers/api/sylive/GroupsCustomer.php @@ -0,0 +1,287 @@ +load->model('market/Market_sylive_customer_model', 'mdSyliveCustomer'); + $this->load->model('market/Market_sylive_groups_model', 'mdSyliveGroups'); + $this->load->model('market/Market_sylive_groups_user_model', 'mdSyliveGroupsUser'); + $this->load->model('market/Market_sylive_user_model', 'mdSyliveUser'); + $this->load->model('market/Market_sylive_activity_model', 'mdSyliveActivity'); + } + + /** + * Notes:订单管理列表 + * Created on: 2022/12/08 14:48 + * Created by: dengbw + */ + public function index_get() + { + $date = $this->dataSelect($this->inputs); + $this->return_response_list($date); + } + + /** + * Notes:导出订单数据 + * Created on: 2022/12/08 15:26 + * Created by: dengbw + */ + public function export_get() + { + $this->inputs['page'] = 1; + $this->inputs['limit'] = 10000; + $date = $this->dataSelect($this->inputs); + $this->return_response_list($date); + } + + /** + * Notes:导入审核数据 + * Created on: 2023/2/22 17:24 + * Created by: dengbw + * @throws PHPExcel_Exception + * @throws PHPExcel_Reader_Exception + */ + public function import_post() + { + require_once COMMPATH . '/third_party/PHPExcel/IOFactory.php'; + $res = $this->upload(); + if (!$res['code']) { + return $this->return_json($res['message']); + } + $file = $res['path']; + if ($res['file_ext'] == '.xls') { + $reader = \PHPExcel_IOFactory::createReader('Excel5'); // 读取 excel 文档 + } elseif ($res['file_ext'] == '.xlsx') { + $reader = \PHPExcel_IOFactory::createReader('Excel2007'); // 读取 excel 文档 + } else { + return $this->return_json('文件无法识别'); + } + $PHPExcel = $reader->load($file); // 文档名称 + $objWorksheet = $PHPExcel->getActiveSheet(); + $rowCnt = $objWorksheet->getHighestRow(); //获取总行数 + if ($rowCnt > 800) { + @unlink($file); + $this->return_json('数据大于800请拆分多个表格导入'); + } + $activityId = $_POST['activityId']; + $done = 0; + for ($_row = 2; $_row <= $rowCnt; $_row++) { //读取内容 + $name = $objWorksheet->getCell('A' . $_row)->getValue(); + $mobile = $objWorksheet->getCell('B' . $_row)->getValue(); + $bizName = $objWorksheet->getCell('C' . $_row)->getValue(); + //$cfName = $objWorksheet->getCell('D' . $_row)->getValue(); + $cfMobile = $objWorksheet->getCell('E' . $_row)->getValue(); + $level = $objWorksheet->getCell('F' . $_row)->getValue(); + if ($mobile) { + $re = $this->mdSyliveCustomer->get(['activityId' => $activityId, 'mobile' => $mobile, 'status<>' => -1]); + if (!$re) { + !$name && $name = ''; + !$level && $level = ''; + $addData = ['activityId' => $activityId, 'name' => $name, 'mobile' => $mobile, 'level' => $level + , 'createTime' => date('Y-m-d H:i:s')]; + if ($cfMobile) { + $re_user = $this->mdSyliveUser->get(['mobile' => $cfMobile, 'organizationId>' => 0, 'status<>' => -1]); + if ($re_user['userId']) { + $addData['cfUserId'] = $re_user['userId']; + $re_groUser = $this->mdSyliveGroupsUser->get(['activityId' => $activityId, 'userId' => $re_user['userId'], 'status<>' => -1]); + if ($re_groUser['bizId']) { + $addData['status'] = 1; + $addData['bizId'] = $re_groUser['bizId']; + $addData['levelId1'] = $re_groUser['levelId1']; + $addData['levelId2'] = $re_groUser['levelId2']; + $addData['levelId3'] = $re_groUser['levelId3']; + } + } + } + if (!$addData['bizId'] && $bizName) { + $re_gro = $this->mdSyliveGroups->get(['activityId' => $activityId, 'groupsName' => $bizName, 'ifBiz' => 1, 'status<>' => -1]); + if ($re_gro['groupsId']) { + $addData['bizId'] = $re_gro['groupsId']; + $levelAry = $this->getLevelAry($re_gro['parentId']); + $levelAry['levelId1'] && $addData['levelId1'] = $levelAry['levelId1']; + $levelAry['levelId2'] && $addData['levelId2'] = $levelAry['levelId2']; + $levelAry['levelId3'] && $addData['levelId3'] = $levelAry['levelId3']; + } + } + $re_user = $this->mdSyliveUser->get(['mobile' => $mobile, 'status<>' => -1]); + if ($re_user['userId']) { + $addData['userId'] = $re_user['userId']; + } + $customerId = $this->mdSyliveCustomer->add($addData); + $customerId && $done++; + } + } + } + @unlink($file); + $this->return_response('', "成功新增{$done}个客户"); + } + + /** + * Notes:获取分组等级ID + * Created on: 2023/3/01 14:30 + * Created by: dengbw + * @param $groupsId + * @param array $data + * @return array + */ + private function getLevelAry($groupsId, $data = []) + { + $re = $this->mdSyliveGroups->get(['groupsId' => $groupsId], 'groupsId,parentId,groupsLevel'); + if (!$re) { + return $data; + } else { + if ($re['groupsLevel']) {//分类id + $levelId = "levelId" . $re['groupsLevel']; + $data[$levelId] = $re['groupsId']; + } + if ($re['parentId']) { + return $this->getLevelAry($re['parentId'], $data); + } else { + return $data; + } + } + } + + private function dataSelect($params) + { + $activityId = intval($params['activityId']); + $page = $params['page']; + $limit = $params['limit']; + $name = $params['name']; + $mobile = $params['mobile']; + $bizId = $params['bizId']; + $status = $params['status']; + $visitTagId = $params['visitTagId']; + $sort = $params['sort']; + $order = $params['order']; + !$page && $page = 1; + !$limit && $limit = 10; + $sort_order = 'customerId desc'; + if ($sort && $order) { + $sort_order = $sort . ' ' . $order; + } + $list = []; + if (strlen($status)) { + $where["status"] = $status; + } else { + $where["status>=0"] = null; + } + $activityId && $where['activityId'] = $activityId; + $name && $where['name LIKE "%' . trim($name) . '%"'] = null; + $mobile && $where['mobile LIKE "%' . trim($mobile) . '%"'] = null; + $visitTagId && $where['visitTagId'] = $visitTagId; + if ($bizId) { + $res_org = $this->mdSyliveGroups->get(["groupsId" => $bizId]); + if ($res_org) { + if ($res_org['groupsLevel']) { + $levelId = 'levelId' . $res_org['groupsLevel']; + $where[$levelId] = $bizId; + } else if ($res_org['parentId']) {//门店 + $where['bizId'] = $bizId; + } + } + } + if ($limit == 10000) { + $count = $limit; + } else { + $count = $this->mdSyliveCustomer->count($where); + } + if ($count) { + $re = $this->mdSyliveActivity->get(['activityId' => $activityId], 'jsondata'); + $jsonData = $re['jsondata'] ? json_decode($re['jsondata'], true) : []; + $visitTagAry = $this->mdSyliveCustomer->visitTagAry(); + $statusAry = $this->mdSyliveCustomer->statusAry(); + $res = $this->mdSyliveCustomer->select($where, $sort_order, $page, $limit); + foreach ($res as $v) { + $consultant = $this->consultantGet(['activityId' => $v['activityId'] + , 'levelId1' => $v['levelId1'], 'levelId2' => $v['levelId2'], 'levelId3' => $v['levelId3'] + , 'bizId' => $v['bizId'], 'cfUserId' => $v['cfUserId']]); + $status = intval($v['status']); + $statusName = $statusAry[$status]; + $visitTagName = '-'; + $visitTagId = $v['visitTagId']; + if ($visitTagId) { + $visitTagName = $visitTagAry[$visitTagId]; + if ($jsonData['visitTag'][$visitTagId]) { + $visitTagName = $visitTagName . '(' . $jsonData['visitTag'][$visitTagId] . ')'; + } + } + $item = [ + 'customerId' => $v['customerId'], 'name' => $v['name'], 'mobile' => $v['mobile'], 'level' => $v['level'] + , 'statusName' => $statusName, 'visitTagName' => $visitTagName, 'levelName1' => $consultant['levelName1'] + , 'levelName2' => $consultant['levelName2'], 'levelName3' => $consultant['levelName3'] + , 'stores' => $consultant['stores'], 'consultant' => $consultant['consultant'] + ]; + $list[] = $item; + } + } + if ($limit == 10000) { + return $list; + } else { + return ['list' => $list, 'count' => $count]; + } + } + + /** + * Notes:获取顾问信息 + * Created on: 2022/12/08 11:29 + * Created by: dengbw + * @param $params + * @return string + */ + private function consultantGet($params) + { + $stores = $consultant = $levelName1 = $levelName2 = $levelName3 = ''; + $levelId1 = intval($params['levelId1']); + $levelId2 = intval($params['levelId2']); + $levelId3 = intval($params['levelId3']); + $bizId = intval($params['bizId']); + $cfUserId = intval($params['cfUserId']); + if ($bizId) { + $res_org = $this->mdSyliveGroups->get(["groupsId" => $bizId]); + $res_org['groupsName'] && $stores = $res_org['groupsName']; + } + if ($levelId1) { + $res_org = $this->mdSyliveGroups->get(["groupsId" => $levelId1]); + $res_org['groupsName'] && $levelName1 = $res_org['groupsName']; + } + if ($levelId2) { + $res_org = $this->mdSyliveGroups->get(["groupsId" => $levelId2]); + $res_org['groupsName'] && $levelName2 = $res_org['groupsName']; + } + if ($levelId3) { + $res_org = $this->mdSyliveGroups->get(["groupsId" => $levelId3]); + $res_org['groupsName'] && $levelName3 = $res_org['groupsName']; + } + $re_user = $this->mdSyliveUser->get(['userId' => $cfUserId]); + $re_user['uname'] && $consultant = $re_user['uname']; + return ['stores' => $stores, 'consultant' => $consultant, 'levelName1' => $levelName1, + 'levelName2' => $levelName2, 'levelName3' => $levelName3]; + } + + private function upload() + { + $config['upload_path'] = $_SERVER['DOCUMENT_ROOT'] . '/temp/'; + $config['allowed_types'] = '*'; + $config['max_size'] = 5120; + $config['file_name'] = 'customer_' . time() . rand(1, 99999); + $this->load->library('upload', $config); + if (!$this->upload->do_upload('file')) { + return ['code' => SYS_CODE_FAIL, 'message' => $this->upload->display_errors('', '')]; + } else { + $data = $this->upload->data(); + return ['code' => SYS_CODE_SUCCESS, 'path' => $data['full_path'], 'file_ext' => $data['file_ext']]; + } + } + +} \ No newline at end of file diff --git a/market/controllers/api/sylive/GroupsExchange.php b/market/controllers/api/sylive/GroupsExchange.php new file mode 100644 index 00000000..730faa01 --- /dev/null +++ b/market/controllers/api/sylive/GroupsExchange.php @@ -0,0 +1,395 @@ +load->model('market/Market_sylive_order_model', 'mdSyliveOrder'); + $this->load->model('market/Market_sylive_checkdata_model', 'mdSyliveCheckdata'); + $this->load->model('market/Market_sylive_user_model', 'mdSyliveUser'); + $this->load->model('market/Market_sys_admin_model', 'mdSysAdmin'); + $this->load->model('market/Market_sylive_groups_model', 'mdSyliveGroups'); + $this->load->model('market/Market_sylive_activity_kpidata_model', 'mdSyliveActivityKpidata'); + $this->load->model('market/Market_sylive_items_model', 'mdSyliveItems'); + } + + /** + * Notes:订单管理列表 + * Created on: 2022/12/08 14:48 + * Created by: dengbw + */ + public function index_get() + { + $date = $this->orderList($this->inputs); + $this->return_response_list($date); + } + + /** + * Notes:导出订单数据 + * Created on: 2022/12/08 15:26 + * Created by: dengbw + */ + public function export_get() + { + $this->inputs['page'] = 1; + $this->inputs['limit'] = 10000; + $date = $this->orderList($this->inputs); + $this->return_response_list($date); + } + + /** + * Notes:操作详情 + * Created on: 2023/2/21 9:45 + * Created by: dengbw + */ + public function detail_get() + { + $cfId = intval($this->input_param('cfId')); + $type = intval($this->input_param('type')); + $ifCheckAry = [0 => '未审核', 1 => '通过', -1 => '驳回']; + $date = []; + $where = ['cfId' => $cfId, 'type' => $type]; + $res = $this->mdSyliveCheckdata->select($where, 'id DESC', 0, 0); + if ($res) { + $address = ''; + $re = $this->mdSyliveOrder->get(['id' => $cfId]); + if ($re['jsondata']) { + $jsondata = json_decode($re['jsondata'], true); + if ($jsondata['address']) { + $address = $jsondata['address']['region'] . $jsondata['address']['detail']; + } + } + $this->load->library('AliWuliu'); + $cfUids = implode(',', array_column($res, 'cfUid')); + $map_users = $cfUids ? $this->mdSyliveUser->map('userId', 'uname,nickname', ["userId in({$cfUids})" => null]) : []; + $adminUids = implode(',', array_column($res, 'adminUid')); + $map_admins = $adminUids ? $this->mdSysAdmin->map('userId', 'username,nickname', ["userId in({$adminUids})" => null]) : []; + foreach ($res as $v) { + $cfName = $adminName = $adminTime = ''; + $mapUser = $map_users[$v['cfUid']]; + if ($mapUser) { + $cfName = $mapUser['uname'] ? $mapUser['uname'] : $mapUser['nickname']; + } + $mapAdmin = $map_admins[$v['adminUid']]; + if ($mapAdmin) { + $adminName = $mapAdmin['nickname'] ? $mapAdmin['nickname'] : $mapAdmin['username']; + } + $jsondata = $v['jsondata'] ? json_decode($v['jsondata'], true) : []; + $logistics = []; + if ($jsondata) { + $jsondata['adminTime'] && $adminTime = $jsondata['adminTime']; + $courierNo = $jsondata['courierNo']; + if ($courierNo) { + if (strstr($courierNo, 'SF') || strstr($courierNo, 'FW')) { + $re_order = $this->mdSyliveOrder->get(['id' => $v['cfId']]); + if ($re_order['mobile']) { + $courierNo = $courierNo . ':' . substr($re_order['mobile'], -4); + } + } + $re_wl = $this->aliwuliu->kdi($courierNo, '', $debug = false); + if ($re_wl['code'] == 1 && $re_wl['result']) { + $result = $re_wl['result']; + $expName = $result['expName'] ? $result['expName'] : '物流单号'; + $logistics[] = ['time' => $expName, 'status' => $jsondata['courierNo']]; + foreach ($result['list'] as $v2) { + $logistics[] = $v2; + } + } else { + $logistics[] = ['time' => '物流单号', 'status' => $jsondata['courierNo']]; + } + } + } + $cfTime = date('Y-m-d H:i:s', $v['createTime']); + $address = count($logistics) ? $address : ''; + $date[] = ['adminName' => $adminName, 'adminTime' => $adminTime, 'cfName' => $cfName, 'cfTime' => $cfTime + , 'logistics' => $logistics, 'descrip' => $v['descrip'], 'address' => $address + , 'ifCheckName' => $ifCheckAry[$v['ifCheck']]]; + } + } + $this->return_response_list($date); + } + + /** + * Notes:审核数据 + * Created on: 2023/2/21 14:43 + * Created by: dengbw + */ + public function status_put() + { + $cfId = intval($this->input_param('cfId')); + $type = intval($this->input_param('type')); + $useStatus = $this->input_param('useStatus'); + $descrip = $this->input_param('descrip'); + if (!$cfId) { + $this->return_json('参数错误'); + } + $ret = $this->updateCheck(['cfId' => $cfId, 'type' => $type, 'useStatus' => $useStatus, 'descrip' => $descrip]); + if (!$ret) { + $this->return_json('审核失败'); + } + $this->return_response(); + } + + /** + * Notes:导入审核数据 + * Created on: 2023/2/22 17:24 + * Created by: dengbw + * @throws PHPExcel_Exception + * @throws PHPExcel_Reader_Exception + */ + public function import_post() + { + require_once COMMPATH . '/third_party/PHPExcel/IOFactory.php'; + $res = $this->upload(); + if (!$res['code']) { + return $this->return_json($res['message']); + } + $file = $res['path']; + if ($res['file_ext'] == '.xls') { + $reader = \PHPExcel_IOFactory::createReader('Excel5'); // 读取 excel 文档 + } elseif ($res['file_ext'] == '.xlsx') { + $reader = \PHPExcel_IOFactory::createReader('Excel2007'); // 读取 excel 文档 + } else { + return $this->return_json('文件无法识别'); + } + $PHPExcel = $reader->load($file); // 文档名称 + $objWorksheet = $PHPExcel->getActiveSheet(); + $rowCnt = $objWorksheet->getHighestRow(); //获取总行数 + if ($rowCnt > 800) { + @unlink($file); + $this->return_json('数据大于800请拆分多个表格导入'); + } + $done = 0; + for ($_row = 2; $_row <= $rowCnt; $_row++) { //读取内容 + $sid = $objWorksheet->getCell('A' . $_row)->getValue(); + if ($sid) { + $re_order = $this->mdSyliveOrder->get(['sid' => $sid]); + $cfId = $re_order['id']; + if ($cfId) { + $useStatus = $objWorksheet->getCell('B' . $_row)->getValue(); + $descrip = ''; + if ($useStatus == '通过') { + $useStatus = 2; + $courierNo = $objWorksheet->getCell('C' . $_row)->getValue(); + $courierNo && $descrip = $courierNo; + } else { + $useStatus = 3; + $getDescrip = $objWorksheet->getCell('D' . $_row)->getValue(); + $getDescrip && $descrip = $getDescrip; + } + $getType = $objWorksheet->getCell('E' . $_row)->getValue(); + $type = $getType == '抽奖' ? 1 : 0; + $ret = $this->updateCheck(['cfId' => $cfId, 'type' => $type, 'useStatus' => $useStatus, 'descrip' => $descrip]); + if ($ret) { + $done++; + } + } + } + } + @unlink($file); + $this->return_response('', "成功审核{$done}条"); + } + + private function updateCheck($params = []) + { + $cfId = $params['cfId']; + $type = $params['type']; + $useStatus = $params['useStatus']; + $descrip = $params['descrip']; + $ifCheck = 0; + $jsonData['adminTime'] = date('Y-m-d H:i:s'); + if ($useStatus == 2) { + $ifCheck = 1; + $upDate['ifCheck'] = $ifCheck; + $jsonData['courierNo'] = $descrip; + } else if ($useStatus == 3) { + $ifCheck = -1; + $upDate['descrip'] = $descrip; + } + $upDate['ifCheck'] = $ifCheck; + $upDate['jsondata'] = json_encode($jsonData, JSON_UNESCAPED_UNICODE); + $re = $this->mdSyliveCheckdata->max('id', ['cfId' => $cfId, 'type' => $type]); + if ($re['id']) { + $this->mdSyliveCheckdata->update($upDate, ['id' => $re['id']]); + } + $upDate = []; + if ($type == 1) { + $upDate['winUseStatus'] = $useStatus; + } else { + $upDate['useStatus'] = $useStatus; + } + $ret = $this->mdSyliveOrder->update($upDate, ['id' => $cfId]); + return $ret; + } + + private function orderList($params) + { + $activityId = intval($params['activityId']); + $page = $params['page']; + $limit = $params['limit']; + $uname = $params['uname']; + $mobile = $params['mobile']; + $sort = $params['sort']; + $order = $params['order']; + $bizId = $params['bizId']; + $itemId = $params['itemId']; + !$page && $page = 1; + !$limit && $limit = 10; + $sort_order = 'id desc'; + if ($sort && $order) { + $sort_order = $sort . ' ' . $order; + } + $list = []; + $useType = intval($params['useType']); + $useStatus = intval($params['useStatus']); + if ($useType == 1) { + $exchangeName = '抽奖'; + if ($useStatus) { + $where['winUseStatus'] = $useStatus; + } else { + $where['winUseStatus>'] = 0; + } + } else { + $exchangeName = '订单'; + if ($useStatus) { + $where['useStatus'] = $useStatus; + } else { + $where['useStatus>'] = 0; + } + } + $activityId && $where['activityId'] = $activityId; + $itemId && $where['itemId'] = $itemId; + $uname && $where['uname LIKE "%' . trim($uname) . '%"'] = null; + $mobile && $where['mobile LIKE "%' . trim($mobile) . '%"'] = null; + if ($bizId) { + $res_org = $this->mdSyliveGroups->get(["groupsId" => $bizId]); + if ($res_org) { + if ($res_org['groupsLevel']) { + $levelId = 'levelId' . $res_org['groupsLevel']; + $where[$levelId] = $bizId; + } else if ($res_org['parentId']) {//门店 + $where['bizId'] = $bizId; + } + } + } + if ($limit == 10000) { + $count = $limit; + } else { + $count = $this->mdSyliveOrder->count($where); + } + if ($count) { + $res = $this->mdSyliveOrder->select($where, $sort_order, $page, $limit); + $itemIds = implode(',', array_column($res, 'itemId')); + $map_items = $this->mdSyliveItems->map('itemId', 'ifAddress', ["itemId in({$itemIds})" => null]); + foreach ($res as $v) { + $consultant = $this->consultantGet(['activityId' => $v['activityId'], 'userId' => $v['userId'] + , 'levelId1' => $v['levelId1'], 'levelId2' => $v['levelId2'], 'levelId3' => $v['levelId3'] + , 'bizId' => $v['bizId'], 'cfUserId' => $v['cfUserId']]); + $useStatus = $useType == 1 ? $v['winUseStatus'] : $v['useStatus']; + $useStatusName = '未审核'; + if ($useStatus == 2) { + $useStatusName = '通过'; + } else if ($useStatus == 3) { + $useStatusName = '驳回'; + } + $ifAddress = intval($map_items[$v['itemId']]); + $item = [ + 'id' => $v['id'], 'sid' => $v['sid'], 'uname' => $v['uname'], 'mobile' => $v['mobile'], 'itemTitle' => $v['itemTitle'] + , 'totalPrice' => $v['totalPrice'], 'payTime' => $v['payTime'] != '0000-00-00 00:00:00' ? $v['payTime'] : '' + , 'winTime' => $v['winTime'] ? $v['winTime'] : '', 'useStatusName' => $useStatusName, 'useStatus' => intval($useStatus) + , 'levelName1' => $consultant['levelName1'], 'levelName2' => $consultant['levelName2'], 'levelName3' => $consultant['levelName3'] + , 'stores' => $consultant['stores'], 'consultant' => $consultant['consultant'], 'exchangeName' => $exchangeName + , 'ifAddress' => $ifAddress + ]; + if ($limit == 10000) { + $address = $biz = ''; + $jsondata = $v['jsondata'] ? json_decode($v['jsondata'], true) : []; + if ($jsondata['address']) { + $address = $jsondata['address']['region'] . $jsondata['address']['detail']; + } + if ($jsondata['biz']) { + $biz = $jsondata['biz']; + } + $item['address'] = $address; + $item['biz'] = $biz; + } + $list[] = $item; + } + } + if ($limit == 10000) { + return $list; + } else { + return ['list' => $list, 'count' => $count]; + } + } + + /** + * Notes:获取顾问信息 + * Created on: 2022/12/08 11:29 + * Created by: dengbw + * @param $params + * @return string + */ + private function consultantGet($params) + { + $stores = $consultant = $levelName1 = $levelName2 = $levelName3 = ''; + $levelId1 = intval($params['levelId1']); + $levelId2 = intval($params['levelId2']); + $levelId3 = intval($params['levelId3']); + $bizId = intval($params['bizId']); + $cfUserId = intval($params['cfUserId']); + if (!$bizId) { + $re = $this->mdSyliveActivityKpidata->get(['activityId' => $params['activityId'], 'userId' => $params['userId'], 'kpi' => 'order']); + if ($re) { + $levelId1 = $re['levelId1']; + $levelId2 = $re['levelId2']; + $levelId3 = $re['levelId3']; + $bizId = $re['bizId']; + $cfUserId = $re['cfUserId']; + } + } + $res_org = $this->mdSyliveGroups->get(["groupsId" => $bizId]); + $res_org['groupsName'] && $stores = $res_org['groupsName']; + if ($levelId1) { + $res_org = $this->mdSyliveGroups->get(["groupsId" => $levelId1]); + $res_org['groupsName'] && $levelName1 = $res_org['groupsName']; + } + if ($levelId2) { + $res_org = $this->mdSyliveGroups->get(["groupsId" => $levelId2]); + $res_org['groupsName'] && $levelName2 = $res_org['groupsName']; + } + if ($levelId3) { + $res_org = $this->mdSyliveGroups->get(["groupsId" => $levelId3]); + $res_org['groupsName'] && $levelName3 = $res_org['groupsName']; + } + $re_user = $this->mdSyliveUser->get(['userId' => $cfUserId]); + $re_user['uname'] && $consultant = $re_user['uname']; + return ['stores' => $stores, 'consultant' => $consultant, 'levelName1' => $levelName1, + 'levelName2' => $levelName2, 'levelName3' => $levelName3]; + } + + private function upload() + { + $config['upload_path'] = $_SERVER['DOCUMENT_ROOT'] . '/temp/'; + $config['allowed_types'] = '*'; + $config['max_size'] = 5120; + $config['file_name'] = 'exchange_' . time() . rand(1, 99999); + $this->load->library('upload', $config); + if (!$this->upload->do_upload('file')) { + return ['code' => SYS_CODE_FAIL, 'message' => $this->upload->display_errors('', '')]; + } else { + $data = $this->upload->data(); + return ['code' => SYS_CODE_SUCCESS, 'path' => $data['full_path'], 'file_ext' => $data['file_ext']]; + } + } + +} \ No newline at end of file diff --git a/www/market/temp/blacklist.xlsx b/www/market/temp/blacklist.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..beafbe124feda38dd1e751fd0a63c26e6d3665d6 GIT binary patch literal 8984 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 literal 0 HcmV?d00001 diff --git a/www/market/temp/customer.xlsx b/www/market/temp/customer.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ec65e5074099df7da0ce8e6f72e67c360176fa84 GIT binary patch literal 9143 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 literal 0 HcmV?d00001 diff --git a/www/market/temp/exchange.xlsx b/www/market/temp/exchange.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f65aa64a4f6df4aaf5f75d817f1a8fee56289c15 GIT binary patch literal 9134 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 YLt87zK>ymTXrLP)upqf;;wRky1FGb&E&u=k literal 0 HcmV?d00001