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.

328 lines
16 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']);
}
}
$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', '');
switch($info['type']) {
case 1:
$data = array_merge(I('resource'), $data);
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['handler_id'] = $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('申请成功') : $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]])->save(['status'=>2]);
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('更新失败');
}
}