485 lines
15 KiB
PHP
Raw Normal View History

2024-09-29 15:43:18 +08:00
<?php
namespace app\channel\controller;
set_time_limit(0);
ini_set('memory_limit','512M');
ini_set('default_socket_timeout', -1); //不超时
use PhpOffice\PhpSpreadsheet\IOFactory;
use think\admin\Controller;
use app\channel\service\CardService;
use app\channel\service\CardGroupService;
use app\merchant\service\CardService as Log;
use app\merchant\service\MerchantService;
/**
* 渠道卡密管理
* Class ChannelProduct
* @package app\channel\controller
*/
class Card extends Controller
{
/**
* cell
*
* @var array
*/
private $cell = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');
/**
* 绑定数据表
* @var string
*/
private $table = 'ChannelCard';
/**
* 卡密管理
* @auth true
* @menu true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function index()
{
$this->title = '渠道卡密管理';
$query = $this->_query($this->table);
$this->card = input('card');
$this->chongzhi = 2;
$where = array();
if ($this->card) {
$where['card'] = $this->card;
}
if ($where) {
$log = Log::instance()->db()->where($where)->select()->toArray();
$ids = array();
if ($log) {
foreach ($log as $k => $v) {
$ids[$v['card_id']] = $v['card_id'];
}
$ids = implode(',', $ids);
$query->whereRaw(' id in ('.$ids.')');
}
}
$use = input('use');
if ($use) {
if ($use > 0) {
$query->where(array('use' => $use));
} else {
$query->where(array('use' => 1, 'use_num' => 0));
}
}
$query->equal('cnum,cpwd,status,value,use_mid,use_num,group_id')->dateBetween('create_at');
$query->order('use asc, id desc')->page();
}
/**
* 数据列表处理
* @param array $data
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
protected function _page_filter(&$data)
{
$where['is_deleted'] = 0;
$where['status'] = 1;
$this->merchant = MerchantService::instance()->db()->whereRaw('id in('.CardService::instance()->getMerchant().')')->where($where)->select()->toArray();
//$this->merchant = array();
foreach ($data as $k => $v) {
$data[$k]['log'] = Log::instance()->getData($v['id']);
$data[$k]['log_error'] = Log::instance()->getNum($v['id'], 7);
$data[$k]['merchant'] = array();
if (isset($v['use_mid']) && $v['use_mid'] > 0) {
$data[$k]['merchant'] = MerchantService::instance()->get($v['use_mid']);
}
$data[$k]['group'] = CardGroupService::instance()->db()->where(array('id' => $v['group_id']))->find();
}
if ($this->chongzhi == 1) {
$this->total = CardService::instance()->total(false);
} else {
$this->total = CardService::instance()->total(true);
}
}
/**
* 充值卡管理
* @auth true
* @menu true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function chongzhi()
{
$this->title = '充值卡管理';
$query = $this->_query($this->table);
$this->card = input('card');
$this->chongzhi = 1;
$where = array();
if ($this->card) {
$where['card'] = $this->card;
}
if ($where) {
$log = Log::instance()->db()->where($where)->select()->toArray();
$ids = array();
if ($log) {
foreach ($log as $k => $v) {
$ids[$v['card_id']] = $v['card_id'];
}
$ids = implode(',', $ids);
$query->whereRaw(' id in ('.$ids.')');
}
}
$use = input('use');
if ($use) {
if ($use > 0) {
$query->where(array('use' => $use));
} else {
$query->where(array('use' => 1, 'use_num' => 0));
}
}
$query->equal('cnum,cpwd,status,value,use_mid,use_num')->dateBetween('create_at');
$query->order('chongzhi_use asc, id desc')->page();
}
/**
* 表单数据处理
* @param array $data
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
protected function _form_filter(&$data)
{
//$this->merchant = MerchantService::instance()->getAll();
$this->merchant = array();
$this->group = CardGroupService::instance()->db()->where(array('status' => 1))->select()->toArray();
if ($this->request->isPost()) {
if (empty($data['cnum'])) $this->error('卡号不能为空');
if (empty($data['cpwd'])) $this->error('密码不能为空');
}
}
/**
* 添加卡密
* @auth true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function add()
{
$this->_form($this->table, 'form');
}
/**
* 编辑卡密
* @auth true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function edit()
{
$this->_form($this->table, 'form');
}
/**
* 修改卡密状态
* @auth true
* @throws \think\db\exception\DbException
*/
public function state()
{
$this->_save($this->table, $this->_vali([
'status.in:0,1' => '状态值范围异常!',
'status.require' => '状态值不能为空!',
]));
}
/**
* 修改卡密可用状态
* @auth true
* @throws \think\db\exception\DbException
*/
public function setUse()
{
$this->_save($this->table, $this->_vali([
'use.in:0,1' => '状态值范围异常!',
'use.require' => '状态值不能为空!',
]));
}
/**
* 删除卡密
* @auth true
* @throws \think\db\exception\DbException
*/
public function remove()
{
$this->_delete($this->table);
}
/**
* 分配卡密
* @auth true
* @menu true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function set()
{
if ($this->request->isGet()) {
$this->_form($this->table, 'set');
} else {
$mid = input('mid');
$num = input('num');
// 面值
$value = input('value');
$data = CardService::instance()->getData($value, -1, $num, false);
if ($data) {
if (isset($data[0]) && $data[0]) {
$index = count($data);
foreach ($data as $k => $v) {
CardService::instance()->setMid($k, $v, $mid);
}
} else {
$index = 1;
CardService::instance()->setMid(0, $data, $mid);
}
$this->success('操作成功,共分配' . $index . '个卡密', '');
} else {
$this->error('操作失败,没有可用的卡密');
}
}
}
/**
* 导出卡密
* @auth true
* @menu true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function out()
{
if (input('output') === 'json') {
$mid = input('mid');
$num = input('num');
$page = input('page', 1);
// 面值
$value = input('value');
$type = input('type', 1);
if ($type == 1) {
$state = 100;
} else {
$state = false;
}
$data = CardService::instance()->getData($value, $mid, $num, $state, $page);
if ($data) {
$result['list'] = $data['data'];
$result['show_value'] = $value > 0 ? true : false;
$result['page'] = array
(
'current' => $data['current_page'],
'pages' => $data['last_page'],
'limit' => $data['per_page'],
'total' => $data['total'],
'current' => 1,
'pages' => 1,
'limit' => $data['per_page'],
'total' => $data['total'],
);
$this->success('获取数据列表成功', $result);
} else {
$this->error('操作失败,没有可用的卡密');
}
} else {
$this->_form($this->table, 'out');
}
}
# 上传
public function upfile()
{
if ($this->request->isGet()) {
$this->_form($this->table, 'upfile');
} else {
$this->upload();
}
}
# 上传卡密
public function upload()
{
if ($_FILES) {
$data = $_FILES;
} else {
$this->error('请上传文件');
}
$mid = input('mid', -1);
$group_id = input('group_id', 1);
$value = input('value', 1000);
if ($group_id == -1) {
$group_id = CardGroupService::instance()->up(date('Ymd'), 1);
} else {
CardGroupService::instance()->db()->where(array('id' => $group_id))->update(array('status' => '1'));
}
if (strstr($data['file']['name'], '.xls')) {
$file = 'card/card.xlsx';
} else {
$file = 'card/card.txt';
}
if (is_file($file)) {
@unlink($file);
}
copy($data['file']['tmp_name'], $file);
if (is_file($file)) {
$data = $this->read($file);
$yes = 0;
$no = 0;
if ($data) {
foreach ($data as $k => $v) {
if ($k >= 0) {
$state = $this->up($k, $v['A'], $v['B'], (isset($v['C']) ? $v['C'] : 0), $value, $mid, $group_id);
if ($state && $state > 0) {
$yes++;
} elseif (!$state) {
$no++;
}
}
}
$this->success('已上传,其中' . $yes . '条上传成功,' . $no . '条上传失败', '');
} else {
$this->error('上传失败');
}
} else {
$this->error('上传失败');
}
}
private function up($k, $cnum, $cpwd, $v, $value, $mid, $group_id)
{
if (is_numeric($cnum) && is_numeric($cpwd) && $cnum && $cpwd) {
if (!$v) {
$v = $value;
}
return CardService::instance()->up($k, $cnum, $cpwd, $v, $mid, 1, 1, $group_id);
} else {
return -1;
}
}
private function read($file)
{
if (!strstr($file, '.xls')) {
$content = file_get_contents($file);
$data = explode("\r\n", $content);
$result = array();
if (preg_match("/\s/", $data[0])) {
$i = 0;
foreach ($data as $k => $v) {
if ($v) {
$v = preg_replace('/\s(?=\S)/', ' ', $v);
$temp = explode(' ', $v);
$result[$i]['A'] = $temp[0];
$result[$i]['B'] = $temp[1];
if (isset($temp[2])) {
$result[$i]['C'] = $temp[2];
} else {
$result[$i]['C'] = '';
}
$i++;
}
}
} else {
if (isset($data[2]) && strlen($data[2]) <= 5) {
# 面值
$value = true;
$total = count($data)/3;
} else {
$value = false;
$total = count($data)/2;
}
for ($i = 0; $i< $total; $i++) {
$index = $i;
if ($i > 0) {
$index += 1;
}
$result[$i]['A'] = $data[$index];
$result[$i]['B'] = $data[$index + 1] ?? 0;
if ($value) {
$result[$i]['C'] = $data[$index + 2] ?? '';
} else {
$result[$i]['C'] = '';
}
}
}
return $result;
}
// include('../excel/PHPExcel.php');
//
// $objRead = new \PHPExcel_Reader_Excel2007();
// if (!$objRead->canRead($file)) {
// $objRead = new \PHPExcel_Reader_Excel5();
// if (!$objRead->canRead($file)) {
// Export::alert('file not exists!');
// }
// }
// $objRead = new IOFactory();
$sheet = 0;
$offset = 0;
$obj = IOFactory::load($file);
$currSheet = $obj->getActiveSheet();
$columnH = $currSheet->getHighestRow();
$columnCnt = array_search($columnH, $this->cell);
$rowCnt = $currSheet->getHighestRow();
$data = array();
for ($_row = 1; $_row <= $rowCnt; $_row++) {
for ($_column = 0; $_column <= $columnCnt; $_column++) {
$cellId = $this->cell[$_column].$_row;
//$cellValue = $currSheet->getCell($cellId)->getValue();
$cellValue = $currSheet->getCell($cellId)->getCalculatedValue();
if ($cellValue instanceof \PHPExcel_RichText) {
$cellValue = $cellValue->__toString();
}
$data[$_row][$this->cell[$_column]] = $cellValue;
}
}
return $data;
}
}