You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

443 lines
21 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace Admin\Controller;
use User\Api\UserApi;
/**
* 结算单
* @author ylw
*/
class WorkOrderController extends ThinkController
{
public function list($row = 10, $p = 1)
{
$map = [];
$map['_string'] = " status <> 2 ";
if (I('order_no')) {
$map['_string'] .= ' and order_no like "'.I('order_no').'%"';
}
if (I('user_account')) {
$map['_string'] .= ' and user_account like "%'.I('user_account').'%"';
}
if (I('attachment_type', '')) {
if (I('attachment_type') == 1) {
$map['_string'] .= ' and attachment_url <> ""';
} else {
$map['_string'] .= ' and attachment_url = ""';
}
}
if (I('server_id')) {
$map['server_id'] = I('server_id');
}
if (I('handler_id')) {
$map['handler_id'] = I('handler_id');
}
if (I('game_id')) {
$map['game_id'] = I('game_id');
}
if (I('type')) {
$map['type'] = I('type');
}
if (I('score')) {
$map['score'] = I('score');
}
if (I('status')) {
$map['status'] = I('status');
}
if (isset($_GET['created_time_start'])) {
$map['_string'] .= " and created_time >= " . strtotime($_GET['created_time_start']);
}
if (isset($_GET['created_time_end'])) {
$map['_string'] .= " and created_time < " . (strtotime($_GET['created_time_end']) + 86400);
}
$list = M('work_order_info', 'tab_')->where($map)->page($p, $row)->order("status desc, created_time desc")->select();
$count = M('work_order_info', 'tab_')->where($map)->count();
if ($list) {
foreach ($list as &$item) {
$item['status_desc'] = $this->getOrderStatus($item['status']);
}
}
$this->checkListOrCountAuthRestMap($map,[]);
$page = set_pagination($count, $row);
if ($page) {
$this->assign('_page', $page);
}
$this->assign('admin_users', M('member')->where(['status'=>1])->field('uid, nickname')->select());
$this->assign('list_data', $list);
$this->display('list');
}
public function store()
{
if (IS_POST) {
// 存储
$data['game_id'] = I('game_id');
$data['game_name'] = I('game_name');
$data['server_id'] = I('server_id');
$data['server_name'] = I('server_name');
$data['type'] = I('type');
$data['creator_id'] = is_login();
if (empty($data['game_id']) || empty($data['server_id'])) {
$this->error('请选择游戏及区服');
}
$data['created_time'] = time();
switch (I('type')) {
case 1: // 资源工单
// 如果不是附件形式
$User = new UserApi;
$user_accounts = I('user_accounts');
$passwords = I('user_passwords');
if (count($user_accounts) == 1 && (empty($user_accounts[0]) && empty($passwords[0])) && empty(I('attachment_url'))) {
$this->error('请填写工单内容');
}
M('work_order_info', 'tab_')->startTrans(); //事物
if (!empty($user_accounts[0])) {
for ($i = 0; $i<sizeof($user_accounts); $i++) {
$user = M('user', 'tab_')->where(['account'=>$user_accounts[$i]])->find();
if (empty($user)) {M('work_order_info', 'tab_')->rollback(); $this->error($user_accounts[$i]."账号不存在");}
if ($this->think_ucenter_md5($passwords[$i], UC_AUTH_KEY) != $user['password']) {M('work_order_info', 'tab_')->rollback(); $this->error(sprintf('%s 密码错误', $user_accounts[$i]));}
$info = $data;
$info['user_account'] = $user_accounts[$i];
$info['remark'] = I('remarks')[$i];
$info['role_name'] = I('role_names')[$i];
$info['resource_num'] = I('apply_resources')[$i];
$info['order_no'] = $info['type'] . date('YmdHis'). $i. rand(10, 99) . $info['creator_id'];
//$info['handler_id'] = $info['creator_id'];
$ins = M('work_order_info', 'tab_')->add($info);
if (!$ins) {M('work_order_info', 'tab_')->rollback(); $this->error("创建失败");}
}
}
if (!empty(I('attachment_url', ''))) {
// 添加一条附件信息
$attachement_info = $data;
$attachement_info['attachment_url'] = I('attachment_url', '');
//$attachement_info['handler_id'] = $attachement_info['creator_id'];
$attachement_info['order_no'] = $attachement_info['type'] . date('YmdHis'). rand(100, 999) . $attachement_info['creator_id'];
$ins = M('work_order_info', 'tab_')->add($attachement_info);
if (!$ins) {M('work_order_info', 'tab_')->rollback(); $this->error("创建失败");}
}
M('work_order_info', 'tab_')->commit();
return $this->success('创建工单成功', U('WorkOrder/list'));
break;
case 2: // 反馈工单
$data['order_no'] = $data['type'] . date('YmdHis'). rand(100, 999) . is_login();
if (empty(I('user_account')) || empty(I('role_name')) || empty(I('feedback'))) {
$this->error('请填写必填的数据');
}
// if (empty('handler_id')) {
// $this->error('请选择处理人');
// }
$user = M('user', 'tab_')->where(['account'=>I('user_account')])->find();
if (empty($user)) $this->error("账号不存在");
$data['attachment_url'] = I('attachment_url', '');
$data['user_account'] = I('user_account');
$data['role_name'] = I('role_name');
$data['feedback'] = I('feedback');
//$data['handler_id'] = I('handler_id');
$data['remark'] = I('remark', '');
$data['process_log'] = json_encode([['title'=>sprintf('%s于 %s 创建了工单%s,工单状态处理中。', get_admin_name($data['creator_id']), date('Y-m-d H:i:s'), $data['order_no']), 'type'=>1]]);
$ins = M('work_order_info', 'tab_')->add($data);
return $ins ? $this->success('创建工单成功', U('WorkOrder/list')) : $this->error('创建失败');
break;
default:
$this->error('错误的工单类型');
}
} else {
$this->assign('admin_users', M('member')->where(['status'=>1])->field('uid, nickname')->select());
$this->display('store');
}
}
public function modify($id=0)
{
$info = M('work_order_info', 'tab_')->where(['id'=>$id])->find();
if (empty($info)) $this->error('未找到该资源');
if (IS_POST) {
$data['game_id'] = I('game_id');
$data['game_name'] = I('game_name');
$data['server_id'] = I('server_id');
$data['server_name'] = I('server_name');
$data['attachment_url'] = I('attachment_url', '');
if (empty($data['game_id']) || empty($data['server_id'])) {
$this->error('请选择游戏及区服');
}
switch($info['type']) {
case 1:
$data = array_merge(I('resource'), $data);
if (!empty($info['attachment_url']) && empty($data['attachment_url'])) $this->error('请上传附件');
if (empty($info['attachment_url'])) {
$user = M('user', 'tab_')->where(['account'=>$data['user_account']])->find();
if (empty($user)) $this->error("账号不存在");
if ($this->think_ucenter_md5($data['user_password'], UC_AUTH_KEY) != $user['password']) $this->error(sprintf('%s 密码错误', $user_accounts[$i]));
unset($data['user_password']);
}
$upt = M('work_order_info', 'tab_')->where(['id'=>$id])->save($data);
return $upt ? $this->success('更新成功', U('WorkOrder/list')) : $this->error('更新失败');
break;
case 2:
$data = array_merge(I('feedback'), $data);
$user = M('user', 'tab_')->where(['account'=>$data['user_account']])->find();
if (empty($user)) $this->error("账号不存在{$data['user_account']}");
$log = $this->modifyProcessLog($info, $data);
if ($log) {
$process_log = json_decode($info['process_log'], true) ?: [];
$log = ['title'=>sprintf("%s于%s 修改了工单%s内容", get_admin_name(is_login()), date('Y-m-d H:i:s'), $info['order_no']), 'detail'=>$log, 'type'=>2];
$data['process_log'] = json_encode(array_merge($process_log, [$log]));
}
$upt = M('work_order_info', 'tab_')->where(['id'=>$id])->save($data);
return $upt ? $this->success('更新成功', U('WorkOrder/list')) : $this->error('更新失败');
break;
default:
$this->error('错误的工单类型');
}
} else {
$info['process_log'] = json_decode($info['process_log'], true);
$this->assign('data', $info);
$this->assign('admin_users', M('member')->where(['status'=>1])->field('uid, nickname')->select());
$this->display('modify');
}
}
private function modifyProcessLog($oldData, $newData)
{
$key = ['game_name'=>'游戏名称', 'server_name'=>'区服名称', 'role_name'=>'角色名称', 'user_account'=>'玩家账号', 'feedback'=>'反馈原因', 'handler_id'=>'接单人员', 'remark'=>'备注', 'status'=>'状态', 'attachment_url'=>'附件'];
$log = [];
foreach ($newData as $k => $v) {
if (array_key_exists($k, $oldData) && array_key_exists($k, $key) && $oldData[$k] != $newData[$k]) {
if ($k == 'handler_id') {
$log[] = ['key_name'=>$key[$k], 'key'=>$k, 'old'=>get_admin_name($oldData[$k]), 'new'=>get_admin_name($newData[$k])];
} else if ($k == 'status') {
$log[] = ['key_name'=>$key[$k], 'key'=>$k, 'old'=>$this->getOrderStatus($oldData[$k]), 'new'=>$this->getOrderStatus($newData[$k])];
} else {
$log[] = ['key_name'=>$key[$k], 'key'=>$k, 'old'=>$oldData[$k], 'new'=>$newData[$k]];
}
}
}
return $log;
}
private function getOrderStatus($status)
{
switch($status) {
case 1:
return '完成';
case 2:
return '失败';
case 3:
return '处理中';
default:
return '未知';
}
}
/**
* 系统非常规MD5加密方法
* @param string $str 要加密的字符串
* @return string
*/
public function think_ucenter_md5($str, $key = 'ThinkUCenter'){
return '' === $str ? '' : md5(sha1($str) . $key);
}
public function resourceApply($id=0)
{
$info = M('work_order_info', 'tab_')->where(['id'=>$id])->find();
if (empty($info)) $this->error('未找到该资源');
if ($info['type'] != 1) $this->error('错误的订单类型');
if (IS_POST) {
if (!empty($info['attachment_url'])) {
if (!I('attachment_url')) $this->error('请上传附件');
} else {
if (!I('resource_num')) $this->error('请填写申请资源数量');
}
$data['creator_id'] = is_login();
$data['created_time'] = time();
$data['type'] = $info['type'];
$data['server_id'] = $info['server_id'];
$data['server_name'] = $info['server_name'];
$data['game_id'] = $info['game_id'];
$data['game_name'] = $info['game_name'];
$data['role_name'] = $info['role_name'];
$data['user_account'] = $info['user_account'];
$data['order_no'] = $info['type'] . date('YmdHis', $data['created_time']). rand(100, 999) . $data['creator_id'];
$data['resource_num'] = I('resource_num', 0);
$data['remark'] = I('remark', '');
$data['attachment_url'] = I('attachment_url', '');
$ins = M('work_order_info', 'tab_')->add($data);
return $ins ? $this->success('申请成功', U('WorkOrder/list')) : $this->error('申请失败');
} else {
$this->assign('data', $info);
$this->display('resourceApply');
}
}
// 反馈进度存储
public function feedbackProcessLogStore($id=0)
{
$info = M('work_order_info', 'tab_')->where(['id'=>$id])->find();
if (empty($info)) $this->error('未找到该资源');
$info['process_log'] = json_decode($info['process_log'], true);
if ($info['type'] != 2) $this->error('错误的订单类型');
if (IS_POST) {
$log = [['type'=>3, 'title'=>sprintf('%s于 %s 更新了工单%s进度工单状态%s', get_admin_name(is_login()), date('Y-m-d H:i:s'), $info['order_no'], $this->getOrderStatus($info['status'])), 'detail'=>I('process_log')]];
$upt = M('work_order_info', 'tab_')->where(['id'=>$id])->save(['process_log'=>json_encode(array_merge($info['process_log'], $log))]);
return $upt ? $this->success('更新进度成功', U('WorkOrder/list')) : $this->error('更新进度失败');
} else {
$this->assign('data', $info);
$this->display('feedbackProcessLogStore');
}
}
// 评价
public function evaluate($id=0)
{
$info = M('work_order_info', 'tab_')->where(['id'=>$id])->find();
if (empty($info)) $this->error('未找到该资源');
if (IS_POST) {
if (empty(I('evaluate_content'))) $this->error('请填写评价内容');
$data['score'] = I('evaluate', 5);
$info['process_log'] = json_decode($info['process_log'], true);
$log = [['type'=>3, 'title'=>sprintf('%s于 %s 评价了工单%s为%s分工单状态%s', get_admin_name(is_login()), date('Y-m-d H:i:s'), $info['order_no'], $data['score'], $this->getOrderStatus($info['status'])), 'detail'=>I('evaluate_content')]];
$data['process_log'] = json_encode(array_merge($info['process_log'], $log));
$upt = M('work_order_info', 'tab_')->where(['id'=>$id])->save($data);
return $upt ? $this->success('评价成功', U('WorkOrder/list')) : $this->error('评价失败');
} else {
$this->assign('data', $info);
$this->display('feedbackEvaluate');
}
}
// 删除
public function delete($ids)
{
$delete = M('work_order_info', 'tab_')->where(['id'=>['in', $ids]])->delete();
return $delete ? $this->success('删除成功') : $this->error('删除失败');
}
public function finish($id)
{
$info = M('work_order_info', 'tab_')->where(['id'=>$id])->find();
if (empty($info)) $this->error('未找到该资源');
$info['process_log'] = json_decode($info['process_log'], true);
$log = [['type'=>1, 'title'=>sprintf('%s于 %s 完成了工单%s工单状态完成', get_admin_name(is_login()), date('Y-m-d H:i:s'), $info['order_no'])]];
$data['process_log'] = json_encode(array_merge($info['process_log'], $log));
$data['status'] = 1;
$delete = M('work_order_info', 'tab_')->where(['id'=>$id])->save($data);
return $delete ? $this->success('成功完成工单') : $this->error('更新失败');
}
public function take($id)
{
$info = M('work_order_info', 'tab_')->where(['id'=>$id])->find();
if (empty($info)) $this->error('未找到该资源');
$userid = is_login();
if ($info['status'] == 1) {
$this->error('工单已完成');
}
if (!empty($info['handler_id'])) {
if ($info['handler_id'] != $userid) {
$this->error('工单已被他人领取');
} else {
$this->error('请勿重复领取工单');
}
}
if ($info['type'] == 2) {
$process_log = json_decode($info['process_log'], true) ?: [];
$log = ['title'=>sprintf("%s于%s 接取了工单%s", get_admin_name(is_login()), date('Y-m-d H:i:s'), $info['order_no']), 'detail'=>$log, 'type'=>2];
$data['process_log'] = json_encode(array_merge($process_log, [$log]));
}
$data['handler_id'] = $userid;
$upt = M('work_order_info', 'tab_')->where(['id'=>$id])->save($data);
return $upt ? $this->success('成功接取工单') : $this->error('接单失败');
}
public function statistics($row = 10, $p = 1)
{
$limit = ($p-1)*$row . ", {$row}";
$order = '';
if ($_REQUEST['data_order'] != '') {
$data_order = reset(explode(',', $_REQUEST['data_order']));
$data_order_type = end(explode(',', $_REQUEST['data_order']));
$this->assign('userarpu_order', $data_order);
$this->assign('userarpu_order_type', $data_order_type);
$order = 'order by ' . $data_order_type . " " . ($data_order == 3 ? 'desc' : 'asc');
}
$map = '1=1';
if (!empty(I('nickname'))) {
$map .= " and t.nickname = '" . I('nickname') . "'";
}
// 获取所有传单或者接单用户id
$userids = M('work_order_info', 'tab_')
->field("concat(creator_id, ',', handler_id) as userid")
->join('sys_member as t on creator_id = t.uid or handler_id = t.uid')
->where($map)
->select();
if (empty($userids)) {
$list = [];
$count = 0;
} else {
$userids = implode(',', array_unique(array_filter(explode(',', implode(',', array_column($userids, 'userid'))))));
$count = count($userids);
$list = M('work_order_info', 'tab_')->query("SELECT
t.id,
t.nickname,
sum(total_create_count) as total_create_count,
sum(total_accepted_count) as total_accepted_count,
sum(total_handle_count) as total_handle_count,
sum(total_complete_count) as total_complete_count
FROM
(
SELECT
u.uid as id,
u.nickname,
count(*) AS total_create_count,
count(
IF (i.`handler_id` > 0, 1, NULL)
) AS total_accepted_count,
NULL AS total_handle_count,
NULL AS total_complete_count
FROM
sys_member u
JOIN tab_work_order_info i ON i.creator_id = u.uid
WHERE
u.uid in ({$userids})
GROUP BY u.uid
UNION
SELECT
u.uid as id,
u.nickname,
NULL AS total_create_count,
NULL AS total_accepted_count,
count(*) AS total_handle_count,
count(IF(i.`status` = 1, 1, NULL)) AS total_complete_count
FROM
sys_member u
JOIN tab_work_order_info i ON i.handler_id = u.uid
WHERE
u.uid in ({$userids})
GROUP BY u.uid
) AS t
where {$map}
GROUP BY t.id
$order
limit {$limit}");
}
$this->checkListOrCountAuthRestMap($map,[]);
$page = set_pagination($count, $row);
if ($page) {
$this->assign('_page', $page);
}
$this->assign('list_data', $list);
$this->display('statistics');
}
}