初始版本

This commit is contained in:
cloud 2020-03-02 21:21:02 +08:00
parent bc4121cadf
commit 76a0de12dc
64 changed files with 16219 additions and 1 deletions

16
.appignore Normal file
View File

@ -0,0 +1,16 @@
{
"notes":[
"skipfile 需要跳过的文件,不分目录",
"skipdir 需要跳过的文件,需要路径正确",
"skipdl 指定的目录仅下载dllist内所有,这里设置的目录 只能是相对应用版本的根目录也就是一级目录",
"coredir 需要检出的核心目录,按照目录来跳过",
"endirfile 需要加密的文件",
"sourcefile 源文件需要删除,不提供给客户端下载的"
],
"skipfile": [],
"skipdir": [],
"skipdl": [],
"coredir": [],
"endirfile": [],
"sourcefile": []
}

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# ---> NetBeans
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/
/config/

View File

@ -1,3 +1,3 @@
# dzadsod
道闸广告位管理
场所门口道闸广告位运营管理

211
admin/ajax.class.php Normal file
View File

@ -0,0 +1,211 @@
<?php
defined('IN_MET') or exit('No permission');
load::own_class('appadmin');
/*
* 配置
* 包含其他功能初始化
*/
class ajax extends appadmin {
public function __construct() {
global $_M,$_YW;
parent::__construct();
}
//own.JS lang语言数组调用
public function doajaxcl() {
global $_M,$_YW;
parent::loadp('cmp_a,cmp_ac');
unset($_YW['aop']);
unset($_YW['c']['ac_cache']);
echo parent::jsoncallback($_YW);
}
//城市选择
public function docitys() {
global $_M,$_YW;
$this->cloud->citydata();
}
//查询广告位编号是否重复
public function doenumber() {
global $_M,$_YW;
$array = $this->tsql->table('elevator')->where(['e_number' => $_M['form']['e_number'] ])->one();
$result['valid'] = $array == false?true:($array['id'] == $_M['form']['id']?true:false);
//再判断一个排期内是否存在此编号
echo parent::jsoncallback($result);
}
//查询广告位编号是否重复
public function dohnumber() {
global $_M,$_YW;
$array = $this->tsql->table('contract')->where(['h_number' => $_M['form']['h_number'] ])->one();
$result['valid'] = $array == false?true:($array['id'] == $_M['form']['id']?true:false);
echo parent::jsoncallback($result);
}
//查询投放标题
public function dolatitle() {
global $_M,$_YW;
$ids = stringto_array($_M['form']['ids'],',');
if(count($ids)){
$url = $_M['url']['own_name'].'c=table_on&a=doschedule&s_lid=';
$strid = arrayto_string($ids,',');
$launch = $this->tsql->table('launch')->where(" id IN({$strid}) ")->all('id');
list($eid,$nid) = $ids;
$eslid = $eid?'<a href="'.$url.$eid.'" title="查看排期">'.$launch[$eid]['l_title'].'</a>':'';
$ntslid = $nid?'<a href="'.$url.$nid.'" title="查看排期">'.$launch[$nid]['l_title'].'</a>':'';
}
echo parent::jsoncallback(['eslid' => $eslid,'ntslid' => $ntslid ]);
}
//广告位排期入库【重要】
public function doapplan() {
global $_M,$_YW;
$form = $_M['form'];
$ap_enumber = $_M['form']['ap_enumber'];
$slid = $form['slid'];
//检查投放订单是否存在
$retarray = ['code' => false,'text' => '投放计划不存在!'];
$launch = $this->tsql->table('launch')
->where(['id' => $slid])
->one();
if($launch == false) {
echo parent::jsoncallback($retarray);
exit;
}
//检查广告位排期时间是否可用,是否合法
$l_starttime = strtotime($form['l_starttime']);
$l_endtime = strtotime($form['l_endtime']);
$daystr = strtotime(date('Y-m-d',time()));
if($l_starttime > $l_endtime && (empty($l_starttime) || empty($l_endtime)) ){
$retarray['text'] = "{$ap_enumber}】投放结束时间({$form['l_starttime']})不能小于开始时间({$form['l_endtime']})";
echo parent::jsoncallback($retarray);
exit;
}
//根据广告位编号查询对应广告位信息 e_enable
$elevator = $this->tsql->table('elevator')
->where(['e_number' => $ap_enumber])
->one();
$elstr = $error = false;
// 判断广告位是否存在
if($elevator != false){
//进行排期处理
$field = [
's_lid' => $slid,
's_enumber' => $ap_enumber,
's_hnumber' => $form['l_hnumber'],
's_starttime' => $form['l_starttime'],
's_endtime' => $form['l_endtime'],
];
// 不可通过唯一索引新增和更新数据,因为他会先触发新增的触发器
// 先查询是否存在相应的广告位排期,存在则修改,相反为新增
$enum = $this->tsql->table('schedule')
->qfield('id')
->where(['s_lid' => $slid, 's_enumber' => $ap_enumber ])
->one();
$query1 = $this->tsql->query();
if($enum == false){
//判断广告位是否停用
if($elevator['e_enable']){
//新增
$field['id'] = 'UUID()';
$this->tsql->table('schedule')
->special('UUID()')
->field($field)
->add();
$query = $this->tsql->query();
}else{
//表示广告位已停用
$elstr = '已禁用';
}
}else{
//修改
$this->tsql->table('schedule')
->field($field)
->where(['id' => $enum['id']])
->upd();
$query = $this->tsql->query();
}
//获取sql执行结果查看是否存在错误
$elstr = $this->tsql->error();
//广告位地址
$e_address = parent::e_address($elevator);
}else{
// 删除此广告位之前保存的排期记录
$this->tsql->table('schedule')
->where(['s_enumber' => $ap_enumber ])
->del();
// 记录不存在的广告位,保留到最后删除掉相关的选择广告位
$session = load::sys_class('session','new');
$senumber = $session->get('schedule_eid'.$slid);
$senumber[] = $ap_enumber;
$session->set('schedule_eid'.$slid,$senumber);
$e_address = "{$ap_enumber}";
$elstr = '广告位不存在或者已删除,';
}
$array = $error || $elstr
?['code' => false,'text' => "{$e_address}{$elstr}排期失败。",'eid' =>$ap_enumber,$query,$enum,$field,$query1,$senumber]
:['code' => true,'text' => "{$e_address},排期成功。",'eid' =>$ap_enumber,$senumber];
echo parent::jsoncallback($array);
exit;
}
//选中排期的成功广告位保存
public function dolenumber() {
global $_M,$_YW;
$slid = $_M['form']['slid'];
// 删除不存在的已选择广告位
$session = load::sys_class('session','new');
$schedule_eid = $session->get('schedule_eid'.$slid)?:[];
$session->del('schedule_eid');
$session->del('schedule_eid'.$slid);
$launch = $this->tsql->table('launch')
->where(['id' => $slid])
->one();
$l_selectenum = arrayto_string(array_unique(array_diff(stringto_array($launch['l_selectenum'],','),$schedule_eid)),',');
// 排期保存
//查询出所有的
$schedule = $this->tsql->table('schedule')
->where(['s_lid' => $slid])
->all();
$idarr = array_column($schedule, 's_enumber');
$idstr = arrayto_string($idarr,',');
$this->tsql->table('launch')
->field(['l_selectenum' => $l_selectenum,'l_enumber' => $idstr ])
->where(['id' => $slid])
->upd();
$error = $this->tsql->error();
$num = count($idarr);
$array = $error
?['code' => false,'text' => "选中广告位保存失败,导致排期失败!",'idstr' => $idstr,$schedule_eid]
:['code' => true,'text' => "选中的({$num})个广告位排期记录保存成功。",'idstr' => $idstr,$schedule_eid];
echo parent::jsoncallback($array);
}
//处理序列表,让他始终大于广告位的总个数
public function dosequence() {
global $_M,$_YW;
$counta = $this->tsql->table('elevator')->count();
$countb = $this->tsql->table('sequence')->count();
$count = $counta + 10 - $countb;
if($count > 0){
for($i = 0; $i < $count; $i++){
$this->tsql->table('sequence')->field(['seq' => null])->add();
}
}
echo parent::jsoncallback([$counta,$countb,$count]);
}
}
?>

196
admin/backups.class.php Normal file
View File

@ -0,0 +1,196 @@
<?php
defined('IN_MET') or exit ('No permission');
load::own_class('appadmin');
load::own_class('../traits/tdata');
load::own_class('../traits/tlist');
load::own_class('../traits/tfield');
//表格
class backups extends appadmin {
//备份字段
private $bsign = true;
//列表
private $list = [];
//当前执行表名
private $sqlk;
//form数组
private $form = [];
//info_on 快速URL
private $own_name_info;
private $bacname = ''; //默认开头
private $csvname = ''; //文件名
private $title = []; //表格标头
private $keys = []; //表格标头对应的键值
private $bactable = ''; //数据库名
private $bacconds = ''; //查询项以及排序
private $bacfield = ''; //查询字段
private $bacpages = 500; //每页查询条数
public function __construct() {
global $_M,$_YW;
parent::__construct();
$this->form = $_M['form'];
if($this->form['tname']){
$this->tname = $this->form['tname'];
$this->sqlk = $_YW['k'][$this->tname];
}
$this->own_name_info = $_M['url']['own_name'].'c=info_on&a=do';
}
use tdata;
use tfield;
use tlist;
//表格数据
public function doindex() {
global $_M;
self::csvtitle();
$this->bacname = '广告位';
self::csvname();
//输出头部
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=" . $this->csvname);
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
//刷新buffer
ob_flush();
flush();
$file = fopen('php://output', 'a');
//先将标题写入文件
$title = self::arrzbm($this->title, 'utf-8', 'GBK');
fputcsv($file, $title);
ob_flush();
flush();
# 初始化mysql需要的参数
self::bactable();
# 获取数据总条数
$total = self::tabletotal();
$pages = ceil($total/$this->bacpages);
for ($i = 0; $i < $pages; $i++){
$data = self::tabledata($i);
$y = 0;
$listnum = 1000;
foreach ($data as $val) {
//返回数据
$y++;
# 每隔$listnum行刷新一下输出buffer,大数据量时处理
# 刷新一下输出buffer防止由于数据过多造成问题
if ($listnum == $y) {
ob_flush();
# 刷新buffer
flush();
$y = 0;
}
$arr = self::arrzbm($val,'utf-8' , 'GBK');
fputcsv($file, $arr);
}
}
fclose($file);
}
//判断语句组合
protected function bactable() {
global $_M;
$this->bactable = self::td_sqlk();
$this->bacfield = self::td_field();
$where = self::td_where();
parent::where_id($where);
if($where){
$where = trim($where);
if (strtolower(substr($where, 0, 5)) != 'where' && $where) $this->bacconds = " WHERE {$where} ";
}
//排序
if($this->bacconds){
$order = self::td_order();
$this->bacconds .= " ORDER BY {$order} ";
}
return $this;
}
//计算总数
protected function tabletotal() {
global $_M;
$countsql = " SELECT COUNT(*) FROM {$this->bactable} {$this->bacconds} ";
if($this->multi_table) $countsql = " SELECT count(*) FROM (SELECT {$this->bacfield} FROM {$this->bactable} {$this->bacconds}) num ";
$result = DB::query($countsql);
$fetch_row = DB::fetch_row($result);
return $fetch_row[0];
}
//获取获取
protected function tabledata($pages) {
global $_M;
$cursize = $pages* $this->bacpages;
//SQL查询
$result = DB::query("SELECT {$this->bacfield} FROM {$this->bactable} {$this->bacconds} LIMIT {$cursize},{$this->bacpages}");
while($val = DB::fetch_array($result)){
$data[] = $val;
}
//处理数组结果
foreach ($data as $val) {
$lists = self::{$this->tname}($val);
$baclist[] = array_intersect_key(self::striptags($lists),$this->title);
}
return $baclist;
}
/* * *******************************************************************************
*
* 导入导出公用函数
*
* ****************************************************************************** */
# 导入导出数组(保持和导入格式一样)
protected function csvtitle() {
global $_M, $_YW;
$this->title = self::{'tf_'.$this->tname}();
$this->keys = array_keys($this->title);
return $this;
}
//生成文件名
public function csvname() {
global $_M, $_YW;
$date = date('Ymd', time());
$filename = iconv("utf-8", "GBK", $this->bacname . $_M['lang'] . $date);
$this->csvname = $filename . '.csv';
return $this;
}
//对数组的值进行转码并返回(一维数组)
public function arrzbm($arr, $u, $g) {
global $_M, $_YW;
foreach ($arr as $k => $v) {
$newarr[$k] = iconv($u, $g, $v);
}
return $newarr;
}
//删除html元素
public function striptags($array = []) {
global $_M, $_YW;
$ret = [];
foreach ($array as $key => $str) {
$ret[$key] = strip_tags($str);
}
return $ret;
}
}
?>

68
admin/config.class.php Normal file
View File

@ -0,0 +1,68 @@
<?php
defined('IN_MET') or exit('No permission');
load::own_class('appadmin');
/*
* 配置
* 包含其他功能初始化
*/
class config extends appadmin {
public function __construct() {
global $_M,$_YW;
parent::__construct();
$this->tname = $_M['form']['tname'];
}
public function __destruct() {
global $_M,$_YW;
if($this->destruct){
if(empty($this->appshow)) $this->appshow = 'app/'.$this->tname;
require $this->show($this->appshow,$this->input);
}
}
//页初始化
public function doindex(){
global $_M,$_YW;
parent::point('config','doconfig','config');
parent::appurl('index');
parent::appnav(['config__doindex','基础配置']);
$this->input = $this->input + $_YW;
}
//API配置信息保存
public function doconfig(){
global $_M,$_YW;
$form = $_M['form'];
$form['openid'] = arrayto_string($form['openids'],',');
self::configsql($form);
$this->destruct = false;
turnover($_M['url']['own_form'] . 'a=do'.$this->tname, '操作成功');
}
//配置信息保存
private function configsql($form = [],$lang = '') {
global $_M;
if(empty($lang)) $lang = $_M['lang'];
//程序运行必备
$para_a = ['tem_ida','tem_idb','tem_idc','openid'];
$para_b = [];
$para = array_merge($para_a,$para_b);
$arrs = array_intersect_key($form, array_combine($para,$para)); //对比数组
foreach ($arrs as $k => $v) {
$array[] = [$k,$_M['form']['n'],$v,$lang];
}
$this->tsql->table('cloud_config',false)
->qfield('name,m_name,value,lang')
->unique('value=VALUES(value)')
->adup($array);
}
}
?>

38
admin/dzadsod.class.php Normal file
View File

@ -0,0 +1,38 @@
<?php
defined('IN_MET') or exit('No permission');
load::own_class('appadmin');
//接口初始化
class dzadsod extends appadmin {
public function __construct() {
global $_M,$_YW;
parent::__construct();
parent::appnav();
parent::point('dzadsod','dodzadsod');
}
public function __destruct() {
global $_M,$_YW;
if($this->destruct){
if(empty($this->appshow)) $this->appshow = 'app/'.$this->tname;
require $this->show($this->appshow,$this->input);
}
}
/**
* 综合设置
*/
public function dodzadsod() {
global $_M;
//统计总数
$this->input['num'] = $this->cloud->summary();
//到期数据
parent::point('table_off','doindex','table');
parent::appurl('noticeday');//endcontract
$this->input['table'] = load::own_class('table_theme','new')->start($this->tname)->send_all(1);
$this->appshow = 'app/dzadsod';
}
}
?>

1555
admin/index.class.php Normal file

File diff suppressed because it is too large Load Diff

354
admin/info_off.class.php Normal file
View File

