feat(后台): 班组相关调整 包含统计金额

master
yin5th 2023-02-09 15:40:53 +08:00
parent 932eca2be1
commit 0c6c3f7d68
11 changed files with 272 additions and 57 deletions

View File

@ -25,12 +25,14 @@ class Outsource extends Base
*/
public function index()
{
$worksiteId = input('worksite_id/d');
if ($this->request->isPost()) {
$params = input('searchParams/a');
$page = input('page/d', 1);
$size = input('size/d', 20);
$where = [];
$where[] = ['worksite_id', '=', $worksiteId];
if (!empty($params)) {
foreach ($params as $key => $param) {
$param = trim($param);
@ -61,6 +63,7 @@ class Outsource extends Base
return $this->json(0, 'success', $res);
}
$this->data['worksiteId'] = $worksiteId;
return $this->view();
}
@ -71,6 +74,7 @@ class Outsource extends Base
*/
public function add()
{
$worksiteId = input('worksite_id/d');
if ($this->request->isPost()) {
try {
$input = input('post.');
@ -87,6 +91,7 @@ class Outsource extends Base
}
}
$this->data['worksiteId'] = $worksiteId;
return $this->view();
}

View File

@ -370,18 +370,46 @@ class Worksite extends Base
* 项目支出汇总
*
*/
public function outlay(): View
public function outlay()
{
$id = input('worksite_id/d');
$pay = PayMonthLog::where('worksite_id', $id)->where('status', '>', PayMonthLog::COMMON_OFF)->sum('paid_amount');
$outsource = \app\model\WorksiteOutsource::where('worksite_id', $id)->sum('amount');
if ($this->request->post()) {
$search = input('searchParams/a');
$begin = $search['begin'] ?? '';
$end = $search['end'] ?? '';
$item['total'] = $pay + $outsource;
$item['pay'] = $pay;
$item['outsource'] = $outsource;
$where = [];
if (!empty($begin)) {
$where[] = ['time', '>=', str_replace('-', '', $begin)];
}
if (!empty($end)) {
$where[] = ['time', '<=', str_replace('-', '', $end)];
}
$list = PayMonthLog::alias('pml')
->leftJoin('account a', 'a.id = pml.account_id')
->leftJoin('outsource o', 'o.id = a.outsource_id')
->where('pml.worksite_id', $id)
->where($where)
->where('a.outsource_id', '>', 0)
->where('pml.status', '>', PayMonthLog::COMMON_OFF)
->where('pml.paid_amount', '>', 0)
->field('pml.*,a.outsource_id,o.name as team_name,sum(pml.paid_amount) as paid')
->group('a.outsource_id')
->select();
$res['total'] = $list->count();
$res['list'] = $list;
return $this->json(0, 'success', $res);
}
$pay = PayMonthLog::where('worksite_id', $id)->where('status', '>', PayMonthLog::COMMON_OFF)->sum('paid_amount');
$item['total'] = $pay;
$this->data['item'] = $item;
$this->data['worksiteId'] = $id;
return $this->view();
}
}

View File

@ -197,9 +197,10 @@ class Index extends Base
*/
public function index()
{
$position = Position::list();
$role = input('role');
$worksiteId = input('worksite_id/d');
$position = Position::list();
$role = input('role');
$worksiteId = input('worksite_id/d');
$outsourceId = input('outsource_id/d');
if ($this->request->isPost()) {
$page = input('page/d', 1);
$size = input('size/d', 20);
@ -207,10 +208,14 @@ class Index extends Base
if (input('role')) {
$searchParams['role'] = input('role');
}
if (input('worksite_id')) {
if (input('worksite_id') && $worksiteId > 0) {
$searchParams['worksite_id'] = input('worksite_id');
}
$search = [];
if (input('outsource_id') && $outsourceId > 0) {
$searchParams['outsource_id'] = input('outsource_id');
}
$search = [];
if ($searchParams) {
foreach ($searchParams as $key => $param) {
if ($param || $param == '0') {
@ -267,6 +272,7 @@ class Index extends Base
}
$this->data['worksiteId'] = $worksiteId;
$this->data['outsourceId'] = $outsourceId;
$this->data['role'] = $role;
$this->data['positionList'] = $position;
return $this->view();

View File

@ -49,15 +49,18 @@ class PayLog extends Base
$month = date('m', strtotime($time));
$day = date('d', strtotime($time));
$outsourceId = Account::where('id', $accountId)->value('outsource_id');
try {
self::create([
'account_id' => $accountId,
'worksite_id' => $worksiteId,
'time' => $time,
'indexs' => $indexs,
'year' => $year,
'month' => $month,
'day' => $day,
'account_id' => $accountId,
'worksite_id' => $worksiteId,
'outsource_id' => $outsourceId,
'time' => $time,
'indexs' => $indexs,
'year' => $year,
'month' => $month,
'day' => $day,
]);
} catch (\Exception $exception) {
//弱网时可能会出现并发提交忽略indexs唯一索引报错

View File

@ -76,7 +76,7 @@ class Pay
->chunk(300, function ($items) {
$update = [];
$indexsList = [];
$ids = $items->column('id');
$ids = $items->column('id');
\think\facade\Log::write($ids);
// 每查询一次就增加一次handle_count 避免未处理成功后 死循环一直查询
(new ClockLog)->whereIn('id', $ids)->save([
@ -191,13 +191,14 @@ class Pay
$indexs = $item['account_id'].'-'.$item['worksite_id'].'-'.$time;
if (!isset($insert[$indexs])) {
$insert[$indexs] = [
'account_id' => $item['account_id'],
'worksite_id' => $item['worksite_id'],
'indexs' => $indexs,
'time' => $time,
'year' => $year,
'month' => $month,
'created_at' => date('Y-m-d H:i:s'),
'account_id' => $item['account_id'],
'worksite_id' => $item['worksite_id'],
'outsource_id' => $item['outsource_id'],
'indexs' => $indexs,
'time' => $time,
'year' => $year,
'month' => $month,
'created_at' => date('Y-m-d H:i:s'),
'amount' => $item['amount'],
'base_amount' => $item['base_amount'],

View File

@ -245,4 +245,173 @@ layui.use(['laytpl', 'table', 'jquery', 'form', 'miniTab', 'xmSelect', 'laydate'
},
});
}
if ($('.location-detail-page').length > 0) {
miniTab.listen();
// 渲染表格
let listUrl = $('#table-container').data('url');
let insTb = table.render({
elem: '#table-container',
title: '列表',
defaultToolbar: ['filter', 'exports', {
title: '搜索' //自定义头部工具栏右侧图标。如无需自定义,去除该参数即可
, layEvent: 'search'
, icon: 'layui-icon-search'
}],
toolbar: '#toolbar-tpl',
method: 'POST',
url: listUrl,
page: false,
limit: 20,
limits: [20,50,100,200,500,1000],
request: {
pageName: 'page',
limitName: 'size',
},
parseData: function (res) {
return {
"code": res.code, //解析接口状态
"msg": res.msg, //解析提示文本
"count": res.data.total, //解析数据长度
"data": res.data.list //解析数据列表
};
},
cols: [[
{type: 'checkbox'},
{field: 'team_name', title: '班组', minWidth: 200},
{field: 'paid', title: '支出金额', minWidth: 150},
// {field: 'status_text', title: '状态', minWidth: 200},
// {templet: '#row-operate', minWidth: 380, align: 'center', title: '操作'}
]],
done: function () {
Tools.setInsTb(insTb);
}
});
//监听工具条 注意区别toolbar和tool toolbar是表头上的工具条 tool是行中的工具条
table.on('toolbar(table-container-filter)', function (obj) {
let layEvent = obj.event;
let insTb = Tools.getInsTb();
let url = $($(this).context).data('href')
let title = $($(this).context).data('title')
let width = $($(this).context).data('width') ? $($(this).context).data('width') : '100%';
let height = $($(this).context).data('height') ? $($(this).context).data('height') : '100%';
let checkStatus = table.checkStatus('table-container');
let selected = checkStatus.data;
let ids = [];
switch (layEvent) {
// toolbar 删除
case 'del':
if (checkStatus.data.length <= 0) {
layer.msg('请先选择数据');
return false;
}
// let selected = checkStatus.data;
// let ids = [];
$.each(selected, function (index, val) {
ids.push(val.id);
})
delRow(url, ids, insTb);
return false;
// toolbar 刷新
case 'refresh':
refreshTab(insTb);
return false;
// toolbar 搜索
case 'search':
let search = $('.table-search-fieldset');
if (search.hasClass('div-show')) {
search.css('display', 'none').removeClass('div-show');
} else {
search.css('display', 'block').addClass('div-show');
}
return false;
// 其他 默认为打开弹出层
default:
if (layEvent !== 'LAYTABLE_COLS' && layEvent !== 'LAYTABLE_EXPORT') {
openLayer(url, title, width, height);
return false;
}
}
});
//监听行工具条
table.on('tool(table-container-filter)', function (obj) {
let data = obj.data;
let layEvent = obj.event;
let url = $($(this).context).data('href');
let title = $($(this).context).data('title');
let width = $($(this).context).data('width') ? $($(this).context).data('width') : '100%';
let height = $($(this).context).data('height') ? $($(this).context).data('height') : '100%';
let insTb = Tools.getInsTb();
switch (layEvent) {
// 行 删除
case 'del':
let ids = [data.id];
delRow(url, ids, insTb);
return false;
//其他 默认为打开弹出层
default:
openLayer(url, title, width, height);
return false;
}
});
changeSwitch('changeSaleable');//监听上下架
let modifyUrl = $('#row-modify').data('url');
table.on('edit(table-container)', function (obj) {
let id = obj.data.id;
$.ajax(modifyUrl, {
data: {"id": id, "field": obj.field, "value": obj.value}
,dataType : 'json'
,type: 'POST'
})
.done(function (res) {
if (res.code === 0) {
insTb.reload();
}
})
});
// switch变更
function changeSwitch(filter) {
form.on('switch(' + filter + ')', function (obj) {
let val = obj.elem.checked ? 1 : 0;
$.post(modifyUrl, {id: this.value, field: this.name, value: val}, function (res) {
layer.msg(res.msg)
if (res.code !== 0) {
//操作不成功则刷新页面
insTb.reload();
}
})
});
}
// 监听搜索操作
form.on('submit(data-search-btn)', function (data) {
//执行搜索重载
table.reload('table-container', {
page: {curr: 1}
, where: data.field
}, 'data');
return false;
});
laydate.render({
elem: '#date-begin'
,type: 'month'
});
laydate.render({
elem: '#date-end'
,type: 'month'
});
}
});

View File

@ -62,7 +62,7 @@
</div>
</fieldset>
<div>
<table id="table-container" class="layui-table" data-url="/manager/account/index/index?worksite_id={$worksiteId ?? 0}{:empty($role) ? '' : '&role='.$role}" lay-filter="table-container-filter"></table>
<table id="table-container" class="layui-table" data-url="/manager/account/index/index?worksite_id={$worksiteId ?? 0}{:empty($role) ? '' : '&role='.$role}{:empty($outsourceId) ? '' : '&outsource_id='.$outsourceId}" lay-filter="table-container-filter"></table>
</div>
</div>
</div>

View File

@ -11,7 +11,8 @@
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" data-url="/manager/outsource/add" lay-submit lay-filter="saveBtn">确认保存</button>
<input type="hidden" name="worksite_id" value="{$worksiteId ?? 0}">
<button class="layui-btn layui-btn-normal" data-url="/manager/outsource/add?worksite_id={$worksiteId ?? 0}" lay-submit lay-filter="saveBtn">确认保存</button>
</div>
</div>
</div>

View File

@ -24,7 +24,7 @@
</div>
</fieldset>
<div class="image-table">
<table id="table-container" class="layui-table" data-url="/manager/outsource/index" lay-filter="table-container-filter"></table>
<table id="table-container" class="layui-table" data-url="/manager/outsource/index?worksite_id={$worksiteId ?? 0}" lay-filter="table-container-filter"></table>
</div>
</div>
</div>
@ -39,13 +39,14 @@
<!-- 操作列 -->
<script type="text/html" id="row-operate">
<a class="layui-btn layui-btn-primary layui-btn-xs" data-href="/manager/outsource/edit.html?id={{d.id}}" data-title="编辑" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" data-href="/manager/account/index/index.html?outsource_id={{d.id}}&role=1" data-title="班组【{{d.name}}】工人列表" lay-event="edit">工人列表</a>
<!-- <a class="layui-btn layui-btn-danger layui-btn-xs" data-href="/manager/outsource/del.html" lay-event="del">删除</a>-->
</script>
<!-- toolbar -->
<script type="text/html" id="toolbar-tpl">
<a class="layui-btn layui-btn-primary layui-btn-sm" data-table-refresh lay-event="refresh"><i class="fa fa-refresh"></i></a>
<a class="layui-btn layui-btn-normal layui-btn-sm" data-href="/manager/outsource/add.html" data-title="添加" lay-event="add">添加</a>
<a class="layui-btn layui-btn-normal layui-btn-sm" data-href="/manager/outsource/add.html?worksite_id={$worksiteId ?? 0}" data-title="添加" lay-event="add">添加</a>
<!-- <a class="layui-btn layui-btn-danger layui-btn-sm" data-href="/manager/outsource/del.html" lay-event="del">删除</a>-->
</script>

View File

@ -39,7 +39,7 @@
<!-- 操作列 -->
<script type="text/html" id="row-operate">
<a class="layui-btn layui-btn-primary layui-btn-xs" data-href="/manager/worksite/edit.html?id={{d.id}}" data-title="编辑" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" data-href="/manager/worksite-outsource/index.html?worksite_id={{d.id}}" data-title="【{{d.name}}】分包单位" lay-event="detail">分包单位</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" data-href="/manager/outsource/index.html?worksite_id={{d.id}}" data-title="【{{d.name}}】班组" lay-event="detail">班组</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" data-href="/manager/account/index/index.html?worksite_id={{d.id}}&role=1" data-title="【{{d.name}}】工人列表" lay-event="detail">工人列表</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" data-href="/manager/worksite/outlay.html?worksite_id={{d.id}}" data-title="【{{d.name}}】项目开支汇总" lay-event="detail">项目开支汇总</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" data-href="/manager/project-log/index.html?worksite_id={{d.id}}" data-title="【{{d.name}}】项目日志" lay-event="detail">项目日志</a>

View File

@ -1,7 +1,7 @@
{layout name="manager/layout" /}
<div class="layui-bg-gray location-detail-page" style="padding: 30px;">
<div class="layui-row layui-col-space15">
<div class="layui-col-xs12 layui-col-md4">
<div class="layui-col-xs12 layui-col-md12">
<div class="layui-card top-panel">
<div class="layui-card-header">工地总支出</div>
@ -15,35 +15,36 @@
</div>
</div>
<div class="layui-col-xs12 layui-col-md4">
</div>
<div class="layui-row layui-col-space15">
<fieldset class="table-search-fieldset" style="display: none;border-color: #eee;border-width: 1px;">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">开始时间</label>
<div class="layui-input-inline">
<input type="text" name="begin" id="date-begin" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-card top-panel">
<div class="layui-card-header">工地工资支出</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space5">
<div class="layui-col-xs9 layui-col-md9 top-panel-number">
{$item.pay ?? 0}
<div class="layui-inline">
<label class="layui-form-label">结束时间</label>
<div class="layui-input-inline">
<input type="text" name="end" id="date-end" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button type="submit" class="layui-btn layui-btn-primary" lay-submit lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索</button>
</div>
</div>
</div>
</form>
</div>
</div>
<div class="layui-col-xs12 layui-col-md4">
<div class="layui-card top-panel">
<div class="layui-card-header">分包单位支出</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space5">
<div class="layui-col-xs9 layui-col-md9 top-panel-number">
{$item.outsource ?? 0}
</div>
</div>
</div>
</div>
</div>
</fieldset>
<table id="table-container" class="layui-table" data-url="/manager/worksite/outlay?worksite_id={$worksiteId ?? 0}" lay-filter="table-container-filter"></table>
</div>
</div>
<script src="__MANAGER__/js/account/account.js?v={:mt_rand()}"></script>
<script src="__MANAGER__/js/worksite/worksite.js?v={:mt_rand()}"></script>