完善打印相关功能

去掉无用的前端文件
修改版权描述
This commit is contained in:
乐风 2021-02-26 05:52:52 +08:00
parent 37229cac4a
commit 427dabb95d
101 changed files with 442 additions and 7350 deletions

View File

@ -49,27 +49,24 @@ MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
# 即时通讯 # 即时通讯
REALTIME_KEY=fsmDyhOBxjUo8Nksd0EAlyJWT4jtfSAO REALTIME_KEY=
REALTIME_URL=ws://192.168.0.2:6002/realtime REALTIME_URL=ws://192.168.0.2:6002/realtime
REALTIME_API=http://192.168.0.2:6002/api REALTIME_API=http://192.168.0.2:6002/api
# 二次验证开关 # 是否二次验证
AUTH_TOTP_STATUS=false AUTH_TOTP=false
# 微信推送 # 是否微信推送
WECHAT_MESSAGE_PUSH_STATUS=false WECHAT_MESSAGE_PUSH=false
# 外部接口 # 外部接口
PLUGIN_SYNC_API_STATUS=false
PLUGIN_SYNC_API_URL= PLUGIN_SYNC_API_URL=
# PRINCE转换 # PRINCE转换
PRINCE_DIR=E:/develop/Prince/engine/bin/prince.exe PRINCE_DIR=E:/develop/Prince/engine/bin/prince.exe
# 添加ag-grid授权 # ag-grid授权
AGGRID_LICENSE= AGGRID_LICENSE="agGrid.LicenseManager.setLicenseKey('key');"
# 演示版本 # 演示模式
DEMO_VERSION=false DEMO_VERSION=false
DEMO_DATA="agGrid.LicenseManager.prototype.validateLicense = function() {}"

View File

@ -4,7 +4,13 @@
[![release][release-badge]][release-link] [![release][release-badge]][release-link]
## 介绍 ## 介绍
本系统是给企业定制开发的基于laravel 8.x框架开发。基本进销存功能、营销管理功能、业务员销售团队分级管理、支持客户自主下单。 1. 进销存功能、营销管理功能、简单生产计划、业务员销售团队分级管理、支持客户任务和业务员任务进度统计、支持客户自主下单。特别注重销售管理、业绩分析。
2. 主要为食品行业生产型和贸易企业定制开发。
3. 包括强大的自定义功能,模型字段(自定义跨表映射功能、视图管理、流程管理、字段权限管理)
## 架构
基于PHP框架Laravel 8.x + MySQL 8.x
## 申明 ## 申明
@ -75,16 +81,25 @@ QQ交流群: 79446405
![h5兼容](http://demo.gdoo.net/uploads/demo/12.png) ![h5兼容](http://demo.gdoo.net/uploads/demo/12.png)
## 架构
基于PHP框架Laravel 8.x + MySQL 8.x
## 安装 ## 安装
1. 上传压缩包到目录这里推荐使用宝塔面板安装php-8.x、mysql-8.x、nginx 1. 推荐使用宝塔面板安装nginx 1.18.x、php-8.x(需要扩展fileinfo)、mysql-8.x(mariaDB 10.4.x)如果你使用win请自行安装相关环境
2. 然后使用 composer install --no-dev 安装依赖 2. 创建网站和数据库, 数据库字符utf8mb4, 在网站目录中设置PHP命令行版本为php-80
3. 如果要修改前端文件请执行 yarn install 安装依赖 3. 下载gdoo: https://gitee.com/hawind/gdoo 上传至宝塔网站根目录并解压
4. 最后导入 database/gdoo-2.2.sql 4. 打开Xshell并登录, 执行 <code>composer -v</code> 查看composer版本, 执行 <code>composer self-update</code> 升级composer至最新版本
5. 然后执行 php artisan key:generate 5. 切换命令行到网站根目录 <code>cd /www/wwwroot/yousite</code>
6. 修改.env相关配置 6. 执行 <code>composer install --no-dev</code> 安装依赖
7. 执行 <code>cp .env.example .env</code> 并修改相关配置
8. 执行 <code>php artisan key:generate</code>
9. 打开宝塔数据库管理:
1. 将项目database目录中的 gdoo-2.2.sql 文件上传并导入到数据库
10. 打开宝塔网站管理:
1. 设置运行目录为public
2. 设置伪静态为laravel5
11. 打开网站并用 <code>admin/123456</code> 登录
## 开发
1. 请在项目根目录执行 <code>yarn install</code> 安装前端依赖
2. 待续
[license-badge]: https://img.shields.io/badge/license-apache2-blue.svg [license-badge]: https://img.shields.io/badge/license-apache2-blue.svg
[license-link]: LICENSE [license-link]: LICENSE

View File

@ -30,7 +30,7 @@ class ApiController extends Controller
$settings['public_url'] = URL::to('/'); $settings['public_url'] = URL::to('/');
$settings['upload_file_type'] = $this->setting['upload_type']; $settings['upload_file_type'] = $this->setting['upload_type'];
$settings['upload_max_size'] = $this->setting['upload_max']; $settings['upload_max_size'] = $this->setting['upload_max'];
$settings['openSource'] = $this->openSource; $settings['realtime'] = not_empty(env('REALTIME_KEY'));
header('Content-type: text/javascript'); header('Content-type: text/javascript');
echo 'var settings = '. json_encode($settings, JSON_UNESCAPED_UNICODE); echo 'var settings = '. json_encode($settings, JSON_UNESCAPED_UNICODE);

View File

@ -27,11 +27,6 @@ class Controller extends BaseController
*/ */
public $powered = 'Gdoo'; public $powered = 'Gdoo';
/**
* @var 是否开源版
*/
public $openSource = false;
/** /**
* @var 配置参数 * @var 配置参数
*/ */
@ -79,14 +74,14 @@ class Controller extends BaseController
$this->ret = RetService::make(); $this->ret = RetService::make();
View::share([ View::share([
'title' => 'GdooOA', 'title' => 'Gdoo',
'setting' => $this->setting, 'setting' => $this->setting,
'public_url' => URL::to('/'), 'public_url' => URL::to('/'),
'upload_url' => URL::to('/uploads'), 'upload_url' => URL::to('/uploads'),
'static_url' => URL::to('/static'), 'static_url' => URL::to('/static'),
'asset_url' => URL::to('/assets'), 'asset_url' => URL::to('/assets'),
'version' => $this->version, 'version' => $this->version,
'openSource' => $this->openSource, 'licenseType' => env('LICENSE_TYPE'),
'resVersion' => $this->resVersion, 'resVersion' => $this->resVersion,
]); ]);
} }

View File

