发布合同管理模块,更新layui到2.7.2版本,新增数据权限管理功能,其他问题的优化。

This commit is contained in:
hdm 2022-07-01 11:11:00 +08:00
parent 9a9d1893bf
commit fb89644555
29 changed files with 3032 additions and 40 deletions

View File

@ -118,7 +118,7 @@
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
let callback = function (res) {
layer.msg(res.msg);
if (res.code == 0) {
obj.del();

View File

@ -77,6 +77,19 @@ function isTemplate($url='')
return $isTemplate;
}
//是否是某数据权限,count>1即有权限
function isAuth($uid,$name)
{
if($uid == 1){
return 1;
}
$map = [];
$map[] = ['name', '=', $name];
$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',uids)")];
$count = Db::name('DataAuth')->where($map)->count();
return $count;
}
//获取服务器信息
function get_system_info($key)
{

60
app/contract/common.php Normal file
View File

@ -0,0 +1,60 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
/**
======================
*模块数据获取公共文件
======================
*/
use think\facade\Db;
//是否是合同管理员权限
function contract_auth($uid)
{
if($uid == 1){
return 1;
}
$map = [];
$map[] = ['name', '=', 'contract_admin'];
$map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',uids)")];
$count = Db::name('DataAuth')->where($map)->count();
return $count;
}
//读取分类列表
function contract_cate()
{
$cate = Db::name('ContractCate')->where(['status' => 1])->order('id desc')->select()->toArray();
return $cate;
}
//读取签约主体
function contract_subject()
{
$subject = Db::name('InvoiceSubject')->where(['status' => 1])->order('id desc')->select()->toArray();
return $subject;
}
//读取签约主体
function to_log($uid,$new,$old)
{
$log_data = [];
$key_array = ['id', 'create_time', 'update_time', 'sign_did'];
foreach ($new as $key => $value) {
if (!in_array($key, $key_array)) {
if(isset($old[$key]) && ($old[$key]!=$value)){
$log_data[] = array(
'field' => $key,
'contract_id' => $new['id'],
'admin_id' => $uid,
'old_content' => $old[$key],
'new_content' => $value,
'create_time' => time(),
);
}
}
}
Db::name('ContractLog')->strict(false)->field(true)->insertAll($log_data);
}

View File

@ -0,0 +1 @@
勾股OA模块安装鉴定文件请勿删除此次模块标识为contract

View File

@ -0,0 +1,123 @@
-- ----------------------------
-- Table structure for oa_contract_cate
-- ----------------------------
DROP TABLE IF EXISTS `oa_contract_cate`;
CREATE TABLE `oa_contract_cate` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL DEFAULT '' COMMENT '合同类别名称',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:-1删除 0禁用 1启用',
`create_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '合同类别';
-- ----------------------------
-- Records of oa_contract_cate
-- ----------------------------
INSERT INTO `oa_contract_cate` VALUES (1, '销售合同', 1, 1637987189, 0);
INSERT INTO `oa_contract_cate` VALUES (2, '采购合同', 1, 1637987199, 0);
INSERT INTO `oa_contract_cate` VALUES (3, '租赁合同', 1, 1637987199, 0);
INSERT INTO `oa_contract_cate` VALUES (4, '委托协议', 1, 1637987199, 0);
INSERT INTO `oa_contract_cate` VALUES (5, '代理协议', 1, 1637987199, 0);
INSERT INTO `oa_contract_cate` VALUES (6, '其他合同', 1, 1637987199, 0);
-- ----------------------------
-- Table structure for oa_contract
-- ----------------------------
DROP TABLE IF EXISTS `oa_contract`;
CREATE TABLE `oa_contract` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`pid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父协议id',
`code` varchar(255) NOT NULL DEFAULT '' COMMENT '合同编号',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '合同名称',
`cate_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类id',
`type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '合同性质0未设置,1普通合同、2框架合同、3补充协议、4其他合同',
`subject_id` varchar(255) NOT NULL DEFAULT '' COMMENT '签约主体',
`customer_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '客户ID,预设数据',
`customer` varchar(255) NOT NULL DEFAULT '' COMMENT '客户名称',
`customer_name` varchar(255) NOT NULL DEFAULT '' COMMENT '客户代表',
`customer_mobile` varchar(255) NOT NULL DEFAULT '' COMMENT '客户电话',
`customer_address` varchar(255) NOT NULL DEFAULT '' COMMENT '客户地址',
`start_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同开始时间',
`end_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同结束时间',
`admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
`prepared_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同制定人',
`sign_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同签订人',
`keeper_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同保管人',
`share_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '共享人员,如:1,2,3',
`sign_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同签订时间',
`sign_did` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同签订部门',
`cost` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '合同金额',
`is_tax` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否含税0未含税,1含税',
`tax` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '税点',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '合同状态0未设置,1已录入,2待审核,3已审核,4已中止,5已作废',
`check_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核人',
`check_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核时间',
`check_remark` text NULL COMMENT '审核备注信息',
`stop_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '中止人',
`stop_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '中止时间',
`stop_remark` text NULL COMMENT '中止备注信息',
`void_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '作废人',
`void_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '作废时间',
`void_remark` text NULL COMMENT '作废备注信息',
`archive_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '归档状态0未归档,1已归档',
`archive_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '归档人',
`archive_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '归档时间',
`remark` text NULL COMMENT '备注信息',
`create_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间',
`update_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
`delete_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '合同表';
-- ----------------------------
-- Table structure for oa_contract_file
-- ----------------------------
DROP TABLE IF EXISTS `oa_contract_file`;
CREATE TABLE `oa_contract_file` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`contract_id` int(11) UNSIGNED NOT NULL COMMENT '关联合同id',
`file_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '相关联附件id',
`admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
`create_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
`delete_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '合同附件关联表';
-- ----------------------------
-- Table structure for oa_contract_log
-- ----------------------------
DROP TABLE IF EXISTS `oa_contract_log`;
CREATE TABLE `oa_contract_log` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`action` varchar(100) NOT NULL DEFAULT 'edit' COMMENT '动作:add,edit,del,check,upload',
`field` varchar(100) NOT NULL DEFAULT '' COMMENT '字段',
`contract_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联合同id',
`admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作人',
`old_content` text NULL COMMENT '修改前的内容',
`new_content` text NULL COMMENT '修改后的内容',
`remark` text NULL COMMENT '补充备注',
`create_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '合同操作记录表';
-- ----------------------------
-- Table structure for oa_data_auth
-- ----------------------------
DROP TABLE IF EXISTS `oa_data_auth`;
CREATE TABLE `oa_data_auth` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '权限名称',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '权限标识唯一,字母',
`desc` text NULL COMMENT '备注描述',
`module` varchar(255) NOT NULL DEFAULT '' COMMENT '所属模块,唯一,字母',
`uids` text NULL COMMENT '权限用户1,2,3',
`create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '数据权限表';
INSERT INTO `oa_data_auth` VALUES ((SELECT MAX(id) +1 FROM `oa_data_auth` a), '合同管理员','contract_admin','拥有该权限的员工可以查看、编辑、审核、作废、中止所有合同。', 'contract', '', 1656143065, 0);

View File

@ -0,0 +1,166 @@
<?php
/**
* @copyright Copyright (c) 2022 勾股工作室
* @license https://opensource.org/licenses/GPL-3.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\contract\controller;
use app\api\BaseController;
use app\contract\model\ContractLog;
use think\facade\Db;
use think\facade\View;
class Api extends BaseController
{
//获取项目概况数据
public function get_contract()
{
$param = get_params();
$where = array();
if (!empty($param['keywords'])) {
$where[] = ['id|name', 'like', '%' . $param['keywords'] . '%'];
}
$where[] = ['delete_time', '=', 0];
$list = Db::name('Contract')->field('id,name,sign_uid,sign_time')->order('end_time asc')->where($where)->select()->toArray();
if (!empty($list)) {
foreach ($list as $k => &$v) {
$v['sign_name'] = Db::name('Admin')->where('id',$v['sign_uid'])->value('name');
$v['sign_time'] = date('Y-m-d', $v['sign_time']);
}
}
to_assign(0, '', $list);
}
//添加附件
public function add_file()
{
$param = get_params();
$param['create_time'] = time();
$param['admin_id'] = $this->uid;
$fid = Db::name('ContractFile')->strict(false)->field(true)->insertGetId($param);
if ($fid) {
$log_data = array(
'field' => 'file',
'action' => 'upload',
'contract_id' => $param['contract_id'],
'admin_id' => $param['admin_id'],
'old_content' => '',
'new_content' => $param['file_name'],
'create_time' => time(),
);
Db::name('ContractLog')->strict(false)->field(true)->insert($log_data);
return to_assign(0, '上传成功', $fid);
}
}
//删除
public function delete_file()
{
if (request()->isDelete()) {
$id = get_params("id");
$data['id'] = $id;
$data['delete_time'] = time();
if (Db::name('ContractFile')->update($data) !== false) {
$detail = Db::name('ContractFile')->where('id', $id)->find();
$file_name = Db::name('File')->where('id', $detail['file_id'])->value('name');
$log_data = array(
'field' => 'file',
'action' => 'delete',
'contract_id' => $detail['contract_id'],
'admin_id' => $this->uid,
'new_content' => $file_name,
'create_time' => time(),
);
Db::name('ContractLog')->strict(false)->field(true)->insert($log_data);
return to_assign(0, "删除成功");
} else {
return to_assign(1, "删除失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//审核等操作
public function check()
{
if (request()->isPost()) {
$params = get_params();
if($params['status'] == 3){
$params['check_uid'] = $this->uid;
$params['check_time'] = time();
$params['check_remark'] = $params['mark'];
}
if($params['status'] == 4){
$params['stop_uid'] = $this->uid;
$params['stop_time'] = time();
$params['stop_remark'] = $params['mark'];
}
if($params['status'] == 5){
$params['void_uid'] = $this->uid;
$params['void_time'] = time();
$params['void_remark'] = $params['mark'];
}
$old = Db::name('Contract')->where('id', $params['id'])->find();
if (Db::name('Contract')->strict(false)->update($params) !== false) {
$log_data = array(
'field' => 'status',
'contract_id' => $params['id'],
'admin_id' => $this->uid,
'new_content' => $params['status'],
'old_content' => $old['status'],
'create_time' => time(),
);
Db::name('ContractLog')->strict(false)->field(true)->insert($log_data);
return to_assign(0, "操作成功");
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//归档等操作
public function archive()
{
if (request()->isPost()) {
$params = get_params();
$old = 1;
if($params['archive_status'] == 1){
$params['archive_uid'] = $this->uid;
$params['archive_time'] = time();
$old = 0;
}
$old = Db::name('Contract')->where('id', $params['id'])->find();
if (Db::name('Contract')->strict(false)->update($params) !== false) {
$log_data = array(
'field' => 'archive_status',
'contract_id' => $params['id'],
'admin_id' => $this->uid,
'new_content' => $params['archive_status'],
'old_content' => $old['archive_status'],
'create_time' => time(),
);
Db::name('ContractLog')->strict(false)->field(true)->insert($log_data);
return to_assign(0, "操作成功");
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//合同操作日志列表
public function contract_log()
{
$param = get_params();
$list = new ContractLog();
$content = $list->contract_log($param);
return to_assign(0, '', $content);
}
}

View File

@ -0,0 +1,102 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\contract\controller;
use app\base\BaseController;
use app\contract\validate\ContractCateCheck;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Cate extends BaseController
{
public function conf()
{
$param = get_params();
if (request()->isPost()) {
$param['update_time'] = time();
$res = Db::name('DataAuth')->strict(false)->field(true)->update($param);
return to_assign();
} else {
$detail = Db::name('DataAuth')->where('name','contract_admin')->find();
$uids = Db::name('Admin')->where('id', 'in', $detail['uids'])->column('name');
$detail['unames'] = implode(',', $uids);
View::assign('detail', $detail);
return view();
}
}
//类别
public function cate()
{
if (request()->isAjax()) {
$cate = Db::name('ContractCate')->order('create_time asc')->select();
return to_assign(0, '', $cate);
} else {
return view();
}
}
//类别添加
public function cate_add()
{
if (request()->isAjax()) {
$param = get_params();
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(ContractCateCheck::class)->scene('edit')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$data['update_time'] = time();
$res = Db::name('ContractCate')->strict(false)->field(true)->update($param);
if ($res) {
add_log('edit', $param['id'], $param);
}
return to_assign();
} else {
try {
validate(ContractCateCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['create_time'] = time();
$insertId = Db::name('ContractCate')->strict(false)->field(true)->insertGetId($param);
if ($insertId) {
add_log('add', $insertId, $param);
}
return to_assign();
}
}
}
//类别设置
public function cate_check()
{
$param = get_params();
$res = Db::name('ContractCate')->strict(false)->field('id,status')->update($param);
if ($res) {
if($param['status'] == 0){
add_log('disable', $param['id'], $param);
}
else if($param['status'] == 1){
add_log('recovery', $param['id'], $param);
}
return to_assign();
}
else{
return to_assign(0, '操作失败');
}
}
}

View File

@ -0,0 +1,270 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\contract\controller;
use app\base\BaseController;
use app\contract\model\Contract as ContractList;
use app\contract\validate\ContractCheck;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Index extends BaseController
{
public function index()
{
if (request()->isAjax()) {
$param = get_params();
$where = array();
$whereOr = array();
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.name|c.title', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['cate_id'])) {
$where[] = ['a.cate_id', '=', $param['cate_id']];
}
if (!empty($param['type'])) {
$where[] = ['a.type', '=', $param['type']];
}
if (!empty($param['status'])) {
$where[] = ['a.status', '=', $param['status']];
}
$where[] = ['a.delete_time', '=', 0];
$where[] = ['a.archive_status', '=', 0];
$uid = $this->uid;
$auth = contract_auth($uid);
if($auth==0){
$whereOr[] =['a.admin_id|a.prepared_uid|a.sign_uid|a.keeper_uid', '=', $uid];
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',a.share_ids)")];
}
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$content = ContractList::where($where)
->where(function ($query) use($whereOr) {
$query->whereOr($whereOr);
})
->field('a.*,c.title as cate_title,d.title as sign_department')
->alias('a')
->join('contract_cate c', 'a.cate_id = c.id')
->join('department d', 'a.sign_did = d.id','LEFT')
->order('a.create_time desc')
->paginate($rows, false, ['query' => $param])
->each(function ($item, $key) {
$item->keeper_name = Db::name('Admin')->where(['id' => $item->keeper_uid])->value('name');
$item->sign_name = Db::name('Admin')->where(['id' => $item->sign_uid])->value('name');
$item->sign_time = date('Y-m-d', $item->sign_time);
$item->interval_time = date('Y-m-d', $item->start_time) . ' 至 ' . date('Y-m-d', $item->end_time);
$item->type_name = ContractList::$Type[(int) $item->type];
$item->status_name = ContractList::$Status[(int) $item->status];
$item->chack_status_name = ContractList::$Status[(int) $item->CheckStatus];
if($item->cost == 0){
$item->cost = '-';
}
});
return table_assign(0, '', $content);
} else {
return view();
}
}
public function archive()
{
if (request()->isAjax()) {
$param = get_params();
$where = array();
$whereOr = array();
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.name|c.title', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['cate_id'])) {
$where[] = ['a.cate_id', '=', $param['cate_id']];
}
if (!empty($param['cate_id'])) {
$where[] = ['a.cate_id', '=', $param['cate_id']];
}
if (!empty($param['type'])) {
$where[] = ['a.type', '=', $param['type']];
}
$where[] = ['a.delete_time', '=', 0];
$where[] = ['a.archive_status', '=', 1];
$uid = $this->uid;
$auth = contract_auth($uid);
if($auth==0){
$whereOr[] =['a.admin_id|a.prepared_uid|a.sign_uid|a.keeper_uid', '=', $uid];
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',a.share_ids)")];
}
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$content = ContractList::where($where)
->where(function ($query) use($whereOr) {
$query->whereOr($whereOr);
})
->field('a.*,c.title as cate_title,d.title as sign_department')
->alias('a')
->join('contract_cate c', 'a.cate_id = c.id')
->join('department d', 'a.sign_did = d.id','LEFT')
->order('a.create_time desc')
->paginate($rows, false, ['query' => $param])
->each(function ($item, $key) {
$item->keeper_name = Db::name('Admin')->where(['id' => $item->keeper_uid])->value('name');
$item->sign_name = Db::name('Admin')->where(['id' => $item->sign_uid])->value('name');
$item->sign_time = date('Y-m-d', $item->sign_time);
$item->interval_time = date('Y-m-d', $item->start_time) . ' 至 ' . date('Y-m-d', $item->end_time);
$item->type_name = ContractList::$Type[(int) $item->type];
$item->status_name = ContractList::$Status[(int) $item->status];
$item->chack_status_name = ContractList::$Status[(int) $item->CheckStatus];
if($item->cost == 0){
$item->cost = '-';
}
});
return table_assign(0, '', $content);
} else {
return view();
}
}
//文章添加&&编辑
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if (isset($param['sign_time'])) {
$param['sign_time'] = strtotime($param['sign_time']);
}
if (isset($param['start_time'])) {
$param['start_time'] = strtotime($param['start_time']);
}
if (isset($param['end_time'])) {
$param['end_time'] = strtotime($param['end_time']);
if ($param['end_time'] <= $param['start_time']) {
return to_assign(1, "结束时间需要大于开始时间");
}
}
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(ContractCheck::class)->scene($param['scene'])->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['update_time'] = time();
$old = Db::name('Contract')->where(['id' => $param['id']])->find();
$auth = contract_auth($this->uid);
if($this->uid!=$old['admin_id'] && $auth==0 && $old['status'] == 1){
return to_assign(1, "只有录入人员和合同管理员有权限操作");
}
if($auth==0 && $old['status'] > 1){
return to_assign(1, "只有合同管理员有权限操作");
}
$res = contractList::strict(false)->field(true)->update($param);
if ($res) {
add_log('edit', $param['id'], $param);
to_log($this->uid,$param,$old);
return to_assign();
} else {
return to_assign(1, '操作失败');
}
} else {
try {
validate(ContractCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['create_time'] = time();
$param['admin_id'] = $this->uid;
$aid = ContractList::strict(false)->field(true)->insertGetId($param);
if ($aid) {
add_log('add', $aid, $param);
$log_data = array(
'field' => 'new',
'action' => 'add',
'contract_id' => $aid,
'admin_id' => $param['admin_id'],
'create_time' => time(),
);
Db::name('ContractLog')->strict(false)->field(true)->insert($log_data);
return to_assign();
} else {
return to_assign(1, '操作失败');
}
}
} else {
$id = isset($param['id']) ? $param['id'] : 0;
$type = isset($param['type']) ? $param['type'] : 0;
$pid = isset($param['pid']) ? $param['pid'] : 0;
View::assign('id', $id);
View::assign('type', $type);
View::assign('pid', $pid);
View::assign('auth', contract_auth($this->uid));
if ($id > 0) {
$detail = (new ContractList())->detail($id);
if($detail['status']>1){
echo '<div style="text-align:center;color:red;margin-top:20%;">当前状态不开放编辑,请联系合同管理员</div>';exit;
}
View::assign('detail', $detail);
return view('edit');
}
if($pid>0){
$p_contract = Db::name('Contract')->where(['id' => $pid])->find();
View::assign('p_contract', $p_contract);
}
return view();
}
}
//查看文章
public function view()
{
$id = get_params("id");
$detail = (new ContractList())->detail($id);
$auth = contract_auth($this->uid);
$auth_array=[];
if(!empty($detail['share_ids'])){
$auth_array = explode(",",$detail['share_ids']);
}
array_push($auth_array,$detail['admin_id'],$detail['prepared_uid'],$detail['sign_uid'],$detail['keeper_uid']);
if($auth==0 && !in_array($this->uid,$auth_array)){
echo '<div style="text-align:center;color:red;margin-top:20%;">你无权限查看该合同</div>';exit;
}
View::assign('auth', $auth);
View::assign('detail', $detail);
return view();
}
//删除文章
public function delete()
{
if (request()->isDelete()) {
$id = get_params("id");
$data['id'] = $id;
$data['delete_time'] = time();
if (Db::name('Contract')->update($data) !== false) {
add_log('delete', $id);
$log_data = array(
'field' => 'del',
'action' => 'delete',
'contract_id' => $id,
'admin_id' => $this->uid,
'create_time' => time(),
);
Db::name('ContractLog')->strict(false)->field(true)->insert($log_data);
return to_assign(0, "删除成功");
} else {
return to_assign(1, "删除失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
}

5
app/contract/event.php Normal file
View File

@ -0,0 +1,5 @@
<?php
// 这是系统自动生成的event定义文件
return [
];

View File

@ -0,0 +1,14 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
// 这是系统自动生成的middleware定义文件
return [
//开启session中间件
//'think\middleware\SessionInit',
//验证勾股OA是否完成安装
\app\home\middleware\Install::class,
];

View File

@ -0,0 +1,100 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
namespace app\contract\model;
use think\facade\Db;
use think\Model;
class Contract extends Model
{
const ZERO = 0;
const ONE = 1;
const TWO = 2;
const THREE = 3;
const FORE = 4;
const FIVE = 5;
public static $Type = [
self::ZERO => '未设置',
self::ONE => '普通合同',
self::TWO => '框架合同',
self::THREE => '补充协议',
self::FORE => '其他合同',
];
public static $Status = [
self::ZERO => '未设置',
self::ONE => '已录入',
self::TWO => '待审核',
self::THREE => '已审核',
self::FORE => '已中止',
self::FIVE => '已作废',
];
public static $ArchiveStatus = [
self::ZERO => '未归档',
self::ONE => '已归档',
];
// 获取合同详情
public function detail($id)
{
$detail = Db::name('Contract')->where(['id' => $id])->find();
if (!empty($detail)) {
$file_array = Db::name('ContractFile')
->field('cf.id,f.filepath,f.name,f.filesize,f.fileext')
->alias('cf')
->join('File f', 'f.id = cf.file_id', 'LEFT')
->order('cf.create_time asc')
->where(array('cf.contract_id' => $id, 'cf.delete_time' => 0))
->select()->toArray();
$detail['status_name'] = self::$Status[(int) $detail['status']];
$detail['archive_status_name'] = self::$ArchiveStatus[(int) $detail['archive_status']];
$detail['sign_time'] = date('Y-m-d', $detail['sign_time']);
$detail['start_time'] = date('Y-m-d', $detail['start_time']);
$detail['end_time'] = date('Y-m-d', $detail['end_time']);
$detail['create_time'] = date('Y-m-d', $detail['create_time']);
$detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title');
$detail['sign_department'] = Db::name('Department')->where(['id' => $detail['sign_did']])->value('title');
$detail['sign_name'] = Db::name('Admin')->where(['id' => $detail['sign_uid']])->value('name');
$detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name');
$detail['prepared_name'] = Db::name('Admin')->where(['id' => $detail['prepared_uid']])->value('name');
$detail['keeper_name'] = Db::name('Admin')->where(['id' => $detail['keeper_uid']])->value('name');
$share_names = Db::name('Admin')->where([['id','in',$detail['share_ids']]])->column('name');
$detail['share_names'] = implode(',',$share_names);
//审核信息
if($detail['check_uid'] > 0){
$detail['check_name'] = Db::name('Admin')->where(['id' => $detail['check_uid']])->value('name');
$detail['check_time'] = date('Y-m-d', $detail['check_time']);
}
//中止信息
if($detail['stop_uid'] > 0){
$detail['stop_name'] = Db::name('Admin')->where(['id' => $detail['stop_uid']])->value('name');
$detail['stop_time'] = date('Y-m-d', $detail['stop_time']);
}
//作废信息
if($detail['void_uid'] > 0){
$detail['void_name'] = Db::name('Admin')->where(['id' => $detail['void_uid']])->value('name');
$detail['voidtime'] = date('Y-m-d', $detail['void_time']);
}
//归档信息
if($detail['archive_status'] == 1){
$detail['archive_name'] = Db::name('Admin')->where(['id' => $detail['archive_uid']])->value('name');
$detail['archive_time'] = date('Y-m-d', $detail['archive_time']);
}
if($detail['pid']>0){
$detail['pname'] = Db::name('Contract')->where(['id' => $detail['pid']])->value('name');
}
$detail['file_array'] = $file_array;
}
return $detail;
}
}

View File

@ -0,0 +1,127 @@
<?php
/**
* @copyright Copyright (c) 2022 勾股工作室
* @license https://opensource.org/licenses/GPL-3.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\contract\model;
use think\facade\Db;
use think\Model;
class ContractLog extends Model
{
public static $Sourse = [
'type' => ['', '未设置', '普通合同', '框架合同', '补充协议', '其他合同'],
'status' => ['', '已录入', '待审核', '已审核', '已中止', '已作废'],
'action' => [
'add' => '添加',
'edit' => '修改',
'delete' => '删除',
'upload' => '上传',
],
'field_array' => [
'code' => '编号',
'name' => '名称',
'cate_id' => '类别',
'type' => '性质',
'subject_id' => '签约主体',
'customer' => '客户名称',
'customer_name' => '客户代表姓名',
'customer_mobile' => '客户电话',
'customer_address'=> '客户地址',
'start_time' => '开始时间',
'end_time' => '结束时间',
'prepared_uid' => '制定人',
'sign_uid' => '签订人',
'keeper_uid' => '保管人',
'share_ids' => '共享人员',
'sign_time' => '签订时间',
'cost' => '金额',
'is_tax' => '是否含税',
'tax' => '税点',
'status' => '状态',
'archive_status' => '归档状态',
'file' => '合同附件',
'remark' => '备注信息',
'new' => '新增',
'del' => '删除',
]
];
public function contract_log($param = [])
{
$where = [];
$where[] = ['a.contract_id', '=', $param['contract_id']];
$page = intval($param['page']);
$rows = empty($param['limit']) ? get_config('app . page_size') : $param['limit'];
$content = Db::name('ContractLog')
->field('a.*,u.name,u.thumb')
->alias('a')
->join('Admin u', 'u.id = a.admin_id')
->order('a.create_time desc')
->where($where)
->page($page, $rows)
->select()->toArray();
$data = [];
$sourse = self::$Sourse;
$field_array = $sourse['field_array'];
$action = $sourse['action'];
foreach ($content as $k => $v) {
if (isset($sourse[$v['field']])) {
$v['old_content'] = $sourse[$v['field']][$v['old_content']];
$v['new_content'] = $sourse[$v['field']][$v['new_content']];
}
if (strpos($v['field'], '_time') !== false) {
if ($v['old_content'] == '') {
$v['old_content'] = '未设置';
}
$v['new_content'] = date('Y-m-d', (int) $v['new_content']);
}
if (strpos($v['field'], '_uid') !== false) {
$v['old_content'] = Db::name('Admin')->where(['id' => $v['old_content']])->value('name');
$v['new_content'] = Db::name('Admin')->where(['id' => $v['new_content']])->value('name');
}
if ($v['field'] == 'cate_id') {
$v['old_content'] = Db::name('ContractCate')->where(['id' => $v['old_content']])->value('title');
$v['new_content'] = Db::name('ContractCate')->where(['id' => $v['new_content']])->value('title');
}
if ($v['field'] == 'subject_id') {
$v['old_content'] = Db::name('InvoiceSubject')->where(['id' => $v['old_content']])->value('title');
$v['new_content'] = Db::name('InvoiceSubject')->where(['id' => $v['new_content']])->value('title');
}
if ($v['field'] == 'tax') {
$v['old_content'] = $v['old_content'] . '%';
$v['new_content'] = $v['new_content'] . '%';
}
if ($v['field'] == 'is_tax') {
$v['old_content'] = $v['old_content'] == 1?'是':'否';
$v['new_content'] = $v['new_content'] == 1?'是':'否';
}
if ($v['field'] == 'archive_status') {
$v['old_content'] = $v['old_content'] == 1?'已归档':'未归档';
$v['new_content'] = $v['new_content'] == 1?'已归档':'未归档';
}
if (strpos($v['field'], '_ids') !== false) {
$old_ids = Db::name('Admin')->where('id', 'in', $v['old_content'])->column('name');
$v['old_content'] = implode(',', $old_ids);
$new_ids = Db::name('Admin')->where('id', 'in', $v['new_content'])->column('name');
$v['new_content'] = implode(',', $new_ids);
}
if ($v['old_content'] == '' || $v['old_content'] == null) {
$v['old_content'] = '未设置';
}
if ($v['new_content'] == '' || $v['new_content'] == null) {
$v['new_content'] = '未设置';
}
$v['action'] = $action[$v['action']];
$v['title'] = $field_array[$v['field']];
$v['times'] = time_trans($v['create_time']);
$v['create_time'] = date('Y-m-d', $v['create_time']);
$data[] = $v;
}
return $data;
}
}

View File

@ -0,0 +1,29 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
namespace app\contract\validate;
use think\Validate;
class ContractCateCheck extends Validate
{
protected $rule = [
'title' => 'require|unique:contract_cate',
'id' => 'require',
];
protected $message = [
'title.require' => '名称不能为空',
'title.unique' => '同样的名称已经存在',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['title'],
'edit' => ['id', 'title'],
];
}

View File

@ -0,0 +1,37 @@
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-2.0
* @link https://www.gougucms.com
*/
namespace app\contract\validate;
use think\Validate;
class ContractCheck extends Validate
{
protected $rule = [
'name' => 'require|unique:contract',
'code' => 'require|unique:contract',
'id' => 'require',
'cost' => 'number',
'cate_id' => 'require',
];
protected $message = [
'name.require' => '合同名称不能为空',
'name.unique' => '同样的合同名称已经存在',
'code.require' => '合同编号不能为空',
'code.unique' => '同样的合同编号已经存在',
'cost.number' => '价格只能是数字',
'cate_id.require' => '所属分类为必选',
'id.require' => '缺少更新条件',
];
protected $scene = [
'add' => ['name', 'cate_id', 'code'],
'edit' => ['name', 'cate_id', 'code', 'id'],
'change' => ['id'],
];
}

View File

@ -0,0 +1,129 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<div class="gg-form-bar border-x border-t red">
<p><strong>说明</strong></p>
<p>合同性质分为:普通合同、框架合同、补充协议、其他合同</p>
<p>1、普通合同有合同金额且金额为必填项</p>
<p>2、框架合同无合同金额</p>
<p>3、补充协议和其它合同有合同金额但合同金额不是必填项</p>
<p>4、补充协议必须要选择一个母合同。</p>
</div>
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-normal layui-btn-sm addNew" type="button">+ 添加合同类型</button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool, form = layui.form;
layui.pageTable = table.render({
elem: '#test'
,toolbar: '#toolbarDemo'
,title:'合同类型列表'
,url: "/contract/cate/cate"
,page: true //开启分页
,limit: 20
,cellMinWidth: 80
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'title',title: '类别名称'}
,{field:'status', title: '状态',width:80,align:'center',templet: function(d){
var html1='<span class="green">正常</span>';
var html2='<span class="yellow">禁用</span>';
if(d.status==1){
return html1;
}
else{
return html2;
}
}}
,{width:100,title: '操作', align:'center',templet: function(d){
var html='';
var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
var btn1='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="disable">禁用</a>';
var btn2='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open">启用</a>';
if(d.status==1){
html = '<div class="layui-btn-group">'+btn+btn1+'</div>';
}
else{
html = '<div class="layui-btn-group">'+btn+btn2+'</div>';
}
return html;
}}
]]
});
table.on('tool(test)',function (obj) {
if(obj.event === 'edit'){
addExpense(obj.data.id,obj.data.title);
}
if(obj.event === 'disable'){
layer.confirm('确定要禁用该类别吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/contract/cate/cate_check", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
layer.close(index);
});
}
if(obj.event === 'open'){
layer.confirm('确定要启用该类别吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/contract/cate/cate_check", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
layer.close(index);
});
}
});
$('body').on('click','.addNew',function(){
addExpense(0,'');
});
function addExpense(id,val){
var title = '新增类别';
if(id>0){
title = '编辑类别';
}
layer.prompt({
title: title,
value: val,
yes: function(index, layero) {
// 获取文本框输入的值
var value = layero.find(".layui-layer-input").val();
if (value) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/contract/cate/cate_add", {id: id,title: value}, callback);
layer.close(index);
} else {
layer.msg('请填写类别标题');
}
}
})
}
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,93 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">权限配置</h3>
<table class="layui-table layui-table-form">
<tr>
<td colspan="4" class="red" style="line-height:1.8">
<p><strong>合同模块使用说明:</strong></p>
<p><strong>1、设置合同管理员可设置多个</strong></p>
<p style="text-indent:2em">a、拥有合同管理员权限的员工可以查看、编辑、审核、作废、中止所有合同。</p>
<p style="text-indent:2em">b、非合同管理员的员工可查看合同制定人、合同签订人、合同保管人、合同共享人员、合同录入人相关联的合同。</p>
<p style="text-indent:2em; margin-bottom:8px">c、合同的编辑权限只有合同录入人和合同管理员拥有。</p>
<p><strong>2、合同状态有已录入、待审核、已审核、已中止、已作废</strong></p>
<p style="text-indent:2em">a、合同只有在已录入的状态才可以编辑其他状态情况下需要编辑需要合同管理员反操作该状态才能编辑。</p>
<p style="text-indent:2em">b、合同录入后提交审核申请然后由合同管理员审核。</p>
<p style="text-indent:2em">c、审核通过后也是由合同管理员进行归档。</p>
<p style="text-indent:2em">d、合同实际中止后合同管理员也需要对合同进行中止操作。</p>
<p style="text-indent:2em; margin-bottom:8px">e、合同实际作废后管理员也需要对合同进行作废操作。</p>
<p><strong>3、系统会记录每一次合同的操作记录</strong></p>
<p style="text-indent:2em">a、记录每一次合同的操作记录防止合同被误操作和后期问题追踪。</p>
</td>
</tr>
<tr>
<td class="layui-td-gray">权限名称</td>
<td>
<input type="hidden" name="id" value="{$detail.id}" />
{$detail.title}
</td>
<td class="layui-td-gray">权限标识</td>
<td>{$detail.name}</td>
</tr>
<tr>
<td class="layui-td-gray">权限人员<font>*</font>
</td>
<td colspan="3">
<input type="text" id="unames" name="unames" value="{$detail.unames}" readonly placeholder="请选择权限人员" autocomplete="off" class="layui-input">
<input type="hidden" id="uids" name="uids" value="{$detail.uids}" lay-verify="required" lay-reqText="请选择权限人员">
</td>
</tr>
<tr>
<td colspan="4">
<span class="red" style="font-size: 12px;">{$detail.desc}</span>
</td>
</tr>
</table>
<div class="py-3">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','employeepicker'];
function gouguInit() {
var form = layui.form, tool = layui.tool,employeepicker = layui.employeepicker;
//选择共享成员弹窗
$('body').on('click','#unames',function () {
var ids=$('#uids').val(),names=$(this).val(),share_ids_array=[],share_names_array=[];
if(ids.length>0){
share_ids_array=ids.split(',');
share_names_array=names.split(',');
}
employeepicker.init({
ids:share_ids_array,
names:share_names_array,
type:1,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
$('#uids').val(ids);
$('#unames').val(names);
}
});
});
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
}
tool.post("/contract/cate/conf", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,273 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">新增合同</h3>
<table class="layui-table layui-table-form">
{gt name="$pid" value="0"}
<tr>
<td class="layui-td-gray">母合同名称</td>
<td colspan="5">{$p_contract.name}<input type="hidden" name="pid" value="{$pid}"></td>
</tr>
{/gt}
<tr>
<td class="layui-td-gray">合同名称<font>*</font></td>
<td colspan="3"><input type="text" name="name" lay-verify="required" lay-reqText="请输入合同名称" autocomplete="off" placeholder="请输入合同名称" class="layui-input"></td>
<td class="layui-td-gray">合同性质</td>
<td>
<input type="hidden" name="type" value="{$type}">
{eq name="$type" value="1" }普通合同{/eq}
{eq name="$type" value="2" }框架合同{/eq}
{eq name="$type" value="3" }补充协议{/eq}
{eq name="$type" value="4" }其他合同{/eq}
</td>
</tr>
<tr>
<td class="layui-td-gray">合同编号<font>*</font></td>
<td>
<input type="text" name="code" autocomplete="off" lay-verify="required" lay-reqText="请输入合同编号" placeholder="请输入合同编号" class="layui-input">
</td>
<td class="layui-td-gray">签约主体<span style="font-size:12px;">(乙方)</span><font>*</font></td>
<td>
<select name="subject_id" lay-verify="required" lay-reqText="请选择签约主体公司">
<option value="">请选择签约主体公司</option>
{volist name=":contract_subject()" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">合同类别<font>*</font></td>
<td>
<select name="cate_id" lay-verify="required" lay-reqText="请选择合同类别">
<option value="">请选择合同类别</option>
{volist name=":contract_cate()" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">客户名称<span style="font-size:12px;">(甲方)</span><font>*</font></td>
<td>
{gt name="$pid" value="0"}
<input type="text" name="customer" autocomplete="off" value="{$p_contract.customer}" readonly lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input">
{else/}
<input type="text" name="customer" autocomplete="off" lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input">
{/gt}
</td>
<td class="layui-td-gray">签约客户代表</td>
<td>
<input type="text" name="customer_name" autocomplete="off" lay-verify="required" lay-reqText="请输入客户代表姓名" placeholder="请输入客户代表姓名" class="layui-input">
</td>
<td class="layui-td-gray">客户联系电话<font>*</font></td>
<td>
<input type="text" name="customer_mobile" autocomplete="off" lay-verify="required" lay-reqText="请输入客户联系电话" placeholder="请输入客户联系电话" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray-2">客户联系地址</td>
<td>
<input type="text" name="customer_address" autocomplete="off" placeholder="请输入客户联系地址" class="layui-input">
</td>
<td class="layui-td-gray-2">合同开始日期<font>*</font></td>
<td>
<input type="text" name="start_time" readonly lay-verify="required" lay-reqText="请选择合同开始时间" placeholder="请选择合同开始时间" class="layui-input select-time">
</td>
<td class="layui-td-gray-2">合同结束日期<font>*</font></td>
<td>
<input type="text" name="end_time" readonly lay-verify="required" lay-reqText="请选择合同结束时间" placeholder="请选择合同结束时间" class="layui-input select-time">
</td>
</tr>
{neq name="$type" value="2"}
<tr>
<td class="layui-td-gray">合同金额{eq name="$type" value="1"}<font>*</font>{/eq}</td>
<td>
<input type="text" name="cost" value="" {eq name="$type" value="1"} lay-verify="required|number"{/eq} lay-reqText="请输入合同金额,数字" placeholder="请输入合同金额,数字" autocomplete="off" class="layui-input">
</td>
<td class="layui-td-gray">是否含税</td>
<td>
<input type="radio" name="is_tax" value="1" title="是" checked lay-filter="tax">
<input type="radio" name="is_tax" value="0" title="否" lay-filter="tax">
</td>
<td class="layui-td-gray">税点(百分比)</td>
<td>
<input type="text" name="tax" value="" lay-verify="number" placeholder="请输入税点,数字" autocomplete="off" class="layui-input">
</td>
</tr>
{/neq}
<tr>
<td colspan="6"><strong>签订信息</strong></td>
</tr>
<tr>
<td class="layui-td-gray-2">合同签订人<font>*</font></td>
<td>
<input type="text" name="sign_name" autocomplete="off" readonly placeholder="请选择合同签订人" class="layui-input">
<input type="hidden" name="sign_uid" lay-verify="required" lay-reqText="请选择合同签订人">
<input type="hidden" name="sign_did">
</td>
<td class="layui-td-gray-2">合同签订时间<font>*</font></td>
<td>
<input type="text" name="sign_time" readonly lay-verify="required" lay-reqText="请选择合同签订日期" placeholder="请选择合同签订日期" class="layui-input select-time">
</td>
<td class="layui-td-gray-2">合同签订部门</td>
<td>
<input type="text" name="sign_department" autocomplete="off" readonly class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray-2">合同制定人<font>*</font></td>
<td>
<input type="text" name="prepared_name" autocomplete="off" readonly placeholder="请选择合同制定人" class="layui-input">
<input type="hidden" name="prepared_uid" lay-verify="required" lay-reqText="请选择合同制定人">
</td>
<td class="layui-td-gray-2">合同保管人<font>*</font></td>
<td>
<input type="text" name="keeper_name" autocomplete="off" readonly placeholder="请选择合同保管人" class="layui-input">
<input type="hidden" name="keeper_uid" lay-verify="required" lay-reqText="请选择合同保管人">
</td>
<td class="layui-td-gray">合同共享人员</td>
<td>
<input type="text" name="share_names" autocomplete="off" readonly placeholder="请选择共享人员" class="layui-input">
<input type="hidden" name="share_ids">
</td>
</tr>
<tr>
<td colspan="6"><strong>备注信息</strong></td>
</tr>
<tr>
<td colspan="6">
<textarea name="remark" placeholder="请输入备注信息" class="layui-textarea"></textarea>
</td>
</tr>
</table>
<div class="py-3">
<input type="hidden" name="scene" value="add">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','employeepicker'];
function gouguInit() {
var form = layui.form,tool=layui.tool,laydate = layui.laydate,employeepicker = layui.employeepicker;
//日期
lay('.select-time').each(function () {
laydate.render({
elem: this,
trigger: 'click'
});
});
//选择合同签订人弹窗
$('body').on('click','[name="sign_name"]',function () {
var ids=$('[name="sign_uid"]').val(),names=$('[name="sign_name"]').val();
employeepicker.init({
ids:ids,
names:names,
type:0,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
$('[name="sign_uid"]').val(ids);
$('[name="sign_name"]').val(names);
$('[name="sign_did"]').val(dids);
$('[name="sign_department"]').val(departments);
}
});
});
//选择合同制定人弹窗
$('body').on('click','[name="prepared_name"]',function () {
var ids=$('[name="prepared_uid"]').val(),names=$('[name="prepared_name"]').val();
employeepicker.init({
ids:ids,
names:names,
type:0,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
$('[name="prepared_uid"]').val(ids);
$('[name="prepared_name"]').val(names);
}
});
});
//选择合同保管人弹窗
$('body').on('click','[name="keeper_name"]',function () {
var ids=$('[name="keeper_uid"]').val(),names=$('[name="keeper_name"]').val();
employeepicker.init({
ids:ids,
names:names,
type:0,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
$('[name="keeper_uid"]').val(ids);
$('[name="keeper_name"]').val(names);
}
});
});
//选择共享成员弹窗
$('body').on('click','[name="share_names"]',function () {
var ids=$('[name="share_ids"]').val(),names=$(this).val(),share_ids_array=[],share_names_array=[];
if(ids.length>0){
share_ids_array=ids.split(',');
share_names_array=names.split(',');
}
employeepicker.init({
ids:share_ids_array,
names:share_names_array,
type:1,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
$('[name="share_ids"]').val(ids);
$('[name="share_names"]').val(names);
}
});
});
//radio选择
form.on('radio(tax)', function(data){
if(data.value == 0){
$('[name="tax"]').val('0').hide();
}else{
$('[name="tax"]').val('').show();
}
});
//监听提交
form.on('submit(webform)', function (data) {
if (data.field.type == 1 && data.field.cost == '') {
layer.msg('请完善合同金额');
return false;
}
if (data.field.is_tax == 1 && data.field.tax == '') {
layer.msg('请完善税点');
return false;
}
if (data.field.is_tax == 1 && data.field.cost == '') {
layer.msg('请完善金额');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
parent.layui.tool.close(1000);
}
}
tool.post("/contract/index/add", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,148 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<form class="layui-form gg-form-bar border-x border-t">
<div class="layui-input-inline" style="width:150px;">
<select name="cate_id">
<option value="">请选择合同类别</option>
{volist name=":contract_cate()" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:150px;">
<select name="type">
<option value="">请选择合同性质</option>
<option value="1">普通合同</option>
<option value="2">框架合同</option>
<option value="3">补充协议</option>
<option value="4">其他合同</option>
</select>
</div>
<div class="layui-input-inline" style="width:240px;">
<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
</div>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
</form>
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool ,form = layui.form;
layui.pageTable = table.render({
elem: '#test',
title: '合同列表',
toolbar: '#toolbarDemo',
url: "/contract/index/archive", //数据接口
cellMinWidth: 320,
page: true, //开启分页
limit: 20,
cols: [
[ //表头
{
field: 'id',
title: '编号',
align: 'center',
width: 80
},{ field: 'status', title: '状态', align: 'center', width: 70, templet: function (d) {
var html = '<span class="layui-btn layui-btn-xs layui-bg-' + d.status + '">' + d.status_name + '</span>';
return html;
}
},{
field: 'code',
title: '合同编号',
width: 160
},{
field: 'name',
title: '合同名称',
templet: '<div><a data-href="/contract/index/view/id/{{d.id}}.html" class="right-a">{{d.name}}</a></div>'
}, {
field: 'cate_title',
title: '合同类别',
align: 'center',
width: 100
}, {
field: 'type_name',
title: '合同性质',
align: 'center',
width: 80,
templet: function (d) {
var html = '<span class="layui-color-' + d.type + '">' + d.type_name + '</span>';
return html;
}
},{
field: 'cost',
title: '合同金额/元',
align: 'right',
width: 100
}, {
field: 'sign_name',
title: '签定人',
align: 'center',
width: 80
},{
field: 'keeper_name',
title: '保管人',
align: 'center',
width: 80
}, {
field: 'sign_time',
title: '签订时间',
align: 'center',
width: 100
}, {
field: 'right',
fixed:'right',
title: '操作',
width: 100,
align: 'center',
templet: function (d) {
return '<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
}
}
]
]
});
//表头工具栏事件
table.on('toolbar(test)', function(obj){
if (obj.event === 'add') {
selectType();
return;
}
});
//监听行工具事件
table.on('tool(test)', function(obj) {
var data = obj.data;
if(obj.event === 'view'){
tool.side('/contract/index/view?id='+data.id);
return;
}
});
//监听搜索提交
form.on('submit(webform)', function(data) {
layui.pageTable.reload({
where: {
keywords: data.field.keywords,
cate_id: data.field.cate_id,
type: data.field.type
},
page: {
curr: 1
}
});
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,270 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">编辑合同</h3>
<table class="layui-table layui-table-form">
{gt name="$detail.pid" value="0"}
<tr>
<td class="layui-td-gray">母合同名称</td>
<td colspan="5">{$detail.pname}</td>
</tr>
{/gt}
<tr>
<td class="layui-td-gray">合同名称<font>*</font></td>
<td colspan="3"><input type="text" name="name" value="{$detail.name}" lay-verify="required" lay-reqText="请输入合同名称" autocomplete="off" placeholder="请输入合同名称" class="layui-input"></td>
<td class="layui-td-gray">合同性质</td>
<td>
{eq name="$detail.type" value="1" }普通合同{/eq}
{eq name="$detail.type" value="2" }框架合同{/eq}
{eq name="$detail.type" value="3" }补充协议{/eq}
{eq name="$detail.type" value="4" }其他合同{/eq}
</td>
</tr>
<tr>
<td class="layui-td-gray">合同编号<font>*</font></td>
<td>
<input type="text" name="code" value="{$detail.code}" autocomplete="off" lay-verify="required" lay-reqText="请输入合同编号" placeholder="请输入合同编号" class="layui-input">
</td>
<td class="layui-td-gray">签约主体<span style="font-size:12px;">(甲方)</span><font>*</font></td>
<td>
<select name="subject_id" lay-verify="required" lay-reqText="请选择签约主体公司">
<option value="">请选择签约主体公司</option>
{volist name=":contract_subject()" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.subject_id" } selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">合同类别<font>*</font></td>
<td>
<select name="cate_id" lay-verify="required" lay-reqText="请选择合同类别">
<option value="">请选择合同类别</option>
{volist name=":contract_cate()" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.cate_id" } selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
</tr>
<tr>
<td class="layui-td-gray">客户名称<span style="font-size:12px;">(乙方)</span><font>*</font></td>
<td>
<input type="text" name="customer" value="{$detail.customer}" autocomplete="off" lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input">
</td>
<td class="layui-td-gray">签约客户代表</td>
<td>
<input type="text" name="customer_name" value="{$detail.customer_name}" autocomplete="off" lay-verify="required" lay-reqText="请输入客户代表姓名" placeholder="请输入客户代表姓名" class="layui-input">
</td>
<td class="layui-td-gray">客户联系电话<font>*</font></td>
<td>
<input type="text" name="customer_mobile" value="{$detail.customer_mobile}" autocomplete="off" lay-verify="required" lay-reqText="请输入客户联系电话" placeholder="请输入客户联系电话" class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray-2">客户联系地址</td>
<td>
<input type="text" name="customer_address" value="{$detail.customer_address}" autocomplete="off" placeholder="请输入客户联系地址" class="layui-input">
</td>
<td class="layui-td-gray-2">合同开始日期<font>*</font></td>
<td>
<input type="text" name="start_time" value="{$detail.start_time}" readonly lay-verify="required" lay-reqText="请选择合同开始时间" placeholder="请选择合同开始时间" class="layui-input select-time">
</td>
<td class="layui-td-gray-2">合同结束日期<font>*</font></td>
<td>
<input type="text" name="end_time" value="{$detail.end_time}" readonly lay-verify="required" lay-reqText="请选择合同结束时间" placeholder="请选择合同结束时间" class="layui-input select-time">
</td>
</tr>
{neq name="$detail.type" value="2"}
<tr>
<td class="layui-td-gray">合同金额{eq name="$detail.type" value="1"}<font>*</font>{/eq}</td>
<td>
<input type="text" name="cost" value="{$detail.cost}" {eq name="$detail.type" value="1"} lay-verify="required|number"{/eq} lay-reqText="请输入合同金额,数字" placeholder="请输入合同金额,数字" autocomplete="off" class="layui-input">
</td>
<td class="layui-td-gray">是否含税</td>
<td>
<input type="radio" name="is_tax" value="1" title="是" {eq name="$detail.is_tax" value="1" } checked{/eq} lay-filter="tax">
<input type="radio" name="is_tax" value="0" title="否" {eq name="$detail.is_tax" value="0" } checked{/eq} lay-filter="tax">
</td>
<td class="layui-td-gray">税点(百分比)</td>
<td>
<input type="text" name="tax" value="{$detail.tax}"
<input type="text" name="tax" value="" lay-verify="number" placeholder="请输入税点,数字" autocomplete="off" class="layui-input" {eq name="$detail.is_tax" value="0" } style="display:none;"{/eq}>
</td>
</tr>
{/neq}
<tr>
<td colspan="6"><strong>签订信息</strong></td>
</tr>
<tr>
<td class="layui-td-gray-2">合同签订人<font>*</font></td>
<td>
<input type="text" name="sign_name" value="{$detail.sign_name}" autocomplete="off" readonly placeholder="请选择合同签订人" class="layui-input">
<input type="hidden" name="sign_uid" value="{$detail.sign_uid}" lay-verify="required" lay-reqText="请选择合同签订人">
<input type="hidden" name="sign_did" value="{$detail.sign_did}">
</td>
<td class="layui-td-gray-2">合同签订时间<font>*</font></td>
<td>
<input type="text" name="sign_time" value="{$detail.sign_time}" readonly lay-verify="required" lay-reqText="请选择合同签订日期" placeholder="请选择合同签订日期" class="layui-input select-time">
</td>
<td class="layui-td-gray-2">合同签订部门</td>
<td>
<input type="text" name="sign_department" value="{$detail.sign_department}" autocomplete="off" readonly class="layui-input">
</td>
</tr>
<tr>
<td class="layui-td-gray-2">合同制定人<font>*</font></td>
<td>
<input type="text" name="prepared_name" value="{$detail.prepared_name}" autocomplete="off" readonly placeholder="请选择合同制定人" class="layui-input">
<input type="hidden" name="prepared_uid" value="{$detail.prepared_uid}" lay-verify="required" lay-reqText="请选择合同制定人">
</td>
<td class="layui-td-gray-2">合同保管人<font>*</font></td>
<td>
<input type="text" name="keeper_name" value="{$detail.keeper_name}" autocomplete="off" readonly placeholder="请选择合同保管人" class="layui-input">
<input type="hidden" name="keeper_uid" value="{$detail.keeper_uid}" lay-verify="required" lay-reqText="请选择合同保管人">
</td>
<td class="layui-td-gray">合同共享人员</td>
<td>
<input type="text" name="share_names" value="{$detail.share_names}" autocomplete="off" readonly placeholder="请选择共享人员" class="layui-input">
<input type="hidden" name="share_ids" value="{$detail.share_ids}">
</td>
</tr>
<tr>
<td colspan="6"><strong>备注信息</strong></td>
</tr>
<tr>
<td colspan="6">
<textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark}</textarea>
</td>
</tr>
</table>
<div class="py-3">
<input type="hidden" name="id" value="{$detail.id}">
<input type="hidden" name="scene" value="edit">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','employeepicker'];
function gouguInit() {
var form = layui.form,tool=layui.tool,laydate = layui.laydate,employeepicker = layui.employeepicker;
//日期
lay('.select-time').each(function () {
laydate.render({
elem: this,
trigger: 'click'
});
});
//选择合同签订人弹窗
$('body').on('click','[name="sign_name"]',function () {
var ids=$('[name="sign_uid"]').val(),names=$('[name="sign_name"]').val();
employeepicker.init({
ids:ids,
names:names,
type:0,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
$('[name="sign_uid"]').val(ids);
$('[name="sign_name"]').val(names);
$('[name="sign_did"]').val(dids);
$('[name="sign_department"]').val(departments);
}
});
});
//选择合同制定人弹窗
$('body').on('click','[name="prepared_name"]',function () {
var ids=$('[name="prepared_uid"]').val(),names=$('[name="prepared_name"]').val();
employeepicker.init({
ids:ids,
names:names,
type:0,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
$('[name="prepared_uid"]').val(ids);
$('[name="prepared_name"]').val(names);
}
});
});
//选择合同保管人弹窗
$('body').on('click','[name="keeper_name"]',function () {
var ids=$('[name="keeper_uid"]').val(),names=$('[name="keeper_name"]').val();
employeepicker.init({
ids:ids,
names:names,
type:0,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
$('[name="keeper_uid"]').val(ids);
$('[name="keeper_name"]').val(names);
}
});
});
//选择共享成员弹窗
$('body').on('click','[name="share_names"]',function () {
var ids=$('[name="share_ids"]').val(),names=$(this).val(),share_ids_array=[],share_names_array=[];
if(ids.length>0){
share_ids_array=ids.split(',');
share_names_array=names.split(',');
}
employeepicker.init({
ids:share_ids_array,
names:share_names_array,
type:1,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
$('[name="share_ids"]').val(ids);
$('[name="share_names"]').val(names);
}
});
});
//radio选择
form.on('radio(tax)', function(data){
if(data.value == 0){
$('[name="tax"]').val('0').hide();
}else{
$('[name="tax"]').val('').show();
}
});
//监听提交
form.on('submit(webform)', function (data) {
if (data.field.type == 1 && data.field.cost == '') {
layer.msg('请完善合同金额');
return false;
}
if (data.field.is_tax == 1 && data.field.tax == '') {
layer.msg('请完善税点');
return false;
}
if (data.field.is_tax == 1 && data.field.cost == '') {
layer.msg('请完善金额');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
parent.layui.tool.close(1000);
}
}
tool.post("/contract/index/add", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,296 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-3">
<form class="layui-form gg-form-bar border-x border-t">
<div class="layui-input-inline" style="width:150px;">
<select name="cate_id">
<option value="">请选择合同类别</option>
{volist name=":contract_cate()" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</div>
<div class="layui-input-inline" style="width:150px;">
<select name="type">
<option value="">请选择合同性质</option>
<option value="1">普通合同</option>
<option value="2">框架合同</option>
<option value="3">补充协议</option>
<option value="4">其他合同</option>
</select>
</div>
<div class="layui-input-inline" style="width:150px;">
<select name="status">
<option value="">请选择合同状态</option>
<option value="1">已录入</option>
<option value="2">待审核</option>
<option value="3">已审核</option>
<option value="4">已中止</option>
<option value="5">已作废</option>
</select>
</div>
<div class="layui-input-inline" style="width:240px;">
<input type="text" name="keywords" placeholder="输入关键字" class="layui-input" autocomplete="off" />
</div>
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">提交搜索</button>
</form>
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<span class="layui-btn layui-btn-normal layui-btn-sm" title="添加合同" lay-event="add">+ 添加合同</span>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
var table = layui.table, tool = layui.tool ,form = layui.form;
layui.pageTable = table.render({
elem: '#test',
title: '合同列表',
toolbar: '#toolbarDemo',
url: "/contract/index/index", //数据接口
cellMinWidth: 320,
page: true, //开启分页
limit: 20,
cols: [
[ //表头
{
field: 'id',
title: '编号',
align: 'center',
width: 80
},{ field: 'status', title: '状态', align: 'center', width: 70, templet: function (d) {
var html = '<span class="layui-btn layui-btn-xs layui-bg-' + d.status + '">' + d.status_name + '</span>';
return html;
}
},{
field: 'code',
title: '合同编号',
width: 160
},{
field: 'name',
title: '合同名称',
templet: '<div><a data-href="/contract/index/view/id/{{d.id}}.html" class="right-a">{{d.name}}</a></div>'
}, {
field: 'cate_title',
title: '合同类别',
align: 'center',
width: 100
}, {
field: 'type_name',
title: '合同性质',
align: 'center',
width: 80,
templet: function (d) {
var html = '<span class="layui-color-' + d.type + '">' + d.type_name + '</span>';
return html;
}
},{
field: 'cost',
title: '合同金额/元',
align: 'right',
width: 100
}, {
field: 'sign_name',
title: '签定人',
align: 'center',
width: 80
},{
field: 'keeper_name',
title: '保管人',
align: 'center',
width: 80
}, {
field: 'sign_time',
title: '签订时间',
align: 'center',
width: 100
}, {
field: 'right',
fixed:'right',
title: '操作',
width: 100,
align: 'center',
templet: function (d) {
var html = '<div class="layui-btn-group">';
var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
var btn1='<span class="layui-btn layui-btn-xs" lay-event="edit">编辑</span>';
var btn2='<span class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</span>';
if(d.status<2){
return html+btn1+btn2+'</div>';
}
else{
return btn0;
}
}
}
]
]
});
//表头工具栏事件
table.on('toolbar(test)', function(obj){
if (obj.event === 'add') {
selectType();
return;
}
});
//监听行工具事件
table.on('tool(test)', function(obj) {
var data = obj.data;
if(obj.event === 'view'){
tool.side('/contract/index/view?id='+data.id);
return;
}
if(obj.event === 'edit'){
tool.side('/contract/index/add?id='+data.id);
return;
}
if (obj.event === 'del') {
layer.confirm('确定要删除吗?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/contract/index/delete", {id: data.id}, callback);
layer.close(index);
});
}
});
//选择合同性质
var table_a;
function selectType() {
layer.open({
title: '选择合同性质',
type:1,
area: ['480px', '336px'],
content: '<div style="padding:4px 12px 0"><div id="boxselect"></div></div>',
success: function() {
table_a = table.render({
elem: '#boxselect',
cols: [
[{
type: 'radio',
title: '选择',
width: 100
}, {
field: 'title',
title: '名称'
}]
],
data: [{
"type": "1",
"title": "普通合同"
},{
"type": "2",
"title": "框架合同"
}, {
"type": "3",
"title": "补充协议"
}, {
"type": "4",
"title": "其他合同"
}]
});
},
btn:['确定'],
yes: function(index) {
var checkStatus = table.checkStatus(table_a.config.id);
var data = checkStatus.data;
if (data.length > 0) {
if(data[0].type == 3){
selectCharge(data[0].type);
}
else{
tool.side("/contract/index/add?type="+data[0].type);
}
layer.close(index);
}
else{
layer.msg('选择合同性质');
}
}
})
}
//选择母合同
var table_b;
function selectCharge(type){
layer.open({
title:'选择母合同',
area:['680px','556px'],
type:1,
content:'<div style="padding:12px 10px 0;">\
<form class="layui-form">\
<input type="text" name="keywords" placeholder="合同名称" class="layui-input" autocomplete="off" style="max-width: 240px;display: inline-block;margin-right:10px; height:32px" />\
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-submit="" lay-filter="submit_form">提交搜索</button>\
</form>\
<div id="boxcontract" class="pt-2"></div></div>',
success:function(){
table_b=table.render({
elem: '#boxcontract'
,url:'/contract/api/get_contract'
,page: true //开启分页
,limit: 10
,cols: [[
{type:'radio',title: '选择'}
,{field:'name', title: '合同名称'}
,{field:'sign_name', width:90, title: '签约人',align:'center'}
,{field:'sign_time', width:110, title: '签约日期',align:'center'}
]]
});
//搜索提交
form.on('submit(submit_form)', function(data){
table_b.reload({where:{keywords:data.field.keywords},page:{curr:1}});
return false;
});
},
btn: ['确定'],
yes: function(index){
var checkStatus = table.checkStatus(table_b.config.id);
var data = checkStatus.data;
if(data.length>0){
tool.side("/contract/index/add?type="+type+"&pid="+data[0].id);
layer.close(index);
}else{
layer.msg('请先选择合同');
return false;
}
}
})
}
//监听搜索提交
form.on('submit(webform)', function(data) {
layui.pageTable.reload({
where: {
keywords: data.field.keywords,
cate_id: data.field.cate_id,
type: data.field.type,
status: data.field.status
},
page: {
curr: 1
}
});
return false;
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,503 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
html{background-color:#fff;}
.file-card {background: #fff;border: 1px solid #f1f1f1;border-radius: 2px; padding:8px 0; margin:4px 8px 4px 0;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.file-card .file-icon{font-size:36px; color:#646464; margin-right: 4px;}
.file-card .file-title {font-size: 12px; letter-spacing: 0; margin-right: 8px; line-height: 16px; word-break: break-all; overflow: hidden; text-overflow: ellipsis; display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;width: calc(100% - 110px);
}
.file-card .file-tool .layui-icon{font-size:22px; padding:2px; cursor:pointer;}
.log-timeline{ position: relative; min-height:600px; padding-left: 48px; background-color:#fff;}
.log-timeline:after {content: ""; position: absolute; top: 0; left: 24px; width: 1px; height: 100%; background: #e3e9ed;}
.log-timeline dl{padding-bottom: 8px; position: relative;}
.log-timeline dt{font-size: 16px; line-height: 2.4; color: #323232; font-weight:600}
.log-timeline dd{font-size: 14px; line-height: 1.6; padding:5px 0}
.log-timeline .date-second-point{width: 10px; height: 10px; display: block; border-radius: 50%; border: 3px solid #FBBC05; background: #fff; position: absolute; z-index: 99; left:-32px; top:9px}
.log-timeline .log-thumb{width: 24px; height: 24px; border-radius: 50%; margin-right:4px;}
.log-timeline .open-a{margin:0 4px;}
.log-item i{font-weight:800; color:#323232}
.log-content strong{margin:0 4px; color:#323232}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="px-4 pt-2">
<div class="layui-tab" style="margin:0;" lay-filter="contract" id="contractTab">
<ul class="layui-tab-title">
<li class="layui-this" data-load="true">合同详情</li>
<li>操作记录</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<table class="layui-table layui-table-form">
{gt name="$detail.pid" value="0"}
<tr>
<td class="layui-td-gray">母合同名称</td>
<td colspan="7">{$detail.pname}</td>
</tr>
{/gt}
<tr>
<td class="layui-td-gray">合同名称</td>
<td colspan="5">{$detail.name}</td>
<td class="layui-td-gray">合同编号</td>
<td>{$detail.code}</td>
</tr>
<tr>
<td class="layui-td-gray">签约主体(乙方)</td>
<td colspan="3">
{volist name=":contract_subject()" id="v"}
{eq name="$v.id" value="$detail.subject_id" }{$v.title}{/eq}
{/volist}
</td>
<td class="layui-td-gray">合同性质</td>
<td>
{eq name="$detail.type" value="1" }普通合同{/eq}
{eq name="$detail.type" value="2" }框架合同{/eq}
{eq name="$detail.type" value="3" }补充协议{/eq}
{eq name="$detail.type" value="4" }其他合同{/eq}
</td>
<td class="layui-td-gray">合同类别</td>
<td>
{volist name=":contract_cate()" id="v"}
{eq name="$v.id" value="$detail.cate_id" }{$v.title}{/eq}
{/volist}
</td>
</tr>
<tr>
<td class="layui-td-gray">客户名称(甲方)</td>
<td colspan="3">{$detail.customer}</td>
<td class="layui-td-gray">签约客户代表</td>
<td>{$detail.customer_name}</td>
<td class="layui-td-gray">客户联系电话</td>
<td>{$detail.customer_mobile}</td>
</tr>
<tr>
<td class="layui-td-gray-2">客户联系地址</td>
<td colspan="3">{$detail.customer_address}</td>
<td class="layui-td-gray-2">合同开始日期</td>
<td>{$detail.start_time}</td>
<td class="layui-td-gray-2">合同结束日期</td>
<td>{$detail.end_time}</td>
</tr>
{neq name="$detail.type" value="2"}
<tr>
<td class="layui-td-gray">合同金额</td>
<td>{$detail.cost}</td>
{eq name="$detail.is_tax" value="1" }
<td class="layui-td-gray">是否含税</td>
<td></td>
<td class="layui-td-gray">税点(百分比)</td>
<td colspan="3">{$detail.tax}%</td>
{/eq}
{eq name="$detail.is_tax" value="0" }
<td class="layui-td-gray">是否含税</td>
<td colspan="5"></td>
{/eq}
</tr>
{/neq}
{notempty name="$detail.remark"}
<tr>
<td class="layui-td-gray">备注信息</td>
<td colspan="7">{$detail.remark}</td>
</tr>
{/notempty}
<tr>
<td class="layui-td-gray">
<div class="layui-input-inline">合同附件</div>
{eq name="$detail.status" value="1" }<div class="layui-input-inline"><button type="button" class="layui-btn layui-btn-xs" id="upFile"><i class="layui-icon"></i></button></div>{/eq}
</td>
<td colspan="7" id="fileList">
{volist name="$detail.file_array" id="vo"}
<div class="layui-col-md4" id="file_{$vo.id}">
<div class="file-card">
<i class="file-icon layui-icon layui-icon-file"></i>
<div class="file-title">{$vo.name}</div>
<div class="file-tool">
<a href="{$vo.filepath}" download="{$vo.name}" title="下载查看" target="_blank"><i class="layui-icon layui-icon-download-circle" style="color: #12bb37;"></i></a>
<i class="btn-delete layui-icon layui-icon-delete" data-id="{$vo.id}" style="color: #FF5722;" title="删除"></i>
</div>
</div>
</div>
{/volist}
</td>
</tr>
<tr>
<td colspan="8"><strong>签订信息</strong></td>
</tr>
<tr>
<td class="layui-td-gray-2">合同制定人</td>
<td>{$detail.prepared_name} </td>
<td class="layui-td-gray-2">合同签订人</td>
<td>{$detail.sign_name}</td>
<td class="layui-td-gray-2">合同签订时间</td>
<td>{$detail.sign_time}</td>
<td class="layui-td-gray-2">合同签订部门</td>
<td>{$detail.sign_department}</td>
</tr>
<tr>
<td colspan="8"><strong>审核信息</strong></td>
</tr>
<tr>
<td class="layui-td-gray-2">合同保管人</td>
<td>{$detail.keeper_name}{gt name="$auth" value="0"}<button id="keeper" data-ids="{$detail.keeper_uid}" data-names="{$detail.keeper_name}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</button>{/gt}</td>
<td class="layui-td-gray">合同共享人员</td>
<td colspan="5">{$detail.share_names}{gt name="$auth" value="0"}<button id="shares" data-ids="{$detail.share_ids}" data-names="{$detail.share_names}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</button>{/gt}</td>
</tr>
{lt name="$detail.status" value="3" }
<tr>
<td class="layui-td-gray-2">合同状态</td>
<td><span class="layui-color-{$detail.status}">{$detail.status_name}</span></td>
<td class="layui-td-gray-2">录入人</td>
<td>{$detail.admin_name} </td>
<td class="layui-td-gray-2">录入时间</td>
<td colspan="3">{$detail.create_time}</td>
</tr>
{/lt}
{eq name="$detail.status" value="3" }
<tr>
<td class="layui-td-gray-2">合同状态</td>
<td colspan="7"><span class="layui-color-{$detail.status}">{$detail.status_name}</span></td>
</tr>
<tr>
<td class="layui-td-gray-2">审核人</td>
<td>{$detail.check_name} </td>
<td class="layui-td-gray-2">审核时间</td>
<td>{$detail.check_time}</td>
<td class="layui-td-gray-2">录入人</td>
<td>{$detail.admin_name} </td>
<td class="layui-td-gray-2">录入时间</td>
<td>{$detail.create_time}</td>
</tr>
<tr>
<td class="layui-td-gray-2">审核备注</td>
<td colspan="7">{$detail.check_remark}</td>
</tr>
<tr>
<td class="layui-td-gray-2">归档状态</td>
{eq name="$detail.archive_status" value="0" }
<td colspan="7"><span class="layui-color-{$detail.archive_status}">{$detail.archive_status_name}</span></td>
{else/}
<td><span class="layui-color-{$detail.archive_status}">{$detail.archive_status_name}</span></td>
<td class="layui-td-gray-2">归档人</td>
<td>{$detail.archive_name} </td>
<td class="layui-td-gray-2">归档时间</td>
<td colspan="3">{$detail.archive_time}</td>
{/eq}
</tr>
{/eq}
{eq name="$detail.status" value="4" }
<tr>
<td class="layui-td-gray-2">合同状态</td>
<td colspan="7"><span class="layui-color-{$detail.status}">{$detail.status_name}</span></td>
</tr>
<tr>
<td class="layui-td-gray-2">中止人</td>
<td>{$detail.stop_name} </td>
<td class="layui-td-gray-2">中止时间</td>
<td>{$detail.stop_time}</td>
<td class="layui-td-gray-2">录入人</td>
<td>{$detail.admin_name} </td>
<td class="layui-td-gray-2">录入时间</td>
<td>{$detail.create_time}</td>
</tr>
<tr>
<td class="layui-td-gray-2">中止备注</td>
<td colspan="7">{$detail.stop_remark}</td>
</tr>
{/eq}
{eq name="$detail.status" value="5" }
<tr>
<td class="layui-td-gray-2">合同状态</td>
<td colspan="7"><span class="layui-color-{$detail.status}">{$detail.status_name}</span></td>
</tr>
<tr>
<td class="layui-td-gray-2">作废人</td>
<td>{$detail.void_name} </td>
<td class="layui-td-gray-2">作废时间</td>
<td>{$detail.void_time}</td>
<td class="layui-td-gray-2">录入人</td>
<td>{$detail.admin_name} </td>
<td class="layui-td-gray-2">录入时间</td>
<td>{$detail.create_time}</td>
</tr>
<tr>
<td class="layui-td-gray-2">作废备注</td>
<td colspan="7">{$detail.void_remark}</td>
</tr>
{/eq}
</table>
{gt name="$auth" value="0"}
{eq name="$detail.status" value="1" }
<div class="p-4" style="text-align:center;">
<a class="layui-btn" href="/contract/index/add/id/{$detail.id}">编辑合同</a>
<button class="layui-btn layui-btn-normal" data-event="check" data-status="2">提交审核</button>
<button class="layui-btn layui-btn-warm" data-event="check" data-status="4">中止合同</button>
<button class="layui-btn layui-btn-danger" data-event="check" data-status="5">作废合同</button>
</div>
{/eq}
{eq name="$detail.status" value="2" }
<div class="p-4" style="text-align:center;">
<button class="layui-btn layui-btn-normal" data-event="check" data-status="3">审核通过</button>
<button class="layui-btn layui-btn-danger" data-event="check" data-status="1">审核拒绝</button>
</div>
{/eq}
{eq name="$detail.status" value="3" }
<div class="p-4" style="text-align:center;">
{eq name="$detail.archive_status" value="1" }
<button class="layui-btn layui-btn-danger" data-event="archive" data-status="0">反确认归档</button>
{else/}
<button class="layui-btn layui-btn-normal" data-event="archive" data-status="1">合同归档</button>
<button class="layui-btn layui-btn-danger" data-event="check" data-status="1">反确认审核</button>
{/eq}
</div>
{/eq}
{eq name="$detail.status" value="4" }
<div class="p-4" style="text-align:center;">
<button class="layui-btn layui-btn-danger" data-event="check" data-status="1">反中止合同</button>
</div>
{/eq}
{eq name="$detail.status" value="5" }
<div class="p-4" style="text-align:center;">
<button class="layui-btn layui-btn-danger" data-event="check" data-status="1">反作废合同</button>
</div>
{/eq}
{/gt}
</div>
<div class="layui-tab-item">
{include file="/index/view_log" /}
</div>
</div>
</div>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const contract_id = '{$detail.id}';
const contract_status = '{$detail.status}';
const moduleInit = ['tool','employeepicker'];
function gouguInit() {
var form = layui.form,tool=layui.tool, upload = layui.upload,element = layui.element,employeepicker = layui.employeepicker;
element.on('tab(contract)', function(data){
let index = data.index;
console.log(index);
if(index == 1){
log(layui);
}
});
//选择合同保管人弹窗
$('body').on('click','#keeper',function () {
var ids=$(this).data('ids')+'',names = $(this).data('names')+'';
employeepicker.init({
ids:ids,
names:names,
type:0,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
location.reload();
}
}
tool.post("/contract/index/add", {'id':contract_id,'keeper_uid':ids,'scene':'change'}, callback);
}
});
});
//选择共享成员弹窗
$('body').on('click','#shares',function () {
var ids=$(this).data('ids')+'',names = $(this).data('names')+'',share_ids_array=[],share_names_array=[];
if(ids.length>0){
share_ids_array=ids.split(',');
share_names_array=names.split(',');
}
employeepicker.init({
ids:share_ids_array,
names:share_names_array,
type:1,
department_url: "/api/index/get_department_tree",
employee_url: "/api/index/get_employee",
callback:function(ids,names,dids,departments){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
location.reload();
}
}
tool.post("/contract/index/add", {'id':contract_id,'share_ids':ids.join(','),'scene':'change'}, callback);
}
});
});
$('body').on('click','[data-event="check"]',function(){
let status = $(this).data('status');
let action = 'apply';
let title = '提交审核后合同内容将不能编辑,确定要提交审核?'
if(contract_status == 2 && status == 3){
title = '确定要通过该合同审核?';
action = 'check_ok';
}
if(contract_status == 2 && status == 1){
title = '确定要拒绝该合同审核?';
action = 'check_refue';
}
if(contract_status == 3 && status == 1){
title = '确定要反确认该合同的审核?';
action = 'check_refue';
}
if(contract_status == 1 && status == 4){
title = '确定要中止该合同?';
action = 'stop_ok';
}
if(contract_status == 4 && status == 1){
title = '确定要反中止该合同?';
action = 'stop_no';
}
if(contract_status == 1 && status == 5){
title = '确定要作废该合同?';
action = 'void_ok';
}
if(contract_status == 5 && status == 1){
title = '确定要反作废该合同?';
action = 'void_no';
}
layer.confirm(title, {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
parent.layui.pageTable.reload();
setTimeout(function(){
location.reload();
},2000)
}
if(status == 3 || status == 4 || status == 5){
layer.open({
type: 1,
title: '请输入原因或理由',
area: ['800px', '360px'],
content: '<div style="padding:5px;"><textarea class="layui-textarea" id="remarkTextarea" style="width: 100%; height: 240px;"></textarea></div>',
btnAlign: 'c',
btn: ['提交保存'],
yes: function () {
let remark = $("#remarkTextarea").val();
if (remark != '') {
tool.post("/contract/api/check", {id: contract_id,status:status,mark:remark}, callback);
} else {
layer.msg('请输入原因或理由');
}
}
})
}
else{
tool.post("/contract/api/check", {id: contract_id,status:status,mark:''}, callback);
}
layer.close(index);
});
});
$('body').on('click','[data-event="archive"]',function(){
let status = $(this).data('status');
let title = '合同归档后将不能进行任何数据操作,确定要提交归档?';
layer.confirm(title, {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
parent.layui.pageTable.reload();
setTimeout(function(){
location.reload();
},2000)
}
tool.post("/contract/api/archive", {id: contract_id,archive_status:status}, callback);
layer.close(index);
});
})
//删除附件
$('#fileList').on('click', '.btn-delete', function () {
var _id = $(this).data('id');
layer.confirm('确定要删除该附件吗?', {
icon: 3,
title: '提示'
}, function(index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
$('#file_' + _id).remove();
}
}
tool.delete("/contract/api/delete_file", {id: _id}, callback);
layer.close(index);
});
})
//多附件上传
upload.render({
elem: '#upFile'
,url: "/api/index/upload"
,multiple: true
,accept: 'file' //普通文件
,exts: 'png|jpg|gif|jpeg|doc|docx|ppt|pptx|xls|xlsx|pdf|txt|zip|rar|7z' //只允许上传文件格式
,done: function(res){
if (res.code == 0) {
let callback = function (e) {
layer.msg(e.msg);
let temp = `<div class="layui-col-md4" id="file_${e.data}">
<div class="file-card">
<i class="file-icon layui-icon layui-icon-file"></i>
<div class="file-title">${res.data.name}</div>
<div class="file-tool">
<a href="${res.data.filepath}" download="${res.data.name}" title="下载查看" target="_blank"><i class="layui-icon layui-icon-download-circle" style="color: #12bb37;"></i></a>
<i class="btn-delete layui-icon layui-icon-delete" data-id="${e.data}" style="color: #FF5722;" title="删除"></i>
</div>
</div>
</div>`;
$('#fileList').append(temp);
}
tool.post("/contract/api/add_file", {'contract_id':contract_id,'file_id':res.data.id,'file_name':res.data.name}, callback);
}
else{
layer.msg(res.msg);
}
}
});
}
</script>
{/block}
<!-- /脚本 -->

View File

@ -0,0 +1,68 @@
<div class="bg-white">
<div id="logList" class="log-timeline p-3"></div>
</div>
<script>
function log(){
if($('#contractTab').find('li').eq(1).data('load') =='true'){
return false;
}
$('#contractTab').find('li').eq(1).data('load','true');
let tool = layui.tool;
//日志
let callback = function(res){
$('.log-more').remove();
if(res.code==0 && res.data.length>0){
let itemLog = '',log_time='';
$.each(res.data, function (index, item) {
let detail = "";
if(log_time != item.create_time){
if(log_time==''){
itemLog+='<dl><dt><span class="date-second-point"></span>'+item.create_time+'</dt>'
}
else{
itemLog+='</dl><dl><dt><span class="date-second-point"></span>'+item.create_time+'</dt>'
}
log_time = item.create_time;
}
if(item.field =='new' || item.field =='del'){
detail= `
<span class="log-content gray">${item.action}了合同</strong><span class="ml-4 gray" title="${item.create_time}">${item.times}</span>
`;
}
else if(item.field =='file'){
detail= `
<span class="log-content gray">${item.action}了${item.title}<strong>${item.new_content}</strong><span class="ml-4 gray" title="${item.create_time}">${item.times}</span></span>
`;
}
else{
detail= `
<span class="log-content gray">将合同<strong>${item.title}</strong>从 ${item.old_content} ${item.action}为<strong>${item.new_content}</strong><span class="ml-4 gray" title="${item.create_time}">${item.times}</span></span>
`;
}
itemLog+= `
<dd><img src="${item.thumb}" class="log-thumb" /><span class="log-name">${item.name}</span>${detail}</dd>
`;
});
itemLog+='</dl>';
if(res.data.length>19){
itemLog+='<div class="py-3 log-more"><button class="layui-btn layui-btn-normal layui-btn-sm" type="button">查看更多操作动态</button></div>';
}
$("#logList").append(itemLog);
}
else{
if(project_page ==1){
$("#logList").html('<div class="layui-data-none">暂无动态</div>');
}
}
}
let contract_page=1;
tool.get("/contract/api/contract_log",{contract_id:contract_id,page:contract_page},callback);
$('#logList').on('click','.log-more',function(){
contract_page++;
tool.get("/contract/api/contract_log",{contract_id:contract_id,page:contract_page},callback);
});
}
</script>

View File

@ -173,4 +173,32 @@ class Module extends BaseController
return to_assign(1,'操作失败');
}
}
//数据权限列表
public function data_auth()
{
if (request()->isAjax()) {
$auth = Db::name('DataAuth')->select();
return to_assign(0, '', $auth);
} else {
return view();
}
}
//数据权限详情
public function data_auth_detail()
{
$param = get_params();
if (request()->isPost()) {
$param['update_time'] = time();
$res = Db::name('DataAuth')->strict(false)->field(true)->update($param);
return to_assign();
} else {
$detail = Db::name('DataAuth')->where('name',$param['name'])->find();
View::assign('detail', $detail);
return view();
}
}
}

View File

@ -81,7 +81,7 @@ CREATE TABLE `oa_admin_module` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '模块名称',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '模块目录,唯一,字母',
`type` int(2) NOT NULL DEFAULT 1 COMMENT '状态::1系统模块,2普通模块',
`type` int(2) NOT NULL DEFAULT 1 COMMENT '状态:1系统模块,2普通模块',
`sourse` int(2) NOT NULL DEFAULT 1 COMMENT '来源:1官方,2第三方',
`create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
@ -97,8 +97,9 @@ INSERT INTO `oa_admin_module` VALUES (3, '消息模块', 'message', 1, 1, 163956
INSERT INTO `oa_admin_module` VALUES (4, '公告模块', 'note', 1, 1, 1639562910, 0);
INSERT INTO `oa_admin_module` VALUES (5, 'OA模块', 'oa', 1, 1, 1639562910, 0);
INSERT INTO `oa_admin_module` VALUES (6, '财务模块', 'finance', 1, 1, 1639562910, 0);
INSERT INTO `oa_admin_module` VALUES (7, '项目模块', 'project', 2, 1, 1656142368, 0);
INSERT INTO `oa_admin_module` VALUES (8, '知识模块', 'article', 2, 1, 1656143065, 0);
INSERT INTO `oa_admin_module` VALUES (7, '合同模块', 'contract', 2, 1, 1656142368, 0);
INSERT INTO `oa_admin_module` VALUES (8, '项目模块', 'project', 2, 1, 1656142368, 0);
INSERT INTO `oa_admin_module` VALUES (9, '知识模块', 'article', 2, 1, 1656143065, 0);
-- ----------------------------
-- Table structure for oa_admin_rule
@ -120,7 +121,6 @@ CREATE TABLE `oa_admin_rule` (
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '菜单及权限表';
-- ----------------------------
-- Records of oa_admin_rule
-- ----------------------------
@ -188,9 +188,9 @@ INSERT INTO `oa_admin_rule` VALUES (48, 2, 'home/cate/car_cate', '车辆类型',
INSERT INTO `oa_admin_rule` VALUES (49, 48, 'home/cate/car_cate_add', '新建/编辑', '车辆类型', 'home', '', 2, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (50, 48, 'home/cate/car_cate_check', '设置', '车辆类型', 'home', '', 2, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (51, 2, 'home/cate/subject', '发票主体', '发票主体', 'home', '', 1, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (52, 51, 'home/cate/subject_add', '新建/编辑', '发票主体', 'home', '', 2, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (53, 51, 'home/cate/subject_check', '设置', '发票主体', 'home', '', 2, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (51, 2, 'home/cate/subject', '企业主体', '企业主体', 'home', '', 1, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (52, 51, 'home/cate/subject_add', '新建/编辑', '企业主体', 'home', '', 2, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (53, 51, 'home/cate/subject_check', '设置', '企业主体', 'home', '', 2, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (54, 2, 'home/cate/note_cate', '公告类型', '公告类型', 'home', '', 1, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (55, 54, 'home/cate/note_cate_add', '新建/编辑', '公告类型', 'home', '', 2, 1, 1, 0, 0);
@ -302,29 +302,41 @@ INSERT INTO `oa_admin_rule` VALUES (138, 137, 'finance/income/add', '新建/编
INSERT INTO `oa_admin_rule` VALUES (139, 137, 'finance/income/view', '查看', '到账记录', 'finance', '', 2, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (140, 137, 'finance/income/delete', '删除', '到账记录', 'finance', '', 2, 1, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (141, 0, '', '项目任务', '项目任务', 'project', 'icon-xiangmuguanli', 1, 9, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (142, 141, 'project/index/index', '项目列表', '项目', 'project', '', 1, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (143, 142, 'project/index/add', '新建', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (144, 142, 'project/index/edit', '编辑', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (145, 142, 'project/index/view', '查看', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (146, 142, 'project/index/delete', '删除', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (141, 0, '', '合同协议', '合同协议', 'contract', 'icon-hetongyidong', 1, 9, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (142, 141, 'contract/cate/conf', '权限配置', '合同权限配置', 'contract', '', 1, 0, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (143, 141, 'contract/cate/cate', '合同类别', '合同类别', 'contract', '', 1, 0, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (144, 143, 'contract/cate/cate_add', '新建/编辑', '合同类别', 'contract', '', 2, 0, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (145, 143, 'contract/cate/cate_check', '设置', '合同类别', 'contract', '', 2,0, 1, 0, 0);
INSERT INTO `oa_admin_rule` VALUES (147, 141, 'project/task/index', '任务列表', '任务', 'project', '', 1, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (148, 147, 'project/task/add', '新建', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (149, 147, 'project/task/edit', '编辑', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (150, 147, 'project/task/view', '查看', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (151, 147, 'project/task/delete', '删除', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (146, 141, 'contract/index/index', '合同列表', '合同列表', 'contract', '', 1, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (147, 146, 'contract/index/add', '新建/编辑', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (148, 146, 'contract/index/view', '查看', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (149, 146, 'contract/index/delete', '删除', '合同', 'contract', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (150, 141, 'contract/index/archive', '合同归档', '合同归档', 'contract', '', 1, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (152, 0, '', '知识文章', '知识文章', 'article', 'icon-kecheng', 1, 10, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (153, 152, 'article/cate/cate', '知识类型', '知识类型', 'article', '', 1, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (154, 153, 'article/cate/cate_add', '新建/编辑', '知识类型', 'article', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (155, 153, 'article/cate/cate_delete', '删除', '知识类型', 'article', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (151, 0, '', '项目任务', '项目任务', 'project', 'icon-xiangmuguanli', 1, 10, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (152, 151, 'project/index/index', '项目列表', '项目', 'project', '', 1, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (153, 152, 'project/index/add', '新建', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (154, 152, 'project/index/edit', '编辑', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (155, 152, 'project/index/view', '查看', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (156, 152, 'project/index/delete', '删除', '项目', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (156, 152, 'article/index/index', '共享知识', '知识文章', 'article', '', 1, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (157, 152, 'article/index/list', '个人知识', '知识文章', 'article', '', 1, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (158, 157, 'article/index/add', '新建/编辑', '知识文章', 'article', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (159, 157, 'article/index/view', '查看', '知识文章', 'article', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (160, 157, 'article/index/delete', '删除', '知识文章', 'article', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (157, 151, 'project/task/index', '任务列表', '任务', 'project', '', 1, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (158, 157, 'project/task/add', '新建', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (159, 157, 'project/task/edit', '编辑', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (160, 157, 'project/task/view', '查看', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (161, 157, 'project/task/delete', '删除', '任务', 'project', '', 2, 0, 1, 1656142368, 0);
INSERT INTO `oa_admin_rule` VALUES (162, 0, '', '知识文章', '知识文章', 'article', 'icon-kecheng', 1, 11, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (163, 162, 'article/cate/cate', '知识类型', '知识类型', 'article', '', 1, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (164, 163, 'article/cate/cate_add', '新建/编辑', '知识类型', 'article', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (165, 163, 'article/cate/cate_delete', '删除', '知识类型', 'article', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (166, 162, 'article/index/index', '共享知识', '知识文章', 'article', '', 1, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (167, 162, 'article/index/list', '个人知识', '知识文章', 'article', '', 1, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (168, 167, 'article/index/add', '新建/编辑', '知识文章', 'article', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (169, 167, 'article/index/view', '查看', '知识文章', 'article', '', 2, 0, 1, 1656143065, 0);
INSERT INTO `oa_admin_rule` VALUES (170, 167, 'article/index/delete', '删除', '知识文章', 'article', '', 2, 0, 1, 1656143065, 0);
-- ----------------------------
@ -346,9 +358,30 @@ CREATE TABLE `oa_admin_group` (
-- ----------------------------
-- Records of cms_admin_group
-- ----------------------------
INSERT INTO `oa_admin_group` VALUES (1, '超级员工权限', 1, '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160', '超级员工权限,拥有系统的最高权限,不可修改。', 0, 0);
INSERT INTO `oa_admin_group` VALUES (2, '总经理权限', 1, '2,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,3,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,4,80,81,82,83,84,85,86,87,88,89,5,90,91,92,93,6,94,95,96,97,98,99,7,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,8,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160', '总经理的管理权限,可根据公司的具体需求调整。', 0, 0);
INSERT INTO `oa_admin_group` VALUES (3, '普通员工权限', 1, '4,80,81,82,83,84,85,86,87,88,89,5,90,93,6,94,95,96,97,98,99,7,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,8,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,156,157,158,159,160', '普通员工管理权限,可根据公司的具体需求调整。', 0, 0);
INSERT INTO `oa_admin_group` VALUES (1, '超级员工权限', 1, '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170', '超级员工权限,拥有系统的最高权限,不可修改。', 0, 0);
INSERT INTO `oa_admin_group` VALUES (2, '总经理权限', 1, '2,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,3,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,4,80,81,82,83,84,85,86,87,88,89,5,90,91,92,93,6,94,95,96,97,98,99,7,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,8,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,162,163,164,165,166,167,168,169,170', '总经理的管理权限,可根据公司的具体需求调整。', 0, 0);
INSERT INTO `oa_admin_group` VALUES (3, '普通员工权限', 1, '4,80,81,82,83,84,85,86,87,88,89,5,90,93,6,94,95,96,97,98,99,7,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,8,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,166,167,168,169,170', '普通员工管理权限,可根据公司的具体需求调整。', 0, 0);
-- ----------------------------
-- Table structure for oa_data_auth
-- ----------------------------
DROP TABLE IF EXISTS `oa_data_auth`;
CREATE TABLE `oa_data_auth` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '权限名称',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '权限标识唯一,字母',
`desc` text NULL COMMENT '备注描述',
`module` varchar(255) NOT NULL DEFAULT '' COMMENT '所属模块,唯一,字母',
`uids` text NULL COMMENT '权限用户1,2,3',
`create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '数据权限表';
-- ----------------------------
-- Records of oa_data_auth
-- ----------------------------
INSERT INTO `oa_data_auth` VALUES (1, '合同管理员','contract_admin','拥有该权限的员工可以查看、编辑、审核、作废、中止所有合同。', 'contract', '', 1656143065, 0);
-- ----------------------------
-- Table structure for oa_config
@ -1160,6 +1193,110 @@ CREATE TABLE `oa_work_record` (
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '汇报工作发送记录表';
-- ----------------------------
-- Table structure for oa_contract_cate
-- ----------------------------
DROP TABLE IF EXISTS `oa_contract_cate`;
CREATE TABLE `oa_contract_cate` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL DEFAULT '' COMMENT '合同类别名称',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:-1删除 0禁用 1启用',
`create_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '合同类别';
-- ----------------------------
-- Records of oa_contract_cate
-- ----------------------------
INSERT INTO `oa_contract_cate` VALUES (1, '销售合同', 1, 1637987189, 0);
INSERT INTO `oa_contract_cate` VALUES (2, '采购合同', 1, 1637987199, 0);
INSERT INTO `oa_contract_cate` VALUES (3, '租赁合同', 1, 1637987199, 0);
INSERT INTO `oa_contract_cate` VALUES (4, '委托协议', 1, 1637987199, 0);
INSERT INTO `oa_contract_cate` VALUES (5, '代理协议', 1, 1637987199, 0);
INSERT INTO `oa_contract_cate` VALUES (6, '其他合同', 1, 1637987199, 0);
-- ----------------------------
-- Table structure for oa_contract
-- ----------------------------
DROP TABLE IF EXISTS `oa_contract`;
CREATE TABLE `oa_contract` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`pid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父协议id',
`code` varchar(255) NOT NULL DEFAULT '' COMMENT '合同编号',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '合同名称',
`cate_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类id',
`type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '合同性质0未设置,1普通合同、2框架合同、3补充协议、4其他合同',
`subject_id` varchar(255) NOT NULL DEFAULT '' COMMENT '签约主体',
`customer_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '客户ID,预设数据',
`customer` varchar(255) NOT NULL DEFAULT '' COMMENT '客户名称',
`customer_name` varchar(255) NOT NULL DEFAULT '' COMMENT '客户代表',
`customer_mobile` varchar(255) NOT NULL DEFAULT '' COMMENT '客户电话',
`customer_address` varchar(255) NOT NULL DEFAULT '' COMMENT '客户地址',
`start_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同开始时间',
`end_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同结束时间',
`admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
`prepared_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同制定人',
`sign_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同签订人',
`keeper_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同保管人',
`share_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '共享人员,如:1,2,3',
`sign_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同签订时间',
`sign_did` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '合同签订部门',
`cost` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '合同金额',
`is_tax` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否含税0未含税,1含税',
`tax` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '税点',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '合同状态0未设置,1已录入,2待审核,3已审核,4意外中止,5已作废',
`check_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核人',
`check_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核时间',
`check_remark` text NULL COMMENT '审核备注信息',
`stop_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '中止人',
`stop_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '中止时间',
`stop_remark` text NULL COMMENT '中止备注信息',
`void_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '作废人',
`void_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '作废时间',
`void_remark` text NULL COMMENT '作废备注信息',
`archive_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '归档状态0未归档,1已归档',
`archive_uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '归档人',
`archive_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '归档时间',
`remark` text NULL COMMENT '备注信息',
`create_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间',
`update_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
`delete_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '合同表';
-- ----------------------------
-- Table structure for oa_contract_file
-- ----------------------------
DROP TABLE IF EXISTS `oa_contract_file`;
CREATE TABLE `oa_contract_file` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`contract_id` int(11) UNSIGNED NOT NULL COMMENT '关联合同id',
`file_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '相关联附件id',
`admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人',
`create_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间',
`delete_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '合同附件关联表';
-- ----------------------------
-- Table structure for oa_contract_log
-- ----------------------------
DROP TABLE IF EXISTS `oa_contract_log`;
CREATE TABLE `oa_contract_log` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`action` varchar(100) NOT NULL DEFAULT 'edit' COMMENT '动作:add,edit,del,check,upload',
`field` varchar(100) NOT NULL DEFAULT '' COMMENT '字段',
`contract_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联合同id',
`admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作人',
`old_content` text NULL COMMENT '修改前的内容',
`new_content` text NULL COMMENT '修改后的内容',
`remark` text NULL COMMENT '补充备注',
`create_time` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '合同操作记录表';
-- ----------------------------
-- Table structure for oa_project
@ -1353,4 +1490,4 @@ CREATE TABLE `oa_article_keywords` (
INSERT INTO `oa_article_keywords` VALUES (1, 1, 1, 1, 1638093082);
INSERT INTO `oa_article_keywords` VALUES (2, 2, 2, 1, 1638093082);
INSERT INTO `oa_article_keywords` VALUES (3, 3, 3, 3, 1638093082);
INSERT INTO `oa_article_keywords` VALUES (4, 4, 4, 4, 1638093082);
INSERT INTO `oa_article_keywords` VALUES (4, 4, 4, 4, 1638093082);

View File

@ -208,7 +208,7 @@
var uploadInst = upload.render({
elem: "#test1",
url: "/api/index/upload",
done: function (e) {
done: function (res) {
layer.msg(res.msg);
if (res.code == 0) {
//上传成功

View File

@ -72,11 +72,11 @@
var uploadInst = upload.render({
elem: '#test1',
url: "/api/index/upload",
done: function (e) {
done: function (res) {
layer.msg(res.msg);
if (res.code == 0) {
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 input').attr('value', res.data.filepath);
$('#demo1 img').attr('src', res.data.filepath);
}
}
@ -91,7 +91,7 @@
success: function (e) {
if (e.code == 0) {
layer.confirm('保存成功,关闭本页面吗?', { icon: 3, title: '提示' }, function (index) {
parent.layui.tool.close();
parent.layui.tool.tabClose();
layer.close(index);
});
} else {

View File

@ -15,10 +15,10 @@ if (empty(file_exists(__DIR__ . '/../vendor/autoload.php'))) {
require __DIR__ . '/../vendor/autoload.php';
// 定义当前版本号
define('CMS_VERSION','3.6.27');
define('CMS_VERSION','3.7.01');
// 定义Layui版本号
define('LAYUI_VERSION','2.7.1');
define('LAYUI_VERSION','2.7.2');
// 定义项目目录
define('CMS_ROOT', __DIR__ . '/../');

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long