@ -0,0 +1,354 @@
<?php
defined('IN_MET') or exit ('No permission');
load::own_class('appadmin');
class info_off extends appadmin {
private $form;
// 文字提示
private $tips = '';
//跳转URL
private $returl = '';
//当前时间
private $timedate;
public function __construct()
{
global $_M,$_YW;
parent::__construct();
$this->form = $_M['form'];
$this->tname = $_M['form']['tname'];
$this->timedate = date('Y-m-d H:i:s', time());
}
public function __destruct()
{
global $_M,$_YW;
if($this->destruct){
turnover(empty($this->returl)?$_M['url']['own_name'] . 'c=table_on&a=do'.$this->tname:$this->returl, $this->tips);
}
}
public function doindex() {
global $_M,$_YW;
switch ($this->tname) {
case 'village':
self::village();
case 'elevator':
$e_bno = stringto_array($this->form['e_bno'],'#@met@#');
$e_uno = stringto_array($this->form['e_uno'],'#@met@#');
$e_eno = stringto_array($this->form['e_eno'],'#@met@#');
$e_aps = stringto_array($this->form['e_aps'],'#@met@#');
foreach ($e_bno as $bno) {
foreach ($e_uno as $uno) {
foreach ($e_eno as $eno) {
foreach ($e_aps as $aps) {
self::elevator($bno,$uno,$eno,$aps);
}
}
}
}
break;
default:
self::{$this->tname}();
break;
}
}
//小区
private function village() {
global $_M,$_YW;
$field = [
'v_name' => $this->form['v_name'],
'v_type' => $this->form['v_type'],
'v_province' => $this->form['v_province'],
'v_city' => $this->form['v_city'],
'v_district' => $this->form['v_district'],
'v_address' => $this->form['v_address'],
'v_wid' => arrayto_string($this->form['v_wid'],','),
'v_price' => $this->form['v_price'],
'v_psize' => $this->form['v_psize'],
'v_text' => $this->form['v_text']
];
if($this->form['id']){
$field['v_updatetime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->where(['id'=>$this->form['id']])
->upd();
$this->tips = '更新成功';
}else{
$field['v_addtime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->add();
$this->tips = '新增成功';
}
// 检测sql是否有错误
$error = $this->tsql->error();
if($error) $this->tips = '操作失败:'.$error;
}
//企业
private function customer() {
global $_M,$_YW;
$field = [
'c_allname' => $this->form['c_allname'],
'c_name' => $this->form['c_name'],
'c_province' => $this->form['c_province'],
'c_city' => $this->form['c_city'],
'c_district' => $this->form['c_district'],
'c_address' => $this->form['c_address'],
'c_wid' => arrayto_string($this->form['c_wid'],','),
'c_text' => $this->form['c_text']
];
if($this->form['id']){
$field['c_updatetime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->where(['id'=>$this->form['id']])
->upd();
$this->tips = '更新成功';
}else{
$field['c_addtime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->add();
$this->tips = '新增成功';
}
// 检测sql是否有错误
$error = $this->tsql->error();
if($error) $this->tips = '操作失败:'.$error;
}
//企业联系人
private function workers() {
global $_M,$_YW;
$field = [
'w_jid' => $this->form['w_jid'],
'w_name' => $this->form['w_name'],
'w_tel' => $this->form['w_tel'],
'w_text' => $this->form['w_text']
];
if($this->form['id']){
$field['w_updatetime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->where(['id'=>$this->form['id']])
->upd();
$this->tips = '更新成功';
}else{
$field['w_addtime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->add();
$this->tips = '新增成功';
}
// 检测sql是否有错误
$error = $this->tsql->error();
if($error) $this->tips = '操作失败:'.$error;
}
//广告位
private function elevator($e_bno,$e_uno,$e_eno,$e_aps) {
global $_M,$_YW;
$e_number = $this->form['e_number'];
if(!$this->form['id']) parent::e_number($e_number,$e_bno.$e_uno.$e_eno.$e_aps);
$field = [
'e_number' => $e_number,
'e_vid' => $this->form['e_vid'],
'e_bno' => $e_bno,
'e_uno' => $e_uno,
'e_eno' => $e_eno,
'e_aps' => $e_aps,
'e_size' => $this->form['e_size'],
'e_enable' => $this->form['e_enable'],
'e_label' => $this->form['e_label'],
'e_text' => $this->form['e_text']
];
if($this->form['id']){
$this->tsql->table($this->tname)
->field($field)
->where(['id'=>$this->form['id']])
->upd();
$this->tips = '更新成功';
}else{
$this->tsql->table($this->tname)
->field($field)
->add();
$this->tips = '新增成功';
}
// 检测sql是否有错误
$error = $this->tsql->error();
//判断为修改编号则需要清理掉旧的编号
$olde_number = $this->form['olde_number'];
$enumber = $this->form['e_number'];
if(!$error && $this->form['id'] && $olde_number != $enumber ){
$this->tsql->table('schedule')->where(['s_enumber' => $olde_number ])->del();
//清理掉缓存排期表 met_dzadsod_
// olde_number
//替换掉旧的投放表内的编号 met_dzadsod_
// ['l_enumber' => '','l_selectenum']
$launch = $this->tsql->table('launch')->where(" find_in_set( '{$olde_number}', l_enumber ) OR find_in_set( '{$olde_number}', l_selectenum ) ")->all();
foreach ($launch as $val) {
$lenumber = arrayto_string(array_unique(stringto_array($val['l_enumber'],',')),',');
$l_enumber = preg_replace(["/^{$olde_number}$/","/^{$olde_number},/","/,{$olde_number},/","/,{$olde_number}$/"],[$enumber,"{$enumber},",",{$enumber},",",{$enumber}"],$lenumber);
$lselectenum = arrayto_string(array_unique(stringto_array($val['l_selectenum'],',')),',');
$l_selectenum = preg_replace(["/^{$olde_number}$/","/^{$olde_number},/","/,{$olde_number},/","/,{$olde_number}$/"],[$enumber,"{$enumber},",",{$enumber},",",{$enumber}"],$lselectenum);
//修改
$this->tsql->table('launch')->field(['l_enumber' => $l_enumber, 'l_selectenum' => $l_selectenum ])->where(['id' => $val['id'] ])->upd();
}
}
if($error) $this->tips = '操作失败:'.$error;
}
//合同录入
private function contract() {
global $_M,$_YW;
//报错
if(strtotime($this->form['h_starttime']) > strtotime($this->form['h_endtime'])){
$this->destruct = false;
parent::scriptgo("投放结束时间({$this->form['h_starttime']})不能小于开始时间({$this->form['h_endtime']})");
}
$field = [
'h_number' => $this->form['h_number'],
'h_signtime' => $this->form['h_signtime'],
'h_cid' => $this->form['h_cid'],
'h_wid' => arrayto_string($this->form['h_wid'],','),
'h_tprice' => $this->form['h_tprice'],
'h_starttime' => $this->form['h_starttime'],
'h_endtime' => $this->form['h_endtime'],
'h_noticeday' => arrayto_string(array_unique(stringto_array($this->form['h_noticeday'],',')),','), //对数组进行去重处理
'h_text' => $this->form['h_text']
];
if($this->form['id']){
$field['h_updatetime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->where(['id'=>$this->form['id']])
->upd();
$this->tips = '更新成功';
}else{
$field['h_addtime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->add();
$this->tips = '新增成功';
}
// 检测sql是否有错误
$error = $this->tsql->error();
if($error) $this->tips = '操作失败:'.$error;
}
//投放计划保存
private function launch() {
global $_M,$_YW;
$this->destruct = false;
// 每次保存都要计算时间是否合法
if(strtotime($this->form['l_starttime']) > strtotime($this->form['l_endtime'])){
echo parent::jsoncallback([
'slid' => $this->form['slid'],
'code' => false,
'text' => "投放结束时间({$this->form['l_starttime']})不能小于开始时间({$this->form['l_endtime']})"]);
exit;
}
//不让他包含广告位选中字符
//l_enable 状态字符也暂时不采用
$field = [
'l_hnumber' => $this->form['l_hnumber'],
'l_title' => $this->form['l_title'],
'l_schedule' => $this->form['l_schedule'],
'l_starttime' => $this->form['l_starttime'],
'l_endtime' => $this->form['l_endtime'],
'l_selectenum' => $this->form['l_selectenum'],
'l_type' => $this->form['l_type'],
'l_text' => $this->form['l_text']
];
if($this->form['slid']){
$field['l_updatetime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->where(['id' => $this->form['slid']])
->upd();
// $query = $this->tsql->query();
$slid = $this->form['slid'];
}else{
$field['l_addtime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->add();
// $query = $this->tsql->query();
$slid = $this->tsql->id();
}
//查看是否执行错误
$error = $this->tsql->error();
//清理掉非选中的广告位排期,实际执行的是广告位选中后的删除操作,其他地方执行的只有新增和修改
$schedule = $this->tsql->table('schedule')
->where(['s_lid' => $slid])
->all();
$enumber = stringto_array($this->form['l_selectenum'],',');
foreach ($schedule as $val) {
if(!in_array($val['s_enumber'], $enumber)){
$this->tsql->table('schedule')
->where(['id' => $val['id'] ])
->del();
}
}
//返回结果
$array = $error || $slid == 0
?['slid' => $slid,'code' => false,'text' => "投放信息处理失败,广告位没有执行排期!错误提示({$error}",$this->form]
:['slid' => $slid,'code' => true,'text' => '投放信息处理成功。'];
echo parent::jsoncallback($array);
exit;
}
private function keylist() {
global $_M,$_YW;
$field = [
'k_passkey' => md5($this->form['k_passkey']),
'k_basekey' => base64_encode($this->form['k_passkey']),
'k_wid' => $this->form['k_wid'],
'k_state' => $this->form['k_state'],
'k_text' => $this->form['k_text']
];
if($this->form['id']){
$field['k_updatetime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->where(['id'=>$this->form['id']])
->upd();
$this->tips = '更新成功';
}else{
$field['k_addtime'] = $this->timedate;
$this->tsql->table($this->tname)
->field($field)
->add();
$this->tips = '新增成功';
}
// 检测sql是否有错误
$error = $this->tsql->error();
if($error) $this->tips = '操作失败:'.$error;
}
}
?>

259
admin/info_on.class.php Normal file
View File

@ -0,0 +1,259 @@
<?php
defined('IN_MET') or exit ('No permission');
load::own_class('appadmin');
class info_on extends appadmin
{
//设置参数
protected $addparaurl = '';
public function __construct()
{
global $_M,$_YW;
parent::__construct();
parent::point('info_off','doindex');
}
public function __destruct()
{
global $_M,$_YW;
if($this->destruct){
if(empty($this->appshow)) $this->appshow = 'app/'.$this->tname;
require $this->show($this->appshow,$this->input);
}
}
//小区
public function dovillage()
{
global $_M,$_YW;
parent::appnav(['table_on__dovillage','小区资料']);
parent::appurl(parent::tname(),['id'=>$_M['form']['id']]);
if($_M['form']['id']){
$this->input['data'] = $this->tsql->table($this->tname)
->where(['id'=>$_M['form']['id']])
->one();
}else{
//默认值
$this->input['data']['v_province'] = '山东省';
$this->input['data']['v_city'] = '泰安市';
$this->input['data']['v_district'] = '泰山区';
}
//小区分类
$para = $this->tsql->table('para')->where(['p_type' => 6])->all();
parent::para_radio($para,'v_type',$this->input['data']['v_type'],$this->input['para']['v_type_radio'])
->setparahtml(6,$this->input['para']['v_type_radio']);
//城市json
$this->input['url']['city'] = $this->cloud->city_url();
}
//企业
public function docustomer()
{
global $_M,$_YW;
parent::appnav(['table_on__docustomer','企业资料']);
parent::appurl(parent::tname(),['id'=>$_M['form']['id']]);
if($_M['form']['id']){
$this->input['data'] = $this->tsql->table($this->tname)
->where(['id'=>$_M['form']['id']])
->one();
}else{
//默认值
$this->input['data']['c_province'] = '山东省';
$this->input['data']['c_city'] = '泰安市';
$this->input['data']['c_district'] = '泰山区';
}
//城市json
$this->input['url']['city'] = $this->cloud->city_url();
}
//企业
public function doworkers()
{
global $_M,$_YW;
parent::appnav(['table_on__doworkers','企业资料']);
parent::appurl(parent::tname(),['id'=>$_M['form']['id']]);
if($_M['form']['id']){
$this->input['data'] = $this->tsql->table($this->tname)
->where(['id'=>$_M['form']['id']])
->one();
}
//职务选择
$para = $this->tsql->table('para')->where(['p_type' => 1])->all();
parent::para_radio($para,'w_jid',$this->input['data']['w_jid'],$this->input['para']['radio'])
->setparahtml(1,$this->input['para']['radio']);
}
//广告位
public function doelevator()
{
global $_M,$_YW;
parent::appnav(['table_on__doelevator','广告位']);
parent::appurl(parent::tname(),['id'=>$_M['form']['id']]);
if($_M['form']['id']){
$this->input['data'] = $this->tsql->table($this->tname)
->where(['id'=>$_M['form']['id']])
->one();
$this->input['data']['e_number_readonly'] = 'readonly';
// 二次编辑时采用单选
//楼号
$para = $this->tsql->table('para')->where(['p_type' => 3])->all();
parent::para_radio($para,'e_bno',$this->input['data']['e_bno'],$this->input['para']['e_bno_radio'])
->setparahtml(3,$this->input['para']['e_bno_radio']);
//单元号
$para = $this->tsql->table('para')->where(['p_type' => 4])->all();
parent::para_radio($para,'e_uno',$this->input['data']['e_uno'],$this->input['para']['e_uno_radio'])
->setparahtml(4,$this->input['para']['e_uno_radio']);
//电梯号
$para = $this->tsql->table('para')->where(['p_type' => 5])->all();
parent::para_radio($para,'e_eno',$this->input['data']['e_eno'],$this->input['para']['e_eno_radio'])
->setparahtml(5,$this->input['para']['e_eno_radio']);
//广告位置
$para = $this->tsql->table('para')->where(['p_type' => 0])->all();
parent::para_radio($para,'e_aps',$this->input['data']['e_aps'],$this->input['para']['e_aps_radio'])
->setparahtml(0,$this->input['para']['e_aps_radio']);
}else{
//默认值
$this->input['data']['e_vid'] = $_M['form']['e_vid'];
$this->input['data']['e_enable'] = 1;
// 新增编辑时采用多选
//楼号
$para = $this->tsql->table('para')->where(['p_type' => 3])->all();
parent::para_checkbox($para,'e_bno',$this->input['data']['e_bno'],$this->input['para']['e_bno_radio'])
->setparahtml(3,$this->input['para']['e_bno_radio']);
//单元号
$para = $this->tsql->table('para')->where(['p_type' => 4])->all();
parent::para_checkbox($para,'e_uno',$this->input['data']['e_uno'],$this->input['para']['e_uno_radio'])
->setparahtml(4,$this->input['para']['e_uno_radio']);
//电梯号
$para = $this->tsql->table('para')->where(['p_type' => 5])->all();
parent::para_checkbox($para,'e_eno',$this->input['data']['e_eno'],$this->input['para']['e_eno_radio'])
->setparahtml(5,$this->input['para']['e_eno_radio']);
//广告位置
$para = $this->tsql->table('para')->where(['p_type' => 0])->all();
parent::para_checkbox($para,'e_aps',$this->input['data']['e_aps'],$this->input['para']['e_aps_radio'])
->setparahtml(0,$this->input['para']['e_aps_radio']);
}
//小区名称URL
$this->input['remote_url'] = $_M['url']['own_name'].'c=ajax&a=doenumber&id='.$_M['form']['id'];
}
//录入合同
public function docontract()
{
global $_M,$_YW;
parent::appnav(['table_on__docontract','合同详情']);
parent::appurl(parent::tname(),['id'=>$_M['form']['id']]);
if($_M['form']['id']){
$this->input['data'] = $this->tsql->table($this->tname)
->where(['id'=>$_M['form']['id']])
->one();
$this->input['data']['h_number_readonly'] = 'readonly';
}else{
//默认值
$this->input['data']['e_vid'] = $_M['form']['e_vid'];
$this->input['data']['h_noticeday'] = 7;
}
$this->input['remote_url'] = $_M['url']['own_name'].'c=ajax&a=dohnumber&id='.$_M['form']['id'];
}
//广告投放
public function dolaunch()
{
global $_M,$_YW;
$slid = $_M['form']['slid'];
parent::appnav(['table_on__dolaunch','广告投放']);
parent::appurl(parent::tname(),['slid'=>$slid]);
if($slid){
$this->input['data'] = $this->tsql->table($this->tname)
->where(['id'=>$slid])
->one();
$contract = $this->tsql->table('contract')
->where(['h_number' => $this->input['data']['l_hnumber']])
->one();
}else{
//获取合同的值
$contract = $this->tsql->table('contract')
->where(['id' => $_M['form']['cid']])
->one();
//默认值
$this->input['data']['l_hnumber'] = $contract['h_number'];
$this->input['data']['l_starttime'] = $contract['h_starttime'];
$this->input['data']['l_endtime'] = $contract['h_endtime'];
}
//合同订单的时间
$this->input['data']['h_starttime'] = $contract['h_starttime'];
$this->input['data']['h_endtime'] = $contract['h_endtime'];
//获取公司名称
$this->input['data']['h_cid'] = parent::customerlist($contract['h_cid']);
//合同状态
$para = parent::paralist(2);
parent::para_radio($para,'l_schedule',$this->input['data']['l_schedule'],$this->input['para']['l_schedule_radio'])
->setparahtml(2,$this->input['para']['l_schedule_radio']);
//广告分类
$para = parent::paralist(7);
parent::para_radio($para,'l_type',$this->input['data']['l_type'],$this->input['para']['l_type_radio'])
->setparahtml(7,$this->input['para']['l_type_radio']);
//表格数据
// ap_plan
$this->input['table'] = load::own_class('table_theme','new')->start('applan')->send_all();
$this->input['table']['ajaxurl'] = $_M['url']['own_name']."c=table_ajax&a=doindex&tname=applan&slid=".$slid;
}
//新增巡查人员
public function dokeylist()
{
global $_M,$_YW;
parent::appnav(['table_on__dokeylist','巡查人员']);
parent::appurl(parent::tname(),['id'=>$_M['form']['id']]);
if($_M['form']['id']){
$this->input['data'] = $this->tsql->table($this->tname)
->where(['id'=>$_M['form']['id']])
->one();
$this->input['data']['k_passkey'] = base64_decode($this->input['data']['k_basekey']);
}else{
$this->input['data']['k_state'] = 1;
}
}
// 调整广告位投放计划
public function douplaunch()
{
global $_M,$_YW;
parent::appnav(['info_on__douplaunch','调整投放计划']);
// parent::appnav(['info_on__doelevators','调整投放计划']);
parent::appurl(parent::tname(),['e_number'=>$_M['form']['e_number']]);
// 先获取广告位编号,获取对应的位置信息
// 再获取 前 中 后排期
// 过期的只要最后一期,当前排期的,按照当天计算,然后罗列出预排的排期
// 选择目标排期计划
// 先查询是否满足对应条件
// 满足入库前先删除原有计划,再新增到目标计划(要清除排期缓存表,以及投放计划表,防止冲突)
// 不满足条件,则返回对应提示,是否要强制修改,若是强制修改,可给予修改建议,供管理选择
// 广告位编号,采用下拉选择
// 订单,采用下拉选择
// 投放计划采用下拉选择
}
}
?>

106
admin/install.class.php Normal file
View File

@ -0,0 +1,106 @@
<?php
defined('IN_MET') or exit ('No permission');
//2.0
class install
{
private $appno;
private $appver;
private $m_name;
private $m_class;
private $m_action;
private $appname;
private $info;
private $depend;
private $target;
private $display;
private $mlangok;
public function __construct() {
global $_M;
do{
$this->appno = mt_rand(2001,9999); //应用编号
} while (self::sqlone('applist') != false);
$this->appver = '1.0'; //应用版本号
$this->m_name = 'dzadsod';
$this->m_class = 'index';
$this->m_action = 'doindex';
$this->appname = '道闸广告位管理'; //应用名称
$this->info = '场所门口道闸广告位运营管理'; //应用描述
$this->depend = ''; //应用依赖
$this->target = 1; //是否支新窗口打开
$this->display = 1; //是否显示应用图标
$this->mlangok = 1; //是否支持多语言
}
//安装主方法
public function dosql() {
global $_M;
$stall = self::sqlone('applist'," m_name='{$this->m_name}' ");
if(!$stall){
//系统表
self::appsql();
}else{
}
return 'complete';
}
//执行APP相关的表数据插入
private function appsql() {
global $_M;
$time = time();
//注册应用
$field = "
`no`='{$this->appno}',
`ver` = {$this->appver},
`m_name` = '{$this->m_name}',
`m_class`='{$this->m_class}',
`m_action`='{$this->m_action}',
`appname`='{$this->appname}',
`info`='{$this->info}',
`addtime`='{$time}',
`updatetime`='{$time}',
`target`='{$this->target}',
`display`='{$this->display}',
`depend`='{$this->depend}',
`mlangok`='{$this->mlangok}' ";
self::addsql('applist',$field);
/**
* 1、增加新表
* name 配置名称
* id 添加信息自动增加,
* value 配置名称值
* lang 语言[后台]
**/
$field = " `id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL,
`m_name` varchar(100) NOT NULL,
`value` text,
`lang` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name_lang` (`name`,`m_name`,`lang`)";
DB::query("CREATE TABLE `".$_M['config']['tablepre']."cloud_config` ( {$field} ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8");
add_table('cloud_config');
}
//公共查询方法
private function sqlone($tname,$where = '') {
global $_M;
$table = $_M['table'][$tname];
if(!$where){
$where = "no='{$this->appno}'";
}
return DB::get_one("select * from {$table} where {$where}");
}
//公共写入方法
private function addsql($tname,$field = '') {
global $_M;
$table = $_M['table'][$tname];
DB::query("INSERT INTO {$table} SET {$field}");
}
}
?>

289
admin/select.class.php Normal file
View File

@ -0,0 +1,289 @@
<?php
defined('IN_MET') or exit('No permission');
load::own_class('appadmin');
load::own_func('appcmp');
/*
* 配置
* 包含其他功能初始化
*/
class select extends appadmin {
/*
* @$querys string 搜索内容
* @$tname string 指定的查询表
* @$fiend string 作为返回ID的值
* @$source string 查询来源页面,用于区分用哪个页面来查询的好做一些特殊处理
* @$allnone string 是否显示默认值全部,或者当没有搜索结果时将搜索内容当作值返回
* @$condition string 页面查询限制条件,采用$$$作为多条件分割,|||作为字段名和值的分割
* @$default string 默认值
* @$division string 默认值分隔符
*
* @$where string sql判断语句
*/
//搜索内容
private $querys = '';
//指定字段为值
private $fiend;
//来源页面标记
private $source;
//是否显示默认值全部
private $allnone;
//判断条件
private $condition;
//默认值
private $default;
//默认值分隔符
private $division;
//sql判断条件
private $where = '';
//返回的数组
private $data = [];
public function __construct() {
global $_M,$_YW;
parent::__construct();
//指定表
$this->tname = $_M['form']['tname'];
//搜索内容
$this->querys = $_M['form']['querys'];
//以指定字段为值
$this->fiend = $_M['form']['fiend']?:'id';
//来源
$this->source = $_M['form']['source'];
//是否显示全部
$this->allnone = $_M['form']['allnone'];
//判断条件
$this->condition = $_M['form']['condition'];
//默认值
$this->default = $_M['form']['default'];
//默认值分隔符
$this->division = $_M['form']['division'];
}
# select2 选项字段处理
private function select_fiend($val) {
global $_M,$_YW;
$strarr = stringto_array($this->fiend,'|');
foreach ($strarr as $value) {
$arrstr[] = $val[$value];
}
return arrayto_string($arrstr,'|');
}
# allnone 默认选项全部处理
private function allnone() {
global $_M,$_YW;
// 若不需要显示‘全部’值,则直接返回空
// 0 为不显示‘全部’,同时也在未搜索到结果的情况下 不 设置为可选值
// 1 为显示 显示‘全部’,同时也在未搜索结果的情况下 设置可选值
// 2 只显示‘全部’
// 3 只将未搜索到结果的情况下设置为可选值
if(empty($this->allnone) || $this->allnone == '3') return false;
//然后可根据来源标记进行处理
switch ($this->source) {
// case 'githooks':
// $initial[] = ['id' => 'newver','text'=>'自动部署至最新版本'];
// break;
default:
$initial[] = [ 'id' => '','text' => '全部' ];
break;
}
$this->data[] = ["text" => '',"children" => $initial ];
}
# 当未搜索到值是否将搜索结果设置为可选值
private function children() {
global $_M,$_YW;
// 判断是否要将搜索内容设置为可选值
if(empty($this->allnone) || $this->allnone == '2' || strlen($this->querys) == 0) return false;
// 要注意id的是否为可写入数据库 误区,若有些字段为数字 则会导致无法录入成功
// 后期可增加一个判断方式来处理这个误区
$this->data[] = [
"text" => '',
"children" => [
['id'=> $this->querys,'text' => $this->querys]
]
];
}
# querys 处理
private function querys() {
global $_M,$_YW;
if(strlen($this->querys) == 0) return false;
switch ($this->tname) {
case 'village':
$this->where = " v_name LIKE '%{$this->querys}%' ";
break;
case 'customer':
$this->where = " c_allname LIKE '%{$this->querys}%' ";
break;
case 'workers':
$this->where = " w_name LIKE '%{$this->querys}%' OR w_tel LIKE '%{$this->querys}%' ";
break;
case 'contract':
$this->where = " h_number LIKE '%{$this->querys}%' ";
break;
case 'launch':
$this->where = " l_title LIKE '%{$this->querys}%' ";
break;
case 'weuser':
$nickname = urlencode($this->querys);
$this->where = " nickname LIKE '%{$nickname}%' ";
break;
case 'para':
$this->where = " p_name LIKE '%{$this->querys}%' OR p_value LIKE '%{$this->querys}%' ";
break;
default:
break;
}
}
# condition 处理
private function condition() {
global $_M,$_YW;
if(empty($this->condition)) return false;
// 进行处理
$condition = stringto_array($this->condition,'|||','$$$');
foreach ($condition as $value) {
list($key,$val) = $value;
$valstr[] = " {$key} = '{$val}' ";
}
$valstr = arrayto_string($valstr,' AND ');
if(strlen($valstr) > 0){
if(!empty($this->where)) $this->where = " ({$this->where}) AND ";
$this->where .= $valstr;
}
}
# 选项值的组成样式
private function valuet($val) {
global $_M,$_YW;
switch ($this->tname) {
case 'village':
$fiend = [$val['v_name'],$val['v_province'].$val['v_city'].$val['v_district'].$val['v_address']];
break;
case 'customer':
$fiend = [$val['c_name'],$val['c_allname'],$val['c_province'].$val['c_city'].$val['c_district'].$val['c_address']];
break;
case 'workers':
$fiend = [$val['w_name'],$val['w_tel']];
break;
case 'contract':
$fiend = [$val['h_number']];
break;
case 'launch':
$fiend = [$val['l_title'],$val['l_hnumber']];
break;
case 'weuser':
$sex = ['未知','男','女'];
$fiend = [$val['nickname'],$sex[$val['sex']] ];
break;
case 'para':
$fiend = [$val['p_name']];
// $fiend = [$val['p_value']];
break;
default:
break;
}
$text = arrayto_string($fiend,' / ');
return $text;
}
//编号字段,根据此字段进行编号处理
private function charter() {
global $_M,$_YW;
switch ($this->tname) {
case 'village':
$fiend = 'v_name';
break;
case 'customer':
$fiend = 'c_name';
break;
case 'workers':
$fiend = 'w_name';
break;
case 'contract':
$fiend = 'h_number';
break;
case 'launch':
$fiend = 'l_title';
break;
case 'weuser':
$fiend = 'nickname';
break;
case 'para':
$fiend = 'p_name';
break;
default:
break;
}
return $fiend;
}
// 查看小区名称列表
public function doselect() {
global $_M,$_YW;
//判断条件
self::querys();
//带入的判断条件
self::condition();
//编号的字段
$fiend = self::charter();
//查询
$array = $this->tsql->table($this->tname)->where($this->where)->order('id DESC')->all('id');
// $sqltsr = $this->tsql->query();
foreach ($array as $val) {
if($this->tname == 'weuser'){
$val['nickname'] = urldecode($val['nickname']);
}
$letter = getstrcharter($val[$fiend]);
$selectlist[$letter][] = $val;
}
//是否显示全部
self::allnone();
//是否将搜索内容作为结果
self::children();
//处理结果
foreach ($selectlist as $key => $val){
$arr = [];
foreach ($val as $v) {
$valid = self::select_fiend($v);
//判断是否只输出默认值
if(strlen($this->default) > 0){
$default = stringto_array($this->default, $this->division);
if(!in_array($valid, $default,true)) continue;
}
//组成选项
$arr[] = ['id' => $valid, 'text' => self::valuet($v)];
}
$this->data[] = ["text" => $key,"children" => $arr];
}
//当值不存在时
if(!count($this->data)){
//输出没有搜索到结果
$this->data = [["text" => $this->querys == ''?'检索不到相关信息':"检索不到 {$this->querys} 相关信息","children" => [] ]];
}else{
//对数组排序A-ZZ
$text = array_column($this->data, 'text');
array_multisort($text,SORT_ASC,$this->data);
}
echo jsoncallback(['results' => $this->data]);
}
}
?>

126
admin/table_ajax.class.php Normal file
View File

@ -0,0 +1,126 @@
<?php
defined('IN_MET') or exit ('No permission');
load::own_class('appadmin');
load::own_class('../traits/tdata');
load::own_class('../traits/tlist');
load::own_class('../traits/tfield');
//表格
class table_ajax extends appadmin {
//非备份,正常字段即可
private $bsign = false;
//列表
private $list = [];
//当前执行表名
private $sqlk;
//form数组
private $form = [];
//info_on 快速URL
private $own_name_info;
private $own_name_table;
public function __construct() {
global $_M,$_YW;
parent::__construct();
$this->form = $_M['form'];
if($this->form['tname']){
$this->tname = $this->form['tname'];
$this->sqlk = $_YW['k'][$this->tname];
}
$this->own_name_info = $_M['url']['own_name'].'c=info_on&a=do';
$this->own_name_table = $_M['url']['own_name'].'c=table_on&a=do';
}
//表格数据
public function doindex() {
global $_M;
//加载表格数据获取类
$table = load::own_class('tabledata', 'new');
$field = self::td_field();
$sqlk = self::td_sqlk();
$where = self::td_where();
$order = self::td_order();
/*查询表*/
if($where){
$conds .= " WHERE {$where} ";
}
if($order){
$conds .= " ORDER BY {$order} ";
}
//整理查询条件
$query = "SELECT {$field} FROM {$sqlk} {$conds} ";
//获取数据
$data = $table->getdata($sqlk, $field, $where, $order,$query,$this->multi_table);
//数据整理
$array = self::sqlarr($data);
//返回数据
$table->rdata($array);
}
use tdata;
/*
* 【列出】
* 返回数据数组
*/
private function sqlarr($data = []) {
global $_M;
// if(in_array($this->tname,$this->k_name)){
foreach ($data as $val) {
self::output($val);
$array[] = $this->list;
}
return $array;
// }else{
// return false;
// }
}
/*
* 【新行】
* 新增行分发
*/
public function do_table_add_list(){
global $_M;
$val = ['id' => 'new-'.$this->form['new_id'], 'p_type' => $this->form['p_type']];
if(in_array($this->tname,$this->k_name)){
self::output($val,'checked=""');
}
self::addlist($val);
}
/*
* 【新行】
* 生成文件新增行
*/
private function addlist($val) {
global $_M;
$metinfo = '';
foreach ($this->list as $v){
$metinfo .= '<td class=" text-xs-center">'.$v.'</td>';
}
echo "<tr>{$metinfo}</tr>";
}
use tfield;
use tlist;
//公用的输出
protected function output($val,$checked = '') {
global $_M,$_YW;
$array = self::{$this->tname}($val,$checked);
$this->list = array();
foreach ($array as $value) {
$this->list[] = $value;
}
}
}
?>

286
admin/table_off.class.php Normal file
View File

@ -0,0 +1,286 @@
<?php
defined('IN_MET') or exit ('No permission');
load::own_class('appadmin');
//表格
class table_off extends appadmin {
//获取的ID
private $allid;
//表名
private $sqlk;
// 文字提示
private $tips = '';
//跳转URL
private $returl = '';
//参数
private $para = [];
public function __construct()
{
global $_M,$_YW;
parent::__construct();
$this->tname = $_M['form']['tname'];
$this->sqlk = $_YW['k'][$this->tname];
}
public function __destruct()
{
global $_M,$_YW;
if($this->destruct){
switch ($this->tname) {
case 'para':
$this->para = [
'p_type' => $_M['form']['p_type']
];
break;
default:
break;
}
if(count($this->para)) $para = '&'.http_build_query($this->para);
turnover($this->returl?:$_M['url']['own_name'] . 'c=table_on&a=do'.$this->tname.$para, $this->tips);
}
}
//主方法
public function doindex(){
global $_M,$_YW;
$this->allid = array_filter(explode(',', $_M['form']['all_id']));
switch ($_M['form']['submit_type']) {
case 'delet':
self::delet();
break;
case 'save':
self::save();
break;
case 'enableon':
case 'enableoff':
self::enable();
break;
case 'enable_on':
case 'enable_off':
self::enable(false);
break;
case 'typeonoff':
self::typeonoff();
break;
default:
break;
}
if($_M['form']['method'] == 'ajax') {
$this->destruct = false;
echo jsoncallback(['code' => $this->tsql->error()?1:0 ]);
}
}
//保存
private function save() {
global $_M,$_YW;
foreach ($this->allid as $id) {
if($id){
$field = self::info($id);
if(is_number($id)){
$this->tsql->table($this->tname)
->field($field)
->where(" id = '{$id}' ")
->upd();
} else {
$this->tsql->table($this->tname)
->field($field)
->add();
}
}
}
}
//删除
private function delet() {
global $_M,$_YW;
foreach ($this->allid as $id) {
if($id){
//删除关联表
$ret = self::todel($id);
if($ret == false) continue;
//删除本表
$where = " id = '{$id}' ";
$this->tsql->table($this->tname)
->where($where)
->del();
}
}
}
//调整广告位状态
private function enable($type = true) {
global $_M,$_YW;
$enable = $_M['form']['submit_type'] == 'enableon' || $_M['form']['submit_type'] == 'enable_on'?1:0;
$fid = $type?'e_vid':'id';
foreach ($this->allid as $id) {
if($id){
$this->tsql->table('elevator')
->field(['e_enable' => $enable])
->where([$fid => $id])
->upd();
}
}
}
//ajax单独调整
private function typeonoff() {
global $_M,$_YW;
$field = $_M['form']['field'];
$special = "ABS({$field}-1)";
$array = [$field => $special];
$field_id = 'id';
foreach ($this->allid as $id) {
if($id){
$this->tsql->table($this->tname)
->special($special)
->field($array)
->where([$field_id => $id])
->upd();
}
}
}
//保存信息
private function info($id) {
global $_M,$_YW;
$lang = '';
switch ($this->tname) {
case 'para':
$info = [
'p_type' => $_M['form']['p_type-'.$id],
'p_order' => $_M['form']['p_order-'.$id],
'p_name' => $_M['form']['p_name-'.$id],
'p_value' => $_M['form']['p_value-'.$id],
'p_text' => $_M['form']['p_text-'.$id]
];
break;
default:
break;
}
return $info;
}
//删除其他的关联表
private function todel($id) {
global $_M,$_YW;
$ret = true;
switch ($this->tname) {
case 'contract':
//获取合同编号
$contract = $this->tsql->table('contract')
->where(['id' => $id])
->one();
//删除相关计划
$this->tsql->table('launch')
->where(['l_hnumber' => $contract['h_number'] ])
->del();
//删除相关排期
$this->tsql->table('schedule')
->where(['s_hnumber' => $contract['h_number'] ])
->del();
break;
case 'launch':
//删除相关排期
$this->tsql->table('schedule')
->where(['s_lid' => $id ])
->del();
break;
case 'para':
//删除相关的光广告位
if($_M['form']['p_num-'.$id] > 0) $ret = false;
break;
case 'village':
//查询需要删除的广告位编号
$elevator = $this->tsql->table('elevator')
->where(['e_vid' => $id])
->all();
$e_number = array_column($elevator, 'e_number');
self::del_elevator($e_number);
break;
case 'elevator':
$elevator = $this->tsql->table('elevator')
->where(['id' => $id])
->one();
//删除相关排期广告位编号
self::del_elevator($elevator['e_number']);
break;
default:
break;
}
return $ret;
}
// 删除排期广告位编号
private function del_elevator($num) {
$dellist = [];
if(!is_array($num)) $num = [$num];
$num = array_unique($num);
if(count($num) == 0) return false;
// 广告位数组
foreach ($num as $e_number){
// 删除广告位
$this->tsql->table('elevator')
->where(['e_number' => $e_number ])
->del();
//删除相关排期缓存
$this->tsql->table('schedule')
->where(['s_enumber' => $e_number ])
->del();
// 整理数据
$launch = false;
// 选择的广告位
$launch = $this->tsql->table('launch')
->where(" find_in_set( '{$e_number}', l_selectenum ) ")
->all();
// 处理的核心函数
$col = function($launch,$field) use(&$dellist,$e_number){
foreach ($launch as $val){
$dellist[$val['id']]['info'] = $val;
$dellist[$val['id']][$field][] = $e_number;
}
};
if($launch != false) $col($launch,'l_selectenum');
// 排期成功的广告位
$launch = $this->tsql->table('launch')
->where(" find_in_set( '{$e_number}', l_enumber ) ")
->all();
if($launch != false) $col($launch,'l_enumber');
}
if(count($dellist) == 0) return false;
// 对值进行统计并修改
foreach ($dellist as $id => $la){
// 处理的核心函数
$enum = function($field) use($la){
// 拿到la内需要去掉的值 数组
// 再通过对比获得差异值,并去重,再转成字符串
return is_array($la[$field])?arrayto_string(array_unique(array_diff(stringto_array($la['info'][$field],','),$la[$field])),','):$la['info'][$field];
};
//mysql
$this->tsql->table('launch')
->field(['l_selectenum' => $enum('l_selectenum'), 'l_enumber' => $enum('l_enumber')])
->where(['id' => $id])
->upd();
}
}
}
?>

135
admin/table_on.class.php Normal file
View File

@ -0,0 +1,135 @@
<?php
defined('IN_MET') or exit ('No permission');
load::own_class('appadmin');
class table_on extends appadmin {
// 表格标题
private $table_theme; // 等待完善
public function __construct()
{
global $_M,$_YW;
parent::__construct();
parent::appnav();
parent::point('table_off','doindex','table');
$this->table_theme = load::own_class('table_theme','new');
}
//输出模板内容
public function __destruct()
{
global $_M,$_YW;
if($this->destruct){
if(empty($this->appshow)) $this->appshow = 'app/'.$this->tname;
require $this->show($this->appshow,$this->input);
}
}
//广告位统计
public function doelevator()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$this->input['table'] = $this->table_theme->start($this->tname)->send_all(1);
}
//小区统计
public function dovillage()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$this->input['table'] = $this->table_theme->start($this->tname)->send_all(1);
}
//广告合同关联表
public function doschedule()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$this->input['table'] = $this->table_theme->start($this->tname)->send_all();
}
//合同统计
public function docontract()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$this->input['table'] = $this->table_theme->start($this->tname)->send_all();
}
//企业资料
public function docustomer()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$this->input['table'] = $this->table_theme->start($this->tname)->send_all(1);
}
//企业联系人
public function doworkers()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$this->input['table'] = $this->table_theme->start($this->tname)->send_all(1);
}
//投放计划单
public function dolaunch()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$this->input['table'] = $this->table_theme->start($this->tname)->send_all(1);
}
//参数配置
public function dopara()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$this->input['table'] = $this->table_theme->start($this->tname)->send_all();
}
// 小区统计
public function dovillages()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$vs_daytime = date('Y-m-d',time());
$this->input['top']['tips'] = '
<div class="alert dark alert-primary radius0 m-b-5">
<p><mark>闲置个数、排期中的个数、到期个数、预排的个数计算说明</mark></p>
<ol>
<li>若选择时间区段,若两者缺少其中一个则自动补全为当天时间(<span class="tag tag-danger">'.$vs_daytime.'</span></li>
<li><span class="tag tag-danger">闲置:</span>默认计算当天('.$vs_daytime.')的广告位闲置个数,选择时间区段后,计算的可以满足时间区段的广告位个数。(<span class="tag tag-danger">仅计算启用的广告位</span>)</li>
<li><span class="tag tag-danger">排期中:</span>默认计算当天('.$vs_daytime.')排期中的个数,选择时间区段后,计算的在时间区段内有排期的广告位个数。</li>
<li><span class="tag tag-danger">到期:</span>默认以当天('.$vs_daytime.')为准,计算<span class="tag tag-danger">7</span>天后到期的个数,选择时间区段后,计算的在时间区段内到期的广告位个数。</li>
<li><span class="tag tag-danger">预排:</span>默认计算当天('.$vs_daytime.')以后才开始的排期广告位个数,选择时间区段后,计算的是时间区段内排期状态为预排的广告位个数。</li>
</ol>
</div>';
$this->input['table'] = $this->table_theme->start($this->tname)->send_all(1);
}
// 小区统计
public function doelevators()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$this->input['table'] = $this->table_theme->start($this->tname)->send_all(1);
}
// 巡查密钥列表
public function dokeylist()
{
global $_M,$_YW;
parent::appurl(parent::tname());
$this->input['table'] = $this->table_theme->start($this->tname)->send_all();
}
}
?>

View File

@ -0,0 +1,79 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<div class="appmain">
<form method="POST" action="{$data.url.action}">
<!--二级导航-->
{$data.nav_sub}
<div class="metadmin-fmbx">
<h3 class='example-title'>微信通知</h3>
<dl>
<dt><label class='form-control-label'>合同预约提醒模板ID</label></dt>
<dd class="form-group">
<div class="input-group">
<input type="text" name="tem_ida"
value="{$data.c.tem_ida}"
class="form-control"
placeholder='输入微信模板ID'
required data-fv-notEmpty-message='不能为空'>
</div>
<span class="text-help m-l-10">IT科技-互联网|电子商务-预约提醒,推送为模板为那些还未到期的合同</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>合同到期提醒模板ID</label></dt>
<dd class="form-group">
<div class="input-group">
<input type="text" name="tem_idb"
value="{$data.c.tem_idb}"
class="form-control"
placeholder='输入微信模板ID'
required data-fv-notEmpty-message='不能为空'>
</div>
<span class="text-help m-l-10">IT科技-互联网|电子商务-合同到期提醒,合同已经到期的</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>合同提醒汇总模板ID</label></dt>
<dd class="form-group">
<div class="input-group">
<input type="text" name="tem_idc"
value="{$data.c.tem_idc}"
class="form-control"
placeholder='输入微信模板ID'
required data-fv-notEmpty-message='不能为空'>
</div>
<span class="text-help m-l-10">IT科技-互联网|电子商务-统计结果通知,合同提醒汇总结果</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>合同到期通知的微信</label></dt>
<dd class="form-group">
<select name='openids[]' multiple class="form-control" data-plugin="select2"
data-select2-url="{$data.url.select}"
data-tname="weuser"
data-fiend="openid"
data-allnone="0"
data-source="con_weuser"
data-default="{$data.c.openid}"
data-division=","
data-placeholder="输入微信昵称"
required data-fv-notEmpty-message='不能为空'>
<option value=""></option>
</select>
<span class="text-help m-l-10">可设置多个管理员微信,设置后每个合同到期都会收到微信通知</span>
</dd>
</dl>
<dl>
<dt></dt>
<dd>
<button type="submit" class="btn btn-primary">保存</button>
</dd>
</dl>
</div>
</form>
</div>
<include file='sys_admin/foot_v2'/>

View File

@ -0,0 +1,129 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<div class="appmain">
<form method="POST" action="{$data.url.action}" target="_self" enctype="multipart/form-data">
<!--二级导航-->
{$data.nav_sub}
<div class="metadmin-fmbx">
<h3 class='example-title'>{$data.met_title}</h3>
<dl>
<dt><label class='form-control-label'>合同编号</label></dt>
<dd class="form-group">
<input type="text" name="h_number"
value="{$data.data.h_number}"
class="form-control"
placeholder='输入合同唯一编号'
required data-fv-notEmpty-message='不能为空'
data-fv-remote="true" data-fv-remote-url="{$data.remote_url}"
data-fv-remote-message="广告编号不能重复"
{$data.data.h_number_readonly}
>
<span class="text-help m-l-10"><foot class="red-600">保存后不可二次修改</foot>,合同唯一编号,方便后期查询处理</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>签订日期</label></dt>
<dd>
<input type="text" name="h_signtime"
value="{$data.data.h_signtime}"
class="form-control" data-plugin='datetimepicker' data-day-type="2">
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>签订企业</label></dt>
<dd class="form-group">
<select name='h_cid' class="form-control" data-plugin="select2"
data-select2-url="{$data.url.select}"
data-tname="customer"
data-fiend="id"
data-allnone="0"
data-source="add_contract"
data-default="{$data.data.h_cid}"
data-placeholder="输入企业全称"
required data-fv-notEmpty-message='不能为空'>
<option value=""></option>
</select>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>签订相关人员</label></dt>
<dd class="form-group">
<select name='h_wid[]' class="form-control" multiple data-plugin="select2"
data-select2-url="{$data.url.select}"
data-tname="workers"
data-fiend="id"
data-allnone="0"
data-source="add_contract_workers"
data-default="{$data.data.h_wid}"
data-placeholder="输入联系人姓名/电话"
data-division=","
required data-fv-notEmpty-message='不能为空'>
<option value=""></option>
</select>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>广告时间段</label></dt>
<dd class="form-group">
<div class="input-group">
<span class="input-group-addon">开始时间</span>
<input type="text" name="h_starttime" value="{$data.data.h_starttime}"
class="form-control w-150"
id="date_timepicker_start"
data-day-type="1"
data-table-search
data-plugin="datetosearch"
autocomplete="off">
<span class="input-group-addon">结束时间</span>
<input type="text" name="h_endtime" value="{$data.data.h_endtime}"
class="form-control w-150"
id="date_timepicker_end"
data-day-type="1"
data-table-search
data-plugin="datetosearch"
autocomplete="off">
</div>
<span class="text-help m-l-10">影响后期的投放计划时间区间</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>合同到期通知</label></dt>
<dd>
<input type="text" name="h_noticeday" placeholder="输入天数,限于数字" value="{$data.data.h_noticeday}" data-plugin='tokenfield' data-delimiter=','/>
<span class="text-help m-l-10">可设置多个通知天数,输入完成一个回车后再输入下一个</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>合同总额</label></dt>
<dd class="form-group">
<div class="input-group">
<input type="text" name="h_tprice"
value="{$data.data.h_tprice}"
class="form-control"
placeholder='输入合同总额'
required data-fv-notEmpty-message='不能为空'>
<span class="input-group-addon"></span>
</div>
<span class="text-help m-l-10">合同总额方便后期统计</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>合同备注</label></dt>
<dd class="form-group">
<textarea name="h_text" rows="5" placeholder='备注描述' class='form-control m-r-10'>{$data.data.h_text}</textarea>
<span class="text-help">简短文字描述备注。</span>
</dd>
</dl>
<dl>
<dt></dt>
<dd>
<button type="submit" class='btn btn-primary'>保存</button>
</dd>
</dl>
</div>
</form>
</div>
<include file='sys_admin/foot_v2'/>

1
admin/templates/css/appcheck.min.css vendored Normal file
View File

@ -0,0 +1 @@
@charset "UTF-8";.appcheck .panel-info{border:1px solid #57c7d4;}.appcheck .topimg{text-align:left;display:inline-block;}.appcheck .topimg>div{float:left;}.appcheck .topimg .topimg-image{position:relative;margin-right:10px;}.appcheck .topimg .topimg-image .avatar{width:100px;}.appcheck .topimg .topimg-image .avatar img{border-radius:50%;border:1px solid #e4eaec;}.appcheck .img-bordered-info{border-color:#79D1C9!important;}.appcheck .topimg .topimg-body>span{display:block;font-size:1rem;}.appcheck .topimg .topimg-body .topimg-author{font-size:20px;font-weight:600;}.appcheck .topimg .topimg-body .topimg-company{opacity:.8;}.appcheck .list-group .media .media-heading{font-size:1.1rem;color:#37474f;}.appcheck .list-group li h4{font-weight:600;}.appcheck .media-body small{font-size:98%;color:#76838f;}.appcheck .loader-circle{width:0.45em;height:0.45em;border-width:.08em;}.appcheck .icon{margin-right:0px;font-size:20px;}.appcheck .icon.fa-check-circle{color:#46be8a;}.appcheck .icon.fa-times-circle{color:#f96868;}.appcheck .icon.fa-exclamation-circle{color:#f2a654;}.appcheck .icon.fa-clock-o{color:#ccd5db;}.appcheck .modal{background:rgba(0,0,0,.8);}.appcheck .modal .close{opacity:1;font-weight:900;font-size:1.9rem;}.appcheck .modal .close:focus,.appcheck .modal .close:hover{cursor:pointer;text-decoration:none;opacity:.5;}.appcheck .modal .modal-header{border-bottom:1px solid #e4eaec;}.appcheck .modal .modal-footer{padding:15px 20px;border-top:1px solid #e4eaec;}.appcheck .modal .modal-body .ov-body{overflow-y:auto;}.appcheck .modal .ov-body span{color:#76838f;}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,87 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<div class="appmain">
<form method="POST" action="{$data.url.action}" target="_self" enctype="multipart/form-data">
<!--二级导航-->
{$data.nav_sub}
<div class="metadmin-fmbx">
<h3 class='example-title'>{$data.met_title}</h3>
<dl>
<dt><label class='form-control-label'>企业全称</label></dt>
<dd class="form-group">
<select name='c_allname' class="form-control" data-plugin="select2"
data-select2-url="{$data.url.select}"
data-tname="{$data.tname}"
data-fiend="c_allname"
data-allnone="3"
data-source="add_customer"
data-default="{$data.data.c_allname}"
data-placeholder="输入企业全称"
required data-fv-notEmpty-message='不能为空'>
<option value=""></option>
</select>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>企业简称</label></dt>
<dd class="form-group">
<input type="text" name="c_name"
value="{$data.data.c_name}"
class="form-control"
placeholder='输入企业简称'>
<span class="text-help m-l-10">企业简短名称</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>企业地址</label></dt>
<dd>
<div data-plugin="select-linkage" data-select-url="{$data.url.city}" class="city-css form-group">
<select name="c_province" class="form-control m-r-5 prov" data-checked="{$data.data.c_province}"
required data-fv-notEmpty-message="不能为空"></select>
<select name="c_city" class="form-control m-r-5 city" data-checked="{$data.data.c_city}"
required data-fv-notEmpty-message="不能为空"></select>
<select name="c_district" class="form-control m-r-5 dist" data-checked="{$data.data.c_district}"
required data-fv-notEmpty-message="不能为空"></select>
</div>
<div class="form-group clearfix">
<input type="text" name="c_address" value="{$data.data.c_address}" placeholder="请输入详细地址" class="form-control"
required data-fv-notEmpty-message="不能为空">
</div>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>相关联系人</label></dt>
<dd class="form-group">
<select name='c_wid[]' class="form-control" multiple data-plugin="select2"
data-select2-url="{$data.url.select}"
data-tname="workers"
data-fiend="id"
data-allnone="0"
data-source="add_customer_workers"
data-default="{$data.data.c_wid}"
data-placeholder="输入联系人姓名/电话"
data-division="," >
<option value=""></option>
</select>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>备注</label></dt>
<dd class="form-group">
<textarea name="c_text" rows="5" placeholder='备注描述' class='form-control m-r-10'>{$data.data.c_text}</textarea>
<span class="text-help">简短文字描述备注。</span>
</dd>
</dl>
<dl>
<dt></dt>
<dd>
<button type="submit" class='btn btn-primary'>保存</button>
</dd>
</dl>
</div>
</form>
</div>
<include file='sys_admin/foot_v2'/>

119
admin/templates/dzadsod.php Normal file
View File

@ -0,0 +1,119 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<!--二级导航-->
{$data.nav_sub}
<div class="page-profile">
<div class="card card-shadow text-xs-center">
<div class="card-footer">
<div class="row no-space">
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.village}</strong>
<span>小区总数</span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.elevator}</strong>
<span>广告位总数</span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.vfree}</strong>
<span data-toggle="tooltip"
data-placement="bottom"
data-trigger="hover"
data-original-title="今天空闲的广告位总数,包含禁用的广告位">广告位空闲数 <i class="icon fa-question-circle" aria-hidden="true"></i></span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.vlease}</strong>
<span data-toggle="tooltip"
data-placement="bottom"
data-trigger="hover"
data-original-title="今天正在排期中的广告位">广告位排期中 <i class="icon fa-question-circle" aria-hidden="true"></i></span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.vendday}</strong>
<span data-toggle="tooltip"
data-placement="bottom"
data-trigger="hover"
data-original-title="7天内即将到期的广告位总数">7天内到期 <i class="icon fa-question-circle" aria-hidden="true"></i></span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.vprerow}</strong>
<span data-toggle="tooltip"
data-placement="bottom"
data-trigger="hover"
data-original-title="投放开始时间大于今天的广告位">广告位预排数 <i class="icon fa-question-circle" aria-hidden="true"></i></span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.contract}</strong>
<span>订单总数</span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.summoney}</strong>
<span>合同总额</span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.endcontract}</strong>
<span>到期订单数</span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.launch}</strong>
<span>投放总数</span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.endlaunch}</strong>
<span>投放结束数</span>
</div>
<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.customer}</strong>
<span>企业总数</span>
</div>
<!--<div class="col-xs-1">
<strong class="profile-stat-count">{$data.num.workers}</strong>
<span>联系人总数</span>
</div>-->
</div>
</div>
</div>
</div>
<div class="row dzadsod_list">
<!--
<div class="col-md-4 col-lg-4 col-4">
<div class="panel panel-info ">
<div class="panel-heading">
<h3 class="panel-title">签定的最新合同</h3>
</div>
<div class="panel-body">
<ol class="list-group list-group-dividered list-group-full">
<li class="list-group-item active">XXXXXXX</li>
<li class="list-group-item">XXXXXXX</li>
<li class="list-group-item">XXXXXXX</li>
<li class="list-group-item disabled">XXXXXXX</li>
</ol>
</div>
</div>
</div>
-->
<div class="col-md-12 col-lg-12 col-12">
<div class="panel panel-info panel-line ">
<div class="panel-heading">
<h3 class="panel-title">订单到期提醒
<small>包含根据设置的到期提醒天数内的订单以及订单投放结束到期的订单符合条件的数据展示3天</small>
</h3>
</div>
<table class="dataTable table table-bordered table-hover table-striped w-full m-t-10" id="tableslist" data-table-ajaxurl="{$data.url.ajaxurl}" data-table-pagelength='15' data-plugin="selectable">
<thead>{$data.table.thead}</thead>
<tbody>
<tr>
<td colspan="{$data.table.tdcol}">
<div class="h-50 vertical-align text-xs-center"><div class="loader vertical-align-middle loader-default"></div></div>
</td>
</tr>
</tbody>
<tfoot>{$data.table.tfoot}</tfoot>
</table>
</div>
</div>
</div>
<include file='sys_admin/foot_v2'/>

View File

@ -0,0 +1,117 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<div class="appmain">
<form method="POST" action="{$data.url.action}" target="_self" enctype="multipart/form-data">
<!--二级导航-->
{$data.nav_sub}
<div class="metadmin-fmbx">
<h3 class='example-title'>{$data.met_title}</h3>
<dl>
<dt><label class='form-control-label'>广告位编号</label></dt>
<dd class="form-group">
<input type="text" name="e_number"
value="{$data.data.e_number}"
class="form-control"
placeholder='输入广告位唯一编号'
required data-fv-notEmpty-message="不能为空"
data-fv-remote="true" data-fv-remote-url="{$data.remote_url}"
data-fv-remote-message="广告编号不能重复"
>
<input type="hidden" name="olde_number" value="{$data.data.e_number}">
<span class="text-help m-l-10">广告位唯一编号,方便后期查询处理。</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>选择小区</label></dt>
<dd class="form-group">
<select name='e_vid' class="form-control" data-plugin="select2"
data-select2-url="{$data.url.select}"
data-tname="village"
data-fiend="id"
data-allnone="0"
data-source="add_elevator"
data-default="{$data.data.e_vid}"
data-placeholder="输入小区名"
required data-fv-notEmpty-message='不能为空'>
<option value=""></option>
</select>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>选择楼号</label></dt>
<dd class="form-group">
{$data.para.e_bno_radio}
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>选择单元号</label></dt>
<dd class="form-group">
{$data.para.e_uno_radio}
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>选择电梯号</label></dt>
<dd class="form-group">
{$data.para.e_eno_radio}
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>选择广告位置</label></dt>
<dd class="form-group">
{$data.para.e_aps_radio}
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>广告规格</label></dt>
<dd class="form-group">
<input type="text" name="e_size"
value="{$data.data.e_size}"
class="form-control"
placeholder='输入广告规格'
required data-fv-notEmpty-message='不能为空'>
<span class="text-help m-l-10">示例300*500</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>是否启用</label></dt>
<dd class="form-group">
<div class="radio-custom radio-primary radio-inline">
<input type="radio" id="e_enable0" name="e_enable" value='0' data-checked='{$data.data.e_enable}'
required data-fv-notEmpty-message='不能为空' />
<label for="e_enable0">禁用</label>
</div>
<div class="radio-custom radio-primary radio-inline">
<input type="radio" id="e_enable1" name="e_enable" value='1'/>
<label for="e_enable1">启用</label>
</div>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>自主标签</label></dt>
<dd>
<input type="text" name="e_label" placeholder="输入标签" value="{$data.data.e_label}" data-plugin='tokenfield' data-delimiter=','/>
<span class="text-help m-l-10">自定义广告位相关标签,可设置多个</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>备注</label></dt>
<dd class="form-group">
<textarea name="e_text" rows="5" placeholder='备注描述' class='form-control m-r-10'>{$data.data.e_text}</textarea>
<span class="text-help">简短文字描述备注。</span>
</dd>
</dl>
<dl>
<dt></dt>
<dd>
<button type="submit" class='btn btn-primary'>保存</button>
</dd>
</dl>
</div>
</form>
</div>
<include file='sys_admin/foot_v2'/>

52
admin/templates/index.php Normal file
View File

@ -0,0 +1,52 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['app']['appname'];
//2.0
?>
<include file='sys_admin/head_v2'/>
<link href="{$_M['url']['own_tem']}css/appcheck.min.css" rel='stylesheet' type='text/css'>
<div class="appcheck" data-ckitem="{$data.ckitem}" >
<div class="row">
<div class="col-xs-12 col-md-4 offset-md-4">
<div class="panel panel-info m-t-35">
<div class="panel-heading p-y-20 text-xs-center">
<div class="topimg">
<div class="topimg-image">
<div class="avatar">
<img class="img-circle img-bordered img-bordered-info" src="{$data.app.icon}" alt="image">
</div>
</div>
<div class="topimg-body p-10 p-l-5">
<span class="topimg-author">{$data.app.appname}</span>
<span class="topimg-company">版本号:{$data.app.ver}</span>
<span class="topimg-company">{$data.app.addtime}</span>
</div>
</div>
</div>
<ul class="list-group list-group-bordered"></ul>
<div class="panel-body text-xs-center">
应用进行逐项检测,状态:<i class="icon fa-times-circle"></i> 时会暂停检测,待处理问题后再继续执行检测。
</div>
</div>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="appmodal" aria-hidden="true" data-keyboard="false" data-backdrop="false" role="dialog" tabindex="-1">
<div class="modal-dialog modal-center">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close blue-600" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title"></h4>
</div>
<div class="modal-body"></div>
<div class="modal-footer text-xs-center collapse"></div>
</div>
</div>
</div>
<!-- End Modal -->
</div>
<include file='sys_admin/foot_v2'/>

18
admin/templates/js/app.js Normal file
View File

@ -0,0 +1,18 @@
//应用JS后期语法框架
(function($){
//内部初始化入口
var appmap = function(){
};
//扩展方法
appmap.prototype = {
};
//外部入口
$.fn.maps = function () {
};
})(jQuery);

1
admin/templates/js/appcheck.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,243 @@
//应用JS后期语法框架
(function($){
//内部初始化入口
var applan = function(){
var $self = this,
strArr = $self.aparr();
//计算选中广告位个数
$self.addnum(strArr);
//提交处理
$(document).on('submit', '.add_ap_list form', function(event) {
event.preventDefault(); //阻止默认提交
})
//修改form提交方式
$(document).on('click', '.add_ap_list form button[type="submit"]', function(event) {
event.preventDefault(); //阻止默认提交
var $form = $(this).parents('form');
//手动触发全部验证
// $form.data('formValidation').resetForm();
$form.data('formValidation').validate({debug:true});
//查看验证结果,若为false 则阻止
var flag = $form.data("formValidation").isValid();
//验证时间是否合法
if(flag != false){
//执行入库操作返回ID
$self.laaajx($form.attr('action'),$self.formdata($form));
}
//修改表格按钮禁止操作
// $(this).attr("disabled",true);
});
//解决被禁用前选中的,点击取消后则不能再勾选
$('table tbody').on('click', '.ap-one-disabled', function(event) {
$(this).removeClass('ap-one-disabled');
$(this).find('input').attr("disabled",true);
})
// $(document).on('change',"[data-table-search]",function(){
// return false;
// })
//全选
$(document).on('click','.ap-all input',function(){
var idArr = [];
//选中值
var table = $(this).parents('table').find('tbody');
table.find('.ap-one').each(function(index,element){
var oneid = $(this).find('input[name="id"]').val(),
disabled = $(this).find('input[name="id"]').prop('disabled');
if(APPFUN.isEmpty(disabled)) idArr.push(oneid);
})
this.checked === true?$self.addap(idArr):$self.apdelall(idArr);
});
//必须定位到 table tbody on方法才生效
$('table tbody').on('click','.ap-one input',function(){
var idStr = $(this).val();
this.checked === true?$self.addap(idStr):$self.delap(idStr);
});
};
//扩展方法
applan.prototype = {
addnum:function(strArr){
var $self = this;
strArr = $.unique(strArr);
$('.addnum').text(strArr.length);
},
apdelall:function(idArr){
var $self = this;
$.each(idArr,function(i,idStr){
$self.delap(idStr);
})
},
addap:function(idStrArr){
//新增选中值
var $self = this,
strArr = $self.aparr();
//新增选中的元素
strArr = strArr.concat(idStrArr);
//排序
strArr.sort();
//去重
strArr =$.unique(strArr);
$self.apinput(strArr.join(","),true);
//选中个数
$self.addnum(strArr);
},
delap:function(idStr){
//删除选中值
var $self = this,
strArr = $self.aparr(),
strlen = $.inArray(idStr, strArr);
//删除选中值
if(strlen != '-1') strArr.splice(strlen, 1);
//排序
strArr.sort();
//重新写会
$self.apinput(strArr.join(","),true);
//选中个数
$self.addnum(strArr);
},
apinput:function(str,type){
//获取或者写入
//true 为写入 false为获取
var input = $('input[name="l_selectenum"]');
return APPFUN.isEmpty(type)?input.val():input.val(str);
},
aparr:function(){
//选中广告位编号
var $self = this,
str = $self.apinput();
return !APPFUN.isEmpty(str)?str.split(","):[];
},
formdata:function(form){
var Array = form.serializeArray(),
dataOjb = {};
//转成一对一
$.each(Array,function(key,val){
dataOjb[val.name] = val.value;
});
return dataOjb;
},
laaajx:function(url,data){
var $self = this,
scrollable_this = $('[data-plugin="scrollable"]');
//点击保存后,先处理保存,再执行点位
$.post(url,data,function(json){
if(json.code){
// // 执行成功,则自动跳转到下一步
window.location.replace(window.location.href + '&slid='+json.slid+'&nextstep=1');
}else{
$self.addappend(scrollable_this,json.text,0);
$self.alerthtml(false,json.text);
}
},'json');
},
nextstep:function(){
var $self = this,
scrollable_this = $('[data-plugin="scrollable"]'),
//获取广告位数组
strArr = $self.aparr(),
//提交的URL
url = M.url.own_name + 'c=ajax&a=doapplan&lang=' + M.lang,
//获取form数据
data = $self.formdata($('form')),
falsei = 0,
truei = 0;
$self.scrollable(scrollable_this); //先重新初始化显示
//去重
strArr =$.unique(strArr);
$.each(strArr,function(i,idStr){
data['ap_enumber'] = idStr;
$.post(url,data,function(json){
// 将操作结果反馈给页面
$self.addappend(scrollable_this,json.text,json.code?1:2);
var inputid = $('input[value="'+json.eid+'"]').parent('.ap-one');
if(json.code){
truei++;
inputid.removeClass('checkbox-danger').addClass('checkbox-success');
}else{
falsei++;
inputid.removeClass('checkbox-success').addClass('checkbox-danger');
}
//输出最终结果
if(strArr.length == truei*1 + falsei*1){
//再执行将最终的结果保存到对应的投放ID内
var urls = M.url.own_name + 'c=ajax&a=dolenumber&lang=' + M.lang;
// 将缓存表内保存的排期成功数据保存到表内
$.post(urls,data,function(dajson){
var text = '本次广告投放计划共涉及('+strArr.length+')个广告位,排期成功的('+truei+')个广告位,排期失败的('+falsei+')个广告位。',
falseicode = falsei == 0?true:false;
if(dajson.code == false){
falseicode = false;
text += dajson.text;
}
//同步给排期成功的字段
if(dajson.code) $('input[name="l_enumber"]').val(dajson.idstr);
//信息反馈页面
$self.addappend(scrollable_this,dajson.text,dajson.code?0:2);
$self.addappend(scrollable_this,text,0);
$self.alerthtml(falseicode,text);
scrollable_this.asScrollable('scrollTo','vertical','100%');
},'json');
}
},'json');
});
},
alerthtml:function(bool,text){
var color = bool?'alert-success':'alert-danger',
url = M.url.own_name + 'c=table_on&a=dolaunch',
alert = '<div class="launch_affix_save alert dark alert-icon alert-dismissible text-xs-center ' + color + '" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button><span><i class="icon wb-bell p-r-10" aria-hidden="true"></i>'+text+'</span><button class="btn btn-sm btn-danger btn-inverse btn-outline launchlist" type="button">返回列表</button></div>';
$('.launch_affix_save').remove();
$('form').append(alert);
$(document).on('click','.launchlist',function(e){
window.location.replace(url);
})
},
addappend:function(_this_,text,code){
var color = ['blue-600','green-600','red-600'],
icon = ['wb-bell','wb-check','wb-close'],
litext = '<li class="' + color[code] + '"><i class="' + icon[code] + '" aria-hidden="true"></i>' + text + '</li>';
$('.launchshow').append(litext);
_this_.asScrollable('scrollTo','vertical','100%');
},
scrollable:function(_this_){
M['plugin']['asscrollable']=[
// M['url']['static2_vendor']+'asscrollable/asScrollable.min.css',
M['url']['static2_vendor']+'asscrollbar/jquery-asScrollbar.min.js',
M['url']['static2_vendor']+'asscrollable/jquery-asScrollable.min.js',
];
$.include(M['plugin']['asscrollable'], function () {
_this_.asScrollable('destroy');
_this_.asScrollable({
namespace: "scrollable",
contentSelector: "> [data-role='content']",
containerSelector: "> [data-role='container']"
});
});
},
scrollToEnd:function(){
//滚动到底部
var h = $(document).height()-$(window).height();
$(document).scrollTop(h);
}
};
//外部入口
$.fn.aplist = function () {
var naplan = new applan();
if( !APPFUN.isEmpty($('input[name="nextstep"]').val()) ) {
$('#tables-list').on( 'draw.dt', function ( e,settings ) {
naplan.scrollToEnd();
})
naplan.nextstep();
}
};
//启动
$(".add_ap_list").aplist();
})(jQuery);

View File

@ -0,0 +1,18 @@
//用来阻止广告位重复添加的
(function($){
//内部初始化入口
var appmap = function(){
};
//扩展方法
appmap.prototype = {
};
//外部入口
$.fn.maps = function () {
};
})(jQuery);

311
admin/templates/js/own.js Normal file
View File

@ -0,0 +1,311 @@
/*!
* M['weburl'] 网站网址
* M['lang'] 网站语言
* M['tem'] 模板目录路径
* M['user_name'] 页面登录用户名
* met_prevarrow,
met_nextarrow slick插件翻页按钮自定义html
* M['device_type'] 客户端判断dPC端t平板端m手机端
* M['n'] 当前模块名称
* M['c'] 当前类
* M['a'] 当前方法
* M['langtxt'] 当前语言文字
* M['langset'] 当前后台语言
* M['anyid'] 当前模块id
* M['met_editor'] 当前系统编辑器名称
* M['met_keywords'] 页面关键词
* M['url']['admin'] 后台文件夹路径
* M['url']['static']
* M['url']['static_vendor']
* M['url']['static2']
* M['url']['static2_vendor']
* M['url']['static2_plugin']
* M['url']['uiv2'] 模板框架v2路径
* M['url']['uiv2_css']
* M['url']['uiv2_js']
* M['url']['app'] 应用文件夹路径
* M['url']['pub'] 后台模块公用文件夹路径
* M['url']['epl'] 后台模块公用示例文件夹路径
* M['url']['ui'] 应用前后台公用UI文件app/system/include/piblic/ui/里面
* M['url']['own_form'] 当前页面程序地址
* M['url']['own_name'] 当前模块地址
* M['url']['own'] 当前模块后台路径
* M['url']['own_tem'] 当前页面模板路径
* M['url']['api'] app站点地址
* M['url']['editor'] 当前编辑器应用文件夹路径
*/
$(function(){
var myDate=new Date().getTime()
$.include(M.url.own_tem + 'js/appcheck.min.js?'+myDate);
$.ajax({
type: "GET",
url: M.url.own_name + 'c=ajax&a=doajaxcl&lang=' + M['langset'],
dataType: "jsonp",
async: false
}).done(function (data) {
CL = data;
});
var appfun = function () {
var $self = this;
//有序表处理
$.getJSON(M.url.own_name + 'c=ajax&a=dosequence&lang=' + M['langset'],{},function(json){});
//select2
if($('[data-plugin="select2"]').length) $self.select2(true);
//排期广告位选择
if($('.add_ap_list').length) $.include(M.url.own_tem + 'js/applan.js?'+myDate);
//表格重绘后回调
$('#tableslist').on( 'draw.dt', function ( e,settings ) {
if($('[data-plugin="alertify"]').length) $self.select2(false);
})
//单个时间初始化
if($('[data-plugin="alonetime"]').length) $self.alonetime();
//时间区段选择
if($('[data-plugin="datetosearch"]').length) $self.datepicker();
//导出功能
$(document).on('click','.backups',function (event) {
var my = $(this);
event.preventDefault();
my.parents('form').metSubmit(0);
var obj = my.parents("form").serialize(),href = my.data('url'),veaps = $('select[name="veaps"]').val();
// 单独给get传递增加veaps的值
if(!$self.isEmpty(veaps)) obj += '&jsadd_veaps=' + veaps.join(',');
window.location.href = href + '&' + obj;
})
//表格底部自定义按钮
$(document).on('click','[table-zdybtn]',function (event) {
var my = $(this),
$form = my.parents('form'),
typestr = my.data('submit_type');
event.preventDefault();
$self.ownsubmit($form,typestr);
if(my.data('plugin') != 'alertify'){
$form.submit();
return true;
}
})
//排序功能
if($('a.orderby-link').length) $self.orders();
//状态更改
// http://bsify.admui.com/alertify/ 中文说明
$(document).on('click','.btn-cursor-pointer', function () {
var self = $(this);
$.include(M['url']['static2_vendor'] + 'alertify/alertify.js', function () {
alertify
.okBtn("确定")
.cancelBtn("取消")
.confirm('确定更改状态吗?',function () {
$.getJSON(self.data('href'), function(json){
window.location.reload();
})
})
})
});
};
appfun.prototype = {
isEmpty: function (val) {
switch (typeof val) {
case 'undefined':
return true;
case 'string':
if (val.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0)
return true;
break;
case 'boolean':
if (!val)
return true;
break;
case 'number':
if (0 === val || isNaN(val))
return true;
break;
case 'object':
if (null === val || val.length === 0)
return true;
for (var i in val) {
return false;
}
return true;
}
return false;
},
select2:function(drawdt){
// drawdt true 执行默认操作 false 不执行
var $self = this,select = [];
//选择器
M['plugin']['select2'] = [
M['url']['static2_vendor'] + 'select2/select2.min.css',
M['url']['static2_vendor'] + 'select2/select2.full.min.js',
M['url']['static2_vendor'] + 'select2/i18n/zh-CN.js',
];
$.include(M['plugin']['select2'],function(){
$('[data-plugin="select2"]').each(function(indexs,item){
var _self = $(this),
defaults = _self.data('default'),
select2url = _self.data('select2-url') + '&'+ myDate;
select[indexs] = _self.select2({
placeholder: '输入搜索内容', //提示语
ajax: {
url: select2url,
dataType: 'jsonp',
delay: 500,
data: function (params) {
return {
querys: params.term, //search term
tname: _self.data('tname'), //指定简短表
fiend: _self.data('fiend'), //指定字段值
allnone: _self.data('allnone'), //是否只显示应用的值
source: _self.data('source'), //查看来源标记
condition: _self.data('condition') //查询限制条件
};
},
results: function (data, page) {
return {results: data.results};
}
}
});
//默认值处理
if(!$self.isEmpty(defaults) && drawdt == true){
$.getJSON(
select2url,
{
tname: _self.data('tname'), //指定简短表
fiend: _self.data('fiend'), //指定字段值
allnone: _self.data('allnone'), //是否只显示应用的值
source: _self.data('source'), //查看来源标记
condition: _self.data('condition'), //查询限制条件
default: defaults, //默认值
division: _self.data('division') //默认值分隔符
},
function(obj){
$.each(obj.results, function(index, ele) {
$.each(ele.children, function(indexop, eleop) {
var option = new Option(eleop.text, eleop.id, true, true);
select[indexs].append(option).trigger('change');
})
});
}
)
}
});
});
},
datepicker:function(){
var $self = this;
M['plugin']['datetimepicker']=[
M['url']['epl']+'time/jquery.datetimepicker.css',
M['url']['epl']+'time/jquery.datetimepicker.js'
];
$.include(M['plugin']['datetimepicker'], function () {
var starttime = $('#date_timepicker_start'),
endtime = $('#date_timepicker_end');
starttime.datetimepicker({
lang:M.synchronous=='cn'?'ch':'en',
timepicker:starttime.attr("data-day-type")==2?true:false,
format:starttime.attr("data-day-type")==2?'Y-m-d H:i:s':'Y-m-d',
// value:starttime.val()?starttime.val():'',
// onShow:function( ct ){
// this.setOptions({
// maxDate:endtime.val()?endtime.val():false
// })
// },
onSelectDate:function(ct,$i){
$self.tableaajx(starttime);
}
});
endtime.datetimepicker({
lang:M.synchronous=='cn'?'ch':'en',
timepicker:endtime.attr("data-day-type")==2?true:false,
format:endtime.attr("data-day-type")==2?'Y-m-d H:i:s':'Y-m-d',
// value:endtime.val()?endtime.val():'',
// onShow:function( ct ){
// this.setOptions({
// minDate:starttime.val()?starttime.val():false
// })
// },
onSelectDate:function(ct,$i){
$self.tableaajx(endtime);
}
});
})
},
alonetime:function(){
var $self = this;
M['plugin']['datetimepicker']=[
M['url']['epl']+'time/jquery.datetimepicker.css',
M['url']['epl']+'time/jquery.datetimepicker.js'
];
$.include(M['plugin']['datetimepicker'], function () {
var alonetime = $('[data-plugin="alonetime"]');
alonetime.datetimepicker({
lang:M.synchronous=='cn'?'ch':'en',
timepicker:alonetime.attr("data-day-type")==2?true:false,
format:alonetime.attr("data-day-type")==2?'Y-m-d H:i:s':'Y-m-d',
onSelectDate:function(ct,$i){
$self.tableaajx(alonetime);
}
});
});
},
tableaajx:function(timedom){
if(typeof datatable != 'undefined'){
var $this_datatable=timedom.parents('.dataTable'),
datatable_index=$this_datatable.index('.dataTable');
if(datatable_index<0) datatable_index=0;
datatable[datatable_index].ajax.reload();
}
},
orders:function(){
var $self = this;
$(document).on('click','a.orderby-link',function (event) {
var $this = $(this), arrow = $this.find(".orderby-arrow");
if(arrow.length){
if($this.find(".desc").length){
$self.orderby($this,'asc');
}else{
//还原
$self.orderby($this,'');
}
}else{
$self.orderby($this,'desc');
}
});
},
orderby(dom,type){
var $self = this;
//清楚所有排序
$("a.orderby-link").find(".orderby-arrow").remove();
$("a.orderby-link").next().val('');
//操作当前排序
if(type) dom.append('<span class="orderby-arrow '+type+'"></span>');
dom.next().val(type);
$self.tableaajx(dom);
},
ownsubmit:function($form,typestr){
// 插入submit_type字段
if($form.find('[name="submit_type"]').length) $form.append('<input type="hidden" name="submit_type" value=""/>');
$form.find('[name="submit_type"]').val(typestr);
// 插入表格的all_id字段
if($form.find('.dataTable').length){
var $table = $form.find('.dataTable'),
$checkbox = $table.find('tbody input[type="checkbox"][name="id"]:checked'),
all_id='';
$checkbox.each(function(index, el) {
all_id += all_id?','+$(this).val():$(this).val();
})
if(!$form.find('[name="all_id"]').length) $form.append('<input type="hidden" name="all_id"/>');
$form.find('[name="all_id"]').val(all_id);
}
}
};
APPFUN = new appfun();
//缓存
$.ajaxSetup({cache:false});
});

View File

@ -0,0 +1,72 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<div class="appmain">
<form method="POST" action="{$data.url.action}" target="_self" enctype="multipart/form-data">
<!--二级导航-->
{$data.nav_sub}
<div class="metadmin-fmbx">
<h3 class='example-title'>{$data.met_title}</h3>
<dl>
<dt><label class='form-control-label'>密码密钥</label></dt>
<dd class="form-group">
<div class="input-group">
<input type="text" name="k_passkey"
value="{$data.data.k_passkey}"
class="form-control"
placeholder='输入密码密钥'
required data-fv-notEmpty-message='不能为空'>
</div>
<span class="text-help m-l-10">巡查人员密钥验证凭证</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>签订相关人员</label></dt>
<dd class="form-group">
<select name='k_wid' class="form-control" data-plugin="select2"
data-select2-url="{$data.url.select}"
data-tname="workers"
data-fiend="id"
data-allnone="0"
data-source="add_contract_workers"
data-default="{$data.data.k_wid}"
data-placeholder="输入联系人姓名/电话"
data-division=","
required data-fv-notEmpty-message='不能为空'>
<option value=""></option>
</select>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>是否启用</label></dt>
<dd class="form-group">
<div class="radio-custom radio-primary radio-inline">
<input type="radio" id="k_state0" name="k_state" value='0' data-checked='{$data.data.k_state}'
required data-fv-notEmpty-message='不能为空' />
<label for="k_state0">禁用</label>
</div>
<div class="radio-custom radio-primary radio-inline">
<input type="radio" id="k_state1" name="k_state" value='1'/>
<label for="k_state1">启用</label>
</div>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>备注</label></dt>
<dd class="form-group">
<textarea name="k_text" rows="5" placeholder='备注描述' class='form-control m-r-10'>{$data.data.k_text}</textarea>
<span class="text-help">简短文字描述备注。</span>
</dd>
</dl>
<dl>
<dt></dt>
<dd>
<button type="submit" class='btn btn-primary'>保存</button>
</dd>
</dl>
</div>
</form>
</div>
<include file='sys_admin/foot_v2'/>

117
admin/templates/launch.php Normal file
View File

@ -0,0 +1,117 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<div class="add_ap_list">
<form method="POST" action="{$data.url.action}" enctype="multipart/form-data">
<!--二级导航-->
{$data.nav_sub}
<div class="metadmin-fmbx">
<h3 class='example-title'>订单信息:<span class="text-help">{$data.data.h_cid}{$data.data.l_hnumber}</span></h3>
<dl class="col-md-6 col-lg-6 col-6">
<dt><label class='form-control-label'>投放计划名称</label></dt>
<dd class="form-group">
<input type="text" name="l_title"
value="{$data.data.l_title}"
class="form-control"
required data-fv-notEmpty-message='不能为空'
placeholder='输入投放计划标题'>
<span class="text-help m-l-10">主要用来做标记区别</span>
</dd>
</dl>
<dl class="col-md-6 col-lg-6 col-6">
<dt><label class='form-control-label'>广告时间段</label></dt>
<dd class="form-group">
<!--合同开始时间-->
<input type="hidden" name="h_starttime" value="{$data.data.h_starttime}" data-table-search>
<!--合同结束时间-->
<input type="hidden" name="h_endtime" value="{$data.data.h_endtime}" data-table-search>
<div class="input-group">
<span class="input-group-addon">开始时间</span>
<input type="text" name="l_starttime" value="{$data.data.l_starttime}"
class="form-control w-150"
id="date_timepicker_start"
data-day-type="1"
data-table-search
data-plugin="datetosearch"
autocomplete="off">
<span class="input-group-addon">结束时间</span>
<input type="text" name="l_endtime" value="{$data.data.l_endtime}"
class="form-control w-150"
id="date_timepicker_end"
data-day-type="1"
data-table-search
data-plugin="datetosearch"
autocomplete="off">
</div>
<span class="text-help m-l-10">广告时间段不能超过订单时间段</span>
</dd>
</dl>
<dl class="col-md-4 col-lg-4 col-4">
<dt><label class='form-control-label'>广告进度状态</label></dt>
<dd class="form-group">
{$data.para.l_schedule_radio}
</dd>
</dl>
<dl class="col-md-4 col-lg-4 col-4">
<dt><label class='form-control-label'>广告类型</label></dt>
<dd class="form-group">
{$data.para.l_type_radio}
</dd>
</dl>
<dl class="col-md-4 col-lg-4 col-4">
<dt><label class='form-control-label'>投放计划备注</label></dt>
<dd class="form-group">
<textarea name="l_text" rows="3" placeholder='备注描述' class='form-control m-r-10'>{$data.data.l_text}</textarea>
<span class="text-help">简短文字描述备注。</span>
</dd>
</dl>
<h3 class='example-title'>广告位选择</h3>
</div>
<!-- 广告位-->
<div class="row m-t-5">
<div class="col-md-9 col-lg-9 col-9">
<div class="m-t-10 clearfix">
<!--广告位选择是否入库-->
<input type="hidden" name="nextstep" value="{$_M.form.nextstep}" data-table-search>
<input type="hidden" name="slid" value="{$_M.form.slid}" data-table-search>
<!--合同编号-->
<input type="hidden" name="l_hnumber" value="{$data.data.l_hnumber}" data-table-search>
<!--选择的广告位-->
<input type="hidden" name="l_enumber" value="{$data.data.l_enumber}" data-table-search>
<input type="hidden" name="l_selectenum" value="{$data.data.l_selectenum}" data-table-search>
<!--头部搜索-->
{$data.table.search}
</div>
<table class="dataTable table table-bordered table-hover table-striped w-full m-t-10" id="tables-list" data-table-ajaxurl="{$data.table.ajaxurl}" data-table-pagelength='15' data-plugin="selectable">
<thead>{$data.table.thead}</thead>
<tbody>
<tr>
<td colspan="{$data.table.tdcol}">
<div class="h-50 vertical-align text-xs-center"><div class="loader vertical-align-middle loader-default"></div></div>
</td>
</tr>
</tbody>
<tfoot>{$data.table.tfoot}</tfoot>
</table>
</div>
<div class="col-md-3 col-lg-3 col-3">
<!--显示选中项-->
<div class="metadmin-fmbx m-t-15 p-b-10">
<h3 class='example-title'>广告投放结果</h3>
<div class="h-700" data-plugin="scrollable" data-skin="scrollable-shadow">
<div data-role="container">
<div data-role="content">
<ul class="list-icons p-y-10 launchshow"></ul>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
<include file='sys_admin/foot_v2'/>

26
admin/templates/table.php Normal file
View File

@ -0,0 +1,26 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<form method="POST" action="{$data.url.action}" enctype="multipart/form-data">
<!--二级导航-->
{$data.nav_sub}
<div class="clearfix">
{$data.top.tips}
<!--头部搜索-->
{$data.table.search}
</div>
<table class="dataTable table table-bordered table-hover table-striped w-full m-t-10" id="tableslist" data-table-ajaxurl="{$data.url.ajaxurl}" data-table-pagelength='15' data-plugin="selectable">
<thead>{$data.table.thead}</thead>
<tbody>
<tr>
<td colspan="{$data.table.tdcol}">
<div class="h-50 vertical-align text-xs-center"><div class="loader vertical-align-middle loader-default"></div></div>
</td>
</tr>
</tbody>
<tfoot>{$data.table.tfoot}</tfoot>
</table>
</form>
<include file='sys_admin/foot_v2'/>

View File

@ -0,0 +1,22 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<div class="appmain">
<form method="POST" action="{$data.url.action}" target="_self" enctype="multipart/form-data">
<!--二级导航-->
{$data.nav_sub}
<div class="metadmin-fmbx">
<h3 class='example-title'>{$data.met_title}</h3>
<dl>
<dt></dt>
<dd>
<button type="submit" class='btn btn-primary'>提交</button>
</dd>
</dl>
</div>
</form>
</div>
<include file='sys_admin/foot_v2'/>

101
admin/templates/village.php Normal file
View File

@ -0,0 +1,101 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<div class="appmain">
<form method="POST" action="{$data.url.action}" target="_self" enctype="multipart/form-data">
<!--二级导航-->
{$data.nav_sub}
<div class="metadmin-fmbx">
<h3 class='example-title'>{$data.met_title}</h3>
<dl>
<dt><label class='form-control-label'>选择小区</label></dt>
<dd class="form-group">
<select name='v_name' class="form-control" data-plugin="select2"
data-select2-url="{$data.url.select}"
data-tname="{$data.tname}"
data-fiend="v_name"
data-allnone="3"
data-source="add_village"
data-default="{$data.data.v_name}"
data-placeholder="输入小区名"
required data-fv-notEmpty-message='不能为空'>
<option value=""></option>
</select>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>选择分类</label></dt>
<dd class="form-group">
{$data.para.v_type_radio}
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>小区地址</label></dt>
<dd>
<div data-plugin="select-linkage" data-select-url="{$data.url.city}" class="city-css form-group">
<select name="v_province" class="form-control m-r-5 prov" data-checked="{$data.data.v_province}"
required data-fv-notEmpty-message="不能为空"></select>
<select name="v_city" class="form-control m-r-5 city" data-checked="{$data.data.v_city}"
required data-fv-notEmpty-message="不能为空"></select>
<select name="v_district" class="form-control m-r-5 dist" data-checked="{$data.data.v_district}"
required data-fv-notEmpty-message="不能为空"></select>
</div>
<div class="form-group clearfix">
<input type="text" name="v_address" value="{$data.data.v_address}" placeholder="请输入详细地址" class="form-control"
required data-fv-notEmpty-message="不能为空">
</div>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>相关联系人</label></dt>
<dd class="form-group">
<select name='v_wid[]' class="form-control" multiple data-plugin="select2"
data-select2-url="{$data.url.select}"
data-tname="workers"
data-fiend="id"
data-allnone="0"
data-source="add_village_workers"
data-default="{$data.data.v_wid}"
data-placeholder="输入联系人姓名/电话"
data-division="," >
<option value=""></option>
</select>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>小区均价</label></dt>
<dd class="form-group">
<input type="text" name="v_price"
value="{$data.data.v_price}"
class="form-control"
required data-fv-notEmpty-message='不能为空'>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>社区居住规模</label></dt>
<dd class="form-group">
<input type="text" name="v_psize"
value="{$data.data.v_psize}"
class="form-control"
required data-fv-notEmpty-message='不能为空'>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>备注</label></dt>
<dd class="form-group">
<textarea name="v_text" rows="5" placeholder='备注描述' class='form-control m-r-10'>{$data.data.v_text}</textarea>
<span class="text-help">简短文字描述备注。</span>
</dd>
</dl>
<dl>
<dt></dt>
<dd>
<button type="submit" class='btn btn-primary'>保存</button>
</dd>
</dl>
</div>
</form>
</div>
<include file='sys_admin/foot_v2'/>

View File

@ -0,0 +1,50 @@
<?php
defined('IN_MET') or exit('No permission');
$met_title = $data['met_title'];
?>
<include file='sys_admin/head_v2'/>
<div class="appmain">
<form method="POST" action="{$data.url.action}" target="_self" enctype="multipart/form-data">
<!--二级导航-->
{$data.nav_sub}
<div class="metadmin-fmbx">
<h3 class='example-title'>{$data.met_title}</h3>
<dl>
<dt><label class='form-control-label'>职位</label></dt>
<dd class="form-group">
{$data.para.radio}
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>姓名</label></dt>
<dd class="form-group">
<input type="text" name="w_name"
value="{$data.data.w_name}"
class="form-control"
required data-fv-notEmpty-message='不能为空'>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>联系电话</label></dt>
<dd>
<input type="text" name="w_tel" value="{$data.data.w_tel}" data-plugin='tokenfield' data-delimiter=','/>
<span class="text-help m-l-10">可备注多个联系电话,输入完成一个回车后再输入下一个</span>
</dd>
</dl>
<dl>
<dt><label class='form-control-label'>备注</label></dt>
<dd class="form-group">
<textarea name="w_text" rows="5" placeholder='备注描述' class='form-control m-r-10'>{$data.data.w_text}</textarea>
<span class="text-help">简短文字描述备注。</span>
</dd>
</dl>
<dl>
<dt></dt>
<dd>
<button type="submit" class='btn btn-primary'>保存</button>
</dd>
</dl>
</div>
</form>
</div>
<include file='sys_admin/foot_v2'/>

168
admin/uninstall.class.php Normal file
View File

@ -0,0 +1,168 @@
<?php
defined('IN_MET') or exit ('No permission');
load::sys_func('file');
class uninstall {
private $appno; //应用NO值
private $m_name; //应用文件夹
private $del_dirs = []; //需要删除的文件夹,以根目录为准
public function __construct() {
global $_M;
$this->appno = $_M['form']['no']; //获取NO
//需要删除的文件名
$this->del_dirs[] = self::firstsql();
$this->del_dirs[] = $this->m_name?'app/app/'.$this->m_name:'';
//判断是否允许卸载
if(file_exists(PATH_ALL_APP. $this->m_name."/config/uninstall.lock")){
turnover("{$_M['url']['own_form']}a=doindex","禁止卸载");
}
}
public function dodel() {
global $_M;
//删除一些提前删除的内容
//删除自定义表
self::zdysql();
//删除固定的app表
self::appsql();
//删除应用文件
// $this->delfile();
}
//优先执行代码[推荐]
private function firstsql() {
global $_M;
//查询应用的文件夹
$mname = self::sqlone('applist');
$this->m_name = $mname['m_name'];
//查询应用是否使用栏目
$file = self::sqlone('column'," module='{$this->appno}' ");
return $file['foldername'];
}
//删除自定义表
private function zdysql() {
global $_M;
//公用表
$cloud = ['cloud_config'];
//自定义表
$table = file_get_contents(PATH_ALL_APP.$this->m_name.'/config/table');
$table = stringto_array($table,',');
//自定义表删除
$zdy = array_diff($table,$cloud);
$zdys = [];
foreach ($zdy as $val){
$zdys[] = $this->m_name.'_'.$val;
}
//删除公用表对应应用数据,并查询是否符合删除表的要求
foreach ($cloud as $val) {
//判断是否要删除
if(in_array($val, $table)) $zdys[] = self::cloud($val);
}
//删除表
foreach ($zdys as $val){
self::deltablesql($val);
}
//删除配置文件
del_table(arrayto_string($zdys,'|'));
}
//删除固定的app表
private function appsql() {
global $_M;
//删除栏目接口表
self::delsql('ifcolumn');
//删除应用生成文件所调用事件的信息表
self::delsql('ifcolumn_addfile');
//删除会员侧导航信息表
self::delsql('ifmember_left');
//删除应用插件表
self::delsql('app_plugin');
//删除网站后台栏目信息表
$where = "field='{$this->appno}'";
self::delsql('admin_column',$where);
//删除网站栏目信息表
$where = "module='{$this->appno}'";
self::delsql('column',$where);
//删除语言表
$where = "app='{$this->appno}'";
self::delsql('language',$where);
//删除应用注册表
self::delsql('applist');
}
//删除应用文件夹
private function delfile() {
foreach ($this->del_dirs as $dir){
if(file_exists(PATH_WEB.$dir) && $dir != null) deldir(PATH_WEB.$dir);
}
}
//对公用配置表卸载处理
private function cloud($tname) {
global $_M;
$where = "m_name='{$this->m_name}'";
if(self::sqlcounter($tname,$where) > 0){
self::delsql($tname,$where);
}
if(self::sqlcounter($tname) == 0){
return $tname;
}
}
//公共查询方法
private function sqlone($tname,$where = '') {
global $_M;
$table = $_M['table'][$tname];
if(!$where){
$where = "no='{$this->appno}'";
}
return DB::get_one("select * from {$table} where {$where}");
}
//公共查询方法
private function sqlcounter($tname,$where = '') {
global $_M;
$table = $_M['table'][$tname];
if($where){
$where = 'WHERE '.$where;
}
return DB::counter("{$table} {$where}");
}
//公共删除数据
private function delsql($tname,$where = '') {
global $_M;
$table = $_M['table'][$tname];
if(!$where){
$where = "no='{$this->appno}'";
}
DB::query("DELETE FROM {$table} WHERE {$where}");
}
//公共删除表
private function deltablesql($tname) {
global $_M;
$table = $_M['table'][$tname];
DB::query("DROP TABLE `{$table}`");
}
}
?>

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -0,0 +1,454 @@
<?php
defined('IN_MET') or exit('No permission');
load::sys_class('admin');
load::own_func('appcmp');
load::own_class('../traits/appcmp');
//后台类
class appadmin extends admin{
# URL上c的值
public $u_urlc;
# URL上a的值
public $u_urla;
# URL上的参数
public $u_para;
# 管理员权限
public $adop = ['met'=>false,'add'=>false,'del'=>false];
// 调用类
public $tsql;
public $cloud;
# 初始化
public function __construct() {
global $_M,$_YW;
parent::__construct();
//调试使用
ini_set("display_errors", "On");
error_reporting(E_ERROR);
$this->tsql = load::own_class('tsql','new');
self::cmp_load();
self::adminop();
$this->cloud = load::own_class('cloud','new');
}
use appcmp;
//调试使用
public function bug() {
$this->destruct = false;
}
# 后台导航
/*
* @$select string 最终菜单选项
* @$title string 当前页面标题
*/
public function appnav($select = '',$title = '') {
global $_M, $_YW;
if(is_array($select)) list($select,$title) = $select;
//当前的CA组合
$select = empty($select)?$_M['form']['c'].'__'.$_M['form']['a']:$select;
//导航公用参数
$glpara = [
'navon'=> $_M['form']['navon'],
];
/*
* 导航规则
*/
//key 为c值和a值组成可实现自动选择
//val 第一位是导航名称,第二位为传递的参数(array) 若第三位跳转的外链
$nav = [
'dzadsod__dodzadsod' => [
['统计中心'],
[
'dzadsod__dodzadsod' => ['总计界面'],
'table_on__dovillages' => ['小区统计'],
'table_on__doelevators' => ['广告位统计'],
'table_on__doschedule' => ['排期查询'],
]
],
'table_on__docontract' => [
['运营中心'],
[
'table_on__docontract' => ['订单管理'],
'table_on__dolaunch' => ['投放计划'],
// 'info_on__douplaunch' => ['调整投放'],
'table_on__docustomer' => ['合作企业'],
'table_on__doworkers' => ['企业联系人'],
'table_on__dokeylist' => ['巡查人员'],
]
],
'table_on__doelevator' => [
['资源管理'],
[
'table_on__doelevator' => ['广告位'],
'table_on__dovillage' => ['合作小区']
]
],
'config__doindex' => [
['配置参数'],
[
'config__doindex' => ['基础配置'],
'table_on__dopara' => ['参数列表']
]
],
'index__doindex' => [
['更新检测',['check' => 1] ]
]
];
$i = 0;
foreach ($nav as $key => $val) {
list($info,$sub) = $val;
//判断是否执行当前二级目录
$li = '';
if(is_array($info) && ($select == $key || array_key_exists($select, $sub)) ){
//执行二级目录的操作
$sub = array_merge([$key => $info ],$sub);
foreach ($sub as $skey => $sval){
if($key == $skey) $sval = array_replace($info,$sval);
//执行一级目录的操作
list($sname,$surl) = self::nav_para($skey,$sval,$glpara);
//二级选项和页面title
$active = '';
if($select == $skey) {
$select = $key;
$active = 'active';
$this->input['met_title'] = empty($title)?$sname:$title;
}
//二级导航HTML
$li .= "<li class='nav-item'><a class='nav-link {$active}' href='{$surl}'>{$sname}</a></li>";
}
$this->input['nav_sub'] = empty($li)?'':'<div class="m-t-10 app-sub-nav"><ul class="p-b-10 nav nav-tabs nav-tabs-line">'.$li.'</ul></div>';
}
//执行一级目录的操作
if(!is_array($info)) $info = $val;
list($name,$url) = self::nav_para($key,$info,$glpara);
//填充HTML
nav::set_nav($i, $name, $url);
$select_nav[$key] = $i;
//页面title
if($select == $key && empty($this->input['met_title'])) $this->input['met_title'] = empty($title)?$name:$title;
$i++;
}
//指定当前方法属于哪个主导航
if(array_key_exists($select, $nav)) nav::select_nav($select_nav[$select]);
}
//导航NAME和URL
private function nav_para($key,$info,$glpara){
global $_M,$_YW;
//合并c和a
list($c,$a) = stringto_array($key,'__');
//合并默认参数值
$arr = array_merge(['c' => $c, 'a' => $a ],$glpara);
list($name,$para,$links) = $info;
//判断是否有设置单独的参数,有则增加
if(is_array($para)) $arr = array_merge($arr,$para);
//生成URL
$url = empty($links)?$_M['url']['own_name']:$links;
return [$name, self::http_build_query($url,$arr)];
}
#URL上c的值 a的值
#$appshow 全局模板文件,指整个文件的模板
public function point($c,$a,$appshow = '') {
global $_M,$_YW;
$this->u_urlc = $c;
$this->u_urla = $a;
if(!empty($appshow)) $this->appshow = 'app/'.$appshow;
}
#URL处理
#$appshow 单独定义模板 某个方法内定义
public function appurl($tname = '',$query = [],$appshow = '') {
global $_M,$_YW;
//数据库表简写
$this->tname = empty($tname)?self::tname():$tname;
//URL参数
if(!is_array($query)) $query = [$query];
$query['tname'] = $this->tname;
$this->u_para = '&'.http_build_query($query);
//URL
$this->input['url'] = [
'action' => $_M['url']['own_name']."c={$this->u_urlc}&a={$this->u_urla}".$this->u_para, // 表单提交URL
'ajaxurl' => $_M['url']['own_name']."c=table_ajax&a={$this->u_urla}".$this->u_para, // table数据获取URL
'addlist' => $_M['url']['own_name'].'c=table_ajax&a=do_table_add_list'.$this->u_para, // table新增行URL
'backup' => $_M['url']['own_name'].'c=backups&a=doindex'.$this->u_para, // table备份URL
'select' => $_M['url']['own_name'].'c=select&a=doselect' // 下拉选择器
];
$this->input['tname'] = $this->tname;
$_YW['url'] = $this->input['url'];
if(!empty($appshow)) $this->appshow = 'app/'.$appshow;
}
//权限
private function adminop() {
global $_M,$_YW;
$admin_op = background_privilege();
$adminop = array_filter(explode('-',$admin_op['admin_op']));
//1查看 【不勾选任何的操作即可实现】
//2编辑 不含删除 【不勾选删除权限即可实现】
//3不限制权限 【全部勾选即可】
if(in_array('metinfo', $adminop)){
$this->adop = ['met'=>true,'add'=>true,'del'=>true];
}else{
if(in_array('add', $adminop) || in_array('editor', $adminop)){
$this->adop['add'] = true;
}
if(in_array('del', $adminop)){
$this->adop['del'] = true;
}
if($this->adop['add'] && $this->adop['del']){
$this->adop['met'] = true;
}
}
$_YW['aop'] = $this->adop;
}
//添加设置参数HTML
public function setparahtml($ptype = 0,&$html) {
global $_M,$_YW;
$addparaurl = $_M['url']['own_name'].'c=table_on&a=dopara&p_type='.$ptype;
$html .= '<span class="text-help m-l-10"><a target="_blank" href="'.$addparaurl.'">设置选项</a></span>';
}
//参数单选组成
public function para_radio($para,$name,$checked,&$html,$exists = false) {
global $_M,$_YW;
$html = '';
$first = 'data-checked="'.$checked.'" required data-fv-notEmpty-message="不能为空"';
foreach ($para as $key => $val) {
if($exists) {
list($p_name,$p_value,$p_text) = $val;
}else{
extract($val);
}
$html .= '<div class="radio-custom radio-primary radio-inline">
<input type="radio" id="'.$name.$key.'" name="'.$name.'" value="'.$p_value.'" '.$first.' />
<label for="'.$name.$key.'">'.$p_name.'</label>
<span class="text-help m-l-10">'.$p_text.'</span>
</div>';
$first = '';
}
return $this;
}
//参数单选组成
public function para_checkbox($para,$name,$checked,&$html,$exists = false) {
global $_M,$_YW;
$html = '';
$first = 'data-checked="'.$checked.'" required data-fv-notEmpty-message="不能为空" '; // data-delimiter="," 因为暂时无效
foreach ($para as $key => $val) {
if($exists) {
list($p_name,$p_value,$p_text) = $val;
}else{
extract($val);
}
$html .= '<div class="checkbox-custom checkbox-primary checkbox-inline">
<input type="checkbox" id="'.$name.$key.'" name="'.$name.'" value="'.$p_value.'" '.$first.' />
<label for="'.$name.$key.'">'.$p_name.'</label>
<span class="text-help m-l-10">'.$p_text.'</span>
</div>';
$first = '';
}
return $this;
}
//参数处理
public function translate($p_type = 0) {
global $_M,$_YW;
$para = self::paralist($p_type);
return array_combine(array_column($para,'p_value'), array_column($para,'p_name'));
}
//小区名称
public function villagelist($id,$key = 'v_name') {
global $_M,$_YW;
$village = $this->tsql->table('village')->where(['id' => $id])->one();
return $village[$key];
}
//公司名称
public function customerlist($id,$key = 'c_allname') {
global $_M,$_YW;
$customer = $this->tsql->table('customer')->where(['id' => $id])->one();
return $customer[$key];
}
//相关人员
public function workerslist($id,$key = 'w_name') {
global $_M,$_YW;
$workers = $this->tsql->table('workers')->where(['id' => $id])->one();
return $key == false?$workers:$workers[$key];
}
//返回广告位对照地址
public function e_address($elevator) {
global $_M,$_YW;
//楼号
$e_bno = self::paralist(['p_type' => 3, 'p_value' => $elevator['e_bno'] ]);
//单元号
$e_uno = self::paralist(['p_type' => 4, 'p_value' => $elevator['e_uno'] ]);
//电梯号
$e_eno = self::paralist(['p_type' => 5, 'p_value' => $elevator['e_eno'] ]);
//广告位置
$e_aps = self::paralist(['p_type' => 0, 'p_value' => $elevator['e_aps'] ]);
//小区
$e_vid = self::villagelist($elevator['e_vid']);
return "{$elevator['e_number']}".$e_vid.$e_bno['p_name'].$e_uno['p_name'].$e_eno['p_name'].$e_aps['p_name'];
}
//字段颜色
public function state_color($state,$array = []) {
global $_M,$_YW;
$color = ['red-600','green-600','purple-600'];
$str = count($array) > 0?$array:['无效','有效'];
return '<font class="'.$color[$state].'">'.$str[$state].'</font>';
}
//字体颜色
public function str_color($state,$str,$weight = 'unset') {
global $_M,$_YW;
$color = ['red-600','green-600','cyan-600','blue-600'];
return '<font class="'.$color[$state].' font-weight-'.$weight.'">'.$str.'</font>';
}
//标签形式的分割显示
public function tab_tokenfield($ver,$type = 0,$decollator = ',',$length = 0) {
global $_M,$_YW;
$class = ['tag-default','tag-primary','tag-warning'];
$array = stringto_array($ver,$decollator);
$i = 0;
foreach ($array as $val) {
$html .= '<span class="tag tag-sm '.$class[$type].'">'.$val.'</span> ';
$i++;
if($length > 0 && $length == $i) break;
}
return $html;
}
//广告位的合同编号
public function e_state($title) {
global $_M,$_YW;
$class = ['tag-danger','tag-primary'];
$title = $title > 0?'已租赁':'空置';
$type = $title > 0?1:0;
return '<span class="tag tag-sm '.$class[$type].'">'.$title.'</span> ';
}
//参数的对应值获取
public function paralist($p_type = 0) {
global $_M,$_YW;
$this->tsql->table('para')
->where(is_array($p_type)?$p_type:['p_type' => $p_type])
->order('p_order DESC');
return is_array($p_type)?$this->tsql->one():$this->tsql->all();
}
//转化字符串形式
public function strchange($strarr = []) {
global $_M,$_YW;
foreach($strarr as $val) {
if($val != null) $idstr[] = "'{$val}'";
}
return arrayto_string($idstr,',');
}
//广告位状态变更
public function type_onoff($field,$value,$id,$array = ['无效','有效']) {
global $_M,$_YW;
$color = ['tag-danger','tag-success'];
$url = $_M['url']['own_name']."c=table_off&a=doindex&submit_type=typeonoff&field={$field}&all_id={$id}&tname={$this->tname}&method=ajax";
return '<span data-href="'.$url.'" class="btn-cursor-pointer tag tag-sm tag-outline '.$color[$value].'" >'.$array[$value].'</span>';
}
//处理多选的ID
public function where_id(&$where) {
global $_M,$_YW;
$allid = array_filter(stringto_array($_M['form']['all_id'],','));
if($allid){
if($where) $where .= " AND ";
$idstr = self::strchange($allid);
switch ($this->tname) {
case 'elevators':
$where .= " el.e_number IN({$idstr}) ";
break;
case 'villages':
$where .= " vi.id IN({$idstr}) ";
break;
default:
break;
}
}
}
// 对现有广告位进行裂变,已经不再需要
public function fission() {
global $_M,$_YW;
//获取所有广告位
$elevator = $this->tsql->table('elevator')->all();
//划定什么位置裂变成什么 1裂变出2
$e_aps = [
'1' => 4,
'2' => 5,
'3' => 6,
];
//拼装数据
foreach ($elevator as $val) {
//计算广告位编号
$neweaps = $e_aps[$val['e_aps']];
self::e_number($val['e_number'],$neweaps);
$field = [
'e_number' => $val['e_number'],
'e_vid' => $val['e_vid'],
'e_bno' => $val['e_bno'],
'e_uno' => $val['e_uno'],
'e_eno' => $val['e_eno'],
'e_aps' => $neweaps,
'e_size' => $val['e_size'],
'e_enable' => $val['e_enable'],
'e_label' => $val['e_label'],
'e_text' => $val['e_text']
];
$this->tsql->table('elevator')
->field($field)
->add();
}
}
//对字符串处理
public function e_number(&$num,$neweaps,$type = false) {
global $_M,$_YW;
if($type) $neweaps++;
//新的编号
$enum = $num.$neweaps;
//验证
$elevator = $this->tsql->table('elevator')->where(['e_number' => $enum ])->one();
if($elevator == false){
$num = $enum;
}else{
self::e_number($num,$neweaps,true);
}
}
}
?>

View File

@ -0,0 +1,365 @@
<?php
defined('IN_MET') or exit('No permission');
load::sys_class('web');
load::own_class('../traits/appcmp');
//前台类
class appweb extends web {
//开始时间
public $time;
public $datetime;
// 调用类
public $tsql;
public $cloud;
public $href;
public $sign = true;
//微信通知参数
public $webase;
public $postdata = [];
public $tem_id = '';
public function __construct() {
global $_M, $_YW;
parent::__construct();
self::cmp_load();
self::loadp('cmp_a,cmp_ac');
//开始时间
$this->time = time();
$this->datetime = self::data_time($this->time);
$this->tsql = load::own_class('tsql','new');
$this->cloud = load::own_class('cloud','new');
// self::basics();
ini_set("display_errors", "On");
error_reporting(E_ERROR);
}
use appcmp;
//生成CSS
public function metcss() {
global $_M,$_YW;
$metcss = PATH_APP_FILE.'web/templates/met/css/metinfo.css';
if(!file_exists($metcss)) self::merge_css();
}
//前台常用信息
protected function basics() {
global $_M,$_YW;
$this->input['appcore'] .= ' data-m_name="'.$this->m_name.'" ';
$this->input['appcore'] .= ' data-own_name="'.$_M['url']['own_name'].'" ';
}
//合同内容
public function postdata($type,$arr) {
global $_M, $_YW;
//清理缓存
$this->postdata = [];
$this->tem_id = '';
//微信模板
switch ($type) {
case 1:
//预约到期提醒
//模板ID
$this->tem_id = $_YW['c']['tem_ida'];
//内容
$this->postdata = [
//开头 提醒的内容
'first' => ['value' => $arr['first']['value'], 'color' => $arr['first']['color'] ],
// 合同开始日期
'keyword1' => ['value' => $arr['h_starttime'] ],
// 合同结束日期
'keyword2' => ['value' => $arr['h_endtime'] ],
//结尾
'remark' => ['value' =>
"合同编号:{$arr['h_number']}".PHP_EOL
."签定企业:{$arr['c_allname']}".PHP_EOL
."相关人员:{$arr['wnamestr']}".PHP_EOL
."提醒时间:{$this->datetime}"
],
];
break;
case 2:
//合同到期提醒
//模板ID
$this->tem_id = $_YW['c']['tem_idb'];
//内容
$this->postdata = [
//开头 提醒的内容
'first' => ['value' => $arr['first']['value'], 'color' => $arr['first']['color'] ],
// 合同编号
'keyword1' => ['value' => $arr['h_number'] ],
// 合同开始日期
'keyword2' => ['value' => $arr['h_starttime'] ],
// 合同结束日期
'keyword3' => ['value' => $arr['h_endtime'] ],
//结尾
'remark' => ['value' =>
"签定企业:{$arr['c_allname']}".PHP_EOL
."相关人员:{$arr['wnamestr']}".PHP_EOL
."通知时间:{$this->datetime}"
],
];
break;
case 3:
//汇总数据通知
//模板ID
$this->tem_id = $_YW['c']['tem_idc'];
//内容
$this->postdata = [
//开头 提醒的内容
'first' => ['value' => '合同提醒汇总结果,请登录后台查看详情', 'color' => '#BDBDBD'],
// 合同编号
'keyword1' => ['value' => '山东梯美广告有限公司' ],
// 合同开始日期
'keyword2' => ['value' => $this->datetime ],
// 合同结束日期
'keyword3' => ['value' => array_sum($arr) ],
//结尾
'remark' => ['value' =>
"定时提醒:{$arr['daya']}".PHP_EOL
."三天到期:{$arr['dayb']}".PHP_EOL
."今天到期:{$arr['dayc']}".PHP_EOL
."今天投放开始总数:{$arr['dayd']}"
],
];
break;
default:
break;
}
return $this;
}
//微信模板消息发送wesend
public function openid($openid = '')
{
global $_M, $_YW;
$openid .= ','.$_YW['c']['openid'];
$openid = stringto_array($openid,',');
foreach ($openid as $id) {
if($id) self::temmsg($id);
}
return $this;
}
//微信合同到期提醒
private function temmsg($openid)
{
global $_M, $_YW;
$return = ['errcode' => -1, 'errmsg' => "系统错误用户openid{$openid}消息模板Tem_id{$this->tem_id}"];
if($openid && $this->tem_id){
$return = $this->webase->post_template_msg($openid, $this->tem_id, '', $this->postdata);
}
$json = is_array($return)?json_encode($return,JSON_UNESCAPED_UNICODE):$return;
//发送记录
$field = [
'openid' => $openid,
'text' => $this->postdata['first']['value'],
'content' => json_encode($this->postdata,JSON_UNESCAPED_UNICODE),
'returntext' => $json,
'state' => $return['errcode'] == 0?1:0,
'exetime' => $this->datetime,
'addtime' => $this->datetime
];
$this->tsql->table('welog')->field($field)->add();
return $return;
}
//参数处理
public function translate($p_type = 0) {
global $_M,$_YW;
$para = self::paralist($p_type);
return array_combine(array_column($para,'p_value'), array_column($para,'p_name'));
}
//小区名称
public function villagelist($id,$key = 'v_name') {
global $_M,$_YW;
$village = $this->tsql->table('village')->where(['id' => $id])->one();
return $village[$key];
}
//公司名称
public function customerlist($id,$key = 'c_allname') {
global $_M,$_YW;
$customer = $this->tsql->table('customer')->where(['id' => $id])->one();
return $customer[$key];
}
//相关人员
public function workerslist($id,$key = 'w_name') {
global $_M,$_YW;
$workers = $this->tsql->table('workers')->where(['id' => $id])->one();
return $key == false?$workers:$workers[$key];
}
//返回广告位对照地址
public function e_address($elevator) {
global $_M,$_YW;
//楼号
$e_bno = self::paralist(['p_type' => 3, 'p_value' => $elevator['e_bno'] ]);
//单元号
$e_uno = self::paralist(['p_type' => 4, 'p_value' => $elevator['e_uno'] ]);
//电梯号
$e_eno = self::paralist(['p_type' => 5, 'p_value' => $elevator['e_eno'] ]);
//广告位置
$e_aps = self::paralist(['p_type' => 0, 'p_value' => $elevator['e_aps'] ]);
//小区
$e_vid = self::villagelist($elevator['e_vid']);
return "{$elevator['e_number']}".$e_vid.$e_bno['p_name'].$e_uno['p_name'].$e_eno['p_name'].$e_aps['p_name'];
}
//字段颜色
public function state_color($state,$array = []) {
global $_M,$_YW;
$color = ['red-600','green-600','purple-600'];
$str = count($array) > 0?$array:['无效','有效'];
return '<font class="'.$color[$state].'">'.$str[$state].'</font>';
}
//字体颜色
public function str_color($state,$str,$weight = 'unset') {
global $_M,$_YW;
$color = ['red-600','green-600','cyan-600','blue-600'];
return '<font class="'.$color[$state].' font-weight-'.$weight.'">'.$str.'</font>';
}
//标签形式的分割显示
public function tab_tokenfield($ver,$type = 0,$decollator = ',',$length = 0) {
global $_M,$_YW;
$class = ['tag-default','tag-primary','tag-warning'];
$array = stringto_array($ver,$decollator);
$i = 0;
foreach ($array as $val) {
$html .= '<span class="tag tag-sm '.$class[$type].'">'.$val.'</span> ';
$i++;
if($length > 0 && $length == $i) break;
}
return $html;
}
//广告位的合同编号
public function e_state($title) {
global $_M,$_YW;
$class = ['tag-danger','tag-primary'];
$title = $title > 0?'已租赁':'空置';
$type = $title > 0?1:0;
return '<span class="tag tag-sm '.$class[$type].'">'.$title.'</span> ';
}
//参数的对应值获取
public function paralist($p_type = 0) {
global $_M,$_YW;
$this->tsql->table('para')
->where(is_array($p_type)?$p_type:['p_type' => $p_type])
->order('p_order DESC');
return is_array($p_type)?$this->tsql->one():$this->tsql->all();
}
//转化字符串形式
public function strchange($strarr = []) {
global $_M,$_YW;
foreach($strarr as $val) {
if($val != null) $idstr[] = "'{$val}'";
}
return arrayto_string($idstr,',');
}
//广告位状态变更
public function type_onoff($field,$value,$id,$array = ['无效','有效']) {
global $_M,$_YW;
$color = ['tag-danger','tag-success'];
$url = $_M['url']['own_name']."c=table_off&a=doindex&submit_type=typeonoff&field={$field}&all_id={$id}&tname={$this->tname}&method=ajax";
return '<span data-href="'.$url.'" class="btn-cursor-pointer tag tag-sm tag-outline '.$color[$value].'" >'.$array[$value].'</span>';
}
//处理多选的ID
public function where_id(&$where) {
global $_M,$_YW;
$allid = array_filter(stringto_array($_M['form']['all_id'],','));
if($allid){
if($where) $where .= " AND ";
$idstr = self::strchange($allid);
switch ($this->tname) {
case 'elevators':
$where .= " el.e_number IN({$idstr}) ";
break;
case 'villages':
$where .= " vi.id IN({$idstr}) ";
break;
default:
break;
}
}
}
// 对现有广告位进行裂变,已经不再需要
public function fission() {
global $_M,$_YW;
//获取所有广告位
$elevator = $this->tsql->table('elevator')->all();
//划定什么位置裂变成什么 1裂变出2
$e_aps = [
'1' => 4,
'2' => 5,
'3' => 6,
];
//拼装数据
foreach ($elevator as $val) {
//计算广告位编号
$neweaps = $e_aps[$val['e_aps']];
self::e_number($val['e_number'],$neweaps);
$field = [
'e_number' => $val['e_number'],
'e_vid' => $val['e_vid'],
'e_bno' => $val['e_bno'],
'e_uno' => $val['e_uno'],
'e_eno' => $val['e_eno'],
'e_aps' => $neweaps,
'e_size' => $val['e_size'],
'e_enable' => $val['e_enable'],
'e_label' => $val['e_label'],
'e_text' => $val['e_text']
];
$this->tsql->table('elevator')
->field($field)
->add();
}
}
//对字符串处理
public function e_number(&$num,$neweaps,$type = false) {
global $_M,$_YW;
if($type) $neweaps++;
//新的编号
$enum = $num.$neweaps;
//验证
$elevator = $this->tsql->table('elevator')->where(['e_number' => $enum ])->one();
if($elevator == false){
$num = $enum;
}else{
self::e_number($num,$neweaps,true);
}
}
}
?>

View File

@ -0,0 +1,121 @@
<?php
defined('IN_MET') or exit('No permission');
//所有公用方法
class cloud{
public $tsql;
public function __construct() {
global $_M, $_YW;
$this->tsql = load::own_class('tsql','new');
}
/*
* 把数组转成JSON用于ajax返回可以用于普通json请求返回也可以用于跨域的ajax的jsonp格式的数据请求返回。
* @param array $back 输出字符串或数组
* @param string $callback ajax的回调函数的名称
*/
public function jsoncallback($back, $callback = 'callback') {
global $_M;
header('Content-type: application/x-javascript');
$callback = $_M['form'][$callback];
$json = json_encode($back,JSON_UNESCAPED_UNICODE);
echo $callback?$callback . '(' . $json . ')':$json;
}
//城市信息
public function citydata() {
global $_M,$_YW;
$dirfile = PATH_APP_FILE.'public/js/city/city.min.json';
if (!file_exists($dirfile)){
$citys = json_decode(file_get_contents(PATH_SYS."include/static2/vendor/select-linkage/citydata.min.json"),true);
$i = 0;
$array = [];
foreach ($citys['citylist'] as $key => $val) {
if(version_compare($_M['config']['metcms_v'],'6.2.0','>=')){
$val['p'] = substr($val['p'],0,stripos($val['p'],'('));
$array[$key] = $val;
}else{
foreach ($val as $pkey => $pval) {
array_unshift($pval,['n'=>'请选择']);
if(array_level($pval) == 4){
foreach ($pval as $akey => $aval) {
if(array_level($aval['a']) == 2) array_unshift($aval['a'],['s'=>'请选择']);
$array[$key][$pkey][$akey] = $aval;
}
//跳过
continue;
}
$array[$key][$pkey] = $pval;
}
}
}
$citydata = ['citylist'=>$array];
//生成缓存
$jsonstr = json_encode($citydata,JSON_UNESCAPED_UNICODE);
load::sys_func('file');
makefile($dirfile);
file_put_contents($dirfile, $jsonstr);
$citystr = self::jsoncallback($citydata);
}else{
$citystr = file_get_contents($dirfile);
}
//返回信息
echo $citystr;
}
public function city_url() {
global $_M,$_YW;
$dirfile = PATH_APP_FILE.'public/js/city/city.min.json';
if(file_exists($dirfile)){
$url = $_M['url']['app']."{$_YW['n']}/public/js/city/city.min.json";
}else{
$url = class_exists('appadmin')?$_M['url']['own_name']."c=ajax&a=docitys":$_M['url']['own_name']."c=index&a=docitys";
}
return $url;
}
//计算时间相差天数
public function summary() {
global $_M,$_YW;
$summoney = $this->tsql->table('contract')->qfield(" Sum(h_tprice) as tprice ")->where(" h_tprice IS NOT NULL ")->one();
return [
'village' => $this->tsql->table('village')->count(),
'elevator' => $this->tsql->table('elevator')->count(),
'vfree' => $this->tsql->table_unset()
->tables(['elevator','el'], 'LEFT JOIN')
->tables(['launch','la'], 'ON find_in_set( el.e_number, la.l_enumber )')
->where(" la.l_endtime < CURDATE() OR la.l_starttime > CURDATE() OR la.id IS NULL ")
->count(" distinct e_number "),
'vlease' => $this->tsql->table_unset()
->tables(['elevator','el'], 'LEFT JOIN')
->tables(['launch','la'], 'ON find_in_set( el.e_number, la.l_enumber )')
->where(" NOT(la.l_endtime < CURDATE() OR la.l_starttime > CURDATE() ) ")
->count(" distinct e_number "),
'vendday' => $this->tsql->table_unset()
->tables(['elevator','el'], 'LEFT JOIN')
->tables(['launch','la'], 'ON find_in_set( el.e_number, la.l_enumber )')
->where(" la.l_endtime BETWEEN CURDATE( ) AND date_add( CURDATE( ), INTERVAL 7 DAY ) ")
->count(" distinct e_number "),
'vprerow' => $this->tsql->table_unset()
->tables(['elevator','el'], 'LEFT JOIN')
->tables(['launch','la'], 'ON find_in_set( el.e_number, la.l_enumber )')
->where(" la.l_starttime > CURDATE() ")
->count(" distinct e_number "),
'contract' => $this->tsql->table('contract')->count(),
'launch' => $this->tsql->table('launch')->count(),
'endcontract' => $this->tsql->table('contract')->where(" h_endtime < CURDATE() ")->count(),
'endlaunch' => $this->tsql->table('launch')->where(" l_endtime < CURDATE() ")->count(),
'customer' => $this->tsql->table('customer')->count(),
// 'workers' => $this->tsql->table('workers')->count(),
'summoney' => intval($summoney['tprice']),
];
}
}
?>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,111 @@
<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
defined('IN_MET') or exit('No permission');
/**
* 表格数据获取类
* @param array $rearray 表格数组返回数组
*/
class tabledata {
protected $rearray;
public $error;
/**
* 获取表查询数据
* @param string $table 表名
* @param string $field 表字段
* @param string $where where条件
* @param string $order order by条件
* @param string $sql 自定义SQL语句
* @return array 查询数据
*/
public function getdata($table, $field = '*', $where = '', $order = '', $sql = '',$multi_table = false) {
global $_M;
//dump( $_M['form']);
/* 获取表格ajax传递的参数 */
$length = $_M['form']['length']; //每页显示数量
$start = $_M['form']['start']; //读取数据的起点
$draw = $_M['form']['draw']; //累计执行次数,无作用但必须回传
// if($_M['form']['tablepage_json']&&$start==0&&$draw!=1){
// $cook = explode("|",$_M['form']['tablepage_json']) ;
// $u = "{$_M['form']['n']},{$_M['form']['c']},{$_M['form']['a']}";
// if($cook[1]==$u){
// $start = $cook[0]*$_M['form']['length'];
// }
// }else{
// met_setcookie('tablepage_json', $_M['form']['start']/$_M['form']['length']."|{$_M['form']['n']},{$_M['form']['c']},{$_M['form']['a']}");
// }
if (!$sql) {
/* 查询表 */
if ($where) {
$conds .= " WHERE {$where} ";
}
if ($order) {
$conds .= " ORDER BY {$order} ";
}
//整理查询条件
$query = "SELECT {$field} FROM {$table} {$conds} LIMIT {$start},{$length}"; //mysql语句
$array = DB::get_all($query); //执行查询,获得数组
$error = DB::error();
if ($error) {
$this->error = $query . "<br />" . $error;
} else {
$this->error = '';
}
$total = DB::counter($table, $conds, '*'); //获取总数量,计算总页数
} else {
//用来解决sql语句复杂的情况下 无法正确计算总条数的BUG
$query = $sql . " LIMIT {$start},{$length}";
$array = DB::get_all($query);
$error = DB::error();
$this->error = $error?$query . "<br />" . $error:0;
//总数
$where = trim($where);
if (strtolower(substr($where, 0, 5)) != 'where' && $where) $where = "WHERE " . $where;
$countsql = " SELECT COUNT(*) FROM {$table} {$where} ";
if($multi_table) $countsql = " SELECT count(*) FROM ($sql) num ";
$result = DB::query($countsql);
$fetch_row = DB::fetch_row($result);
$total = $fetch_row[0];
}
/* 回传数组处理 */
$this->rarray = array();
$this->rarray['draw'] = $draw; //回传执行次数
$this->rarray['recordsTotal'] = $total; //回传总数量
$this->rarray['recordsFiltered'] = $total; //回传筛选过的总数量,暂无作用,但必须回传
// if(class_exists('admin') || class_exists('app')){
$this->rarray['sql'] = $query; //返回sql语句
$this->rarray['array'] = $array; //返回sql语句
$this->rarray['form'] = $_M['form']; //返回sql语句
$this->rarray['sqlse'] = $sql; //返回sql语句
$this->rarray['sqltotal'] = $countsql; //返回sql语句
// }
return $array;
}
/**
* 把处理后的数组已json方式输出到页面上供AJAX读取。
* @param array $rdata 需要转成json的数组
*/
public function rdata($rdata) {
if ($rdata) {
$this->rarray['data'] = $rdata;
} else {
$this->rarray['data'][''] = '';
}
jsoncallback($this->rarray); //回传json格式
}
}
# This program is an open source system, commercial use, please consciously to purchase commercial license.
# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rights reserved.
?>

View File

@ -0,0 +1,387 @@
<?php
defined('IN_MET') or exit('No permission');
# 数据结构处理
class tsql {
private $sql = [];
private $m_name = M_NAME;
private $special = [];
private $ufield = [];
private $query;
private $multi_table = false; //采用分组才会采用子查询计算总数
public function __construct() {
global $_M;
self::table_unset();
}
# 清空
public function table_unset() {
global $_M;
unset($this->sql, $this->special,$this->ufield);
return $this;
}
# 数据库
# $sign false 不添加应用文件名前缀
public function table($tname,$sign = true) {
global $_M;
self::table_unset();
$this->sql['table'] = self::full_table_name($tname,$sign);
return $this;
}
# 多表联合查询数据库,制作表的联合方式,通过多次调用来实现
# $tname 包含缩写数据名和 缩写名
# $join 数据库连接方式
# $sign false 不添加应用文件名前缀
#
public function tables($tname = [],$join = '',$sign = true) {
global $_M;
list($name,$ab) = $tname;
$table = self::full_table_name($name,$sign);
$this->sql['table'] .= $table." AS {$ab} {$join} ";
return $this;
}
# 需要特殊处理的值例如counts+1 等类似的 或者执行函数
# 传入的为特殊处理的值,并 非字段名
public function special($_special) {
global $_M;
$this->special = is_array($_special)?$_special:[$_special];
return $this;
}
# 需要删除的字段,仅支持约束条件下
# 目前仅用于adup()时的 unique() 方法
public function ufield($_field = '') {
global $_M;
$this->ufield = is_array($_field)?$_field:[$_field];
return $this;
}
# 查询字段
# 查询或者多条插入信息
public function qfield($_field = '*') {
global $_M;
if(is_array($_field)) $_field = arrayto_string($_field, ',');
$this->sql['field'] = $_field;
return $this;
}
# 插入更新字段
# $sign 单条插入或者更新设置其他值查询或者多条插入信息时使用qfield()
public function field($_field = '') {
global $_M;
if(is_array($_field)) $_field = self::field_arr($_field);
$this->sql['field'] = $_field;
return $this;
}
# 分组查询 $_having 同where 一样
public function group($_group = '',$_having = '') {
global $_M;
if(is_array($_group)) $_group = arrayto_string($_group, ',');
if(!empty($_group)) $this->sql['group'] = " GROUP BY " . $_where;
if($_group){
$this->multi_table = true;
if(is_array($_having)) $_having = self::where_arr($_having);
if(!empty($_having)) $this->sql['group'] .= " HAVING " . $_having;
}
return $this;
}
# 查询条件
public function where($_where = '1=1') {
global $_M;
if(is_array($_where)) $_where = self::where_arr($_where);
if(!empty($_where)) $this->sql['where'] = " WHERE " . $_where;
return $this;
}
# 排序条件
public function order($_order = 'id DESC') {
global $_M;
$this->sql['order'] = " ORDER BY " . $_order;
return $this;
}
# 单独值,用于 多条信息插入,或者约束插入更新
public function values($_values = '') {
global $_M;
if(is_array($_values)) $_values = self::values_arr($_values);
$this->sql['values'] = $_values;
return $this;
}
# 约束条件下的UPDATE
public function unique($_unique = '') {
global $_M;
if(is_array($_unique)) {
$_unique = self::field_del($_unique);
$_unique = self::unique_arr($_unique);
}
$this->sql['unique'] = " ON DUPLICATE KEY UPDATE " . $_unique;
return $this;
}
# 查询条数限制
public function limit($_limit = '30',$_start = '0') {
global $_M;
$this->sql['limit'] = " LIMIT {$_start}," . $_limit;
return $this;
}
# 删除
public function del($_where) {
global $_M;
if(empty($this->sql['table'])) return false;
if(!empty($_where) && empty($this->sql['where'])) self::where($_where);
$this->query = "DELETE FROM {$this->sql['table']} {$this->sql['where']} ";
unset($this->sql);
DB::query($this->query);
return $this;
}
# 单条修改
public function upd() {
global $_M;
if(empty($this->sql['table']) || empty($this->sql['field'])) return false;
$this->query = "UPDATE {$this->sql['table']} SET {$this->sql['field']} {$this->sql['where']} ";
unset($this->sql);
DB::query($this->query);
return $this;
}
# 单条新增
public function add($_field) {
global $_M;
if(!empty($_field) && empty($this->sql['field'])) self::field($_field);
if(empty($this->sql['table']) || empty($this->sql['field'])) return false;
$this->query = "INSERT INTO {$this->sql['table']} SET {$this->sql['field']} ";
unset($this->sql);
DB::query($this->query);
return $this;
}
# 约束字段新增更新unique 值不存在即可实现多条信息插入
# field 字段需要查询类型的 qfield()
# $data 一维二维都可以key = field
# $sign false 并且也没有单独调用unique()是多条信息插入, true 为是约束更新插入
public function adup($data = [],$sign = true) {
global $_M;
if(empty($this->sql['table'])) return false;
if(is_array($data)){
$arr = array_level($data) == 1?$data:reset($data);
$qfield = array_keys($arr);
if(empty($this->sql['field'])) self::qfield($qfield);
if(empty($this->sql['values'])) self::values($data);
if($sign == true && empty($this->sql['unique'])) {
$unique = [];
$arr = self::field_del($arr);
foreach ($arr as $key => $val) {
if(in_array($val, $this->special,true)){
$unique[$key] = $val;
}else{
$unique[] = $key;
}
}
self::unique($unique);
}
}
$this->query = "INSERT INTO {$this->sql['table']} ({$this->sql['field']}) VALUES {$this->sql['values']} {$this->sql['unique']} ";
unset($this->sql);
DB::query($this->query);
return $this;
}
# 查询单条
public function one() {
global $_M;
if(empty($this->sql['table'])) return false;
if(empty($this->sql['field'])) $this->sql['field'] = '*';
$this->query = "SELECT {$this->sql['field']} FROM {$this->sql['table']} {$this->sql['where']} {$this->sql['group']} {$this->sql['order']} {$this->sql['limit']} ";
unset($this->sql);
return DB::get_one($this->query);
}
# 查询更多条数
public function all($key = 'id') {
global $_M;
if(empty($this->sql['table'])) return false;
if(empty($this->sql['field'])) $this->sql['field'] = '*';
$this->query = "SELECT {$this->sql['field']} FROM {$this->sql['table']} {$this->sql['where']} {$this->sql['group']} {$this->sql['order']} {$this->sql['limit']} ";
unset($this->sql);
$res = [];
$result = DB::query($this->query);
while ($val = DB::fetch_array($result)) {
$res[$val[$key]] = $val;
}
return $res;
}
# 获取表结构
public function show() {
global $_M;
if(empty($this->sql['table'])) return false;
$this->query = "SHOW FULL COLUMNS FROM .{$this->sql['table']}";
unset($this->sql);
$res = [];
$rescolumns = DB::query($this->query) ;
while($row = DB::fetch_array($rescolumns)){
$res[] = $row;
}
return $res;
}
# 条数统计
# field 采用查询方法 qfield
# $multi_table 若是采用分组了计算方式要调整为 子查询计算总条数
public function count($_field = '*') {
global $_M;
if(empty($this->sql['table'])) return 0;
if(empty($this->sql['field'])) $this->sql['field'] = "COUNT({$_field})";
$this->query = " SELECT {$this->sql['field']} FROM {$this->sql['table']} {$this->sql['where']} ";
if($this->multi_table) $this->query = " SELECT count(*) FROM ($this->query) num ";
$result = DB::query($this->query);
$fetch_row = DB::fetch_row($result);
return $fetch_row[0];
}
# 获取刚才插入的信息ID
public function id() {
global $_M;
return DB::insert_id();
}
# 错误信息(对查询是无效的)
public function error() {
global $_M;
return DB::error();
}
# 返回完整数据库名
public function full_table_name($tname,$sign = true) {
global $_M;
return $sign == true?$_M['table'][$this->m_name.'_'.$tname]:$_M['table'][$tname];
}
# 字段删除方法
public function field_del($array = []) {
global $_M;
foreach ($this->ufield as $val) {
unset($array[$val]);
}
return $array;
}
# where条件的转换
# 仅是值等于的处理,例如某个字段判断为不等于或者其他的方法,切勿使用数组传递
public function where_arr($arr) {
global $_M;
$and = [];
foreach ($arr as $key => $val) {
// 函数的使用 数字键名采用函数模式
if(is_numeric($key)) {
$and[] = $val;
continue;
}
// 仅是值等于的处理
if(is_array($val)){
$or = [];
foreach ($val as $ky => $kv) {
$or[] = " {$key} = '{$kv}' ";
// 函数的使用,非数字则采用函数模式
if(!is_numeric($ky)) {
$or[] = $val;
continue;
}
}
$orstr = arrayto_string($or, ' OR ');
$and[] = " ({$orstr}) ";
}else{
$and[] = " {$key} = '{$val}' ";
}
}
return arrayto_string($and, ' AND ');
}
# 入库字段转换
public function field_arr($arr) {
global $_M;
$str = [];
foreach ($arr as $k => $v) {
if (strstr($v, "'")) $v = str_replace("'", "\'", $v);
if(in_array($v, $this->special,true)){
$str[] = " {$k} = {$v} ";
}else{
$str[] = " {$k} = '{$v}' ";
}
}
return arrayto_string($str, ',');
}
# 单独值的字符串转换
public function values_arr($arr) {
global $_M;
$str = [];
foreach ($arr as $val) {
if(is_array($val)){
$str[] = self::values_arr($val);
}else{
if(in_array($val, $this->special,true)){
$str[] = " $val ";
}else{
$str[] = " '$val' ";
}
}
}
$arrtostr = arrayto_string($str, ',');
return array_level($arr) == 1?"({$arrtostr})":$arrtostr;
}
# 约束条件新增的语句更新值的规则(最后一段)
# 数组key值为字段名非数字 说明是要单独处理的值
public function unique_arr($arr) {
global $_M;
$str = [];
foreach ($arr as $k => $v) {
if(is_numeric($k)){
$str[] = " $v = VALUES($v) ";
}else{
$str[] = " $k = $v ";
}
}
return arrayto_string($str, ',');
}
# 通过数据库整理出该数据库的字段一般是净化form提交的字段避免一个一个组装
public function tfield($form,$tablename = '') {
global $_M;
if(!empty($tablename)){
if(is_array($tablename)) $tablename = [$tablename,true];
list($name,$sign) = array_values($tablename);
self::table($name,$sign);
}
$karr = DB::get_all("DESC {$this->sql['table']}");
foreach ($karr as $v) {
$arr[$v['Field']] = $v['Field'];
}
#根据数据库字段提炼
return array_intersect_key($form, $arr);
}
# 查看刚才执行过的sql语句方便核查sql语句
public function query() {
global $_M;
return $this->query;
}
}
?>

View File

@ -0,0 +1,124 @@
<?php
//兼容函数array_column PHP5.5+
if (!function_exists('array_column')) {
function array_column($input, $columnKey, $indexKey = NULL) {
$columnKeyIsNumber = (is_numeric($columnKey)) ? TRUE : FALSE;
$indexKeyIsNull = (is_null($indexKey)) ? TRUE : FALSE;
$indexKeyIsNumber = (is_numeric($indexKey)) ? TRUE : FALSE;
$result = array();
foreach ((array) $input AS $key => $row) {
if ($columnKeyIsNumber) {
$tmp = array_slice($row, $columnKey, 1);
$tmp = (is_array($tmp) && !empty($tmp)) ? current($tmp) : NULL;
} else {
$tmp = isset($row[$columnKey]) ? $row[$columnKey] : NULL;
}
if (!$indexKeyIsNull) {
if ($indexKeyIsNumber) {
$key = array_slice($row, $indexKey, 1);
$key = (is_array($key) && !empty($key)) ? current($key) : NULL;
$key = is_null($key) ? 0 : $key;
} else {
$key = isset($row[$indexKey]) ? $row[$indexKey] : 0;
}
}
$result[$key] = $tmp;
}
return $result;
}
}
# 计算时间差
# $begin_time 起始日期
# $end_time 结束日期 一般指当前日期
function timediff($begin_time, $end_time,$type) {
$time = $end_time - $begin_time;
switch ($type) {
case 'year':
//总的年
$timestr = intval($time / 60 / 60 / 24 / 365);
break;
case 'month':
//总的月
$timestr = intval($time / 60 / 60 / 24 / 30);
break;
case 'week':
$timestr = intval($time / 60 / 60 / 24 / 7);
break;
case 'day':
$timestr = intval($time / 60 / 60 / 24);
break;
case 'hour':
$timestr = intval($time / 60 / 60);
break;
case 'min':
$timestr = intval($time / 60);
break;
case 'sec':
$timestr = $time;
break;
default:
//总的年
$year = intval($time / 60 / 60 / 24 / 365);
//总的月
$month = intval($time / 60 / 60 / 24 / 30);
//总的周
$week = intval($time / 60 / 60 / 24 / 7);
//总的天数
$day = intval($time / 60 / 60 / 24);
//总的小时
$hour = intval($time / 60 / 60);
//总的分钟数
$minute = intval($time / 60);
//总的秒数
$second = $time;
$timestr = [
'year' =>$year, //总的年
'month'=>$month, //总的月
'week'=>$week, //总的周
'day'=>$day, //总的天数
'hour'=>$hour, //总的小时
'min'=>$minute, //总的分钟数
'sec'=>$second //总的秒数
];
break;
}
return $timestr;
}
//获取汉子的首字母
function getstrcharter($str) {
global $_M, $_YW;
if (empty($str)) return '';
$fchar = ord($str{0});
if ($fchar >= ord('A') && $fchar <= ord('z')) return strtoupper($str{0});
$s1 = iconv('UTF-8', 'gb2312', $str);
$s2 = iconv('gb2312', 'UTF-8', $s1);
$s = $s2 == $str ? $s1 : $str;
$asc = ord($s{0}) * 256 + ord($s{1}) - 65536;
if ($asc >= -20319 && $asc <= -20284) return 'A';
if ($asc >= -20283 && $asc <= -19776) return 'B';
if ($asc >= -19775 && $asc <= -19219) return 'C';
if ($asc >= -19218 && $asc <= -18711) return 'D';
if ($asc >= -18710 && $asc <= -18527) return 'E';
if ($asc >= -18526 && $asc <= -18240) return 'F';
if ($asc >= -18239 && $asc <= -17923) return 'G';
if ($asc >= -17922 && $asc <= -17418) return 'H';
if ($asc >= -17417 && $asc <= -16475) return 'J';
if ($asc >= -16474 && $asc <= -16213) return 'K';
if ($asc >= -16212 && $asc <= -15641) return 'L';
if ($asc >= -15640 && $asc <= -15166) return 'M';
if ($asc >= -15165 && $asc <= -14923) return 'N';
if ($asc >= -14922 && $asc <= -14915) return 'O';
if ($asc >= -14914 && $asc <= -14631) return 'P';
if ($asc >= -14630 && $asc <= -14150) return 'Q';
if ($asc >= -14149 && $asc <= -14091) return 'R';
if ($asc >= -14090 && $asc <= -13319) return 'S';
if ($asc >= -13318 && $asc <= -12839) return 'T';
if ($asc >= -12838 && $asc <= -12557) return 'W';
if ($asc >= -12556 && $asc <= -11848) return 'X';
if ($asc >= -11847 && $asc <= -11056) return 'Y';
if ($asc >= -11055 && $asc <= -10247) return 'Z';
return 'ZZ';
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,530 @@
<?php
/*
* 表格数据显示,以及数据导出公用处理方案
*/
trait tdata {
//sql语句采用分组查询后调整为true 使用子查询计算总条数
public $multi_table = false;
//搜索的input字段用来处理表数据显示时的颜色加重问题
private $search_input = [];
//搜索的select字段不用考虑搜索结果
private $search_other = [];
//带有表前缀的搜索字段,主要用于跨表联合查询,要对照上面数组合并后的顺序
private $search_field = [];
//搜索的LIKE字段
private $search_link = [];
//跳过替换为突出显示的字段
private $skip_field = [];
// 小区统计查询内的公用where
private $villages_where = '';
//表名
public function td_sqlk() {
global $_M,$_YW;
//当天日期时间
$curdate = date('Y-m-d',time());
switch ($this->tname) {
case 'applan':
//判断是否可选的依据
if(!empty($this->form['slid'])) $where = " AND nla.id != '{$this->form['slid']}' ";
//表
$sqlk = " {$_YW['k']['elevator']} AS el "
. "LEFT JOIN (SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nowe_number,ANY_VALUE ( nla.id ) AS nowid,ANY_VALUE ( nla.l_title ) AS nowtitle,ANY_VALUE ( nla.l_starttime ) AS nowstime,ANY_VALUE ( nla.l_endtime ) AS nowetime,if(NOT ( nla.l_endtime < '{$curdate}' OR nla.l_starttime > '{$curdate}' ) OR nla.l_starttime > '{$curdate}',1,0) AS estate FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE NOT ( nla.l_endtime < '{$curdate}' OR nla.l_starttime > '{$curdate}' ) AND nla.id IS NOT NULL ORDER BY nowstime ASC ) eala GROUP BY nowe_number ) ala ON ala.nowe_number = el.e_number "
. "LEFT JOIN (SELECT nel.e_number AS ende_number, max( nla.l_endtime ) AS endtime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE nla.id IS NOT NULL GROUP BY ende_number) cla ON cla.ende_number = el.e_number "
. "LEFT JOIN ( SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nexte_number,ANY_VALUE ( nla.id ) AS nextid,ANY_VALUE ( nla.l_title ) AS nexttitle,ANY_VALUE ( nla.l_starttime ) AS nextstime,ANY_VALUE ( nla.l_endtime ) AS nextetime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE nla.l_starttime > '{$curdate}' AND nla.id IS NOT NULL ORDER BY nextstime ASC ) eala GROUP BY nexte_number ) bla ON bla.nexte_number = el.e_number "
. "LEFT JOIN (SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nend_number,ANY_VALUE ( nla.id ) AS endid,ANY_VALUE ( nla.l_title ) AS endtitle,ANY_VALUE ( nla.l_starttime ) AS endstime,ANY_VALUE ( nla.l_endtime ) AS endetime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE nla.l_endtime < '{$curdate}' AND nla.id IS NOT NULL ORDER BY endetime DESC ) eala GROUP BY nend_number ) dla ON dla.nend_number = el.e_number "
. "LEFT JOIN (SELECT nel.e_number AS lde_number,count(nel.e_number) AS lanum FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE NOT ( nla.l_endtime < '{$this->form['l_starttime']}' OR nla.l_starttime > '{$this->form['l_endtime']}' ) {$where} GROUP BY lde_number) AS ela ON ela.lde_number = el.e_number ";
break;
case 'elevators':
$sqlk = " {$_YW['k']['elevator']} AS el LEFT JOIN {$_YW['k']['launch']} AS la ON find_in_set( el.e_number, la.l_enumber ) "
. "LEFT JOIN (SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nowe_number,ANY_VALUE ( nla.id ) AS nowid,ANY_VALUE ( nla.l_title ) AS nowtitle,ANY_VALUE ( nla.l_starttime ) AS nowstime,ANY_VALUE ( nla.l_endtime ) AS nowetime,if(NOT ( nla.l_endtime < '{$curdate}' OR nla.l_starttime > '{$curdate}' ) OR nla.l_starttime > '{$curdate}',1,0) AS estate FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE NOT ( nla.l_endtime < '{$curdate}' OR nla.l_starttime > '{$curdate}' ) AND nla.id IS NOT NULL ORDER BY nowstime ASC ) eala GROUP BY nowe_number ) ala ON ala.nowe_number = el.e_number "
. "LEFT JOIN ( SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nexte_number,ANY_VALUE ( nla.id ) AS nextid,ANY_VALUE ( nla.l_title ) AS nexttitle,ANY_VALUE ( nla.l_starttime ) AS nextstime,ANY_VALUE ( nla.l_endtime ) AS nextetime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE nla.l_starttime > '{$curdate}' AND nla.id IS NOT NULL ORDER BY nextstime ASC ) eala GROUP BY nexte_number ) bla ON bla.nexte_number = el.e_number "
. "LEFT JOIN (SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nend_number,ANY_VALUE ( nla.id ) AS endid,ANY_VALUE ( nla.l_title ) AS endtitle,ANY_VALUE ( nla.l_starttime ) AS endstime,ANY_VALUE ( nla.l_endtime ) AS endetime FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE nla.l_endtime < '{$curdate}' AND nla.id IS NOT NULL ORDER BY endetime DESC ) eala GROUP BY nend_number ) cla ON cla.nend_number = el.e_number ";
break;
case 'patrol':
$sqlk = " {$_YW['k']['elevator']} AS el LEFT JOIN {$_YW['k']['launch']} AS la ON find_in_set( el.e_number, la.l_enumber ) "
. "LEFT JOIN (SELECT * FROM( SELECT DISTINCT( nel.e_number ) AS nowe_number,ANY_VALUE ( nla.id ) AS nowid,ANY_VALUE ( nla.l_title ) AS nowtitle,ANY_VALUE ( nla.l_starttime ) AS nowstime,ANY_VALUE ( nla.l_endtime ) AS nowetime,if(NOT ( nla.l_endtime < '{$curdate}' OR nla.l_starttime > '{$curdate}' ) OR nla.l_starttime > '{$curdate}',1,0) AS estate FROM {$_YW['k']['elevator']} AS nel LEFT JOIN {$_YW['k']['launch']} AS nla ON find_in_set( nel.e_number, nla.l_enumber ) WHERE nla.l_starttime <= '{$curdate}' AND nla.id IS NOT NULL ORDER BY nowstime DESC ) eala GROUP BY nowe_number ) ala ON ala.nowe_number = el.e_number ";
break;
case 'villages':
$son = " FROM {$_YW['k']['countela']} AS el WHERE ";
//判断执行默认还是时间区段
$bool = false;
if($this->form['vs_starttime'] || $this->form['vs_endtime']){
$bool = true;
$this->form['vs_starttime'] = $this->form['vs_starttime']?:$curdate;
$this->form['vs_endtime'] = $this->form['vs_endtime']?:$curdate;
if(strtotime($this->form['vs_starttime']) > strtotime($this->form['vs_endtime'])){
$vs_starttime = $this->form['vs_endtime'];
$vs_endtime = $this->form['vs_starttime'];
}else{
$vs_starttime = $this->form['vs_starttime'];
$vs_endtime = $this->form['vs_endtime'];
}
}
// 计算是否区分广告位
// 检测是否通过JS传递的广告位参数也就是导出
if(isset($this->form['jsadd_veaps'])) $this->form['veaps'] = stringto_array($this->form['jsadd_veaps'],',');
if(is_array($this->form['veaps'])){
$veaps = parent::strchange(array_filter($this->form['veaps']));
$this->villages_where = " el.e_aps IN($veaps) ";
$son .= " {$this->villages_where} AND ";
}
// 空置计算要排除当前排期中的广告位
if($bool){
//加上时间区块 那就是查看在区段内的情况
//增加 s_enable 判断是为了防止过去时间
//空置
$fwhere = " {$son} NOT EXISTS (SELECT ela.e_number FROM {$_YW['k']['countela']} AS ela WHERE NOT ( ela.l_endtime < '{$vs_starttime}' OR ela.l_starttime > '{$vs_endtime}' ) AND ela.e_number = el.e_number) AND ( (el.l_endtime < '{$vs_starttime}' OR el.l_starttime > '{$vs_endtime}' ) OR el.l_id IS NULL ) AND el.e_enable = 1 ";
// 之前的旧代码
// $fwhere = " {$son} NOT EXISTS (SELECT ela.e_number FROM {$_YW['k']['countela']} AS ela WHERE NOT ( ela.l_endtime < '{$vs_starttime}' OR ela.l_starttime > '{$vs_endtime}' ) AND NOT(ela.l_endtime < '{$curdate}' OR ela.l_starttime > '{$curdate}' ) AND ela.e_number = el.e_number) AND ( ((el.l_endtime < '{$vs_starttime}' OR el.l_starttime > '{$vs_endtime}') AND el.l_endtime < '{$curdate}' ) OR el.l_id IS NULL ) AND el.e_enable = 1 ";
//排期中的
$lwhere = " {$son} NOT(el.l_endtime < '{$vs_starttime}' OR el.l_starttime > '{$vs_endtime}') ";
// 之前的旧代码
// $lwhere = " {$son} NOT(el.l_endtime < '{$vs_starttime}' OR el.l_starttime > '{$vs_endtime}') AND NOT(el.l_endtime < '{$curdate}' OR el.l_starttime > '{$curdate}' ) ";
//多少天到期的
$dwhere = " {$son} el.l_endtime BETWEEN '{$vs_starttime}' AND '{$vs_endtime}' ";
//预排
$pwhere = " {$son} NOT(el.l_endtime < '{$vs_starttime}' OR el.l_starttime > '{$vs_endtime}') AND el.l_starttime > '{$curdate}' ";
}else{
//没有时间区段,则按照当天为准则,默认值
//空置,其他不包含当天的
$fwhere = " {$son} NOT EXISTS (SELECT ela.e_number FROM {$_YW['k']['countela']} AS ela WHERE NOT ( ela.l_endtime < '{$curdate}' OR ela.l_starttime > '{$curdate}' ) AND ela.e_number = el.e_number) AND (el.l_endtime < '{$curdate}' OR el.l_starttime > '{$curdate}' OR el.l_id IS NULL) AND el.e_enable = 1 ";
//排期中的,日期包含当天的
$lwhere = " {$son} NOT(el.l_endtime < '{$curdate}' OR el.l_starttime > '{$curdate}' ) ";
//多少天到期的
$dwhere = " {$son} el.l_endtime BETWEEN '{$curdate}' AND date_add( '{$curdate}', INTERVAL 7 DAY ) ";
//预排,开始时间大于当天的
$pwhere = " {$son} el.l_starttime > '{$curdate}' ";
}
$sqlk = "{$_YW['k']['village']} AS vi LEFT JOIN {$_YW['k']['elevator']} AS el ON vi.id = el.e_vid "
. "LEFT JOIN (SELECT el.e_vid AS ae_vid,COUNT( DISTINCT el.e_number ) AS v_free,COUNT( DISTINCT el.e_vid, el.e_bno ) AS v_bno,COUNT( DISTINCT el.e_vid, el.e_bno,el.e_uno ) AS v_uno,COUNT( DISTINCT el.e_vid, el.e_bno,el.e_uno,el.e_eno ) AS v_eno {$fwhere} GROUP BY ae_vid ) AS anum ON anum.ae_vid = vi.id "
. "LEFT JOIN (SELECT el.e_vid AS be_vid,COUNT( DISTINCT el.e_number ) AS v_lease {$lwhere} GROUP BY be_vid ) AS bnum ON bnum.be_vid = vi.id "
. "LEFT JOIN (SELECT el.e_vid AS ce_vid,COUNT( DISTINCT el.e_number ) AS v_endday {$dwhere} GROUP BY ce_vid ) AS cnum ON cnum.ce_vid = vi.id "
. "LEFT JOIN (SELECT el.e_vid AS de_vid,COUNT( DISTINCT el.e_number ) AS v_prerow {$pwhere} GROUP BY de_vid ) AS dnum ON dnum.de_vid = vi.id ";
break;
case 'contract':
$sqlk = "{$_YW['k']['contract']} AS ch LEFT JOIN {$_YW['k']['launch']} AS la ON ch.h_number = la.l_hnumber ";
break;
case 'schedule':
$sqlk = "{$_YW['k']['elevator']} AS el LEFT JOIN {$_YW['k']['launch']} AS la ON find_in_set( el.e_number, la.l_enumber ) LEFT JOIN {$_YW['k']['contract']} AS ct ON la.l_hnumber = ct.h_number";
break;
case 'village':
$sqlk = "{$_YW['k']['village']} AS vi LEFT JOIN {$_YW['k']['elevator']} AS el ON vi.id = el.e_vid ";
break;
default:
$sqlk = $_YW['k'][$this->tname];
break;
}
return $sqlk;
}
//字段
public function td_field() {
global $_M,$_YW;
switch ($this->tname) {
case 'applan':
$field = '*';
break;
case 'elevators':
$field = ' el.*,max( la.l_endtime ) AS endtime,count( DISTINCT la.id ) AS e_totalnum,ala.*,if(ala.estate,1,0) AS etypes,bla.*,cla.* ';
break;
case 'patrol':
$field = ' el.*,la.l_hnumber,ala.* ';
break;
case 'contract':
$field = 'ch.*, count(la.id) AS h_totalnum ';
break;
case 'schedule':
$field = 'el.e_enable,el.e_number,el.e_vid,el.e_bno,el.e_uno,el.e_eno,el.e_aps,la.*,ct.h_cid';
break;
case 'villages':
$field = " vi.*, COUNT( DISTINCT el.e_number) AS v_enum,COUNT(DISTINCT el.e_vid, el.e_bno) AS v_ebnonum,COUNT(DISTINCT el.e_vid, el.e_bno,el.e_uno) AS v_eunonum,COUNT(DISTINCT el.e_vid, el.e_bno,el.e_uno,el.e_eno) AS v_eenonum,COUNT( el.e_enable = 0 OR NULL ) AS noban,ANY_VALUE(anum.v_free) AS v_free,ANY_VALUE ( anum.v_bno ) AS v_bno,ANY_VALUE ( anum.v_uno ) AS v_uno,ANY_VALUE ( anum.v_eno ) AS v_eno,ANY_VALUE(bnum.v_lease) AS v_lease,ANY_VALUE(cnum.v_endday) AS v_endday,ANY_VALUE(dnum.v_prerow) AS v_prerow ";
break;
case 'village':
$field = " vi.*, count( el.e_number ) AS total,count( el.e_enable = 0 OR NULL ) AS noban,count( el.e_enable = 1 OR NULL ) AS normal ";
break;
default:
$field = '*';
break;
}
return $field;
}
/*
* 【列出】
* 同时满足条件的非OR
*/
public function td_search($link = true) {
global $_M,$_YW;
//默认input字段为link搜索
if($link) $this->search_link = array_unique(array_merge($this->search_input,$this->search_link));
//合成得带搜索字段
$field = array_unique(array_merge($this->search_input,$this->search_other));
//判断是否为链表查询
$join_field = array_combine($field,count($this->search_field) > 0?$this->search_field:$field);
//相对独立的搜索
$arrwhere = [];
foreach ($field as $val) {
$search = trim(strtoupper($this->form[$val]));
if(strlen($search) > 0) {
$str = $join_field[$val];
if(in_array($val, $this->search_link)){
$arrwhere[] = " {$str} LIKE '%{$search}%' ";
continue;
}
$arrwhere[] = " {$str} = '{$search}' ";
}
}
//返回内容
$where = '';
if(count($arrwhere) > 0){
$where = ' AND ';
$where .= arrayto_string($arrwhere,' AND ');
}
return $where;
}
//OR 内容搜索
public function td_search_or($orfield,$search_field = []) {
global $_M,$_YW;
//判断是否为链表查询
$join_field = array_combine($orfield,count($search_field) > 0?$search_field:$orfield);
//相对独立的搜索
$arrwhere = [];
foreach ($orfield as $val) {
$search = trim(strtoupper($this->form[$val]));
if(strlen($search) > 0) {
$str = $join_field[$val];
if(in_array($val, $this->search_link)){
$arrwhere[] = " {$str} LIKE '%{$search}%' ";
continue;
}
$arrwhere[] = " {$str} = '{$search}' ";
}
}
//返回内容
$where = '';
if(count($arrwhere) > 0){
$where .= arrayto_string($arrwhere,' OR ');
}
return strlen($where) > 0 ?" AND ({$where}) ":'';
}
//时间区间
public function td_time_search($field,$search_field = []) {
global $_M,$_YW;
list($start,$end) = $field;
//判断是否为链表查询
$join_field = array_combine($field,count($search_field) > 0?$search_field:$field);
//相对独立的搜索
$arrwhere = [];
foreach ($field as $val) {
$search = trim(strtoupper($this->form[$val]));
if(strlen($search) > 0) {
$str = $join_field[$val];
if($val == $start){
$arrwhere[] = " {$str} >= '{$search}' ";
}else{
$arrwhere[] = " {$str} <= '{$search}' ";
}
}
}
//返回内容
$where = '';
if(count($arrwhere) > 0){
$where .= arrayto_string($arrwhere," AND ");
}
return strlen($where) > 0 ?" AND ({$where}) ":'';
}
//获取重叠的时间区间
// $search_field 开始时间和结束时间的字段互相调换,结束的字段在前面
public function td_time_orsearch($field,$search_field = []) {
global $_M,$_YW;
list($start,$end) = $field;
//判断是否为链表查询
$join_field = array_combine($field,count($search_field) > 0?$search_field:$field);
//相对独立的搜索
$arrwhere = [];
foreach ($field as $val) {
$search = trim(strtoupper($this->form[$val]));
if(strlen($search) > 0) {
$str = $join_field[$val];
if($val == $start){
$arrwhere[] = " {$str} < '{$search}' "; //结束字段,搜索为开始时间
}else{
$arrwhere[] = " {$str} > '{$search}' "; //开始字段,搜索为结束时间
}
}
}
//返回内容
$where = '';
if(count($arrwhere) > 0){
$where .= arrayto_string($arrwhere," OR ");
}
return strlen($where) > 0 ?" AND NOT({$where}) ":'';
}
/*
* 【列出】
* SQL判断语句$where .= $this->search();
*/
public function td_where() {
global $_M,$_YW;
$where = " 1=1 ";
switch ($this->tname) {
case 'applan':
$this->search_input = ['e_number'];
$this->search_other = ['e_aps','e_eno','e_uno','e_bno','e_vid','e_enable'];
$where .= self::td_search();
break;
case 'elevators':
$this->search_input = ['e_number'];
$this->search_other = ['e_aps','e_eno','e_uno','e_bno','e_vid','e_enable','endid','nowid','nextid'];
$this->search_field = ['el.e_number','el.e_aps','el.e_eno','el.e_uno','el.e_bno','el.e_vid','el.e_enable','cla.endid','ala.nowid','bla.nextid'];
$where .= self::td_search();
//判断是否为备份
if($this->bsign) parent::where_id($where);
self::td_groupby($where);
break;
case 'patrol':
$this->search_input = ['e_number'];
$this->search_other = ['e_aps','e_eno','e_uno','e_bno','e_vid','e_enable','nowid','l_hnumber'];
$this->search_field = ['el.e_number','el.e_aps','el.e_eno','el.e_uno','el.e_bno','el.e_vid','el.e_enable','ala.nowid','la.l_hnumber'];
$where .= self::td_search();
//不看空位
$where .= " AND ala.nowid IS NOT NULL ";
self::td_groupby($where);
break;
case 'elevator':
$this->search_input = ['e_number','e_label','e_text'];
$this->search_other = ['e_aps','e_eno','e_uno','e_bno','e_vid','e_enable'];
$where .= self::td_search();
case 'village':
$this->search_input = ['v_name','v_text'];
$where .= self::td_search();
$this->search_link = ['v_province','v_city','v_district','v_address'];
$this->search_field = ['vi.v_name','vi.v_text','vi.v_province','vi.v_city','vi.v_district','vi.v_address'];
$this->form['v_province'] = $this->form['v_address'];
$this->form['v_city'] = $this->form['v_address'];
$this->form['v_district'] = $this->form['v_address'];
$where .= self::td_search_or($this->search_link,['vi.v_province','vi.v_city','vi.v_district','vi.v_address']);
self::td_groupby($where);
break;
case 'customer':
$this->search_input = ['c_text'];
$this->search_link = ['c_allname','c_name','c_province','c_city','c_district','c_address'];
//名称
$this->form['c_name'] = $this->form['c_allname'];
$where .= self::td_search_or(['c_allname','c_name']);
//地址
$this->form['c_province'] = $this->form['c_address'];
$this->form['c_city'] = $this->form['c_address'];
$this->form['c_district'] = $this->form['c_address'];
$where .= self::td_search_or(['c_province','c_city','c_district','c_address']);
$where .= self::td_search();
break;
case 'workers':
$this->search_input = ['w_name','w_tel','w_text'];
$where .= self::td_search();
break;
case 'contract':
$this->search_input = ['h_number','h_text'];
$this->search_other = ['h_cid','h_wid'];
$this->search_link = ['h_wid'];
$this->search_field = ['ch.h_number','ch.h_text','ch.h_cid','ch.h_wid'];
$where .= self::td_time_orsearch(['h_starttime','h_endtime'],['ch.h_endtime','ch.h_starttime']);
$where .= self::td_search();
self::td_groupby($where);
break;
case 'para':
$this->search_other = ['p_type'];
$where .= self::td_search();
break;
case 'launch':
$this->search_input = ['l_title','l_enumber','l_text'];
$this->search_other = ['l_hnumber'];
$where .= self::td_time_orsearch(['l_starttime','l_endtime'],['l_endtime','l_starttime']);
$where .= self::td_search();
break;
case 'villages':
$this->search_input = ['v_name','v_text'];
$this->search_link = ['v_province','v_city','v_district','v_address'];
$this->form['v_province'] = $this->form['v_address'];
$this->form['v_city'] = $this->form['v_address'];
$this->form['v_district'] = $this->form['v_address'];
if(is_array($this->form['veaps'])) $where .= " AND {$this->villages_where} ";
$where .= self::td_search_or($this->search_link);
$where .= self::td_search();
//判断是否为备份
if($this->bsign) parent::where_id($where);
self::td_groupby($where);
break;
case 'schedule':
$where .= " AND la.id IS NOT NULL ";
$this->search_input = ['e_number','l_hnumber'];
$this->search_other = ['id','e_vid'];
$this->search_field = ['el.e_number','la.l_hnumber','la.id','el.e_vid'];
$where .= self::td_time_orsearch(['l_starttime','l_endtime'],['la.l_endtime','la.l_starttime']);
$where .= self::td_search();
break;
case 'noticeday':
$where .= ' AND ( (endtime BETWEEN DATE_SUB( CURDATE(), INTERVAL 3 DAY ) AND CURDATE()) OR ' //到期提醒 展示3天 // DATE_SUB
. '(h_endtime BETWEEN DATE_SUB( CURDATE(), INTERVAL 3 DAY ) AND DATE_ADD( CURDATE(), INTERVAL 3 DAY ) ) )'; //订单到期前后展示3天 // DATE_ADD
break;
default:
// 如果$where 没有值 会导致计算结果出错,导致前台表格无法获取正确的值,分页显示异常
$where = "1=1";
break;
}
return $where;
}
//分组查询
public function td_groupby(&$where) {
global $_M;
$this->multi_table = true;
switch ($this->tname) {
case 'elevators':
$where .= " GROUP BY el.e_number ";
if($this->form['endtime']) $where .= " HAVING endtime < '{$this->form['endtime']}' ";
break;
case 'patrol':
$where .= " GROUP BY el.e_number ";
break;
case 'contract':
$where .= " GROUP BY ch.id ";
break;
case 'villages':
$where .= " GROUP BY vi.id ";
break;
case 'village':
$where .= " GROUP BY vi.id ";
break;
default:
$this->multi_table = false;
break;
}
}
/*
* 【列出】
* SQL排序方式语句
*/
public function td_order() {
global $_M;
switch ($this->tname) {
case 'applan':
$order = " `e_enable` DESC ";
//按照正常排序,对比相邻广告位的投放广告品类
// order_e_types 按照是否可投放进行排序
if($this->form['eaps_order'] || $this->form['order_e_types']){
if(!$this->form['order_e_types']) $this->form['order_e_types'] = ' ASC ';
$order .= ", `lanum` {$this->form['order_e_types']} ";
}
if($this->form['eaps_order'] == 2){
// 传递进来的编号,不直接查数据是因为有些可能会出现错误,所以直接使用传递进来的,进行排序
$array = array_filter(stringto_array($this->form['l_selectenum'],','));
$idstr = parent::strchange($array);
if(strlen($idstr)) $order = " `e_number` IN({$idstr}) DESC, ".$order;
}
$order .= ", `e_vid` ASC, `e_bno` ASC, `e_uno` ASC, `e_eno` ASC, `e_aps` ASC ";
break;
case 'elevators':
$order = " `etypes` DESC, endtime DESC, el.`e_vid` ASC, el.`e_bno` ASC, el.`e_uno` ASC, el.`e_eno` ASC, el.`e_aps` ASC ";
if($this->form['order_e_number']) $order = " el.e_number {$this->form['order_e_number']} ";
if($this->form['order_endtime']) $order = " endtime {$this->form['order_endtime']} ";
if($this->form['order_e_totalnum']) $order = " e_totalnum {$this->form['order_e_totalnum']} ";
if($this->form['order_etypes']) $order = " `etypes` {$this->form['order_etypes']} ";
if($this->form['order_nowstime']) $order = " nowstime {$this->form['order_nowstime']} ";
if($this->form['order_nowetime']) $order = " nowetime {$this->form['order_nowetime']} ";
if($this->form['order_nextstime']) $order = " nextstime {$this->form['order_nextstime']} ";
if($this->form['order_nextetime']) $order = " nextetime {$this->form['order_nextetime']} ";
if($this->form['order_endstime']) $order = " endstime {$this->form['order_endstime']} ";
if($this->form['order_endetime']) $order = " endetime {$this->form['order_endetime']} ";
if($this->form['order_e_address']) {
$e_address = $this->form['order_e_address'];
$order = " el.e_vid {$e_address}, el.e_bno {$e_address}, el.e_uno {$e_address}, el.e_eno {$e_address}, el.e_aps {$e_address} ";
}
break;
case 'patrol':
$order = " el.`e_vid` ASC, el.`e_bno` ASC, el.`e_uno` ASC, el.`e_eno` ASC, el.`e_aps` ASC ";
break;
case 'elevator':
$order = " `id` DESC ";
break;
case 'launch':
$order = " `id` DESC ";
if($this->form['order_l_starttime']) $order = " l_starttime {$this->form['order_l_starttime']} ";
if($this->form['order_l_endtime']) $order = " l_endtime {$this->form['order_l_endtime']} ";
break;
case 'contract':
$order = ' ch.`id` DESC';
if($this->form['order_h_starttime']) $order = " ch.h_starttime {$this->form['order_h_starttime']} ";
if($this->form['order_h_endtime']) $order = " ch.h_endtime {$this->form['order_h_endtime']} ";
break;
case 'schedule':
$order = ' la.l_starttime DESC,la.`id` DESC';
//备份 按照小区排序
if($this->bsign){
$order = " el.`e_vid` ASC, el.`e_bno` ASC, el.`e_uno` ASC, el.`e_eno` ASC, el.`e_aps` ASC ";
}
if($this->form['order_l_starttime']) $order = " la.l_starttime {$this->form['order_l_starttime']} ";
if($this->form['order_l_endtime']) $order = " la.l_endtime {$this->form['order_l_endtime']} ";
break;
case 'villages':
$order = ' vi.`id` DESC';
if($this->form['order_v_enum']) $order = " v_enum {$this->form['order_v_enum']} ";
if($this->form['order_v_free']) $order = " v_free {$this->form['order_v_free']} ";
if($this->form['order_v_lease']) $order = " v_lease {$this->form['order_v_lease']} ";
if($this->form['order_v_endday']) $order = " v_endday {$this->form['order_v_endday']} ";
if($this->form['order_v_prerow']) $order = " v_prerow {$this->form['order_v_prerow']} ";
if($this->form['order_v_ebnonum']) $order = " v_ebnonum {$this->form['order_v_ebnonum']} ";
if($this->form['order_v_eunonum']) $order = " v_eunonum {$this->form['order_v_eunonum']} ";
if($this->form['order_v_eenonum']) $order = " v_eenonum {$this->form['order_v_eenonum']} ";
if($this->form['order_v_bno']) $order = " v_bno {$this->form['order_v_bno']} ";
if($this->form['order_v_uno']) $order = " v_uno {$this->form['order_v_uno']} ";
if($this->form['order_v_eno']) $order = " v_eno {$this->form['order_v_eno']} ";
break;
case 'para':
$order = ' `id` DESC';
if($this->form['order_p_type']) $order = " `p_type` {$this->form['order_p_type']} ";
if($this->form['order_p_order']) $order = " `p_order` {$this->form['order_p_order']} ";
break;
case 'noticeday':
$order = ' `endtime` ASC, `h_endtime` ASC ';
break;
case 'village':
$order = ' vi.`id` DESC';
break;
default:
$order = ' `id` DESC';
break;
}
return $order;
}
}

View File

@ -0,0 +1,277 @@
<?php
//表对应字段
trait tfield {
//广告位统计
protected function tf_elevator($sign = true) {
global $_M,$_YW;
return [
'e_enable' => '状态',
'e_number' => '广告位编号',
'e_vid' => '小区名称',
'e_bno' => '楼号',
'e_uno' => '单元号',
'e_eno' => '电梯号',
'e_aps' => '广告位位置',
'e_size' => '广告位规格',
'e_label' => '相关标签',
'e_text' => '备注'
];
}
//小区统计
protected function tf_village($sign = true) {
global $_M,$_YW;
return [
'v_name' => '小区名称',
'v_type' => '小区分类',
'v_totalstr' => '广告状态',
'v_address' => '小区地址',
'v_wid' => '联系人',
'v_price' => '小区均价',
'v_psize' => '居住规模',
'v_addtime' => '录入时间',
'v_updatetime' => '修改时间',
'v_text' => '备注'
];
}
//广告合同关联表
protected function tf_schedule($sign = '') {
global $_M,$_YW;
//Table
$array = [
'e_enable' => '状态',
'e_number' => '广告位编号',
'l_address' => '广告位地址',
'h_cid' => '签定的公司',
'l_hnumber' => '合同编号',
'l_title' => '投放名称',
'l_starttime' => '开始时间',
'l_endtime' => '结束时间',
'ltype' => '投放状态' //标记是否已经结束
];
// 导出专用
$barray = [
'e_enable' => '状态',
'e_number' => '广告位编号',
'e_vid' => '小区名称',
'e_bno' => '楼号',
'e_uno' => '单元号',
'e_eno' => '电梯号',
'e_aps' => '广告位位置',
'h_cid' => '签定的公司',
'l_hnumber' => '合同编号',
'l_title' => '投放名称',
'l_starttime' => '开始时间',
'l_endtime' => '结束时间',
'ltype' => '投放状态' //标记是否已经结束
];
return $sign || $this->bsign?$barray:$array;
}
//合同
protected function tf_contract($sign = true) {
global $_M,$_YW;
return [
'h_number' => '合同编号',
'h_signtime' => '签订日期',
'h_cid' => '签定公司',
'h_tprice' => '合同总额',
'h_wid' => '签定人员',
'h_totalnum' => '投放次数',
'h_starttime' => '订单开始时间',
'h_endtime' => '订单结束时间',
'h_noticeday' => '提前通知天数',
'h_addtime' => '录入时间',
'h_updatetime' => '修改时间',
'h_text' => '备注'
];
}
//企业资料
protected function tf_customer($sign = true) {
global $_M,$_YW;
return [
'c_allname' => '公司名称',
'c_name' => '公司简称',
'c_address' => '公司地址',
'c_wid' => '联系人',
'c_addtime' => '录入时间',
'c_updatetime' => '修改时间',
'c_text' => '备注',
];
}
//企业联系人
protected function tf_workers($sign = true) {
global $_M,$_YW;
return [
// 'w_cid' => '隶属公司',
'w_jid' => '职务id',
'w_name' => '姓名',
'w_tel' => '联系电话',
'w_addtime' => '录入时间',
'w_updatetime' => '修改时间',
'w_text' => '备注',
];
}
//参数
protected function tf_para($sign = true) {
global $_M,$_YW;
return [
'p_type' => '参数分类',
'p_value' => '参数值',
'p_name' => '参数名',
'p_num' => '有多少数据在使用',
'p_order' => '排序',
'p_text' => '备注'
];
}
// 投放页面选择广告位
protected function tf_launch($sign = true) {
global $_M,$_YW;
return [
'l_title' => '名称',
'l_hnumber' => '合同编号',
'l_schedule' => '投放进度',
'l_totalnum' => '广告位个数',
'l_starttime' => '广告开始时间',
'l_endtime' => '广告结束时间',
'l_type' => '广告类型',
'l_text' => '备注',
'l_enumber' => '广告位编组最多显示6个',
'l_addtime' => '录入时间',
'l_updatetime' => '修改时间'
];
}
// 投放页面选择广告位
protected function tf_applan($sign = true) {
global $_M,$_YW;
return [
'e_enable' => '状态',
'e_number' => '广告位编号',
'e_address' => '广告位地址', //虚拟字段
'endtitle' => '上个计划名称',
'endstime' => '上个开始时间',
'endetime' => '上个结束时间',
'nowtitle' => '当前计划名称',
'nowstime' => '当前开始时间',
'nowetime' => '当前结束时间',
'nexttitle' => '下个计划名称',
'nextstime' => '下个开始时间',
'nextetime' => '下个结束时间',
'endtime' => '最大结束时间',
'e_types' => '状态提示'
];
}
//广告位查询统计
protected function tf_elevators($sign = true) {
global $_M,$_YW;
return [
'e_enable' => '状态',
'e_number' => '广告位编号',
'e_address' => '广告位地址', //虚拟字段
'e_size' => '广告位规格',
'endtitle' => '上个计划名称',
'endstime' => '上个开始时间',
'endetime' => '上个结束时间',
'nowtitle' => '当前计划名称',
'nowstime' => '当前开始时间',
'nowetime' => '当前结束时间',
'nexttitle' => '下个计划名称',
'nextstime' => '下个开始时间',
'nextetime' => '下个结束时间',
'endtime' => '最大结束时间',
'e_totalnum' => '投放次数',
'etypes' => '排期状态'
];
}
//广告位查询统计
protected function tf_villages($sign = true) {
global $_M,$_YW;
$array = [
'v_name' => '小区名称',
'v_type' => '小区分类',
'v_district' => '所属区域',
'v_address' => '小区地址',
'v_enum' => '广告位',
'v_ebnonum' => '楼号',
'v_eunonum' => '单元',
'v_eenonum' => '电梯',
'v_free' => '广告位',
'v_bno' => '楼号',
'v_uno' => '单元',
'v_eno' => '电梯',
'v_lease' => '排期中的个数',
'v_endday' => '到期个数',
'v_prerow' => '预排的个数',
'v_text' => '备注'
];
if($this->bsign){
$array['v_free'] = '闲置广告位总数';
$array['v_bno'] = '闲置楼号';
$array['v_uno'] = '闲置单元';
$array['v_eno'] = '闲置电梯';
$array['v_enum'] = '广告位总数';
$array['v_ebnonum'] = '楼号总数';
$array['v_eunonum'] = '单元总数';
$array['v_eenonum'] = '电梯总数';
$array['v_price'] = '小区均价';
$array['v_psize'] = '居住规模';
}else{
unset($array['v_district']);
}
return $array;
}
//广告位查询统计
protected function tf_noticeday($sign = true) {
global $_M,$_YW;
return [
'h_number' => '合同编号',
'h_signtime' => '签订日期',
'h_cid' => '签定公司',
'h_tprice' => '合同总额',
'h_wid' => '签定人员',
'h_starttime' => '投放开始时间',
'h_endtime' => '投放结束时间',
'h_text' => '备注',
// 'endtime' => '提醒时间',
'htypes' => '提示说明'
];
}
//前台巡查页面
protected function tf_patrol($sign = true) {
global $_M,$_YW;
return [
'e_number' => '编号',
'e_address' => '地址', //虚拟字段
'nowtitle' => '名称',
// 'nowstime' => '开始时间',
// 'nowetime' => '剩余',
];
}
//巡查列表
protected function tf_keylist($sign = true) {
global $_M,$_YW;
return [
// 'k_passkey' => '密钥密码',
'k_basekey' => '密文密码',
'k_wid' => '相关联系人',
'k_state' => '密钥状态',
'k_addtime' => '新增时间',
'k_updatetime' => '修改时间',
'k_text' => '备注'
];
}
}

View File

@ -0,0 +1,716 @@
<?php
/*
* 表格列表的结果处理
*/
trait tlist {
//按钮组
protected $btn = [];
//禁用最后的按钮
protected $banbtn = false;
//相关参数缓存
protected static $para = [];
//相关公司缓存
protected static $customer = [];
//相关联系人缓存
protected static $workers = [];
//小区缓存
protected static $village = [];
//公用删除
//$query 主要用来替换删除按钮的值
protected function btn_group($val,$checked,$query = []) {
global $_M,$_YW;
if(empty($checked)){
if($query !== false){
$para = [
'c' => 'table_off',
'a' => 'doindex',
'submit_type' => 'delet',
'all_id' => $val['id'],
'tname' => $this->tname,
];
$query = array_merge($para,$query);
$href = parent::http_build_query($_M['url']['own_name'],$query);
$this->btn[] = '<a
class="btn btn-danger btn-sm"
table-delet
data-plugin="alertify"
data-type="confirm"
data-label-ok="确定"
data-label-cancel="取消"
data-confirm-title="确定要删除选中的信息吗?一旦删除将不能恢复!"
href="'.$href.'"
>删除</a>';
}
}else{
$this->btn[] = '<button type="button" class="btn btn-default btn-outline m-l-5" table-cancel>撤销</button>';
}
if(count($this->btn) > 0){
$btnstr = arrayto_string($this->btn,'');
unset($this->btn);
return '<div class="btn-group" role="group" >'.$btnstr.'</div>';
}
}
//整合
private function assemble($key,$base,$val,$checked,$query = []) {
global $_M,$_YW;
//搜索处理
foreach ($this->search_input as $vs){
if(in_array($vs, $this->skip_field,true)) continue;
$search = trim(strtoupper($this->form[$vs]));
if($search != null) $val[$vs] = str_ireplace($search, '<font color="#FF0000">'.$search.'</font>', $val[$vs]);
}
//按钮组处理
$operation = [];
if($this->banbtn == false) $operation['__operation'] = self::btn_group($val,$checked,$query);
//结果整合处理
return array_merge($base,$key,array_intersect_key($val,$key),$operation);
}
//广告位详细地址转换
protected function eaddress(&$val,$_address = 'e_address',$sign = false){
global $_M,$_YW;
//楼号
if(empty(self::$para['e_bno'])) self::$para['e_bno'] = parent::translate(3);
//单元号
if(empty(self::$para['e_uno'])) self::$para['e_uno'] = parent::translate(4);
//电梯号
if(empty(self::$para['e_eno'])) self::$para['e_eno'] = parent::translate(5);
//广告位置
if(empty(self::$para['e_aps'])) self::$para['e_aps'] = parent::translate();
//小区
if(empty(self::$village[$val['e_vid']])) self::$village[$val['e_vid']] = parent::villagelist($val['e_vid']);
if($sign){
$val['e_vid'] = self::$village[$val['e_vid']];
$val['e_bno'] = self::$para['e_bno'][$val['e_bno']];
$val['e_uno'] = self::$para['e_uno'][$val['e_uno']];
$val['e_eno'] = self::$para['e_eno'][$val['e_eno']];
$val['e_aps'] = self::$para['e_aps'][$val['e_aps']];
}else{
$villages = [
self::$village[$val['e_vid']],
self::$para['e_bno'][$val['e_bno']],
self::$para['e_uno'][$val['e_uno']],
self::$para['e_eno'][$val['e_eno']],
self::$para['e_aps'][$val['e_aps']]
];
$val[$_address] = arrayto_string($villages,' ');
}
}
// +----------------------------------------------------------------------
// | 各表处理
// +----------------------------------------------------------------------
//广告位统计
protected function elevator($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_elevator();
//列表前段
$base[] = '<span class="checkbox-custom checkbox-primary">
<input class="selectable-item" type="checkbox" name="id" value="'.$val['id'].'">
<label></label>
</span>';
//对字段处理
//楼号
if(empty(self::$para['e_bno'])) self::$para['e_bno'] = parent::translate(3);
//单元号
if(empty(self::$para['e_uno'])) self::$para['e_uno'] = parent::translate(4);
//电梯号
if(empty(self::$para['e_eno'])) self::$para['e_eno'] = parent::translate(5);
//广告位置
if(empty(self::$para['e_aps'])) self::$para['e_aps'] = parent::translate();
//小区
if(empty(self::$village[$val['e_vid']])) self::$village[$val['e_vid']] = parent::villagelist($val['e_vid']);
$scheduleurl = $this->own_name_table.'elevators&e_number='.$val['e_number'];
$val['e_number'] = '<a href="'.$scheduleurl.'"> '.$val['e_number'].'</a>';
$val['e_enable'] = parent::type_onoff('e_enable',$val['e_enable'],$val['id'],['禁用','启用']);
$val['e_vid'] = self::$village[$val['e_vid']];
$val['e_bno'] = self::$para['e_bno'][$val['e_bno']];
$val['e_uno'] = self::$para['e_uno'][$val['e_uno']];
$val['e_eno'] = self::$para['e_eno'][$val['e_eno']];
$val['e_aps'] = self::$para['e_aps'][$val['e_aps']];
$val['e_state'] = parent::e_state();
$val['e_label'] = parent::tab_tokenfield($val['e_label'],2);
//执行操作按钮
if(empty($checked)){
$addtourl = $this->own_name_info.__FUNCTION__.'&id='.$val['id'];
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-success btn-sm">编辑</a>';
}
//跳过标记突出处理
$this->skip_field = ['e_number'];
return self::assemble($key,$base,$val,$checked);
}
//小区统计
protected function village($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_village();
//列表前段
$base[] = '<span class="checkbox-custom checkbox-primary">
<input class="selectable-item" type="checkbox" name="id" value="'.$val['id'].'">
<label></label>
</span>';
//对字段处理
$workerswid = stringto_array($val['v_wid'],',');
foreach ($workerswid as $vwid) {
if(empty(self::$workers[$vwid])) self::$workers[$vwid] = parent::workerslist($vwid);
$workersstr[] = self::$workers[$vwid];
}
//小区分类
if(empty(self::$para['v_type'])) self::$para['v_type'] = parent::translate(6);
$vnameurl = $this->own_name_table.'elevator&e_vid='.$val['id'];
$totalstr = arrayto_string([$val['total'],$val['noban'],$val['normal']],' / ');
$val['v_name'] = '<a href="'.$vnameurl.'"> '.$val['v_name'].'</a>';
$val['v_type'] = self::$para['v_type'][$val['v_type']];
$val['v_wid'] = parent::tab_tokenfield(arrayto_string($workersstr),1);
$val['v_address'] = $val['v_province'].$val['v_city'].$val['v_district'].$val['v_address'];
$val['v_totalstr'] = $val['noban'] > 0?parent::str_color(0,$totalstr,600):$totalstr;
//执行操作按钮
if(empty($checked)){
$this->btn[] = '<a href="'.$vnameurl.'" class="btn btn-primary btn-sm">查看广告位</a>';
$addtourl = $this->own_name_info.__FUNCTION__.'&id='.$val['id'];
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-success btn-sm">编辑</a>';
}
return self::assemble($key,$base,$val,$checked);
}
//广告合同关联表
protected function schedule($val,$checked = '',$base = []) {
global $_M,$_YW;
//获取字段
$key = self::tf_schedule();
//对字段处理
//公司名称
if(empty(self::$customer[$val['h_cid']])) self::$customer[$val['h_cid']] = parent::customerlist($val['h_cid']);
$s_type = strtotime($val['l_endtime']) >= strtotime(date('Y-m-d',time()))?1:0;
if(empty(self::$para['ltype']) && $s_type) self::$para['ltype'] = parent::translate(2);
$val['ltype'] = parent::state_color($s_type,['已经结束',self::$para['ltype'][$val['l_schedule']]]);
$val['h_cid'] = self::$customer[$val['h_cid']];
$val['e_enable'] = $val['e_enable'] == 0 || $this->bsign == false?parent::state_color($val['e_enable'],['禁用','启用']):'';
self::eaddress($val,'l_address',$this->bsign);
return self::assemble($key,$base,$val,$checked,false);
}
//合同归档
protected function contract($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_contract();
//列表前段
$base[] = '<span class="checkbox-custom checkbox-primary">
<input class="selectable-item" type="checkbox" name="id" value="'.$val['id'].'">
<label></label>
</span>';
//对字段处理
//公司名称
if(empty(self::$customer[$val['h_cid']])) self::$customer[$val['h_cid']] = parent::customerlist($val['h_cid']);
//相关人员
$workerswid = stringto_array($val['h_wid'],',');
foreach ($workerswid as $hwid) {
if(empty(self::$workers[$hwid])) self::$workers[$hwid] = parent::workerslist($hwid);
$workersstr[] = self::$workers[$hwid];
}
//内连接
$h_number = $val['h_number']; //避免后面采用
$launchurl = $this->own_name_table.'launch&l_hnumber='.$h_number;
$curdate = date('Y-m-d',time());
$val['h_number'] = '<a href="'.$launchurl.'"> '.$h_number.'</a>';
$val['h_cid'] = self::$customer[$val['h_cid']];
$val['h_wid'] = parent::tab_tokenfield(arrayto_string($workersstr),1);
$val['h_noticeday'] = parent::tab_tokenfield($val['h_noticeday'],2);
$val['h_starttime'] = strtotime($val['h_starttime']) > strtotime($curdate)?parent::str_color(2,$val['h_starttime'],600):$val['h_starttime'];
$val['h_endtime'] = strtotime($val['h_endtime']) < strtotime($curdate)?parent::str_color(0,$val['h_endtime'],600):$val['h_endtime'];
//执行操作按钮
if(empty($checked)){
$addtourl = $this->own_name_info.'launch&cid='.$val['id'];
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-primary btn-sm">新增投放</a>';
$this->btn[] = '<a href="'.$launchurl.'" class="btn btn-info btn-sm">查看投放</a>';
$addtourl = $_M['url']['own_name'].'c=backups&a=doindex&tname=schedule&l_hnumber='.$h_number;
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-warning btn-sm">导出排期</a>';
$addtourl = $this->own_name_info.__FUNCTION__.'&id='.$val['id'];
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-success btn-sm">编辑</a>';
}
//跳过标记突出处理
$this->skip_field = ['h_number'];
return self::assemble($key,$base,$val,$checked);
}
//公司资料
protected function customer($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_customer();
//列表前段
$base[] = '<span class="checkbox-custom checkbox-primary">
<input class="selectable-item" type="checkbox" name="id" value="'.$val['id'].'">
<label></label>
</span>';
//对字段处理
//相关人员
$workerswid = stringto_array($val['c_wid'],',');
foreach ($workerswid as $cwid) {
if(empty(self::$workers[$cwid])) self::$workers[$cwid] = parent::workerslist($cwid);
$workersstr[] = self::$workers[$cwid];
}
$hcidurl = $this->own_name_table.'contract&h_cid='.$val['id'];
$val['c_allname'] = '<a href="'.$hcidurl.'"> '.$val['c_allname'].'</a>';
$val['c_wid'] = parent::tab_tokenfield(arrayto_string($workersstr),1);
$val['c_address'] = $val['c_province'].$val['c_city'].$val['c_district'].$val['c_address'];
//执行操作按钮
if(empty($checked)){
$addtourl = $this->own_name_info.__FUNCTION__.'&id='.$val['id'];
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-success btn-sm">编辑</a>';
}
return self::assemble($key,$base,$val,$checked);
}
//企业联系人
protected function workers($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_workers();
//列表前段
$base[] = '<span class="checkbox-custom checkbox-primary">
<input class="selectable-item" type="checkbox" name="id" value="'.$val['id'].'">
<label></label>
</span>';
//拿到对应的ID
//职务
if(empty(self::$para)) self::$para = parent::translate(1);
//对字段处理
$val['w_jid'] = self::$para[$val['w_jid']];
$val['w_tel'] = parent::tab_tokenfield($val['w_tel'],1);
//执行操作按钮
if(empty($checked)){
$addtourl = $this->own_name_info.__FUNCTION__.'&id='.$val['id'];
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-success btn-sm">编辑</a>';
}
return self::assemble($key,$base,$val,$checked);
}
//参数统计
protected function para($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_para();
//列表前段
$base[] = '<span class="checkbox-custom checkbox-primary">
<input class="selectable-item" type="checkbox" name="id" value="'.$val['id'].'" '.$checked.'>
<label></label>
</span>';
//对字段处理
//优先计算
switch ($val['p_type']) {
case 0:
$p_num = $this->tsql->table('elevator')->where(['e_aps' => $val['p_value']])->count();
break;
case 1:
$p_num = $this->tsql->table('workers')->where(['w_jid' => $val['p_value']])->count();
break;
case 2:
$p_num = $this->tsql->table('launch')->where(['l_schedule' => $val['p_value']])->count();
break;
case 3:
$p_num = $this->tsql->table('elevator')->where(['e_bno' => $val['p_value']])->count();
break;
case 4:
$p_num = $this->tsql->table('elevator')->where(['e_uno' => $val['p_value']])->count();
break;
case 5:
$p_num = $this->tsql->table('elevator')->where(['e_eno' => $val['p_value']])->count();
break;
case 6:
$p_num = $this->tsql->table('village')->where(['v_type' => $val['p_value']])->count();
break;
case 7:
$p_num = $this->tsql->table('launch')->where(['l_type' => $val['p_value']])->count();
break;
default:
break;
}
//有数据后不允许再修改参数值,可修改参数名,且不是在新增情况下
if($p_num > 0 && empty($checked)){
$readonly = ' readonly="readonly" ';
}
$inputp_num = '<input type="hidden" name="p_num-'.$val['id'].'" value="'.$p_num.'">';
$val['p_num'] = $checked?$inputp_num:$p_num.' 条'.$inputp_num;
$val['p_type'] = '<div class="form-group">
<select class="form-control" name="p_type-'.$val['id'].'" data-checked="'.$val['p_type'].'" required >
<option value="0">广告位置</option>
<option value="1">企业职位</option>
<option value="2">投放进度</option>
<option value="3">小区楼号</option>
<option value="4">单元号</option>
<option value="5">电梯编号</option>
<option value="6">小区分类</option>
<option value="7">广告类型</option>
</select>
</div>';
$val['p_order'] = '<div class="form-group">
<input type="text" name="p_order-'.$val['id'].'" value="'.$val['p_order'].'" placeholder="仅支持数字" data-fv-integer="true" data-fv-integer-message="请输入有效的整数数字" class="form-control">
</div>';
$val['p_name'] = '<div class="form-group">
<input type="text" name="p_name-'.$val['id'].'" value="'.$val['p_name'].'" required class="form-control">
</div>';
$val['p_value'] = '<div class="form-group">
<input type="text" name="p_value-'.$val['id'].'" value="'.$val['p_value'].'" placeholder="仅支持数字" data-fv-integer="true" data-fv-integer-message="请输入有效的整数数字" class="form-control" '.$readonly.'>
</div>';
$val['p_text'] = '<input type="text" name="p_text-'.$val['id'].'" value="'.$val['p_text'].'" class="form-control">';
//执行操作按钮
return self::assemble($key,$base,$val,$checked,$p_num > 0?false:[]);
}
//投放计划
protected function launch($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_launch();
//列表前段
$base[] = '<span class="checkbox-custom checkbox-primary ap-one">
<input class="selectable-item" type="checkbox" name="id" value="'.$val['id'].'" '.$checked.'>
<label></label>
</span>';
//对字段处理
if(empty(self::$para['l_schedule'])) self::$para['l_schedule'] = parent::translate(2);
if(empty(self::$para['l_type'])) self::$para['l_type'] = parent::translate(7);
$enum = count(array_filter(stringto_array($val['l_enumber'],',')));
$snum = count(array_filter(stringto_array($val['l_selectenum'],',')));
$esstr = " {$enum} / {$snum} ";
$curdate = date('Y-m-d',time());
$l_titleurl = $this->own_name_table.'schedule&l_id='.$val['id'];
$val['l_totalnum'] = $enum == $snum?$esstr:parent::state_color(0,[$esstr]); //放在最前面防止后面对l_enumber 字段的处理
$val['l_title'] = '<a href="'.$l_titleurl.'"> '.$val['l_title'].'</a>';
$val['l_enumber'] = parent::tab_tokenfield($val['l_enumber'],1,',',6);
$val['l_schedule'] = parent::tab_tokenfield(self::$para['l_schedule'][$val['l_schedule']],1);
$val['l_type'] = self::$para['l_type'][$val['l_type']];
$val['l_starttime'] = strtotime($val['l_starttime']) > strtotime($curdate)?parent::str_color(2,$val['l_starttime'],600):$val['l_starttime'];
$val['l_endtime'] = strtotime($val['l_endtime']) < strtotime($curdate)?parent::str_color(0,$val['l_endtime'],600):$val['l_endtime'];
//执行操作按钮
if(empty($checked)){
$this->btn[] = '<a href="'.$l_titleurl.'" class="btn btn-info btn-sm">查看排期</a>';
$addtourl = $_M['url']['own_name'].'c=backups&a=doindex&tname=schedule&id='.$val['id'];
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-warning btn-sm">导出排期</a>';
$addtourl = $this->own_name_info.__FUNCTION__.'&slid='.$val['id'];
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-success btn-sm">编辑</a>';
}
return self::assemble($key,$base,$val,$checked);
}
//广告位统计
protected function applan($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_applan();
//列表前段
$e_number = $val['e_number'];
//判断之前是否已经选中
$ebool = in_array($e_number, array_filter(stringto_array($this->form['l_selectenum'],',')),true);
//给予选中标识
$class = ' checkbox-primary '; //刚选择默认颜色
//$val['lanum'] 大于0 说明重复,不可投放
if($ebool) {
$apchecked = ' checked ';
$slid = $this->form['slid'];
//判断排期表内是否存在
if(!empty($this->form['slid'])){
if(empty(self::$para[$slid])) self::$para[$slid] = $this->tsql->table('launch')->where(['id' => $slid])->one();
$l_hnumber = stringto_array(self::$para[$slid]['l_enumber'],',');
$class = in_array($e_number,$l_hnumber,true)?' checkbox-success ':' checkbox-danger '; //刚选择默认颜色
}
}
// 判断广告位是否可排期
if(empty($val['e_enable'])){
$e_types = parent::str_color(0,'禁止投放');
if($apchecked) {
$class .= ' ap-one-disabled ';
}else{
$disabled = ' disabled ';
}
}else{
$s_starttime = $_M['form']['l_starttime'];
$s_endtime = $_M['form']['l_endtime'];
if($s_starttime && $s_endtime && strtotime($s_starttime) <= strtotime($s_endtime)){
//判断是否可排期成功
if($val['lanum'] > 0){
$e_types = parent::str_color(0,'禁止投放');
if($apchecked) {
$class .= ' ap-one-disabled ';
}else{
$disabled = ' disabled ';
}
}else{
$e_types = parent::str_color(1,'可投放');
}
}else{
$e_types = parent::str_color(3,'无法判断');
}
}
// checkbox-danger 没有在排期库的显示为红色 checkbox-primary 正常的显示蓝色 checkbox-success 绿色
$base[] = '<span class="checkbox-custom '.$class.' ap-one">
<input class="selectable-item" type="checkbox" name="id" value="'.$e_number.'" '.$apchecked.$disabled.'>
<label></label>
</span>';
//对字段处理
$curtime = strtotime(date('Y-m-d',time()));
//上个排期
if(strtotime($val['endetime']) < $curtime){
$val['endtitle'] = '<span class="blue-grey-400">'.$val['endtitle'].'</span>';
$val['endstime'] = '<span class="blue-grey-400">'.$val['endstime'].'</span>';
$val['endetime'] = '<span class="blue-grey-400">'.$val['endetime'].'</span>';
}
$val['endtime'] = strtotime($val['endtime']) < $curtime
?'<span class="line_through blue-grey-400">'.$val['endtime'].'</span>'
:$val['endtime'];
$val['e_types'] = $e_types;
$val['e_enable'] = parent::state_color($val['e_enable'],['禁用','启用']);
self::eaddress($val,'e_address');
//比较每个广告位的结束时间 和 现在设置的投放订单的开始时间 大小
//禁用最后的按钮
$this->banbtn = true;
return self::assemble($key,$base,$val,$checked,false);
}
//广告位统计
protected function elevators($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_elevators();
//列表前段
$base[] = '<span class="checkbox-custom checkbox-primary ap-one">
<input class="selectable-item" type="checkbox" name="id" value="'.$val['e_number'].'" '.$checked.'>
<label></label>
</span>';
//对字段处理
$curtime = strtotime(date('Y-m-d',time()));
$scheduleurl = $this->own_name_table.'schedule&e_number='.$val['e_number'];
$uplaunchurl = $this->own_name_info.'uplaunch&e_number='.$val['e_number'];
$val['e_number'] = '<a href="'.$scheduleurl.'"> '.$val['e_number'].'</a>';
$val['etypes'] = parent::state_color($val['etypes'],[$val['e_enable']?'空位':'已禁用','排期中']);
$val['e_enable'] = parent::state_color($val['e_enable'],['禁用','启用']);
$scheduleurlid = $this->own_name_table.'schedule&l_id=';
$val['endtitle'] = $val['endtitle']?'<a href="'.$scheduleurlid.$val['endid'].'">'.$val['endtitle'].'</a>':'';
$val['nowtitle'] = $val['nowtitle']?'<a href="'.$scheduleurlid.$val['nowid'].'">'.$val['nowtitle'].'</a>':'';
$val['nexttitle'] = $val['nexttitle']?'<a href="'.$scheduleurlid.$val['nextid'].'">'.$val['nexttitle'].'</a>':'';
self::eaddress($val,'e_address');
$val['endtime'] = strtotime($val['endtime']) < $curtime
?'<span class="line_through blue-grey-400">'.$val['endtime'].'</span>'
:$val['endtime'];
//上个排期
if(strtotime($val['endetime']) < $curtime){
$val['endstime'] = '<span class="blue-grey-400">'.$val['endstime'].'</span>';
$val['endetime'] = '<span class="blue-grey-400">'.$val['endetime'].'</span>';
}
//执行操作按钮
if(empty($checked)){
// $this->btn[] = '<a href="'.$uplaunchurl.'" class="btn btn-success btn-sm">调整排期</a>';
$this->btn[] = '<a href="'.$scheduleurl.'" class="btn btn-primary btn-sm">查看排期</a>';
}
//跳过标记突出处理
$this->skip_field = ['e_number'];
return self::assemble($key,$base,$val,$checked,false);
}
//小区统计展示
protected function villages($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_villages();
//列表前段
$base[] = '<span class="checkbox-custom checkbox-primary">
<input class="selectable-item" type="checkbox" name="id" value="'.$val['id'].'">
<label></label>
</span>';
//小区分类
if(empty(self::$para['v_type'])) self::$para['v_type'] = parent::translate(6);
//对字段处理
$scheduleurl = $this->own_name_table.'schedule&e_vid='.$val['id'];
$val['v_name'] = '<a href="'.$scheduleurl.'" title="查看排期"> '.$val['v_name'].'</a>';
$val['v_type'] = self::$para['v_type'][$val['v_type']];
$val['v_free'] = $val['v_free']?'<span class="tag tag-sm tag-pill tag-info">'.$val['v_free'].'</span>':$val['v_free'];
$val['v_lease'] = $val['v_lease']?'<span class="tag tag-sm tag-pill tag-warning">'.$val['v_lease'].'</span>':$val['v_lease'];
$val['v_endday'] = $val['v_endday']?'<span class="tag tag-sm tag-pill tag-success">'.$val['v_endday'].'</span>':$val['v_endday'];
$val['v_prerow'] = $val['v_prerow']?'<span class="tag tag-sm tag-pill tag-primary">'.$val['v_prerow'].'</span>':$val['v_prerow'];
if($val['noban'] > 0){
$val['v_enum'] = '<span class="tag tag-sm tag-pill tag-dark">'.$val['v_enum'].'</span>';
if($this->bsign) $val['v_enum'] .= ' -- ';
$val['v_enum'] .= '<span class="tag tag-sm tag-pill tag-danger m-l-10">'.$val['noban'].'</span>';
}else{
$val['v_enum'] = $val['v_enum']?:'<span class="tag tag-sm tag-pill tag-danger">'.$val['v_enum'].'</span>';
}
// $val['v_province'].$val['v_city'] 去掉省市
if(!$this->bsign) $val['v_address'] = $val['v_district'].' '.$val['v_address'];
//执行操作按钮
if(empty($checked)){
$addtourl = $this->own_name_table.'elevators&e_vid='.$val['id'];
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-primary btn-sm">广告位统计</a>';
}
return self::assemble($key,$base,$val,$checked,false);
}
//小区统计展示
protected function noticeday($val,$checked = '',$base = []) {
global $_M,$_YW;
//获取字段
$key = self::tf_noticeday();
//列表前段
//对字段处理
//公司
if(empty(self::$customer[$val['h_cid']])) self::$customer[$val['h_cid']] = parent::customerlist($val['h_cid']);
//相关人员
$workerswid = stringto_array($val['h_wid'],',');
foreach ($workerswid as $hwid) {
if(empty(self::$workers[$hwid])) self::$workers[$hwid] = parent::workerslist($hwid);
$workersstr[] = self::$workers[$hwid];
}
$h_endtime = strtotime($val['h_endtime']);
$curdate = strtotime(date('Y-m-d',time()));
//首先判断当前这条信息是属于到期前台3天的 还是属于设置的提醒
//那就是判断订单结束时间和今天的相差天数
$day = abs(($h_endtime - $curdate) / 86400);
if($day > 3){
//按照设置的提醒来计算
$str = parent::str_color(0,$val['noticeday'],800);
$htypes = "{$str} 天后到期提醒";
}else{
//按照前后3天来设置
if($h_endtime > $curdate){
$str = parent::str_color(0,$day,800);
//说明还没到期
$htypes = "{$str} 天后到期";
}else{
//说明已经到期或者过期
$htypes = $day == 0?parent::str_color(0,'今天到期',800):parent::str_color(0,"已过期 {$day}",800);
}
}
//设置的到期提醒
//订单到期前后3天提醒
$val['h_cid'] = self::$customer[$val['h_cid']];
$val['h_wid'] = parent::tab_tokenfield(arrayto_string($workersstr),1);
$val['htypes'] = $htypes;
$numberurl = $this->own_name_table.'contract&h_number='.$val['h_number'];
$val['h_number'] = '<a href="'.$numberurl.'" title="查看排期"> '.$val['h_number'].'</a>';
return self::assemble($key,$base,$val,$checked,false);
}
//前台巡查
protected function patrol($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_patrol();
//列表前段
//对字段处理
//计算剩余时间
$nowetime = strtotime($val['nowetime']);
$curdate = strtotime(date('Y-m-d',time()));
$day = $val['nowetime']?abs(($nowetime - $curdate) / 86400):0;
$val['e_number'] = parent::state_color($val['e_enable'],[$val['e_number'],$val['e_number']]);
self::eaddress($val,'e_address');
$val['nowtitle'] = parent::state_color($curdate > $nowetime ?0:($day > 2?1:2),[$val['nowtitle'],$val['nowtitle'],$val['nowtitle']]);
return self::assemble($key,[],$val,$checked,false);
}
//参数统计
protected function keylist($val,$checked = '') {
global $_M,$_YW;
//获取字段
$key = self::tf_keylist();
//列表前段
$base[] = '<span class="checkbox-custom checkbox-primary">
<input class="selectable-item" type="checkbox" name="id" value="'.$val['id'].'" '.$checked.'>
<label></label>
</span>';
//对字段处理
if(empty(self::$workers[$val['k_wid']])) {
$k_wid = parent::workerslist($val['k_wid'],false);
self::$workers[$val['k_wid']] = $k_wid['w_name'].','.$k_wid['w_tel'];
}
$val['k_basekey'] = base64_decode($val['k_basekey']);
$val['k_state'] = parent::state_color($val['k_state'],['禁用','启用']);
$val['k_wid'] = parent::tab_tokenfield(self::$workers[$val['k_wid']],1);
//执行操作按钮
if(empty($checked)){
$addtourl = $this->own_name_info.__FUNCTION__.'&id='.$val['id'];
$this->btn[] = '<a href="'.$addtourl.'" class="btn btn-success btn-sm">编辑</a>';
}
//执行操作按钮
return self::assemble($key,$base,$val,$checked);
}
}

1086
met_public/js/basic_admin.js Normal file

File diff suppressed because one or more lines are too long

4
public/js/city/README.md Normal file
View File

@ -0,0 +1,4 @@
# 城市JSON
根据系统城市JSON优化后的城市JSON
1、在米拓6.2之前的版本时,二级城市和三级城市不存在‘请选择’选项,优化后新增此项
2、在米拓6.2版本时系统二级城市和三级城市增加了‘请选择’选项,但又给一级城市增加了简称,优化去掉一级城市的简称

1555
src/admin/index.class.php Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,196 @@
<?php
/*
* 核心方法
* 应用支持php5.4+
*/
trait appcmp {
# 应用文件名
public $m_name = M_NAME;
# 应用数据库名简写
public $k_name;
# 数据库简写名
public $tname;
# 模板路径
public $appshow = '';
#是否要执行析构方法
public $destruct = true;
protected function show($file, $data)
{
global $_M, $_YW;
$view =load::sys_class('engine','new');
require_once $view->dodisplay($file, $data);
}
protected function check_auth() {
global $_M, $_YW;
self::cmp_a();
$exetime = time();
$bool = false;
//解密后的数组
$cache = json_decode(authcode($_YW['c']['ac_cache'],'DECODE',md5($_M['config']['met_weburl'])),true);
//查看本地是否存在禁止更新锁
if(file_exists(PATH_APP_FILE."config/update.lock")) $cache['update'] = 1;
//需要对比数据
if( $cache['time'] > $exetime || ($cache['time'] > $cache['exetime'] && $cache['time'] < $exetime) ){
$check = json_decode(authcode($cache['check'],'DECODE', md5(self::parse_url($_M['config']['met_weburl']).md5($this->m_name.$_YW['app']['addtime']))),true);
$state = $check['state'] && $check['app']['v_m_name'] == $this->m_name?true:false;
if($state){
if($check['vatime']['minute'] > 0){
//对有效时间计算
$time = date('Y-m-d H:i:s',$check['vatime']['stime']);
$endtime = strtotime("{$time} +{$check['vatime']['minute']} minute");
if($endtime <= $exetime ) $state = false;
}
//最终结果判断
$bool = $state && !empty($cache['wechat']) && !empty($cache['update'])?true:false;
}
}
if(!$bool) turnover($_M['url']['own_name'].'c=index&a=doindex&check=1','No prompt');
}
# 加载方法
public function loadp($str = '') {
global $_M, $_YW;
$arr = explode(",",$str);
foreach ($arr as $val) {
self::$val();
}
}
# 批量加载
public function cmp_load() {
global $_M, $_YW;
self::loadp('cmp_k,cmp_c,cmp_t');
}
# 获取完整数据库
public function cmp_k() {
global $_M, $_YW;
//全局
$globaltablename = ['cloud_config'];
//应用独有表名
$tablename = file_get_contents(PATH_ALL_APP.$this->m_name.'/config/table');
$this->k_name = array_diff(stringto_array($tablename,','),$globaltablename);
foreach ($this->k_name as $val) {
$_YW['k'][$val] = $_M['table'][$this->m_name . '_' . $val];
}
foreach ($globaltablename as $val) {
$_YW['k'][$val] = $_M['table'][$val];
}
}
# 配置信息
public function cmp_c($lang = '') {
global $_M, $_YW;
$_YW['n'] = $this->m_name;
if (empty($lang)) $lang = $_M['lang'];
$result = DB::query("select name,value from {$_M['table']['cloud_config']} where m_name = '{$this->m_name}' AND (lang = '{$lang}' OR lang = 'cloud') ");
while ($val = DB::fetch_array($result)) {
$_YW['c'][$val['name']] = $val['value'];
}
if(class_exists('admin') || class_exists('app')) self::check_auth();
}
# 应用信息
public function cmp_a() {
global $_M, $_YW;
$_YW['app'] = DB::get_one("SELECT * FROM {$_M['table']['applist']} WHERE m_name='{$this->m_name}' ");
}
# 栏目信息
public function cmp_ac() {
global $_M, $_YW;
$_YW['app']['column'] = DB::get_one("SELECT * FROM {$_M['table']['column']} WHERE module='{$_YW['app']['no']}' AND lang='{$_M['lang']}' ");
}
# 语言文字
public function cmp_t() {
global $_M, $_YW;
$file = PATH_APP_FILE . 'lang/' . $_M['lang'] . '.php';
if (!file_exists($file)) {
$file = PATH_APP_FILE . 'lang/cn.php';
}
if (file_exists($file)) require_once($file);
}
# 单条配置语句入库
public function addconsql($name, $val = '',$lang) {
global $_M, $_YW;
if (empty($lang)) $lang = $_M['lang'];
DB::query("INSERT INTO {$_M['table']['cloud_config']} (name,lang,m_name,value) VALUES ('{$name}','{$lang}','{$this->m_name}','{$val}') ON DUPLICATE KEY UPDATE value='{$val}' ");
}
# 信息JQ弹出并刷新当前页面
public function scriptgo($info) {
global $_M;
$this->destruct = false;
echo "<script>alert('{$info}');history.go(-1);</script>";
exit(0);
}
//表简称
public function tname() {
global $_M, $_YW;
return substr($_M['form']['a'],2);
}
//时间格式化
public function data_time($time) {
global $_M,$_YW;
return $time?date('Y-m-d H:i:s', $time):'';
}
//字符截取
public function sub_str($str) {
global $_M,$_YW;
return strlen($str) > 0?substr($str,0, 8).'...':'';
}
/*
* 把数组转成JSON用于ajax返回可以用于普通json请求返回也可以用于跨域的ajax的jsonp格式的数据请求返回。
* @param array $back 输出字符串或数组
* @param string $callback ajax的回调函数的名称
*/
public function jsoncallback($back, $callback = 'callback') {
global $_M;
header('Content-type: application/x-javascript');
$callback = $_M['form'][$callback];
$json = json_encode($back,JSON_UNESCAPED_UNICODE);
echo $callback?$callback . '(' . $json . ')':$json;
}
# 分析网址
public function parse_url($url,$type = 'host') {
global $_M;
$url = url_standard($url);
$array = parse_url($url);
return $type == 'arr'?$array:$array[$type];
}
//URL参数处理防止URL拼接错误
public function http_build_query($url,$arr) {
global $_M, $_YW;
if(!in_array(substr($url,-1), ['&','?'])) $url .= '&';
return $url.http_build_query($arr);
}
//前端CSS合并
public function merge_css($addcss = '') {
global $_M, $_YW;
$cssfile = PATH_APP_FILE.'public/css/webcss.css';
if(!file_exists($cssfile)) return false;
$css = file_get_contents($cssfile);
//自定义新增CSS文件
$diycss = PATH_APP_FILE.'public/css/diycss.css';
if(file_exists($diycss)) $css .= PHP_EOL.file_get_contents($diycss);
//通过后台新增的CSS
if(empty($addcss)) $addcss = $_YW['c']['diycss'];
return file_put_contents(PATH_APP_FILE.'web/templates/met/css/metinfo.css', $css.PHP_EOL.$addcss);
}
}

View File

@ -0,0 +1,7 @@
# basic_admin.js
basic_admin.js 替换米拓6.2版本之前的系统文件 public\ui\v2\static\js\basic_admin.js
替换修复以下BUG
1、修复表格新增行时传递给后台的new_id值不能自增BUG
2、修复表格新增行时后台新增的下拉、单选、多选存在默认值不能采用默认值的BUG
3、此文件只是修复后台的BUG前端也存在同样BUG
4、米拓6.2版本时系统已修复第一个BUG第二个BUG依旧存在

File diff suppressed because one or more lines are too long

640
src/update/update.class.php Normal file
View File

@ -0,0 +1,640 @@
<?php
defined('IN_MET') or exit('No permission');
//更新文件的模板
load::sys_class('admin');
load::sys_func('file');
//不继承APP
class update extends admin{
//应用信息
private $app;
//应用NO
private $appno;
//应用文件名
private $m_name;
//应用新版本号
private $newver;
//当前版本号
private $oldver;
//安装锁信息,应用入口信息
private $appinfo = [];
//应用数据库
private $sqlk;
private $fixed_name;
# 初始化
public function __construct() {
global $_M;
parent::__construct();
//安装锁信息,应用入口信息
$this->appinfo = [
'url' => '',
'c' => 'dzadsod',
'a' => 'dodzadsod',
'lang' => $_M['lang'],
'time' => date('Y-m-d H:i:s',time())
];
$this->sqlk = $_M['table']['cloud_config'];
}
//需要传递值
public function set($app) {
global $_M;
$this->app = $app;
$this->appno = $app['no'];
$this->m_name = $app['m_name'];
$this->newver = $app['ver'];
$this->oldver = $app['oldver'];
return $this;
}
//修改数据库版本
public function start() {
global $_M;
if(file_exists(INS_LOCK_FILE)){
switch ($this->newver) {
case 1.1:
//更新数据库
self::inssql();
//更新版本内容
self::update_1_1();
break;
case 1.2:
//更新版本内容
self::update_1_2();
break;
case 1.3:
//更新版本内容
self::update_1_3();
break;
default:
break;
}
//更新版本号
self::upver();
}else{
//创建数据表
self::inssql();
//默认系统表处理
self::systable();
//默认数据
self::default_config();
//创建栏目 [前端页面时才需要API也不需要]
// self::column();
//安装锁
self::install_lock();
}
}
/*
+ 应用新安装操作
+-------------------------------------------------------------------------------------------
+ up1.1 : 更新版本
+-------------------------------------------------------------------------------------------
+ default_config : 默认的应用配置信息方法
+-------------------------------------------------------------------------------------------
+ systable : 当前应用版本针对数据库表的信息
+-------------------------------------------------------------------------------------------
*/
// 1.1 版本
public function update_1_1() {
global $_M;
//执行SQL其他操作
$tview = self::tview();
foreach ($tview as $key => $val){
$tname[] = $key;
$table_name = self::split_table_name($key);
$table[] = $table_name;
DB::query($val);
}
//记录表名
add_table(arrayto_string($table,'|'));
$filetable = PATH_ALL_APP.$this->m_name.'/config/table';
//先获取之前已经存在的简短表名
if(file_exists($filetable)) {
$tnamestr = file_get_contents($filetable);
$tname = array_merge($tname,stringto_array($tnamestr,','));
}else{
//创建
makefile($filetable);
}
//写入
file_put_contents($filetable,arrayto_string($tname,','));
}
// 1.2 版本
public function update_1_2() {
global $_M;
//执行SQL其他操作
$tables = self::table_field();
$table = $tname = [];
foreach ($tables as $key => $val) {
$tname[] = $key;
$table_name = self::split_table_name($key);
$table[] = $table_name;
if($val) DB::query("CREATE TABLE `{$_M['config']['tablepre']}{$table_name}` ( {$val} ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8");
}
//记录表名
add_table(arrayto_string($table,'|'));
$filetable = PATH_ALL_APP.$this->m_name.'/config/table';
//先获取之前已经存在的简短表名
if(file_exists($filetable)) {
$tnamestr = file_get_contents($filetable);
$tname = array_merge($tname,stringto_array($tnamestr,','));
}else{
//创建
makefile($filetable);
}
//写入
file_put_contents($filetable,arrayto_string($tname,','));
}
// 1.3 版本
public function update_1_3() {
global $_M;
//执行SQL其他操作
$tview = self::tview();
foreach ($tview as $key => $val){
$tname[] = $key;
$table_name = self::split_table_name($key);
$table[] = $table_name;
DB::query($val);
}
//记录表名
add_table(arrayto_string($table,'|'));
$filetable = PATH_ALL_APP.$this->m_name.'/config/table';
//先获取之前已经存在的简短表名
if(file_exists($filetable)) {
$tnamestr = file_get_contents($filetable);
$tname = array_merge($tname,stringto_array($tnamestr,','));
}else{
//创建
makefile($filetable);
}
//写入
file_put_contents($filetable,arrayto_string($tname,','));
}
/*
+ 应用新安装操作
+-------------------------------------------------------------------------------------------
+ table_field : 当前应用数据创建依据
+-------------------------------------------------------------------------------------------
+ default_config : 默认的应用配置信息方法
+-------------------------------------------------------------------------------------------
+ systable : 当前应用版本针对数据库表的信息
+-------------------------------------------------------------------------------------------
*/
//数据库创建
protected function table_field() {
global $_M;
// 小区资料库
$zdytable['village'] = " `id` int(11) NOT NULL AUTO_INCREMENT,
`v_name` varchar(255) NOT NULL COMMENT '小区名称',
`v_type` varchar(255) NOT NULL COMMENT '分类',
`v_province` varchar(255) NOT NULL COMMENT '省',
`v_city` varchar(255) NOT NULL COMMENT '市',
`v_district` varchar(255) NOT NULL COMMENT '区',
`v_address` varchar(255) NOT NULL COMMENT '详细地址',
`v_wid` varchar(255) COMMENT '相关联系人',
`v_price` decimal(10,2) DEFAULT NULL COMMENT '小区均价',
`v_psize` int(11) COMMENT '居住人口规模',
`v_text` text COMMENT '备注',
`v_updatetime` datetime DEFAULT NULL,
`v_addtime` datetime DEFAULT NULL,
UNIQUE KEY `vname` (`v_name`),
PRIMARY KEY (`id`)";
// 公司资料库
// 公司地址填写采用选择城市联动的方式填写,方便后期数据查询处理筛选
$zdytable['customer'] = " `id` int(11) NOT NULL AUTO_INCREMENT,
`c_allname` varchar(255) NOT NULL COMMENT '公司全称名称',
`c_name` varchar(255) NOT NULL COMMENT '公司简称名称',
`c_province` varchar(255) NOT NULL COMMENT '省',
`c_city` varchar(255) NOT NULL COMMENT '市',
`c_district` varchar(255) NOT NULL COMMENT '区',
`c_address` varchar(255) NOT NULL COMMENT '详细地址',
`c_wid` varchar(255) COMMENT '相关联系人',
`c_text` text COMMENT '备注',
`c_updatetime` datetime DEFAULT NULL,
`c_addtime` datetime DEFAULT NULL,
UNIQUE KEY `cname` (`c_name`),
PRIMARY KEY (`id`)";
//公司负责人联系方式
//负责人姓名,电话,职位分类,备注
// w_tel 可做成标签,总之要满足多个录入的要求
$zdytable['workers'] = " `id` int(11) NOT NULL AUTO_INCREMENT,
`w_jid` int(11) NOT NULL COMMENT '职务id',
`w_name` varchar(150) NOT NULL COMMENT '姓名',
`w_tel` text COMMENT '联系电话',
`w_text` text COMMENT '备注',
`w_updatetime` datetime DEFAULT NULL,
`w_addtime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)";
// 小区电梯
// 同一个广告位置 不可重复
$zdytable['elevator'] = " `id` int(11) NOT NULL AUTO_INCREMENT,
`e_vid` int(11) COMMENT '小区ID',
`e_number` varchar(100) NOT NULL COMMENT '广告位编号,用于后期各表操作',
`e_bno` int(11) NOT NULL COMMENT '楼号',
`e_uno` int(11) NOT NULL COMMENT '单元号',
`e_eno` int(11) NOT NULL COMMENT '电梯号',
`e_aps` int(11) NOT NULL COMMENT '广告位置',
`e_size` varchar(255) NOT NULL COMMENT '广告位尺寸大小',
`e_enable` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用 0 不启用1 为启用',
`e_label` text COMMENT '自主标签',
`e_text` text COMMENT '备注',
UNIQUE KEY `elidno` (`e_vid`,`e_bno`,`e_uno`,`e_eno`,`e_aps`),
UNIQUE KEY `enumber` (`e_number`),
PRIMARY KEY (`id`)";
// 合同资料库
// h_cid h_wid 采用联动菜单方式
// h_noticeday 可做成tab 标签形式满足多个通知天数
$zdytable['contract'] = " `id` int(11) NOT NULL AUTO_INCREMENT,
`h_number` varchar(100) NOT NULL COMMENT '合同编号,用于后期各表操作',
`h_signtime` varchar(255) COMMENT '签订日期',
`h_cid` int(11) COMMENT '签定公司',
`h_wid` varchar(255) COMMENT '签定相关公司人员',
`h_tprice` decimal(10,2) DEFAULT NULL COMMENT '总价格',
`h_starttime` varchar(255) COMMENT '广告开始时间',
`h_endtime` varchar(255) COMMENT '广告结束时间',
`h_noticeday` varchar(255) COMMENT '提前通知天数',
`h_text` text COMMENT '备注',
`h_updatetime` datetime DEFAULT NULL COMMENT '修改时间',
`h_addtime` datetime DEFAULT NULL COMMENT '录入时间',
UNIQUE KEY `elidno` (`h_number`),
PRIMARY KEY (`id`)";
// 广告投放计划单 //将合同的进度状态调整到投放计划内
$zdytable['launch'] = " `id` int(11) NOT NULL AUTO_INCREMENT,
`l_title` varchar(255) COMMENT '投放计划标题',
`l_hnumber` varchar(100) NOT NULL COMMENT '合同编号',
`l_enumber` text COMMENT '排期成功的广告位编号',
`l_selectenum` text COMMENT '选择的广告位编号',
`l_schedule` int(11) COMMENT '投放进度',
`l_starttime` varchar(255) COMMENT '广告开始时间',
`l_endtime` varchar(255) COMMENT '广告结束时间',
`l_enable` tinyint(1) NOT NULL DEFAULT '1' COMMENT '广告排期状态 0预选1正常 2预排',
`l_type` varchar(255) NOT NULL COMMENT '分类',
`l_text` text COMMENT '备注',
`l_updatetime` datetime DEFAULT NULL COMMENT '修改时间',
`l_addtime` datetime DEFAULT NULL COMMENT '录入时间',
PRIMARY KEY (`id`)";
// 广告时间段排期表,广告位编号,合同编号,开始时间,结束时间,状态
// 排期的缓存表
$zdytable['schedule'] = "
`id` char(36) NOT NULL COMMENT 'uuid',
`s_lid` int(11) COMMENT '广告投放ID',
`s_enumber` varchar(100) NOT NULL COMMENT '广告位编号',
`s_hnumber` varchar(100) NOT NULL COMMENT '合同编号',
`s_starttime` varchar(255) COMMENT '广告开始时间',
`s_endtime` varchar(255) COMMENT '广告结束时间',
UNIQUE KEY `slidse` (`s_lid`,`s_enumber`),
PRIMARY KEY (`id`)
";
// 参数配置
$zdytable['para'] = " `id` int(11) NOT NULL AUTO_INCREMENT,
`p_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '参数分类 0广告位置,1职位,2合同状态,3楼号,4单元号,5电梯编号',
`p_order` int(11) DEFAULT '0' COMMENT '排序',
`p_name` varchar(255) COMMENT '名称',
`p_value` int(11) COMMENT '参数值,必须为数字',
`p_text` varchar(255) COMMENT '备注',
UNIQUE KEY `ptypevalue` (`p_type`,`p_value`),
PRIMARY KEY (`id`)";
// 有序表,处理分割字段
$zdytable['sequence'] = " `seq` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`seq`)";
// 公司资料库
// 公司地址填写采用选择城市联动的方式填写,方便后期数据查询处理筛选
$zdytable['welog'] = " `id` int(11) NOT NULL AUTO_INCREMENT,
`openid` varchar(45) NOT NULL COMMENT '微信用户ID',
`text` text COMMENT '核心内容',
`content` text COMMENT '微信模板信息',
`returntext` text COMMENT '返回信息',
`state` tinyint(1) COMMENT '记录状态',
`exetime` varchar(255) COMMENT '处理时间',
`addtime` varchar(255) COMMENT '录入时间',
PRIMARY KEY (`id`)";
//前台巡查人员的验证密钥密码
$zdytable['keylist'] = " `id` int(11) NOT NULL AUTO_INCREMENT,
`k_passkey` varchar(45) NOT NULL COMMENT '密钥密码',
`k_basekey` text COMMENT '明密',
`k_wid` varchar(255) COMMENT '相关联系人',
`k_state` tinyint(1) COMMENT '密钥状态',
`k_text` text COMMENT '备注',
`k_addtime` varchar(255) COMMENT '新增时间',
`k_updatetime` varchar(255) COMMENT '修改时间',
PRIMARY KEY (`id`)";
/**
* 1、增加新表
* name 配置名称
* id 添加信息自动增加,
* value 配置名称值
* lang 语言[后台]
**/
$zdytable['cloud_config'] = " `id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`m_name` varchar(50) NOT NULL,
`value` text,
`lang` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name_lang` (`name`,`m_name`,`lang`)";
//执行
return $zdytable;
}
//mysql 触发器
protected function trigger() {
global $_M;
//新增schedule 表的更新触发器
$table_name = self::split_table_name('schedule',true);
$launch_name = self::split_table_name('launch',true);
//更新触发器并没有排除两个时间字段为空的排查
$array[] = " CREATE TRIGGER `add` BEFORE INSERT ON `{$table_name}` FOR EACH ROW
BEGIN
IF
EXISTS (
SELECT
`id`
FROM
`{$table_name}`
WHERE
NOT ( s_endtime < new.s_starttime OR s_starttime > new.s_endtime ) AND s_enumber = new.s_enumber)
OR
EXISTS (
SELECT
`id`
FROM
`{$launch_name}`
WHERE
NOT ( l_endtime < new.s_starttime OR l_starttime > new.s_endtime ) AND find_in_set( new.s_enumber, l_enumber ) AND id != new.s_lid )
THEN
SIGNAL SQLSTATE 'SC001' SET MESSAGE_TEXT = '排期时间区间重复';
END IF;
END; ";
// 加入为空排查其他字段就无法实现更新
$array[] = " CREATE TRIGGER `up` BEFORE UPDATE ON `{$table_name}` FOR EACH ROW
BEGIN
IF
EXISTS (
SELECT
`id`
FROM
`{$table_name}`
WHERE
NOT ( s_endtime < new.s_starttime OR s_starttime > new.s_endtime ) AND s_enumber = new.s_enumber AND id != new.id )
OR
EXISTS (
SELECT
`id`
FROM
`{$launch_name}`
WHERE
NOT ( l_endtime < new.s_starttime OR l_starttime > new.s_endtime ) AND find_in_set( new.s_enumber, l_enumber ) AND id != new.s_lid )
THEN
SIGNAL SQLSTATE 'SC002' SET MESSAGE_TEXT = '排期时间区间重复';
END IF;
END; ";
return $array;
}
//mysql 视图
protected function tview() {
global $_M;
//查询到期合同以及根据设置的到期天数提醒
$sequence = self::split_table_name('sequence',true);
$contract = self::split_table_name('contract',true);
$noticeday = self::split_table_name('noticeday',true);
$array['noticeday'] = " CREATE VIEW {$noticeday} AS
SELECT
ct.*,
substring_index( substring_index( ct.h_noticeday, ',', sq.seq ), ',',- ( 1 ) ) AS noticeday,
DATE_SUB(ct.h_endtime,INTERVAL substring_index( substring_index( ct.h_noticeday, ',', sq.seq ), ',',- ( 1 ) ) DAY) AS endtime,
sq.seq
FROM
{$sequence} AS sq INNER JOIN {$contract} AS ct
ON sq.seq <= ( ( 1 + length( ct.h_noticeday ) ) - length( REPLACE ( ct.h_noticeday, ',', '' ) ) ) ";
//查询微信关注用户,排除非关注的用户
$weuser = self::split_table_name('weuser',true);
$nwechat_user = self::split_table_name('nwechat_user',true);
$array['weuser'] = " CREATE VIEW {$weuser} AS
SELECT * FROM {$nwechat_user} WHERE subscribe = 1 ";
// 广告位排期统计,计算广告位的空闲,到期,投放中
$elevator = self::split_table_name('elevator',true);
$launch = self::split_table_name('launch',true);
$countela = self::split_table_name('countela',true);
$array['countela'] = " CREATE VIEW {$countela} AS
SELECT
e.id,
e.e_vid,
e.e_number,
e.e_bno,
e.e_uno,
e.e_eno,
e.e_aps,
e.e_enable,
l.id AS l_id,
l.l_title,
l.l_hnumber,
l.l_schedule,
l.l_starttime,
l.l_endtime,
l.l_enable,
l.l_type
FROM
{$elevator} AS e
LEFT JOIN {$launch} AS l ON find_in_set( e.e_number, l.l_enumber ) ";
return $array;
}
//默认配置
protected function default_config() {
global $_M;
//正常升级
$config = [
'tem_ida','tem_idb','tem_idc','openid'
];
$lang = $_M['lang'];
foreach ($config as $key => $val){
DB::query("INSERT INTO {$this->sqlk} (name,lang,m_name,value) VALUES ('{$key}','{$lang}','{$this->m_name}','{$val}') ON DUPLICATE KEY UPDATE value='{$val}' ");
}
}
//系统表
protected function systable() {
global $_M;
//访问入口固定为app/index.php?n=XXX&c=XXX&a=XXX
//定时处理入口
// $field = "no='{$this->appno}',m_name='{$this->m_name}',filename='timing.php',m_module='web',m_class='timing',m_action='@\$_GET[a]'";
// self::addsql('ifcolumn_addfile',$field);
}
/*
+ 公用安装升级方法
+-------------------------------------------------------------------------------------------
+ inssql : 应用数据表创建
+-------------------------------------------------------------------------------------------
+ upver : 修改应用版本号
+-------------------------------------------------------------------------------------------
+ install_lock : 创建安装锁
+-------------------------------------------------------------------------------------------
*/
//应用数据表创建
protected function inssql() {
global $_M;
$tables = self::table_field();
$table = $tname = [];
foreach ($tables as $key => $val) {
$tname[] = $key;
$table_name = self::split_table_name($key);
$table[] = $table_name;
if($val) DB::query("CREATE TABLE `{$_M['config']['tablepre']}{$table_name}` ( {$val} ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8");
}
//建立触发器
$trigger = self::trigger();
foreach ($trigger as $val){
DB::query($val);
}
//执行SQL其他操作
$tview = self::tview();
foreach ($tview as $key => $val){
$tname[] = $key;
$table_name = self::split_table_name($key);
$table[] = $table_name;
DB::query($val);
}
//记录表名
add_table(arrayto_string($table,'|'));
$filetable = PATH_ALL_APP.$this->m_name.'/config/table';
//先获取之前已经存在的简短表名
if(file_exists($filetable)) {
$tnamestr = file_get_contents($filetable);
$tname = array_merge($tname,stringto_array($tnamestr,','));
}else{
//创建
makefile($filetable);
}
//写入
file_put_contents($filetable,arrayto_string(array_unique($tname),','));
}
//修改版本号
protected function upver() {
global $_M;
DB::query("UPDATE {$_M['table']['applist']} SET ver='{$this->newver}' WHERE no='{$this->appno}' AND m_name='{$this->m_name}' ");
}
//创建安装锁
protected function install_lock() {
global $_M;
if(!file_exists(INS_LOCK_FILE)) makefile(INS_LOCK_FILE);
file_put_contents(INS_LOCK_FILE, json_encode($this->appinfo,JSON_UNESCAPED_UNICODE) );
}
/*
+ 公用SQL方法
+-------------------------------------------------------------------------------------------
+ sqlone : 单条查询方法
+-------------------------------------------------------------------------------------------
+ sqlall : 批量查询方法
+-------------------------------------------------------------------------------------------
+ addsql : 入库方法
+-------------------------------------------------------------------------------------------
+ split_table_name : 拼接完整数据库名
+-------------------------------------------------------------------------------------------
*/
//公共查询方法
private function sqlone($tname,$where = '') {
global $_M;
$table = $_M['table'][$tname];
if(!$where) $where = "no='{$this->appno}'";
return DB::get_one("select * from {$table} where {$where}");
}
//公共查询方法
private function sqlall($tname,$where = '') {
global $_M;
$table = $_M['table'][$tname];
if(!$where) $where = "no='{$this->appno}'";
return DB::get_all("select * from {$table} where {$where}");
}
//公共写入方法
private function addsql($tname,$field = '') {
global $_M;
$table = $_M['table'][$tname];
DB::query("INSERT INTO {$table} SET {$field}");
}
//拼接完整数据库名
private function split_table_name($name,$all = false) {
global $_M;
//公用表
$global_table = ['cloud_config','nwechat_user'];
$tablename = in_array($name, $global_table)?$name:$this->m_name.'_'.$name;
return $all?$_M['config']['tablepre'].$tablename:$tablename;
}
/*
+ 前端入口的创建。
+-------------------------------------------------------------------------------------------
+ column : 创建栏目信息 //目前的方法不适合最新版本 后期等待更正
+-------------------------------------------------------------------------------------------
*/
//创建前台入口API形式
protected function column_api() {
global $_M;
$file = self::sqlall('ifcolumn_addfile');
$dir = PATH_WEB.$this->fixed_name;
if(makedir($dir)){
if(getdirpower($dir) == false) modifydirpower($dir,0777);
}
foreach ($file as $val) {
$dirfile = $dir.'/'.$val['filename'];
$action = strstr($val['m_action'],'@$_')?$val['m_action']:"'{$val['m_action']}'";
$phpstr = "<?php".PHP_EOL
. "define('M_NAME', '{$val['m_name']}');".PHP_EOL
. "define('M_MODULE', '{$val['m_module']}');".PHP_EOL
. "define('M_CLASS', '{$val['m_class']}');".PHP_EOL
. "define('M_ACTION', {$action});".PHP_EOL
. "require_once '../app/app/entrance.php';".PHP_EOL
. "?>";
file_put_contents($dirfile, $phpstr);
}
}
//创建栏目信息
protected function column() {
global $_M;
$name = array('cn'=>'加盟店','en'=>'Join store query','tc'=>'加盟店');
foreach (array('cn','en','tc') as $k => $v) {
DB::query("INSERT INTO {$_M['table']['column']} SET name='{$name[$v]}',foldername='{$this->fixed_name}',module='{$this->appno}',no_order='100',if_in='1',classtype='1',out_url='{$_M['url']['site']}{$this->fixed_name}',isshow='1',lang='{$v}',nav='1'");
}
}
}

69
web/index.class.php Normal file
View File

@ -0,0 +1,69 @@
<?php
defined('IN_MET') or exit('No permission');
//用来处理定时执行排期处理
//访问入口固定为app/index.php?n=dzadsod
load::own_class('appweb');
class index extends appweb
{
# 过滤方法名
private $ado = ['doindex','dotable','dotableto','doajaxcl'];
private $urls;
//初始化
public function __construct()
{
global $_M, $_YW;
parent::__construct();
// 过滤
if (!in_array(M_ACTION, $this->ado,true)) {
//报错
exit(0);
}
$this->urls = $_M['url']['site'].'app/index.php?n=dzadsod';
$this->input['page_title'] = '广告位巡查';
}
//广告位排期中的巡查,验证码校验
public function doindex()
{
global $_M, $_YW;
//进入密码输入页面
$this->input['url'] = $this->urls.'&a=dotable';
$this->show('app/index', $this->input);
}
//数据列表
public function dotable()
{
global $_M, $_YW;
//校验验证码
$mdck = $this->tsql->table('keylist')
->where(['k_passkey' => md5($_M['form']['check']), 'k_state' => 1 ])
->one();
if($mdck == false) parent::scriptgo('密钥错误!');
okinfo($this->urls.'&a=dotableto');
}
//数据列表
public function dotableto()
{
global $_M, $_YW;
$this->input['url'] = $this->urls.'&c=table_ajax&a=doindex&tname=patrol';
$this->input['table'] = load::own_class('table_theme','new')->start('patrol')->send_all(1);
$this->show('app/table', $this->input);
}
//获取doajaxcl
public function doajaxcl() {
global $_M, $_YW;
parent::jsoncallback([]);
}
}
?>

311
web/select.class.php Normal file
View File

@ -0,0 +1,311 @@
<?php
defined('IN_MET') or exit('No permission');
load::own_class('appweb');
load::own_func('appcmp');
/*
* 配置
* 包含其他功能初始化
*/
class select extends appweb {
/*
* @$querys string 搜索内容
* @$tname string 指定的查询表
* @$fiend string 作为返回ID的值
* @$source string 查询来源页面,用于区分用哪个页面来查询的好做一些特殊处理
* @$allnone string 是否显示默认值全部,或者当没有搜索结果时将搜索内容当作值返回
* @$condition string 页面查询限制条件,采用$$$作为多条件分割,|||作为字段名和值的分割
* @$default string 默认值
* @$division string 默认值分隔符
*
* @$where string sql判断语句
*/
# 过滤方法名
private $ado = ['doselect'];
//搜索内容
private $querys = '';
//指定字段为值
private $fiend;
//来源页面标记
private $source;
//是否显示默认值全部
private $allnone;
//判断条件
private $condition;
//默认值
private $default;
//默认值分隔符
private $division;
//sql判断条件
private $where = '';
//返回的数组
private $data = [];
public function __construct() {
global $_M,$_YW;
parent::__construct();
// 过滤
if (!in_array(M_ACTION, $this->ado,true)) {
//报错
exit(0);
}
//指定表
$this->tname = $_M['form']['tname'];
//搜索内容
$this->querys = $_M['form']['querys'];
//以指定字段为值
$this->fiend = $_M['form']['fiend']?:'id';
//来源
$this->source = $_M['form']['source'];
//是否显示全部
$this->allnone = $_M['form']['allnone'];
//判断条件
$this->condition = $_M['form']['condition'];
//默认值
$this->default = $_M['form']['default'];
//默认值分隔符
$this->division = $_M['form']['division'];
}
# select2 选项字段处理
private function select_fiend($val) {
global $_M,$_YW;
$strarr = stringto_array($this->fiend,'|');
foreach ($strarr as $value) {
$arrstr[] = $val[$value];
}
return arrayto_string($arrstr,'|');
}
# allnone 默认选项全部处理
private function allnone() {
global $_M,$_YW;
// 若不需要显示‘全部’值,则直接返回空
// 0 为不显示‘全部’,同时也在未搜索到结果的情况下 不 设置为可选值
// 1 为显示 显示‘全部’,同时也在未搜索结果的情况下 设置可选值
// 2 只显示‘全部’
// 3 只将未搜索到结果的情况下设置为可选值
if(empty($this->allnone) || $this->allnone == '3') return false;
//然后可根据来源标记进行处理
switch ($this->source) {
// case 'githooks':
// $initial[] = ['id' => 'newver','text'=>'自动部署至最新版本'];
// break;
default:
$initial[] = [ 'id' => '','text' => '全部' ];
break;
}
$this->data[] = ["text" => '',"children" => $initial ];
}
# 当未搜索到值是否将搜索结果设置为可选值
private function children() {
global $_M,$_YW;
// 判断是否要将搜索内容设置为可选值
if(empty($this->allnone) || $this->allnone == '2' || strlen($this->querys) == 0) return false;
// 要注意id的是否为可写入数据库 误区,若有些字段为数字 则会导致无法录入成功
// 后期可增加一个判断方式来处理这个误区
$this->data[] = [
"text" => '',
"children" => [
['id'=> $this->querys,'text' => $this->querys]
]
];
}
# querys 处理
private function querys() {
global $_M,$_YW;
$curdate = date('Y-m-d',time());
switch ($this->source) {
case 'weblaunchsearch':
$this->where = " l_starttime <= '{$curdate}' ";
// $this->where = " NOT ( l_endtime < '{$curdate}' OR l_starttime > '{$curdate}' ) ";
break;
case 'webcontractsearch':
$this->where = " h.h_starttime <= '{$curdate}' ";
break;
default:
$this->where = false;
break;
}
if(strlen($this->querys) == 0) return false;
switch ($this->tname) {
case 'village':
$this->where = " v_name LIKE '%{$this->querys}%' ";
break;
case 'customer':
$this->where = " c_allname LIKE '%{$this->querys}%' ";
break;
case 'workers':
$this->where = " w_name LIKE '%{$this->querys}%' OR w_tel LIKE '%{$this->querys}%' ";
break;
case 'contract':
$this->where .= " AND ( h.h_number LIKE '%{$this->querys}%' OR c.c_allname LIKE '%{$this->querys}%' OR c.c_name LIKE '%{$this->querys}%' ) ";
break;
case 'launch':
$this->where .= " AND l_title LIKE '%{$this->querys}%' ";
break;
case 'weuser':
$nickname = urlencode($this->querys);
$this->where = " nickname LIKE '%{$nickname}%' ";
break;
default:
break;
}
}
# condition 处理
private function condition() {
global $_M,$_YW;
if(empty($this->condition)) return false;
// 进行处理
$condition = stringto_array($this->condition,'|||','$$$');
foreach ($condition as $value) {
list($key,$val) = $value;
$valstr[] = " {$key} = '{$val}' ";
}
$valstr = arrayto_string($valstr,' AND ');
if(strlen($valstr) > 0){
if(!empty($this->where)) $this->where = " ({$this->where}) AND ";
$this->where .= $valstr;
}
}
# 选项值的组成样式
private function valuet($val) {
global $_M,$_YW;
switch ($this->tname) {
case 'village':
$fiend = [$val['v_name'],$val['v_province'].$val['v_city'].$val['v_district'].$val['v_address']];
break;
case 'customer':
$fiend = [$val['c_name'],$val['c_allname'],$val['c_province'].$val['c_city'].$val['c_district'].$val['c_address']];
break;
case 'workers':
$fiend = [$val['w_name'],$val['w_tel']];
break;
case 'contract':
$fiend = [$val['h_number'],$val['c_allname']];
break;
case 'launch':
$fiend = [$val['l_title'],$val['l_hnumber']];
break;
case 'weuser':
$sex = ['未知','男','女'];
$fiend = [$val['nickname'],$sex[$val['sex']] ];
break;
default:
break;
}
$text = arrayto_string($fiend,' / ');
return $text;
}
//编号字段,根据此字段进行编号处理
private function charter() {
global $_M,$_YW;
switch ($this->tname) {
case 'village':
$fiend = 'v_name';
break;
case 'customer':
$fiend = 'c_name';
break;
case 'workers':
$fiend = 'w_name';
break;
case 'contract':
$fiend = 'h_number';
break;
case 'launch':
$fiend = 'l_title';
break;
case 'weuser':
$fiend = 'nickname';
break;
default:
break;
}
return $fiend;
}
// 查看小区名称列表
public function doselect() {
global $_M,$_YW;
//判断条件
self::querys();
//带入的判断条件
self::condition();
//编号的字段
$fiend = self::charter();
//查询
if($this->tname != 'contract'){
$array = $this->tsql->table($this->tname)->where($this->where)->order('id DESC')->all('id');
}else{
$array = $this->tsql->table_unset()
->tables([$this->tname,'h'], 'LEFT JOIN')
->tables(['customer','c'], 'ON h.h_cid = c.id')
->where($this->where)
->qfield(" h.*,c.c_allname ")
->order('h.id DESC')->all('id');
}
// dump($this->tsql->query());
foreach ($array as $val) {
if($this->tname == 'weuser'){
$val['nickname'] = urldecode($val['nickname']);
}
$letter = getstrcharter($val[$fiend]);
$selectlist[$letter][] = $val;
}
//是否显示全部
self::allnone();
//是否将搜索内容作为结果
self::children();
//处理结果
foreach ($selectlist as $key => $val){
$arr = [];
foreach ($val as $v) {
$valid = self::select_fiend($v);
//判断是否只输出默认值
if(strlen($this->default) > 0){
$default = stringto_array($this->default, $this->division);
if(!in_array($valid, $default,true)) continue;
}
//组成选项
$arr[] = ['id' => $valid, 'text' => self::valuet($v)];
}
$this->data[] = ["text" => $key,"children" => $arr];
}
//当值不存在时
if(!count($this->data)){
//输出没有搜索到结果
$this->data = [["text" => $this->querys == ''?'检索不到相关信息':"检索不到 {$this->querys} 相关信息","children" => [] ]];
}else{
//对数组排序A-ZZ
$text = array_column($this->data, 'text');
array_multisort($text,SORT_ASC,$this->data);
}
echo jsoncallback(['results' => $this->data]);
}
}
?>

135
web/table_ajax.class.php Normal file
View File

@ -0,0 +1,135 @@
<?php
defined('IN_MET') or exit ('No permission');
load::own_class('appweb');
load::own_class('../traits/tdata');
load::own_class('../traits/tlist');
load::own_class('../traits/tfield');
//表格
class table_ajax extends appweb {
# 过滤方法名
private $ado = ['doindex'];
//非备份,正常字段即可
private $bsign = false;
//列表
private $list = [];
//当前执行表名
private $sqlk;
//form数组
private $form = [];
//info_on 快速URL
private $own_name_info;
private $own_name_table;
public function __construct() {
global $_M,$_YW;
parent::__construct();
// 过滤
if (!in_array(M_ACTION, $this->ado,true)) {
//报错
exit(0);
}
$this->form = $_M['form'];
if($this->form['tname']){
$this->tname = $this->form['tname'];
$this->sqlk = $_YW['k'][$this->tname];
}
//地址要换算成前台的,目前是后台的
// $this->own_name_info = $_M['url']['own_name'].'c=info_on&a=do';
// $this->own_name_table = $_M['url']['own_name'].'c=table_on&a=do';
}
//表格数据
public function doindex() {
global $_M;
//加载表格数据获取类
$table = load::own_class('tabledata', 'new');
$field = self::td_field();
$sqlk = self::td_sqlk();
$where = self::td_where();
$order = self::td_order();
/*查询表*/
if($where){
$conds .= " WHERE {$where} ";
}
if($order){
$conds .= " ORDER BY {$order} ";
}
//整理查询条件
$query = "SELECT {$field} FROM {$sqlk} {$conds} ";
//获取数据
$data = $table->getdata($sqlk, $field, $where, $order,$query,$this->multi_table);
//数据整理
$array = self::sqlarr($data);
//返回数据
$table->rdata($array);
}
use tdata;
/*
* 【列出】
* 返回数据数组
*/
private function sqlarr($data = []) {
global $_M;
// if(in_array($this->tname,$this->k_name)){
foreach ($data as $val) {
self::output($val);
$array[] = $this->list;
}
return $array;
// }else{
// return false;
// }
}
/*
* 【新行】
* 新增行分发
*/
public function do_table_add_list(){
global $_M;
$val = ['id' => 'new-'.$this->form['new_id'], 'p_type' => $this->form['p_type']];
if(in_array($this->tname,$this->k_name)){
self::output($val,'checked=""');
}
self::addlist($val);
}
/*
* 【新行】
* 生成文件新增行
*/
private function addlist($val) {
global $_M;
$metinfo = '';
foreach ($this->list as $v){
$metinfo .= '<td class=" text-xs-center">'.$v.'</td>';
}
echo "<tr>{$metinfo}</tr>";
}
use tfield;
use tlist;
//公用的输出
protected function output($val,$checked = '') {
global $_M,$_YW;
$array = self::{$this->tname}($val,$checked);
$this->list = array();
foreach ($array as $value) {
$this->list[] = $value;
}
}
}
?>

View File

@ -0,0 +1,37 @@
@charset "UTF-8";
/*把脑残替换的恢复过来*/
.form-inline .form-group {
margin-right: 20px;
}
@media (min-width: 480px){
.form-inline .form-group, .form-inline .form-control {
display: inline-block;
margin-bottom: 0;
width: auto;
vertical-align: middle;
}
}
/*在帮脑残修复一下*/
table .form-inline .form-group {
margin-right: 0px;
}
@media (min-width: 480px){
table .form-inline .form-group, table .form-inline .form-control {
display: block;
width: 100%;
}
}
.cloudweb input[name="gotopage"]{
display: inline-block!important;
}
.cloudweb .gotopage{
display: none;
}
@media (max-width: 767px){
.cloudweb div.m-y-80{margin-top: 0px!important;}
div.dataTables_paginate .paginate_button>a{padding: .429rem .780rem;}
.form-inline .form-group{margin-right: 0px;}
.cloudweb select[name="e_vid"]{max-width: auto;}
.cloudweb .input-group .select2-container--default{width: 100%!important;}
}

View File

@ -0,0 +1,43 @@
<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
defined('IN_MET') or exit('No permission');
?>
<script>
var MET=[];
MET['url']=[];
MET['langtxt'] = {
"jsx15":"{$_M['word']['jsx15']}",
"js35":"{$_M['word']['js35']}",
"jsx17":"{$_M['word']['jsx17']}",
"formerror1":"{$_M['word']['formerror1']}",
"formerror2":"{$_M['word']['formerror2']}",
"formerror3":"{$_M['word']['formerror3']}",
"formerror4":"{$_M['word']['formerror4']}",
"formerror5":"{$_M['word']['formerror5']}",
"formerror6":"{$_M['word']['formerror6']}",
"formerror7":"{$_M['word']['formerror7']}",
"formerror8":"{$_M['word']['formerror8']}",
"js46":"{$_M['word']['js46']}",
"js23":"{$_M['word']['js23']}",
"checkupdatetips":"{$_M['word']['checkupdatetips']}",
"detection":"{$_M['word']['detection']}",
"try_again":"{$_M['word']['try_again']}",
"fileOK":"{$_M['word']['fileOK']}",
};
MET['met_editor']="{$_M['config']['met_editor']}";
MET['met_keywords']="{$_M['config']['met_keywords']}";
MET['url']['ui']="{$_M['url']['ui']}";
MET['url']['own']="{$_M['url']['own']}";
MET['url']['own_tem']="{$_M['url']['own_tem']}";
MET['url']['api']="{$_M['url']['api']}";
</script>
<met_foot />
<if value="!$c['shopv2_open']">
<?php $app_js_time = filemtime(PATH_WEB.'public/ui/v2/static/js/app.js'); ?>
<script src="{$_M['url']['site']}public/ui/v2/static/js/app.js?{$app_js_time}"></script>
</if>
<?php if(file_exists(PATH_OWN_FILE."templates/met/js/own.js") && !((M_NAME=='product' || M_NAME=='shop') && $_M['config']['shopv2_open'])){
$own_js_time = filemtime(PATH_OWN_FILE.'templates/met/js/own.js');
?>
<script src="{$_M['url']['own_tem']}js/own.js?{$own_js_time}"></script><?php } ?>

View File

@ -0,0 +1,14 @@
<?php
# MetInfo Enterprise Content Management System
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
defined('IN_MET') or exit('No permission');
?>
<include file="metinfo.inc.php"/>
<?php $met_page=$template_type=='ui'?'index':''; ?>
<met_meta page="$met_page" />
<?php
if(file_exists(PATH_OWN_FILE."templates/met/css/metinfo.css")){
$own_metinfo_css_filemtime = filemtime(PATH_OWN_FILE.'templates/met/css/metinfo.css');
?>
<link href="{$_M['url']['own_tem']}css/metinfo.css?{$own_metinfo_css_filemtime}" rel='stylesheet' type='text/css'>
<?php } ?>

View File

@ -0,0 +1,28 @@
<?php
defined('IN_MET') or exit('No permission');
$data['page_title'] = $data['app']['column']['name'] . $data['page_title'];
?>
<include file="app/head"/>
<div class="metadmin-main container-fluid">
<div class="row">
<div class="col-xs-12 m-t-80">
<form method="POST" action="{$data.url}">
<div class="metadmin-fmbx">
<div class="form-group">
<h3 class="text-xs-center">巡查人员身份验证</h3>
</div>
<div class="form-group">
<div class="input-group">
<span class="input-group-addon">密钥</span>
<input type="password" class="form-control" placeholder="输入身份密钥" name="check" autocomplete="off">
<span class="input-group-btn">
<button type="submit" class="btn btn-primary">提交</button>
</span>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<include file="app/foot"/>

158
web/templates/met/js/own.js Normal file
View File

@ -0,0 +1,158 @@
/*!
* M['weburl'] 网站网址
* M['lang'] 网站语言
* M['tem'] 模板目录路径
* M['user_name'] 页面登录用户名
* met_prevarrow,
met_nextarrow slick插件翻页按钮自定义html
* M['device_type'] 客户端判断dPC端t平板端m手机端
* M['n'] 当前模块名称
* M['c'] 当前类
* M['a'] 当前方法
* M['langtxt'] 当前语言文字
* M['langset'] 当前后台语言
* M['anyid'] 当前模块id
* M['met_editor'] 当前系统编辑器名称
* M['met_keywords'] 页面关键词
* M['url']['admin'] 后台文件夹路径
* M['url']['static']
* M['url']['static_vendor']
* M['url']['static2']
* M['url']['static2_vendor']
* M['url']['static2_plugin']
* M['url']['uiv2'] 模板框架v2路径
* M['url']['uiv2_css']
* M['url']['uiv2_js']
* M['url']['app'] 应用文件夹路径
* M['url']['pub'] 后台模块公用文件夹路径
* M['url']['epl'] 后台模块公用示例文件夹路径
* M['url']['ui'] 应用前后台公用UI文件app/system/include/piblic/ui/里面
* M['url']['own_form'] 当前页面程序地址
* M['url']['own_name'] 当前模块地址
* M['url']['own'] 当前模块后台路径
* M['url']['own_tem'] 当前页面模板路径
* M['url']['api'] app站点地址
* M['url']['editor'] 当前编辑器应用文件夹路径
*/
$(function () {
var myDate=new Date().getTime();
var appfun = function () {
var $self = this;
if($self.isEmpty(M['n'])) M['n'] = $('div[data-m_name]').data('m_name');
$self.own_name = M['weburl'] + 'app/index.php?n=' + M['n'];
$self.config();
//select2
if($('[data-plugin="select2"]').length) $self.select2(true);
};
appfun.prototype = {
config:function(){
var $self = this;
$.ajax({
type: "GET",
url: $self.own_name + '&c=index&a=doajaxcl&lang=' + M['lang'],
dataType: "jsonp",
async: false
}).done(function (data) {
CL = data;
});
},
select2:function(drawdt){
// drawdt true 执行默认操作 false 不执行
var $self = this,select = [];
//选择器
M['plugin']['select2'] = [
M['url']['static2_vendor'] + 'select2/select2.min.css',
M['url']['static2_vendor'] + 'select2/select2.full.min.js',
M['url']['static2_vendor'] + 'select2/i18n/zh-CN.js',
];
$.include(M['plugin']['select2'],function(){
$('[data-plugin="select2"]').each(function(indexs,item){
var _self = $(this),
defaults = _self.data('default'),
select2url = _self.data('select2-url') + '&'+ myDate;
select[indexs] = _self.select2({
placeholder: '输入搜索内容', //提示语
ajax: {
url: select2url,
dataType: 'jsonp',
delay: 500,
data: function (params) {
return {
querys: params.term, //search term
tname: _self.data('tname'), //指定简短表
fiend: _self.data('fiend'), //指定字段值
allnone: _self.data('allnone'), //是否只显示应用的值
source: _self.data('source'), //查看来源标记
condition: _self.data('condition') //查询限制条件
};
},
results: function (data, page) {
return {results: data.results};
}
}
});
//默认值处理
if(!$self.isEmpty(defaults) && drawdt == true){
$.getJSON(
select2url,
{
tname: _self.data('tname'), //指定简短表
fiend: _self.data('fiend'), //指定字段值
allnone: _self.data('allnone'), //是否只显示应用的值
source: _self.data('source'), //查看来源标记
condition: _self.data('condition'), //查询限制条件
default: defaults, //默认值
division: _self.data('division') //默认值分隔符
},
function(obj){
$.each(obj.results, function(index, ele) {
$.each(ele.children, function(indexop, eleop) {
var option = new Option(eleop.text, eleop.id, true, true);
select[indexs].append(option).trigger('change');
})
});
}
)
}
});
});
},
isEmpty: function (val) {
switch (typeof val) {
case 'undefined':
return true;
case 'string':
if (val.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0)
return true;
break;
case 'boolean':
if (!val)
return true;
break;
case 'number':
if (0 === val || isNaN(val))
return true;
break;
case 'object':
if (null === val || val.length === 0)
return true;
for (var i in val) {
return false;
}
return true;
}
return false;
}
};
APPFUN = new appfun();
//缓存
$.ajaxSetup({cache: false});
});

View File

@ -0,0 +1,30 @@
<?php
defined('IN_MET') or exit('No permission');
$data['page_title'] = $data['app']['column']['name'] . $data['page_title'];
?>
<include file="app/head"/>
<div class="metadmin-main container-fluid cloudweb">
<div class="row">
<div class="col-xs-12 m-y-80">
<div class="form-group">
<h3 class="text-xs-center">广告位投放状态</h3>
</div>
<div class="clearfix">
{$data.top.tips}
<!--头部搜索-->
{$data.table.search}
</div>
<table class="dataTable table table-bordered table-hover table-striped w-full m-t-5" id='test-table' data-table-ajaxurl="{$data.url}" data-table-pagelength='15'>
<thead>{$data.table.thead}</thead>
<tbody>
<tr>
<td colspan="{$data.table.tdcol}">
<div class="h-50 vertical-align text-xs-center"><div class="loader vertical-align-middle loader-default"></div></div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<include file="app/foot"/>

122
web/timing.class.php Normal file
View File

@ -0,0 +1,122 @@
<?php
defined('IN_MET') or exit('No permission');
//用来处理定时执行排期处理
//访问入口固定为app/index.php?n=dzadsod&c=timing&a=doindex
load::own_class('appweb');
class timing extends appweb
{
# 过滤方法名
private $ado = ['doindex'];
//初始化
public function __construct()
{
global $_M, $_YW;
parent::__construct();
//----------------------------------加快信息响应------开始---------------------------
set_time_limit(0);
ob_end_clean();
header("Connection: close");
header("HTTP/1.1 200 OK");
header("Content-type:text/html;charset=utf-8");
header('Access-Control-Allow-Methods:post');
ob_start();
//Windows服务器需要加上这行。
echo 'API响应时间'.date('Y-m-d H:i:s', $this->time).str_repeat(" ",4096);
//----------------------------------加快信息响应------中段---------------------------
// 过滤
if (!in_array(M_ACTION, $this->ado,true)) {
//报错
exit(0);
}
//----------------------------------加快信息响应------中段---------------------------
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
if (function_exists("fastcgi_finish_request")) {
fastcgi_finish_request();
}
ignore_user_abort(true);
set_time_limit(0);
//----------------------------------加快信息响应------结束---------------------------
}
# 每天凌晨后或者早上6点之前进行广告位排期处理
# 主要计算排期是否过期,是否已经提到开始排期了
public function doindex()
{
global $_M, $_YW;
$this->webase = load::own_class('../met_wechat/include/class/LW_BASE', 'new');
//当天日期时间
$curdate = date('Y-m-d',$this->time);
$strdate = strtotime($curdate);
$num = ['daya' => 0,'dayb' => 0,'dayc' => 0];
//查询到期订单
//查询的是设置的提醒天数以及订单结束日期的前后3天数
$where = " endtime = CURDATE() OR (h_endtime BETWEEN CURDATE() AND DATE_ADD( CURDATE(), INTERVAL 3 DAY ) ) ";
$noticeday = $this->tsql->table('noticeday')->where($where)->all();
foreach ($noticeday as $val) {
//延时2秒
sleep(3);
$h_endtime = strtotime($val['h_endtime']);
//首先判断当前这条信息是属于到期前台3天的 还是属于设置的提醒
//那就是判断订单结束时间和今天的相差天数
$day = abs(($h_endtime - $strdate) / 86400);
if($day > 3){
//按照设置的提醒来计算
$htypes = "合同 {$val['noticeday']} 天后到期提醒";
//蓝色
$color = "#57c7d4";
$type = 1;
$num['daya']++;
}else{
//说明还没到期
if($h_endtime > $strdate){
$htypes = "合同 {$day} 天后到期";
//黄色
$color = "#f2a654";
$type = 1;
$num['dayb']++;
}else{
$htypes = "合同今天到期";
//红色
$color = "#F96868";
$type = 2;
$num['dayc']++;
}
}
//公司名称
$customer = $this->tsql->table('customer')->where(['id' => $val['h_cid']])->one();
//签定人员
$w_name = [];
$workerswid = stringto_array($val['h_wid'],',');
foreach ($workerswid as $hwid) {
$workers = $this->tsql->table('workers')->where(['id' => $hwid])->one();
$w_name[] = $workers['w_name'];
}
//整理内容
$val['first'] = ['value' => $htypes, 'color' => $color];
$val['c_allname'] = $customer['c_allname'];
$val['wnamestr'] = arrayto_string($w_name,'');
//发送通知
parent::postdata($type,$val)->openid();
}
//以上为定时通知或者到期通知
//增加一个今天要上架的投放
$num['dayd'] = $this->tsql->table('launch')->where(" l_starttime = CURDATE() ")->count();
parent::postdata(3,$num)->openid();
die();
}
}
?>