@ -16,7 +16,7 @@ class NotificationService
*/ */
public static function wechatTemplate($users, $content) public static function wechatTemplate($users, $content)
{ {
if (env('WECHAT_MESSAGE_PUSH_STATUS') === false) { if (env('WECHAT_MESSAGE_PUSH') === false) {
return false; return false;
} }

View File

@ -291,7 +291,7 @@ a { outline: none; }
<div class="dashboard-footer"> <div class="dashboard-footer">
<div class="box"> <div class="box">
{{$version}} {{$openSource ? '开源版' : '企业版'}} {{$version}} {{$licenseType ? $licenseType : '开源版'}}
</div> </div>
</div> </div>

View File

@ -1,501 +0,0 @@
<style type="text/css">
html {
overflow: hidden;
}
a { outline: none; }
.dashboard-widget-header {
margin-top: 49px;
height: calc(100vh - 80px);
overflow: hidden;
overflow-y: auto;
}
.dashboard-title {
padding: 10px;
position: absolute;
top: 0;
width: 100vw;
border-bottom: solid 1px rgba(0, 0, 0, 0.05);
}
.dashboard-title .btn {
border: solid 1px rgba(0, 0, 0, 0.15);
background-color: #fff;
}
.dashboard-config {
text-align: center;
height: 26px;
line-height: 26px;
width: 26px;
display: block;
border-radius: 4px;
background-color: #fff;
border: solid 1px rgba(0, 0, 0, 0.1);
}
.dashboard-config .fa {
color: #999;
}
.dashboard-config:hover {
border: solid 1px rgba(0, 0, 0, 0.2);
}
.dashboard-config:hover .fa {
color: #2490f8;
}
.panel-heading {
padding: 5px 10px;
}
.content-body { margin: 0; }
.content-body .panel:last-child {
margin-bottom: 10px;
}
.frame-green .dashboard-title {
color: #fff;
}
.frame-primary .dashboard-title {
color: #58666e;
}
.frame-blue .dashboard-title {
color: #fff;
}
.frame-blue2 .dashboard-title {
color: #1890ff;
}
.frame-blue .quick-text .title,
.frame-purple .quick-text .title,
.frame-green .quick-text .title,
.frame-lilac .quick-text .title,
.frame-wood .quick-text .title {
color: #fff;
}
.frame-blue .dashboard-title .btn,
.frame-purple .dashboard-title .btn,
.frame-green .dashboard-title .btn,
.frame-lilac .dashboard-title .btn,
.frame-wood .dashboard-title .btn {
border: solid 1px rgba(0, 0, 0, 0.15);
background-color: rgba(0, 0, 0, 0.15);
color: #fff;
}
.panel-shadow {
box-shadow: 0px 3px 6px 0px rgba(0, 0, 0, 0.03);
border: solid 1px rgba(0, 0, 0, 0.08);
border-radius: 4px !important;
}
.frame-blue .panel-shadow,
.frame-purple .panel-shadow,
.frame-green .panel-shadow,
.frame-lilac .panel-shadow,
.frame-wood .panel-shadow {
border: solid 0;
}
.row-sm { margin-left: 5px; margin-right: 5px; }
.row-sm > div { padding-left: 5px; padding-right: 5px; }
.row-sm > div > .panel {
text-align: center;
}
.row-info .panel { display: flex; padding-bottom: 10px; position: relative; text-align: center; border-radius: 4px !important; }
.row-info .widget-droppable div { border-radius: 4px; }
.info-l { color: #fff; margin-top:16px; margin-left: 15px; border-radius: 50%; width: 50px; height:50px; line-height:58px; vertical-align: middle; }
.info-c { flex:1; margin-left: 15px; text-align: left; }
.info-c .info-name { margin-top:18px; font-size: 14px; color: #666; }
.info-c .info-item { font-size: 24px; color: #333; }
.info-r { margin-left: auto; margin-top:18px; width: 70px; line-height:22px; }
.info-r .rate { color: #2bbf24; }
.info-r::before { position:absolute;top:22px;content:"";width:1px;height:40px;background-color:#e6e6e6;display:block; }
.app-title {
padding: 15px;
}
.app-title a {
color: #999;
line-height: 22px;
}
.app-title a:hover {
color: #0e90d2;
}
@media (min-width: 768px) {
.widget-item {
min-height: 200px;
}
.todo-text { margin-left: 60px; }
}
.widget-droppable div {
border: 1px dashed #23b7e5;
background: #dcf2f8;
text-align: center;
color: #ccc;
padding-bottom: 10px;
}
.row-widget .panel-heading {
padding: 10px;
color: #2490f8;
font-size: 14px;
text-align: left;
}
.row-widget .widget-item {
text-align: left;
}
.row-widget .widget-item .red {
font-size: 15px;
font-weight: bold;
color: #333;
}
.row-widget .widget-droppable div {
border-radius: 4px;
}
.ag-theme-balham .ag-header {
border-bottom: 1px solid #dee5e7;
}
.ag-theme-balham .ag-header-cell::after, .ag-theme-balham .ag-header-group-cell::after {
border-right: 0 !important;
}
.dashboard-footer {
background: #fff;
position: fixed;
bottom: 0;
right: 0;
left: 0;
box-shadow: 20px 0px 8px 0 rgba(29,35,41,.05);
border-top: 1px solid #e8e8e8;
}
.dashboard-footer .box {
padding: 6px;
padding-bottom: 8px;
text-align: right;
color: #999;
}
.dashboard-footer .box a {
color: #999;
font-weight: bold;
background: -webkit-linear-gradient(-70deg, #db469f, #2188ff);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.dashboard-footer .box a:hover {
color: #0e90d2;
}
.row-quick {
margin-bottom: 10px;
padding: 10px;
}
.quick-text {
float: left;
margin-right: 10px;
}
.quick-text .title {
text-align: center;
padding-top: 5px;
color: #333;
}
.quick-icon .quick-num {
font-family: Arial;
position: absolute;
width: 22px;
height: 22px;
line-height: 22px;
text-align: center;
font-size: 12px;
color: #fff;
right: -5px;
top: -5px;
background: #f00;
border-radius: 100%;
border: solid 1px #f05050;
display: none;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12);
}
.quick-icon {
width: 48px;
height: 48px;
text-align: center;
line-height: 50px;
border-radius: 5px;
border: solid 1px rgba(255,255,255,0.1);
box-shadow: -1px 1px 5px rgba(0, 0, 0, 0.15);
position: relative;
}
.quick-icon .fa {
font-size: 20px;
color: #fff;
}
</style>
<div class="dashboard-widget">
<div class="dashboard-title">
<div class="pull-right">
<a class="dashboard-config" data-toggle="dashboard-config" title="仪表盘设置">
<i class="fa fa-gear"></i>
</a>
</div>
<div class="font-thin">
<div class="btn-group" role="group">
<button type="button" class="btn btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="fa fa-filter"></span> 本部门下属部门
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
<li><a href="#">本人</a></li>
<li><a href="#">本人和下属</a></li>
<li><a href="#">本部门</a></li>
<li class="active"><a href="#">本部门下属部门</a></li>
<li class="divider"></li>
<li class=""><a href="#">自定义</a></li>
</ul>
</div>
<div class="btn-group m-l-xs" role="group">
<button type="button" class="btn btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="fa fa-filter"></span> 本月
<span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
<li><a href="#">今天</a></li>
<li><a href="#">昨天</a></li>
<li><a href="#">本周</a></li>
<li><a href="#">上周</a></li>
<li class="active"><a href="#">本月</a></li>
<li><a href="#">上月</a></li>
<li><a href="#">本季度</a></li>
<li><a href="#">上季度</a></li>
<li><a href="#">本年</a></li>
<li><a href="#">去年</a></li>
<li class="divider"></li>
<li class=""><a href="#">自定义</a></li>
</ul>
</div>
</div>
</div>
<div class="dashboard-widget-header">
<div class="row-quick m-t-sm">
<div class="row row-sm">
@forelse($quicks as $quick)
<div class="quick-text">
<a href="javascript:;" data-toggle="addtab" data-url="{{$quick['url']}}" data-id="{{$quick['key']}}" data-name="{{$quick['name']}}">
<div class="quick-icon quick-item" style="background-color:{{$quick['color']}}" data-url="{{$quick['url']}}" data-key="{{$quick['key']}}">
<i class="fa fa-3x {{$quick['icon']}}"></i>
<span class="quick-num">0</span>
</div>
<div class="title">{{$quick['name']}}</div>
</a>
</div>
@empty
<div class="quick-text">
<a href="javascript:;" data-toggle="dashboard-config">
<div class="quick-icon" style="background-color:#13D06C;">
<i class="fa fa-3x fa-plus"></i>
</div>
<div class="title">添加快捷</div>
</a>
</div>
@endforelse
</div>
</div>
<div class="row row-sm row-info">
@foreach($infos as $info)
@if($info['status'])
<div class="col-xs-6 col-sm-4 col-md-3 col-lg-2">
<div class="panel panel-shadow">
<div class="info-l hidden-xs bg-{{$info['color']}}">
<i class="fa fa-2x {{$info['icon']}}"></i>
</div>
<div class="info-c">
<div class="info-name">{{$info['name']}}</div>
<a href="javascript:;" data-toggle="addtab" data-url="{{$info['more_url']}}" data-id="{{str_replace(['/', '?', '='], ['_', '_', '_'], $info['more_url'])}}" data-name="{{$info['name']}}">
<div class="text-info info-item" data-url="{{$info['url']}}" data-more_url="{{$info['more_url']}}"></div>
</a>
</div>
<div class="info-r">
<div>较上月</div>
<div class="rate">50%</div>
</div>
</div>
</div>
@endif
@endforeach
</div>
<div class="row row-sm row-widget">
@foreach($grids as $grid)
<div class="col-xs-12 col-sm-{{$grid}}">
@foreach($widgets as $widget)
@if($widget['status'])
@if($widget['grid'] == $grid)
<div class="panel panel-shadow">
<div class="panel-heading text-base b-b">
<div class="pull-right"></div>
<a data-toggle='widget-refresh' data-url="{{$widget['url']}}" data-key="{{str_replace(['/', '?', '='], ['_', '_', '_'], $widget['url'])}}" data-id="{{$widget['id']}}">{{$widget['name']}}</a>
</div>
<div class="widget-item" id="widget_item_{{$widget['id']}}" data-url="{{$widget['url']}}">
</div>
</div>
@endif
@endif
@endforeach
</div>
@endforeach
</div>
</div>
</div>
<div class="dashboard-footer">
<div class="box">
{{$version}} {{$openSource ? '开源版' : '企业版'}}
</div>
</div>
<style>
.ag-theme-balham .ag-root {
border: 0;
}
.ag-theme-balham .ag-status-bar {
border: 0;
}
.ag-theme-balham .ag-header {
background-color: #fff;
}
.ag-theme-balham .ag-header-cell, .ag-theme-balham .ag-header-group-cell {
border-right: transparent;
}
.ag-theme-balham .ag-ltr .ag-cell {
border-width: 0 0 0 0;
border-right-color: #d9dcde;
}
.ag-theme-balham .ag-header-cell::after, .ag-theme-balham .ag-header-group-cell::after {
border-right: 1px solid rgba(189, 195, 199, 0.5);
}
</style>
<script>
(function($) {
var $document = $(document);
var myProcess = null;
function widgetRefresh() {
if (myProcess) {
var items = $('.widget-item');
items.each(function(index, item) {
var data = $(item).data();
if (data.key) {
gdoo.widgets[data.key].remoteData({page: 1});
console.log('refresh item:' + data.key);
}
});
}
myProcess = setTimeout(function() {
widgetRefresh();
}, 1000 * 60 * 5);
}
widgetRefresh();
$document.on('click', '[data-toggle="addtab"]', function(event) {
event.preventDefault();
// 触屏设备不触发事件
var mq = top.checkMQ();
if ($(this).parent().find('ul').length) {
if(mq == 'mobile' || mq == 'tablet') {
return false;
}
}
// 无ID不触发事件
var data = $(this).data();
if(data.id == undefined) {
return false;
}
top.addTab(data.url, data.id, data.name);
});
$('[data-toggle="dashboard-config"]').on('click', function() {
formDialog({
title: '仪表盘设置',
url: app.url('index/dashboard/config'),
id: 'widget-edit',
dialogClass:'modal-lg',
success: function(res) {
location.reload();
toastrSuccess(res.data);
$(this).dialog("close");
},
error: function(res) {
toastrError(res.data);
}
});
});
$('[data-toggle="widget-refresh"]').on('click', function() {
var data = $(this).data();
if (data.key) {
gdoo.widgets[data.key].remoteData({page: 1});
}
});
function widgetInit() {
var items = $('.widget-item');
items.each(function(index, item) {
var data = $(item).data();
if (data == undefined) {
return false;
}
if (data.url) {
$(item).load(app.url(data.url, {id: data.id}));
}
});
var items = $('.info-item');
items.each(function(index, item) {
var me = $(item);
var data = me.data();
$.get(app.url('index/index/info', {type: data.url}), function(res) {
if(res > 0) {
me.removeClass('text-info').addClass('text-danger');
} else {
me.removeClass('text-danger').addClass('text-info');
}
me.text(res);
});
});
var items = $('.quick-item');
items.each(function(index, item) {
var me = $(item);
var data = me.data();
$.get(app.url('index/index/badge', {key: data.key}), function(res) {
if(res.total > 0) {
me.find('.quick-num').show().text(res.total);
}
});
});
}
widgetInit();
})(jQuery);
</script>

View File

@ -5,7 +5,7 @@
软件版本 软件版本
</td> </td>
<td align="left" style="border-top:0;"> <td align="left" style="border-top:0;">
{{$version}} {{$openSource ? '开源版' : '企业版'}} {{$version}} {{$licenseType ? $licenseType : '开源版'}}
</td> </td>
</tr> </tr>
<tr> <tr>
@ -26,11 +26,19 @@
</tr> </tr>
<tr> <tr>
<td align="right"> <td align="right">
支持方式 联系方式
</td> </td>
<td align="left"> <td align="left">
15182223008(电话/微信) 15182223008(电话/微信)
</td> </td>
</tr> </tr>
<tr>
<td align="right">
QQ交流群
</td>
<td align="left">
79446405
</td>
</tr>
</table> </table>
</div> </div>

View File

@ -225,9 +225,9 @@
<label for="set_col">打印方式</label> <label for="set_col">打印方式</label>
<div class="form-text"> <div class="form-text">
<select class="input-select2 form-control input-sm" id="print_type" name="print_type" data-width="100%"> <select class="input-select2 form-control input-sm" id="print_type" name="print_type" data-width="100%">
<option value="">&nbsp;</option>
<option value="html" @if($template['print_type'] == 'html') selected @endif>html</option> <option value="html" @if($template['print_type'] == 'html') selected @endif>html</option>
<option value="stiReport" @if($template['print_type'] == 'stiReport') selected @endif>StiReport</option> <option value="pdf" @if($template['print_type'] == 'pdf') selected @endif>pdf</option>
<option value="stiReport" @if($template['print_type'] == 'stiReport') selected @endif>stiReport</option>
</select> </select>
</div> </div>
</div> </div>

View File

@ -773,50 +773,40 @@ class OrderController extends WorkflowController
// 显示促销 // 显示促销
public function printAction() public function printAction()
{ {
$this->layout = 'layouts.print2';
$id = Request::get('id'); $id = Request::get('id');
$template_id = Request::get('template_id'); $template_id = Request::get('template_id');
if ($template_id == 121) { $template = DB::table('model_template')->where('id', $template_id)->first();
$print_type = $template['print_type'];
$master = DB::table('customer_order as co')->where('co.id', $id) $this->layout = 'layouts.print_'.$print_type;
->leftJoin('customer as c', 'c.id', '=', 'co.customer_id') $print_tpl = view()->exists(Request::controller().'.print.'.$template_id);
->leftJoin('customer_tax as ct', 'ct.id', '=', 'co.tax_id')
->leftJoin('sale_type as st', 'st.id', '=', 'co.type_id')
->selectRaw('co.*, ct.name as tax_name, c.name as customer_name, st.name as type_name')
->first();
$rows = DB::table('customer_order_data as cod')
->leftJoin('customer_order as co', 'co.id', '=', 'cod.order_id')
->leftJoin('product as p', 'p.id', '=', 'cod.product_id')
->leftJoin('product_unit as pu', 'pu.id', '=', 'p.unit_id')
->leftJoin('customer_order_type as cot', 'cot.id', '=', 'cod.type_id')
->where('co.id', $id)
->selectRaw('
cod.*,
cod.delivery_quantity * p.weight as total_weight,
p.name as product_name,
p.spec as product_spec,
cot.name as type_name,
pu.name as product_unit,
p.material_type,
p.product_type
')
->get();
$form = [ $form = [
'template' => DB::table('model_template')->where('id', $template_id)->first() 'template' => $template,
]; ];
$tpl = $this->display([ if ($print_tpl) {
'master' => $master, $data = OrderService::getPrintData($id);
'rows' => $rows, $data['form'] = $form;
'form' => $form, $data['template'] = $template;
], 'print/'.$template_id); $tpl = $this->display($data, 'print/'.$template_id);
} else { return $print_type == 'pdf' ? print_prince($tpl) : $tpl;
$tpl = $this->createAction('print');
} }
print_prince($tpl);
if ($print_type == 'stiReport') {
$data = OrderService::getPrintData($id);
$print_data = [
'master' => [$data['master']],
'money' => $data['money'],
'customer_order_data' => $data['rows'],
];
return $this->display([
'template' => $template,
'print_data' => $print_data,
]);
}
$tpl = $this->createAction('print');
return $print_type == 'pdf' ? print_prince($tpl) : $tpl;
} }
/** /**

View File

@ -14,6 +14,42 @@ class OrderService
return BadgeService::getModelTodo('customer_order'); return BadgeService::getModelTodo('customer_order');
} }
/**
* 自定义查询打印数据
*/
public static function getPrintData($id)
{
$master = DB::table('customer_order as co')->where('co.id', $id)
->leftJoin('customer as c', 'c.id', '=', 'co.customer_id')
->leftJoin('customer_tax as ct', 'ct.id', '=', 'co.tax_id')
->leftJoin('sale_type as st', 'st.id', '=', 'co.type_id')
->selectRaw('co.*, ct.name as tax_name, c.name as customer_name, st.name as type_name')
->first();
$rows = DB::table('customer_order_data as cod')
->leftJoin('customer_order as co', 'co.id', '=', 'cod.order_id')
->leftJoin('product as p', 'p.id', '=', 'cod.product_id')
->leftJoin('product_unit as pu', 'pu.id', '=', 'p.unit_id')
->leftJoin('customer_order_type as cot', 'cot.id', '=', 'cod.type_id')
->where('co.id', $id)
->selectRaw('
cod.*,
cod.delivery_quantity * p.weight as total_weight,
p.name as product_name,
p.spec as product_spec,
cot.name as type_name,
pu.name as product_unit,
p.material_type,
p.product_type
')
->get();
return [
'master' => $master,
'rows' => $rows,
];
}
/** /**
* 获取为使用的促销id * 获取为使用的促销id
* *

View File

@ -123,7 +123,7 @@ class TaskController extends DefaultController
'name' => $_item['name'], 'name' => $_item['name'],
'type' => $_item['type'], 'type' => $_item['type'],
'created_at' => '', 'created_at' => '',
'user_id' => '', 'user_id' => 0,
'user_name' => '', 'user_name' => '',
'open' => true, 'open' => true,
'option_edit' => $project_user_id, 'option_edit' => $project_user_id,
@ -154,7 +154,9 @@ class TaskController extends DefaultController
$_task['open'] = true; $_task['open'] = true;
$_task['loaded'] = true; $_task['loaded'] = true;
$_task['expanded'] = true; $_task['expanded'] = true;
$_task['created_at'] = format_datetime($_item['created_at']); $_task['created_dt'] = format_datetime($_task['created_at']);
$_task['start_dt'] = format_datetime($_task['start_at']);
$_task['end_dt'] = format_datetime($_task['end_at']);
if ($_task['start_at'] && $_task['end_at']) { if ($_task['start_at'] && $_task['end_at']) {
$remain = remain_time($_task['start_at'], $_task['end_at'], ''); $remain = remain_time($_task['start_at'], $_task['end_at'], '');

View File

@ -3,9 +3,6 @@
<script src="{{$asset_url}}/vendor/dhtmlxgantt/dhtmlxgantt_tooltip.js" type="text/javascript"></script> <script src="{{$asset_url}}/vendor/dhtmlxgantt/dhtmlxgantt_tooltip.js" type="text/javascript"></script>
<script src="{{$asset_url}}/vendor/dhtmlxgantt/locale_cn.js" type="text/javascript"></script> <script src="{{$asset_url}}/vendor/dhtmlxgantt/locale_cn.js" type="text/javascript"></script>
<link rel="stylesheet" href="{{$asset_url}}/vendor/dhtmlxgantt/dhtmlxgantt.css" type="text/css"> <link rel="stylesheet" href="{{$asset_url}}/vendor/dhtmlxgantt/dhtmlxgantt.css" type="text/css">
<!--
<script src="https://export.dhtmlx.com/gantt/api.js"></script>
-->
<style type="text/css"> <style type="text/css">
/* 新样式 */ /* 新样式 */
html, body { html, body {
@ -126,9 +123,6 @@ html, body {
<a href="{{url('index', ['project_id' => $project['id'], 'tpl' => 'board'])}}" class="btn btn-sm btn-default @if($query['tpl'] == 'board') active @endif">看板</a> <a href="{{url('index', ['project_id' => $project['id'], 'tpl' => 'board'])}}" class="btn btn-sm btn-default @if($query['tpl'] == 'board') active @endif">看板</a>
--> -->
</div> </div>
<!--
<input value="导出PDF" class="btn btn-sm btn-default" type="button" onclick='exportToPDF()'>
-->
</div> </div>
<a href="{{url($referer)}}" class="btn btn-sm btn-default"><i class="fa fa-reply"></i> 返回</a> <a href="{{url($referer)}}" class="btn btn-sm btn-default"><i class="fa fa-reply"></i> 返回</a>
@ -158,9 +152,7 @@ html, body {
</script> </script>
</form> </form>
</div> </div>
<div id="gantt-view"></div> <div id="gantt-view"></div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
@ -189,7 +181,6 @@ gantt.config.show_links = false;
gantt.config.order_branch = true; gantt.config.order_branch = true;
// gantt.config.order_branch_free = true; // gantt.config.order_branch_free = true;
/* /*
var date_to_str = gantt.date.date_to_str(gantt.config.api_date); var date_to_str = gantt.date.date_to_str(gantt.config.api_date);
var today = new Date(); var today = new Date();
@ -244,13 +235,13 @@ gantt.templates.tooltip_text = function(start, end, task) {
gantt.attachEvent('onTaskDblClick', function (task_id) { gantt.attachEvent('onTaskDblClick', function (task_id) {
var task = gantt.getTask(task_id); var task = gantt.getTask(task_id);
if(task.type == 'item') { if(task.type == 'item') {
editItem(task_id); editItem(task);
} }
if(task.type == 'task') { if(task.type == 'task') {
editTask(task_id); editTask(task);
} }
if(task.type == 'subtask') { if(task.type == 'subtask') {
editSubTask(task_id); editSubTask(task);
} }
}); });
@ -279,22 +270,17 @@ gantt.attachEvent('onBeforeTaskDrag', function(task_id, mode, e) {
}); });
gantt.attachEvent('onAfterTaskDrag', function(task_id, mode, e) { gantt.attachEvent('onAfterTaskDrag', function(task_id, mode, e) {
var task = gantt.getTask(task_id); var task = gantt.getTask(task_id);
var data = {id: task.id,progress: task.progress}; var data = {id: task.id,progress: task.progress};
var date_to_str = gantt.date.date_to_str(gantt.config.api_date); var date_to_str = gantt.date.date_to_str(gantt.config.api_date);
data.start_date = date_to_str(task.start_date); data.start_date = date_to_str(task.start_date);
data.end_date = date_to_str(task.end_date); data.end_date = date_to_str(task.end_date);
$.post('{{url("drag")}}', data, function(res) { $.post('{{url("drag")}}', data, function(res) {
gantt.render(); gantt.render();
}, 'json'); }, 'json');
}); });
gantt._do_autosize = function() { gantt._do_autosize = function() {
// 设置高度 // 设置高度
var height = $('#gantt-wrapper').outerHeight(); var height = $('#gantt-wrapper').outerHeight();
var iframeHeight = $(window).height(); var iframeHeight = $(window).height();
@ -327,29 +313,15 @@ $('#search-submit').on('click', function() {
$.map(query, function(row) { $.map(query, function(row) {
params[row.name] = row.value; params[row.name] = row.value;
}); });
dataReload(); dataReload();
return false; return false;
}); });
function exportToPDF()
{
gantt.exportToPDF({
locale:"cn",
skin:'terrace',
});
}
function dataReload() { function dataReload() {
gantt.clearAll(); gantt.clearAll();
gantt.load(app.url('project/task/index', params)); gantt.load(app.url('project/task/index', params));
} }
function getTask(id) {
return gantt.getTask(id);
}
</script> </script>
@include('task/index/js') @include('task/index/js')

View File

@ -47,9 +47,9 @@ function progressRenderer(params) {
var data = params.data; var data = params.data;
if (data.type == 'task' || data.type == 'subtask') { if (data.type == 'task' || data.type == 'subtask') {
if (params.value == 1) { if (params.value == 1) {
return '<span class="label label-success">已完成</span>'; return '<div class="label label-success">已完成</div>';
} else { } else {
return '<span class="label label-' + (auth_id == data.user_id ? 'danger' : 'info') + '">进行中</span>'; return '<div class="label label-' + (auth_id == data.user_id ? 'danger' : 'info') + '">进行中</div>';
} }
} }
return ''; return '';
@ -94,23 +94,23 @@ function durationRenderer(params) {
{cellClass:'text-center', sortable: false, field: 'user_name', headerName: '执行者', width: 140}, {cellClass:'text-center', sortable: false, field: 'user_name', headerName: '执行者', width: 140},
{cellClass:'text-center', sortable: false, field: 'users', headerName: '参与者', minWidth: 200}, {cellClass:'text-center', sortable: false, field: 'users', headerName: '参与者', minWidth: 200},
{cellClass:'text-center', cellRenderer: progressRenderer, sortable: false, field: 'progress', headerName: '状态', width: 100}, {cellClass:'text-center', cellRenderer: progressRenderer, sortable: false, field: 'progress', headerName: '状态', width: 100},
{cellClass:'text-center', sortable: false, field: 'start_at', headerName: '开始时间', width: 120}, {cellClass:'text-center', sortable: false, field: 'start_dt', headerName: '开始时间', width: 120},
{cellClass:'text-center', sortable: false, field: 'end_at', headerName: '结束时间', width: 120}, {cellClass:'text-center', sortable: false, field: 'end_dt', headerName: '结束时间', width: 120},
{cellClass:'text-center', cellRenderer: durationRenderer, sortable: false, field: 'duration_date', headerName: '持续时间', width: 100}, {cellClass:'text-center', cellRenderer: durationRenderer, sortable: false, field: 'duration_date', headerName: '持续时间', width: 100},
{cellClass:'text-center', sortable: false, field: 'created_at', headerName: '创建时间', width: 140}, {cellClass:'text-center', sortable: false, field: 'created_dt', headerName: '创建时间', width: 140},
{cellClass:'text-center', field: 'id', headerName: 'ID', width: 80} //{cellClass:'text-center', field: 'id', headerName: 'ID', width: 80}
); );
grid.onRowDoubleClicked = function (row) { grid.onRowDoubleClicked = function (row) {
var data = row.data; var data = row.data;
if(data.type == 'item') { if(data.type == 'item') {
editItem(data.id); editItem(data);
} }
if(data.type == 'task') { if(data.type == 'task') {
editTask(data.id); editTask(data);
} }
if(data.type == 'subtask') { if(data.type == 'subtask') {
editSubTask(data.id); editSubTask(data);
} }
}; };
@ -142,9 +142,9 @@ function dataReload() {
} }
function getTask(id) { function getTask(id) {
console.log(grid.api.getRowNode(id));
return grid.api.getRowNode(id); return grid.api.getRowNode(id);
} }
</script> </script>
@include('task/index/js') @include('task/index/js')

View File

@ -1,5 +1,4 @@
<script> <script>
function formsBox(title, url, id, success, remove, error) function formsBox(title, url, id, success, remove, error)
{ {
var options = { var options = {
@ -67,12 +66,10 @@ function addItem() {
}); });
} }
function editItem(id) { function editItem(task) {
var fun_edit = null, fun_delete = null; var fun_edit = null, fun_delete = null;
var task = getTask(id);
if(task.option_edit == 1) { if(task.option_edit == 1) {
fun_edit = function(res) { fun_edit = function(res) {
saveResult.call(this, res); saveResult.call(this, res);
@ -84,14 +81,14 @@ function editItem(id) {
var me = this; var me = this;
$.messager.confirm('操作警告', '确定要删除任务列表吗?', function(btn) { $.messager.confirm('操作警告', '确定要删除任务列表吗?', function(btn) {
if (btn == true) { if (btn == true) {
$.post(app.url('project/task/delete'), {id: id}, function(res) { $.post(app.url('project/task/delete'), {id: task.id}, function(res) {
saveResult.call(me, res); saveResult.call(me, res);
},'json'); },'json');
} }
}); });
} }
} }
formsBox('编辑任务列表', app.url('project/task/edit', {type:'item',id:id}), 'item-form-'+ id, fun_edit, fun_delete); formsBox('编辑任务列表', app.url('project/task/edit', {type:'item',id:task.id}), 'item-form-'+ task.id, fun_edit, fun_delete);
} }
function addTask() { function addTask() {
@ -100,12 +97,10 @@ function addTask() {
}); });
} }
function editTask(id) { function editTask(task) {
var fun_edit = null, fun_delete = null; var fun_edit = null, fun_delete = null;
var task = getTask(id);
if(task.option_edit == 1) { if(task.option_edit == 1) {
fun_edit = function(res) { fun_edit = function(res) {
saveResult.call(this, res); saveResult.call(this, res);
@ -117,14 +112,14 @@ function editTask(id) {
var me = this; var me = this;
$.messager.confirm('操作警告', '确定要删除任务吗?', function(btn) { $.messager.confirm('操作警告', '确定要删除任务吗?', function(btn) {
if (btn == true) { if (btn == true) {
$.post(app.url('project/task/delete'), {id: id}, function(res) { $.post(app.url('project/task/delete'), {id: task.id}, function(res) {
saveResult.call(me, res); saveResult.call(me, res);
}, 'json'); }, 'json');
} }
}); });
} }
} }
formsBox('编辑任务', app.url('project/task/edit', {type:'task',id:id}), 'task-form-'+ id, fun_edit, fun_delete); formsBox('编辑任务', app.url('project/task/edit', {type:'task', id:task.id}), 'task-form-'+ task.id, fun_edit, fun_delete);
} }
function addSubTask(id) { function addSubTask(id) {
@ -140,12 +135,10 @@ function addSubTask(id) {
}); });
} }
function editSubTask(id) { function editSubTask(task) {
var fun_edit = null, fun_delete = null; var fun_edit = null, fun_delete = null;
var task = getTask(id);
if(task.option_edit == 1) { if(task.option_edit == 1) {
fun_edit = function(res) { fun_edit = function(res) {
saveResult.call(this, res); saveResult.call(this, res);
@ -157,14 +150,14 @@ function editSubTask(id) {
var me = this; var me = this;
$.messager.confirm('操作警告', '确定要删除任务吗?', function(btn) { $.messager.confirm('操作警告', '确定要删除任务吗?', function(btn) {
if (btn == true) { if (btn == true) {
$.post(app.url('project/task/delete'), {id: id}, function(res) { $.post(app.url('project/task/delete'), {id: task.id}, function(res) {
saveResult.call(me, res); saveResult.call(me, res);
}, 'json'); }, 'json');
} }
}); });
} }
} }
formsBox('编辑子任务', app.url('project/task/edit', {type:'subtask',id:id}), 'task-form-'+ id, fun_edit, fun_delete); formsBox('编辑子任务', app.url('project/task/edit', {type:'subtask',id:task.id}), 'task-form-'+ task.id, fun_edit, fun_delete);
} }
function addComment(task_id) { function addComment(task_id) {
@ -190,9 +183,7 @@ function editComment(id) {
saveResult.call(me, res); saveResult.call(me, res);
}, 'json'); }, 'json');
} }
}); });
}); });
} }
</script> </script>

View File

@ -14,7 +14,7 @@ class StiReportController extends DefaultController
public function designerAction() public function designerAction()
{ {
$template_id = (int)Request::get('template_id'); $template_id = (int)Request::get('template_id');
$template = DB::table('flow_template')->where('id', $template_id)->first(); $template = DB::table('model_template')->where('id', $template_id)->first();
// 报表名称 // 报表名称
$report_name = "{$template['code']}"; $report_name = "{$template['code']}";
$report_file = ''; $report_file = '';
@ -42,9 +42,4 @@ class StiReportController extends DefaultController
$success = ['success' => true, 'msg' => "保存成功:".$fileName]; $success = ['success' => true, 'msg' => "保存成功:".$fileName];
return $success; return $success;
} }
public function licenseAction()
{
echo "6vJhGtLLLz2GNviWmUTrhSqnOItdDwjBylQzQcAOiHlrzAZzmWmSnQQ4gKFiZ4LJpJv//QjFVXxcHAVbzZfXjyOGPmj/m+BEjr2Z14dWeqLFNGF74GELbTTKs2+Le/9cDIWdGNnOpEK2aGdYllauMPLQsiScC521JIEYSdOspiRHSLcegksxfNedJjyIjGlfI2YrddBRWGiO+uWOHE5oz9hLG8VPBSRo60KmgkscM5X+7+aQ+6vzKKOC2XB+e6BMQC5qNVBUblfGQR2EjNLZKmSJtvek7IbG/OK+XP0j2bwicyJUGC0pyLHqctr3BpcO/gA5LoVfuwqYG3klL//owBkObPPhJV1HD6XsHL0GDryssJFaDCQIyXMrOn7hNQNkEIyx+AJDNgf5XfxPgEgFsRhYCPYq7ccutg2by8duOxbF3xH0gL/uAQN275COXJBV3W62DSLM+o8azChG+Z7y0dF9f4whZ/SKD4DwNPUWK7osEPVwl5BY+0lkdqd67fatlrlc0QU/ZX9f5QcTKfl5ljuNc+kcqxmd9NND6Xzrw9gFsFqIWqqVo++DdoAZFStXMkOp/nTNBQMRA100k3vi2SbbiHq/gVimrQecUhWG0qU5zcemtVGDMs1ruXsoHX8pYX/rMJHH09qCWllVyBykkTLourYEig9g5fhKDYRV05aC0cWsbxR2nj9TH3SLmG4P2Px7uJsq6iOsnIHWuBMwk8oF7xPEugjw+x8lkjVVoV8WWBSdjIxGh4LviZXBEJm9FTJzYcnEHMZRh0uVE1g8crC+TfRVii7dcdZzeQklzyNY+0Q1/hRaIUs+mNPRiqG6YqEv3f+yG4ncxzkCWZDvXPox87y61jbg6Dg73X1RAwwvbIXuJVANbaDOefUELPmpz4SIpHx8zpLSmn1H1u0PolbsimLigcGw2bJQeuU++OBU74vJJde3JdoO6IOfmUJkoxprdszyknLm+zWgnC+jjaCtEZZuOIJqyuVPoqHRiFkqNjbddkvGMmj/4+2D6BdYQot9sEOW7iCgV4SvZ/efC0NlRX+Z+6PODwKJiO+Sen5aAlsJcL2jIUSAjgyS+7im7XTGlYKuRL59EQjA5HArO1ikJ0P/2pk4u91z2J8GRvTPu5BZUI9M0BLGLAVCFMte4JQCOr+f785RgjerSNCSgN4Mfa5+jDQAKTAVAO5tqT/SBEm0M5U1EylQ/fbseKt+dQ1/VzqlQ9SH14jtI0J97ACqk9SBt9xpTgBnJrBSTnnY21l2zWS7/2k5U9LPDJn0Lm32ueoDRFaM4JeK1HoSi2HvOYy1V1hU5pCe893QsBE/HOVp4UWu9lfiEWunHEEdPZOUPgc131KwJrM4K3DYiBbXl442TgbNLfz5IBnAw1NVabMXXyx2LOi6x35xw1YLMRYNWYE9QpocBhoFQtStd2OUZ5CqvxhXf+VaLK3hmm1GvlqpUK6LIDd3eyuQK4f0E7+zVSBaV6eSDI9YJC42Ee+Br8AByGYLRaFISpDculGt2nqwFL6cwltv1Xy11frJR2KqbR8sd6dI0V69XnwBziRzJq1SyAZd9bzClYSpA3ZYPN9ghdaHA+GZak0IYMokWLi6oYquOCRoy8f0sEQM2Uhw2x/E9tgyNoLZhDhrk805/VCsThI5fHn0YWVnmQZTrGkOwnoqLw3VHb7akUmNnjMlk/tD59bR2lgD+fnNuNsBYDDjJpg+fKmgf9araTPEIpuuanp53e6xodRYKIj4o4+39DrPK10eR4CDfSh5UShvnCZz+V0FAkIkoM92U1JTU59P4M4pzc8PswmS1rGTRaZMUrTYrjeGCHC9Hl0CTIR1/rQAx8iIcC3yVNCeiTJAmKMCl830O4GpEfduNHQgDrlsJC4q6RA7J2kUzW2WQvKFKH3bRH1hOc6LZK4DmwMGzXMKDKOxK0dzld2/ImRN6DbPacV/4d0HK06qBOFEgUJqXhMpV1JjsXVvmx/m2LCRgkD5vPEwcuiWtWde7tISLCEg6hjAV9+Hx6zOWpozg7aZMtikT+43uWakRkU/H+ITIGhqxuQhkZkmIddWrjD5lJtdUOSa0FWu969EDp4XB8dmUKSwyrkgOHZu6DutFW5ArtqhNejthWt/sV1FkSbvdd26zn1fSO4pDa4pDmcSo+l/4DChZbEyICc7IQrPjVuRUlVGuAVksZTBX+VYIip8LsJSFLHo7Dnn4QT3qDNIh8aAcY3fnHhph4G5ekbvGOw3+m1qqs8t0m89vdK7k8nJTw==";
}
} }

View File

@ -20,6 +20,7 @@ use Gdoo\Model\Services\StepService;
use Gdoo\Stock\Services\StockService; use Gdoo\Stock\Services\StockService;
use Gdoo\Index\Controllers\WorkflowController; use Gdoo\Index\Controllers\WorkflowController;
use Gdoo\Stock\Services\DeliveryService;
class DeliveryController extends WorkflowController class DeliveryController extends WorkflowController
{ {
@ -312,71 +313,41 @@ class DeliveryController extends WorkflowController
{ {
$id = Request::get('id'); $id = Request::get('id');
$template_id = Request::get('template_id'); $template_id = Request::get('template_id');
$template = DB::table('model_template')->where('id', $template_id)->first();
$master = DB::table('stock_delivery as sd') $print_type = $template['print_type'];
->leftJoin('customer as c', 'c.id', '=', 'sd.customer_id') // 存在打印模板
->leftJoin('customer_tax as ct', 'ct.id', '=', 'sd.tax_id') $print_tpl = view()->exists(Request::controller().'.print.'.$template_id);
->leftJoin('sale_type as st', 'st.id', '=', 'sd.type_id') $this->layout = 'layouts.print_'.$print_type;
->selectRaw('sd.*, ct.name as tax_name, c.name as customer_name, st.name as type_name')
->where('sd.id', $id)
->first();
$model = DB::table('stock_delivery_data as sdd')
->leftJoin('stock_delivery as sd', 'sd.id', '=', 'sdd.delivery_id')
->leftJoin('product as p', 'p.id', '=', 'sdd.product_id')
->leftJoin('product_unit as pu', 'pu.id', '=', 'p.unit_id')
->leftJoin('customer_order_type as cot', 'cot.id', '=', 'sdd.type_id')
->leftJoin('warehouse as w', 'w.id', '=', 'sdd.warehouse_id');
if ($template_id == 112) {
$model->where('sd.print_master_id', $master['print_master_id']);
} else {
$model->where('sdd.delivery_id', $id);
}
$model->whereRaw("p.code <> '99001'");
$rows = $model->selectRaw("
sdd.*,
p.name as product_name,
p.spec as product_spec,
cot.name as type_name,
pu.name as product_unit,
p.material_type,
p.product_type,
SUBSTRING(batch_sn, 3, 4) as batch_sn,
case when right(w.name, 4) = '不满件库' then 'B' else '' end warehouse_type
")
->orderBy('p.code', 'asc')
->get();
$money = DB::table('stock_delivery_data as sdd')
->leftJoin('product as p', 'p.id', '=', 'sdd.product_id')
->where('sdd.delivery_id', $id)
->whereRaw("p.code = '99001'")
->sum("money");
$form = [ $form = [
'template' => DB::table('model_template')->where('id', $template_id)->first() 'template' => $template,
]; ];
if ($template_id == 87) { // 自定义模板
$this->layout = 'layouts.print_stiReport'; if ($print_tpl) {
return $this->display([ $data = DeliveryService::getPrintData($id);
'master' => $master, $data['form'] = $form;
'money' => $money, $data['template'] = $template;
'rows' => $rows, $tpl = $this->display($data, 'print/'.$template_id);
'form' => $form, return $print_type == 'pdf' ? print_prince($tpl) : $tpl;
], 'print/'.$template_id);
} else {
$this->layout = 'layouts.print2';
print_prince($this->display([
'master' => $master,
'money' => $money,
'rows' => $rows,
'form' => $form,
], 'print/'.$template_id));
} }
// 打印插件
if ($print_type == 'stiReport') {
$data = DeliveryService::getPrintData($id);
$print_data = [
'master' => [$data['master']],
'money' => $data['money'],
'stock_delivery_data' => $data['rows'],
];
return $this->display([
'template' => $template,
'print_data' => $print_data,
]);
}
// 默认模板
$tpl = $this->createAction('print');
return $print_type == 'pdf' ? print_prince($tpl) : $tpl;
} }
// 物流信息 // 物流信息

View File

@ -0,0 +1,62 @@
<?php namespace Gdoo\Stock\Services;
use DB;
class DeliveryService
{
/**
* 自定义查询打印数据
*/
public static function getPrintData($id, $print_master_id = false)
{
$master = DB::table('stock_delivery as sd')
->leftJoin('customer as c', 'c.id', '=', 'sd.customer_id')
->leftJoin('customer_tax as ct', 'ct.id', '=', 'sd.tax_id')
->leftJoin('sale_type as st', 'st.id', '=', 'sd.type_id')
->selectRaw('sd.*, ct.name as tax_name, c.name as customer_name, st.name as type_name')
->where('sd.id', $id)
->first();
$model = DB::table('stock_delivery_data as sdd')
->leftJoin('stock_delivery as sd', 'sd.id', '=', 'sdd.delivery_id')
->leftJoin('product as p', 'p.id', '=', 'sdd.product_id')
->leftJoin('product_unit as pu', 'pu.id', '=', 'p.unit_id')
->leftJoin('customer_order_type as cot', 'cot.id', '=', 'sdd.type_id')
->leftJoin('warehouse as w', 'w.id', '=', 'sdd.warehouse_id');
if ($print_master_id) {
$model->where('sd.print_master_id', $master['print_master_id']);
} else {
$model->where('sdd.delivery_id', $id);
}
$model->whereRaw("p.code <> '99001'");
$rows = $model->selectRaw("
sdd.*,
p.name as product_name,
p.spec as product_spec,
cot.name as type_name,
pu.name as product_unit,
p.material_type,
p.product_type,
batch_sn,
case when right(w.name, 4) = '不满件库' then 'B' else '' end warehouse_type
")
->orderBy('p.code', 'asc')
->get();
// 获取折扣额
$money = DB::table('stock_delivery_data as sdd')
->leftJoin('product as p', 'p.id', '=', 'sdd.product_id')
->where('sdd.delivery_id', $id)
->whereRaw("p.code = '99001'")
->sum("money");
return [
'master' => $master,
'money' => $money,
'rows' => $rows,
];
}
}

View File

@ -159,7 +159,7 @@
<tr> <tr>
<td width="10%">特别说明</td> <td width="10%">特别说明</td>
<td width="90%"> <td width="90%">
收货时请按我司《随货单》点货验收。货物如有缺失或者破损,请与承运方协调,采取现场赔付,如协调无法达成一致意见,请第一时间告知我司并向承运方索取有效货物异常证明(贵司收货人与承运方双方签字认可的货物运单)回单至我司028-38296888并确认收到。 收货时请按我司《随货单》点货验收。货物如有缺失或者破损,请与承运方协调,采取现场赔付,如协调无法达成一致意见,请第一时间告知我司并向承运方索取有效货物异常证明(贵司收货人与承运方双方签字认可的货物运单)回单至我司并确认收到。
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@ -4,7 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<title>{{$setting['title']}}</title> <title>{{$setting['title']}}</title>
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"> <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<link href="{{$asset_url}}/dist/app.min.css" rel="stylesheet" type="text/css"> <link href="{{mix('/assets/dist/app.min.css')}}" rel="stylesheet" type="text/css">
<script src="{{$asset_url}}/vendor/jquery.js"></script> <script src="{{$asset_url}}/vendor/jquery.js"></script>
</head> </head>
<style> <style>

View File

@ -119,7 +119,7 @@ class UserService
*/ */
public static function wantsTotp() public static function wantsTotp()
{ {
if (env('AUTH_TOTP_STATUS', true) == false) { if (env('AUTH_TOTP', true) == false) {
return 0; return 0;
} }

View File

@ -143,7 +143,7 @@ body {
<div class="panel-body" style="padding:20px 30px 0 30px;"> <div class="panel-body" style="padding:20px 30px 0 30px;">
<div class="form-group"> <div class="form-group">
<input type="text" placeholder="账号" class="form-control" name="username" required> <input type="text" placeholder="账号" class="form-control" id="username" name="username" required>
</div> </div>
<div class="form-group"> <div class="form-group">
<input type="password" placeholder="密码" class="form-control" name="password" required> <input type="password" placeholder="密码" class="form-control" name="password" required>
@ -192,6 +192,17 @@ body {
<script> <script>
(function($) { (function($) {
// 初始化获取的用户名
let username = localStorage.getItem('remember_username');
if (username) {
$('#username').val(username);
}
// 记住用户名
$("#username").on("input propertychange", function() {
localStorage.setItem('remember_username', this.value);
});
// ajax 登录 // ajax 登录
$('#myform').on('submit', function () { $('#myform').on('submit', function () {
var url = $(this).attr('action'); var url = $(this).attr('action');
@ -213,13 +224,15 @@ body {
}, 'json'); }, 'json');
return false; return false;
}); });
// 刷新验证码方法
function refresh_captcha() {
$('#captcha_image').attr('src', settings.public_url + '/user/auth/captcha?_=' + Math.random());
}
// 刷新验证码 // 刷新验证码
$(document).on('click', '#refresh_captcha', function () { $(document).on('click', '#refresh_captcha', function () {
refresh_captcha(); refresh_captcha();
}); });
// 刷新验证码方法
function refresh_captcha() {
$('#captcha_image').attr('src', settings.public_url + '/user/auth/captcha?_=' + Math.random());
}
})(jQuery); })(jQuery);
</script> </script>

View File

@ -1559,10 +1559,6 @@ function encodeURIComponent($str)
function plugin_sync_api($uri, $data = []) function plugin_sync_api($uri, $data = [])
{ {
if (env('PLUGIN_SYNC_API_STATUS') === false) {
return ['success' => true];
}
$base_url = env('PLUGIN_SYNC_API_URL'); $base_url = env('PLUGIN_SYNC_API_URL');
if (empty($base_url)) { if (empty($base_url)) {
return ['success' => true]; return ['success' => true];
@ -1624,15 +1620,13 @@ function plugin_sync_api($uri, $data = [])
function print_prince($view) function print_prince($view)
{ {
$viewData = $view->getData(); $viewData = $view->getData();
try {
$prince = new App\Support\Prince(env('PRINCE_DIR')); $prince = new App\Support\Prince(env('PRINCE_DIR'));
$file = storage_path() . '/print/' . auth()->id() . '.pdf';
$ret = $prince->convert_string_to_file($view, $file);
if ($ret) {
header('Content-Type:application/pdf'); header('Content-Type:application/pdf');
header('Content-Disposition:inline;filename="' . $viewData['form']['template']['name'] . '.pdf"'); header('Content-Disposition:inline;filename="' . $viewData['form']['template']['name'] . '.pdf"');
echo file_get_contents($file); $prince->convert_string_to_passthru($view);
} else { } catch (Exception $e) {
echo $ret; echo $e->getMessage();
} }
} }

File diff suppressed because one or more lines are too long

View File

@ -1,15 +0,0 @@
<html>
<head>
<title>Stimulsoft Reports.PHP</title>
</head>
<body>
Stimulsoft Reports.PHP (JS version) - How to Activate
<hr><br>
The Trial version of the product does not contain any restrictions, except for the Trial watermark on the report pages.<br><br>
To activate the product, it is enough to copy the 'license.key' file to the 'stimulsoft' subfolder of this project (in the same place, where is the 'license.php' file is located). The license will be loaded automatically. You can add some conditions in the 'license.php' script to load the license file, if it required for security.
<br><br>
<a href="index.php">Back</a>
</body>

View File

@ -1,63 +0,0 @@
<?php
require_once 'stimulsoft/helper.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Stimulsoft Reports.PHP - JS Designer</title>
<!-- Office2013 style -->
<link href="css/stimulsoft.viewer.office2013.whiteblue.css" rel="stylesheet">
<link href="css/stimulsoft.designer.office2013.whiteblue.css" rel="stylesheet">
<!-- Stimulsoft Reports.JS -->
<script src="scripts/stimulsoft.reports.js" type="text/javascript"></script>
<script src="scripts/stimulsoft.viewer.js" type="text/javascript"></script>
<script src="scripts/stimulsoft.designer.js" type="text/javascript"></script>
<?php
$options = StiHelper::createOptions();
$options->handler = "handler.php";
$options->timeout = 30;
StiHelper::initialize($options);
?>
<script type="text/javascript">
//Stimulsoft.Base.StiLicense.loadFromFile("stimulsoft/license.php");
var options = new Stimulsoft.Designer.StiDesignerOptions();
options.appearance.fullScreenMode = true;
options.toolbar.showSendEmailButton = true;
options.appearance.showLocalization = false;
options.appearance.zoom = 130;
Stimulsoft.Base.Localization.StiLocalization.addLocalizationFile("localization/zh-CHS.xml", false, "Chinese (Simplified)");
Stimulsoft.Base.Localization.StiLocalization.cultureName = "Chinese (Simplified)";
var designer = new Stimulsoft.Designer.StiDesigner(options, "StiDesigner", false);
// Process SQL data source
designer.onBeginProcessData = function (event, callback) {
<?php StiHelper::createHandler(); ?>
}
// Save report template on the server side
designer.onSaveReport = function (event) {
<?php StiHelper::createHandler(); ?>
}
// Load and design report
var report = new Stimulsoft.Report.StiReport();
report.loadFile("reports/SimpleList.mrt");
designer.report = report;
function onLoad() {
designer.renderHtml("designerContent");
}
</script>
</head>
<body onload="onLoad();">
<div id="designerContent"></div>
</body>
</html>

View File

@ -1,94 +0,0 @@
<?php
require_once 'stimulsoft/helper.php';
error_reporting(0);
// Please configure the security level as you required.
// By default is to allow any requests from any domains.
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Engaged-Auth-Token");
$handler = new StiHandler();
$handler->registerErrorHandlers();
$handler->onBeginProcessData = function ($event) {
// Current database type: 'XML', 'JSON', 'MySQL', 'MS SQL', 'PostgreSQL', 'Firebird', 'Oracle'
$database = $event->database;
// Current connection name
$connection = $event->connection;
// Current data source name
$dataSource = $event->dataSource;
// Connection string for the current data source
$connectionString = $event->connectionString;
// SQL query string for the current data source
$queryString = $event->queryString;
// You can change the connection string
//if ($connection == "MyConnectionName")
// $event->connectionString = "Server=localhost;Database=test;Port=3306;";
// You can change the SQL query
//if ($dataSource == "MyDataSource")
// $event->queryString = "SELECT * FROM MyTable";
// You can replace the SQL query parameters with the required values
// For example: SELECT * FROM {Variable1} WHERE Id={Variable2}
// If the report contains a variable with this name, its value will be used instead of the specified value
//$event->parameters["Variable1"] = "TableName";
//$event->parameters["Variable2"] = 10;
return StiResult::success();
//return StiResult::error("Message for some connection error.");
};
$handler->onPrintReport = function ($event) {
return StiResult::success();
};
$handler->onBeginExportReport = function ($event) {
$settings = $event->settings;
$format = $event->format;
return StiResult::success();
};
$handler->onEndExportReport = function ($event) {
$format = $event->format; // Export format
$data = $event->data; // Base64 export data
$fileName = $event->fileName; // Report file name
file_put_contents('reports/'.$fileName.'.'.strtolower($format), base64_decode($data));
//return StiResult::success();
return StiResult::success("Export OK. Message from server side.");
//return StiResult::error("Export ERROR. Message from server side.");
};
$handler->onEmailReport = function ($event) {
$event->settings->from = "******@gmail.com";
$event->settings->host = "smtp.gmail.com";
$event->settings->login = "******";
$event->settings->password = "******";
};
$handler->onDesignReport = function ($event) {
return StiResult::success();
};
$handler->onCreateReport = function ($event) {
$fileName = $event->fileName;
return StiResult::success();
};
$handler->onSaveReport = function ($event) {
$report = $event->report; // Report object
$reportJson = $event->reportJson; // Report JSON
$fileName = $event->fileName; // Report file name
file_put_contents('reports/'.$fileName.".mrt", $reportJson);
return StiResult::success("保存成功:".$fileName);
};
$handler->onSaveAsReport = function ($event) {
return StiResult::success();
};
$handler->process();

View File

@ -1,19 +0,0 @@
<?php
require_once 'stimulsoft/helper.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Stimulsoft Reports.PHP</title>
</head>
<body>
Stimulsoft Reports.PHP (JS version) - Quick Start Demo
<hr><br>
<a href="viewer.php">Open Report Viewer page</a><br>
<a href="designer.php">Open Report Designer page</a><br><br>
<a href="activate.php">How to Activate</a><br>
<a href="https://www.stimulsoft.com/en/documentation">Documentation</a><br>
</body>
</html>

View File

@ -1,45 +0,0 @@
<?php
require_once 'stimulsoft/helper.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Stimulsoft Reports.PHP - Render & Export</title>
<!-- Stimulsoft Reports.JS -->
<script src="scripts/stimulsoft.reports.js" type="text/javascript"></script>
<?php
$options = StiHelper::createOptions();
$options->handler = "handler.php";
$options->timeout = 30;
StiHelper::initialize($options);
?>
<script type="text/javascript">
function onLoad() {
// Load and show report
var report = new Stimulsoft.Report.StiReport();
report.loadFile("reports/SimpleList.mrt");
// Process SQL data source
report.onBeginProcessData = function (event, callback) {
<?php StiHelper::createHandler(); ?>
}
report.renderAsync(function() {
var pdfData = report.exportDocument(Stimulsoft.Report.StiExportFormat.Pdf);
// Get report file name
var fileName = String.isNullOrEmpty(report.reportAlias) ? report.reportName : report.reportAlias;
// Save data to file
Stimulsoft.System.StiObject.saveAs(pdfData, fileName + ".pdf", "application/pdf");
});
}
</script>
</head>
<body onload="onLoad();">
Render & Export
</body>
</html>

View File

@ -1,181 +0,0 @@
<?php
class StiMsSqlAdapter {
private $connectionString = null;
private $connectionInfo = null;
private $link = null;
private $isMicrosoftDriver = false;
private function getLastErrorResult() {
$error = null;
if ($this->isMicrosoftDriver) {
if (($errors = sqlsrv_errors()) != null) {
$error = $errors[count($errors) - 1];
return StiResult::error("[".$error['code']."] ".$error['message']);
}
}
else $error = mssql_get_last_message();
if ($error) return StiResult::error($error);
return StiResult::error("Unknown");
}
private function connect() {
if ($this->isMicrosoftDriver) {
if (!function_exists("sqlsrv_connect")) return StiResult::error("MS SQL driver not found. Please configure your PHP server to work with MS SQL.");
$this->link = sqlsrv_connect(
$this->connectionInfo->host,
array(
"UID" => $this->connectionInfo->userId,
"PWD" => $this->connectionInfo->password,
"Database" => $this->connectionInfo->database,
"LoginTimeout" => 10,
"ReturnDatesAsStrings" => true,
"CharacterSet" => $this->connectionInfo->charset
));
if (!$this->link) return $this->getLastErrorResult();
}
else {
$this->link = mssql_connect($this->connectionInfo->host, $this->connectionInfo->userId, $this->connectionInfo->password);
if (!$this->link) return $this->getLastErrorResult();
$db = mssql_select_db($this->connectionInfo->database, $this->link);
mssql_close($this->link);
if (!$db) return $this->getLastErrorResult();
}
return StiResult::success();
}
private function disconnect() {
if (!$this->link) return;
$this->isMicrosoftDriver ? sqlsrv_close($this->link) : mssql_close($this->link);
}
public function parse($connectionString) {
$info = new stdClass();
$info->host = "";
$info->database = "";
$info->userId = "";
$info->password = "";
$info->charset = "UTF-8";
$parameters = explode(";", $connectionString);
foreach($parameters as $parameter) {
if (strpos($parameter, "=") < 1) continue;
$spos = strpos($parameter, "=");
$name = strtolower(trim(substr($parameter, 0, $spos)));
$value = trim(substr($parameter, $spos + 1));
switch ($name) {
case "server":
case "data source":
$info->host = $value;
break;
case "database":
case "initial catalog":
$info->database = $value;
break;
case "uid":
case "user":
case "user id":
$info->userId = $value;
break;
case "pwd":
case "password":
$info->password = $value;
break;
case "charset":
$info->charset = $value;
break;
}
}
$this->connectionString = $connectionString;
$this->connectionInfo = $info;
}
private function parseType($meta) {
switch ($meta["Type"]) {
// integer
case -6:
case -5:
case 4:
case 5:
return 'int';
// number (decimal)
case 2:
case 3:
case 6:
case 7:
return 'number';
// datetime
case -155:
case -154:
case -2:
case 91:
case 93:
return 'datetime';
// string
case -152:
case -10:
case -9:
case -8:
case -1:
case 1:
case 12:
return 'string';
}
// base64 array for unknown
return 'array';
}
public function test() {
$result = $this->connect();
if ($result->success) $this->disconnect();
return $result;
}
public function execute($queryString) {
$result = $this->connect();
if ($result->success) {
$query = $this->isMicrosoftDriver ? sqlsrv_query($this->link, $queryString) : mssql_query($queryString, $this->link);
if (!$query) return $this->getLastErrorResult();
$result->types = array();
$result->columns = array();
$result->rows = array();
if ($this->isMicrosoftDriver) {
foreach (sqlsrv_field_metadata($query) as $meta) {
$result->columns[] = $meta["Name"];
$result->types[] = $this->parseType($meta);
}
}
$isColumnsEmpty = count($result->columns) == 0;
while ($rowItem = $this->isMicrosoftDriver ? sqlsrv_fetch_array($query, SQLSRV_FETCH_ASSOC) : mssql_fetch_assoc($query)) {
$row = array();
foreach ($rowItem as $key => $value) {
if ($isColumnsEmpty && count($result->columns) < count($rowItem)) $result->columns[] = $key;
$row[] = $value;
}
$result->rows[] = $row;
}
$this->disconnect();
}
return $result;
}
function __construct() {
$this->isMicrosoftDriver = !function_exists("mssql_connect");
}
}

View File

@ -1,161 +0,0 @@
<?php
class StiMySqlAdapter {
private $connectionString = null;
private $connectionInfo = null;
private $link = null;
private function getLastErrorResult() {
if ($this->link->errno == 0) return StiResult::error("Unknown");
return StiResult::error("[".$this->link->errno."] ".$this->link->error);
}
private function connect() {
$this->link = new mysqli($this->connectionInfo->host, $this->connectionInfo->userId, $this->connectionInfo->password, $this->connectionInfo->database, $this->connectionInfo->port);
if ($this->link->connect_error) return StiResult::error("[".$this->link->connect_errno."] ".$this->link->connect_error);
if (!$this->link->set_charset($this->connectionInfo->charset)) return $this->getLastErrorResult();
return StiResult::success();
}
private function disconnect() {
if (!$this->link) return;
$this->link->close();
}
public function parse($connectionString) {
$info = new stdClass();
$info->host = "";
$info->port = 3306;
$info->database = "";
$info->userId = "";
$info->password = "";
$info->charset = "utf8";
$parameters = explode(";", $connectionString);
foreach($parameters as $parameter)
{
if (strpos($parameter, "=") < 1) continue;
$spos = strpos($parameter, "=");
$name = strtolower(trim(substr($parameter, 0, $spos)));
$value = trim(substr($parameter, $spos + 1));
switch ($name)
{
case "server":
case "host":
case "location":
$info->host = $value;
break;
case "port":
$info->port = $value;
break;
case "database":
case "data source":
$info->database = $value;
break;
case "uid":
case "user":
case "username":
case "userid":
case "user id":
$info->userId = $value;
break;
case "pwd":
case "password":
$info->password = $value;
break;
case "charset":
$info->charset = $value;
break;
}
}
$this->connectionString = $connectionString;
$this->connectionInfo = $info;
}
private function parseType($meta) {
switch ($meta->type) {
// integer
case 1:
case 2:
case 3:
case 8:
case 9:
return 'int';
// number (decimal)
case 4:
case 5:
case 16:
case 246:
return 'number';
// datetime
case 7:
case 10:
case 11:
case 12:
case 13:
return 'datetime';
// array, string
case 249:
case 250:
case 251:
case 252:
case 253:
case 254:
if ($meta->flags & 128) return 'array';
return 'string';
}
// base64 array for unknown
return 'array';
}
public function test() {
$result = $this->connect();
if ($result->success) $this->disconnect();
return $result;
}
public function execute($queryString) {
$result = $this->connect();
if ($result->success) {
$query = $this->link->query($queryString);
if (!$query) return $this->getLastErrorResult();
$result->types = array();
$result->columns = array();
$result->rows = array();
while ($meta = $query->fetch_field()) {
$result->columns[] = $meta->name;
$result->types[] = $this->parseType($meta);
}
if ($query->num_rows > 0) {
$isColumnsEmpty = count($result->columns) == 0;
while ($rowItem = $query->fetch_assoc()) {
$row = array();
foreach ($rowItem as $key => $value) {
if ($isColumnsEmpty && count($result->columns) < count($rowItem)) $result->columns[] = $key;
$type = $result->types[count($row)];
$row[] = ($type == 'array') ? base64_encode($value) : $value;
}
$result->rows[] = $row;
}
}
$this->disconnect();
}
return $result;
}
}

View File

@ -1,225 +0,0 @@
<?php
class StiConnectionInfo {
public $host = "";
public $port = "";
public $database = "";
public $userId = "";
public $password = "";
public $charset = "";
public $dsn = "";
public $privilege = "";
public $dataPath = "";
public $schemaPath = "";
}
class StiSender {
const Viewer = "Viewer";
const Designer = "Designer";
}
class StiDatabaseType {
const XML = "XML";
const JSON = "JSON";
const MySQL = "MySQL";
const MSSQL = "MS SQL";
const PostgreSQL = "PostgreSQL";
const Firebird = "Firebird";
const Oracle = "Oracle";
}
class StiEventType {
const ExecuteQuery = "ExecuteQuery";
const BeginProcessData = "BeginProcessData";
//const EndProcessData = "EndProcessData";
const CreateReport = "CreateReport";
const OpenReport = "OpenReport";
const SaveReport = "SaveReport";
const SaveAsReport = "SaveAsReport";
const PrintReport = "PrintReport";
const BeginExportReport = "BeginExportReport";
const EndExportReport = "EndExportReport";
const EmailReport = "EmailReport";
const DesignReport = "DesignReport";
}
class StiExportFormat {
const Html = "Html";
const Html5 = "Html5";
const Pdf = "Pdf";
const Excel2007 = "Excel2007";
const Word2007 = "Word2007";
const Csv = "Csv";
}
class StiRequest {
public $sender = null;
public $event = null;
public $connectionString = null;
public $queryString = null;
public $database = null;
public $report = null;
public $data = null;
public $fileName = null;
public $format = null;
public $settings = null;
public function parse() {
$data = file_get_contents("php://input");
$obj = json_decode($data);
if ($obj == null) return StiResult::error("JSON parser error");
if (isset($obj->sender)) $this->sender = $obj->sender;
if (isset($obj->command)) $this->event = $obj->command;
if (isset($obj->event)) $this->event = $obj->event;
if (isset($obj->connectionString)) $this->connectionString = $obj->connectionString;
if (isset($obj->queryString)) $this->queryString = $obj->queryString;
if (isset($obj->database)) $this->database = $obj->database;
if (isset($obj->dataSource)) $this->dataSource = $obj->dataSource;
if (isset($obj->connection)) $this->connection = $obj->connection;
if (isset($obj->data)) $this->data = $obj->data;
if (isset($obj->fileName)) $this->fileName = $obj->fileName;
if (isset($obj->format)) $this->format = $obj->format;
if (isset($obj->settings)) $this->settings = $obj->settings;
if (isset($obj->report)) {
$this->report = $obj->report;
if (defined('JSON_UNESCAPED_SLASHES')) $this->reportJson = json_encode($this->report, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
else {
// for PHP 5.3
$this->reportJson = str_replace('\/', '/', json_encode($this->report));
$this->reportJson = preg_replace_callback('/\\\\u(\w{4})/', function ($matches) {
return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8');
}, $this->reportJson);
}
}
return StiResult::success(null, $this);
}
}
class StiResponse {
public static function json($result, $exit = true) {
unset($result->object);
if (defined('JSON_UNESCAPED_SLASHES')) echo json_encode($result, JSON_UNESCAPED_SLASHES);
else echo json_encode($result);
if ($exit) exit;
}
}
class StiResult {
public $success = true;
public $notice = null;
public $object = null;
public static function success($notice = null, $object = null) {
$result = new StiResult();
$result->success = true;
$result->notice = $notice;
$result->object = $object;
return $result;
}
public static function error($notice = null) {
$result = new StiResult();
$result->success = false;
$result->notice = $notice;
return $result;
}
}
class StiEmailSettings {
/** Email address of the sender */
public $from = null;
/** Name and surname of the sender */
public $name = "John Smith";
/** Email address of the recipient */
public $to = null;
/** Email Subject */
public $subject = null;
/** Text of the Email */
public $message = null;
/** Attached file name */
public $attachmentName = null;
/** Charset for the message */
public $charset = "UTF-8";
/** Address of the SMTP server */
public $host = null;
/** Port of the SMTP server */
public $port = 465;
/** The secure connection prefix - ssl or tls */
public $secure = "ssl";
/** Login (Username or Email) */
public $login = null;
/** Password */
public $password = null;
}
class StiDatabaseEventArgs {
public $sender = null;
public $database = null;
public $connectionInfo = null;
public $queryString = null;
function __construct($sender, $database, $connectionInfo, $queryString = null) {
$this->sender = $sender;
$this->database = $database;
$this->connectionInfo = $connectionInfo;
$this->queryString = $queryString;
}
}
class StiReportEventArgs {
public $sender = null;
public $report = null;
function __construct($sender, $report = null) {
$this->sender = $sender;
$this->report = $report;
}
}
class StiExportReportEventArgs {
public $sender = null;
public $settings = null;
public $format = null;
public $fileName = null;
public $data = null;
function __construct($settings, $format, $fileName, $data = null) {
$this->settings = $settings;
$this->format = $format;
$this->fileName = $fileName;
$this->data = $data;
}
}
class StiSaveReportEventArgs {
public $sender = null;
public $report = null;
public $fileName = null;
function __construct($report, $fileName) {
$this->report = $report;
$this->fileName = $fileName;
}
}
class StiDesignReportEventArgs {
public $fileName = null;
function __construct($fileName) {
$this->fileName = $fileName;
}
}

View File

@ -1,443 +0,0 @@
<?php
require_once 'classes.php';
require_once 'adapters/mysql.php';
require_once 'adapters/mssql.php';
function stiErrorHandler($errNo, $errStr, $errFile, $errLine) {
$result = StiResult::error("[".$errNo."] ".$errStr." (".$errFile.", Line ".$errLine.")");
StiResponse::json($result);
}
function stiShutdownFunction() {
$err = error_get_last();
if ($err != null && (($err["type"] & E_COMPILE_ERROR) || ($err["type"] & E_ERROR) || ($err["type"] & E_CORE_ERROR) || ($err["type"] & E_RECOVERABLE_ERROR))) {
$result = StiResult::error("[".$err["type"]."] ".$err["message"]." (".$err["file"].", Line ".$err["line"].")");
StiResponse::json($result);
}
}
class StiHandler {
private function checkEventResult($event, $args) {
if (isset($event)) $result = $event($args);
if (!isset($result)) $result = StiResult::success();
if ($result === true) return StiResult::success();
if ($result === false) return StiResult::error();
if (gettype($result) == "string") return StiResult::error($result);
if (isset($args)) $result->object = $args;
return $result;
}
private function getQueryParameters($query) {
$result = array();
while (strpos($query, "{") !== false) {
$query = substr($query, strpos($query, "{") + 1);
$parameterName = substr($query, 0, strpos($query, "}"));
$result[$parameterName] = null;
}
return $result;
}
private function applyQueryParameters($query, $values) {
$result = "";
while (strpos($query, "{") !== false) {
$result .= substr($query, 0, strpos($query, "{"));
$query = substr($query, strpos($query, "{") + 1);
$parameterName = substr($query, 0, strpos($query, "}"));
if (isset($values) && isset($values[$parameterName]) && !is_null($values[$parameterName])) $result .= strval($values[$parameterName]);
else $result .= "{".$parameterName."}";
$query = substr($query, strpos($query, "}") + 1);
}
return $result.$query;
}
//--- Events
public $onBeginProcessData = null;
private function invokeBeginProcessData($request) {
$args = new stdClass();
$args->sender = $request->sender;
$args->database = $request->database;
$args->connectionString = isset($request->connectionString) ? base64_decode(str_rot13($request->connectionString)) : null;
$args->queryString = isset($request->queryString) ? base64_decode(str_rot13($request->queryString)) : null;
$args->dataSource = isset($request->dataSource) ? $request->dataSource : null;
$args->connection = isset($request->connection) ? $request->connection : null;
if (isset($request->queryString)) $args->parameters = $this->getQueryParameters($request->queryString);
$result = $this->checkEventResult($this->onBeginProcessData, $args);
if (isset($result->object->queryString) && isset($args->parameters)) $result->object->queryString = $this->applyQueryParameters($result->object->queryString, $args->parameters);
return $result;
}
public $onEndProcessData = null;
private function invokeEndProcessData($request, $result) {
$args = new stdClass();
$args->sender = $request->sender;
$args->result = $result;
return $this->checkEventResult($this->onEndProcessData, $args);
}
public $onCreateReport = null;
private function invokeCreateReport($request) {
$args = new stdClass();
$args->sender = $request->sender;
return $this->checkEventResult($this->onCreateReport, $args);
}
public $onOpenReport = null;
private function invokeOpenReport($request) {
$args = new stdClass();
$args->sender = $request->sender;
return $this->checkEventResult($this->onOpenReport, $args);
}
public $onSaveReport = null;
private function invokeSaveReport($request) {
$args = new stdClass();
$args->sender = $request->sender;
$args->report = $request->report;
$args->reportJson = $request->reportJson;
$args->fileName = $request->fileName;
return $this->checkEventResult($this->onSaveReport, $args);
}
public $onSaveAsReport = null;
private function invokeSaveAsReport($request) {
$args = new stdClass();
$args->sender = $request->sender;
$args->report = $request->report;
$args->reportJson = $request->reportJson;
$args->fileName = $request->fileName;
return $this->checkEventResult($this->onSaveAsReport, $args);
}
public $onPrintReport = null;
private function invokePrintReport($request) {
$args = new stdClass();
$args->sender = $request->sender;
$args->fileName = $request->fileName;
return $this->checkEventResult($this->onPrintReport, $args);
}
public $onBeginExportReport = null;
private function invokeBeginExportReport($request) {
$args = new stdClass();
$args->sender = $request->sender;
$args->settings = $request->settings;
$args->format = $request->format;
$args->fileName = $request->fileName;
return $this->checkEventResult($this->onBeginExportReport, $args);
}
public $onEndExportReport = null;
private function invokeEndExportReport($request) {
$args = new stdClass();
$args->sender = $request->sender;
$args->format = $request->format;
$args->fileName = $request->fileName;
$args->data = $request->data;
return $this->checkEventResult($this->onEndExportReport, $args);
}
public $onEmailReport = null;
private function invokeEmailReport($request) {
$settings = new StiEmailSettings();
$settings->to = $request->settings->email;
$settings->subject = $request->settings->subject;
$settings->message = $request->settings->message;
$settings->attachmentName = $request->fileName.'.'.$this->getFileExtension($request->format);
$args = new stdClass();
$args->sender = $request->sender;
$args->settings = $settings;
$args->format = $request->format;
$args->fileName = $request->fileName;
$args->data = base64_decode($request->data);
$result = $this->checkEventResult($this->onEmailReport, $args);
if (!$result->success) return $result;
$guid = substr(md5(uniqid().mt_rand()), 0, 12);
if (!file_exists('tmp')) mkdir('tmp');
file_put_contents('tmp/'.$guid.'.'.$args->fileName, $args->data);
// Detect auth mode
$auth = $settings->host != null && $settings->login != null && $settings->password != null;
$mail = substr(PHP_VERSION, 0, 1) == '5' ? new PHPMailer(true) : new PHPMailer\PHPMailer\PHPMailer(true);
if ($auth) $mail->IsSMTP();
try {
$mail->CharSet = $settings->charset;
$mail->IsHTML(false);
$mail->From = $settings->from;
$mail->FromName = $settings->name;
// Add Emails list
$emails = preg_split('/,|;/', $settings->to);
foreach ($emails as $settings->to) {
$mail->AddAddress(trim($settings->to));
}
// Fill email fields
$mail->Subject = htmlspecialchars($settings->subject);
$mail->Body = $settings->message;
$mail->AddAttachment('tmp/'.$guid.'.'.$args->fileName, $settings->attachmentName);
// Fill auth fields
if ($auth) {
$mail->Host = $settings->host;
$mail->Port = $settings->port;
$mail->SMTPAuth = true;
$mail->SMTPSecure = $settings->secure;
$mail->Username = $settings->login;
$mail->Password = $settings->password;
}
$mail->Send();
}
catch (phpmailerException $e) {
$error = strip_tags($e->errorMessage());
return StiResult::error($error);
}
catch (Exception $e) {
$error = strip_tags($e->getMessage());
}
unlink('tmp/'.$guid.'.'.$args->fileName);
if (isset($error)) return StiResult::error($error);
return $result;
}
public $onDesignReport = null;
private function invokeDesignReport($request) {
$args = new stdClass();
$args->sender = $request->sender;
$args->fileName = $request->fileName;
return $this->checkEventResult($this->onDesignReport, $args);
}
//--- Methods
public function registerErrorHandlers() {
set_error_handler("stiErrorHandler");
register_shutdown_function("stiShutdownFunction");
}
public function process($response = true) {
$result = $this->innerProcess();
if ($response) StiResponse::json($result);
return $result;
}
//--- Private methods
private function createConnection($args) {
switch ($args->database) {
case StiDatabaseType::MySQL: $connection = new StiMySqlAdapter(); break;
case StiDatabaseType::MSSQL: $connection = new StiMsSqlAdapter(); break;
case StiDatabaseType::Firebird: $connection = new StiFirebirdAdapter(); break;
case StiDatabaseType::PostgreSQL: $connection = new StiPostgreSqlAdapter(); break;
case StiDatabaseType::Oracle: $connection = new StiOracleAdapter(); break;
}
if (isset($connection)) {
$connection->parse($args->connectionString);
return StiResult::success(null, $connection);
}
return StiResult::error("Unknown database type [".$args->database."]");
}
private function innerProcess() {
$request = new StiRequest();
$result = $request->parse();
if ($result->success) {
switch ($request->event) {
case StiEventType::BeginProcessData:
case StiEventType::ExecuteQuery:
$result = $this->invokeBeginProcessData($request);
if (!$result->success) return $result;
$queryString = $result->object->queryString;
$result = $this->createConnection($result->object);
if (!$result->success) return $result;
$connection = $result->object;
if (isset($queryString)) $result = $connection->execute($queryString);
else $result = $connection->test();
$result = $this->invokeEndProcessData($request, $result);
if (!$result->success) return $result;
if (isset($result->object) && isset($result->object->result)) return $result->object->result;
return $result;
case StiEventType::CreateReport:
return $this->invokeCreateReport($request);
case StiEventType::OpenReport:
return $this->invokeOpenReport($request);
case StiEventType::SaveReport:
return $this->invokeSaveReport($request);
case StiEventType::SaveAsReport:
return $this->invokeSaveReport($request);
case StiEventType::PrintReport:
return $this->invokePrintReport($request);
case StiEventType::BeginExportReport:
return $this->invokeBeginExportReport($request);
case StiEventType::EndExportReport:
return $this->invokeEndExportReport($request);
case StiEventType::EmailReport:
return $this->invokeEmailReport($request);
case StiEventType::DesignReport;
return $this->invokeDesignReport($request);
}
$result = StiResult::error("Unknown event [".$request->event."]");
}
return $result;
}
private function getFileExtension($format) {
switch ($format) {
case StiExportFormat::Html:
case StiExportFormat::Html5:
return "html";
case StiExportFormat::Pdf:
return "pdf";
case StiExportFormat::Excel2007:
return "xlsx";
case StiExportFormat::Word2007:
return "docx";
case StiExportFormat::Csv:
return "csv";
}
return "";
}
}
//---------- Helper ----------//
class StiHelper {
public static function createOptions() {
$options = new stdClasS();
$options->handler = "handler.php";
$options->timeout = 30;
return $options;
}
public static function initialize($options) {
if (!isset($options)) $options = StiHelper::createOptions();
?>
<script type="text/javascript">
StiHelper.prototype.process = function (args, callback) {
if (args) {
if (args.event == 'BeginProcessData') {
args.preventDefault = true;
if (args.database == 'XML' || args.database == 'JSON' || args.database == 'Excel')
return callback(null);
if (args.database == 'Data from DataSet, DataTables')
return callback(args);
}
var command = {};
for (var p in args) {
if (p == 'report' && args.report != null) command.report = JSON.parse(args.report.saveToJsonString());
else if (p == 'settings' && args.settings != null) command.settings = args.settings;
else if (p == 'data') command.data = Stimulsoft.System.Convert.toBase64String(args.data);
else if (p == 'connectionString' || p == 'queryString') command[p] = jsHelper.getStringValue(args[p]);
else command[p] = args[p];
}
var isNullOrEmpty = function (value) {
return value == null || value === '' || value === undefined;
}
var json = JSON.stringify(command);
if (!callback) callback = function (message) {
if (Stimulsoft.System.StiError.errorMessageForm && !isNullOrEmpty(message)) {
var obj = JSON.parse(message);
if (!obj.success || !isNullOrEmpty(obj.notice)) {
var message = isNullOrEmpty(obj.notice) ? 'There was some error' : obj.notice;
Stimulsoft.System.StiError.errorMessageForm.show(message, obj.success);
}
}
}
jsHelper.send(json, callback);
}
}
StiHelper.prototype.send = function (json, callback) {
try {
var request = new XMLHttpRequest();
request.open('post', this.url, true);
request.setRequestHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
request.setRequestHeader('Cache-Control', 'max-age=0');
request.setRequestHeader('Pragma', 'no-cache');
request.timeout = this.timeout * 1000;
request.onload = function () {
if (request.status == 200) {
var responseText = request.responseText;
request.abort();
callback(responseText);
}
else {
Stimulsoft.System.StiError.showError('[' + request.status + '] ' + request.statusText, false);
}
};
request.onerror = function (e) {
var errorMessage = 'Connect to remote error: [' + request.status + '] ' + request.statusText;
Stimulsoft.System.StiError.showError(errorMessage, false);
};
request.send(json);
}
catch (e) {
var errorMessage = 'Connect to remote error: ' + e.message;
Stimulsoft.System.StiError.showError(errorMessage, false);
request.abort();
}
};
StiHelper.prototype.getStringValue = function (value) {
return Stimulsoft.System.Convert.toBase64String(value).replace(/[a-zA-Z]/g, function (c) {
return String.fromCharCode((c <= "Z" ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);
});
};
StiHelper.prototype.getUrlVars = function (json, callback) {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,
function (m, key, value) {
vars[key] = decodeURI(value);
});
return vars;
}
function StiHelper(url, timeout) {
this.url = url;
this.timeout = timeout;
}
jsHelper = new StiHelper('<?php echo $options->handler; ?>', <?php echo $options->timeout; ?>);
</script>
<?php
}
public static function createHandler() {
?>jsHelper.process(arguments[0], arguments[1]);
<?php
}
}

View File

@ -1 +0,0 @@
6vJhGtLLLz2GNviWmUTrhSqnOItdDwjBylQzQcAOiHlrzAZzmWmSnQQ4gKFiZ4LJpJv//QjFVXxcHAVbzZfXjyOGPmj/m+BEjr2Z14dWeqLFNGF74GELbTTKs2+Le/9cDIWdGNnOpEK2aGdYllauMPLQsiScC521JIEYSdOspiRHSLcegksxfNedJjyIjGlfI2YrddBRWGiO+uWOHE5oz9hLG8VPBSRo60KmgkscM5X+7+aQ+6vzKKOC2XB+e6BMQC5qNVBUblfGQR2EjNLZKmSJtvek7IbG/OK+XP0j2bwicyJUGC0pyLHqctr3BpcO/gA5LoVfuwqYG3klL//owBkObPPhJV1HD6XsHL0GDryssJFaDCQIyXMrOn7hNQNkEIyx+AJDNgf5XfxPgEgFsRhYCPYq7ccutg2by8duOxbF3xH0gL/uAQN275COXJBV3W62DSLM+o8azChG+Z7y0dF9f4whZ/SKD4DwNPUWK7osEPVwl5BY+0lkdqd67fatlrlc0QU/ZX9f5QcTKfl5ljuNc+kcqxmd9NND6Xzrw9gFsFqIWqqVo++DdoAZFStXMkOp/nTNBQMRA100k3vi2SbbiHq/gVimrQecUhWG0qU5zcemtVGDMs1ruXsoHX8pYX/rMJHH09qCWllVyBykkTLourYEig9g5fhKDYRV05aC0cWsbxR2nj9TH3SLmG4P2Px7uJsq6iOsnIHWuBMwk8oF7xPEugjw+x8lkjVVoV8WWBSdjIxGh4LviZXBEJm9FTJzYcnEHMZRh0uVE1g8crC+TfRVii7dcdZzeQklzyNY+0Q1/hRaIUs+mNPRiqG6YqEv3f+yG4ncxzkCWZDvXPox87y61jbg6Dg73X1RAwwvbIXuJVANbaDOefUELPmpz4SIpHx8zpLSmn1H1u0PolbsimLigcGw2bJQeuU++OBU74vJJde3JdoO6IOfmUJkoxprdszyknLm+zWgnC+jjaCtEZZuOIJqyuVPoqHRiFkqNjbddkvGMmj/4+2D6BdYQot9sEOW7iCgV4SvZ/efC0NlRX+Z+6PODwKJiO+Sen5aAlsJcL2jIUSAjgyS+7im7XTGlYKuRL59EQjA5HArO1ikJ0P/2pk4u91z2J8GRvTPu5BZUI9M0BLGLAVCFMte4JQCOr+f785RgjerSNCSgN4Mfa5+jDQAKTAVAO5tqT/SBEm0M5U1EylQ/fbseKt+dQ1/VzqlQ9SH14jtI0J97ACqk9SBt9xpTgBnJrBSTnnY21l2zWS7/2k5U9LPDJn0Lm32ueoDRFaM4JeK1HoSi2HvOYy1V1hU5pCe893QsBE/HOVp4UWu9lfiEWunHEEdPZOUPgc131KwJrM4K3DYiBbXl442TgbNLfz5IBnAw1NVabMXXyx2LOi6x35xw1YLMRYNWYE9QpocBhoFQtStd2OUZ5CqvxhXf+VaLK3hmm1GvlqpUK6LIDd3eyuQK4f0E7+zVSBaV6eSDI9YJC42Ee+Br8AByGYLRaFISpDculGt2nqwFL6cwltv1Xy11frJR2KqbR8sd6dI0V69XnwBziRzJq1SyAZd9bzClYSpA3ZYPN9ghdaHA+GZak0IYMokWLi6oYquOCRoy8f0sEQM2Uhw2x/E9tgyNoLZhDhrk805/VCsThI5fHn0YWVnmQZTrGkOwnoqLw3VHb7akUmNnjMlk/tD59bR2lgD+fnNuNsBYDDjJpg+fKmgf9araTPEIpuuanp53e6xodRYKIj4o4+39DrPK10eR4CDfSh5UShvnCZz+V0FAkIkoM92U1JTU59P4M4pzc8PswmS1rGTRaZMUrTYrjeGCHC9Hl0CTIR1/rQAx8iIcC3yVNCeiTJAmKMCl830O4GpEfduNHQgDrlsJC4q6RA7J2kUzW2WQvKFKH3bRH1hOc6LZK4DmwMGzXMKDKOxK0dzld2/ImRN6DbPacV/4d0HK06qBOFEgUJqXhMpV1JjsXVvmx/m2LCRgkD5vPEwcuiWtWde7tISLCEg6hjAV9+Hx6zOWpozg7aZMtikT+43uWakRkU/H+ITIGhqxuQhkZkmIddWrjD5lJtdUOSa0FWu969EDp4XB8dmUKSwyrkgOHZu6DutFW5ArtqhNejthWt/sV1FkSbvdd26zn1fSO4pDa4pDmcSo+l/4DChZbEyICc7IQrPjVuRUlVGuAVksZTBX+VYIip8LsJSFLHo7Dnn4QT3qDNIh8aAcY3fnHhph4G5ekbvGOw3+m1qqs8t0m89vdK7k8nJTw==

View File

@ -1,10 +0,0 @@
<?php
// You can check the user authorization to send a license key only if the result is positive.
if (file_exists("license.key")) {
$license = file_get_contents("license.key");
echo $license;
}
?>

View File

@ -1,72 +0,0 @@
<?php
require_once 'stimulsoft/helper.php';
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Stimulsoft Reports.PHP - JS Viewer</title>
<!-- Office2013 style -->
<link href="css/stimulsoft.viewer.office2013.whiteblue.css" rel="stylesheet">
<!-- Stimulsoft Reports.JS -->
<script src="scripts/stimulsoft.reports.js" type="text/javascript"></script>
<!-- Stimulsoft JS Viewer -->
<script src="scripts/stimulsoft.viewer.js" type="text/javascript"></script>
<?php
$options = StiHelper::createOptions();
$options->handler = "handler.php";
$options->timeout = 30;
StiHelper::initialize($options);
?>
<script type="text/javascript">
//Stimulsoft.Base.StiLicense.loadFromFile("stimulsoft/license.php");
var options = new Stimulsoft.Viewer.StiViewerOptions();
options.appearance.fullScreenMode = true;
options.toolbar.showSendEmailButton = true;
Stimulsoft.Base.Localization.StiLocalization.addLocalizationFile("localization/zh-CHS.xml", false, "Chinese (Simplified)");
Stimulsoft.Base.Localization.StiLocalization.cultureName = "Chinese (Simplified)";
var viewer = new Stimulsoft.Viewer.StiViewer(options, "StiViewer", false);
// Process SQL data source
viewer.onBeginProcessData = function (event, callback) {
<?php StiHelper::createHandler(); ?>
}
// Manage export settings on the server side
viewer.onBeginExportReport = function (args) {
<?php //StiHelper::createHandler(); ?>
//args.fileName = "MyReportName";
}
// Process exported report file on the server side
/*viewer.onEndExportReport = function (event) {
event.preventDefault = true; // Prevent client default event handler (save the exported report as a file)
<?php StiHelper::createHandler(); ?>
}*/
// Send exported report to Email
viewer.onEmailReport = function (event) {
<?php StiHelper::createHandler(); ?>
}
// Load and show report
var report = new Stimulsoft.Report.StiReport();
report.loadFile("reports/SimpleList.mrt");
viewer.report = report;
function onLoad() {
viewer.renderHtml("viewerContent");
}
</script>
</head>
<body onload="onLoad();">
<div id="viewerContent"></div>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -1,297 +0,0 @@
/**
* Created by jf on 2015/9/11.
* Modified by bear on 2016/9/7.
*/
$(function () {
var pageManager = {
$container: $('#container'),
_pageStack: [],
_configs: [],
_pageAppend: function(){},
_defaultPage: null,
_pageIndex: 1,
setDefault: function (defaultPage) {
this._defaultPage = this._find('name', defaultPage);
return this;
},
setPageAppend: function (pageAppend) {
this._pageAppend = pageAppend;
return this;
},
init: function () {
var self = this;
$(window).on('hashchange', function () {
var state = history.state || {};
var url = location.hash.indexOf('#') === 0 ? location.hash : '#';
var page = self._find('url', url) || self._defaultPage;
if (state._pageIndex <= self._pageIndex || self._findInStack(url)) {
self._back(page);
} else {
self._go(page);
}
});
if (history.state && history.state._pageIndex) {
this._pageIndex = history.state._pageIndex;
}
this._pageIndex--;
var url = location.hash.indexOf('#') === 0 ? location.hash : '#';
var page = self._find('url', url) || self._defaultPage;
this._go(page);
return this;
},
push: function (config) {
this._configs.push(config);
return this;
},
go: function (to) {
var config = this._find('name', to);
if (!config) {
return;
}
location.hash = config.url;
},
_go: function (config) {
this._pageIndex ++;
history.replaceState && history.replaceState({_pageIndex: this._pageIndex}, '', location.href);
var html = $(config.template).html();
var $html = $(html).addClass('slideIn').addClass(config.name);
$html.on('animationend webkitAnimationEnd', function(){
$html.removeClass('slideIn').addClass('js_show');
});
this.$container.append($html);
this._pageAppend.call(this, $html);
this._pageStack.push({
config: config,
dom: $html
});
if (!config.isBind) {
this._bind(config);
}
return this;
},
back: function () {
history.back();
},
_back: function (config) {
this._pageIndex --;
var stack = this._pageStack.pop();
if (!stack) {
return;
}
var url = location.hash.indexOf('#') === 0 ? location.hash : '#';
var found = this._findInStack(url);
if (!found) {
var html = $(config.template).html();
var $html = $(html).addClass('js_show').addClass(config.name);
$html.insertBefore(stack.dom);
if (!config.isBind) {
this._bind(config);
}
this._pageStack.push({
config: config,
dom: $html
});
}
stack.dom.addClass('slideOut').on('animationend webkitAnimationEnd', function () {
stack.dom.remove();
});
return this;
},
_findInStack: function (url) {
var found = null;
for(var i = 0, len = this._pageStack.length; i < len; i++){
var stack = this._pageStack[i];
if (stack.config.url === url) {
found = stack;
break;
}
}
return found;
},
_find: function (key, value) {
var page = null;
for (var i = 0, len = this._configs.length; i < len; i++) {
if (this._configs[i][key] === value) {
page = this._configs[i];
break;
}
}
return page;
},
_bind: function (page) {
var events = page.events || {};
for (var t in events) {
for (var type in events[t]) {
this.$container.on(type, t, events[t][type]);
}
}
page.isBind = true;
}
};
function fastClick(){
var supportTouch = function(){
try {
document.createEvent("TouchEvent");
return true;
} catch (e) {
return false;
}
}();
var _old$On = $.fn.on;
$.fn.on = function(){
if(/click/.test(arguments[0]) && typeof arguments[1] == 'function' && supportTouch){ // 只扩展支持touch的当前元素的click事件
var touchStartY, callback = arguments[1];
_old$On.apply(this, ['touchstart', function(e){
touchStartY = e.changedTouches[0].clientY;
}]);
_old$On.apply(this, ['touchend', function(e){
if (Math.abs(e.changedTouches[0].clientY - touchStartY) > 10) return;
e.preventDefault();
callback.apply(this, [e]);
}]);
}else{
_old$On.apply(this, arguments);
}
return this;
};
}
function preload(){
$(window).on("load", function(){
var imgList = [
"./images/layers/content.png",
"./images/layers/navigation.png",
"./images/layers/popout.png",
"./images/layers/transparent.gif"
];
for (var i = 0, len = imgList.length; i < len; ++i) {
new Image().src = imgList[i];
}
});
}
function androidInputBugFix(){
// .container 设置了 overflow 属性, 导致 Android 手机下输入框获取焦点时, 输入法挡住输入框的 bug
// 相关 issue: https://github.com/weui/weui/issues/15
// 解决方法:
// 0. .container 去掉 overflow 属性, 但此 demo 下会引发别的问题
// 1. 参考 http://stackoverflow.com/questions/23757345/android-does-not-correctly-scroll-on-input-focus-if-not-body-element
// Android 手机下, input 或 textarea 元素聚焦时, 主动滚一把
if (/Android/gi.test(navigator.userAgent)) {
window.addEventListener('resize', function () {
if (document.activeElement.tagName == 'INPUT' || document.activeElement.tagName == 'TEXTAREA') {
window.setTimeout(function () {
document.activeElement.scrollIntoViewIfNeeded();
}, 0);
}
})
}
}
function setJSAPI(){
var option = {
title: 'WeUI, 为微信 Web 服务量身设计',
desc: 'WeUI, 为微信 Web 服务量身设计',
link: "https://weui.io",
imgUrl: 'https://mmbiz.qpic.cn/mmemoticon/ajNVdqHZLLA16apETUPXh9Q5GLpSic7lGuiaic0jqMt4UY8P4KHSBpEWgM7uMlbxxnVR7596b3NPjUfwg7cFbfCtA/0'
};
$.getJSON('https://weui.io/api/sign?url=' + encodeURIComponent(location.href.split('#')[0]), function (res) {
wx.config({
beta: true,
debug: false,
appId: res.appid,
timestamp: res.timestamp,
nonceStr: res.nonceStr,
signature: res.signature,
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'onMenuShareQZone',
// 'setNavigationBarColor',
'setBounceBackground'
]
});
wx.ready(function () {
/*
wx.invoke('setNavigationBarColor', {
color: '#F8F8F8'
});
*/
wx.invoke('setBounceBackground', {
'backgroundColor': '#F8F8F8',
'footerBounceColor' : '#F8F8F8'
});
wx.onMenuShareTimeline(option);
wx.onMenuShareQQ(option);
wx.onMenuShareAppMessage({
title: 'WeUI',
desc: '为微信 Web 服务量身设计',
link: location.href,
imgUrl: 'https://mmbiz.qpic.cn/mmemoticon/ajNVdqHZLLA16apETUPXh9Q5GLpSic7lGuiaic0jqMt4UY8P4KHSBpEWgM7uMlbxxnVR7596b3NPjUfwg7cFbfCtA/0'
});
});
});
}
function setPageManager(){
var pages = {}, tpls = $('script[type="text/html"]');
var winH = $(window).height();
for (var i = 0, len = tpls.length; i < len; ++i) {
var tpl = tpls[i], name = tpl.id.replace(/tpl_/, '');
pages[name] = {
name: name,
url: '#' + name,
template: '#' + tpl.id
};
}
pages.home.url = '#';
for (var page in pages) {
pageManager.push(pages[page]);
}
pageManager
.setPageAppend(function($html){
var $foot = $html.find('.page__ft');
if($foot.length < 1) return;
if($foot.position().top + $foot.height() < winH){
$foot.addClass('j_bottom');
}else{
$foot.removeClass('j_bottom');
}
})
.setDefault('home')
.init();
}
function init(){
preload();
fastClick();
androidInputBugFix();
setJSAPI();
setPageManager();
window.pageManager = pageManager;
window.home = function(){
location.hash = '';
};
}
init();
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 748 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 838 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 924 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 924 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 669 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 548 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
{ {
"/assets/dist/bundle.min.js": "/assets/dist/bundle.min.js?id=3134a2a19af235238c9a", "/assets/dist/bundle.min.js": "/assets/dist/bundle.min.js?id=6ed6b193096450339853",
"/assets/dist/app.min.js": "/assets/dist/app.min.js?id=7f970b0394bf5cba9353", "/assets/dist/app.min.js": "/assets/dist/app.min.js?id=7f970b0394bf5cba9353",
"/assets/dist/app.min.css": "/assets/dist/app.min.css?id=b145e2781689d581fc3f", "/assets/dist/app.min.css": "/assets/dist/app.min.css?id=b145e2781689d581fc3f",
"/assets/vendor/ag-grid/ag-grid.min.css": "/assets/vendor/ag-grid/ag-grid.min.css?id=0e414057cb24126f35ae", "/assets/vendor/ag-grid/ag-grid.min.css": "/assets/vendor/ag-grid/ag-grid.min.css?id=0e414057cb24126f35ae",

View File

@ -1,16 +1,7 @@
<template> <template>
<ul class="nav navbar-nav navbar-right m-n hidden-xs nav-user"> <ul class="nav navbar-nav navbar-right m-n hidden-xs nav-user">
<!-- <li class="dropdown" v-if="realtime">
<li class="dropdown">
<a data-toggle="addtab" data-url="index/index/dashboard" data-id="dashboard" data-name="个人空间" class="dropdown-toggle hidden-xs">
<i class="fa fa-bar-chart-o"></i>
<span>个人空间</span>
</a>
</li>
-->
<li class="dropdown">
<a href="javascript:;" @click="chatToggle()" title="即时消息" class="dropdown-toggle hidden-xs"> <a href="javascript:;" @click="chatToggle()" title="即时消息" class="dropdown-toggle hidden-xs">
<i class="fa fa-comments pulse-box"> <i class="fa fa-comments pulse-box">
<span class='pulse green'></span> <span class='pulse green'></span>
@ -20,16 +11,6 @@
</li> </li>
<li class="dropdown hidden-xs"> <li class="dropdown hidden-xs">
<!--
<a href="javascript:;" data-toggle="dropdown" class="dropdown-toggle">
<i class="fa fa-bell-o notify-box">
<span class="pulse" v-if="count.total > 0"></span>
</i>
<span class="visible-xs-inline">通知</span>
</a>
-->
<a href="#" data-toggle="dropdown" title="通知" class="dropdown-toggle"> <a href="#" data-toggle="dropdown" title="通知" class="dropdown-toggle">
<i class="fa fa-bell-o pulse-box"> <i class="fa fa-bell-o pulse-box">
<span :class="[countTotal > 0 ? 'pulse' : 'hidden']"></span> <span :class="[countTotal > 0 ? 'pulse' : 'hidden']"></span>
@ -94,29 +75,13 @@
<a href="javascript:;" data-toggle="addtab" data-url="user/profile/index" data-id="02" data-name="个人资料">个人资料</a> <a href="javascript:;" data-toggle="addtab" data-url="user/profile/index" data-id="02" data-name="个人资料">个人资料</a>
</li> </li>
<li> <li>
<a href="javascript:;" @click="support">技术支持</a> <a href="javascript:;" @click="support">关于</a>
</li> </li>
<li class="divider"></li> <li class="divider"></li>
<li> <li>
<a :href="url('user/auth/logout')">注销</a> <a :href="url('user/auth/logout')">退出</a>
</li> </li>
</ul> </ul>
<!-- animated fadeInUp -->
<!--
<ul class="dropdown-menu">
<li>
<a href="javascript:;" data-toggle="addtab" data-url="user/profile/index" data-id="02" data-name="个人资料">个人资料</a>
</li>
<li>
<a href="javascript:;" @click="support">技术支持</a>
</li>
<li class="divider"></li>
<li>
<a :href="url('user/auth/logout')">注销</a>
</li>
</ul>
-->
</li> </li>
</ul> </ul>
</template> </template>
@ -132,6 +97,7 @@ export default defineComponent({
countTotal: 0, countTotal: 0,
countArticle: 0, countArticle: 0,
countMail: 0, countMail: 0,
realtime: settings.realtime
}; };
}, },
mounted() { mounted() {
@ -151,7 +117,7 @@ export default defineComponent({
}, },
support() { support() {
viewDialog({ viewDialog({
title: '技术支持', title: '关于',
dialogClass: 'modal-md', dialogClass: 'modal-md',
url: app.url('index/index/support'), url: app.url('index/index/support'),
close: function() { close: function() {

View File

@ -4,8 +4,8 @@
<meta charset="utf-8"> <meta charset="utf-8">
<title>{{$setting['title']}}</title> <title>{{$setting['title']}}</title>
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"> <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<link href="{{$asset_url}}/dist/app.min.css" rel="stylesheet" type="text/css"> <link href="{{mix('/assets/dist/app.min.css')}}" rel="stylesheet" type="text/css">
<script src="{{$asset_url}}/vendor/jquery.min.js"></script> <script src="{{$asset_url}}/vendor/jquery.js"></script>
</head> </head>
<style> <style>
li { list-style: none; } li { list-style: none; }

View File

@ -3,7 +3,7 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>信息提示</title> <title>信息提示</title>
<link href="<?php echo URL::to('assets'); ?>/dist/app.min.css" rel="stylesheet"> <link href="<?php echo mix('/assets/dist/app.min.css'); ?>" rel="stylesheet">
<style type="text/css"> <style type="text/css">
.window { .window {
font: 12px 'Lucida Grande', Verdana, sans-serif; font: 12px 'Lucida Grande', Verdana, sans-serif;

View File

@ -5,17 +5,20 @@
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>{{$setting['title']}} - Powered By {{$setting['powered']}}</title> <title>{{$setting['title']}} - Powered By {{$setting['powered']}}</title>
<script type="text/javascript" src="{{$public_url}}/common?v={{$resVersion}}"></script>
<link href="{{$asset_url}}/vendor/ag-grid/ag-grid.min.css" rel="stylesheet" type="text/css" /> <link href="{{$asset_url}}/vendor/ag-grid/ag-grid.min.css" rel="stylesheet" type="text/css" />
<link href="{{$asset_url}}/dist/app.min.css?v={{$resVersion}}" rel="stylesheet" type="text/css" /> <link href="{{mix('/assets/dist/app.min.css')}}" rel="stylesheet" type="text/css" />
<script src="{{$asset_url}}/dist/app.min.js?v={{$resVersion}}" type="text/javascript"></script>
<script src="{{$asset_url}}/vendor/layer/layer.js" type="text/javascript"></script> <script type="text/javascript" src="{{$public_url}}/common?v={{time()}}"></script>
<script src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script> <script type="text/javascript" src="{{mix('/assets/dist/app.min.js')}}"></script>
<script src="{{$asset_url}}/vendor/ag-grid/ag-grid.min.js"></script> <script type="text/javascript" src="{{mix('/assets/dist/bundle.min.js')}}"></script>
<script src="{{$asset_url}}/dist/bundle.min.js"></script>
<!-- 第三方库 -->
<script type="text/javascript" src="{{$asset_url}}/vendor/layer/layer.js"></script>
<script type="text/javascript" src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script>
<script type="text/javascript" src="{{$asset_url}}/vendor/ag-grid/ag-grid.min.js"></script>
<script> <script>
agGrid.LicenseManager.setLicenseKey('{{env("AGGRID_LICENSE")}}'); {{env("AGGRID_LICENSE")}}
{{env('DEMO_DATA')}}
</script> </script>
</head> </head>
<body class="frame-{{auth()->user()->theme ?: 'lilac'}}"> <body class="frame-{{auth()->user()->theme ?: 'lilac'}}">

View File

@ -5,18 +5,10 @@
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>{{$setting['title']}}</title> <title>{{$setting['title']}}</title>
<script type="text/javascript" src="{{$public_url}}/common"></script> <link type="text/css" href="{{mix('/assets/dist/app.min.css')}}" rel="stylesheet" />
<link href="{{$asset_url}}/css/app.min.css" rel="stylesheet" type="text/css" />
<link href="{{$asset_url}}/css/reset.css" type="text/css" rel="stylesheet" />
<link href="{{$asset_url}}/css/gdoo.css" type="text/css" rel="stylesheet" />
<script src="{{$asset_url}}/js/app.min.js" type="text/javascript"></script>
<script src="{{$asset_url}}/js/dialog.js" type="text/javascript"></script>
<script src="{{$asset_url}}/js/listview.js" type="text/javascript"></script>
<script src="{{$asset_url}}/js/support.js" type="text/javascript"></script>
<script src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script>
<script type="text/javascript" src="{{$public_url}}/common?v={{time()}}"></script>
<script type="text/javascript" src="{{mix('/assets/dist/app.min.js')}}"></script>
<script type="text/javascript" src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script>
</head> </head>
<body> <body>

View File

@ -3,9 +3,9 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{$setting['title']}}</title> <title>{{$setting['title']}}</title>
<link rel="stylesheet" href="{{$asset_url}}/dist/app.min.css" type="text/css" /> <link rel="stylesheet" href="{{mix('/assets/dist/app.min.css')}}" type="text/css" />
<script src="{{$public_url}}/common"></script> <script src="{{$public_url}}/common?v={{time()}}"></script>
<script src="{{$asset_url}}/dist/app.min.js"></script> <script src="{{mix('/assets/dist/app.min.js')}}"></script>
<script src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script> <script src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script>
<style type="text/css"> <style type="text/css">
body { body {
@ -219,33 +219,6 @@ body {
margin: 10mm; margin: 10mm;
size: 210mm 297mm; size: 210mm 297mm;
} }
/*
@page:right {
@top-right { content: "手写单号#21212"; }
@bottom-right {content: "手写单号#21212"; }
}
@page:left {
@top-left { content: "手写单号#21212"; }
@bottom-left { content: "手写单号#21212"; }
}
*/
.header {
position: absolute;
top: 0;
display:table-header-group;
content: "手写单号#21212";
font-size: 10px;
}
footer {
bottom: 0;
position: absolute;
display:table-footer-group;
content: "手写单号#21212";
font-size: 10px;
}
</style> </style>
</head> </head>

View File

@ -3,9 +3,9 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{$setting['title']}}</title> <title>{{$setting['title']}}</title>
<link rel="stylesheet" href="{{$asset_url}}/dist/app.min.css" type="text/css" /> <link type="text/css" rel="stylesheet" href="{{mix('/assets/dist/app.min.css')}}" />
<script src="{{$public_url}}/common"></script> <script src="{{$public_url}}/common?v={{time()}}"></script>
<script src="{{$asset_url}}/dist/app.min.js"></script> <script src="{{mix('/assets/dist/app.min.js')}}"></script>
<script src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script> <script src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script>
<style type="text/css"> <style type="text/css">
body { body {

View File

@ -3,7 +3,7 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{$setting['print_title']}}{{$form['template']['name']}}</title> <title>{{$setting['print_title']}}{{$form['template']['name']}}</title>
<link rel="stylesheet" href="{{$asset_url}}/dist/app.min.css" type="text/css" /> <link type="text/css" rel="stylesheet" href="{{mix('/assets/dist/app.min.css')}}" />
<style type="text/css"> <style type="text/css">
.table { .table {
border: 1px solid #000; border: 1px solid #000;

View File

@ -1,283 +1 @@
<!DOCTYPE html> @include('layouts/print')
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{$setting['title']}}</title>
<link rel="stylesheet" href="{{$asset_url}}/dist/app.min.css" type="text/css" />
<script src="{{$public_url}}/common"></script>
<script src="{{$asset_url}}/dist/app.min.js"></script>
<script src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script>
<style type="text/css">
body {
background: -webkit-linear-gradient(right, #198fb4, #0b6fab);
background: -o-linear-gradient(right, #198fb4, #0b6fab);
background: linear-gradient(to left, #198fb4, #0b6fab);
background-color: #3586b7;
}
.table {
border: 1px solid #58585C;
color: #000;
width: 100%;
margin: 5px 0;
}
.table .left { text-align:left; }
.table .center { text-align:center; }
.table .right { text-align:right; }
.table p { text-align:center; }
.table img { border:0; }
.table td {
border: 1px solid #58585C;
padding: 3px;
color: #000;
vertical-align: middle;
font-weight: normal;
overflow: hidden;
text-overflow: ellipsis;
}
.table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td {
padding: 3px;
}
.table th {
font-weight: normal;
color: #000;
border: 1px solid #58585C;
padding: 3px;
/*
white-space: nowrap;
*/
}
.table>tbody>tr>td,
.table>tbody>tr>th,
.table>tfoot>tr>td,
.table>tfoot>tr>th,
.table>thead>tr>td,
.table>thead>tr>th {
border-top: 1px solid #58585C;
}
.table>thead>tr>th {
border-bottom: 1px solid #58585C;
}
.title {
text-align: center;
font-size: 18px;
font-weight: 400;
color: #333;
padding-bottom: 10px;
/*
border-bottom: 1px solid #333;
*/
}
.main-container {
margin:0 auto;
font:14px '微软雅黑', '黑体', 'Lucida Grande', Verdana, sans-serif;
background: #fff;
position: relative;
}
.main-container h3 {
padding-top:12px;
font-size:15px;
text-align:center;
}
.main-container p {
text-align:left;
padding-top:6px;
}
.panel {
width: 1000px;
margin: 15px auto;
border-radius: 0;
border-color: #eee;
}
.table.no-border,
.table.no-border td,
.table.no-border th {
border: 0;
}
@media screen {
.main {
width: 1000px;
margin: 15px auto;
padding: 50px 0;
background-color: #fff;
border: solid 1px #eee;
-webkit-box-shadow: 0 1px 1px rgba(0,0,0,.05);
box-shadow: 0 1px 1px rgba(0,0,0,.05);
}
.main-container {
width: 880px;
}
}
@media print {
.panel {
display: none;
}
.main {
margin: 0 auto;
border: 0;
}
.main-container {
font:12px 'SimSun', 'Microsoft YaHei';
}
}
.text-muted {
color: #333;
}
.b-t {
border-top: 1px solid #333;
}
.row {
border: 1px solid #333;
border-top: 0;
padding: 5px;
color: #333;
margin-left: 0;
margin-right: 0;
}
.row > div {
padding: 3px 8px;
}
.row:first-child {
border-top: 1px solid #333;
}
.row.no-border {
border: 0;
padding: 0;
}
@media print {
.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
float: left;
}
.col-sm-12 {
width: 100%;
}
.col-sm-11 {
width: 91.66666667%;
}
.col-sm-10 {
width: 83.33333333%;
}
.col-sm-9 {
width: 75%;
}
.col-sm-8 {
width: 66.66666667%;
}
.col-sm-7 {
width: 58.33333333%;
}
.col-sm-6 {
width: 50%;
}
.col-sm-5 {
width: 41.66666667%;
}
.col-sm-4 {
width: 33.33333333%;
}
.col-sm-3 {
width: 25%;
}
.col-sm-2 {
width: 16.66666667%;
}
.col-sm-1 {
width: 8.33333333%;
}
}
.i-checks>i {
border: 1px solid #333;
}
.i-checks input:checked+i {
border-color: #333;
}
.i-checks input:checked+i:before {
background-color: #333;
}
@page {
margin: 10mm;
size: 210mm 297mm;
}
#lodop-container {
width: 1000px;
margin: auto;
display: none;
}
</style>
<script>
function print280() {
alert('没有此尺寸');
}
function print140() {
alert('没有此尺寸');
}
function print93() {
alert('没有此尺寸');
}
</script>
</head>
<body>
<div class="panel panel-default">
<div class="panel-body">
<div class="pull-right">
@if($form['print_type'] == 'stiReport')
<a class="btn btn-default" href="javascript:window.print();"><i class="icon icon-print"></i> HTML打印</a>
<a class="btn btn-default" href="javascript:print();"><i class="icon icon-print"></i> 打印</a>
<a target="_blank" class="btn btn-default" href="{{url('stiReport/stiReport/designer',['bill_code' => $form['bill_code'], 'template_id' => $form['template']['id'],'id' => $form['row']['id']])}}">模板设计</a>
@else
<a class="btn btn-default" href="javascript:window.print();"><i class="icon icon-print"></i> 打印</a>
@endif
<a class="btn btn-default" href="javascript:window.close();"><i class="icon icon-remove"></i> 关闭</a>
</div>
<h4><i class="icon icon-note"></i> 打印预览</h4>
</div>
</div>
<div id="lodop-container">
<div class="alert alert-warning alert-dismissable m-b-sm">
<button type="button" class="close" data-dismiss="alert"
aria-hidden="true">
&times;
</button>
<div id="lodop_msg"></div>
</div>
</div>
<div class="main">
<div class="main-container">
<div class="title">{{$setting['print_title']}}{{$form['template']['name']}}</div>
<div>
{{$content}}
</div>
</div>
</div>
</body>
</html>

View File

@ -3,9 +3,9 @@
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{{$setting['title']}}</title> <title>{{$setting['title']}}</title>
<link rel="stylesheet" href="{{$asset_url}}/dist/app.min.css" type="text/css" /> <link rel="stylesheet" href="{{mix('/assets/dist/app.min.css')}}" type="text/css" />
<script src="{{$public_url}}/common"></script> <script src="{{$public_url}}/common?v={{time()}}"></script>
<script src="{{$asset_url}}/dist/app.min.js"></script> <script src="{{mix('/assets/dist/app.min.js')}}"></script>
<script src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script> <script src="{{$asset_url}}/vendor/datepicker/datepicker.js"></script>
<style type="text/css"> <style type="text/css">
body { body {
@ -18,7 +18,7 @@ body {
font-size: 16px; font-size: 16px;
font-weight: 400; font-weight: 400;
color: #333; color: #333;
padding-top: 5px; padding-top: 2px;
} }
.title .icon { .title .icon {
top: 3px; top: 3px;
@ -65,48 +65,52 @@ body {
<body onload="onLoad();"> <body onload="onLoad();">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-body"> <div class="panel-body">
<div class="pull-right"> <div class="pull-right">
<a class="btn btn-default" href="javascript:window.print();"><i class="fa fa-print"></i> HTML打印</a> <a class="btn btn-sm btn-default" href="javascript:window.print();"><i class="fa fa-print"></i> HTML打印</a>
<a class="btn btn-default" href="javascript:startPrint();"><i class="fa fa-print"></i> 打印</a> <a class="btn btn-sm btn-default" href="javascript:startPrint();"><i class="fa fa-print"></i> 打印</a>
@if(auth()->user()->role_id == 1) @if(auth()->user()->role_id == 1)
<a target="_blank" class="btn btn-default" href="{{url('stiReport/stiReport/designer',['template_id' => $template['id']])}}"><i class="fa fa-pencil-square"></i> 设计 </a> <a target="_blank" class="btn btn-sm btn-default" href="{{url('stiReport/stiReport/designer',['template_id' => $template['id']])}}"><i class="fa fa-pencil-square"></i> 设计 </a>
<a class="btn btn-default" download="{{$template['code']}}.mrt" href="{{$public_url}}/reports/{{$template['code']}}.mrt"><i class="fa fa-file-code-o"></i> 下载模板 </a> <a class="btn btn-sm btn-default" download="{{$template['code']}}.mrt" href="{{$public_url}}/reports/{{$template['code']}}.mrt"><i class="fa fa-file-code-o"></i> 下载模板 </a>
@endif @endif
<a class="btn btn-default" href="javascript:window.close();"><i class="fa fa-remove"></i> 关闭</a> <a class="btn btn-sm btn-default" download="打印服务程序.zip" href="{{$upload_url}}/GdooPrinter.zip"><i class="fa fa-puzzle-piece"></i> 下载服务 </a>
<a class="btn btn-sm btn-default" href="javascript:window.close();"><i class="fa fa-remove"></i> 关闭</a>
</div> </div>
<div class="title"><i class="icon icon-note"></i> 打印预览 <span id="print_msg"></span></div> <div class="title"><i class="icon icon-note"></i> 打印预览 <span id="print_msg"></span></div>
</div> </div>
</div> </div>
<div id="lodop-container"> <div id="lodop-container">
<div class="alert alert-warning alert-dismissable m-b-sm"> <div class="alert alert-warning alert-dismissable m-b-sm">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> <button type="button" class="close" data-dismiss="alert"
aria-hidden="true">
&times;
</button>
<div id="lodop_msg"></div> <div id="lodop_msg"></div>
</div> </div>
</div> </div>
<div class="main"> <div class="main">
<div id="report_data" class="viewer"></div> <div id="report_data" class="viewer"></div>
</div> </div>
<script src="{{$asset_url}}/js/gdoo.websocket.js" type="text/javascript"></script> <script src="{{$asset_url}}/js/gdoo.websocket.js" type="text/javascript"></script>
<script src="{{$asset_url}}/vendor/stimulsoft/scripts/stimulsoft.reports.js" type="text/javascript"></script> <script src="{{$asset_url}}/vendor/stimulsoft/scripts/stimulsoft.reports.js" type="text/javascript"></script>
<?php <?php
$report_name = $template['code']; $report_name = $template['code'];
$report_path = public_path()."/reports/".$report_name.".mrt"; $report_path = public_path()."/reports/".$report_name.".mrt";
$report_template = ''; $report_template = '';
if (is_file($report_path)) { if (is_file($report_path)) {
$report_template = base64_encode(file_get_contents($report_path)); $report_template = base64_encode(file_get_contents($report_path));
} }
?> ?>
<script type="text/javascript"> <script type="text/javascript">
var reportName = "{{$report_name}}"; var reportName = "{{$report_name}}";
var reportTemplate = "{{$report_template}}"; var reportTemplate = "{{$report_template}}";
var printData = {{json_encode($print_data, JSON_UNESCAPED_UNICODE)}}; var printData = {{json_encode($print_data, JSON_UNESCAPED_UNICODE)}};
printData.setting = [{ printData.setting = [{
action: "preview", action: "preview",
topmargin: 0, topmargin: 0,
leftmargin: 0, leftmargin: 0,
@ -114,11 +118,11 @@ printData.setting = [{
taskid: '{{$report_name}}', taskid: '{{$report_name}}',
template: reportTemplate, template: reportTemplate,
type: "base64" type: "base64"
}]; }];
// 打印数据保存到本地 // 打印数据保存到本地
localStorage.setItem(reportName, JSON.stringify(printData)); localStorage.setItem(reportName, JSON.stringify(printData));
function onLoad() { function onLoad() {
var report = new Stimulsoft.Report.StiReport(); var report = new Stimulsoft.Report.StiReport();
// 加载模板文件 // 加载模板文件
if (reportTemplate) { if (reportTemplate) {
@ -137,12 +141,12 @@ function onLoad() {
var htmlData = report.exportDocument(Stimulsoft.Report.StiExportFormat.Html); var htmlData = report.exportDocument(Stimulsoft.Report.StiExportFormat.Html);
document.getElementById('report_data').innerHTML = htmlData; document.getElementById('report_data').innerHTML = htmlData;
}); });
} }
var GdooPrint = null; var GdooPrinter = null;
// 打印机列表 // 打印机列表
var prints = []; var prints = [];
try { try {
var options = { var options = {
url: 'ws://127.0.0.1:6690', url: 'ws://127.0.0.1:6690',
pingTimeout: 15000, pingTimeout: 15000,
@ -178,28 +182,28 @@ try {
GdooPrint.onsend = function (e) { GdooPrint.onsend = function (e) {
if(e == 'ping') return false; if(e == 'ping') return false;
} }
} catch (e) { } catch (e) {
labelError(e.message); labelError(e.message);
} }
function startPrint() { function startPrint() {
try { try {
GdooPrint.send(JSON.stringify(printData)); GdooPrint.send(JSON.stringify(printData));
} catch (e) { } catch (e) {
$.toastr('error', e.message); $.toastr('error', e.message);
} }
} }
function labelInfo(text) { function labelInfo(text) {
$('#print_msg').html('<span class="label label-info">' + text + '</span>'); $('#print_msg').html('<span class="label label-info">' + text + '</span>');
} }
function labelError(text) { function labelError(text) {
$('#print_msg').html('<span class="label label-danger">' + text + '</span>'); $('#print_msg').html('<span class="label label-danger">' + text + '</span>');
} }
function labelSuccess(text) { function labelSuccess(text) {
$('#print_msg').html('<span class="label label-success">' + text + '</span>'); $('#print_msg').html('<span class="label label-success">' + text + '</span>');
} }
</script>
</script>
</body> </body>
</html> </html>

View File

@ -7,14 +7,14 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>{{$setting['title']}}</title> <title>{{$setting['title']}}</title>
<link href="{{$asset_url}}/css/wechat/console.css" rel="stylesheet" type="text/css" />
<link href="{{$asset_url}}/dist/app.min.css" rel="stylesheet" type="text/css" />
<link href="{{$asset_url}}/vendor/layui/css/layui.css" rel="stylesheet" type="text/css" /> <link href="{{$asset_url}}/vendor/layui/css/layui.css" rel="stylesheet" type="text/css" />
<script src="{{$public_url}}/index/api/common" type="text/javascript"></script> <link href="{{$asset_url}}/css/wechat/console.css" rel="stylesheet" type="text/css" />
<script src="{{$asset_url}}/vendor/layui/layui.js" type="text/javascript"></script>
<script src="{{$asset_url}}/dist/app.min.js" type="text/javascript"></script>
<link href="{{$asset_url}}/css/wechat/icon/icon.css" rel="stylesheet" type="text/css" /> <link href="{{$asset_url}}/css/wechat/icon/icon.css" rel="stylesheet" type="text/css" />
<link href="{{mix('/assets/dist/app.min.css')}}" rel="stylesheet" type="text/css" />
<script src="{{$asset_url}}/vendor/layui/layui.js" type="text/javascript"></script>
<script src="{{$public_url}}/index/api/common?v={{time()}}" type="text/javascript"></script>
<script src="{{mix('/assets/dist/app.min.js')}}" type="text/javascript"></script>
</head> </head>
<body> <body>
<div class="content-body"> <div class="content-body">

Some files were not shown because too many files have changed in this diff Show More