first commit
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
use think\facade\Db;
|
||||
|
||||
//销售合同性质
|
||||
function get_contract_types($check_status=0)
|
||||
{
|
||||
$contract_types_array = [
|
||||
["id"=>1,"title"=>"普通合同"],
|
||||
["id"=>2,"title"=>"产品合同"],
|
||||
["id"=>3,"title"=>"服务合同"]
|
||||
];
|
||||
return $contract_types_array;
|
||||
}
|
||||
|
||||
//根据销售合同性质读取销售合同性质名称
|
||||
function contract_types_name($types=1)
|
||||
{
|
||||
$contract_types_array = get_contract_types();
|
||||
return $contract_types_array[$types-1];
|
||||
}
|
||||
|
||||
//采购合同性质
|
||||
function get_purchase_types($check_status=0)
|
||||
{
|
||||
$purchase_types_array = [
|
||||
["id"=>1,"title"=>"普通采购"],
|
||||
["id"=>2,"title"=>"物品采购"],
|
||||
["id"=>3,"title"=>"服务采购"]
|
||||
];
|
||||
return $purchase_types_array;
|
||||
}
|
||||
|
||||
//根据采购合同性质读取采购合同性质名称
|
||||
function purchase_types_name($types=1)
|
||||
{
|
||||
$purchase_types_array = get_purchase_types();
|
||||
return $purchase_types_array[$types-1];
|
||||
}
|
||||
@@ -0,0 +1,376 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
declare (strict_types = 1);
|
||||
namespace app\contract\controller;
|
||||
|
||||
use app\api\BaseController;
|
||||
use app\contract\model\Contract;
|
||||
use app\contract\model\Purchase;
|
||||
use app\contract\model\SupplierContact;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Api extends BaseController
|
||||
{
|
||||
//获取销售合同协议
|
||||
public function get_contract()
|
||||
{
|
||||
$param = get_params();
|
||||
$uid = $this->uid;
|
||||
$where = array();
|
||||
$whereOr = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['delete_time', '=', 0];
|
||||
$where[] = ['check_status', '=', 2];
|
||||
//是否是合同管理员
|
||||
$auth = isAuth($uid,'contract_admin','conf_1');
|
||||
if($auth == 0){
|
||||
$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
$dids_a = get_leader_departments($uid);
|
||||
$dids_b = get_role_departments($uid);
|
||||
$dids = array_merge($dids_a, $dids_b);
|
||||
if(!empty($dids)){
|
||||
$whereOr[] = ['did','in',$dids];
|
||||
}
|
||||
}
|
||||
$model = new Contract();
|
||||
$list = $model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
|
||||
//销售合同归档操作
|
||||
public function contract_archive()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
$tips='操作成功,合同已转入到归档合同列表';
|
||||
if($param['archive_status'] == 1){
|
||||
$param['archive_uid'] = $this->uid;
|
||||
$param['archive_time'] = time();
|
||||
}
|
||||
else{
|
||||
$param['archive_uid'] = 0;
|
||||
$param['archive_time'] = 0;
|
||||
$tips='操作成功,合同已从归档合同列表转出';
|
||||
}
|
||||
if (Db::name('Contract')->strict(false)->update($param) !== false) {
|
||||
return to_assign(0, $tips);
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
//销售合同中止等操作
|
||||
public function contract_stop()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
$tips='操作成功,合同已转入到中止合同列表';
|
||||
if($param['stop_status'] == 1){
|
||||
$param['stop_uid'] = $this->uid;
|
||||
$param['stop_time'] = time();
|
||||
}
|
||||
else{
|
||||
$param['stop_uid'] = 0;
|
||||
$param['stop_time'] = 0;
|
||||
$tips='操作成功,合同已从中止合同列表转出';
|
||||
}
|
||||
if (Db::name('Contract')->strict(false)->update($param) !== false) {
|
||||
return to_assign(0, $tips);
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
//销售合同作废等操作
|
||||
public function contract_tovoid()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
$tips='操作成功,合同已转入到作废合同列表';
|
||||
if($param['void_status'] == 1){
|
||||
$param['void_uid'] = $this->uid;
|
||||
$param['void_time'] = time();
|
||||
}
|
||||
else{
|
||||
$param['void_uid'] = 0;
|
||||
$param['void_time'] = 0;
|
||||
$tips='操作成功,合同已从作废合同列表转出';
|
||||
}
|
||||
if (Db::name('Contract')->strict(false)->update($param) !== false) {
|
||||
return to_assign(0, $tips);
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
//获取产品分类数据
|
||||
public function get_productcate_tree()
|
||||
{
|
||||
$cate = get_base_data('ProductCate');
|
||||
$list = get_tree($cate, 0, 2);
|
||||
$data['trees'] = $list;
|
||||
return json($data);
|
||||
}
|
||||
|
||||
//获取销售产品列表
|
||||
public function get_product()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['delete_time', '=', 0];
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$list = Db::name('Product')->field('id,title,sale_price,purchase_price,base_price,unit,specs')->order('id asc')->where($where)->paginate(['list_rows'=> $rows]);
|
||||
table_assign(0, '', $list);
|
||||
}
|
||||
|
||||
//更新合同电子文件
|
||||
public function contract_seal_ids()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
if (Db::name('Contract')->strict(false)->update($param) !== false) {
|
||||
return to_assign();
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
-------------------------------------------------分割线---------------------------------------------------------
|
||||
*/
|
||||
//获取采购合同协议
|
||||
public function get_purchase()
|
||||
{
|
||||
$param = get_params();
|
||||
$uid = $this->uid;
|
||||
$where = array();
|
||||
$whereOr = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['delete_time', '=', 0];
|
||||
$where[] = ['check_status', '=', 2];
|
||||
$auth = isAuth($uid,'contract_admin','conf_1');
|
||||
if($auth == 0){
|
||||
$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
$dids_a = get_leader_departments($uid);
|
||||
$dids_b = get_role_departments($uid);
|
||||
$dids = array_merge($dids_a, $dids_b);
|
||||
if(!empty($dids)){
|
||||
$whereOr[] = ['did','in',$dids];
|
||||
}
|
||||
}
|
||||
$model = new Purchase();
|
||||
$list = $model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
|
||||
//采购合同归档操作
|
||||
public function purchase_archive()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
$tips='操作成功,合同已转入到归档合同列表';
|
||||
if($param['archive_status'] == 1){
|
||||
$param['archive_uid'] = $this->uid;
|
||||
$param['archive_time'] = time();
|
||||
}
|
||||
else{
|
||||
$param['archive_uid'] = 0;
|
||||
$param['archive_time'] = 0;
|
||||
$tips='操作成功,合同已从归档合同列表转出';
|
||||
}
|
||||
if (Db::name('Purchase')->strict(false)->update($param) !== false) {
|
||||
return to_assign(0, $tips);
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
//采购合同中止等操作
|
||||
public function purchase_stop()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
$tips='操作成功,合同已转入到中止合同列表';
|
||||
if($param['stop_status'] == 1){
|
||||
$param['stop_uid'] = $this->uid;
|
||||
$param['stop_time'] = time();
|
||||
}
|
||||
else{
|
||||
$param['stop_uid'] = 0;
|
||||
$param['stop_time'] = 0;
|
||||
$tips='操作成功,合同已从中止合同列表转出';
|
||||
}
|
||||
if (Db::name('Purchase')->strict(false)->update($param) !== false) {
|
||||
return to_assign(0, $tips);
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
//采购合同作废等操作
|
||||
public function purchase_tovoid()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
$tips='操作成功,合同已转入到作废合同列表';
|
||||
if($param['void_status'] == 1){
|
||||
$param['void_uid'] = $this->uid;
|
||||
$param['void_time'] = time();
|
||||
}
|
||||
else{
|
||||
$param['void_uid'] = 0;
|
||||
$param['void_time'] = 0;
|
||||
$tips='操作成功,合同已从作废合同列表转出';
|
||||
}
|
||||
if (Db::name('Purchase')->strict(false)->update($param) !== false) {
|
||||
return to_assign(0, $tips);
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
//获取采购品分类数据
|
||||
public function get_purchasedcate_tree()
|
||||
{
|
||||
$cate = get_base_data('PurchasedCate');
|
||||
$list = get_tree($cate, 0, 2);
|
||||
$data['trees'] = $list;
|
||||
return json($data);
|
||||
}
|
||||
|
||||
//获取供应商列表
|
||||
public function get_supplier()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['delete_time', '=', 0];
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$list = Db::name('Supplier')->field('id,title,address')->order('id asc')->where($where)->paginate(['list_rows'=> $rows])->each(function($item, $key){
|
||||
$contact = Db::name('SupplierContact')->where(['sid'=>$item['id'],'is_default'=>1])->find();
|
||||
if(!empty($contact)){
|
||||
$item['contact_name'] = $contact['name'];
|
||||
$item['contact_mobile'] = $contact['mobile'];
|
||||
}
|
||||
else{
|
||||
$item['contact_name'] = '';
|
||||
$item['contact_mobile'] = '';
|
||||
}
|
||||
return $item;
|
||||
});
|
||||
table_assign(0, '', $list);
|
||||
}
|
||||
|
||||
//获取采购物品列表
|
||||
public function get_purchased()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['delete_time', '=', 0];
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$list = Db::name('Purchased')->field('id,title,purchase_price,sale_price,unit,specs')->order('id asc')->where($where)->paginate(['list_rows'=> $rows]);
|
||||
table_assign(0, '', $list);
|
||||
}
|
||||
|
||||
//获取供应商联系人数据
|
||||
public function get_supplier_contact()
|
||||
{
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
$where[] = ['delete_time', '=', 0];
|
||||
$where[] = ['sid', '=', $param['supplier_id']];
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$content = SupplierContact::where($where)
|
||||
->order('create_time desc')
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key) {
|
||||
$item->admin_name = Db::name('Admin')->where(['id' => $item->admin_id])->value('name');
|
||||
$item->create_time = date('Y-m-d H:i:s', (int) $item->create_time);
|
||||
});
|
||||
return table_assign(0, '', $content);
|
||||
}
|
||||
|
||||
//设置供应商联系人
|
||||
public function set_supplier_contact()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$detail= SupplierContact::where(['id' => $param['id']])->find();
|
||||
SupplierContact::where(['sid' => $detail['sid']])->strict(false)->field(true)->update(['is_default'=>0]);
|
||||
$res = SupplierContact::where(['id' => $param['id']])->update(['is_default'=>1]);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param,'供应商联系人');
|
||||
return to_assign();
|
||||
} else {
|
||||
return to_assign(1, '操作失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, '参数错误');
|
||||
}
|
||||
}
|
||||
|
||||
//更新合同电子文件
|
||||
public function purchase_seal_ids()
|
||||
{
|
||||
if (request()->isPost()) {
|
||||
$param = get_params();
|
||||
if (Db::name('Purchase')->strict(false)->update($param) !== false) {
|
||||
return to_assign();
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,141 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\contract\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\contract\model\ContractCate as ContractCateModel;
|
||||
use app\contract\validate\CateValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Cate extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new ContractCateModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$list = $this->model->where('delete_time',0)->select();
|
||||
return to_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加/编辑
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(CateValidate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
try {
|
||||
validate(CateValidate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getCateById($id);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$type = isset($param['type']) ? $param['type'] : 0;
|
||||
$this->model->delById($id,$type);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置
|
||||
*/
|
||||
public function set()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$res = $this->model->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, '操作失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,523 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\contract\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\contract\model\Contract as ContractModel;
|
||||
use app\contract\validate\ContractValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Contract extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new ContractModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$tab = isset($param['tab']) ? $param['tab'] : 0;
|
||||
$uid = $this->uid;
|
||||
$where = [];
|
||||
$whereOr = [];
|
||||
$where[]=['delete_time','=',0];
|
||||
$where[]=['archive_time','=',0];
|
||||
$where[]=['stop_time','=',0];
|
||||
$where[]=['void_time','=',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['types'])) {
|
||||
$where[] = ['types', '=',$param['types']];
|
||||
}
|
||||
if (!empty($param['cate_id'])) {
|
||||
$where[] = ['cate_id', '=',$param['cate_id']];
|
||||
}
|
||||
if (isset($param['check_status']) && $param['check_status']!='') {
|
||||
$where[] = ['check_status', '=',$param['check_status']];
|
||||
}
|
||||
if (!empty($param['sign_time'])) {
|
||||
$sign_time =explode('~', $param['sign_time']);
|
||||
$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
|
||||
}
|
||||
if (!empty($param['end_time'])) {
|
||||
$end_time =explode('~', $param['end_time']);
|
||||
$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
|
||||
}
|
||||
if($tab == 0){
|
||||
if (!empty($param['uid'])) {
|
||||
$where[] = ['sign_uid', '=', $param['uid']];
|
||||
}
|
||||
else{
|
||||
//是否是合同管理员
|
||||
$auth = isAuth($uid,'contract_admin','conf_1');
|
||||
if($auth == 0){
|
||||
$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
$dids_a = get_leader_departments($uid);
|
||||
$dids_b = get_role_departments($uid);
|
||||
$dids = array_merge($dids_a, $dids_b);
|
||||
if(!empty($dids)){
|
||||
$whereOr[] = ['did','in',$dids];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if($tab == 1){
|
||||
$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
}
|
||||
if($tab == 2){
|
||||
$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
}
|
||||
$list = $this->model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
View::assign('is_leader', isLeader($this->uid));
|
||||
View::assign('is_auth', isAuth($this->uid,'contract_admin','conf_1'));
|
||||
View::assign('delay_num', valueAuth('contract_admin','conf_10'));
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
public function archivelist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$uid = $this->uid;
|
||||
$where = [];
|
||||
$whereOr = [];
|
||||
$where[]=['delete_time','=',0];
|
||||
$where[]=['archive_time','>',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['types'])) {
|
||||
$where[] = ['types', '=',$param['types']];
|
||||
}
|
||||
if (!empty($param['cate_id'])) {
|
||||
$where[] = ['cate_id', '=',$param['cate_id']];
|
||||
}
|
||||
if (!empty($param['sign_time'])) {
|
||||
$sign_time =explode('~', $param['sign_time']);
|
||||
$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
|
||||
}
|
||||
if (!empty($param['end_time'])) {
|
||||
$end_time =explode('~', $param['end_time']);
|
||||
$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
|
||||
}
|
||||
//是否是合同管理员
|
||||
$auth = isAuth($uid,'contract_admin','conf_1');
|
||||
if($auth == 0){
|
||||
$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
$dids_a = get_leader_departments($uid);
|
||||
$dids_b = get_role_departments($uid);
|
||||
$dids = array_merge($dids_a, $dids_b);
|
||||
if(!empty($dids)){
|
||||
$whereOr[] = ['did','in',$dids];
|
||||
}
|
||||
}
|
||||
$list = $this->model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
View::assign('delay_num', valueAuth('contract_admin','conf_10'));
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
public function stoplist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$uid = $this->uid;
|
||||
$where = [];
|
||||
$whereOr = [];
|
||||
$where[]=['delete_time','=',0];
|
||||
$where[]=['stop_time','>',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['types'])) {
|
||||
$where[] = ['types', '=',$param['types']];
|
||||
}
|
||||
if (!empty($param['cate_id'])) {
|
||||
$where[] = ['cate_id', '=',$param['cate_id']];
|
||||
}
|
||||
if (!empty($param['sign_time'])) {
|
||||
$sign_time =explode('~', $param['sign_time']);
|
||||
$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
|
||||
}
|
||||
if (!empty($param['end_time'])) {
|
||||
$end_time =explode('~', $param['end_time']);
|
||||
$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
|
||||
}
|
||||
//是否是合同管理员
|
||||
$auth = isAuth($uid,'contract_admin','conf_1');
|
||||
if($auth == 0){
|
||||
$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
$dids_a = get_leader_departments($uid);
|
||||
$dids_b = get_role_departments($uid);
|
||||
$dids = array_merge($dids_a, $dids_b);
|
||||
if(!empty($dids)){
|
||||
$whereOr[] = ['did','in',$dids];
|
||||
}
|
||||
}
|
||||
$list = $this->model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
public function voidlist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$uid = $this->uid;
|
||||
$where = [];
|
||||
$whereOr = [];
|
||||
$where[]=['delete_time','=',0];
|
||||
$where[]=['void_time','>',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['types'])) {
|
||||
$where[] = ['types', '=',$param['types']];
|
||||
}
|
||||
if (!empty($param['cate_id'])) {
|
||||
$where[] = ['cate_id', '=',$param['cate_id']];
|
||||
}
|
||||
if (!empty($param['sign_time'])) {
|
||||
$sign_time =explode('~', $param['sign_time']);
|
||||
$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
|
||||
}
|
||||
if (!empty($param['end_time'])) {
|
||||
$end_time =explode('~', $param['end_time']);
|
||||
$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
|
||||
}
|
||||
//是否是合同管理员
|
||||
$auth = isAuth($uid,'contract_admin','conf_1');
|
||||
if($auth == 0){
|
||||
$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
$dids_a = get_leader_departments($uid);
|
||||
$dids_b = get_role_departments($uid);
|
||||
$dids = array_merge($dids_a, $dids_b);
|
||||
if(!empty($dids)){
|
||||
$whereOr[] = ['did','in',$dids];
|
||||
}
|
||||
}
|
||||
$list = $this->model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
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($param['scene'] == 'add' || $param['scene'] == 'edit'){
|
||||
$param['content'] = serialize([]);
|
||||
if($param['types']==2){
|
||||
$product_title_data = isset($param['product_title']) ? $param['product_title'] : '';
|
||||
$product_id_data = isset($param['product_id']) ? $param['product_id'] : 0;
|
||||
$product_unit_data = isset($param['product_unit']) ? $param['product_unit'] : '';
|
||||
$product_specs_data = isset($param['product_specs']) ? $param['product_specs'] : '';
|
||||
$product_price_data = isset($param['product_price']) ? $param['product_price'] : '0.00';
|
||||
$product_num_data = isset($param['product_num']) ? $param['product_num'] : 1;
|
||||
$product_subtotal_data = isset($param['product_subtotal']) ? $param['product_subtotal'] : '0.00';
|
||||
$product_remark_data = isset($param['product_remark']) ? $param['product_remark'] : '';
|
||||
$product = [];
|
||||
if(!empty($product_title_data)){
|
||||
foreach ($product_title_data as $key => $value) {
|
||||
if (!$value) {
|
||||
continue;
|
||||
}
|
||||
$data = [];
|
||||
$data['product_title'] = $product_title_data[$key];
|
||||
$data['product_id'] = $product_id_data[$key];
|
||||
$data['product_unit'] = $product_unit_data[$key];
|
||||
$data['product_specs'] = $product_specs_data[$key];
|
||||
$data['product_price'] = $product_price_data[$key];
|
||||
$data['product_num'] = $product_num_data[$key];
|
||||
$data['product_subtotal'] = $product_subtotal_data[$key];
|
||||
$data['product_remark'] = $product_remark_data[$key];
|
||||
$product[]=$data;
|
||||
}
|
||||
}
|
||||
$param['content'] = serialize($product);
|
||||
}
|
||||
if($param['types']==3){
|
||||
$service_title_data = isset($param['service_title']) ? $param['service_title'] : '';
|
||||
$service_id_data = isset($param['service_id']) ? $param['service_id'] : 0;
|
||||
$service_time_a_data = isset($param['service_time_a']) ? $param['service_time_a'] : '';
|
||||
$service_time_b_data = isset($param['service_time_b']) ? $param['service_time_b'] : '';
|
||||
$service_date_data = isset($param['service_date']) ? $param['service_date'] : '';
|
||||
$service_price_data = isset($param['service_price']) ? $param['service_price'] : '0.00';
|
||||
$service_num_data = isset($param['service_num']) ? $param['service_num'] : 1;
|
||||
$service_subtotal_data = isset($param['service_subtotal']) ? $param['service_subtotal'] : '0.00';
|
||||
$service_remark_data = isset($param['service_remark']) ? $param['service_remark'] : '';
|
||||
$service = [];
|
||||
if(!empty($service_title_data)){
|
||||
foreach ($service_title_data as $key => $value) {
|
||||
if (!$value) {
|
||||
continue;
|
||||
}
|
||||
$data = [];
|
||||
$data['service_title'] = $service_title_data[$key];
|
||||
$data['service_id'] = $service_id_data[$key];
|
||||
if(!empty($service_time_a_data)){
|
||||
$data['service_date'] = $service_time_a_data[$key].'到'.$service_time_b_data[$key];
|
||||
}
|
||||
else{
|
||||
$data['service_date'] = $service_date_data[$key];
|
||||
}
|
||||
$data['service_price'] = $service_price_data[$key];
|
||||
$data['service_num'] = $service_num_data[$key];
|
||||
$data['service_subtotal'] = $service_subtotal_data[$key];
|
||||
$data['service_remark'] = $service_remark_data[$key];
|
||||
$service[]=$data;
|
||||
}
|
||||
}
|
||||
$param['content'] = serialize($service);
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(ContractValidate::class)->scene($param['scene'])->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
if(isset($param['chance_id']) && $param['chance_id']>0){
|
||||
$has_chance = Db::name('Contract')->where([['chance_id','=',$param['chance_id']],['delete_time','=',0],['id','<>',$param['id']]])->count();
|
||||
if($has_chance>0){
|
||||
return to_assign(1, '所选的机会线索已关联有销售合同,不支持关联多合同');
|
||||
}
|
||||
}
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
try {
|
||||
validate(ContractValidate::class)->scene($param['scene'])->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
if($param['chance_id']>0){
|
||||
$has_chance = Db::name('Contract')->where(['chance_id'=>$param['chance_id'],'delete_time'=>0])->count();
|
||||
if($has_chance>0){
|
||||
return to_assign(1, '所选的机会线索已关联有销售合同,不支持关联多合同');
|
||||
}
|
||||
}
|
||||
$param['admin_id'] = $this->uid;
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$types = isset($param['types']) ? $param['types'] : 0;
|
||||
$is_customer = Db::name('DataAuth')->where('name','contract_admin')->value('conf_3');
|
||||
$is_codeno = Db::name('DataAuth')->where('name','contract_admin')->value('conf_2');
|
||||
$is_product = Db::name('DataAuth')->where('name','contract_admin')->value('conf_4');
|
||||
$is_service = Db::name('DataAuth')->where('name','contract_admin')->value('conf_5');
|
||||
View::assign('is_customer', $is_customer);
|
||||
View::assign('is_codeno', $is_codeno);
|
||||
View::assign('is_product', $is_product);
|
||||
View::assign('is_service', $is_service);
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
if($detail['check_status'] == 1 || $detail['check_status'] == 2 || $detail['check_status'] == 3){
|
||||
return view(EEEOR_REPORTING,['code'=>403,'warning'=>'当前状态不支持编辑']);
|
||||
}
|
||||
if($detail['types'] > 1){
|
||||
$content_array = unserialize($detail['content']);
|
||||
if($detail['types']==3){
|
||||
foreach ($content_array as $key => &$value) {
|
||||
if(!empty($value['service_date'])){
|
||||
$service_date = explode('到', $value['service_date']);
|
||||
$value['service_time_a'] = $service_date[0];
|
||||
$value['service_time_b'] = $service_date[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
$detail['content_array'] = $content_array;
|
||||
}
|
||||
View::assign('types', $detail['types']);
|
||||
View::assign('codeno', $detail['code']);
|
||||
View::assign('detail', $detail);
|
||||
if(is_mobile()){
|
||||
return view('qiye@/contract/contract_add');
|
||||
}
|
||||
return view('edit');
|
||||
}
|
||||
$codeno='';
|
||||
if($is_codeno==1){
|
||||
$codeno = get_codeno(1);
|
||||
}
|
||||
View::assign('codeno', $codeno);
|
||||
View::assign('id', $id);
|
||||
View::assign('types', $types);
|
||||
if($types == 0){
|
||||
return view('add_types');
|
||||
}
|
||||
if(is_mobile()){
|
||||
return view('qiye@/contract/contract_add');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
if($detail['types'] > 1){
|
||||
$content_array = unserialize($detail['content']);
|
||||
if($detail['types']==3){
|
||||
foreach ($content_array as $key => &$value) {
|
||||
if(!empty($value['service_date'])){
|
||||
$service_date = explode('到', $value['service_date']);
|
||||
$value['service_time_a'] = $service_date[0];
|
||||
$value['service_time_b'] = $service_date[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
$detail['content_array'] = $content_array;
|
||||
}
|
||||
$detail['status_name'] = check_status_name($detail['check_status']);
|
||||
$detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title');
|
||||
$detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title');
|
||||
//归档信息
|
||||
if($detail['archive_uid'] > 0){
|
||||
$detail['archive_name'] = Db::name('Admin')->where(['id' => $detail['archive_uid']])->value('name');
|
||||
}
|
||||
//中止信息
|
||||
if($detail['stop_uid'] > 0){
|
||||
$detail['stop_name'] = Db::name('Admin')->where(['id' => $detail['stop_uid']])->value('name');
|
||||
}
|
||||
//作废信息
|
||||
if($detail['void_uid'] > 0){
|
||||
$detail['void_name'] = Db::name('Admin')->where(['id' => $detail['void_uid']])->value('name');
|
||||
}
|
||||
|
||||
//开票和回款信息
|
||||
if($detail['check_status'] == 2){
|
||||
$detail['invoice'] = Db::name('Invoice')->field('i.*,a.name as admin')
|
||||
->alias('i')
|
||||
->join('Admin a', 'a.id = i.admin_id', 'LEFT')
|
||||
->where([['i.contract_id','=',$id],['i.open_status','<',2],['i.invoice_type','>',0],['i.delete_time','=',0]])
|
||||
->order('i.create_time desc')
|
||||
->select();
|
||||
|
||||
$has_invoice = Db::name('invoice')->where([['contract_id','=',$id],['open_status','<',2],['invoice_type','>',0],['delete_time','=',0]])->sum('amount');
|
||||
$detail['has_invoice'] = sprintf("%.2f",$has_invoice);
|
||||
$detail['no_invoice'] = sprintf("%.2f",($detail['cost']*100 - $has_invoice*100)/100);
|
||||
|
||||
|
||||
$invoice_ids = Db::name('Invoice')->where([['contract_id','=',$id],['open_status','<',2],['delete_time','=',0]])->column('id');
|
||||
$detail['income'] = Db::name('InvoiceIncome')->field('i.*,a.name as admin')
|
||||
->alias('i')
|
||||
->join('Admin a', 'a.id = i.admin_id', 'LEFT')
|
||||
->where([['i.invoice_id','in',$invoice_ids],['i.status','=',1]])
|
||||
->order('i.enter_time desc')
|
||||
->select();
|
||||
|
||||
$has_income = Db::name('InvoiceIncome')->where([['invoice_id','in',$invoice_ids],['status','=',1]])->sum('amount');
|
||||
$detail['has_income'] = sprintf("%.2f",$has_income);
|
||||
$detail['no_income'] = sprintf("%.2f",($detail['cost']*100 - $has_income*100)/100);
|
||||
}
|
||||
|
||||
if($detail['seal_ids'] !=''){
|
||||
$file_array = Db::name('File')->where('id','in',$detail['seal_ids'])->select()->toArray();
|
||||
$detail['seal_array'] = $file_array;
|
||||
}
|
||||
else{
|
||||
$detail['seal_array'] = [];
|
||||
}
|
||||
|
||||
$auth = isAuth($this->uid,'contract_admin','conf_1');
|
||||
View::assign('detail', $detail);
|
||||
View::assign('auth', $auth);
|
||||
if(is_mobile()){
|
||||
return view('qiye@/contract/contract_view');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if (request()->isDelete()) {
|
||||
$this->model->delById($id);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\contract\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\contract\model\Product as ProductModel;
|
||||
use app\contract\validate\ProductValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Product extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new ProductModel();
|
||||
}
|
||||
|
||||
public function datalist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = [];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['p.title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (isset($param['status']) && $param['status']!='') {
|
||||
$where[] = ['p.status', '=', $param['status']];
|
||||
}
|
||||
if (!empty($param['cate_id'])) {
|
||||
$cate_id_array = get_cate_son('ProductCate',$param['cate_id']);
|
||||
$where[] = ['p.cate_id', 'in', $cate_id_array];
|
||||
}
|
||||
$where[] = ['p.delete_time', '=', 0];
|
||||
$list = $this->model->datalist($where, $param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
//新建编辑
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$param['sale_price'] = empty($param['sale_price'])?0:$param['sale_price'];
|
||||
$param['base_price'] = empty($param['base_price'])?0:$param['base_price'];
|
||||
$param['purchase_price'] = empty($param['purchase_price'])?0:$param['purchase_price'];
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(ProductValidate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
try {
|
||||
validate(ProductValidate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['admin_id'] = $this->uid;
|
||||
$this->model->add($param);
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if($id>0){
|
||||
$detail = $this->model->getById($id);
|
||||
if($detail['file_ids'] !=''){
|
||||
$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
|
||||
$detail['file_array'] = $file_array;
|
||||
}
|
||||
View::assign('detail', $detail);
|
||||
return view('edit');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$detail = $this->model->getById($id);
|
||||
if($detail['cate_id']>0){
|
||||
$detail['cate'] = Db::name('ProductCate')->where('id',$detail['cate_id'])->value('title');
|
||||
}
|
||||
if($detail['file_ids'] !=''){
|
||||
$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
|
||||
$detail['file_array'] = $file_array;
|
||||
}
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
|
||||
//设置
|
||||
public function set()
|
||||
{
|
||||
$param = get_params();
|
||||
$res = $this->model->strict(false)->field('id,status')->update($param);
|
||||
if ($res) {
|
||||
add_log('set', $param['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(0, '操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if (request()->isDelete()) {
|
||||
$this->model->delById($id);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\contract\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\contract\validate\ProductCateValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Productcate extends BaseController
|
||||
{
|
||||
//类别
|
||||
public function datalist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$cate = Db::name('ProductCate')->order('create_time asc')->select();
|
||||
$list = generateTree($cate);
|
||||
return to_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//分类添加&编辑
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(ProductCateValidate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$note_array = get_cate_son('ProductCate',$param['id']);
|
||||
if (in_array($param['pid'], $note_array)) {
|
||||
return to_assign(1, '父级分类不能是该分类本身或其子分类');
|
||||
} else {
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('ProductCate')->strict(false)->field(true)->update($param);
|
||||
if($res){
|
||||
add_log('edit', $param['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
validate(ProductCateValidate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('ProductCate')->strict(false)->field(true)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$pid = isset($param['pid']) ? $param['pid'] : 0;
|
||||
$cate = Db::name('ProductCate')->order('id desc')->select()->toArray();
|
||||
$cates = set_recursion($cate);
|
||||
if ($id > 0) {
|
||||
$detail = Db::name('ProductCate')->where(['id' => $id])->find();
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('pid', $pid);
|
||||
View::assign('cates', $cates);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除分类
|
||||
public function del()
|
||||
{
|
||||
$id = get_params("id");
|
||||
$cate_count = Db::name('ProductCate')->where(["pid" => $id])->count();
|
||||
if ($cate_count > 0) {
|
||||
return to_assign(1, "该分类下还有子分类,无法删除");
|
||||
}
|
||||
$product_count = Db::name('Product')->where(["cate_id" => $id,'delete_time'=>0])->count();
|
||||
if ($product_count > 0) {
|
||||
return to_assign(1, "该分类下还有产品,无法删除");
|
||||
}
|
||||
if (Db::name('ProductCate')->delete($id) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(0, "删除分类成功");
|
||||
} else {
|
||||
return to_assign(1, "删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,504 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\contract\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\contract\model\Purchase as PurchaseModel;
|
||||
use app\contract\validate\PurchaseValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Purchase extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new PurchaseModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$tab = isset($param['tab']) ? $param['tab'] : 0;
|
||||
$uid = $this->uid;
|
||||
$where = [];
|
||||
$whereOr = [];
|
||||
$where[]=['delete_time','=',0];
|
||||
$where[]=['archive_time','=',0];
|
||||
$where[]=['stop_time','=',0];
|
||||
$where[]=['void_time','=',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['types'])) {
|
||||
$where[] = ['types', '=',$param['types']];
|
||||
}
|
||||
if (!empty($param['cate_id'])) {
|
||||
$where[] = ['cate_id', '=',$param['cate_id']];
|
||||
}
|
||||
if (isset($param['check_status']) && $param['check_status']!='') {
|
||||
$where[] = ['check_status', '=',$param['check_status']];
|
||||
}
|
||||
if (!empty($param['sign_time'])) {
|
||||
$sign_time =explode('~', $param['sign_time']);
|
||||
$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
|
||||
}
|
||||
if (!empty($param['end_time'])) {
|
||||
$end_time =explode('~', $param['end_time']);
|
||||
$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
|
||||
}
|
||||
if($tab == 0){
|
||||
if (!empty($param['uid'])) {
|
||||
$where[] = ['sign_uid', '=', $param['uid']];
|
||||
}
|
||||
else{
|
||||
//是否是合同管理员
|
||||
$auth = isAuth($uid,'contract_admin','conf_1');
|
||||
if($auth == 0){
|
||||
$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
$dids_a = get_leader_departments($uid);
|
||||
$dids_b = get_role_departments($uid);
|
||||
$dids = array_merge($dids_a, $dids_b);
|
||||
if(!empty($dids)){
|
||||
$whereOr[] = ['did','in',$dids];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if($tab == 1){
|
||||
$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
}
|
||||
if($tab == 2){
|
||||
$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
}
|
||||
$list = $this->model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
View::assign('is_leader', isLeader($this->uid));
|
||||
View::assign('is_auth', isAuth($this->uid,'contract_admin','conf_1'));
|
||||
View::assign('delay_num', valueAuth('contract_admin','conf_10'));
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
public function archivelist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$uid = $this->uid;
|
||||
$where = [];
|
||||
$whereOr = [];
|
||||
$where[]=['delete_time','=',0];
|
||||
$where[]=['archive_time','>',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['types'])) {
|
||||
$where[] = ['types', '=',$param['types']];
|
||||
}
|
||||
if (!empty($param['cate_id'])) {
|
||||
$where[] = ['cate_id', '=',$param['cate_id']];
|
||||
}
|
||||
if (!empty($param['sign_time'])) {
|
||||
$sign_time =explode('~', $param['sign_time']);
|
||||
$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
|
||||
}
|
||||
if (!empty($param['end_time'])) {
|
||||
$end_time =explode('~', $param['end_time']);
|
||||
$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
|
||||
}
|
||||
//是否是合同管理员
|
||||
$auth = isAuth($uid,'contract_admin','conf_1');
|
||||
if($auth == 0){
|
||||
$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
$dids_a = get_leader_departments($uid);
|
||||
$dids_b = get_role_departments($uid);
|
||||
$dids = array_merge($dids_a, $dids_b);
|
||||
if(!empty($dids)){
|
||||
$whereOr[] = ['did','in',$dids];
|
||||
}
|
||||
}
|
||||
$list = $this->model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
View::assign('delay_num', valueAuth('contract_admin','conf_10'));
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
public function stoplist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$uid = $this->uid;
|
||||
$where = [];
|
||||
$whereOr = [];
|
||||
$where[]=['delete_time','=',0];
|
||||
$where[]=['stop_time','>',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['types'])) {
|
||||
$where[] = ['types', '=',$param['types']];
|
||||
}
|
||||
if (!empty($param['cate_id'])) {
|
||||
$where[] = ['cate_id', '=',$param['cate_id']];
|
||||
}
|
||||
if (!empty($param['sign_time'])) {
|
||||
$sign_time =explode('~', $param['sign_time']);
|
||||
$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
|
||||
}
|
||||
if (!empty($param['end_time'])) {
|
||||
$end_time =explode('~', $param['end_time']);
|
||||
$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
|
||||
}
|
||||
//是否是合同管理员
|
||||
$auth = isAuth($uid,'contract_admin','conf_1');
|
||||
if($auth == 0){
|
||||
$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
$dids_a = get_leader_departments($uid);
|
||||
$dids_b = get_role_departments($uid);
|
||||
$dids = array_merge($dids_a, $dids_b);
|
||||
if(!empty($dids)){
|
||||
$whereOr[] = ['did','in',$dids];
|
||||
}
|
||||
}
|
||||
$list = $this->model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
public function voidlist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$uid = $this->uid;
|
||||
$where = [];
|
||||
$whereOr = [];
|
||||
$where[]=['delete_time','=',0];
|
||||
$where[]=['void_time','>',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (!empty($param['types'])) {
|
||||
$where[] = ['types', '=',$param['types']];
|
||||
}
|
||||
if (!empty($param['cate_id'])) {
|
||||
$where[] = ['cate_id', '=',$param['cate_id']];
|
||||
}
|
||||
if (!empty($param['sign_time'])) {
|
||||
$sign_time =explode('~', $param['sign_time']);
|
||||
$where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]];
|
||||
}
|
||||
if (!empty($param['end_time'])) {
|
||||
$end_time =explode('~', $param['end_time']);
|
||||
$where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]];
|
||||
}
|
||||
//是否是合同管理员
|
||||
$auth = isAuth($uid,'contract_admin','conf_1');
|
||||
if($auth == 0){
|
||||
$whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
|
||||
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
|
||||
$dids_a = get_leader_departments($uid);
|
||||
$dids_b = get_role_departments($uid);
|
||||
$dids = array_merge($dids_a, $dids_b);
|
||||
if(!empty($dids)){
|
||||
$whereOr[] = ['did','in',$dids];
|
||||
}
|
||||
}
|
||||
$list = $this->model->datalist($param,$where,$whereOr);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
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($param['scene'] == 'add' || $param['scene'] == 'edit'){
|
||||
$param['content'] = serialize([]);
|
||||
if($param['types']==2){
|
||||
$purchased_title_data = isset($param['purchased_title']) ? $param['purchased_title'] : '';
|
||||
$purchased_id_data = isset($param['purchased_id']) ? $param['purchased_id'] : 0;
|
||||
$purchased_unit_data = isset($param['purchased_unit']) ? $param['purchased_unit'] : '';
|
||||
$purchased_specs_data = isset($param['purchased_specs']) ? $param['purchased_specs'] : '';
|
||||
$purchased_price_data = isset($param['purchased_price']) ? $param['purchased_price'] : '0.00';
|
||||
$purchased_num_data = isset($param['purchased_num']) ? $param['purchased_num'] : 1;
|
||||
$purchased_subtotal_data = isset($param['purchased_subtotal']) ? $param['purchased_subtotal'] : '0.00';
|
||||
$purchased_remark_data = isset($param['purchased_remark']) ? $param['purchased_remark'] : '';
|
||||
$purchased = [];
|
||||
if(!empty($purchased_title_data)){
|
||||
foreach ($purchased_title_data as $key => $value) {
|
||||
if (!$value) {
|
||||
continue;
|
||||
}
|
||||
$data = [];
|
||||
$data['purchased_title'] = $purchased_title_data[$key];
|
||||
$data['purchased_id'] = $purchased_id_data[$key];
|
||||
$data['purchased_unit'] = $purchased_unit_data[$key];
|
||||
$data['purchased_specs'] = $purchased_specs_data[$key];
|
||||
$data['purchased_price'] = $purchased_price_data[$key];
|
||||
$data['purchased_num'] = $purchased_num_data[$key];
|
||||
$data['purchased_subtotal'] = $purchased_subtotal_data[$key];
|
||||
$data['purchased_remark'] = $purchased_remark_data[$key];
|
||||
$purchased[]=$data;
|
||||
}
|
||||
}
|
||||
$param['content'] = serialize($purchased);
|
||||
}
|
||||
if($param['types']==3){
|
||||
$service_title_data = isset($param['service_title']) ? $param['service_title'] : '';
|
||||
$service_time_a_data = isset($param['service_time_a']) ? $param['service_time_a'] : '';
|
||||
$service_time_b_data = isset($param['service_time_b']) ? $param['service_time_b'] : '';
|
||||
$service_date_data = isset($param['service_date']) ? $param['service_date'] : '';
|
||||
$service_price_data = isset($param['service_price']) ? $param['service_price'] : '0.00';
|
||||
$service_num_data = isset($param['service_num']) ? $param['service_num'] : 1;
|
||||
$service_subtotal_data = isset($param['service_subtotal']) ? $param['service_subtotal'] : '0.00';
|
||||
$service_remark_data = isset($param['service_remark']) ? $param['service_remark'] : '';
|
||||
$service = [];
|
||||
if(!empty($service_title_data)){
|
||||
foreach ($service_title_data as $key => $value) {
|
||||
if (!$value) {
|
||||
continue;
|
||||
}
|
||||
$data = [];
|
||||
$data['service_title'] = $service_title_data[$key];
|
||||
if(!empty($service_time_a_data)){
|
||||
$data['service_date'] = $service_time_a_data[$key].'到'.$service_time_b_data[$key];
|
||||
}
|
||||
else{
|
||||
$data['service_date'] = $service_date_data[$key];
|
||||
}
|
||||
$data['service_price'] = $service_price_data[$key];
|
||||
$data['service_num'] = $service_num_data[$key];
|
||||
$data['service_subtotal'] = $service_subtotal_data[$key];
|
||||
$data['service_remark'] = $service_remark_data[$key];
|
||||
$service[]=$data;
|
||||
}
|
||||
}
|
||||
$param['content'] = serialize($service);
|
||||
}
|
||||
}
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(PurchaseValidate::class)->scene($param['scene'])->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
try {
|
||||
validate(PurchaseValidate::class)->scene($param['scene'])->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['admin_id'] = $this->uid;
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$types = isset($param['types']) ? $param['types'] : 0;
|
||||
$is_supplier = Db::name('DataAuth')->where('name','contract_admin')->value('conf_6');
|
||||
$is_codeno = Db::name('DataAuth')->where('name','contract_admin')->value('conf_2');
|
||||
$is_purchased = Db::name('DataAuth')->where('name','contract_admin')->value('conf_7');
|
||||
View::assign('is_supplier', $is_supplier);
|
||||
View::assign('is_codeno', $is_codeno);
|
||||
View::assign('is_purchased', $is_purchased);
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
if($detail['check_status'] == 1 || $detail['check_status'] == 2 || $detail['check_status'] == 3){
|
||||
return view(EEEOR_REPORTING,['code'=>403,'warning'=>'当前状态不支持编辑']);
|
||||
}
|
||||
if($detail['types'] > 1){
|
||||
$content_array = unserialize($detail['content']);
|
||||
if($detail['types']==3){
|
||||
foreach ($content_array as $key => &$value) {
|
||||
if(!empty($value['service_date'])){
|
||||
$service_date = explode('到', $value['service_date']);
|
||||
$value['service_time_a'] = $service_date[0];
|
||||
$value['service_time_b'] = $service_date[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
$detail['content_array'] = $content_array;
|
||||
}
|
||||
View::assign('types', $detail['types']);
|
||||
View::assign('codeno', $detail['code']);
|
||||
View::assign('detail', $detail);
|
||||
if(is_mobile()){
|
||||
return view('qiye@/contract/purchase_add');
|
||||
}
|
||||
return view('edit');
|
||||
}
|
||||
$codeno='';
|
||||
if($is_codeno==1){
|
||||
$codeno = get_codeno(2);
|
||||
}
|
||||
View::assign('codeno', $codeno);
|
||||
View::assign('id', $id);
|
||||
View::assign('types', $types);
|
||||
if($types == 0){
|
||||
return view('add_types');
|
||||
}
|
||||
if(is_mobile()){
|
||||
return view('qiye@/contract/purchase_add');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
if($detail['types'] > 1){
|
||||
$content_array = unserialize($detail['content']);
|
||||
if($detail['types']==3){
|
||||
foreach ($content_array as $key => &$value) {
|
||||
if(!empty($value['service_date'])){
|
||||
$service_date = explode('到', $value['service_date']);
|
||||
$value['service_time_a'] = $service_date[0];
|
||||
$value['service_time_b'] = $service_date[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
$detail['content_array'] = $content_array;
|
||||
}
|
||||
$detail['status_name'] = check_status_name($detail['check_status']);
|
||||
$detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title');
|
||||
$detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title');
|
||||
//归档信息
|
||||
if($detail['archive_uid'] > 0){
|
||||
$detail['archive_name'] = Db::name('Admin')->where(['id' => $detail['archive_uid']])->value('name');
|
||||
}
|
||||
//中止信息
|
||||
if($detail['stop_uid'] > 0){
|
||||
$detail['stop_name'] = Db::name('Admin')->where(['id' => $detail['stop_uid']])->value('name');
|
||||
}
|
||||
//作废信息
|
||||
if($detail['void_uid'] > 0){
|
||||
$detail['void_name'] = Db::name('Admin')->where(['id' => $detail['void_uid']])->value('name');
|
||||
}
|
||||
|
||||
//收票和付款信息
|
||||
if($detail['check_status'] == 2){
|
||||
$detail['ticket'] = Db::name('Ticket')->field('t.*,a.name as admin')
|
||||
->alias('t')
|
||||
->join('Admin a', 'a.id = t.admin_id', 'LEFT')
|
||||
->where([['t.purchase_id','=',$id],['t.open_status','<',2],['t.invoice_type','>',0],['t.delete_time','=',0]])
|
||||
->order('t.create_time desc')
|
||||
->select();
|
||||
|
||||
$has_ticket = Db::name('Ticket')->where([['purchase_id','=',$id],['open_status','<',2],['invoice_type','>',0],['delete_time','=',0]])->sum('amount');
|
||||
$detail['has_ticket'] = sprintf("%.2f",$has_ticket);
|
||||
$detail['no_ticket'] = sprintf("%.2f",($detail['cost']*100 - $has_ticket*100)/100);
|
||||
|
||||
|
||||
$ticket_ids = Db::name('Ticket')->where([['purchase_id','=',$id],['open_status','<',2],['delete_time','=',0]])->column('id');
|
||||
$detail['payment'] = Db::name('TicketPayment')->field('t.*,a.name as admin')
|
||||
->alias('t')
|
||||
->join('Admin a', 'a.id = t.admin_id', 'LEFT')
|
||||
->where([['t.ticket_id','in',$ticket_ids],['t.status','=',1]])
|
||||
->order('t.pay_time desc')
|
||||
->select();
|
||||
|
||||
$has_payment = Db::name('TicketPayment')->where([['ticket_id','in',$ticket_ids],['status','=',1]])->sum('amount');
|
||||
$detail['has_payment'] = sprintf("%.2f",$has_payment);
|
||||
$detail['no_payment'] = sprintf("%.2f",($detail['cost']*100 - $has_payment*100)/100);
|
||||
}
|
||||
if($detail['seal_ids'] !=''){
|
||||
$file_array = Db::name('File')->where('id','in',$detail['seal_ids'])->select()->toArray();
|
||||
$detail['seal_array'] = $file_array;
|
||||
}
|
||||
else{
|
||||
$detail['seal_array'] = [];
|
||||
}
|
||||
$auth = isAuth($this->uid,'contract_admin','conf_1');
|
||||
View::assign('detail', $detail);
|
||||
View::assign('auth', $auth);
|
||||
if(is_mobile()){
|
||||
return view('qiye@/contract/purchase_view');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if (request()->isDelete()) {
|
||||
$this->model->delById($id);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\contract\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\contract\model\Purchased as PurchasedModel;
|
||||
use app\contract\validate\PurchasedValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Purchased extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new PurchasedModel();
|
||||
}
|
||||
|
||||
public function datalist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = [];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['p.title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
if (isset($param['status']) && $param['status']!='') {
|
||||
$where[] = ['p.status', '=', $param['status']];
|
||||
}
|
||||
if (!empty($param['cate_id'])) {
|
||||
$cate_id_array = get_cate_son('PurchasedCate',$param['cate_id']);
|
||||
$where[] = ['p.cate_id', 'in', $cate_id_array];
|
||||
}
|
||||
$where[] = ['p.delete_time', '=', 0];
|
||||
$list = $this->model->datalist($where, $param);
|
||||
return table_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
//新建编辑
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$param['purchase_price'] = empty($param['purchase_price'])?0:$param['purchase_price'];
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(PurchasedValidate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
try {
|
||||
validate(PurchasedValidate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['admin_id'] = $this->uid;
|
||||
$this->model->add($param);
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if($id>0){
|
||||
$detail = $this->model->getById($id);
|
||||
if($detail['file_ids'] !=''){
|
||||
$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
|
||||
$detail['file_array'] = $file_array;
|
||||
}
|
||||
View::assign('detail', $detail);
|
||||
return view('edit');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$detail = $this->model->getById($id);
|
||||
if($detail['cate_id']>0){
|
||||
$detail['cate'] = Db::name('PurchasedCate')->where('id',$detail['cate_id'])->value('title');
|
||||
}
|
||||
if($detail['file_ids'] !=''){
|
||||
$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
|
||||
$detail['file_array'] = $file_array;
|
||||
}
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
|
||||
//设置
|
||||
public function set()
|
||||
{
|
||||
$param = get_params();
|
||||
$res = $this->model->strict(false)->field('id,status')->update($param);
|
||||
if ($res) {
|
||||
add_log('set', $param['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
else{
|
||||
return to_assign(0, '操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if (request()->isDelete()) {
|
||||
$this->model->delById($id);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\contract\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\contract\validate\PurchasedCateValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Purchasedcate extends BaseController
|
||||
{
|
||||
//类别
|
||||
public function datalist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$cate = Db::name('PurchasedCate')->order('create_time asc')->select();
|
||||
$list = generateTree($cate);
|
||||
return to_assign(0, '', $list);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//分类添加&编辑
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(PurchasedCateValidate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$note_array = get_cate_son('PurchasedCate',$param['id']);
|
||||
if (in_array($param['pid'], $note_array)) {
|
||||
return to_assign(1, '父级分类不能是该分类本身或其子分类');
|
||||
} else {
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('PurchasedCate')->strict(false)->field(true)->update($param);
|
||||
if($res){
|
||||
add_log('edit', $param['id'], $param);
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
validate(PurchasedCateValidate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('PurchasedCate')->strict(false)->field(true)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$pid = isset($param['pid']) ? $param['pid'] : 0;
|
||||
$cate = Db::name('PurchasedCate')->order('id desc')->select()->toArray();
|
||||
$cates = set_recursion($cate);
|
||||
if ($id > 0) {
|
||||
$detail = Db::name('PurchasedCate')->where(['id' => $id])->find();
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
View::assign('id', $id);
|
||||
View::assign('pid', $pid);
|
||||
View::assign('cates', $cates);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除分类
|
||||
public function del()
|
||||
{
|
||||
$id = get_params("id");
|
||||
$cate_count = Db::name('PurchasedCate')->where(["pid" => $id])->count();
|
||||
if ($cate_count > 0) {
|
||||
return to_assign(1, "该分类下还有子分类,无法删除");
|
||||
}
|
||||
$product_count = Db::name('Product')->where(["cate_id" => $id,'delete_time'=>0])->count();
|
||||
if ($product_count > 0) {
|
||||
return to_assign(1, "该分类下还有产品,无法删除");
|
||||
}
|
||||
if (Db::name('PurchasedCate')->delete($id) !== false) {
|
||||
add_log('delete', $id);
|
||||
return to_assign(0, "删除分类成功");
|
||||
} else {
|
||||
return to_assign(1, "删除失败");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,141 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\contract\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\contract\model\Services as ServicesModel;
|
||||
use app\contract\validate\ServicesValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Services extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new ServicesModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$list = $this->model->where('delete_time',0)->order('sort asc')->select();
|
||||
return to_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加/编辑
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(ServicesValidate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->edit($param);
|
||||
} else {
|
||||
try {
|
||||
validate(ServicesValidate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$this->model->add($param);
|
||||
}
|
||||
}else{
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id>0) {
|
||||
$detail = $this->model->getById($id);
|
||||
View::assign('detail', $detail);
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function view($id)
|
||||
{
|
||||
$detail = $this->model->getById($id);
|
||||
if (!empty($detail)) {
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
else{
|
||||
return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
public function del()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$param = get_params();
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
$type = isset($param['type']) ? $param['type'] : 0;
|
||||
$this->model->delById($id,$type);
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置
|
||||
*/
|
||||
public function set()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$res = $this->model->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, '操作失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\contract\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\contract\model\Supplier as SupplierModel;
|
||||
use app\contract\model\SupplierContact;
|
||||
use app\contract\validate\SupplierValidate;
|
||||
use app\contract\validate\SupplierContactValidate;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Supplier extends BaseController
|
||||
{
|
||||
/**
|
||||
* 构造函数
|
||||
*/
|
||||
protected $model;
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(); // 调用父类构造函数
|
||||
$this->model = new SupplierModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据列表
|
||||
*/
|
||||
public function datalist()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
$where = [];
|
||||
$where[]=['delete_time','=',0];
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['id|title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$list = $this->model->datalist($param,$where);
|
||||
return table_assign(0, '', $list);
|
||||
}
|
||||
else{
|
||||
return view();
|
||||
}
|
||||
}
|
||||
//新建编辑
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(SupplierValidate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('Supplier')->strict(false)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(SupplierValidate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('Supplier')->strict(false)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
if(!empty($param['c_name'])){
|
||||
$contact = [
|
||||
'name' => $param['c_name'],
|
||||
'mobile' => $param['c_mobile'],
|
||||
'sex' => $param['c_sex'],
|
||||
'sid' => $insertId,
|
||||
'is_default' => 1,
|
||||
'create_time' => time(),
|
||||
'admin_id' => $this->uid
|
||||
];
|
||||
Db::name('SupplierContact')->strict(false)->field(true)->insert($contact);
|
||||
}
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if($id>0){
|
||||
$detail = Db::name('Supplier')->where('id',$id)->find();
|
||||
$detail['file_array'] = Db::name('File')->where('id','in',$detail['file_ids'])->select();
|
||||
View::assign('detail', $detail);
|
||||
return view('edit');
|
||||
}
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//查看
|
||||
public function view()
|
||||
{
|
||||
$param = get_params();
|
||||
$detail = Db::name('Supplier')->where('id',$param['id'])->find();
|
||||
$detail['file_array'] = Db::name('File')->where('id','in',$detail['file_ids'])->select();
|
||||
View::assign('detail', $detail);
|
||||
return view();
|
||||
}
|
||||
|
||||
//设置
|
||||
public function set()
|
||||
{
|
||||
$param = get_params();
|
||||
$res = Db::name('Supplier')->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, '操作失败');
|
||||
}
|
||||
}
|
||||
|
||||
//删除
|
||||
public function del()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$params = get_params();
|
||||
$count = Db::name('Purchase')->where(['supplier_id' => $params['id'],'delete_time'=>0])->count();
|
||||
if($count>0){
|
||||
return to_assign(1, "该供应商有采购合同存在,不准删除");
|
||||
}
|
||||
$data['id'] = $params['id'];
|
||||
$data['delete_time'] = time();
|
||||
if (Db::name('Supplier')->update($data) !== false) {
|
||||
//删除客户联系人
|
||||
Db::name('SupplierContact')->where(['sid' => $params['id']])->update(['delete_time'=>time()]);
|
||||
return to_assign();
|
||||
} else {
|
||||
return to_assign(1, "操作失败");
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, "错误的请求");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//添加供应商联系人
|
||||
public function contact_add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(SupplierContactValidate::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = SupplierContact::strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(SupplierContactValidate::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$count= SupplierContact::where(['sid' => $param['sid'],'delete_time' => 0])->count();
|
||||
if($count == 0){
|
||||
$param['is_default'] = 1;
|
||||
}
|
||||
$param['admin_id'] = $this->uid;
|
||||
$param['create_time'] = time();
|
||||
$insertId = SupplierContact::strict(false)->field(true)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
$supplier_id = isset($param['sid']) ? $param['sid'] : 0;
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id > 0) {
|
||||
View::assign('detail', (new SupplierContact())->detail($id));
|
||||
return view('contact_edit');
|
||||
}
|
||||
$supplier_name = Db::name('Supplier')->where('id',$supplier_id)->value('title');
|
||||
View::assign('supplier_id', $supplier_id);
|
||||
View::assign('supplier_name', $supplier_name);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//删除供应商联系人
|
||||
public function contact_del()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$param = get_params();
|
||||
$contact = SupplierContact::where(['id' => $param['id']])->find();
|
||||
if($contact['is_default'] == 1){
|
||||
return to_assign(1, '供应商的首要联系人不能删除');
|
||||
}
|
||||
if($contact['admin_id'] != $this->uid){
|
||||
return to_assign(1, '你不是该联系人的创建人,无权限删除');
|
||||
}
|
||||
$param['delete_time'] = time();
|
||||
$res = SupplierContact::strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
return to_assign();
|
||||
} else {
|
||||
return to_assign(1, '操作失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, '参数错误');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\supplier\controller;
|
||||
|
||||
use app\base\BaseController;
|
||||
use app\supplier\model\SupplierContact;
|
||||
use app\supplier\validate\SupplierContactCheck;
|
||||
use think\exception\ValidateException;
|
||||
use think\facade\Db;
|
||||
use think\facade\View;
|
||||
|
||||
class Contact extends BaseController
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (request()->isAjax()) {
|
||||
$param = get_params();
|
||||
$where = array();
|
||||
if (!empty($param['keywords'])) {
|
||||
$where[] = ['a.id|a.name|a.mobile|s.title', 'like', '%' . $param['keywords'] . '%'];
|
||||
}
|
||||
$where[] = ['a.delete_time', '=', 0];
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$content = SupplierContact::where($where)
|
||||
->field('a.*,s.title as supplier')
|
||||
->alias('a')
|
||||
->join('Supplier s', 'a.sid = s.id')
|
||||
->order('a.create_time desc')
|
||||
->paginate($rows, false, ['query' => $param])
|
||||
->each(function ($item, $key) {
|
||||
$item->create_time = date('Y-m-d H:i:s', (int) $item->create_time);
|
||||
});
|
||||
return table_assign(0, '', $content);
|
||||
} else {
|
||||
return view();
|
||||
}
|
||||
}
|
||||
//添加
|
||||
public function add()
|
||||
{
|
||||
$param = get_params();
|
||||
if (request()->isAjax()) {
|
||||
if (!empty($param['id']) && $param['id'] > 0) {
|
||||
try {
|
||||
validate(SupplierContactCheck::class)->scene('edit')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$param['update_time'] = time();
|
||||
$res = Db::name('SupplierContact')->strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
}
|
||||
return to_assign();
|
||||
} else {
|
||||
try {
|
||||
validate(SupplierContactCheck::class)->scene('add')->check($param);
|
||||
} catch (ValidateException $e) {
|
||||
// 验证失败 输出错误信息
|
||||
return to_assign(1, $e->getError());
|
||||
}
|
||||
$count= Db::name('SupplierContact')->where(['sid' => $param['sid'],'delete_time' => 0])->count();
|
||||
if($count == 0){
|
||||
$param['is_default'] = 1;
|
||||
}
|
||||
$param['admin_id'] = $this->uid;
|
||||
$param['create_time'] = time();
|
||||
$insertId = Db::name('SupplierContact')->strict(false)->field(true)->insertGetId($param);
|
||||
if ($insertId) {
|
||||
add_log('add', $insertId, $param);
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
} else {
|
||||
$supplier_id = isset($param['sid']) ? $param['sid'] : 0;
|
||||
$id = isset($param['id']) ? $param['id'] : 0;
|
||||
if ($id > 0) {
|
||||
View::assign('detail', (new SupplierContact())->detail($id));
|
||||
return view('edit');
|
||||
}
|
||||
$supplier_name = Db::name('Supplier')->where('id',$supplier_id)->value('title');
|
||||
View::assign('supplier_id', $supplier_id);
|
||||
View::assign('supplier_name', $supplier_name);
|
||||
return view();
|
||||
}
|
||||
}
|
||||
|
||||
//设置
|
||||
public function del()
|
||||
{
|
||||
if (request()->isDelete()) {
|
||||
$param = get_params();
|
||||
$contact = Db::name('SupplierContact')->where(['id' => $param['id']])->find();
|
||||
if($contact['is_default'] == 1){
|
||||
return to_assign(1, '供应商的首要联系人不能删除');
|
||||
}
|
||||
if($contact['admin_id'] != $this->uid){
|
||||
return to_assign(1, '你不是该联系人的创建人,无权限删除');
|
||||
}
|
||||
$param['delete_time'] = time();
|
||||
$res = SupplierContact::strict(false)->field(true)->update($param);
|
||||
if ($res) {
|
||||
add_log('edit', $param['id'], $param);
|
||||
return to_assign();
|
||||
} else {
|
||||
return to_assign(1, '操作失败');
|
||||
}
|
||||
} else {
|
||||
return to_assign(1, '参数错误');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
// 这是系统自动生成的event定义文件
|
||||
return [
|
||||
|
||||
];
|
||||
@@ -0,0 +1,8 @@
|
||||
<?php
|
||||
// 这是系统自动生成的middleware定义文件
|
||||
return [
|
||||
//开启session中间件
|
||||
//'think\middleware\SessionInit',
|
||||
//验证勾股OA是否完成安装
|
||||
\app\home\middleware\Install::class,
|
||||
];
|
||||
@@ -0,0 +1,206 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
use app\api\model\EditLog;
|
||||
class Contract extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($param=[], $where=[], $whereOr=[])
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = 'id desc';
|
||||
if(!empty($param['order_field']) && !empty($param['order_type'])){
|
||||
$order = $param['order_field'].' '.$param['order_type'];
|
||||
}
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->where(function ($query) use($whereOr) {
|
||||
if (!empty($whereOr)){
|
||||
$query->whereOr($whereOr);
|
||||
}
|
||||
})
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
$types_title=contract_types_name($item->types);
|
||||
$item->types_name = $types_title['title'];
|
||||
$item->status_name = check_status_name($item->check_status);
|
||||
$item->cate_title = Db::name('ContractCate')->where(['id' => $item->cate_id])->value('title');
|
||||
$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->delay = count_days(date("Y-m-d"),date('Y-m-d', $item->end_time));
|
||||
if($item->keeper_uid>0){
|
||||
$item->keeper_name = Db::name('Admin')->where(['id' => $item->keeper_uid])->value('name');
|
||||
}
|
||||
else{
|
||||
$item->keeper_name='-';
|
||||
}
|
||||
if($item->archive_uid>0){
|
||||
$item->archive_name = Db::name('Admin')->where(['id' => $item->archive_uid])->value('name');
|
||||
$item->archive_time = date('Y-m-d', $item->archive_time);
|
||||
}
|
||||
else{
|
||||
$item->archive_name='-';
|
||||
$item->archive_time='-';
|
||||
}
|
||||
if($item->stop_uid>0){
|
||||
$item->stop_name = Db::name('Admin')->where(['id' => $item->stop_uid])->value('name');
|
||||
$item->stop_time = date('Y-m-d', $item->stop_time);
|
||||
}
|
||||
else{
|
||||
$item->stop_name='-';
|
||||
$item->stop_time='-';
|
||||
}
|
||||
if($item->void_uid>0){
|
||||
$item->void_name = Db::name('Admin')->where(['id' => $item->void_uid])->value('name');
|
||||
$item->void_time = date('Y-m-d', $item->void_time);
|
||||
}
|
||||
else{
|
||||
$item->void_name='-';
|
||||
$item->void_time='-';
|
||||
}
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
$log=new EditLog();
|
||||
$log->add('Contract',$insertId);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
$old = self::find($param['id']);
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
$log=new EditLog();
|
||||
$log->edit('Contract',$param['id'],$param,$old);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
$types_title=contract_types_name($info['types']);
|
||||
$info['types_name'] = $types_title['title'];
|
||||
$info['create_time'] = to_date($info['create_time']);
|
||||
$info['sign_time'] = date('Y-m-d', $info['sign_time']);
|
||||
$info['start_time'] = date('Y-m-d', $info['start_time']);
|
||||
$info['end_time'] = date('Y-m-d', $info['end_time']);
|
||||
$info['sign_department'] = Db::name('Department')->where(['id' => $info['did']])->value('title');
|
||||
$info['sign_name'] = Db::name('Admin')->where(['id' => $info['sign_uid']])->value('name');
|
||||
$info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name');
|
||||
if($info['chance_id']>0){
|
||||
$info['chance'] = Db::name('CustomerChance')->where(['id' => $info['chance_id']])->value('title');
|
||||
}
|
||||
else{
|
||||
$info['chance']='';
|
||||
}
|
||||
if($info['prepared_uid']>0){
|
||||
$info['prepared_name'] = Db::name('Admin')->where(['id' => $info['prepared_uid']])->value('name');
|
||||
}
|
||||
else{
|
||||
$info['prepared_name']='';
|
||||
}
|
||||
if($info['keeper_uid']>0){
|
||||
$info['keeper_name'] = Db::name('Admin')->where(['id' => $info['keeper_uid']])->value('name');
|
||||
}
|
||||
else{
|
||||
$info['keeper_name']='';
|
||||
}
|
||||
if($info['share_ids'] !=''){
|
||||
$share_names = Db::name('Admin')->where([['id','in',$info['share_ids']]])->column('name');
|
||||
$info['share_names'] = implode(',',$share_names);
|
||||
}
|
||||
else{
|
||||
$info['share_names'] = '';
|
||||
}
|
||||
if($info['file_ids'] !=''){
|
||||
$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select()->toArray();
|
||||
$info['file_array'] = $file_array;
|
||||
}
|
||||
else{
|
||||
$info['file_array'] = [];
|
||||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
namespace app\contract\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class ContractCate extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
namespace app\contract\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class Product extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'p.id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->field('p.*,pc.title as cate')
|
||||
->alias('p')
|
||||
->join('ProductCate pc', 'pc.id = p.cate_id', 'left')
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['aid'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,199 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
namespace app\contract\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
use app\api\model\EditLog;
|
||||
class Purchase extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($param=[], $where=[], $whereOr=[])
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = 'id desc';
|
||||
if(!empty($param['order_field']) && !empty($param['order_type'])){
|
||||
$order = $param['order_field'].' '.$param['order_type'];
|
||||
}
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->where(function ($query) use($whereOr) {
|
||||
if (!empty($whereOr)){
|
||||
$query->whereOr($whereOr);
|
||||
}
|
||||
})
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
$item->status_name = check_status_name($item->check_status);
|
||||
$types_title=purchase_types_name($item->types);
|
||||
$item->types_name = $types_title['title'];
|
||||
$item->cate_title = Db::name('ContractCate')->where(['id' => $item->cate_id])->value('title');
|
||||
$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->delay = count_days(date("Y-m-d"),date('Y-m-d', $item->end_time));
|
||||
if($item->keeper_uid>0){
|
||||
$item->keeper_name = Db::name('Admin')->where(['id' => $item->keeper_uid])->value('name');
|
||||
}
|
||||
else{
|
||||
$item->keeper_name='-';
|
||||
}
|
||||
if($item->archive_uid>0){
|
||||
$item->archive_name = Db::name('Admin')->where(['id' => $item->archive_uid])->value('name');
|
||||
$item->archive_time = date('Y-m-d', $item->archive_time);
|
||||
}
|
||||
else{
|
||||
$item->archive_name='-';
|
||||
$item->archive_time='-';
|
||||
}
|
||||
if($item->stop_uid>0){
|
||||
$item->stop_name = Db::name('Admin')->where(['id' => $item->stop_uid])->value('name');
|
||||
$item->stop_time = date('Y-m-d', $item->stop_time);
|
||||
}
|
||||
else{
|
||||
$item->stop_name='-';
|
||||
$item->stop_time='-';
|
||||
}
|
||||
if($item->void_uid>0){
|
||||
$item->void_name = Db::name('Admin')->where(['id' => $item->void_uid])->value('name');
|
||||
$item->void_time = date('Y-m-d', $item->void_time);
|
||||
}
|
||||
else{
|
||||
$item->void_name='-';
|
||||
$item->void_time='-';
|
||||
}
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
$log=new EditLog();
|
||||
$log->add('Purchase',$insertId);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
$old = self::find($param['id']);
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
$log=new EditLog();
|
||||
$log->edit('Purchase',$param['id'],$param,$old);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
$types_title=purchase_types_name($info['types']);
|
||||
$info['types_name'] = $types_title['title'];
|
||||
$info['create_time'] = to_date($info['create_time']);
|
||||
$info['sign_time'] = date('Y-m-d', $info['sign_time']);
|
||||
$info['start_time'] = date('Y-m-d', $info['start_time']);
|
||||
$info['end_time'] = date('Y-m-d', $info['end_time']);
|
||||
$info['sign_department'] = Db::name('Department')->where(['id' => $info['did']])->value('title');
|
||||
$info['sign_name'] = Db::name('Admin')->where(['id' => $info['sign_uid']])->value('name');
|
||||
$info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name');
|
||||
if($info['prepared_uid']>0){
|
||||
$info['prepared_name'] = Db::name('Admin')->where(['id' => $info['prepared_uid']])->value('name');
|
||||
}
|
||||
else{
|
||||
$info['prepared_name']='';
|
||||
}
|
||||
if($info['keeper_uid']>0){
|
||||
$info['keeper_name'] = Db::name('Admin')->where(['id' => $info['keeper_uid']])->value('name');
|
||||
}
|
||||
else{
|
||||
$info['keeper_name']='';
|
||||
}
|
||||
if($info['share_ids'] !=''){
|
||||
$share_names = Db::name('Admin')->where([['id','in',$info['share_ids']]])->column('name');
|
||||
$info['share_names'] = implode(',',$share_names);
|
||||
}
|
||||
else{
|
||||
$info['share_names'] = '';
|
||||
}
|
||||
if($info['file_ids'] !=''){
|
||||
$file_array = Db::name('File')->where('id','in',$info['file_ids'])->select()->toArray();
|
||||
$info['file_array'] = $file_array;
|
||||
}
|
||||
else{
|
||||
$info['file_array'] = [];
|
||||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
namespace app\contract\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class Purchased extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'p.id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->field('p.*,pc.title as cate')
|
||||
->alias('p')
|
||||
->join('PurchasedCate pc', 'pc.id = p.cate_id', 'left')
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name');
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['aid'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
namespace app\contract\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class Services extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($where, $param)
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]);
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
namespace app\contract\model;
|
||||
use think\model;
|
||||
use think\facade\Db;
|
||||
class Supplier extends Model
|
||||
{
|
||||
/**
|
||||
* 获取分页列表
|
||||
* @param $where
|
||||
* @param $param
|
||||
*/
|
||||
public function datalist($param=[], $where=[])
|
||||
{
|
||||
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
|
||||
$order = empty($param['order']) ? 'id desc' : $param['order'];
|
||||
try {
|
||||
$list = self::where($where)
|
||||
->order($order)
|
||||
->paginate(['list_rows'=> $rows])
|
||||
->each(function ($item, $key){
|
||||
$contact = Db::name('SupplierContact')->where(['is_default'=>1,'sid' => $item->id])->find();
|
||||
if(!empty($contact)){
|
||||
$item->user = $contact['name'];
|
||||
$item->mobile = $contact['mobile'];
|
||||
}
|
||||
});
|
||||
return $list;
|
||||
} catch(\Exception $e) {
|
||||
return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据
|
||||
* @param $param
|
||||
*/
|
||||
public function add($param)
|
||||
{
|
||||
$insertId = 0;
|
||||
try {
|
||||
$param['create_time'] = time();
|
||||
$insertId = self::strict(false)->field(true)->insertGetId($param);
|
||||
add_log('add', $insertId, $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$insertId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑信息
|
||||
* @param $param
|
||||
*/
|
||||
public function edit($param)
|
||||
{
|
||||
try {
|
||||
$param['update_time'] = time();
|
||||
self::where('id', $param['id'])->strict(false)->field(true)->update($param);
|
||||
add_log('edit', $param['id'], $param);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
return to_assign(0,'操作成功',['return_id'=>$param['id']]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取信息
|
||||
* @param $id
|
||||
*/
|
||||
public function getById($id)
|
||||
{
|
||||
$info = self::find($id);
|
||||
return $info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除信息
|
||||
* @param $id
|
||||
* @param $type
|
||||
* @return array
|
||||
*/
|
||||
public function delById($id,$type=0)
|
||||
{
|
||||
if($type==0){
|
||||
//逻辑删除
|
||||
try {
|
||||
$param['delete_time'] = time();
|
||||
self::where('id', $id)->update(['delete_time'=>time()]);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
else{
|
||||
//物理删除
|
||||
try {
|
||||
self::destroy($id);
|
||||
add_log('delete', $id);
|
||||
} catch(\Exception $e) {
|
||||
return to_assign(1, '操作失败,原因:'.$e->getMessage());
|
||||
}
|
||||
}
|
||||
return to_assign();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\model;
|
||||
|
||||
use think\facade\Db;
|
||||
use think\Model;
|
||||
|
||||
class SupplierContact extends Model
|
||||
{
|
||||
// 获取详情
|
||||
public function detail($id)
|
||||
{
|
||||
$detail = Db::name('SupplierContact')->where(['id' => $id])->find();
|
||||
if (!empty($detail)) {
|
||||
$detail['create_time'] = date('Y-m-d H:i:s', $detail['create_time']);
|
||||
$detail['supplier'] = Db::name('Supplier')->where(['id' => $detail['sid']])->value('title');
|
||||
}
|
||||
return $detail;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
|
||||
class CateValidate extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value,$rule,$data=[])
|
||||
{
|
||||
$id = isset($data['id'])?$data['id']:0;
|
||||
$count = Db::name('ContractCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
|
||||
protected $rule = [
|
||||
'title' => 'require|checkOne',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.checkOne' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['title', 'id'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
|
||||
class ContractValidate extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value,$rule,$data=[])
|
||||
{
|
||||
$id = isset($data['id'])?$data['id']:0;
|
||||
$count = Db::name('Contract')->where([['code','=',$data['code']],['id','<>',$id],['delete_time','=',0]])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
|
||||
protected function checkNumer($value,$rule,$data=[])
|
||||
{
|
||||
return is_numeric($value);
|
||||
}
|
||||
|
||||
protected $rule = [
|
||||
'code' => 'require|checkOne',
|
||||
'name' => 'require',
|
||||
'cost' => 'require|checkNumer',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'name.require' => '合同名称不能为空',
|
||||
'code.require' => '合同编码不能为空',
|
||||
'code.checkOne' => '同样的合同编码已经存在',
|
||||
'cost.require' => '合同金额不能为空',
|
||||
'cost.checkNumer' => '合同金额只能是数字',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['name','code','cost'],
|
||||
'edit' => ['name','code','cost','id'],
|
||||
'change' => ['id'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class ProductCateValidate extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:product_cate',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.unique' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class ProductValidate extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
|
||||
class PurchaseValidate extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value,$rule,$data=[])
|
||||
{
|
||||
$id = isset($data['id'])?$data['id']:0;
|
||||
$count = Db::name('Purchase')->where([['code','=',$data['code']],['id','<>',$id],['delete_time','=',0]])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
|
||||
protected function checkNumer($value,$rule,$data=[])
|
||||
{
|
||||
return is_numeric($value);
|
||||
}
|
||||
|
||||
protected $rule = [
|
||||
'code' => 'require|checkOne',
|
||||
'name' => 'require',
|
||||
'cost' => 'require|checkNumer',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'name.require' => '合同名称不能为空',
|
||||
'code.require' => '合同编码不能为空',
|
||||
'code.checkOne' => '同样的合同编码已经存在',
|
||||
'cost.require' => '合同金额不能为空',
|
||||
'cost.checkNumer' => '合同金额只能是数字',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['name','code','cost'],
|
||||
'edit' => ['name','code','cost','id'],
|
||||
'change' => ['id'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class PurchasedCateValidate extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:purchased_cate',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.unique' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class PurchasedValidate extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require|unique:purchased',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.unique' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\validate;
|
||||
use think\Validate;
|
||||
use think\facade\Db;
|
||||
|
||||
class ServicesValidate extends Validate
|
||||
{
|
||||
// 自定义验证规则
|
||||
protected function checkOne($value,$rule,$data=[])
|
||||
{
|
||||
$id = isset($data['id'])?$data['id']:0;
|
||||
$count = Db::name('Services')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count();
|
||||
return $count == 0 ? true : false;
|
||||
}
|
||||
|
||||
protected $rule = [
|
||||
'title' => 'require|checkOne',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'title.checkOne' => '同样的名称已经存在',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['title', 'id'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class SupplierContactValidate extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'name' => 'require',
|
||||
'mobile' => 'require',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'name.require' => '联系人姓名不能为空',
|
||||
'mobile' => '手机号码不能为空',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['name','mobile'],
|
||||
'edit' => ['id', 'name','mobile'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
/**
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
* @Author 勾股工作室 <hdm58@qq.com>
|
||||
+-----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
namespace app\contract\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class SupplierValidate extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'title' => 'require',
|
||||
'id' => 'require',
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'title.require' => '名称不能为空',
|
||||
'id.require' => '缺少更新条件',
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'add' => ['title'],
|
||||
'edit' => ['id', 'title'],
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">合同分类</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同分类名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入合同分类名称" lay-reqText="请输入合同分类名称"class="layui-input" value="{$detail.title|default=''}">
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<input type="hidden" name="id" value="{$detail.id|default=0}"/>
|
||||
<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>
|
||||
var moduleInit = ['tool'];
|
||||
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/cate/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,124 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="table_contract_cate" lay-filter="table_contract_cate"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加合同分类</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_contract_cate"
|
||||
,toolbar: '#toolbarDemo'
|
||||
,url: "/contract/cate/datalist"
|
||||
,page: false
|
||||
,limit: 999
|
||||
,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',ignoreExport:true,templet: function(d){
|
||||
var html='';
|
||||
var btn='<a class="layui-btn layui-btn-normal 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-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(table_contract_cate)',function (obj) {
|
||||
if(obj.event === 'edit'){
|
||||
add_cate(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/set", {id:obj.data.id,status: 0}, 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/set", {id:obj.data.id,status:1}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.add-new',function(){
|
||||
add_cate(0,'');
|
||||
});
|
||||
|
||||
function add_cate(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/add", {id: id,title: value}, callback);
|
||||
layer.close(index);
|
||||
} else {
|
||||
layer.msg('请填写类型名称');
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,16 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<h3 class="pb-3">合同分类详情</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同分类名称</td>
|
||||
<td>{$detail.title|default=''}"></td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>{$detail.sort|default=0}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
@@ -0,0 +1,261 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2">新增合同</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同名称<font>*</font></td>
|
||||
<td colspan="3"><input type="text" name="name" value="" lay-verify="required" lay-reqText="请输入合同名称" autocomplete="off" placeholder="请输入合同名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray">合同性质</td>
|
||||
<td>
|
||||
<input type="hidden" name="types" value="{$types}">
|
||||
{eq name="$types" value="1" }普通合同{/eq}
|
||||
{eq name="$types" value="2" }产品合同{/eq}
|
||||
{eq name="$types" value="3" }服务合同{/eq}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">签约主体<span style="font-size:12px;">(乙方)</span><font>*</font></td>
|
||||
<td colspan="3">
|
||||
<select name="subject_id" lay-verify="required" lay-reqText="请选择签约主体公司">
|
||||
<option value="">请选择签约主体公司</option>
|
||||
{volist name=":get_base_data('Enterprise')" id="v"}
|
||||
<option value="{$v.id}">{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同始止日期<font>*</font></td>
|
||||
<td id="barDate" style="width:320px;">
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<input type="text" class="layui-input" id="start_time" value="" placeholder="选择时间区间" readonly name="start_time" lay-verify="required" lay-reqText="请选择合同开始时间">
|
||||
</div>
|
||||
~
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<input type="text" class="layui-input" id="end_time" value="" placeholder="选择时间区间" readonly name="end_time" lay-verify="required" lay-reqText="请选择合同结束时间">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">客户名称<span style="font-size:12px;">(甲方)</span><font>*</font></td>
|
||||
<td colspan="3">
|
||||
{eq name="$is_customer" value="1"}
|
||||
<input type="text" name="customer" autocomplete="off" value="" readonly lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input customer-picker">
|
||||
{else/}
|
||||
<input type="text" name="customer" autocomplete="off" value="" lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input">
|
||||
{/eq}
|
||||
<input type="hidden" name="customer_id" value="0">
|
||||
</td>
|
||||
<td class="layui-td-gray">签约客户代表<font>*</font></td>
|
||||
<td><input type="text" name="contact_name" value="" autocomplete="off" lay-verify="required" lay-reqText="请输入客户代表姓名" placeholder="请输入客户代表姓名" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">客户联系地址</td>
|
||||
<td colspan="3"><input type="text" name="contact_address" value="" autocomplete="off" placeholder="请输入客户联系地址" class="layui-input"></td>
|
||||
<td class="layui-td-gray">客户联系电话</td>
|
||||
<td><input type="text" name="contact_mobile" value="" autocomplete="off" placeholder="请输入客户联系电话" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">关联机会线索</td>
|
||||
<td colspan="5">
|
||||
<input type="text" value="" readonly autocomplete="off" placeholder="请选择" class="layui-input chance-picker">
|
||||
<input type="hidden" name="chance_id" value="0">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同金额<font>*</font></td>
|
||||
<td>
|
||||
{eq name="$types" value="1"}
|
||||
<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请输入合同金额,数字" placeholder="请输入合同金额,数字" autocomplete="off" class="layui-input">
|
||||
{/eq}
|
||||
{eq name="$types" value="2"}
|
||||
<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请完善产品信息" placeholder="完善产品信息,合同金额自动计算" readonly class="layui-input layui-input-readonly">
|
||||
{/eq}
|
||||
{eq name="$types" value="3"}
|
||||
<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请完善服务信息" placeholder="完善服务信息,合同金额自动计算" readonly class="layui-input layui-input-readonly">
|
||||
{/eq}
|
||||
</td>
|
||||
<td class="layui-td-gray">合同类别<font>*</font></td>
|
||||
<td>
|
||||
<select name="cate_id" lay-verify="required" lay-reqText="请选择合同类别">
|
||||
<option value="">请选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">合同编号<font>*</font></td>
|
||||
<td><input type="text" name="code" value="{$codeno}" autocomplete="off" {eq name="$is_codeno" value="1"}readonly{/eq} lay-verify="required" lay-reqText="请输入合同编号" placeholder="请输入合同编号" class="layui-input"></td>
|
||||
</tr>
|
||||
<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="" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同签订人" placeholder="请选择合同签订人" class="layui-input picker-diy">
|
||||
<input type="hidden" name="sign_uid" value="0">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同所属部门<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="sign_department" value="" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同所属部门" placeholder="请选择合同所属部门" class="layui-input picker-oa" data-types="department">
|
||||
<input type="hidden" name="did" value="0">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同签订日期<font>*</font></td>
|
||||
<td><input type="text" name="sign_time" value="" readonly lay-verify="required" lay-reqText="请选择合同签订日期" placeholder="请选择合同签订日期" class="layui-input tool-time"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合同制定人</td>
|
||||
<td>
|
||||
<input type="text" name="prepared_name" value="" readonly placeholder="请选择合同制定人" class="layui-input picker-admin">
|
||||
<input type="hidden" name="prepared_uid" value="0">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同保管人</td>
|
||||
<td>
|
||||
<input type="text" name="keeper_name" value="" readonly placeholder="请选择合同保管人" class="layui-input picker-admin">
|
||||
<input type="hidden" name="keeper_uid" value="0">
|
||||
</td>
|
||||
<td class="layui-td-gray">合同共享人员</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="share_names" value="" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="share_ids" value="">
|
||||
</td>
|
||||
</tr>
|
||||
{eq name="$types" value="2"}{include file="/contract/add_product"}{/eq}
|
||||
{eq name="$types" value="3"}{include file="/contract/add_service"}{/eq}
|
||||
<tr>
|
||||
<td colspan="6"><strong>相关附件</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn"><i class="layui-icon"></i>附件上传</button>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
<input type="hidden" id="fileBoxInput" data-type="file" name="file_ids" value="">
|
||||
</div>
|
||||
</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="pt-4">
|
||||
<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','oaPicker','uploadPlus'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,laydate = layui.laydate, oaPicker = layui.oaPicker,uploadPlus = layui.uploadPlus;
|
||||
if(typeof product_fun==='function'){
|
||||
product_fun(layui);
|
||||
}
|
||||
if(typeof service_fun==='function'){
|
||||
service_fun(layui);
|
||||
}
|
||||
//日期范围
|
||||
laydate.render({
|
||||
elem: '#barDate',
|
||||
range: ['#start_time', '#end_time']
|
||||
});
|
||||
//附件上传
|
||||
var attachment = new uploadPlus({
|
||||
"target":'uploadBtn',
|
||||
"targetBox":'uploadBox'
|
||||
});
|
||||
|
||||
//选择员工弹窗
|
||||
$('body').on('click','.picker-diy',function () {
|
||||
let that = $(this);
|
||||
let ids=that.next().val()+'',names = that.val()+'';
|
||||
oaPicker.employeeInit({
|
||||
ids:ids,
|
||||
names:names,
|
||||
type:1,//1是单选,2是多选
|
||||
callback:function(data){
|
||||
//这里是选择后的回调方法,可以根据具体需求自定义写哦
|
||||
let select_id=[],select_name=[];
|
||||
for(var a=0; a<data.length;a++){
|
||||
select_id.push(data[a].id);
|
||||
select_name.push(data[a].name);
|
||||
}
|
||||
that.val(select_name.join(','));
|
||||
that.next().val(select_id.join(','));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//选择客户弹窗
|
||||
$('body').on('click','.customer-picker',function () {
|
||||
let that = $(this),ids = [],titles=[],contact_name=[],contact_mobile=[],address=[],map = {},types = 'customer',type = 1;
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].name);
|
||||
contact_name.push(data[i].contact_name);
|
||||
contact_mobile.push(data[i].contact_mobile);
|
||||
address.push(data[i].address);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
$('[name="contact_name"]').val(contact_name.join(','));
|
||||
$('[name="contact_mobile"]').val(contact_mobile.join(','));
|
||||
$('[name="contact_address"]').val(address.join(','));
|
||||
}
|
||||
oaPicker.picker(types,type,callback,map);
|
||||
});
|
||||
|
||||
//选择销售机会弹窗
|
||||
$('body').on('click','.chance-picker',function () {
|
||||
let customer_id = $('[name="customer_id"]').val();
|
||||
if(customer_id==0){
|
||||
layer.msg('请先选择客户');
|
||||
return false;
|
||||
}
|
||||
let that = $(this),ids = [],titles=[],map = {cid:customer_id};
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].title);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
}
|
||||
let opts={
|
||||
"title":"选择机会线索",
|
||||
"url": "/customer/api/get_chance",
|
||||
"ids":"",
|
||||
"titles":"",
|
||||
"area": ['720px', '580px'],
|
||||
"cols":[{field: 'id',width: 80,title:'序号',align:'center'},{field:'title',title:'机会主题'},{field:'expected_amount',title:'预计签单金额',width: 100},{field:'expected_time',title:'预计签单日期',width: 100}]
|
||||
}
|
||||
oaPicker.picker(opts,1,callback,map);
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/contract/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,116 @@
|
||||
<tr>
|
||||
<td colspan="6"><strong>产品信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="productAdd">+ 添加产品</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table id="productTable" class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">产品名称</th>
|
||||
<th width="100">单位</th>
|
||||
<th width="100">规格</th>
|
||||
<th width="100">销售单价</th>
|
||||
<th width="100">数量</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
<th width="60">操作</th>
|
||||
</tr>
|
||||
<tr class="product-tr">
|
||||
{eq name="is_product" value="1"}
|
||||
<td><input type="text" name="product_title[]" value="" class="layui-input product-picker" readonly lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>
|
||||
{else/}
|
||||
<td><input type="text" name="product_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>
|
||||
{/eq}
|
||||
<td><input type="text" name="product_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
|
||||
<td><input type="text" name="product_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品规格"></td>
|
||||
<td><input type="text" name="product_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入销售单价"></td>
|
||||
<td><input type="text" name="product_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入产品数量"></td>
|
||||
<td><input type="text" name="product_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="product_remark[]" value="" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<script>
|
||||
const is_product={$is_product};
|
||||
function product_fun(layui){
|
||||
let form = layui.form,oaPicker = layui.oaPicker;
|
||||
|
||||
//选择物品弹窗
|
||||
$('body').on('click','.product-picker',function () {
|
||||
let that = $(this),ids = [],titles=[],sale_price=[],unit=[],specs=[],map = {},types = 'product',type = 1;
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].title);
|
||||
unit.push(data[i].unit);
|
||||
specs.push(data[i].specs);
|
||||
sale_price.push(data[i].sale_price);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
that.parents('.product-tr').find('input').eq(2).val(unit.join(','));
|
||||
that.parents('.product-tr').find('input').eq(3).val(specs.join(','));
|
||||
that.parents('.product-tr').find('input').eq(4).val(sale_price.join(','));
|
||||
that.parents('.product-tr').find('input').eq(6).val(sale_price.join(','));
|
||||
count_cost();
|
||||
}
|
||||
oaPicker.picker(types,type,callback,map);
|
||||
});
|
||||
|
||||
//添加产品信息表格
|
||||
$('#productAdd').on('click',function(){
|
||||
var html = '',product_title=' class="layui-input"';
|
||||
if(is_product==1){
|
||||
product_title=' class="layui-input product-picker" readonly';
|
||||
}
|
||||
html += '<tr class="product-tr">\
|
||||
<td><input type="text" name="product_title[]" value="" '+product_title+' lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>\
|
||||
<td><input type="text" name="product_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>\
|
||||
<td><input type="text" name="product_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品规格"></td>\
|
||||
<td><input type="text" name="product_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入销售单价"></td>\
|
||||
<td><input type="text" name="product_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入产品数量"></td>\
|
||||
<td><input type="text" name="product_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
|
||||
<td><input type="text" name="product_remark[]" value="" class="layui-input"></td>\
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
|
||||
</tr>';
|
||||
$('#productTable').append(html).find('.tr-none').remove();
|
||||
form.render();
|
||||
});
|
||||
|
||||
$('#productTable').on('click', '[lay-event="del"]', function() {
|
||||
if($('.product-tr').length<2){
|
||||
layer.msg('至少保留一个产品选项');
|
||||
return false;
|
||||
}
|
||||
$(this).parents('.product-tr').remove();
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算价格
|
||||
$('#productTable').on('input', '.input-num', function() {
|
||||
var inputs = $(this).parents('.product-tr').find("input");
|
||||
var product_price = inputs.eq(4).val();
|
||||
var product_num = inputs.eq(5).val();
|
||||
var product_amount = (product_price*product_num).toFixed(2);
|
||||
if(isNaN(product_amount)){
|
||||
product_amount = 0.00;
|
||||
}
|
||||
inputs.eq(6).val(product_amount);
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算总价
|
||||
function count_cost(){
|
||||
var product_subtotal = $('#productTable').find('[name="product_subtotal[]"]');
|
||||
var total = 0;
|
||||
for (var m = 0; m < product_subtotal.length; m++) {
|
||||
total+=$(product_subtotal[m]).val()*1000;
|
||||
}
|
||||
if(isNaN(total)){
|
||||
total = 0;
|
||||
}
|
||||
$('[name="cost"]').val((total/1000).toFixed(2));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,109 @@
|
||||
<tr>
|
||||
<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="serviceAdd">+ 添加服务</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table id="serviceTable" class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">服务名称</th>
|
||||
<th width="200">服务周期</th>
|
||||
<th width="100">服务单价</th>
|
||||
<th width="100">服务次数</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
<th width="60">操作</th>
|
||||
</tr>
|
||||
<tr class="service-tr">
|
||||
{eq name="is_service" value="1"}
|
||||
<td><input type="text" name="service_title[]" value="" class="layui-input service-picker" readonly lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>
|
||||
{else/}
|
||||
<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>
|
||||
{/eq}
|
||||
<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
|
||||
<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
|
||||
<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
|
||||
<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<script>
|
||||
const is_service={$is_service};
|
||||
function product_fun(layui){
|
||||
let form = layui.form,oaPicker = layui.oaPicker;
|
||||
|
||||
//选择物品弹窗
|
||||
$('body').on('click','.service-picker',function () {
|
||||
let that = $(this),ids = [],titles=[],price=[],map = {},types = 'services',type = 1;
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].title);
|
||||
price.push(data[i].price);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
that.parents('.service-tr').find('input').eq(3).val(price.join(','));
|
||||
that.parents('.service-tr').find('input').eq(5).val(price.join(','));
|
||||
count_cost();
|
||||
}
|
||||
oaPicker.picker(types,type,callback,map);
|
||||
});
|
||||
|
||||
//添加服务信息表格
|
||||
$('#serviceAdd').on('click',function(){
|
||||
var html = '',service_title=' class="layui-input"';
|
||||
if(is_service==1){
|
||||
service_title=' class="layui-input service-picker" readonly';
|
||||
}
|
||||
html += '<tr class="service-tr">\
|
||||
<td><input type="text" name="service_title[]" value="" '+service_title+' lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>\
|
||||
<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>\
|
||||
<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>\
|
||||
<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>\
|
||||
<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
|
||||
<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>\
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
|
||||
</tr>';
|
||||
$('#serviceTable').append(html).find('.tr-none').remove();
|
||||
form.render();
|
||||
});
|
||||
|
||||
$('#serviceTable').on('click', '[lay-event="del"]', function() {
|
||||
if($('.service-tr').length<2){
|
||||
layer.msg('至少保留一个服务选项');
|
||||
return false;
|
||||
}
|
||||
$(this).parents('.service-tr').remove();
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算价格
|
||||
$('#serviceTable').on('input', '.input-num', function() {
|
||||
var inputs = $(this).parents('.service-tr').find("input");
|
||||
var service_price = inputs.eq(3).val();
|
||||
var service_num = inputs.eq(4).val();
|
||||
var service_amount = (service_price*service_num).toFixed(2);
|
||||
if(isNaN(service_amount)){
|
||||
service_amount = 0.00;
|
||||
}
|
||||
inputs.eq(5).val(service_amount);
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算总价
|
||||
function count_cost(){
|
||||
var service_subtotal = $('#serviceTable').find('[name="service_subtotal[]"]');
|
||||
var total = 0;
|
||||
for (var m = 0; m < service_subtotal.length; m++) {
|
||||
total+=$(service_subtotal[m]).val()*1000;
|
||||
}
|
||||
if(isNaN(total)){
|
||||
total = 0;
|
||||
}
|
||||
$('[name="cost"]').val((total/1000).toFixed(2));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,34 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2">新增合同</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td>选择合同性质</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="layui-btn-group">
|
||||
<a href="/contract/contract/add?types=1" class="layui-btn">普通合同</a>
|
||||
<a href="/contract/contract/add?types=2" class="layui-btn">产品合同</a>
|
||||
<a href="/contract/contract/add?types=3" class="layui-btn">服务合同</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
{/block}
|
||||
{block name="copyright"}{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,178 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
|
||||
<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this"><a href="/contract/contract/archivelist">销售合同</a></li>
|
||||
<li><a href="/contract/purchase/archivelist">采购合同</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<form class="layui-form gg-form-bar border-x">
|
||||
<div class="layui-input-inline" style="width:128px;">
|
||||
<select name="types">
|
||||
<option value="">选择合同性质</option>
|
||||
<option value="1">普通合同</option>
|
||||
<option value="2">产品合同</option>
|
||||
<option value="3">服务合同</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:128px;">
|
||||
<select name="cate_id">
|
||||
<option value="">选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:220px;">
|
||||
<input type="text" name="keywords" placeholder="输入关键字,合同编号/合同名称" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px">
|
||||
<input type="hidden" name="tab" value="0" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<h3>归档合同</h3>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const delay_num = {$delay_num|default=30};
|
||||
const moduleInit = ['tool','tablePlus','laydatePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
|
||||
//日期范围
|
||||
var sign_time = new laydatePlus({'target':'sign_time'});
|
||||
var end_time = new laydatePlus({'target':'end_time'});
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_contract"
|
||||
, toolbar: "#toolbarDemo"
|
||||
,url: "/contract/contract/archivelist"
|
||||
,is_excel: true
|
||||
,page: true
|
||||
,limit: 20
|
||||
,cellMinWidth: 60
|
||||
,height: 'full-154'
|
||||
,cols: [[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'code',
|
||||
title: '合同编号',
|
||||
align: 'center',
|
||||
width: 150
|
||||
},{
|
||||
field: 'name',
|
||||
title: '合同名称',
|
||||
minWidth:240,
|
||||
templet: '<div><a data-href="/contract/contract/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
|
||||
},{
|
||||
field: 'cate_title',
|
||||
title: '合同类别',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},{
|
||||
field: 'types_name',
|
||||
title: '合同性质',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'interval_time',
|
||||
title: '合同有效时间',
|
||||
align: 'center',
|
||||
width: 268,
|
||||
templet: function (d) {
|
||||
var html = d.interval_time;
|
||||
if (d.delay > 0 && d.delay < delay_num) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
|
||||
}
|
||||
if (d.delay == 0) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'cost',
|
||||
title: '合同金额(元)',
|
||||
align: 'right',
|
||||
width: 100
|
||||
},{
|
||||
field: 'archive_name',
|
||||
title: '归档人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'archive_time',
|
||||
title: '归档日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'sign_name',
|
||||
title: '签定人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'sign_time',
|
||||
title: '签订日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'keeper_name',
|
||||
title: '保管人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'right',
|
||||
fixed:'right',
|
||||
title: '操作',
|
||||
width: 60,
|
||||
align: 'center',
|
||||
ignoreExport:true,
|
||||
templet: function (d) {
|
||||
var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
|
||||
return btn0;
|
||||
}
|
||||
}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(table_contract)',function (obj) {
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.side("/contract/contract/view?id="+data.id);
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,258 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
|
||||
<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">全部</li>
|
||||
<li>待我审批</li>
|
||||
<li>我已审批</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<form class="layui-form gg-form-bar border-x" id="barsearchform" lay-filter="barsearchform">
|
||||
{gt name="$is_auth" value="0"}
|
||||
<div class="layui-input-inline user-name" style="width:90px;">
|
||||
<input type="text" name="username" placeholder="选择签定人" class="layui-input picker-admin" readonly />
|
||||
<input type="text" name="uid" value="" style="display:none" />
|
||||
</div>
|
||||
{else/}
|
||||
{gt name="$is_leader" value="0"}
|
||||
<div class="layui-input-inline user-name" style="width:90px;">
|
||||
<input type="text" name="username" placeholder="选择签定人" class="layui-input picker-sub" readonly />
|
||||
<input type="text" name="uid" value="" style="display:none" />
|
||||
</div>
|
||||
{/gt}
|
||||
{/gt}
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="types">
|
||||
<option value="">选择合同性质</option>
|
||||
<option value="1">普通合同</option>
|
||||
<option value="2">产品合同</option>
|
||||
<option value="3">服务合同</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="cate_id">
|
||||
<option value="">选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="check_status">
|
||||
<option value="">选择审批状态</option>
|
||||
{volist name=":get_check_status()" id="vo"}
|
||||
<option value="{$key}">{$vo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:220px;">
|
||||
<input type="text" name="keywords" placeholder="输入关键字,合同编号/合同名称" class="layui-input" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px">
|
||||
<input type="hidden" name="tab" value="0" />
|
||||
<input type="hidden" name="order_field" value=''>
|
||||
<input type="hidden" name="order_type" value=''>
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm" lay-event="add">
|
||||
<span>+ 添加合同</span>
|
||||
<i class="layui-icon layui-icon-down layui-font-12"></i>
|
||||
</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const delay_num = {$delay_num|default=30};
|
||||
const contract_types = [{"id":1,"title":"普通合同"},{"id":2,"title":"产品合同"},{"id":3,"title":"服务合同"}];
|
||||
const moduleInit = ['tool','tablePlus','laydatePlus','oaPicker'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus,form = layui.form,dropdown = layui.dropdown,element = layui.element, tool = layui.tool,laydatePlus = layui.laydatePlus;
|
||||
|
||||
//tab切换
|
||||
element.on('tab(tab)', function(data){
|
||||
$('[name="tab"]').val(data.index);
|
||||
$("#barsearchform")[0].reset();
|
||||
let searchObject = form.val('barsearchform');
|
||||
layui.pageTable.reload({where:searchObject,page:{curr:1}});
|
||||
return false;
|
||||
});
|
||||
|
||||
//日期范围
|
||||
var sign_time = new laydatePlus({'target':'sign_time'});
|
||||
var end_time = new laydatePlus({'target':'end_time'});
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_contract"
|
||||
,title: "销售合同列表"
|
||||
,toolbar: "#toolbarDemo"
|
||||
,url: "/contract/contract/datalist"
|
||||
,page: true
|
||||
,limit: 20
|
||||
,cellMinWidth: 80
|
||||
,height: 'full-154'
|
||||
,autoSort: false
|
||||
,cols: [[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
sort: true,
|
||||
width: 80
|
||||
},{ field: 'check_status', title: '审批状态', align: 'center', width: 110, templet: function (d) {
|
||||
var html = '<span class="check-status-color-' + d.check_status + '">『' + d.status_name + '』</span>';
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'code',
|
||||
title: '合同编号',
|
||||
align: 'center',
|
||||
width: 150
|
||||
},{
|
||||
field: 'name',
|
||||
title: '合同名称',
|
||||
minWidth:240,
|
||||
templet: '<div><a data-href="/contract/contract/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
|
||||
},{
|
||||
field: 'cate_title',
|
||||
title: '合同类别',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},{
|
||||
field: 'types_name',
|
||||
title: '合同性质',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'end_time',
|
||||
title: '合同有效时间',
|
||||
align: 'center',
|
||||
width: 268,
|
||||
sort: true,
|
||||
templet: function (d) {
|
||||
var html = d.interval_time;
|
||||
if (d.delay > 0 && d.delay < delay_num) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
|
||||
}
|
||||
if (d.delay == 0) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">已过期</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',
|
||||
sort: true,
|
||||
width: 100
|
||||
},{
|
||||
field: 'right',
|
||||
fixed:'right',
|
||||
title: '操作',
|
||||
width: 120,
|
||||
align: 'center',
|
||||
ignoreExport:true,
|
||||
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.check_status==0 || d.check_status==4){
|
||||
return html+btn0+btn1+btn2+'</div>';
|
||||
}
|
||||
else{
|
||||
return btn0;
|
||||
}
|
||||
}
|
||||
}
|
||||
]]
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
table.on('toolbar(table_contract)', function(obj){
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = checkStatus.data;
|
||||
var that = this;
|
||||
if (obj.event === 'add'){
|
||||
dropdown.render({
|
||||
elem: that,
|
||||
show: true, // 外部事件触发即显示
|
||||
data: contract_types,
|
||||
click: function(obj){
|
||||
tool.side("/contract/contract/add?types="+obj.id);
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
table.on('tool(table_contract)',function (obj) {
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.side("/contract/contract/view?id="+data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.side("/contract/contract/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/contract/del", { id: data.id }, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,262 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2">编辑合同</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<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>{$detail.types_name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">签约主体<span style="font-size:12px;">(乙方)</span><font>*</font></td>
|
||||
<td colspan="3">
|
||||
<select name="subject_id" lay-verify="required" lay-reqText="请选择签约主体公司">
|
||||
<option value="">请选择签约主体公司</option>
|
||||
{volist name=":get_base_data('Enterprise')" 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-2">合同始止日期<font>*</font></td>
|
||||
<td id="barDate" style="width:320px;">
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<input type="text" class="layui-input" id="start_time" value="{$detail.start_time}" placeholder="选择时间区间" readonly name="start_time" lay-verify="required" lay-reqText="请选择合同开始时间">
|
||||
</div>
|
||||
~
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<input type="text" class="layui-input" id="end_time" value="{$detail.end_time}" placeholder="选择时间区间" readonly name="end_time" lay-verify="required" lay-reqText="请选择合同结束时间">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">客户名称<span style="font-size:12px;">(甲方)</span><font>*</font></td>
|
||||
<td colspan="3">
|
||||
{eq name="$is_customer" value="1"}
|
||||
<input type="text" name="customer" autocomplete="off" value="{$detail.customer}" readonly lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input customer-picker">
|
||||
{else/}
|
||||
<input type="text" name="customer" autocomplete="off" value="{$detail.customer}" lay-verify="required" lay-reqText="请输入客户名称" placeholder="请输入客户名称" class="layui-input">
|
||||
{/eq}
|
||||
<input type="hidden" name="customer_id" value="{$detail.customer_id}">
|
||||
</td>
|
||||
<td class="layui-td-gray">签约客户代表<font>*</font></td>
|
||||
<td><input type="text" name="contact_name" value="{$detail.contact_name}" autocomplete="off" lay-verify="required" lay-reqText="请输入客户代表姓名" placeholder="请输入客户代表姓名" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">客户联系地址</td>
|
||||
<td colspan="3"><input type="text" name="contact_address" value="{$detail.contact_address}" autocomplete="off" placeholder="请输入客户联系地址" class="layui-input"></td>
|
||||
<td class="layui-td-gray">客户联系电话</td>
|
||||
<td><input type="text" name="contact_mobile" value="{$detail.contact_mobile}" autocomplete="off" placeholder="请输入客户联系电话" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">关联机会线索</td>
|
||||
<td colspan="5">
|
||||
<input type="text" value="{$detail.chance|default=''}" readonly autocomplete="off" placeholder="请选择" class="layui-input chance-picker">
|
||||
<input type="hidden" name="chance_id" value="{$detail.chance_id}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同金额<font>*</font></td>
|
||||
<td>
|
||||
{eq name="$detail.types" value="1"}
|
||||
<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请输入合同金额,数字" placeholder="请输入合同金额,数字" autocomplete="off" class="layui-input">
|
||||
{/eq}
|
||||
{eq name="$detail.types" value="2"}
|
||||
<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请完善产品信息" placeholder="完善产品信息,合同金额自动计算" readonly class="layui-input layui-input-readonly">
|
||||
{/eq}
|
||||
{eq name="$detail.types" value="3"}
|
||||
<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请完善服务信息" placeholder="完善服务信息,合同金额自动计算" readonly class="layui-input layui-input-readonly">
|
||||
{/eq}
|
||||
</td>
|
||||
<td class="layui-td-gray">合同类别<font>*</font></td>
|
||||
<td>
|
||||
<select name="cate_id" lay-verify="required" lay-reqText="请选择合同类别">
|
||||
<option value="">请选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}" {eq name="$vo.id" value="$detail.cate_id"} selected{/eq}>{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">合同编号<font>*</font></td>
|
||||
<td><input type="text" name="code" value="{$detail.code}" autocomplete="off" {eq name="$is_codeno" value="1"}readonly{/eq} lay-verify="required" lay-reqText="请输入合同编号" placeholder="请输入合同编号" class="layui-input"></td>
|
||||
</tr>
|
||||
<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 lay-verify="required" lay-reqText="请选择合同签订人" placeholder="请选择合同签订人" class="layui-input picker-diy">
|
||||
<input type="hidden" name="sign_uid" value="{$detail.sign_uid}">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同所属部门<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="sign_department" value="{$detail.sign_department}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同所属部门" placeholder="请选择合同所属部门" class="layui-input picker-oa" data-types="department">
|
||||
<input type="hidden" name="did" value="{$detail.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 tool-time"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合同制定人</td>
|
||||
<td>
|
||||
<input type="text" name="prepared_name" value="{$detail.prepared_name}" autocomplete="off" readonly placeholder="请选择合同制定人" class="layui-input picker-admin">
|
||||
<input type="hidden" name="prepared_uid" value="{$detail.prepared_uid}">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同保管人</td>
|
||||
<td>
|
||||
<input type="text" name="keeper_name" value="{$detail.keeper_name}" autocomplete="off" readonly placeholder="请选择合同保管人" class="layui-input picker-admin">
|
||||
<input type="hidden" name="keeper_uid" value="{$detail.keeper_uid}">
|
||||
</td>
|
||||
<td class="layui-td-gray">合同共享人员</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="share_names" value="{$detail.share_names}" autocomplete="off" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="share_ids" value="{$detail.share_ids}">
|
||||
</td>
|
||||
</tr>
|
||||
{eq name="$detail.types" value="2"}{include file="/contract/edit_product"}{/eq}
|
||||
{eq name="$detail.types" value="3"}{include file="/contract/edit_service"}{/eq}
|
||||
<tr>
|
||||
<td colspan="6"><strong>相关附件</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn"><i class="layui-icon"></i>附件上传</button>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
|
||||
{notempty name="$detail.file_ids"}
|
||||
{volist name="$detail.file_array" id="vo"}
|
||||
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
|
||||
{/volist}
|
||||
{/notempty}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6"><strong>备注信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=''}</textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<input type="hidden" name="id" value="{$detail.id}">
|
||||
<input type="hidden" name="types" value="{$detail.types}">
|
||||
<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','oaPicker','uploadPlus'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,laydate = layui.laydate, oaPicker = layui.oaPicker,uploadPlus = layui.uploadPlus;
|
||||
if(typeof product_fun==='function'){
|
||||
product_fun(layui);
|
||||
}
|
||||
if(typeof service_fun==='function'){
|
||||
service_fun(layui);
|
||||
}
|
||||
//日期范围
|
||||
laydate.render({
|
||||
elem: '#barDate',
|
||||
range: ['#start_time', '#end_time']
|
||||
});
|
||||
//附件上传
|
||||
var attachment = new uploadPlus({
|
||||
"target":'uploadBtn',
|
||||
"targetBox":'uploadBox'
|
||||
});
|
||||
//选择员工弹窗
|
||||
$('body').on('click','.picker-diy',function () {
|
||||
let that = $(this);
|
||||
let ids=that.next().val()+'',names = that.val()+'';
|
||||
oaPicker.employeeInit({
|
||||
ids:ids,
|
||||
names:names,
|
||||
type:1,//1是单选,2是多选
|
||||
callback:function(data){
|
||||
//这里是选择后的回调方法,可以根据具体需求自定义写哦
|
||||
let select_id=[],select_name=[];
|
||||
for(var a=0; a<data.length;a++){
|
||||
select_id.push(data[a].id);
|
||||
select_name.push(data[a].name);
|
||||
}
|
||||
that.val(select_name.join(','));
|
||||
that.next().val(select_id.join(','));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//选择客户弹窗
|
||||
$('body').on('click','.customer-picker',function () {
|
||||
let that = $(this),ids = [],titles=[],contact_name=[],contact_mobile=[],address=[],map = {},types = 'customer',type = 1;
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].name);
|
||||
contact_name.push(data[i].contact_name);
|
||||
contact_mobile.push(data[i].contact_mobile);
|
||||
address.push(data[i].address);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
$('[name="contact_name"]').val(contact_name.join(','));
|
||||
$('[name="contact_mobile"]').val(contact_mobile.join(','));
|
||||
$('[name="contact_address"]').val(address.join(','));
|
||||
}
|
||||
oaPicker.picker(types,type,callback,map);
|
||||
});
|
||||
|
||||
//选择销售机会弹窗
|
||||
$('body').on('click','.chance-picker',function () {
|
||||
let customer_id = $('[name="customer_id"]').val();
|
||||
if(customer_id==0){
|
||||
layer.msg('请先选择客户');
|
||||
return false;
|
||||
}
|
||||
let that = $(this),ids = [],titles=[],map = {cid:customer_id};
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].title);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
}
|
||||
let opts={
|
||||
"title":"选择机会线索",
|
||||
"url": "/customer/api/get_chance",
|
||||
"ids":"",
|
||||
"titles":"",
|
||||
"area": ['720px', '580px'],
|
||||
"cols":[{field: 'id',width: 80,title:'序号',align:'center'},{field:'title',title:'机会主题'},{field:'expected_amount',title:'预计签单金额',width: 100},{field:'expected_time',title:'预计签单日期',width: 100}]
|
||||
}
|
||||
oaPicker.picker(opts,1,callback,map);
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/contract/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,135 @@
|
||||
<tr>
|
||||
<td colspan="6"><strong>产品信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="productAdd">+ 添加产品</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table id="productTable" class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">产品名称</th>
|
||||
<th width="100">单位</th>
|
||||
<th width="100">规格</th>
|
||||
<th width="100">销售单价</th>
|
||||
<th width="100">数量</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
<th width="60">操作</th>
|
||||
</tr>
|
||||
{empty name="$detail.content_array"}
|
||||
<tr class="product-tr">
|
||||
{eq name="is_product" value="1"}
|
||||
<td><input type="text" name="product_title[]" value="" class="layui-input product-picker" readonly lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>
|
||||
{else/}
|
||||
<td><input type="text" name="product_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>
|
||||
{/eq}
|
||||
<td><input type="text" name="product_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
|
||||
<td><input type="text" name="product_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品规格"></td>
|
||||
<td><input type="text" name="product_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入销售单价"></td>
|
||||
<td><input type="text" name="product_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入产品数量"></td>
|
||||
<td><input type="text" name="product_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="product_remark[]" value="" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
{else/}
|
||||
{volist name="$detail.content_array" id="vo"}
|
||||
<tr class="product-tr">
|
||||
{eq name="is_product" value="1"}
|
||||
<td><input type="text" name="product_title[]" value="{$vo.product_title|default=''}" class="layui-input product-picker" readonly lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="{$vo.product_id|default=0}"></td>
|
||||
{else/}
|
||||
<td><input type="text" name="product_title[]" value="{$vo.product_title|default=''}" class="layui-input" lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="{$vo.product_id|default=0}"></td>
|
||||
{/eq}
|
||||
<td><input type="text" name="product_unit[]" value="{$vo.product_unit|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
|
||||
<td><input type="text" name="product_specs[]" value="{$vo.product_specs|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入产品规格"></td>
|
||||
<td><input type="text" name="product_price[]" value="{$vo.product_price|default='0.00'}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入销售单价"></td>
|
||||
<td><input type="text" name="product_num[]" value="{$vo.product_num|default=0}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入产品数量"></td>
|
||||
<td><input type="text" name="product_subtotal[]" value="{$vo.product_subtotal|default='0.00'}" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="product_remark[]" value="{$vo.product_remark|default=''}" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{/empty}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<script>
|
||||
const is_product={$is_product};
|
||||
function product_fun(layui){
|
||||
let form = layui.form,oaPicker = layui.oaPicker;
|
||||
|
||||
//选择物品弹窗
|
||||
$('body').on('click','.product-picker',function () {
|
||||
let that = $(this),ids = [],titles=[],sale_price=[],unit=[],specs=[],map = {},types = 'product',type = 1;
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].title);
|
||||
unit.push(data[i].unit);
|
||||
specs.push(data[i].specs);
|
||||
sale_price.push(data[i].sale_price);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
that.parents('.product-tr').find('input').eq(2).val(unit.join(','));
|
||||
that.parents('.product-tr').find('input').eq(3).val(specs.join(','));
|
||||
that.parents('.product-tr').find('input').eq(4).val(sale_price.join(','));
|
||||
that.parents('.product-tr').find('input').eq(6).val(sale_price.join(','));
|
||||
count_cost();
|
||||
}
|
||||
oaPicker.picker(types,type,callback,map);
|
||||
});
|
||||
|
||||
//添加产品信息表格
|
||||
$('#productAdd').on('click',function(){
|
||||
var html = '',product_title=' class="layui-input"';
|
||||
if(is_product==1){
|
||||
product_title=' class="layui-input product-picker" readonly';
|
||||
}
|
||||
html += '<tr class="product-tr">\
|
||||
<td><input type="text" name="product_title[]" value="" '+product_title+' lay-verify="required" lay-reqText="请完善产品名称"><input type="hidden" name="product_id[]" value="0"></td>\
|
||||
<td><input type="text" name="product_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>\
|
||||
<td><input type="text" name="product_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品规格"></td>\
|
||||
<td><input type="text" name="product_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入销售单价"></td>\
|
||||
<td><input type="text" name="product_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入产品数量"></td>\
|
||||
<td><input type="text" name="product_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
|
||||
<td><input type="text" name="product_remark[]" value="" class="layui-input"></td>\
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
|
||||
</tr>';
|
||||
$('#productTable').append(html).find('.tr-none').remove();
|
||||
form.render();
|
||||
});
|
||||
|
||||
$('#productTable').on('click', '[lay-event="del"]', function() {
|
||||
if($('.product-tr').length<2){
|
||||
layer.msg('至少保留一个产品选项');
|
||||
return false;
|
||||
}
|
||||
$(this).parents('.product-tr').remove();
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算价格
|
||||
$('#productTable').on('input', '.input-num', function() {
|
||||
var inputs = $(this).parents('.product-tr').find("input");
|
||||
var product_price = inputs.eq(4).val();
|
||||
var product_num = inputs.eq(5).val();
|
||||
var product_amount = (product_price*product_num).toFixed(2);
|
||||
if(isNaN(product_amount)){
|
||||
product_amount = 0.00;
|
||||
}
|
||||
inputs.eq(6).val(product_amount);
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算总价
|
||||
function count_cost(){
|
||||
var product_subtotal = $('#productTable').find('[name="product_subtotal[]"]');
|
||||
var total = 0;
|
||||
for (var m = 0; m < product_subtotal.length; m++) {
|
||||
total+=$(product_subtotal[m]).val()*1000;
|
||||
}
|
||||
if(isNaN(total)){
|
||||
total = 0;
|
||||
}
|
||||
$('[name="cost"]').val((total/1000).toFixed(2));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,127 @@
|
||||
<tr>
|
||||
<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="serviceAdd">+ 添加服务</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table id="serviceTable" class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">服务名称</th>
|
||||
<th width="200">服务周期</th>
|
||||
<th width="100">服务单价</th>
|
||||
<th width="100">服务次数</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
<th width="60">操作</th>
|
||||
</tr>
|
||||
{empty name="$detail.content_array"}
|
||||
<tr class="service-tr">
|
||||
{eq name="is_service" value="1"}
|
||||
<td><input type="text" name="service_title[]" value="" class="layui-input service-picker" readonly lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>
|
||||
{else/}
|
||||
<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>
|
||||
{/eq}
|
||||
<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
|
||||
<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
|
||||
<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
|
||||
<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
{else/}
|
||||
{volist name="$detail.content_array" id="vo"}
|
||||
<tr class="service-tr">
|
||||
{eq name="is_service" value="1"}
|
||||
<td><input type="text" name="service_title[]" value="{$vo.service_title|default=''}" class="layui-input service-picker" readonly lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="{$vo.service_id|default='0'}"></td>
|
||||
{else/}
|
||||
<td><input type="text" name="service_title[]" value="{$vo.service_title|default=''}" class="layui-input" lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="{$vo.service_id|default='0'}"></td>
|
||||
{/eq}
|
||||
<td><input type="text" name="service_date[]" value="{$vo.service_date|default=''}" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
|
||||
<td><input type="text" name="service_price[]" value="{$vo.service_price|default='0.00'}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
|
||||
<td><input type="text" name="service_num[]" value="{$vo.service_num|default=0}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
|
||||
<td><input type="text" name="service_subtotal[]" value="{$vo.service_subtotal|default='0.00'}" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="service_remark[]" value="{$vo.service_remark|default=''}" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{/empty}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<script>
|
||||
const is_service={$is_service};
|
||||
function product_fun(layui){
|
||||
let form = layui.form,oaPicker = layui.oaPicker;
|
||||
|
||||
//选择物品弹窗
|
||||
$('body').on('click','.service-picker',function () {
|
||||
let that = $(this),ids = [],titles=[],price=[],map = {},types = 'services',type = 1;
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].title);
|
||||
price.push(data[i].price);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
that.parents('.service-tr').find('input').eq(3).val(price.join(','));
|
||||
that.parents('.service-tr').find('input').eq(5).val(price.join(','));
|
||||
count_cost();
|
||||
}
|
||||
oaPicker.picker(types,type,callback,map);
|
||||
});
|
||||
|
||||
//添加服务信息表格
|
||||
$('#serviceAdd').on('click',function(){
|
||||
var html = '',service_title=' class="layui-input"';
|
||||
if(is_service==1){
|
||||
service_title=' class="layui-input service-picker" readonly';
|
||||
}
|
||||
html += '<tr class="service-tr">\
|
||||
<td><input type="text" name="service_title[]" value="" '+service_title+' lay-verify="required" lay-reqText="请完善服务名称"><input type="hidden" name="service_id[]" value="0"></td>\
|
||||
<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>\
|
||||
<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>\
|
||||
<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>\
|
||||
<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
|
||||
<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>\
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
|
||||
</tr>';
|
||||
$('#serviceTable').append(html).find('.tr-none').remove();
|
||||
form.render();
|
||||
});
|
||||
|
||||
$('#serviceTable').on('click', '[lay-event="del"]', function() {
|
||||
if($('.service-tr').length<2){
|
||||
layer.msg('至少保留一个服务选项');
|
||||
return false;
|
||||
}
|
||||
$(this).parents('.service-tr').remove();
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算价格
|
||||
$('#serviceTable').on('input', '.input-num', function() {
|
||||
var inputs = $(this).parents('.service-tr').find("input");
|
||||
var service_price = inputs.eq(3).val();
|
||||
var service_num = inputs.eq(4).val();
|
||||
var service_amount = (service_price*service_num).toFixed(2);
|
||||
if(isNaN(service_amount)){
|
||||
service_amount = 0.00;
|
||||
}
|
||||
inputs.eq(5).val(service_amount);
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算总价
|
||||
function count_cost(){
|
||||
var service_subtotal = $('#serviceTable').find('[name="service_subtotal[]"]');
|
||||
var total = 0;
|
||||
for (var m = 0; m < service_subtotal.length; m++) {
|
||||
total+=$(service_subtotal[m]).val()*1000;
|
||||
}
|
||||
if(isNaN(total)){
|
||||
total = 0;
|
||||
}
|
||||
$('[name="cost"]').val((total/1000).toFixed(2));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,177 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
|
||||
<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this"><a href="/contract/contract/stoplist">销售合同</a></li>
|
||||
<li><a href="/contract/purchase/stoplist">采购合同</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<form class="layui-form gg-form-bar border-x">
|
||||
<div class="layui-input-inline" style="width:128px;">
|
||||
<select name="types">
|
||||
<option value="">选择合同性质</option>
|
||||
<option value="1">普通合同</option>
|
||||
<option value="2">产品合同</option>
|
||||
<option value="3">服务合同</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:128px;">
|
||||
<select name="cate_id">
|
||||
<option value="">选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:220px;">
|
||||
<input type="text" name="keywords" placeholder="输入关键字,合同编号/合同名称" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px">
|
||||
<input type="hidden" name="tab" value="0" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<h3>中止合同</h3>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','tablePlus','laydatePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
|
||||
//日期范围
|
||||
var sign_time = new laydatePlus({'target':'sign_time'});
|
||||
var end_time = new laydatePlus({'target':'end_time'});
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_contract"
|
||||
, toolbar: "#toolbarDemo"
|
||||
,url: "/contract/contract/stoplist"
|
||||
,is_excel: true
|
||||
,page: true
|
||||
,limit: 20
|
||||
,cellMinWidth: 60
|
||||
,height: 'full-154'
|
||||
,cols: [[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'code',
|
||||
title: '合同编号',
|
||||
align: 'center',
|
||||
width: 150
|
||||
},{
|
||||
field: 'name',
|
||||
title: '合同名称',
|
||||
minWidth:240,
|
||||
templet: '<div><a data-href="/contract/contract/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
|
||||
},{
|
||||
field: 'cate_title',
|
||||
title: '合同类别',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},{
|
||||
field: 'types_name',
|
||||
title: '合同性质',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'interval_time',
|
||||
title: '合同有效时间',
|
||||
align: 'center',
|
||||
width: 268,
|
||||
templet: function (d) {
|
||||
var html = d.interval_time;
|
||||
if (d.delay > 0 && d.delay < 30) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
|
||||
}
|
||||
if (d.delay == 0) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'cost',
|
||||
title: '合同金额(元)',
|
||||
align: 'right',
|
||||
width: 100
|
||||
},{
|
||||
field: 'stop_name',
|
||||
title: '中止人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'stop_time',
|
||||
title: '中止日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'sign_name',
|
||||
title: '签定人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'sign_time',
|
||||
title: '签订日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'keeper_name',
|
||||
title: '保管人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'right',
|
||||
fixed:'right',
|
||||
title: '操作',
|
||||
width: 60,
|
||||
align: 'center',
|
||||
ignoreExport:true,
|
||||
templet: function (d) {
|
||||
var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
|
||||
return btn0;
|
||||
}
|
||||
}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(table_contract)',function (obj) {
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.side("/contract/contract/view?id="+data.id);
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,448 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="style"}
|
||||
<style>
|
||||
.layui-tab-title .layui-this{background-color:#fff;}
|
||||
.layui-tab-card,.layui-card{box-shadow:0 0 0 0 rgb(0 0 0 / 10%); border-radius:0; border-top:none;}
|
||||
#checkBox .pb-2{display:none;}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<h3 class="pb-2">合同详情</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同名称</td>
|
||||
<td colspan="3">{$detail.name}</td>
|
||||
<td class="layui-td-gray">合同编号</td>
|
||||
<td>{$detail.code}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">签约主体<span style="font-size:12px;">(乙方)</span></td>
|
||||
<td colspan="3">{$detail.subject_title}</td>
|
||||
<td class="layui-td-gray-2">合同始止日期</td>
|
||||
<td>{$detail.start_time} 至 {$detail.end_time}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">客户名称<span style="font-size:12px;">(甲方)</span></td>
|
||||
<td colspan="3">{$detail.customer}</td>
|
||||
<td class="layui-td-gray">签约客户代表</td>
|
||||
<td>{$detail.contact_name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">客户联系地址</td>
|
||||
<td colspan="3">{$detail.contact_address|default='-'}</td>
|
||||
<td class="layui-td-gray">客户联系电话</td>
|
||||
<td>{$detail.contact_mobile|default='-'}</td>
|
||||
</tr>
|
||||
{notempty name="$detail.chance"}
|
||||
<tr>
|
||||
<td class="layui-td-gray">关联机会线索</td>
|
||||
<td colspan="5">{$detail.chance} <span class="layui-btn layui-btn-normal layui-btn-xs side-a" data-href="/customer/chance/view/?id={$detail.chance_id}">详情</span></td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同金额</td>
|
||||
<td>{$detail.cost}</td>
|
||||
<td class="layui-td-gray">合同性质</td>
|
||||
<td>{$detail.types_name}</td>
|
||||
<td class="layui-td-gray">合同类别</td>
|
||||
<td>{$detail.cate_title}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6"><strong>签订信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合同签订人</td>
|
||||
<td>{$detail.sign_name}</td>
|
||||
<td class="layui-td-gray-2">合同所属部门</td>
|
||||
<td>{$detail.sign_department}</td>
|
||||
<td class="layui-td-gray-2">合同签订日期</td>
|
||||
<td>{$detail.sign_time}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合同制定人</td>
|
||||
<td>{$detail.prepared_name|default='-'}</td>
|
||||
<td class="layui-td-gray-2">合同保管人</td>
|
||||
<td>{$detail.keeper_name|default='-'} <span id="keeper" data-ids="{$detail.keeper_uid}" data-names="{$detail.keeper_name}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</span></td>
|
||||
<td class="layui-td-gray">合同共享人员</td>
|
||||
<td colspan="3">{$detail.share_names|default='-'} <span id="shares" data-ids="{$detail.share_ids}" data-names="{$detail.share_names}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</span></td>
|
||||
</tr>
|
||||
{eq name="$detail.types" value="2"}{include file="/contract/view_product"}{/eq}
|
||||
{eq name="$detail.types" value="3"}{include file="/contract/view_service"}{/eq}
|
||||
{notempty name="$detail.file_ids"}
|
||||
<tr>
|
||||
<td colspan="6"><strong>相关附件</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<div class="layui-row">
|
||||
{volist name="$detail.file_array" id="vo"}
|
||||
<div class="layui-col-md4">{:file_card($vo,'view')}</div>
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
{notempty name="$detail.remark"}
|
||||
<tr>
|
||||
<td colspan="6"><strong>备注信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">{$detail.remark}</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
|
||||
{notempty name="$detail.invoice"}
|
||||
<tr>
|
||||
<td colspan="6"><strong>申请开票记录</strong>『 已申请开票金额:<strong class="green">{$detail.has_invoice}</strong> 元,未申请开票金额:<strong class="red">{$detail.no_invoice}</strong> 元 』</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="layui-table layui-table-min" style="margin:0;">
|
||||
<tr>
|
||||
<th style="width:60px;">序号</th>
|
||||
<th style="width:150px;">发票金额(元)</th>
|
||||
<th style="width:150px;">发票状态</th>
|
||||
<th style="width:200px;">发票号码</th>
|
||||
<th style="width:150px;">发票日期</th>
|
||||
<th style="width:100px;">回款状态</th>
|
||||
<th style="width:100px;">申请人</th>
|
||||
<th style="width:150px;">申请时间</th>
|
||||
<th style="width:60px;">操作</th>
|
||||
</tr>
|
||||
{volist name="$detail.invoice" id="vo"}
|
||||
<tr>
|
||||
<td>{$vo.id}</td>
|
||||
<td><span class="green">{$vo.amount}</span></td>
|
||||
{eq name="$vo.open_status" value="1"}
|
||||
<td><span class="green">已开具</span></td>
|
||||
<td>{$vo.code}</td>
|
||||
<td>{$vo.open_time|date='Y-m-d'}</td>
|
||||
{else/}
|
||||
<td><span class="red">未开具</span></td>
|
||||
<td>-</td>
|
||||
<td>-</td>
|
||||
{/eq}
|
||||
<td>
|
||||
{eq name="$vo.enter_status" value="0"}<span class="red">未回款</span>{/eq}
|
||||
{eq name="$vo.enter_status" value="1"}<span class="blue">部分回款</span>{/eq}
|
||||
{eq name="$vo.enter_status" value="2"}<span class="green">全部回款</span>{/eq}
|
||||
</td>
|
||||
<td>{$vo.admin}</td>
|
||||
<td>{$vo.create_time | date='Y-m-d H:i:s'}</td>
|
||||
<td><span class="layui-btn layui-btn-normal layui-btn-xs side-a" data-href="/finance/invoice/view?id={$vo.id}">详情</span></td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
|
||||
{notempty name="$detail.income"}
|
||||
<tr>
|
||||
<td colspan="6"><strong>回款记录</strong>『 已回款金额:<strong class="green">{$detail.has_income}</strong> 元,未回款金额:<strong class="red">{$detail.no_income}</strong> 元 』</</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="layui-table layui-table-min" style="margin:0;">
|
||||
<tr>
|
||||
<th style="width:60px;">序号</th>
|
||||
<th style="width:150px;">到帐金额(元)</th>
|
||||
<th style="width:200px;">到账日期</th>
|
||||
<th style="width:100px;">到账操作人</th>
|
||||
<th style="width:150px;">操作时间</th>
|
||||
<th style="width:60px;">操作</th>
|
||||
</tr>
|
||||
{volist name="$detail.income" id="vo"}
|
||||
<tr>
|
||||
<td>{$vo.id}</td>
|
||||
<td><span class="green">{$vo.amount}</span></td>
|
||||
<td>{$vo.enter_time | date='Y-m-d'}</td>
|
||||
<td>{$vo.admin}</td>
|
||||
<td>{$vo.create_time | date='Y-m-d H:i:s'}</td>
|
||||
<td><span class="layui-btn layui-btn-normal layui-btn-xs side-a" data-href="/finance/income/view?id={$vo.invoice_id}">详情</span></td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
|
||||
<tr>
|
||||
<td colspan="6"><strong>合同情况</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">录入人</td>
|
||||
<td>{$detail.admin_name} </td>
|
||||
<td class="layui-td-gray">录入时间</td>
|
||||
<td colspan="3">{$detail.create_time}</td>
|
||||
</tr>
|
||||
{gt name="$detail.archive_time" value="0"}
|
||||
<tr>
|
||||
<td class="layui-td-gray">归档状态</td>
|
||||
<td>
|
||||
<span class="red">已归档</span>
|
||||
{if ($auth == 1) }
|
||||
<span class="layui-btn layui-btn-danger layui-btn-xs ml-4" data-event="archive" data-status="0">反确认归档</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td class="layui-td-gray">归档人</td>
|
||||
<td>{$detail.archive_name} </td>
|
||||
<td class="layui-td-gray">归档时间</td>
|
||||
<td>{$detail.archive_time|date='Y-m-d H:i:s'}</td>
|
||||
{else/}
|
||||
<td class="layui-td-gray">归档状态</td>
|
||||
<td colspan="5">
|
||||
<span class="green">未归档</span>
|
||||
{if ($auth == 1) AND ($detail.check_status == 2) }
|
||||
<span class="layui-btn layui-btn-xs ml-4" data-event="archive" data-status="1">确认归档</span>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
{/gt}
|
||||
|
||||
{gt name="$detail.stop_time" value="0"}
|
||||
<tr>
|
||||
<td class="layui-td-gray">中止人</td>
|
||||
<td>{$detail.stop_name}</td>
|
||||
<td class="layui-td-gray">中止时间</td>
|
||||
<td>{$detail.stop_time|date='Y-m-d H:i:s'}</td>
|
||||
<td colspan="2"><span class="layui-btn layui-btn-danger layui-btn-xs" data-event="stop" data-status="0">反中止合同</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">中止备注</td>
|
||||
<td colspan="5">{$detail.stop_remark|default='-'}</td>
|
||||
</tr>
|
||||
{/gt}
|
||||
|
||||
{gt name="$detail.void_time" value="0"}
|
||||
<tr>
|
||||
<td class="layui-td-gray">作废人</td>
|
||||
<td>{$detail.void_name}</td>
|
||||
<td class="layui-td-gray">作废时间</td>
|
||||
<td>{$detail.void_time|date='Y-m-d H:i:s'}</td>
|
||||
<td colspan="2"><span class="layui-btn layui-btn-danger layui-btn-xs" data-event="void" data-status="0">反作废合同</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">作废备注</td>
|
||||
<td colspan="5">{$detail.void_remark|default='-'}</td>
|
||||
</tr>
|
||||
{/gt}
|
||||
|
||||
<tr>
|
||||
<td class="layui-td-gray">
|
||||
<div>盖章合同文件</div>
|
||||
<div><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">文件上传</button></div>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
<div class="row" id="uploadBox">
|
||||
<input type="hidden" data-type="file" name="seal_ids" value="{$detail.seal_ids|default=''}">
|
||||
{volist name="$detail.seal_array" id="vo"}
|
||||
<div class="layui-col-md4" id="file_{$vo.id}">{:file_card($vo)}</div>
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="layui-tab layui-tab-card" style="margin:0; background-color:#fff;" 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" style="padding:0;">
|
||||
<div class="layui-tab-item layui-show" style="padding-top:12px; background-color:#fff;">
|
||||
{if ($detail.stop_time == 0) AND ($detail.void_time == 0) }
|
||||
<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}" class="px-3 pb-3"></div>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
{include file="/contract/view_log" /}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var contract_id = {$detail.id};
|
||||
var auth = {$auth};
|
||||
var archive = {$detail.archive_time};
|
||||
var moduleInit = ['tool','oaCheck','oaPicker','oaEdit','uploadPlus'];
|
||||
let checking_btn='<span class="layui-btn layui-btn-warm" data-event="stop" data-status="1">中止合同</span><span class="layui-btn layui-btn-danger" data-event="void" data-status="1">作废合同</span>';
|
||||
function gouguInit() {
|
||||
var tool = layui.tool,element = layui.element,oaCheck=layui.oaCheck,oaPicker=layui.oaPicker,uploadPlus=layui.uploadPlus;
|
||||
|
||||
var attachment = new uploadPlus({
|
||||
"attachment":{
|
||||
"uidDelete":true,//是否开启只有上传人自己才能删除自己的附件
|
||||
"ajaxSave":function(res){
|
||||
$.ajax({
|
||||
url: "/contract/api/contract_seal_ids",
|
||||
type:'post',
|
||||
data:{
|
||||
'id':contract_id,
|
||||
'seal_ids':res,
|
||||
},
|
||||
success: function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function(){
|
||||
location.reload();
|
||||
},1000)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
"ajaxDelete":function(res){
|
||||
$.ajax({
|
||||
url: "/contract/api/contract_seal_ids",
|
||||
type:'post',
|
||||
data:{
|
||||
'id':contract_id,
|
||||
'seal_ids':res,
|
||||
},
|
||||
success: function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function(){
|
||||
location.reload();
|
||||
},1000)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
element.on('tab(contract)', function(data){
|
||||
let index = data.index;
|
||||
if(index == 1){
|
||||
log();
|
||||
}
|
||||
});
|
||||
|
||||
oaCheck.init({
|
||||
check_name:'contract',
|
||||
checking_btn:checking_btn,
|
||||
check_reversed :function(){
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
let eventCallback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
parent.layui.pageTable.reload();
|
||||
setTimeout(function(){
|
||||
location.reload();
|
||||
},1200)
|
||||
}
|
||||
|
||||
//选择合同保管人弹窗
|
||||
$('body').on('click','#keeper',function () {
|
||||
let that = $(this);
|
||||
let ids=$(this).data('ids')+'',names = $(this).data('names')+'';
|
||||
oaPicker.employeeInit({
|
||||
ids:ids,
|
||||
names:names,
|
||||
type:1,//1是单选,2是多选
|
||||
callback:function(data){
|
||||
let select_id=[],select_name=[];
|
||||
for(var a=0; a<data.length;a++){
|
||||
select_id.push(data[a].id);
|
||||
select_name.push(data[a].name);
|
||||
}
|
||||
tool.post("/contract/contract/add", {'id':contract_id,'keeper_uid':select_id.join(','),'scene':'change'}, eventCallback);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//选择共享成员弹窗
|
||||
$('body').on('click','#shares',function () {
|
||||
let that = $(this);
|
||||
let ids=$(this).data('ids')+'',names = $(this).data('names')+'';
|
||||
oaPicker.employeeInit({
|
||||
ids:ids,
|
||||
names:names,
|
||||
type:2,//1是单选,2是多选
|
||||
callback:function(data){
|
||||
let select_id=[],select_name=[];
|
||||
for(var a=0; a<data.length;a++){
|
||||
select_id.push(data[a].id);
|
||||
select_name.push(data[a].name);
|
||||
}
|
||||
tool.post("/contract/contract/add", {'id':contract_id,'share_ids':select_id.join(','),'scene':'change'}, eventCallback);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//归档操作
|
||||
$('body').on('click','[data-event="archive"]',function(){
|
||||
let status = $(this).data('status');
|
||||
let tips = '合同归档后将不能进行任何数据操作,确定要提交归档?';
|
||||
if(status==0){
|
||||
tips = '确定要反归档操作?';
|
||||
}
|
||||
layer.confirm(tips, {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
tool.post("/contract/api/contract_archive", {id: contract_id,archive_status:status}, eventCallback);
|
||||
layer.close(index);
|
||||
});
|
||||
})
|
||||
|
||||
//中止操作
|
||||
$('body').on('click','[data-event="stop"]',function(){
|
||||
let status = $(this).data('status');
|
||||
if(status==1){
|
||||
layer.prompt({
|
||||
formType: 2,
|
||||
title: '请输入中止的理由',
|
||||
area: ['480px', '120px']
|
||||
}, function(value, index, elem){
|
||||
tool.post("/contract/api/contract_stop", {id: contract_id,stop_status:status,stop_remark:value}, eventCallback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
else{
|
||||
layer.confirm('确定要反中止该合同?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
tool.post("/contract/api/contract_stop", {id: contract_id,stop_status:status}, eventCallback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
//作废操作
|
||||
$('body').on('click','[data-event="void"]',function(){
|
||||
let status = $(this).data('status');
|
||||
if(status==1){
|
||||
layer.prompt({
|
||||
formType: 2,
|
||||
title: '请输入作废的理由',
|
||||
area: ['480px', '120px']
|
||||
}, function(value, index, elem){
|
||||
tool.post("/contract/api/contract_tovoid", {id: contract_id,void_status:status,void_remark:value}, eventCallback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
else{
|
||||
layer.confirm('确定要反作废该合同?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
tool.post("/contract/api/contract_tovoid", {id: contract_id,void_status:status}, eventCallback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,9 @@
|
||||
<div>
|
||||
<div id="logList" class="log-timeline p-3"></div>
|
||||
</div>
|
||||
<script>
|
||||
function log(){
|
||||
let oaEdit = layui.oaEdit;
|
||||
oaEdit.log('logList','Contract',contract_id);
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,36 @@
|
||||
<tr>
|
||||
<td colspan="6"><strong>产品信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">产品名称</th>
|
||||
<th width="100">单位</th>
|
||||
<th width="100">规格</th>
|
||||
<th width="100">销售单价</th>
|
||||
<th width="100">数量</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
</tr>
|
||||
{empty name="$detail.content_array"}
|
||||
<tr class="sale-tr">
|
||||
<td colspan="7" style="padding:12px; text-align:center; color:#999">暂无产品信息</td>
|
||||
</tr>
|
||||
{else/}
|
||||
{volist name="$detail.content_array" id="vo"}
|
||||
<tr class="sale-tr">
|
||||
<td style="text-align:left;">{$vo.product_title|default=''}</td>
|
||||
<td>{$vo.product_unit|default=''}</td>
|
||||
<td>{$vo.product_specs|default=''}</td>
|
||||
<td>{$vo.product_price|default='0.00'}</td>
|
||||
<td>{$vo.product_num|default='1'}</td>
|
||||
<td>{$vo.product_subtotal|default='0.00'}</td>
|
||||
<td style="text-align:left;">{$vo.product_remark|default=''}</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{/empty}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<tr>
|
||||
<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">服务名称</th>
|
||||
<th width="200">服务周期</th>
|
||||
<th width="100">服务单价</th>
|
||||
<th width="100">服务次数</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
</tr>
|
||||
{empty name="$detail.content_array"}
|
||||
<tr class="sale-tr">
|
||||
<td colspan="6" style="padding:12px text-align:center; color:#999">暂无服务信息</td>
|
||||
</tr>
|
||||
{else/}
|
||||
{volist name="$detail.content_array" id="vo"}
|
||||
<tr class="sale-tr">
|
||||
<td style="text-align:left;">{$vo.service_title|default=''}</td>
|
||||
<td>{$vo.service_date|default=''}</td>
|
||||
<td>{$vo.service_price|default='0.00'}</td>
|
||||
<td>{$vo.service_num|default='1'}</td>
|
||||
<td>{$vo.service_subtotal|default='0.00'}</td>
|
||||
<td style="text-align:left;">{$vo.service_remark|default=''}</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{/empty}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -0,0 +1,177 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
|
||||
<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this"><a href="/contract/contract/voidlist">销售合同</a></li>
|
||||
<li><a href="/contract/purchase/voidlist">采购合同</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<form class="layui-form gg-form-bar border-x">
|
||||
<div class="layui-input-inline" style="width:128px;">
|
||||
<select name="types">
|
||||
<option value="">选择合同性质</option>
|
||||
<option value="1">普通合同</option>
|
||||
<option value="2">产品合同</option>
|
||||
<option value="3">服务合同</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:128px;">
|
||||
<select name="cate_id">
|
||||
<option value="">选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:220px;">
|
||||
<input type="text" name="keywords" placeholder="输入关键字,合同编号/合同名称" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px">
|
||||
<input type="hidden" name="tab" value="0" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<h3>作废合同</h3>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','tablePlus','laydatePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
|
||||
//日期范围
|
||||
var sign_time = new laydatePlus({'target':'sign_time'});
|
||||
var end_time = new laydatePlus({'target':'end_time'});
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_contract"
|
||||
, toolbar: "#toolbarDemo"
|
||||
,url: "/contract/contract/voidlist"
|
||||
,is_excel: true
|
||||
,page: true
|
||||
,limit: 20
|
||||
,cellMinWidth: 60
|
||||
,height: 'full-154'
|
||||
,cols: [[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'code',
|
||||
title: '合同编号',
|
||||
align: 'center',
|
||||
width: 150
|
||||
},{
|
||||
field: 'name',
|
||||
title: '合同名称',
|
||||
minWidth:240,
|
||||
templet: '<div><a data-href="/contract/contract/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
|
||||
},{
|
||||
field: 'cate_title',
|
||||
title: '合同类别',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},{
|
||||
field: 'types_name',
|
||||
title: '合同性质',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'interval_time',
|
||||
title: '合同有效时间',
|
||||
align: 'center',
|
||||
width: 268,
|
||||
templet: function (d) {
|
||||
var html = d.interval_time;
|
||||
if (d.delay > 0 && d.delay < 30) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
|
||||
}
|
||||
if (d.delay == 0) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'cost',
|
||||
title: '合同金额(元)',
|
||||
align: 'right',
|
||||
width: 100
|
||||
},{
|
||||
field: 'void_name',
|
||||
title: '作废人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'void_time',
|
||||
title: '作废日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'sign_name',
|
||||
title: '签定人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'sign_time',
|
||||
title: '签订日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'keeper_name',
|
||||
title: '保管人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'right',
|
||||
fixed:'right',
|
||||
title: '操作',
|
||||
width: 60,
|
||||
align: 'center',
|
||||
ignoreExport:true,
|
||||
templet: function (d) {
|
||||
var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
|
||||
return btn0;
|
||||
}
|
||||
}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(table_contract)',function (obj) {
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.side("/contract/contract/view?id="+data.id);
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,136 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-1">新增产品</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">产品名称<font>*</font></td>
|
||||
<td colspan="3"><input type="text" name="title" autocomplete="off" placeholder="请输入产品名称" lay-verify="required" lay-reqText="请输入产品名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray">产品分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
|
||||
<option value="">请选择分类</option>
|
||||
{volist name=":set_recursion(get_base_data('ProductCate'))" id="v"}
|
||||
<option value="{$v.id}">{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray" rowspan="4">缩略图</td>
|
||||
<td rowspan="4" style="width: 150px; vertical-align:top:">
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">缩略图(尺寸:240x136)</button>
|
||||
<div class="layui-upload-list" id="demo1" style="width: 150px; height:80px; overflow: hidden;">
|
||||
<img src="" style="max-width: 100%; height:80px;" />
|
||||
<input type="hidden" name="thumb" value="">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">产品编码<font>*</font></td>
|
||||
<td><input type="text" name="code" autocomplete="off" value="{:get_codeno('PR')}" readonly class="layui-input" lay-verify="required" lay-reqText="请输入产品编码"></td>
|
||||
<td class="layui-td-gray">产品单位<font>*</font></td>
|
||||
<td><input type="text" name="unit" autocomplete="off" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品单位"></td>
|
||||
<td class="layui-td-gray">产品规格</td>
|
||||
<td><input type="text" name="specs" autocomplete="off" placeholder="请输入产品规格" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">销售价(元)<font>*</font></td>
|
||||
<td><input type="text" name="sale_price" autocomplete="off" placeholder="请输入产品销售价" lay-verify="required|number" lay-reqText="请输入产品销售价" class="layui-input"></td>
|
||||
<td class="layui-td-gray">成本价(元)</td>
|
||||
<td><input type="text" name="base_price" autocomplete="off" placeholder="请输入产品成本价" class="layui-input" lay-verify="number"></td>
|
||||
<td class="layui-td-gray">采购价(元)</td>
|
||||
<td><input type="text" name="purchase_price" autocomplete="off" placeholder="请输入产品采购价" class="layui-input" lay-verify="number"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">是否实物<font>*</font></td>
|
||||
<td colspan="7">
|
||||
<input type="radio" name="is_object" value="1" title="是" checked>
|
||||
<input type="radio" name="is_object" value="2" title="否" >
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">
|
||||
<div class="layui-input-inline">产品附件</div>
|
||||
<div class="layui-input-inline">
|
||||
<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
|
||||
</div>
|
||||
</td>
|
||||
<td colspan="7">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
<input type="hidden" id="fileBoxInput" data-type="file" name="file_ids" value="">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="vertical-align:top;">产品描述<font>*</font></td>
|
||||
<td colspan="7">
|
||||
<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-1">
|
||||
<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','tinymce','uploadPlus'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,upload = layui.upload,uploadPlus = layui.uploadPlus;
|
||||
|
||||
//封面上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1'
|
||||
, url: "/api/index/upload"
|
||||
, done: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.id);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//编辑器初始化
|
||||
var editor = layui.tinymce;
|
||||
var edit = editor.render({
|
||||
selector: "#container",
|
||||
images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
|
||||
height: 500
|
||||
});
|
||||
|
||||
//附件上传
|
||||
var attachment = new uploadPlus({
|
||||
"target":'uploadBtn',
|
||||
"targetBox":'uploadBox'
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
data.field.content = tinyMCE.editors['container'].getContent();
|
||||
if (data.field.content == '') {
|
||||
layer.msg('请先完善产品的描述内容');
|
||||
return false;
|
||||
}
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/product/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,180 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="style"}
|
||||
<style>
|
||||
.tree-left{width:220px; float:left; height:100%; overflow: scroll; border:1px solid #eeeeee; background-color:#fff; padding:12px 12px 12px 5px;}
|
||||
.tree-left h3{font-size:16px; height:30px; padding-left:10px; font-weight:800}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page" style="height:calc(100% - 40px); box-sizing: border-box;">
|
||||
<div class="tree-left">
|
||||
<h3>产品分类</h3>
|
||||
<div id="cate"></div>
|
||||
</div>
|
||||
<div class="body-table" style="margin-left:248px; overflow:hidden;">
|
||||
<form class="layui-form gg-form-bar border-x border-t">
|
||||
<div class="layui-input-inline" style="width:100px;">
|
||||
<select name="status">
|
||||
<option value="">选择状态</option>
|
||||
<option value="1">正常</option>
|
||||
<option value="0">禁用</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:300px;">
|
||||
<input type="text" name="keywords" placeholder="关键字,产品名称/产品编码" class="layui-input" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加产品</button>
|
||||
</div>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','tablePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus, tool = layui.tool,tree = layui.tree,form = layui.form;
|
||||
$.ajax({
|
||||
url: "/contract/api/get_productcate_tree",
|
||||
type:'get',
|
||||
success:function(res){
|
||||
//仅节点左侧图标控制收缩
|
||||
tree.render({
|
||||
elem: '#cate',
|
||||
data: res.trees,
|
||||
onlyIconControl: true, //是否仅允许节点左侧图标控制展开收缩
|
||||
click: function(obj){
|
||||
//layer.msg(JSON.stringify(obj.data));
|
||||
$('#cate').find('.layui-tree-main').removeClass('on');
|
||||
$(obj.elem).find('.layui-tree-main').eq(0).addClass('on');
|
||||
layui.pageTable.reload({
|
||||
where: {cate_id: obj.data.id},
|
||||
page:{curr:1}
|
||||
});
|
||||
$('[name="keywords"]').val('');
|
||||
$('[name="status"]').val('');
|
||||
form.render();
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
$('[lay-filter="reset"]').click(function(){
|
||||
$('#cate').find('.layui-tree-main').removeClass('on');
|
||||
});
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,toolbar: '#toolbarDemo'
|
||||
,title:'产品列表'
|
||||
,url: "/contract/product/datalist"
|
||||
,is_excel: true
|
||||
,cellMinWidth: 60
|
||||
,height: 'full-114'
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'code',width:150, title: '产品编码', align:'center'}
|
||||
,{field:'cate',width:150, title: '产品分类', align:'center'}
|
||||
,{field:'title',title: '产品名称',minWidth:240}
|
||||
,{field:'sale_price',width:100, title: '销售价(元)', align:'center','style':'color:#16b777'}
|
||||
,{field:'purchase_price',width:100, title: '采购价(元)', align:'center','style':'color:#1e9fff'}
|
||||
,{field:'base_price',width:100, title: '成本价(元)', align:'center','style':'color:#a233c6'}
|
||||
,{field:'unit',width:60, title: '单位', align:'center'}
|
||||
,{field:'specs',width:60, title: '规格', align:'center'}
|
||||
,{field:'status', title: '状态',width:60,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:150,fixed:'right', title: '操作', align:'center',templet: function(d){
|
||||
var html='';
|
||||
var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
|
||||
var btn1='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="disable">禁用</a>';
|
||||
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
|
||||
var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
if(d.status==1){
|
||||
html = '<div class="layui-btn-group">'+btn+btn1+btn3+'</div>';
|
||||
}
|
||||
else{
|
||||
html = '<div class="layui-btn-group">'+btn+btn2+btn3+'</div>';
|
||||
}
|
||||
return html;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(test)',function (obj) {
|
||||
if(obj.event === 'edit'){
|
||||
tool.side("/contract/product/add?id="+obj.data.id);
|
||||
}
|
||||
if(obj.event === 'view'){
|
||||
tool.side("/contract/product/view?id="+obj.data.id);
|
||||
}
|
||||
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/product/set", { 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/product/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
if(obj.event === 'del'){
|
||||
layer.confirm('确定要删除该产品吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.delete("/contract/product/del", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.addNew',function(){
|
||||
tool.side("/contract/product/add");
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function(data){
|
||||
layui.pageTable.reload({where:data.field,page:{curr:1}});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,142 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">编辑产品</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">产品名称<font>*</font></td>
|
||||
<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入产品名称" lay-verify="required" lay-reqText="请输入产品名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray">产品分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
|
||||
<option value="">请选择分类</option>
|
||||
{volist name=":set_recursion(get_base_data('ProductCate'))" id="v"}
|
||||
<option value="{$v.id}" {eq name="$v.id" value="$detail.cate_id"} selected{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray" rowspan="4">缩略图</td>
|
||||
<td rowspan="4" style="width: 150px; vertical-align:top:">
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">缩略图(尺寸:240x136)</button>
|
||||
<div class="layui-upload-list" id="demo1" style="width: 120px; height:66px; overflow: hidden;">
|
||||
<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:66px;" />
|
||||
<input type="hidden" name="thumb" value="{$detail.thumb}">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">产品编码<font>*</font></td>
|
||||
<td><input type="text" name="code" value="{$detail.code}" readonly class="layui-input" lay-verify="required"></td>
|
||||
<td class="layui-td-gray">产品单位<font>*</font></td>
|
||||
<td><input type="text" name="unit" autocomplete="off" value="{$detail.unit}" class="layui-input" lay-verify="required" lay-reqText="请输入产品单位"></td>
|
||||
<td class="layui-td-gray">产品规格</td>
|
||||
<td><input type="text" name="specs" autocomplete="off" value="{$detail.specs}" placeholder="请输入产品规格" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">销售价(元)<font>*</font></td>
|
||||
<td><input type="text" name="sale_price" value="{$detail.sale_price}" autocomplete="off" placeholder="请输入产品销售价" lay-verify="required|number" lay-reqText="请输入产品销售价" class="layui-input"></td>
|
||||
<td class="layui-td-gray">成本价(元)</td>
|
||||
<td><input type="text" name="base_price" value="{$detail.base_price}" lay-verify="number" autocomplete="off" placeholder="请输入产品成本价" class="layui-input"></td>
|
||||
<td class="layui-td-gray">采购价(元)</td>
|
||||
<td><input type="text" name="purchase_price" value="{$detail.purchase_price}" lay-verify="number" autocomplete="off" placeholder="请输入产品采购价" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">是否实物<font>*</font></td>
|
||||
<td colspan="7">
|
||||
<input type="radio" name="is_object" value="1" title="是" {eq name="$detail.is_object" value="1"} checked {/eq}>
|
||||
<input type="radio" name="is_object" value="2" title="否" {eq name="$detail.is_object" value="2"} checked {/eq}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">
|
||||
<div class="layui-input-inline">产品附件</div>
|
||||
<div class="layui-input-inline">
|
||||
<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
|
||||
</div>
|
||||
</td>
|
||||
<td colspan="7">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
|
||||
{notempty name="$detail.file_ids"}
|
||||
{volist name="$detail.file_array" id="vo"}
|
||||
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
|
||||
{/volist}
|
||||
{/notempty}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="vertical-align:top;">产品描述<font>*</font></td>
|
||||
<td colspan="7">
|
||||
<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-1">
|
||||
<input type="hidden" name="id" value="{$detail.id}">
|
||||
<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','tinymce','uploadPlus'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,upload = layui.upload,uploadPlus = layui.uploadPlus;
|
||||
|
||||
//封面上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1'
|
||||
, url: "/api/index/upload"
|
||||
, done: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.id);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//编辑器初始化
|
||||
var editor = layui.tinymce;
|
||||
var edit = editor.render({
|
||||
selector: "#container",
|
||||
images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
|
||||
height: 500
|
||||
});
|
||||
|
||||
//附件上传
|
||||
var attachment = new uploadPlus({
|
||||
"target":'uploadBtn',
|
||||
"targetBox":'uploadBox'
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
data.field.content = tinyMCE.editors['container'].getContent();
|
||||
if (data.field.content == '') {
|
||||
layer.msg('请先完善产品的描述内容');
|
||||
return false;
|
||||
}
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/product/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,77 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-4">
|
||||
<h3 class="pb-1">产品详情</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">产品名称</td>
|
||||
<td colspan="3">{$detail.title}</td>
|
||||
<td class="layui-td-gray">产品分类</td>
|
||||
<td>{$detail.cate}</td>
|
||||
<td class="layui-td-gray" rowspan="4">缩略图</td>
|
||||
<td rowspan="4" style="width:150px;">
|
||||
<div class="layui-upload-list" id="demo1" style="width: 150px; height:80px; overflow: hidden;">
|
||||
<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:66px;" />
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">产品编码</td>
|
||||
<td>{$detail.code}</td>
|
||||
<td class="layui-td-gray">产品单位</td>
|
||||
<td>{$detail.unit}</td>
|
||||
<td class="layui-td-gray">产品规格</td>
|
||||
<td>{$detail.specs}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">销售价(元)</td>
|
||||
<td>{$detail.sale_price}</td>
|
||||
<td class="layui-td-gray">成本价(元)</td>
|
||||
<td>{$detail.base_price}</td>
|
||||
<td class="layui-td-gray">采购价(元)</td>
|
||||
<td>{$detail.purchase_price}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">是否实物</td>
|
||||
<td colspan="7">
|
||||
{eq name="$detail.is_object" value="1"}是{/eq}
|
||||
{eq name="$detail.is_object" value="2"}否{/eq}
|
||||
</td>
|
||||
</tr>
|
||||
{notempty name="$detail.file_ids"}
|
||||
<tr>
|
||||
<td class="layui-td-gray">相关附件</td>
|
||||
<td colspan="7">
|
||||
<div class="layui-row">
|
||||
{volist name="$detail.file_array" id="vo"}
|
||||
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
<tr>
|
||||
<td class="layui-td-gray" colspan="8" style="text-align:left; color:#666"><strong>产品描述</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8">
|
||||
{$detail.content|raw}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,91 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-1">产品分类</h3>
|
||||
{eq name="$id" value="0"}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">父级分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name="$cates" id="v"}
|
||||
<option value="{$v.id}" {eq name="$pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">分类名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">描述</td>
|
||||
<td colspan="5"><textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea"></textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">父级分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name="$cates" id="v"}
|
||||
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">分类名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" value="{$detail.title}" lay-verify="required" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入排序,数字" value="0" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">描述</td>
|
||||
<td colspan="5"><textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea">{$detail.desc}</textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
{/eq}
|
||||
<div class="pt-3">
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<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'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function () {
|
||||
parent.location.reload();
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/productcate/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,86 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-3">
|
||||
<div class="gg-form-bar border-t border-x" style="padding-bottom:10px;">
|
||||
<button class="layui-btn layui-btn-sm add-menu">+ 添加产品分类</button>
|
||||
</div>
|
||||
<div>
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="switchStatus">
|
||||
<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="status" {{ d.status == 1 ? 'checked' : '' }}>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var treeTable = layui.treeTable, tool = layui.tool;
|
||||
|
||||
layui.pageTable = treeTable.render({
|
||||
elem: '#treeTable'
|
||||
,url: "/contract/productcate/datalist"
|
||||
,tree: { // treeTable 特定属性集
|
||||
customName: {name:'title'},
|
||||
data: {},
|
||||
view: {
|
||||
showIcon:false,
|
||||
expandAllDefault:true
|
||||
},
|
||||
async: {},
|
||||
callback: {}
|
||||
}
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field: 'sort', title: '排序',align:'center', width:80}
|
||||
,{field:'title', width:240, title: '分类名称'}
|
||||
,{field:'pid', title: '父级ID', width:80, align:'center'}
|
||||
,{field:'desc', title: '描述', }
|
||||
,{width:160,title: '操作', align:'center',templet: function(d){
|
||||
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">添加子分类</button><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]]
|
||||
,page:false
|
||||
//,skin:'line'
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
$('.add-menu').on('click', function(){
|
||||
tool.side('/contract/productcate/add');
|
||||
return;
|
||||
});
|
||||
|
||||
//操作按钮
|
||||
treeTable.on('tool(treeTable)', function (obj) {
|
||||
if (obj.event === 'add') {
|
||||
tool.side('/contract/productcate/add?pid='+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.side('/contract/productcate/add?id='+obj.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/productcate/del', { id: obj.data.id }, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,227 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2">新增采购合同</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同名称<font>*</font></td>
|
||||
<td colspan="3"><input type="text" name="name" value="" lay-verify="required" lay-reqText="请输入合同名称" autocomplete="off" placeholder="请输入合同名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray">合同性质</td>
|
||||
<td>
|
||||
<input type="hidden" name="types" value="{$types}">
|
||||
{eq name="$types" value="1" }普通采购{/eq}
|
||||
{eq name="$types" value="2" }物品采购{/eq}
|
||||
{eq name="$types" value="3" }服务采购{/eq}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">签约主体<span style="font-size:12px;">(甲方)</span><font>*</font></td>
|
||||
<td colspan="3">
|
||||
<select name="subject_id" lay-verify="required" lay-reqText="请选择签约主体公司">
|
||||
<option value="">请选择签约主体公司</option>
|
||||
{volist name=":get_base_data('Enterprise')" id="v"}
|
||||
<option value="{$v.id}">{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同始止日期<font>*</font></td>
|
||||
<td id="barDate" style="width:320px;">
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<input type="text" class="layui-input" id="start_time" value="" placeholder="选择时间区间" readonly name="start_time" lay-verify="required" lay-reqText="请选择合同开始时间">
|
||||
</div>
|
||||
~
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<input type="text" class="layui-input" id="end_time" value="" placeholder="选择时间区间" readonly name="end_time" lay-verify="required" lay-reqText="请选择合同结束时间">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">供应商名称<span style="font-size:12px;">(乙方)</span><font>*</font></td>
|
||||
<td colspan="3">
|
||||
{eq name="$is_supplier" value="1"}
|
||||
<input type="text" name="supplier" autocomplete="off" value="" readonly lay-verify="required" lay-reqText="请输入供应商名称" placeholder="请输入供应商名称" class="layui-input supplier-picker">
|
||||
{else/}
|
||||
<input type="text" name="supplier" autocomplete="off" value="" lay-verify="required" lay-reqText="请输入供应商名称" placeholder="请输入供应商名称" class="layui-input">
|
||||
{/eq}
|
||||
<input type="hidden" name="supplier_id" value="0">
|
||||
</td>
|
||||
<td class="layui-td-gray">签约供应商代表<font>*</font></td>
|
||||
<td><input type="text" name="contact_name" value="" autocomplete="off" lay-verify="required" lay-reqText="请输入供应商代表姓名" placeholder="请输入供应商代表姓名" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">供应商联系地址</td>
|
||||
<td colspan="3"><input type="text" name="contact_address" value="" autocomplete="off" placeholder="请输入供应商联系地址" class="layui-input"></td>
|
||||
<td class="layui-td-gray-3">供应商联系电话</td>
|
||||
<td><input type="text" name="contact_mobile" value="" autocomplete="off" placeholder="请输入供应商联系电话" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同金额<font>*</font></td>
|
||||
<td>
|
||||
{eq name="$types" value="1"}
|
||||
<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请输入合同金额,数字" placeholder="请输入合同金额,数字" autocomplete="off" class="layui-input">
|
||||
{/eq}
|
||||
{eq name="$types" value="2"}
|
||||
<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请完善物品信息" placeholder="完善物品信息,合同金额自动计算" readonly class="layui-input layui-input-readonly">
|
||||
{/eq}
|
||||
{eq name="$types" value="3"}
|
||||
<input type="text" name="cost" value="" lay-verify="required|number" lay-reqText="请完善服务信息" placeholder="完善服务信息,合同金额自动计算" readonly class="layui-input layui-input-readonly">
|
||||
{/eq}
|
||||
</td>
|
||||
<td class="layui-td-gray">合同类别<font>*</font></td>
|
||||
<td>
|
||||
<select name="cate_id" lay-verify="required" lay-reqText="请选择合同类别">
|
||||
<option value="">请选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">合同编号<font>*</font></td>
|
||||
<td><input type="text" name="code" value="{$codeno}" autocomplete="off" {eq name="$is_codeno" value="1"}readonly{/eq} lay-verify="required" lay-reqText="请输入合同编号" placeholder="请输入合同编号" class="layui-input"></td>
|
||||
</tr>
|
||||
<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="" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同签订人" placeholder="请选择合同签订人" class="layui-input picker-diy">
|
||||
<input type="hidden" name="sign_uid" value="0">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同所属部门<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="sign_department" value="" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同所属部门" placeholder="请选择合同所属部门" class="layui-input picker-oa" data-types="department">
|
||||
<input type="hidden" name="did" value="0">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同签订日期<font>*</font></td>
|
||||
<td><input type="text" name="sign_time" value="" readonly lay-verify="required" lay-reqText="请选择合同签订日期" placeholder="请选择合同签订日期" class="layui-input tool-time"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合同制定人</td>
|
||||
<td>
|
||||
<input type="text" name="prepared_name" value="" readonly placeholder="请选择合同制定人" class="layui-input picker-admin">
|
||||
<input type="hidden" name="prepared_uid" value="0">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同保管人</td>
|
||||
<td>
|
||||
<input type="text" name="keeper_name" value="" readonly placeholder="请选择合同保管人" class="layui-input picker-admin">
|
||||
<input type="hidden" name="keeper_uid" value="0">
|
||||
</td>
|
||||
<td class="layui-td-gray">合同共享人员</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="share_names" value="" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="share_ids" value="">
|
||||
</td>
|
||||
</tr>
|
||||
{eq name="$types" value="2"}{include file="/purchase/add_purchased"}{/eq}
|
||||
{eq name="$types" value="3"}{include file="/purchase/add_service"}{/eq}
|
||||
<tr>
|
||||
<td colspan="6"><strong>相关附件</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn"><i class="layui-icon"></i>附件上传</button>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
<input type="hidden" id="fileBoxInput" data-type="file" name="file_ids" value="">
|
||||
</div>
|
||||
</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="pt-4">
|
||||
<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','oaPicker','uploadPlus'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,laydate = layui.laydate, oaPicker = layui.oaPicker,uploadPlus = layui.uploadPlus;
|
||||
if(typeof purchased_fun==='function'){
|
||||
purchased_fun(layui);
|
||||
}
|
||||
if(typeof service_fun==='function'){
|
||||
service_fun(layui);
|
||||
}
|
||||
//日期范围
|
||||
laydate.render({
|
||||
elem: '#barDate',
|
||||
range: ['#start_time', '#end_time']
|
||||
});
|
||||
//附件上传
|
||||
var attachment = new uploadPlus({
|
||||
"target":'uploadBtn',
|
||||
"targetBox":'uploadBox'
|
||||
});
|
||||
|
||||
//选择员工弹窗
|
||||
$('body').on('click','.picker-diy',function () {
|
||||
let that = $(this);
|
||||
let ids=that.next().val()+'',names = that.val()+'';
|
||||
oaPicker.employeeInit({
|
||||
ids:ids,
|
||||
names:names,
|
||||
type:1,//1是单选,2是多选
|
||||
callback:function(data){
|
||||
//这里是选择后的回调方法,可以根据具体需求自定义写哦
|
||||
let select_id=[],select_name=[];
|
||||
for(var a=0; a<data.length;a++){
|
||||
select_id.push(data[a].id);
|
||||
select_name.push(data[a].name);
|
||||
}
|
||||
that.val(select_name.join(','));
|
||||
that.next().val(select_id.join(','));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//选择供应商弹窗
|
||||
$('body').on('click','.supplier-picker',function () {
|
||||
let that = $(this),ids = [],titles=[],contact_name=[],contact_mobile=[],address=[],map = {},types = 'supplier',type = 1;
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].title);
|
||||
contact_name.push(data[i].contact_name);
|
||||
contact_mobile.push(data[i].contact_mobile);
|
||||
address.push(data[i].address);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
$('[name="contact_name"]').val(contact_name.join(','));
|
||||
$('[name="contact_mobile"]').val(contact_mobile.join(','));
|
||||
$('[name="contact_address"]').val(address.join(','));
|
||||
}
|
||||
oaPicker.picker(types,type,callback,map);
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/purchase/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,116 @@
|
||||
<tr>
|
||||
<td colspan="6"><strong>物品信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="purchasedAdd">+ 添加物品</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table id="purchasedTable" class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">物品名称</th>
|
||||
<th width="100">单位</th>
|
||||
<th width="100">规格</th>
|
||||
<th width="100">采购单价</th>
|
||||
<th width="100">数量</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
<th width="60">操作</th>
|
||||
</tr>
|
||||
<tr class="purchased-tr">
|
||||
{eq name="is_purchased" value="1"}
|
||||
<td><input type="text" name="purchased_title[]" value="" class="layui-input purchased-picker" readonly lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>
|
||||
{else/}
|
||||
<td><input type="text" name="purchased_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>
|
||||
{/eq}
|
||||
<td><input type="text" name="purchased_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
|
||||
<td><input type="text" name="purchased_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品规格"></td>
|
||||
<td><input type="text" name="purchased_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入采购单价"></td>
|
||||
<td><input type="text" name="purchased_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入物品数量"></td>
|
||||
<td><input type="text" name="purchased_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="purchased_remark[]" value="" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<script>
|
||||
const is_purchased={$is_purchased};
|
||||
function purchased_fun(layui){
|
||||
let form = layui.form,oaPicker = layui.oaPicker;
|
||||
|
||||
//选择物品弹窗
|
||||
$('body').on('click','.purchased-picker',function () {
|
||||
let that = $(this),ids = [],titles=[],purchase_price=[],unit=[],specs=[],map = {},types = 'purchased',type = 1;
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].title);
|
||||
unit.push(data[i].unit);
|
||||
specs.push(data[i].specs);
|
||||
purchase_price.push(data[i].purchase_price);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
that.parents('.purchased-tr').find('input').eq(2).val(unit.join(','));
|
||||
that.parents('.purchased-tr').find('input').eq(3).val(specs.join(','));
|
||||
that.parents('.purchased-tr').find('input').eq(4).val(purchase_price.join(','));
|
||||
that.parents('.purchased-tr').find('input').eq(6).val(purchase_price.join(','));
|
||||
count_cost();
|
||||
}
|
||||
oaPicker.picker(types,type,callback,map);
|
||||
});
|
||||
|
||||
//添加物品信息表格
|
||||
$('#purchasedAdd').on('click',function(){
|
||||
var html = '',purchased_title=' class="layui-input"';
|
||||
if(is_purchased==1){
|
||||
purchased_title=' class="layui-input purchased-picker" readonly';
|
||||
}
|
||||
html += '<tr class="purchased-tr">\
|
||||
<td><input type="text" name="purchased_title[]" value="" '+purchased_title+' lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>\
|
||||
<td><input type="text" name="purchased_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>\
|
||||
<td><input type="text" name="purchased_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品规格"></td>\
|
||||
<td><input type="text" name="purchased_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入采购单价"></td>\
|
||||
<td><input type="text" name="purchased_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入物品数量"></td>\
|
||||
<td><input type="text" name="purchased_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
|
||||
<td><input type="text" name="purchased_remark[]" value="" class="layui-input"></td>\
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
|
||||
</tr>';
|
||||
$('#purchasedTable').append(html).find('.tr-none').remove();
|
||||
form.render();
|
||||
});
|
||||
|
||||
$('#purchasedTable').on('click', '[lay-event="del"]', function() {
|
||||
if($('.purchased-tr').length<2){
|
||||
layer.msg('至少保留一个物品选项');
|
||||
return false;
|
||||
}
|
||||
$(this).parents('.purchased-tr').remove();
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算价格
|
||||
$('#purchasedTable').on('input', '.input-num', function() {
|
||||
var inputs = $(this).parents('.purchased-tr').find("input");
|
||||
var purchased_price = inputs.eq(4).val();
|
||||
var purchased_num = inputs.eq(5).val();
|
||||
var purchased_amount = (purchased_price*purchased_num).toFixed(2);
|
||||
if(isNaN(purchased_amount)){
|
||||
purchased_amount = 0.00;
|
||||
}
|
||||
inputs.eq(6).val(purchased_amount);
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算总价
|
||||
function count_cost(){
|
||||
var purchased_subtotal = $('#purchasedTable').find('[name="purchased_subtotal[]"]');
|
||||
var total = 0;
|
||||
for (var m = 0; m < purchased_subtotal.length; m++) {
|
||||
total+=$(purchased_subtotal[m]).val()*1000;
|
||||
}
|
||||
if(isNaN(total)){
|
||||
total = 0;
|
||||
}
|
||||
$('[name="cost"]').val((total/1000).toFixed(2));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,82 @@
|
||||
<tr>
|
||||
<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="serviceAdd">+ 添加服务</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table id="serviceTable" class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">服务名称</th>
|
||||
<th width="200">服务周期</th>
|
||||
<th width="100">服务单价</th>
|
||||
<th width="100">服务次数</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
<th width="60">操作</th>
|
||||
</tr>
|
||||
<tr class="service-tr">
|
||||
<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入服务名称"></td>
|
||||
<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
|
||||
<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
|
||||
<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
|
||||
<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<script>
|
||||
function service_fun(layui){
|
||||
let form = layui.form;
|
||||
//添加服务信息表格
|
||||
$('#serviceAdd').on('click',function(){
|
||||
var html = '';
|
||||
html += '<tr class="service-tr">\
|
||||
<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入服务名称"></td>\
|
||||
<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>\
|
||||
<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>\
|
||||
<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>\
|
||||
<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
|
||||
<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>\
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
|
||||
</tr>';
|
||||
$('#serviceTable').append(html).find('.tr-none').remove();
|
||||
form.render();
|
||||
});
|
||||
|
||||
$('#serviceTable').on('click', '[lay-event="del"]', function() {
|
||||
if($('.service-tr').length<2){
|
||||
layer.msg('至少保留一个服务选项');
|
||||
return false;
|
||||
}
|
||||
$(this).parents('.service-tr').remove();
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算价格
|
||||
$('#serviceTable').on('input', '.input-num', function() {
|
||||
var inputs = $(this).parents('.service-tr').find("input");
|
||||
var service_price = inputs.eq(2).val();
|
||||
var service_num = inputs.eq(3).val();
|
||||
var service_amount = (service_price*service_num).toFixed(2);
|
||||
if(isNaN(service_amount)){
|
||||
service_amount = 0.00;
|
||||
}
|
||||
inputs.eq(4).val(service_amount);
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算总价
|
||||
function count_cost(){
|
||||
var service_subtotal = $('#serviceTable').find('[name="service_subtotal[]"]');
|
||||
var total = 0;
|
||||
for (var m = 0; m < service_subtotal.length; m++) {
|
||||
total+=$(service_subtotal[m]).val()*1000;
|
||||
}
|
||||
if(isNaN(total)){
|
||||
total = 0;
|
||||
}
|
||||
$('[name="cost"]').val((total/1000).toFixed(2));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,34 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2">新增合同</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td>选择合同性质</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="layui-btn-group">
|
||||
<a href="/contract/purchase/add?types=1" class="layui-btn">普通采购</a>
|
||||
<a href="/contract/purchase/add?types=2" class="layui-btn">物品采购</a>
|
||||
<a href="/contract/purchase/add?types=3" class="layui-btn">服务采购</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
{/block}
|
||||
{block name="copyright"}{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,178 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
|
||||
<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li><a href="/contract/contract/archivelist">销售合同</a></li>
|
||||
<li class="layui-this"><a href="/contract/purchase/archivelist">采购合同</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<form class="layui-form gg-form-bar border-x">
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="types">
|
||||
<option value="">选择合同性质</option>
|
||||
<option value="1">普通采购</option>
|
||||
<option value="2">物品采购</option>
|
||||
<option value="3">服务采购</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="cate_id">
|
||||
<option value="">选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:220px;">
|
||||
<input type="text" name="keywords" placeholder="输入关键字,合同编号/合同名称" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px">
|
||||
<input type="hidden" name="tab" value="0" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<h3>归档合同</h3>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const delay_num = {$delay_num|default=30};
|
||||
const moduleInit = ['tool','tablePlus','laydatePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
|
||||
//日期范围
|
||||
var sign_time = new laydatePlus({'target':'sign_time'});
|
||||
var end_time = new laydatePlus({'target':'end_time'});
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_contract"
|
||||
, toolbar: "#toolbarDemo"
|
||||
,url: "/contract/purchase/archivelist"
|
||||
,is_excel: true
|
||||
,page: true
|
||||
,limit: 20
|
||||
,cellMinWidth: 60
|
||||
,height: 'full-154'
|
||||
,cols: [[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'code',
|
||||
title: '合同编号',
|
||||
align: 'center',
|
||||
width: 150
|
||||
},{
|
||||
field: 'name',
|
||||
title: '合同名称',
|
||||
minWidth:240,
|
||||
templet: '<div><a data-href="/contract/purchase/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
|
||||
},{
|
||||
field: 'cate_title',
|
||||
title: '合同类别',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},{
|
||||
field: 'types_name',
|
||||
title: '合同性质',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'interval_time',
|
||||
title: '合同有效时间',
|
||||
align: 'center',
|
||||
width: 268,
|
||||
templet: function (d) {
|
||||
var html = d.interval_time;
|
||||
if (d.delay > 0 && d.delay < delay_num) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
|
||||
}
|
||||
if (d.delay == 0) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'cost',
|
||||
title: '合同金额(元)',
|
||||
align: 'right',
|
||||
width: 100
|
||||
},{
|
||||
field: 'archive_name',
|
||||
title: '归档人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'archive_time',
|
||||
title: '归档日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'sign_name',
|
||||
title: '签定人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'sign_time',
|
||||
title: '签订日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'keeper_name',
|
||||
title: '保管人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'right',
|
||||
fixed:'right',
|
||||
title: '操作',
|
||||
width: 60,
|
||||
align: 'center',
|
||||
ignoreExport:true,
|
||||
templet: function (d) {
|
||||
var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
|
||||
return btn0;
|
||||
}
|
||||
}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(table_contract)',function (obj) {
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.side("/contract/purchase/view?id="+data.id);
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,256 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
|
||||
<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">全部</li>
|
||||
<li>待我审批</li>
|
||||
<li>我已审批</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<form class="layui-form gg-form-bar border-x" id="barsearchform" lay-filter="barsearchform">
|
||||
{gt name="$is_auth" value="0"}
|
||||
<div class="layui-input-inline user-name" style="width:90px;">
|
||||
<input type="text" name="username" placeholder="选择签定人" class="layui-input picker-admin" readonly />
|
||||
<input type="text" name="uid" value="" style="display:none" />
|
||||
</div>
|
||||
{else/}
|
||||
{gt name="$is_leader" value="0"}
|
||||
<div class="layui-input-inline user-name" style="width:90px;">
|
||||
<input type="text" name="username" placeholder="选择签定人" class="layui-input picker-sub" readonly />
|
||||
<input type="text" name="uid" value="" style="display:none" />
|
||||
</div>
|
||||
{/gt}
|
||||
{/gt}
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="types">
|
||||
<option value="">选择合同性质</option>
|
||||
<option value="1">普通采购</option>
|
||||
<option value="2">物品采购</option>
|
||||
<option value="3">服务采购</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="cate_id">
|
||||
<option value="">选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="check_status">
|
||||
<option value="">选择审批状态</option>
|
||||
{volist name=":get_check_status()" id="vo"}
|
||||
<option value="{$key}">{$vo}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:220px;">
|
||||
<input type="text" name="keywords" placeholder="输入关键字,合同编号/合同名称" class="layui-input" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px">
|
||||
<input type="hidden" name="tab" value="0" />
|
||||
<input type="hidden" name="order_field" value=''>
|
||||
<input type="hidden" name="order_type" value=''>
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm" lay-event="add">
|
||||
<span>+ 添加合同</span>
|
||||
<i class="layui-icon layui-icon-down layui-font-12"></i>
|
||||
</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const delay_num = {$delay_num|default=30};
|
||||
const contract_types = [{"id":1,"title":"普通采购"},{"id":2,"title":"物品采购"},{"id":3,"title":"服务采购"}];
|
||||
const moduleInit = ['tool','tablePlus','oaPicker','laydatePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus,form = layui.form,dropdown = layui.dropdown,element = layui.element, tool = layui.tool,laydatePlus = layui.laydatePlus;
|
||||
|
||||
//tab切换
|
||||
element.on('tab(tab)', function(data){
|
||||
$('[name="tab"]').val(data.index);
|
||||
$("#barsearchform")[0].reset();
|
||||
let searchObject = form.val('barsearchform');
|
||||
layui.pageTable.reload({where:searchObject,page:{curr:1}});
|
||||
return false;
|
||||
});
|
||||
|
||||
//日期范围
|
||||
var sign_time = new laydatePlus({'target':'sign_time'});
|
||||
var end_time = new laydatePlus({'target':'end_time'});
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_contract"
|
||||
,title: "采购合同列表"
|
||||
,toolbar: "#toolbarDemo"
|
||||
,url: "/contract/purchase/datalist"
|
||||
,page: true
|
||||
,limit: 20
|
||||
,cellMinWidth: 80
|
||||
,height: 'full-154'
|
||||
,autoSort: false
|
||||
,cols: [[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
sort: true,
|
||||
width: 80
|
||||
},{ field: 'check_status', title: '审批状态', align: 'center', width: 110, templet: function (d) {
|
||||
var html = '<span class="check-status-color-' + d.check_status + '">『' + d.status_name + '』</span>';
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'code',
|
||||
title: '合同编号',
|
||||
align: 'center',
|
||||
width: 150
|
||||
},{
|
||||
field: 'name',
|
||||
title: '合同名称',
|
||||
minWidth:240,
|
||||
templet: '<div><a data-href="/contract/purchase/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
|
||||
},{
|
||||
field: 'types_name',
|
||||
title: '合同性质',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'cate_title',
|
||||
title: '合同类别',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},{
|
||||
field: 'end_time',
|
||||
title: '合同有效时间',
|
||||
align: 'center',
|
||||
sort: true,
|
||||
width: 268,
|
||||
templet: function (d) {
|
||||
var html = d.interval_time;
|
||||
if (d.delay > 0 && d.delay < delay_num) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
|
||||
}
|
||||
if (d.delay == 0) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">已过期</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',
|
||||
sort: true,
|
||||
width: 100
|
||||
},{
|
||||
field: 'right',
|
||||
fixed:'right',
|
||||
title: '操作',
|
||||
width: 120,
|
||||
align: 'center',
|
||||
ignoreExport:true,
|
||||
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.check_status==0 || d.check_status==4){
|
||||
return html+btn0+btn1+btn2+'</div>';
|
||||
}
|
||||
else{
|
||||
return btn0;
|
||||
}
|
||||
}
|
||||
}
|
||||
]]
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
table.on('toolbar(table_contract)', function(obj){
|
||||
var that = this;
|
||||
if (obj.event === 'add'){
|
||||
dropdown.render({
|
||||
elem: that,
|
||||
show: true, // 外部事件触发即显示
|
||||
data: contract_types,
|
||||
click: function(obj){
|
||||
tool.side("/contract/purchase/add?types="+obj.id);
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
table.on('tool(table_contract)',function (obj) {
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.side("/contract/purchase/view?id="+data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.side("/contract/purchase/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/purchase/del", { id: data.id }, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,228 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-2">编辑采购合同</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<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>{$detail.types_name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">签约主体(甲方)<font>*</font></td>
|
||||
<td colspan="3">
|
||||
<select name="subject_id" lay-verify="required" lay-reqText="请选择签约主体公司">
|
||||
<option value="">请选择签约主体公司</option>
|
||||
{volist name=":get_base_data('Enterprise')" 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-2">合同始止日期<font>*</font></td>
|
||||
<td id="barDate" style="width:320px;">
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<input type="text" class="layui-input" id="start_time" value="{$detail.start_time}" placeholder="选择时间区间" readonly name="start_time" lay-verify="required" lay-reqText="请选择合同开始时间">
|
||||
</div>
|
||||
~
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<input type="text" class="layui-input" id="end_time" value="{$detail.end_time}" placeholder="选择时间区间" readonly name="end_time" lay-verify="required" lay-reqText="请选择合同结束时间">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">供应商名称(乙方)<font>*</font></td>
|
||||
<td colspan="3">
|
||||
{eq name="$is_supplier" value="1"}
|
||||
<input type="text" name="supplier" autocomplete="off" value="{$detail.supplier}" readonly lay-verify="required" lay-reqText="请输入供应商名称" placeholder="请输入供应商名称" class="layui-input supplier-picker">
|
||||
{else/}
|
||||
<input type="text" name="supplier" autocomplete="off" value="{$detail.supplier}" lay-verify="required" lay-reqText="请输入供应商名称" placeholder="请输入供应商名称" class="layui-input">
|
||||
{/eq}
|
||||
<input type="hidden" name="supplier_id" value="{$detail.supplier_id}">
|
||||
</td>
|
||||
<td class="layui-td-gray-3">签约供应商代表<font>*</font></td>
|
||||
<td><input type="text" name="contact_name" value="{$detail.contact_name}" autocomplete="off" lay-verify="required" lay-reqText="请输入供应商代表姓名" placeholder="请输入供应商代表姓名" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">供应商联系地址</td>
|
||||
<td colspan="3"><input type="text" name="contact_address" value="{$detail.contact_address}" autocomplete="off" placeholder="请输入供应商联系地址" class="layui-input"></td>
|
||||
<td class="layui-td-gray-3">供应商联系电话</td>
|
||||
<td><input type="text" name="contact_mobile" value="{$detail.contact_mobile}" autocomplete="off" placeholder="请输入供应商联系电话" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同金额<font>*</font></td>
|
||||
<td>
|
||||
{eq name="$detail.types" value="1"}
|
||||
<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请输入合同金额,数字" placeholder="请输入合同金额,数字" autocomplete="off" class="layui-input">
|
||||
{/eq}
|
||||
{eq name="$detail.types" value="2"}
|
||||
<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请完善产品信息" placeholder="完善产品信息,合同金额自动计算" readonly class="layui-input layui-input-readonly">
|
||||
{/eq}
|
||||
{eq name="$detail.types" value="3"}
|
||||
<input type="text" name="cost" value="{$detail.cost}" lay-verify="required|number" lay-reqText="请完善服务信息" placeholder="完善服务信息,合同金额自动计算" readonly class="layui-input layui-input-readonly">
|
||||
{/eq}
|
||||
</td>
|
||||
<td class="layui-td-gray">合同类别<font>*</font></td>
|
||||
<td>
|
||||
<select name="cate_id" lay-verify="required" lay-reqText="请选择合同类别">
|
||||
<option value="">请选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}" {eq name="$vo.id" value="$detail.cate_id"} selected{/eq}>{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">合同编号<font>*</font></td>
|
||||
<td><input type="text" name="code" value="{$detail.code}" autocomplete="off" {eq name="$is_codeno" value="1"}readonly{/eq} lay-verify="required" lay-reqText="请输入合同编号" placeholder="请输入合同编号" class="layui-input"></td>
|
||||
</tr>
|
||||
<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 lay-verify="required" lay-reqText="请选择合同签订人" placeholder="请选择合同签订人" class="layui-input picker-diy">
|
||||
<input type="hidden" name="sign_uid" value="{$detail.sign_uid}">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同所属部门<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="sign_department" value="{$detail.sign_department}" autocomplete="off" readonly lay-verify="required" lay-reqText="请选择合同所属部门" placeholder="请选择合同所属部门" class="layui-input picker-oa" data-types="department">
|
||||
<input type="hidden" name="did" value="{$detail.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 tool-time"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合同制定人</td>
|
||||
<td>
|
||||
<input type="text" name="prepared_name" value="{$detail.prepared_name}" autocomplete="off" readonly placeholder="请选择合同制定人" class="layui-input picker-admin">
|
||||
<input type="hidden" name="prepared_uid" value="{$detail.prepared_uid}">
|
||||
</td>
|
||||
<td class="layui-td-gray-2">合同保管人</td>
|
||||
<td>
|
||||
<input type="text" name="keeper_name" value="{$detail.keeper_name}" autocomplete="off" readonly placeholder="请选择合同保管人" class="layui-input picker-admin">
|
||||
<input type="hidden" name="keeper_uid" value="{$detail.keeper_uid}">
|
||||
</td>
|
||||
<td class="layui-td-gray">合同共享人员</td>
|
||||
<td colspan="3">
|
||||
<input type="text" name="share_names" value="{$detail.share_names}" autocomplete="off" readonly placeholder="请选择共享人员" class="layui-input picker-admin" data-type="2">
|
||||
<input type="hidden" name="share_ids" value="{$detail.share_ids}">
|
||||
</td>
|
||||
</tr>
|
||||
{eq name="$detail.types" value="2"}{include file="/purchase/edit_purchased"}{/eq}
|
||||
{eq name="$detail.types" value="3"}{include file="/purchase/edit_service"}{/eq}
|
||||
<tr>
|
||||
<td colspan="6"><strong>相关附件</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">
|
||||
<button type="button" class="layui-btn layui-btn-sm" id="uploadBtn"><i class="layui-icon"></i>附件上传</button>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
|
||||
{notempty name="$detail.file_ids"}
|
||||
{volist name="$detail.file_array" id="vo"}
|
||||
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
|
||||
{/volist}
|
||||
{/notempty}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6"><strong>备注信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6"><textarea name="remark" placeholder="请输入备注信息" class="layui-textarea">{$detail.remark|default=''}</textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<input type="hidden" name="id" value="{$detail.id}">
|
||||
<input type="hidden" name="types" value="{$detail.types}">
|
||||
<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','oaPicker','uploadPlus'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,laydate = layui.laydate, oaPicker = layui.oaPicker,uploadPlus = layui.uploadPlus;
|
||||
if(typeof purchased_fun==='function'){
|
||||
purchased_fun(layui);
|
||||
}
|
||||
if(typeof service_fun==='function'){
|
||||
service_fun(layui);
|
||||
}
|
||||
//日期范围
|
||||
laydate.render({
|
||||
elem: '#barDate',
|
||||
range: ['#start_time', '#end_time']
|
||||
});
|
||||
//附件上传
|
||||
var attachment = new uploadPlus({
|
||||
"target":'uploadBtn',
|
||||
"targetBox":'uploadBox'
|
||||
});
|
||||
//选择员工弹窗
|
||||
$('body').on('click','.picker-diy',function () {
|
||||
let that = $(this);
|
||||
let ids=that.next().val()+'',names = that.val()+'';
|
||||
oaPicker.employeeInit({
|
||||
ids:ids,
|
||||
names:names,
|
||||
type:1,//1是单选,2是多选
|
||||
callback:function(data){
|
||||
//这里是选择后的回调方法,可以根据具体需求自定义写哦
|
||||
let select_id=[],select_name=[];
|
||||
for(var a=0; a<data.length;a++){
|
||||
select_id.push(data[a].id);
|
||||
select_name.push(data[a].name);
|
||||
}
|
||||
that.val(select_name.join(','));
|
||||
that.next().val(select_id.join(','));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//选择供应商弹窗
|
||||
$('body').on('click','.supplier-picker',function () {
|
||||
let that = $(this),ids = [],titles=[],contact_name=[],contact_mobile=[],address=[],map = {},types = 'supplier',type = 1;
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].title);
|
||||
contact_name.push(data[i].contact_name);
|
||||
contact_mobile.push(data[i].contact_mobile);
|
||||
address.push(data[i].address);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
$('[name="contact_name"]').val(contact_name.join(','));
|
||||
$('[name="contact_mobile"]').val(contact_mobile.join(','));
|
||||
$('[name="contact_address"]').val(address.join(','));
|
||||
}
|
||||
oaPicker.picker(types,type,callback,map);
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/purchase/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,135 @@
|
||||
<tr>
|
||||
<td colspan="6"><strong>物品信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="purchasedAdd">+ 添加物品</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table id="purchasedTable" class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">物品名称</th>
|
||||
<th width="100">单位</th>
|
||||
<th width="100">规格</th>
|
||||
<th width="100">采购单价</th>
|
||||
<th width="100">数量</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
<th width="60">操作</th>
|
||||
</tr>
|
||||
{empty name="$detail.content_array"}
|
||||
<tr class="purchased-tr">
|
||||
{eq name="is_purchased" value="1"}
|
||||
<td><input type="text" name="purchased_title[]" value="" class="layui-input purchased-picker" readonly lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>
|
||||
{else/}
|
||||
<td><input type="text" name="purchased_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>
|
||||
{/eq}
|
||||
<td><input type="text" name="purchased_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
|
||||
<td><input type="text" name="purchased_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品规格"></td>
|
||||
<td><input type="text" name="purchased_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入采购单价"></td>
|
||||
<td><input type="text" name="purchased_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入物品数量"></td>
|
||||
<td><input type="text" name="purchased_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="purchased_remark[]" value="" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
{else/}
|
||||
{volist name="$detail.content_array" id="vo"}
|
||||
<tr class="purchased-tr">
|
||||
{eq name="is_purchased" value="1"}
|
||||
<td><input type="text" name="purchased_title[]" value="{$vo.purchased_title|default=''}" class="layui-input purchased-picker" readonly lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="{$vo.purchased_id|default=0}"></td>
|
||||
{else/}
|
||||
<td><input type="text" name="purchased_title[]" value="{$vo.purchased_title|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="{$vo.purchased_id|default=0}"></td>
|
||||
{/eq}
|
||||
<td><input type="text" name="purchased_unit[]" value="{$vo.purchased_unit|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>
|
||||
<td><input type="text" name="purchased_specs[]" value="{$vo.purchased_specs|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入物品规格"></td>
|
||||
<td><input type="text" name="purchased_price[]" value="{$vo.purchased_price|default='0.00'}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入采购单价"></td>
|
||||
<td><input type="text" name="purchased_num[]" value="{$vo.purchased_num|default=0}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入物品数量"></td>
|
||||
<td><input type="text" name="purchased_subtotal[]" value="{$vo.purchased_subtotal|default='0.00'}" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="purchased_remark[]" value="{$vo.purchased_remark|default=''}" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{/empty}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<script>
|
||||
const is_purchased={$is_purchased};
|
||||
function purchased_fun(layui){
|
||||
let form = layui.form,oaPicker = layui.oaPicker;
|
||||
|
||||
//选择物品弹窗
|
||||
$('body').on('click','.purchased-picker',function () {
|
||||
let that = $(this),ids = [],titles=[],purchase_price=[],unit=[],specs=[],map = {},types = 'purchased',type = 1;
|
||||
let callback = function(data){
|
||||
for ( var i = 0; i <data.length; i++){
|
||||
ids.push(data[i].id);
|
||||
titles.push(data[i].title);
|
||||
unit.push(data[i].unit);
|
||||
specs.push(data[i].specs);
|
||||
purchase_price.push(data[i].purchase_price);
|
||||
}
|
||||
that.val(titles.join(','));
|
||||
that.next().val(ids.join(','));
|
||||
that.parents('.purchased-tr').find('input').eq(2).val(unit.join(','));
|
||||
that.parents('.purchased-tr').find('input').eq(3).val(specs.join(','));
|
||||
that.parents('.purchased-tr').find('input').eq(4).val(purchase_price.join(','));
|
||||
that.parents('.purchased-tr').find('input').eq(6).val(purchase_price.join(','));
|
||||
count_cost();
|
||||
}
|
||||
oaPicker.picker(types,type,callback,map);
|
||||
});
|
||||
|
||||
//添加物品信息表格
|
||||
$('#purchasedAdd').on('click',function(){
|
||||
var html = '',purchased_title=' class="layui-input"';
|
||||
if(is_purchased==1){
|
||||
purchased_title=' class="layui-input purchased-picker" readonly';
|
||||
}
|
||||
html += '<tr class="purchased-tr">\
|
||||
<td><input type="text" name="purchased_title[]" value="" '+purchased_title+' lay-verify="required" lay-reqText="请输入物品名称"><input type="hidden" name="purchased_id[]" value="0"></td>\
|
||||
<td><input type="text" name="purchased_unit[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入单位"></td>\
|
||||
<td><input type="text" name="purchased_specs[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入物品规格"></td>\
|
||||
<td><input type="text" name="purchased_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入采购单价"></td>\
|
||||
<td><input type="text" name="purchased_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入物品数量"></td>\
|
||||
<td><input type="text" name="purchased_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
|
||||
<td><input type="text" name="purchased_remark[]" value="" class="layui-input"></td>\
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
|
||||
</tr>';
|
||||
$('#purchasedTable').append(html).find('.tr-none').remove();
|
||||
form.render();
|
||||
});
|
||||
|
||||
$('#purchasedTable').on('click', '[lay-event="del"]', function() {
|
||||
if($('.purchased-tr').length<2){
|
||||
layer.msg('至少保留一个物品选项');
|
||||
return false;
|
||||
}
|
||||
$(this).parents('.purchased-tr').remove();
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算价格
|
||||
$('#purchasedTable').on('input', '.input-num', function() {
|
||||
var inputs = $(this).parents('.purchased-tr').find("input");
|
||||
var purchased_price = inputs.eq(4).val();
|
||||
var purchased_num = inputs.eq(5).val();
|
||||
var purchased_amount = (purchased_price*purchased_num).toFixed(2);
|
||||
if(isNaN(purchased_amount)){
|
||||
purchased_amount = 0.00;
|
||||
}
|
||||
inputs.eq(6).val(purchased_amount);
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算总价
|
||||
function count_cost(){
|
||||
var purchased_subtotal = $('#purchasedTable').find('[name="purchased_subtotal[]"]');
|
||||
var total = 0;
|
||||
for (var m = 0; m < purchased_subtotal.length; m++) {
|
||||
total+=$(purchased_subtotal[m]).val()*1000;
|
||||
}
|
||||
if(isNaN(total)){
|
||||
total = 0;
|
||||
}
|
||||
$('[name="cost"]').val((total/1000).toFixed(2));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,96 @@
|
||||
<tr>
|
||||
<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong> <span class="layui-btn layui-btn-sm" type="button" id="serviceAdd">+ 添加服务</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table id="serviceTable" class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">服务名称</th>
|
||||
<th width="200">服务周期</th>
|
||||
<th width="100">服务单价</th>
|
||||
<th width="100">服务次数</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
<th width="60">操作</th>
|
||||
</tr>
|
||||
{empty name="$detail.content_array"}
|
||||
<tr class="service-tr">
|
||||
<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入服务名称"></td>
|
||||
<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
|
||||
<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
|
||||
<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
|
||||
<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
{else/}
|
||||
{volist name="$detail.content_array" id="vo"}
|
||||
<tr class="service-tr">
|
||||
<td><input type="text" name="service_title[]" value="{$vo.service_title|default=''}" class="layui-input" lay-verify="required" lay-reqText="请输入服务名称"></td>
|
||||
<td><input type="text" name="service_date[]" value="{$vo.service_date|default=''}" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>
|
||||
<td><input type="text" name="service_price[]" value="{$vo.service_price|default='0.00'}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>
|
||||
<td><input type="text" name="service_num[]" value="{$vo.service_num|default=0}" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>
|
||||
<td><input type="text" name="service_subtotal[]" value="{$vo.service_subtotal|default='0.00'}" class="layui-input layui-input-readonly" readonly></td>
|
||||
<td><input type="text" name="service_remark[]" value="{$vo.service_remark|default=''}" class="layui-input"></td>
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{/empty}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<script>
|
||||
function service_fun(layui){
|
||||
let form = layui.form;
|
||||
//添加服务信息表格
|
||||
$('#serviceAdd').on('click',function(){
|
||||
var html = '';
|
||||
html += '<tr class="service-tr">\
|
||||
<td><input type="text" name="service_title[]" value="" class="layui-input" lay-verify="required" lay-reqText="请输入服务名称"></td>\
|
||||
<td><input type="text" name="service_date[]" value="" class="layui-input layui-input-readonly tool-time" data-range="到" lay-verify="required" lay-reqText="请选择服务周期" readonly></td>\
|
||||
<td><input type="text" name="service_price[]" value="0.00" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务单价"></td>\
|
||||
<td><input type="text" name="service_num[]" value="1" class="layui-input input-num" lay-verify="required|number" lay-reqText="请输入服务次数"></td>\
|
||||
<td><input type="text" name="service_subtotal[]" value="0.00" class="layui-input layui-input-readonly" readonly></td>\
|
||||
<td><input type="text" name="service_remark[]" value="" class="layui-input"></td>\
|
||||
<td><a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a></td>\
|
||||
</tr>';
|
||||
$('#serviceTable').append(html).find('.tr-none').remove();
|
||||
form.render();
|
||||
});
|
||||
|
||||
$('#serviceTable').on('click', '[lay-event="del"]', function() {
|
||||
if($('.service-tr').length<2){
|
||||
layer.msg('至少保留一个服务选项');
|
||||
return false;
|
||||
}
|
||||
$(this).parents('.service-tr').remove();
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算价格
|
||||
$('#serviceTable').on('input', '.input-num', function() {
|
||||
var inputs = $(this).parents('.service-tr').find("input");
|
||||
var service_price = inputs.eq(2).val();
|
||||
var service_num = inputs.eq(3).val();
|
||||
var service_amount = (service_price*service_num).toFixed(2);
|
||||
if(isNaN(service_amount)){
|
||||
service_amount = 0.00;
|
||||
}
|
||||
inputs.eq(4).val(service_amount);
|
||||
count_cost();
|
||||
});
|
||||
|
||||
//计算总价
|
||||
function count_cost(){
|
||||
var service_subtotal = $('#serviceTable').find('[name="service_subtotal[]"]');
|
||||
var total = 0;
|
||||
for (var m = 0; m < service_subtotal.length; m++) {
|
||||
total+=$(service_subtotal[m]).val()*1000;
|
||||
}
|
||||
if(isNaN(total)){
|
||||
total = 0;
|
||||
}
|
||||
$('[name="cost"]').val((total/1000).toFixed(2));
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,177 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
|
||||
<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li><a href="/contract/contract/stoplist">销售合同</a></li>
|
||||
<li class="layui-this"><a href="/contract/purchase/stoplist">采购合同</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<form class="layui-form gg-form-bar border-x">
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="types">
|
||||
<option value="">选择合同性质</option>
|
||||
<option value="1">普通采购</option>
|
||||
<option value="2">物品采购</option>
|
||||
<option value="3">服务采购</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="cate_id">
|
||||
<option value="">选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:220px;">
|
||||
<input type="text" name="keywords" placeholder="输入关键字,合同编号/合同名称" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px">
|
||||
<input type="hidden" name="tab" value="0" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<h3>中止合同</h3>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','tablePlus','laydatePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
|
||||
//日期范围
|
||||
var sign_time = new laydatePlus({'target':'sign_time'});
|
||||
var end_time = new laydatePlus({'target':'end_time'});
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_contract"
|
||||
, toolbar: "#toolbarDemo"
|
||||
,url: "/contract/purchase/stoplist"
|
||||
,is_excel: true
|
||||
,page: true
|
||||
,limit: 20
|
||||
,cellMinWidth: 60
|
||||
,height: 'full-154'
|
||||
,cols: [[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'code',
|
||||
title: '合同编号',
|
||||
align: 'center',
|
||||
width: 150
|
||||
},{
|
||||
field: 'name',
|
||||
title: '合同名称',
|
||||
minWidth:240,
|
||||
templet: '<div><a data-href="/contract/purchase/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
|
||||
},{
|
||||
field: 'cate_title',
|
||||
title: '合同类别',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},{
|
||||
field: 'types_name',
|
||||
title: '合同性质',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'interval_time',
|
||||
title: '合同有效时间',
|
||||
align: 'center',
|
||||
width: 268,
|
||||
templet: function (d) {
|
||||
var html = d.interval_time;
|
||||
if (d.delay > 0 && d.delay < 30) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
|
||||
}
|
||||
if (d.delay == 0) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'cost',
|
||||
title: '合同金额(元)',
|
||||
align: 'right',
|
||||
width: 100
|
||||
},{
|
||||
field: 'stop_name',
|
||||
title: '中止人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'stop_time',
|
||||
title: '中止日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'sign_name',
|
||||
title: '签定人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'sign_time',
|
||||
title: '签订日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'keeper_name',
|
||||
title: '保管人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'right',
|
||||
fixed:'right',
|
||||
title: '操作',
|
||||
width: 60,
|
||||
align: 'center',
|
||||
ignoreExport:true,
|
||||
templet: function (d) {
|
||||
var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
|
||||
return btn0;
|
||||
}
|
||||
}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(table_contract)',function (obj) {
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.side("/contract/purchase/view?id="+data.id);
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,441 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="style"}
|
||||
<style>
|
||||
.layui-tab-title .layui-this{background-color:#fff;}
|
||||
.layui-tab-card,.layui-card{box-shadow:0 0 0 0 rgb(0 0 0 / 10%); border-radius:0; border-top:none;}
|
||||
#checkBox .pb-2{display:none;}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<h3 class="pb-2">采购合同详情</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同名称</td>
|
||||
<td colspan="3">{$detail.name}</td>
|
||||
<td class="layui-td-gray">合同编号</td>
|
||||
<td>{$detail.code}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">签约主体(甲方)</td>
|
||||
<td colspan="3">{$detail.subject_title}</td>
|
||||
<td class="layui-td-gray-2">合同始止日期</td>
|
||||
<td>{$detail.start_time} 至 {$detail.end_time}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">供应商名称(乙方)</td>
|
||||
<td colspan="3">{$detail.supplier}</td>
|
||||
<td class="layui-td-gray-3">签约供应商代表</td>
|
||||
<td>{$detail.contact_name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-3">供应商联系地址</td>
|
||||
<td colspan="3">{$detail.contact_address|default='-'}</td>
|
||||
<td class="layui-td-gray">供应商联系电话</td>
|
||||
<td>{$detail.contact_mobile|default='-'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">合同金额</td>
|
||||
<td>{$detail.cost}</td>
|
||||
<td class="layui-td-gray">合同性质</td>
|
||||
<td>{$detail.types_name}</td>
|
||||
<td class="layui-td-gray">合同类别</td>
|
||||
<td>{$detail.cate_title}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6"><strong>签订信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合同签订人</td>
|
||||
<td>{$detail.sign_name}</td>
|
||||
<td class="layui-td-gray-2">合同所属部门</td>
|
||||
<td>{$detail.sign_department}</td>
|
||||
<td class="layui-td-gray-2">合同签订日期</td>
|
||||
<td>{$detail.sign_time}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">合同制定人</td>
|
||||
<td>{$detail.prepared_name|default='-'}</td>
|
||||
<td class="layui-td-gray-2">合同保管人</td>
|
||||
<td>{$detail.keeper_name|default='-'} <span id="keeper" data-ids="{$detail.keeper_uid}" data-names="{$detail.keeper_name}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</span></td>
|
||||
<td class="layui-td-gray">合同共享人员</td>
|
||||
<td colspan="3">{$detail.share_names|default='-'} <span id="shares" data-ids="{$detail.share_ids}" data-names="{$detail.share_names}" class="layui-btn layui-btn-xs layui-btn-normal ml-1">更改</span></td>
|
||||
</tr>
|
||||
{eq name="$detail.types" value="2"}{include file="/purchase/view_purchased"}{/eq}
|
||||
{eq name="$detail.types" value="3"}{include file="/purchase/view_service"}{/eq}
|
||||
{notempty name="$detail.file_ids"}
|
||||
<tr>
|
||||
<td colspan="6"><strong>相关附件</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<div class="layui-row">
|
||||
{volist name="$detail.file_array" id="vo"}
|
||||
<div class="layui-col-md4">{:file_card($vo,'view')}</div>
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
{notempty name="$detail.remark"}
|
||||
<tr>
|
||||
<td colspan="6"><strong>备注信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">{$detail.remark}</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
|
||||
{notempty name="$detail.ticket"}
|
||||
<tr>
|
||||
<td colspan="6"><strong>申请收票记录</strong>『 已申请收票金额:<strong class="green">{$detail.has_ticket}</strong> 元,未申请收票金额:<strong class="red">{$detail.no_ticket}</strong> 元 』</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="layui-table layui-table-min" style="margin:0;">
|
||||
<tr>
|
||||
<th style="width:60px;">序号</th>
|
||||
<th style="width:150px;">发票金额(元)</th>
|
||||
<th style="width:150px;">发票状态</th>
|
||||
<th style="width:200px;">发票号码</th>
|
||||
<th style="width:150px;">发票日期</th>
|
||||
<th style="width:100px;">付款状态</th>
|
||||
<th style="width:100px;">申请人</th>
|
||||
<th style="width:150px;">申请时间</th>
|
||||
<th style="width:60px;">操作</th>
|
||||
</tr>
|
||||
{volist name="$detail.ticket" id="vo"}
|
||||
<tr>
|
||||
<td>{$vo.id}</td>
|
||||
<td><span class="green">{$vo.amount}</span></td>
|
||||
{eq name="$vo.open_status" value="1"}
|
||||
<td><span class="green">已开具</span></td>
|
||||
<td>{$vo.code}</td>
|
||||
<td>{$vo.open_time|date='Y-m-d'}</td>
|
||||
{else/}
|
||||
<td><span class="red">未开具</span></td>
|
||||
<td>-</td>
|
||||
<td>-</td>
|
||||
{/eq}
|
||||
<td>
|
||||
{eq name="$vo.pay_status" value="0"}<span class="red">未付款</span>{/eq}
|
||||
{eq name="$vo.pay_status" value="1"}<span class="blue">部分付款</span>{/eq}
|
||||
{eq name="$vo.pay_status" value="2"}<span class="green">全部付款</span>{/eq}
|
||||
</td>
|
||||
<td>{$vo.admin}</td>
|
||||
<td>{$vo.create_time | date='Y-m-d H:i:s'}</td>
|
||||
<td><span class="layui-btn layui-btn-normal layui-btn-xs side-a" data-href="/finance/ticket/view?id={$vo.id}">详情</span></td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
|
||||
{notempty name="$detail.payment"}
|
||||
<tr>
|
||||
<td colspan="6"><strong>付款记录</strong>『 已付款金额:<strong class="green">{$detail.has_payment}</strong> 元,未付款金额:<strong class="red">{$detail.no_payment}</strong> 元 』</</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="layui-table layui-table-min" style="margin:0;">
|
||||
<tr>
|
||||
<th style="width:60px;">序号</th>
|
||||
<th style="width:150px;">付款金额(元)</th>
|
||||
<th style="width:200px;">付款日期</th>
|
||||
<th style="width:100px;">付款操作人</th>
|
||||
<th style="width:150px;">操作时间</th>
|
||||
<th style="width:60px;">操作</th>
|
||||
</tr>
|
||||
{volist name="$detail.payment" id="vo"}
|
||||
<tr>
|
||||
<td>{$vo.id}</td>
|
||||
<td><span class="green">{$vo.amount}</span></td>
|
||||
<td>{$vo.pay_time | date='Y-m-d'}</td>
|
||||
<td>{$vo.admin}</td>
|
||||
<td>{$vo.create_time | date='Y-m-d H:i:s'}</td>
|
||||
<td><span class="layui-btn layui-btn-normal layui-btn-xs side-a" data-href="/finance/payment/view?id={$vo.ticket_id}">详情</span></td>
|
||||
</tr>
|
||||
{/volist}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
|
||||
<tr>
|
||||
<td colspan="6"><strong>合同情况</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">录入人</td>
|
||||
<td>{$detail.admin_name} </td>
|
||||
<td class="layui-td-gray">录入时间</td>
|
||||
<td colspan="3">{$detail.create_time}</td>
|
||||
</tr>
|
||||
{gt name="$detail.archive_time" value="0"}
|
||||
<tr>
|
||||
<td class="layui-td-gray">归档状态</td>
|
||||
<td>
|
||||
<span class="red">已归档</span>
|
||||
{if ($auth == 1) }
|
||||
<span class="layui-btn layui-btn-danger layui-btn-xs ml-4" data-event="archive" data-status="0">反确认归档</span>
|
||||
{/if}
|
||||
</td>
|
||||
<td class="layui-td-gray">归档人</td>
|
||||
<td>{$detail.archive_name} </td>
|
||||
<td class="layui-td-gray">归档时间</td>
|
||||
<td>{$detail.archive_time|date='Y-m-d H:i:s'}</td>
|
||||
{else/}
|
||||
<td class="layui-td-gray">归档状态</td>
|
||||
<td colspan="5">
|
||||
<span class="green">未归档</span>
|
||||
{if ($auth == 1) AND ($detail.check_status == 2) }
|
||||
<span class="layui-btn layui-btn-xs ml-4" data-event="archive" data-status="1">确认归档</span>
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
{/gt}
|
||||
|
||||
{gt name="$detail.stop_time" value="0"}
|
||||
<tr>
|
||||
<td class="layui-td-gray">中止人</td>
|
||||
<td>{$detail.stop_name}</td>
|
||||
<td class="layui-td-gray">中止时间</td>
|
||||
<td>{$detail.stop_time|date='Y-m-d H:i:s'}</td>
|
||||
<td colspan="2"><span class="layui-btn layui-btn-danger layui-btn-xs" data-event="stop" data-status="0">反中止合同</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">中止备注</td>
|
||||
<td colspan="5">{$detail.stop_remark|default='-'}</td>
|
||||
</tr>
|
||||
{/gt}
|
||||
|
||||
{gt name="$detail.void_time" value="0"}
|
||||
<tr>
|
||||
<td class="layui-td-gray">作废人</td>
|
||||
<td>{$detail.void_name}</td>
|
||||
<td class="layui-td-gray">作废时间</td>
|
||||
<td>{$detail.void_time|date='Y-m-d H:i:s'}</td>
|
||||
<td colspan="2"><span class="layui-btn layui-btn-danger layui-btn-xs" data-event="void" data-status="0">反作废合同</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">作废备注</td>
|
||||
<td colspan="5">{$detail.void_remark|default='-'}</td>
|
||||
</tr>
|
||||
{/gt}
|
||||
|
||||
<tr>
|
||||
<td class="layui-td-gray">
|
||||
<div>盖章合同文件</div>
|
||||
<div><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">文件上传</button></div>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
<div class="row" id="uploadBox">
|
||||
<input type="hidden" data-type="file" name="seal_ids" value="{$detail.seal_ids|default=''}">
|
||||
{volist name="$detail.seal_array" id="vo"}
|
||||
<div class="layui-col-md4" id="file_{$vo.id}">{:file_card($vo)}</div>
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="layui-tab layui-tab-card" style="margin:0; background-color:#fff;" lay-filter="purchase" id="purchaseTab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this" data-load="true">审批信息</li>
|
||||
<li>操作记录</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content" style="padding:0;">
|
||||
<div class="layui-tab-item layui-show" style="padding-top:12px; background-color:#fff;">
|
||||
{if ($detail.stop_time == 0) AND ($detail.void_time == 0) }
|
||||
<div id="checkBox" data-status="{$detail.check_status}" data-id="{$detail.id}" data-checkflowid="{$detail.check_flow_id}" class="px-3 pb-3"></div>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
{include file="/purchase/view_log" /}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
var purchase_id = {$detail.id};
|
||||
var auth = {$auth};
|
||||
var archive = {$detail.archive_time};
|
||||
var moduleInit = ['tool','oaCheck','oaPicker','oaEdit','uploadPlus'];
|
||||
let checking_btn='<span class="layui-btn layui-btn-warm" data-event="stop" data-status="1">中止合同</span><span class="layui-btn layui-btn-danger" data-event="void" data-status="1">作废合同</span>';
|
||||
function gouguInit() {
|
||||
var tool = layui.tool,element = layui.element,oaCheck=layui.oaCheck,oaPicker=layui.oaPicker,uploadPlus=layui.uploadPlus;
|
||||
|
||||
var attachment = new uploadPlus({
|
||||
"attachment":{
|
||||
"uidDelete":true,//是否开启只有上传人自己才能删除自己的附件
|
||||
"ajaxSave":function(res){
|
||||
$.ajax({
|
||||
url: "/contract/api/purchase_seal_ids",
|
||||
type:'post',
|
||||
data:{
|
||||
'id':purchase_id,
|
||||
'seal_ids':res,
|
||||
},
|
||||
success: function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function(){
|
||||
location.reload();
|
||||
},1000)
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
"ajaxDelete":function(res){
|
||||
$.ajax({
|
||||
url: "/contract/api/purchase_seal_ids",
|
||||
type:'post',
|
||||
data:{
|
||||
'id':purchase_id,
|
||||
'seal_ids':res,
|
||||
},
|
||||
success: function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function(){
|
||||
location.reload();
|
||||
},1000)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
element.on('tab(purchase)', function(data){
|
||||
let index = data.index;
|
||||
if(index == 1){
|
||||
log();
|
||||
}
|
||||
});
|
||||
|
||||
oaCheck.init({
|
||||
check_name:'purchase',
|
||||
checking_btn:checking_btn,
|
||||
check_reversed :function(){
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
let eventCallback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
parent.layui.pageTable.reload();
|
||||
setTimeout(function(){
|
||||
location.reload();
|
||||
},1200)
|
||||
}
|
||||
|
||||
//选择合同保管人弹窗
|
||||
$('body').on('click','#keeper',function () {
|
||||
let that = $(this);
|
||||
let ids=$(this).data('ids')+'',names = $(this).data('names')+'';
|
||||
oaPicker.employeeInit({
|
||||
ids:ids,
|
||||
names:names,
|
||||
type:1,//1是单选,2是多选
|
||||
callback:function(data){
|
||||
let select_id=[],select_name=[];
|
||||
for(var a=0; a<data.length;a++){
|
||||
select_id.push(data[a].id);
|
||||
select_name.push(data[a].name);
|
||||
}
|
||||
tool.post("/contract/purchase/add", {'id':purchase_id,'keeper_uid':select_id.join(','),'scene':'change'}, eventCallback);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//选择共享成员弹窗
|
||||
$('body').on('click','#shares',function () {
|
||||
let that = $(this);
|
||||
let ids=$(this).data('ids')+'',names = $(this).data('names')+'';
|
||||
oaPicker.employeeInit({
|
||||
ids:ids,
|
||||
names:names,
|
||||
type:2,//1是单选,2是多选
|
||||
callback:function(data){
|
||||
let select_id=[],select_name=[];
|
||||
for(var a=0; a<data.length;a++){
|
||||
select_id.push(data[a].id);
|
||||
select_name.push(data[a].name);
|
||||
}
|
||||
tool.post("/contract/purchase/add", {'id':purchase_id,'share_ids':select_id.join(','),'scene':'change'}, eventCallback);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//归档操作
|
||||
$('body').on('click','[data-event="archive"]',function(){
|
||||
let status = $(this).data('status');
|
||||
let tips = '合同归档后将不能进行任何数据操作,确定要提交归档?';
|
||||
if(status==0){
|
||||
tips = '确定要反归档操作?';
|
||||
}
|
||||
layer.confirm(tips, {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
tool.post("/contract/api/purchase_archive", {id: purchase_id,archive_status:status}, eventCallback);
|
||||
layer.close(index);
|
||||
});
|
||||
})
|
||||
|
||||
//中止操作
|
||||
$('body').on('click','[data-event="stop"]',function(){
|
||||
let status = $(this).data('status');
|
||||
if(status==1){
|
||||
layer.prompt({
|
||||
formType: 2,
|
||||
title: '请输入中止的理由',
|
||||
area: ['480px', '120px']
|
||||
}, function(value, index, elem){
|
||||
tool.post("/contract/api/purchase_stop", {id: purchase_id,stop_status:status,stop_remark:value}, eventCallback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
else{
|
||||
layer.confirm('确定要反中止该合同?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
tool.post("/contract/api/purchase_stop", {id: purchase_id,stop_status:status}, eventCallback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
//作废操作
|
||||
$('body').on('click','[data-event="void"]',function(){
|
||||
let status = $(this).data('status');
|
||||
if(status==1){
|
||||
layer.prompt({
|
||||
formType: 2,
|
||||
title: '请输入作废的理由',
|
||||
area: ['480px', '120px']
|
||||
}, function(value, index, elem){
|
||||
tool.post("/contract/api/purchase_tovoid", {id: purchase_id,void_status:status,void_remark:value}, eventCallback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
else{
|
||||
layer.confirm('确定要反作废该合同?', {
|
||||
icon: 3,
|
||||
title: '提示'
|
||||
}, function(index) {
|
||||
tool.post("/contract/api/purchase_tovoid", {id: purchase_id,void_status:status}, eventCallback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,9 @@
|
||||
<div>
|
||||
<div id="logList" class="log-timeline p-3"></div>
|
||||
</div>
|
||||
<script>
|
||||
function log(){
|
||||
let oaEdit = layui.oaEdit;
|
||||
oaEdit.log('logList','Purchase',purchase_id);
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,36 @@
|
||||
<tr>
|
||||
<td colspan="6"><strong>物品信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">物品名称</th>
|
||||
<th width="100">单位</th>
|
||||
<th width="100">规格</th>
|
||||
<th width="100">采购单价</th>
|
||||
<th width="100">数量</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
</tr>
|
||||
{empty name="$detail.content_array"}
|
||||
<tr class="sale-tr">
|
||||
<td colspan="7" style="padding:12px; text-align:center; color:#999">暂无物品信息</td>
|
||||
</tr>
|
||||
{else/}
|
||||
{volist name="$detail.content_array" id="vo"}
|
||||
<tr class="sale-tr">
|
||||
<td style="text-align:left;">{$vo.purchased_title|default=''}</td>
|
||||
<td>{$vo.purchased_unit|default=''}</td>
|
||||
<td>{$vo.purchased_specs|default=''}</td>
|
||||
<td>{$vo.purchased_price|default='0.00'}</td>
|
||||
<td>{$vo.purchased_num|default='1'}</td>
|
||||
<td>{$vo.purchased_subtotal|default='0.00'}</td>
|
||||
<td style="text-align:left;">{$vo.purchased_remark|default=''}</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{/empty}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<tr>
|
||||
<td class="layui-td-gray" colspan="6" style="text-align:left; color:#666"><strong>服务信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<table class="layui-table layui-table-min" style="margin:0">
|
||||
<tr>
|
||||
<th width="200">服务名称</th>
|
||||
<th width="200">服务周期</th>
|
||||
<th width="100">服务单价</th>
|
||||
<th width="100">服务次数</th>
|
||||
<th width="100">小计</th>
|
||||
<th>备注信息</th>
|
||||
</tr>
|
||||
{empty name="$detail.content_array"}
|
||||
<tr class="sale-tr">
|
||||
<td colspan="6" style="padding:12px text-align:center; color:#999">暂无服务信息</td>
|
||||
</tr>
|
||||
{else/}
|
||||
{volist name="$detail.content_array" id="vo"}
|
||||
<tr class="sale-tr">
|
||||
<td style="text-align:left;">{$vo.service_title|default=''}</td>
|
||||
<td>{$vo.service_date|default=''}</td>
|
||||
<td>{$vo.service_price|default='0.00'}</td>
|
||||
<td>{$vo.service_num|default='1'}</td>
|
||||
<td>{$vo.service_subtotal|default='0.00'}</td>
|
||||
<td style="text-align:left;">{$vo.service_remark|default=''}</td>
|
||||
</tr>
|
||||
{/volist}
|
||||
{/empty}
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -0,0 +1,177 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<div class="layui-card border-x border-t" style="margin-bottom:0; box-shadow:0 0 0 0 rgb(5 32 96 / 0%)">
|
||||
<div class="body-table layui-tab layui-tab-brief" lay-filter="tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li><a href="/contract/contract/voidlist">销售合同</a></li>
|
||||
<li class="layui-this"><a href="/contract/purchase/voidlist">采购合同</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<form class="layui-form gg-form-bar border-x">
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="types">
|
||||
<option value="">选择合同性质</option>
|
||||
<option value="1">普通采购</option>
|
||||
<option value="2">物品采购</option>
|
||||
<option value="3">服务采购</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:122px;">
|
||||
<select name="cate_id">
|
||||
<option value="">选择合同类别</option>
|
||||
{volist name=":get_base_data('ContractCate');" id="vo"}
|
||||
<option value="{$vo.id}">{$vo.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="sign_time" placeholder="选择合同签订日期" readonly name="sign_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:175px;">
|
||||
<input type="text" class="layui-input" id="end_time" placeholder="选择合同到期日期" readonly name="end_time">
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:220px;">
|
||||
<input type="text" name="keywords" placeholder="输入关键字,合同编号/合同名称" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px">
|
||||
<input type="hidden" name="tab" value="0" />
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="table_contract" lay-filter="table_contract"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<h3>作废合同</h3>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','tablePlus','laydatePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus,dropdown = layui.dropdown, tool = layui.tool,laydatePlus = layui.laydatePlus;
|
||||
//日期范围
|
||||
var sign_time = new laydatePlus({'target':'sign_time'});
|
||||
var end_time = new laydatePlus({'target':'end_time'});
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_contract"
|
||||
, toolbar: "#toolbarDemo"
|
||||
,url: "/contract/purchase/voidlist"
|
||||
,is_excel: true
|
||||
,page: true
|
||||
,limit: 20
|
||||
,cellMinWidth: 60
|
||||
,height: 'full-154'
|
||||
,cols: [[ //表头
|
||||
{
|
||||
field: 'id',
|
||||
title: 'ID号',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'code',
|
||||
title: '合同编号',
|
||||
align: 'center',
|
||||
width: 150
|
||||
},{
|
||||
field: 'name',
|
||||
title: '合同名称',
|
||||
minWidth:240,
|
||||
templet: '<div><a data-href="/contract/purchase/view/id/{{d.id}}.html" class="side-a">{{d.name}}</a></div>'
|
||||
},{
|
||||
field: 'cate_title',
|
||||
title: '合同类别',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},{
|
||||
field: 'types_name',
|
||||
title: '合同性质',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
templet: function (d) {
|
||||
var html = '<span class="layui-color-' + d.types + '">' + d.types_name + '</span>';
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'interval_time',
|
||||
title: '合同有效时间',
|
||||
align: 'center',
|
||||
width: 268,
|
||||
templet: function (d) {
|
||||
var html = d.interval_time;
|
||||
if (d.delay > 0 && d.delay < 30) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">' + d.delay + '天后到期</span>';
|
||||
}
|
||||
if (d.delay == 0) {
|
||||
html += '<span class="red ml-1" style="font-size:12px;">已过期</span>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
},{
|
||||
field: 'cost',
|
||||
title: '合同金额(元)',
|
||||
align: 'right',
|
||||
width: 100
|
||||
},{
|
||||
field: 'void_name',
|
||||
title: '作废人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'void_time',
|
||||
title: '作废日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'sign_name',
|
||||
title: '签定人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'sign_time',
|
||||
title: '签订日期',
|
||||
align: 'center',
|
||||
width: 90
|
||||
},{
|
||||
field: 'keeper_name',
|
||||
title: '保管人',
|
||||
align: 'center',
|
||||
width: 80
|
||||
},{
|
||||
field: 'right',
|
||||
fixed:'right',
|
||||
title: '操作',
|
||||
width: 60,
|
||||
align: 'center',
|
||||
ignoreExport:true,
|
||||
templet: function (d) {
|
||||
var btn0='<span class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</span>';
|
||||
return btn0;
|
||||
}
|
||||
}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(table_contract)',function (obj) {
|
||||
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
|
||||
var data = obj.data;
|
||||
if (obj.event === 'view') {
|
||||
tool.side("/contract/purchase/view?id="+data.id);
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,130 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-1">新增采购品</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">采购品名称<font>*</font></td>
|
||||
<td colspan="3"><input type="text" name="title" autocomplete="off" placeholder="请输入采购品名称" lay-verify="required" lay-reqText="请输入采购品名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray-2">采购品分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
|
||||
<option value="">请选择分类</option>
|
||||
{volist name=":set_recursion(get_base_data('PurchasedCate'))" id="v"}
|
||||
<option value="{$v.id}">{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray" rowspan="3">缩略图</td>
|
||||
<td rowspan="3" style="width: 150px; vertical-align:top:">
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">缩略图(尺寸:240x136)</button>
|
||||
<div class="layui-upload-list" id="demo1" style="width: 150px; height:90px; overflow: hidden;">
|
||||
<img src="" style="max-width: 100%; height:90px;" />
|
||||
<input type="hidden" name="thumb" value="">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">采购品编码<font>*</font></td>
|
||||
<td><input type="text" name="code" autocomplete="off" value="{:get_codeno('PR')}" readonly class="layui-input" lay-verify="required" lay-reqText="请输入采购品编码"></td>
|
||||
<td class="layui-td-gray">单位<font>*</font></td>
|
||||
<td><input type="text" name="unit" autocomplete="off" value="" class="layui-input" lay-verify="required" lay-reqText="请输入采购品单位"></td>
|
||||
<td class="layui-td-gray">规格</td>
|
||||
<td><input type="text" name="specs" autocomplete="off" placeholder="请输入采购品规格" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">采购价(元)<font>*</font></td>
|
||||
<td><input type="text" name="purchase_price" autocomplete="off" placeholder="请输入采购品采购价" class="layui-input" lay-verify="required|number" lay-reqText="请输入采购价"></td>
|
||||
<td class="layui-td-gray">是否实物<font>*</font></td>
|
||||
<td colspan="3">
|
||||
<input type="radio" name="is_object" value="1" title="是" checked>
|
||||
<input type="radio" name="is_object" value="2" title="否" >
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">
|
||||
<div class="layui-input-inline">采购品附件</div>
|
||||
<div class="layui-input-inline">
|
||||
<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
|
||||
</div>
|
||||
</td>
|
||||
<td colspan="7">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
<input type="hidden" id="fileBoxInput" data-type="file" name="file_ids" value="">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="vertical-align:top;">采购品描述<font>*</font></td>
|
||||
<td colspan="7">
|
||||
<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-1">
|
||||
<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','tinymce','uploadPlus'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,upload = layui.upload,uploadPlus = layui.uploadPlus;
|
||||
|
||||
//封面上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1'
|
||||
, url: "/api/index/upload"
|
||||
, done: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.id);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//编辑器初始化
|
||||
var editor = layui.tinymce;
|
||||
var edit = editor.render({
|
||||
selector: "#container",
|
||||
images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
|
||||
height: 480
|
||||
});
|
||||
|
||||
//附件上传
|
||||
var attachment = new uploadPlus({
|
||||
"target":'uploadBtn',
|
||||
"targetBox":'uploadBox'
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
data.field.content = tinyMCE.editors['container'].getContent();
|
||||
if (data.field.content == '') {
|
||||
layer.msg('请先完善采购品的描述内容');
|
||||
return false;
|
||||
}
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/purchased/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,178 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
{block name="style"}
|
||||
<style>
|
||||
.tree-left{width:220px; float:left; height:100%; overflow: scroll; border:1px solid #eeeeee; background-color:#fff; padding:12px 12px 12px 5px;}
|
||||
.tree-left h3{font-size:16px; height:30px; padding-left:10px; font-weight:800}
|
||||
</style>
|
||||
{/block}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page" style="height:calc(100% - 36px); box-sizing: border-box;">
|
||||
<div class="tree-left">
|
||||
<h3>采购品分类</h3>
|
||||
<div id="cate"></div>
|
||||
</div>
|
||||
<div class="body-table" style="margin-left:248px; overflow:hidden;">
|
||||
<form class="layui-form gg-form-bar border-x border-t">
|
||||
<div class="layui-input-inline" style="width:100px;">
|
||||
<select name="status">
|
||||
<option value="">选择状态</option>
|
||||
<option value="1">正常</option>
|
||||
<option value="0">禁用</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:300px;">
|
||||
<input type="text" name="keywords" placeholder="关键字,采购品名称/采购品编码" class="layui-input" autocomplete="off" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px;">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">重置</button>
|
||||
</div>
|
||||
</form>
|
||||
<table class="layui-hide" id="test" lay-filter="test"></table>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加采购品</button>
|
||||
</div>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','tablePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus, tool = layui.tool,tree = layui.tree,form = layui.form;
|
||||
$.ajax({
|
||||
url: "/contract/api/get_purchasedcate_tree",
|
||||
type:'get',
|
||||
success:function(res){
|
||||
//仅节点左侧图标控制收缩
|
||||
tree.render({
|
||||
elem: '#cate',
|
||||
data: res.trees,
|
||||
onlyIconControl: true, //是否仅允许节点左侧图标控制展开收缩
|
||||
click: function(obj){
|
||||
//layer.msg(JSON.stringify(obj.data));
|
||||
$('#cate').find('.layui-tree-main').removeClass('on');
|
||||
$(obj.elem).find('.layui-tree-main').eq(0).addClass('on');
|
||||
layui.pageTable.reload({
|
||||
where: {cate_id: obj.data.id},
|
||||
page:{curr:1}
|
||||
});
|
||||
$('[name="keywords"]').val('');
|
||||
$('[name="status"]').val('');
|
||||
form.render();
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
$('[lay-filter="reset"]').click(function(){
|
||||
$('#cate').find('.layui-tree-main').removeClass('on');
|
||||
});
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,toolbar: '#toolbarDemo'
|
||||
,title:'采购品列表'
|
||||
,url: "/contract/purchased/datalist"
|
||||
,is_excel: true
|
||||
,cellMinWidth: 60
|
||||
,height: 'full-114'
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'code',width:150, title: '采购品编码', align:'center'}
|
||||
,{field:'cate',width:150, title: '采购品分类', align:'center'}
|
||||
,{field:'title',title: '采购品名称',minWidth:240}
|
||||
,{field:'purchase_price',width:100, title: '采购价(元)', align:'center','style':'color:#1e9fff'}
|
||||
,{field:'unit',width:60, title: '单位', align:'center'}
|
||||
,{field:'specs',width:60, title: '规格', align:'center'}
|
||||
,{field:'status', title: '状态',width:60,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:150,fixed:'right', title: '操作', align:'center',templet: function(d){
|
||||
var html='';
|
||||
var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
|
||||
var btn1='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="disable">禁用</a>';
|
||||
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
|
||||
var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
if(d.status==1){
|
||||
html = '<div class="layui-btn-group">'+btn+btn1+btn3+'</div>';
|
||||
}
|
||||
else{
|
||||
html = '<div class="layui-btn-group">'+btn+btn2+btn3+'</div>';
|
||||
}
|
||||
return html;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(test)',function (obj) {
|
||||
if(obj.event === 'edit'){
|
||||
tool.side("/contract/purchased/add?id="+obj.data.id);
|
||||
}
|
||||
if(obj.event === 'view'){
|
||||
tool.side("/contract/purchased/view?id="+obj.data.id);
|
||||
}
|
||||
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/purchased/set", { 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/purchased/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
if(obj.event === 'del'){
|
||||
layer.confirm('确定要删除该采购品吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.delete("/contract/purchased/del", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.addNew',function(){
|
||||
tool.side("/contract/purchased/add");
|
||||
});
|
||||
|
||||
//监听搜索提交
|
||||
form.on('submit(webform)', function(data){
|
||||
layui.pageTable.reload({where:data.field,page:{curr:1}});
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,136 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-4">
|
||||
<h3 class="pb-3">编辑采购品</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">采购品名称<font>*</font></td>
|
||||
<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入采购品名称" lay-verify="required" lay-reqText="请输入采购品名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray-2">采购品分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
|
||||
<option value="">请选择分类</option>
|
||||
{volist name=":set_recursion(get_base_data('PurchasedCate'))" id="v"}
|
||||
<option value="{$v.id}" {eq name="$v.id" value="$detail.cate_id"} selected{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray" rowspan="3">缩略图</td>
|
||||
<td rowspan="3" style="width: 150px; vertical-align:top:">
|
||||
<div class="layui-upload">
|
||||
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">缩略图(尺寸:240x136)</button>
|
||||
<div class="layui-upload-list" id="demo1" style="width: 150px; height:90px; overflow: hidden;">
|
||||
<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:90px;" />
|
||||
<input type="hidden" name="thumb" value="{$detail.thumb}">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">采购品编码<font>*</font></td>
|
||||
<td><input type="text" name="code" value="{$detail.code}" readonly class="layui-input" lay-verify="required"></td>
|
||||
<td class="layui-td-gray">单位<font>*</font></td>
|
||||
<td><input type="text" name="unit" autocomplete="off" value="{$detail.unit}" class="layui-input" lay-verify="required" lay-reqText="请输入采购品单位"></td>
|
||||
<td class="layui-td-gray">规格</td>
|
||||
<td><input type="text" name="specs" autocomplete="off" value="{$detail.specs}" placeholder="请输入采购品规格" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">采购价(元)</td>
|
||||
<td><input type="text" name="purchase_price" value="{$detail.purchase_price}" lay-verify="required|number" lay-reqText="请输入采购品采购价" autocomplete="off" placeholder="请输入采购品采购价" class="layui-input"></td>
|
||||
<td class="layui-td-gray">是否实物<font>*</font></td>
|
||||
<td colspan="3">
|
||||
<input type="radio" name="is_object" value="1" title="是" {eq name="$detail.is_object" value="1"} checked {/eq}>
|
||||
<input type="radio" name="is_object" value="2" title="否" {eq name="$detail.is_object" value="2"} checked {/eq}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">
|
||||
<div class="layui-input-inline">采购品附件</div>
|
||||
<div class="layui-input-inline">
|
||||
<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
|
||||
</div>
|
||||
</td>
|
||||
<td colspan="7">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
|
||||
{notempty name="$detail.file_ids"}
|
||||
{volist name="$detail.file_array" id="vo"}
|
||||
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
|
||||
{/volist}
|
||||
{/notempty}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="vertical-align:top;">采购品描述<font>*</font></td>
|
||||
<td colspan="7">
|
||||
<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content}</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-1">
|
||||
<input type="hidden" name="id" value="{$detail.id}">
|
||||
<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','tinymce','uploadPlus'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,upload = layui.upload,uploadPlus = layui.uploadPlus;
|
||||
|
||||
//封面上传
|
||||
var uploadInst = upload.render({
|
||||
elem: '#test1'
|
||||
, url: "/api/index/upload"
|
||||
, done: function (res) {
|
||||
layer.msg(res.msg);
|
||||
if (res.code == 0) {
|
||||
//上传成功
|
||||
$('#demo1 input').attr('value', res.data.id);
|
||||
$('#demo1 img').attr('src', res.data.filepath);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//编辑器初始化
|
||||
var editor = layui.tinymce;
|
||||
var edit = editor.render({
|
||||
selector: "#container",
|
||||
images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
|
||||
height: 480
|
||||
});
|
||||
|
||||
//附件上传
|
||||
var attachment = new uploadPlus({
|
||||
"target":'uploadBtn',
|
||||
"targetBox":'uploadBox'
|
||||
});
|
||||
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
data.field.content = tinyMCE.editors['container'].getContent();
|
||||
if (data.field.content == '') {
|
||||
layer.msg('请先完善采购品的描述内容');
|
||||
return false;
|
||||
}
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/purchased/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,71 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-4">
|
||||
<h3 class="pb-1">采购品详情</h3>
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">采购品名称</td>
|
||||
<td colspan="3">{$detail.title}</td>
|
||||
<td class="layui-td-gray-2">采购品分类</td>
|
||||
<td>{$detail.cate}</td>
|
||||
<td class="layui-td-gray" rowspan="3">缩略图</td>
|
||||
<td rowspan="3" style="width:150px;">
|
||||
<div class="layui-upload-list" id="demo1" style="width: 150px; height:90px; overflow: hidden;">
|
||||
<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:90px;" />
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">采购品编码</td>
|
||||
<td>{$detail.code}</td>
|
||||
<td class="layui-td-gray">单位</td>
|
||||
<td>{$detail.unit}</td>
|
||||
<td class="layui-td-gray">规格</td>
|
||||
<td>{$detail.specs}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">采购价(元)</td>
|
||||
<td>{$detail.purchase_price}</td>
|
||||
<td class="layui-td-gray">是否实物</td>
|
||||
<td colspan="3">
|
||||
{eq name="$detail.is_object" value="1"}是{/eq}
|
||||
{eq name="$detail.is_object" value="2"}否{/eq}
|
||||
</td>
|
||||
</tr>
|
||||
{notempty name="$detail.file_ids"}
|
||||
<tr>
|
||||
<td class="layui-td-gray">相关附件</td>
|
||||
<td colspan="7">
|
||||
<div class="layui-row">
|
||||
{volist name="$detail.file_array" id="vo"}
|
||||
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
<tr>
|
||||
<td class="layui-td-gray" colspan="8" style="text-align:left; color:#666"><strong>采购品描述</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="8">
|
||||
{$detail.content|raw}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,91 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-1">采购品分类</h3>
|
||||
{eq name="$id" value="0"}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">父级分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name="$cates" id="v"}
|
||||
<option value="{$v.id}" {eq name="$pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">分类名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">描述</td>
|
||||
<td colspan="5"><textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea"></textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
{else/}
|
||||
<table class="layui-table">
|
||||
<tr>
|
||||
<td class="layui-td-gray">父级分类<font>*</font></td>
|
||||
<td>
|
||||
<select name="pid" lay-verify="required" lay-reqText="请选择父级分类">
|
||||
<option value="0">作为顶级分类</option>
|
||||
{volist name="$cates" id="v"}
|
||||
<option value="{$v.id}" {eq name="$detail.pid" value="$v.id"}selected=""{/eq}>{$v.title}</option>
|
||||
{/volist}
|
||||
</select>
|
||||
</td>
|
||||
<td class="layui-td-gray">分类名称<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="title" value="{$detail.title}" lay-verify="required" autocomplete="off" placeholder="请输入分类名称" lay-reqText="请输入分类名称" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td>
|
||||
<input type="text" name="sort" value="{$detail.sort}" placeholder="请输入排序,数字" value="0" autocomplete="off" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">描述</td>
|
||||
<td colspan="5"><textarea name="desc" placeholder="请输入描述,可空" class="layui-textarea">{$detail.desc}</textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
{/eq}
|
||||
<div class="pt-3">
|
||||
<input type="hidden" name="id" value="{$id}">
|
||||
<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'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
setTimeout(function () {
|
||||
parent.location.reload();
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/purchasedcate/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,86 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-3">
|
||||
<div class="gg-form-bar border-t border-x" style="padding-bottom:10px;">
|
||||
<button class="layui-btn layui-btn-sm add-menu">+ 添加采购品分类</button>
|
||||
</div>
|
||||
<div>
|
||||
<table class="layui-hide" id="treeTable" lay-filter="treeTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="switchStatus">
|
||||
<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="是|否" lay-filter="status" {{ d.status == 1 ? 'checked' : '' }}>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var treeTable = layui.treeTable, tool = layui.tool;
|
||||
|
||||
layui.pageTable = treeTable.render({
|
||||
elem: '#treeTable'
|
||||
,url: "/contract/purchasedcate/datalist"
|
||||
,tree: { // treeTable 特定属性集
|
||||
customName: {name:'title'},
|
||||
data: {},
|
||||
view: {
|
||||
showIcon:false,
|
||||
expandAllDefault:true
|
||||
},
|
||||
async: {},
|
||||
callback: {}
|
||||
}
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field: 'sort', title: '排序',align:'center', width:80}
|
||||
,{field:'title', width:240, title: '分类名称'}
|
||||
,{field:'pid', title: '父级ID', width:80, align:'center'}
|
||||
,{field:'desc', title: '描述', }
|
||||
,{width:160,title: '操作', align:'center',templet: function(d){
|
||||
var html = '<span class="layui-btn-group"><button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="add">添加子分类</button><button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</button></span>';
|
||||
return html;
|
||||
}
|
||||
}
|
||||
]]
|
||||
,page:false
|
||||
//,skin:'line'
|
||||
});
|
||||
|
||||
//表头工具栏事件
|
||||
$('.add-menu').on('click', function(){
|
||||
tool.side('/contract/purchasedcate/add');
|
||||
return;
|
||||
});
|
||||
|
||||
//操作按钮
|
||||
treeTable.on('tool(treeTable)', function (obj) {
|
||||
if (obj.event === 'add') {
|
||||
tool.side('/contract/purchasedcate/add?pid='+obj.data.id);
|
||||
return;
|
||||
}
|
||||
if (obj.event === 'edit') {
|
||||
tool.side('/contract/purchasedcate/add?id='+obj.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/purchasedcate/del', { id: obj.data.id }, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,49 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">服务内容</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray">服务内容<font>*</font></td>
|
||||
<td colspan="3"><input type="text" name="title" lay-verify="required" autocomplete="off" placeholder="请输入服务内容" lay-reqText="请输入服务内容" class="layui-input" value="{$detail.title|default=''}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">费用(元)<font>*</font></td>
|
||||
<td><input type="text" name="price" lay-verify="required" autocomplete="off" placeholder="请输入费用" lay-reqText="请输入费用" class="layui-input" value="{$detail.price|default=''}"></td>
|
||||
<td class="layui-td-gray">排序</td>
|
||||
<td><input type="text" name="sort" placeholder="请输入排序,数字" autocomplete="off" class="layui-input" value="{$detail.sort|default=''}"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-4">
|
||||
<input type="hidden" name="id" value="{$detail.id|default=0}"/>
|
||||
<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>
|
||||
var moduleInit = ['tool'];
|
||||
|
||||
function gouguInit() {
|
||||
var form = layui.form, tool = layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/services/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,98 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
|
||||
<div class="p-page">
|
||||
<table class="layui-hide" id="table_services" lay-filter="table_services"></table>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbarDemo">
|
||||
<div class="layui-btn-container">
|
||||
<button class="layui-btn layui-btn-sm add-new" type="button">+ 添加服务内容</button>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
var table = layui.table, tool = layui.tool;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: "#table_services"
|
||||
,toolbar: '#toolbarDemo'
|
||||
,url: "/contract/services/datalist"
|
||||
,page: false
|
||||
,limit: 999
|
||||
,cellMinWidth: 80
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'title',title: '服务内容'}
|
||||
,{field:'price',title: '费用(元)',width:100, align:'right'}
|
||||
,{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',ignoreExport:true,templet: function(d){
|
||||
var html='';
|
||||
var btn='<a class="layui-btn layui-btn-normal 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-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(table_services)',function (obj) {
|
||||
if(obj.event === 'edit'){
|
||||
tool.side("/contract/services/add?id="+obj.data.id);
|
||||
}
|
||||
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/services/set", {id:obj.data.id,status: 0}, 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/services/set", {id:obj.data.id,status:1}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.add-new',function(){
|
||||
tool.side("/contract/services/add");
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,92 @@
|
||||
{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 class="layui-td-gray-2">供应商名称<font>*</font></td>
|
||||
<td colspan="3"><input type="text" name="title" placeholder="请输入供应商名称" lay-verify="required" lay-reqText="请输入供应商名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray-2">供应商电话</td>
|
||||
<td><input type="text" name="phone" autocomplete="off" placeholder="请输入供应商电话" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">供应商地址</td>
|
||||
<td colspan="3"><input type="text" name="address" placeholder="请输入供应商地址" class="layui-input"></td>
|
||||
<td class="layui-td-gray-2">供应商邮箱</td>
|
||||
<td><input type="text" name="email" autocomplete="off" placeholder="请输入供应商邮箱" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="vertical-align:top;">供应商简介</td>
|
||||
<td colspan="5"><textarea name="content" placeholder="请输入内容" class="layui-textarea"></textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">
|
||||
<div class="layui-input-inline">相关附件</div>
|
||||
<div class="layui-input-inline">
|
||||
<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
|
||||
</div>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
<input type="hidden" data-type="file" name="file_ids" value="">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6"><strong>首要联系人信息</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">联 系 人</td>
|
||||
<td><input type="text" name="c_name" autocomplete="off" placeholder="请输入联系人姓名" class="layui-input"></td>
|
||||
<td class="layui-td-gray">联系电话</td>
|
||||
<td><input type="text" name="c_mobile" autocomplete="off" placeholder="请输入联系人电话" class="layui-input"></td>
|
||||
<td class="layui-td-gray">性别</td>
|
||||
<td>
|
||||
<input type="radio" name="c_sex" value="1" title="男">
|
||||
<input type="radio" name="c_sex" value="2" title="女" >
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-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','uploadPlus'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
|
||||
|
||||
//附件上传
|
||||
var attachment = new uploadPlus({
|
||||
"target":'uploadBtn',
|
||||
"targetBox":'uploadBox'
|
||||
});
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
if(data.field.c_name!=='' || data.field.c_mobile!==''){
|
||||
if(!data.field.c_sex){
|
||||
layer.msg('请选择首要联系的性别');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/supplier/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,74 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">新增联系人</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">供应商名称</td>
|
||||
<td colspan="5">{$supplier_name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">联系人姓名<font>*</font></td>
|
||||
<td><input type="text" name="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="mobile" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input"></td>
|
||||
<td class="layui-td-gray">性别<font>*</font></td>
|
||||
<td>
|
||||
<input type="radio" name="sex" value="1" title="男">
|
||||
<input type="radio" name="sex" value="2" title="女">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">微 信 号</td>
|
||||
<td><input type="text" name="wechat" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input"></td>
|
||||
<td class="layui-td-gray">QQ号码</td>
|
||||
<td><input type="text" name="qq" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input"></td>
|
||||
<td class="layui-td-gray">电子邮箱</td>
|
||||
<td><input type="text" name="email" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">称谓</td>
|
||||
<td><input type="text" name="nickname" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input"></td>
|
||||
<td class="layui-td-gray">部门</td>
|
||||
<td><input type="text" name="department" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input"></td>
|
||||
<td class="layui-td-gray">职务</td>
|
||||
<td><input type="text" name="position" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-3">
|
||||
<input type="hidden" name="sid" value="{$supplier_id}">
|
||||
<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'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
if(!data.field.sex){
|
||||
layer.msg('请选择性别');
|
||||
return false;
|
||||
}
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/supplier/contact_add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,74 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<form class="layui-form p-page">
|
||||
<h3 class="pb-3">编辑联系人</h3>
|
||||
<table class="layui-table layui-table-form">
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">供应商名称</td>
|
||||
<td colspan="5">{$detail.supplier}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">联系人姓名<font>*</font></td>
|
||||
<td><input type="text" name="name" value="{$detail.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="mobile" value="{$detail.mobile}" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input"></td>
|
||||
<td class="layui-td-gray">性别<font>*</font></td>
|
||||
<td>
|
||||
<input type="radio" name="sex" value="1" title="男" {eq name="$detail.sex" value="1"} checked{/eq}>
|
||||
<input type="radio" name="sex" value="2" title="女" {eq name="$detail.sex" value="2"} checked{/eq}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">微 信 号</td>
|
||||
<td><input type="text" name="wechat" value="{$detail.wechat}" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input"></td>
|
||||
<td class="layui-td-gray">QQ号码</td>
|
||||
<td><input type="text" name="qq" value="{$detail.qq}" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input"></td>
|
||||
<td class="layui-td-gray">电子邮箱</td>
|
||||
<td><input type="text" name="email" value="{$detail.email}" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">称谓</td>
|
||||
<td><input type="text" name="nickname" value="{$detail.nickname}" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input"></td>
|
||||
<td class="layui-td-gray">部门</td>
|
||||
<td><input type="text" name="department" value="{$detail.department}" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input"></td>
|
||||
<td class="layui-td-gray">职务</td>
|
||||
<td><input type="text" name="position" value="{$detail.position}" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-3">
|
||||
<input type="hidden" name="id" value="{$detail.id}">
|
||||
<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'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
if(!data.field.sex){
|
||||
layer.msg('请选择性别');
|
||||
return false;
|
||||
}
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/supplier/contact_add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,121 @@
|
||||
{extend name="../../base/view/common/base" /}
|
||||
<!-- 主体 -->
|
||||
{block name="body"}
|
||||
<div class="p-page">
|
||||
<form class="layui-form gg-form-bar border-x border-t" id="barsearchform">
|
||||
<div class="layui-input-inline" style="width:240px;">
|
||||
<input type="text" name="keywords" placeholder="供应商名称/联系人名称" class="layui-input" />
|
||||
</div>
|
||||
<div class="layui-input-inline" style="width:150px">
|
||||
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
|
||||
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
|
||||
</div>
|
||||
</form>
|
||||
<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-sm add-new" type="button">+ 添加供应商</button>
|
||||
</div>
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const moduleInit = ['tool','tablePlus'];
|
||||
function gouguInit() {
|
||||
var table = layui.tablePlus, tool = layui.tool, form = layui.form;
|
||||
layui.pageTable = table.render({
|
||||
elem: '#test'
|
||||
,toolbar: '#toolbarDemo'
|
||||
,title:'供应商列表'
|
||||
,url: "/contract/supplier/datalist"
|
||||
,page: true
|
||||
,cellMinWidth: 80
|
||||
,cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'title',title: '供应商名称',minWidth:300}
|
||||
,{field:'address',width:280, title: '供应商地址'}
|
||||
,{field:'phone',width:150, title: '供应商电话', align:'center'}
|
||||
,{field:'email',width:150, title: '供应商邮箱', align:'center'}
|
||||
,{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:150,fixed:'right', title: '操作',ignoreExport:true, align:'center',templet: function(d){
|
||||
var html='';
|
||||
var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
|
||||
var btn1='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="disable">禁用</a>';
|
||||
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
|
||||
var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
if(d.status==1){
|
||||
html = '<div class="layui-btn-group">'+btn+btn1+btn3+'</div>';
|
||||
}
|
||||
else{
|
||||
html = '<div class="layui-btn-group">'+btn+btn2+btn3+'</div>';
|
||||
}
|
||||
return html;
|
||||
}}
|
||||
]]
|
||||
});
|
||||
|
||||
table.on('tool(test)',function (obj) {
|
||||
if(obj.event === 'edit'){
|
||||
tool.side("/contract/supplier/add?id="+obj.data.id);
|
||||
}
|
||||
if(obj.event === 'view'){
|
||||
tool.side("/contract/supplier/view?id="+obj.data.id);
|
||||
}
|
||||
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/supplier/set", { 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/supplier/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
if(obj.event === 'del'){
|
||||
layer.confirm('确定要删除该供应商吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.delete("/contract/supplier/del", { id: obj.data.id}, callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('body').on('click','.add-new',function(){
|
||||
tool.side("/contract/supplier/add");
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,76 @@
|
||||
{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 class="layui-td-gray-2">供应商名称<font>*</font></td>
|
||||
<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入供应商名称" lay-verify="required" lay-reqText="请输入供应商名称" class="layui-input"></td>
|
||||
<td class="layui-td-gray-2">供应商电话</td>
|
||||
<td><input type="text" name="phone" value="{$detail.phone}" autocomplete="off" placeholder="请输入供应商电话" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">供应商地址</td>
|
||||
<td colspan="3"><input type="text" name="address" value="{$detail.address}" autocomplete="off" placeholder="请输入供应商地址" class="layui-input"></td>
|
||||
<td class="layui-td-gray-2">供应商邮箱</td>
|
||||
<td><input type="text" name="email" value="{$detail.email}" autocomplete="off" placeholder="请输入供应商邮箱" class="layui-input"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="vertical-align:top;">供应商简介</td>
|
||||
<td colspan="5"><textarea name="content" placeholder="请输入内容" class="layui-textarea">{$detail.content}</textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">
|
||||
<div class="layui-input-inline">相关附件</div>
|
||||
<div class="layui-input-inline">
|
||||
<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
|
||||
</div>
|
||||
</td>
|
||||
<td colspan="5">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
|
||||
{volist name="$detail.file_array" id="vo"}
|
||||
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="pt-3">
|
||||
<input type="hidden" name="id" value="{$detail.id}">
|
||||
<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','uploadPlus'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
|
||||
|
||||
//附件上传
|
||||
var attachment = new uploadPlus({
|
||||
"target":'uploadBtn',
|
||||
"targetBox":'uploadBox'
|
||||
});
|
||||
//监听提交
|
||||
form.on('submit(webform)', function(data){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/contract/supplier/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,141 @@
|
||||
{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 class="layui-td-gray-2">供应商名称</td>
|
||||
<td>{$detail.title}</td>
|
||||
<td class="layui-td-gray-2">供应商电话</td>
|
||||
<td>{$detail.phone}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">供应商地址</td>
|
||||
<td>{$detail.address}</td>
|
||||
<td class="layui-td-gray-2">供应商邮箱</td>
|
||||
<td>{$detail.email}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray" style="vertical-align:top;">供应商简介</td>
|
||||
<td colspan="3">{$detail.content}</td>
|
||||
</tr>
|
||||
{notempty name="$detail.file_ids"}
|
||||
<tr>
|
||||
<td class="layui-td-gray-2">
|
||||
<div class="layui-input-inline">相关附件</div>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<div class="layui-row" id="uploadBox">
|
||||
{volist name="$detail.file_array" id="vo"}
|
||||
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
|
||||
{/volist}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{/notempty}
|
||||
<tr>
|
||||
<td colspan="6"><strong>联系人信息</strong><span class="layui-btn layui-btn-xs add-contact ml-3">+ 新增联系人</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6"><table class="layui-hide" id="contact" lay-filter="contact"></table></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
{/block}
|
||||
<!-- /主体 -->
|
||||
|
||||
<!-- 脚本 -->
|
||||
{block name="script"}
|
||||
<script>
|
||||
const supplier_id = '{$detail.id}';
|
||||
const moduleInit = ['tool'];
|
||||
function gouguInit() {
|
||||
let tool = layui.tool, table = layui.table;
|
||||
|
||||
layui.pageTable = table.render({
|
||||
elem: '#contact',
|
||||
title: '联系人列表',
|
||||
cellMinWidth:80,
|
||||
url: '/contract/api/get_supplier_contact',
|
||||
where:{'supplier_id':supplier_id},
|
||||
page: true, //开启分页
|
||||
limit: 20,
|
||||
cols: [[
|
||||
{field:'id',width:80, title: 'ID号', align:'center'}
|
||||
,{field:'name',width:100,title: '联系人姓名', align:'center'}
|
||||
,{field:'status', title: '性别',width:80,align:'center',templet: function(d){
|
||||
var html='未知';
|
||||
var html1='<span class="green">男</span>';
|
||||
var html2='<span class="blue">女</span>';
|
||||
if(d.sex==1){
|
||||
return html1;
|
||||
}
|
||||
if(d.sex==2){
|
||||
return html2;
|
||||
}
|
||||
else{
|
||||
return html;
|
||||
}
|
||||
}}
|
||||
,{field:'mobile',width:100,title: '手机号码', align:'center'}
|
||||
,{field:'qq',width:100,title: 'QQ号码', align:'center'}
|
||||
,{field:'wechat',width:100,title: '微信号码', align:'center'}
|
||||
,{field:'email',title: '电子邮箱', align:'center'}
|
||||
,{field:'position',width:120,title: '担任职位', align:'center'}
|
||||
,{field:'department',width:120,title: '部门', align:'center'}
|
||||
,{fixed:'right',width:190,title: '操作', align:'center',templet: function(d){
|
||||
var html = '<div class="layui-btn-group">';
|
||||
var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
|
||||
var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="set">设为首要联系人</a>';
|
||||
var btn2='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
|
||||
if(d.is_default==1){
|
||||
return '<span class="red" style="margin-right:10px;">首要联系人</span>'+btn;
|
||||
}
|
||||
else{
|
||||
return html+btn+btn1+btn2+'</div>';
|
||||
}
|
||||
}}
|
||||
]]
|
||||
});
|
||||
$('.add-contact').on('click',function(){
|
||||
tool.side('/contract/supplier/contact_add?sid='+supplier_id);
|
||||
});
|
||||
|
||||
table.on('tool(contact)', function(obj){
|
||||
var data = obj.data; //获得当前行数据
|
||||
var layEvent = obj.event;
|
||||
if(layEvent === 'edit'){ //编辑
|
||||
let url = '/contract/supplier/contact_add?id='+data.id;
|
||||
tool.side(url);
|
||||
}
|
||||
if(layEvent === 'set'){ //查看
|
||||
layer.confirm('确定要设置该联系人为首要联系人吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.delete("/contract/api/set_supplier_contact",{"id":data.id},callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
if(layEvent === 'del'){ //删除
|
||||
layer.confirm('确定要删除该联系人吗?', {icon: 3, title:'提示'}, function(index){
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
layui.pageTable.reload();
|
||||
}
|
||||
}
|
||||
tool.delete('/contract/supplier/contact_del',{"id":data.id},callback);
|
||||
layer.close(index);
|
||||
});
|
||||
}
|
||||
return false;
|
||||
})
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,90 @@
|
||||
{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 class="layui-td-gray-2">供应商名称</td>
|
||||
<td colspan="5">{$supplier_name}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">姓名<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="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="mobile" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">性别<font>*</font></td>
|
||||
<td>
|
||||
<input type="radio" name="sex" value="1" title="男">
|
||||
<input type="radio" name="sex" value="2" title="女">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">微 信 号</td>
|
||||
<td>
|
||||
<input type="text" name="wechat" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">QQ号码</td>
|
||||
<td>
|
||||
<input type="text" name="qq" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">电子邮箱</td>
|
||||
<td>
|
||||
<input type="text" name="email" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">称谓</td>
|
||||
<td>
|
||||
<input type="text" name="nickname" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">部门</td>
|
||||
<td>
|
||||
<input type="text" name="department" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">职务</td>
|
||||
<td>
|
||||
<input type="text" name="position" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="py-3">
|
||||
<input type="hidden" name="sid" value="{$supplier_id}">
|
||||
<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'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
if(!data.field.sex){
|
||||
layer.msg('请选择性别');
|
||||
return false;
|
||||
}
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/supplier/contact/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
@@ -0,0 +1,90 @@
|
||||
{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 class="layui-td-gray-2">供应商名称</td>
|
||||
<td colspan="5">{$detail.supplier}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">姓名<font>*</font></td>
|
||||
<td>
|
||||
<input type="text" name="name" value="{$detail.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="mobile" value="{$detail.mobile}" autocomplete="off" lay-verify="required" lay-reqText="请输入联系人电话" placeholder="请输入联系人电话" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">性别<font>*</font></td>
|
||||
<td>
|
||||
<input type="radio" name="sex" value="1" title="男" {eq name="$detail.sex" value="1"} checked{/eq}>
|
||||
<input type="radio" name="sex" value="2" title="女" {eq name="$detail.sex" value="2"} checked{/eq}>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">微 信 号</td>
|
||||
<td>
|
||||
<input type="text" name="wechat" value="{$detail.wechat}" autocomplete="off" placeholder="请输入联系人微信号" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">QQ号码</td>
|
||||
<td>
|
||||
<input type="text" name="qq" value="{$detail.qq}" autocomplete="off" placeholder="请输入联系人QQ号码" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">电子邮箱</td>
|
||||
<td>
|
||||
<input type="text" name="email" value="{$detail.email}" autocomplete="off" placeholder="请输入联系人电子邮箱" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="layui-td-gray">称谓</td>
|
||||
<td>
|
||||
<input type="text" name="nickname" value="{$detail.nickname}" autocomplete="off" placeholder="请输入联系人的称谓" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">部门</td>
|
||||
<td>
|
||||
<input type="text" name="department" value="{$detail.department}" autocomplete="off" placeholder="请输入联系人所在部门" class="layui-input">
|
||||
</td>
|
||||
<td class="layui-td-gray">职务</td>
|
||||
<td>
|
||||
<input type="text" name="position" value="{$detail.position}" autocomplete="off" placeholder="请输入联系人担任的职务" class="layui-input">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="py-3">
|
||||
<input type="hidden" name="id" value="{$detail.id}">
|
||||
<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'];
|
||||
function gouguInit() {
|
||||
var form = layui.form,tool=layui.tool;
|
||||
//监听提交
|
||||
form.on('submit(webform)', function (data) {
|
||||
if(!data.field.sex){
|
||||
layer.msg('请选择性别');
|
||||
return false;
|
||||
}
|
||||
let callback = function (e) {
|
||||
layer.msg(e.msg);
|
||||
if (e.code == 0) {
|
||||
tool.sideClose(1000);
|
||||
}
|
||||
}
|
||||
let clickbtn = $(this);
|
||||
tool.post("/supplier/contact/add", data.field, callback,clickbtn);
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
</script>
|
||||
{/block}
|
||||
<!-- /脚本 -->
|
||||
Reference in New Issue
Block a user