添加后台产量录入
parent
d68bf141ce
commit
7ea9994dba
|
|
@ -7,6 +7,7 @@ use Dcat\Admin\Form;
|
|||
use Dcat\Admin\Grid;
|
||||
use Dcat\Admin\Show;
|
||||
use Dcat\Admin\Admin;
|
||||
use App\Http\Resources\CropResource;
|
||||
use Peidikeji\Keywords\Models\Keywords;
|
||||
use Dcat\Admin\Http\Controllers\AdminController;
|
||||
|
||||
|
|
@ -100,4 +101,9 @@ class CropController extends AdminController
|
|||
$form->display('updated_at');
|
||||
});
|
||||
}
|
||||
|
||||
public function info($id){
|
||||
$crop = Crop::findOrFail($id);
|
||||
return CropResource::make($crop);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,138 @@
|
|||
<?php
|
||||
|
||||
namespace App\Admin\Controllers;
|
||||
|
||||
use App\Models\Crop;
|
||||
use Dcat\Admin\Form;
|
||||
use Dcat\Admin\Grid;
|
||||
use Dcat\Admin\Show;
|
||||
use Dcat\Admin\Admin;
|
||||
use App\Models\CropYield;
|
||||
use App\Models\AgriculturalBase;
|
||||
use Dcat\Admin\Http\Controllers\AdminController;
|
||||
|
||||
class CropYieldController extends AdminController
|
||||
{
|
||||
/**
|
||||
* Make a grid builder.
|
||||
*
|
||||
* @return Grid
|
||||
*/
|
||||
protected function grid()
|
||||
{
|
||||
$builder = CropYield::with(['base', 'crop', 'createdBy', 'updatedBy']);
|
||||
return Grid::make($builder, function (Grid $grid) {
|
||||
$grid->column('id')->sortable();
|
||||
$grid->column('base.name', '区域')->label();
|
||||
$grid->column('crop.name', '农作物');
|
||||
$grid->column('time_year')->append('年');
|
||||
$grid->column('quarter')->display(function($v){
|
||||
return '第'.$v.'季度';
|
||||
});
|
||||
$grid->column('yield')->display(function($v){
|
||||
return $v.$this->crop?->unit ?? '';
|
||||
});
|
||||
$grid->column('cultivated');
|
||||
$grid->column('output');
|
||||
$grid->column('createdBy.name', '录入人');
|
||||
$grid->column('updatedBy.name', '更新人');
|
||||
$grid->column('created_at')->sortable();
|
||||
|
||||
$grid->model()->orderBy('time_year', 'desc')->orderBy('quarter', 'asc');
|
||||
|
||||
$grid->showCreateButton(! config('admin.permission.enable') || Admin::user()->can('dcat.admin.crop_yields.create'));
|
||||
$grid->showQuickEditButton(! config('admin.permission.enable') || Admin::user()->can('dcat.admin.crop_yields.edit'));
|
||||
$grid->showDeleteButton(! config('admin.permission.enable') || Admin::user()->can('dcat.admin.crop_yields.destroy'));
|
||||
|
||||
$grid->filter(function (Grid\Filter $filter) {
|
||||
$filter->equal('base_id')->select(AgriculturalBase::all()->pluck('name', 'name'))->width(3);
|
||||
$filter->equal('crop_id')->select(Crop::where('is_end', 1)->pluck('name', 'id'))->width(3);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a show builder.
|
||||
*
|
||||
* @param mixed $id
|
||||
*
|
||||
* @return Show
|
||||
*/
|
||||
protected function detail($id)
|
||||
{
|
||||
return Show::make($id, new CropYield(), function (Show $show) {
|
||||
$show->field('id');
|
||||
$show->field('base_id');
|
||||
$show->field('crop_id');
|
||||
$show->field('time_year');
|
||||
$show->field('quarter');
|
||||
$show->field('yield');
|
||||
$show->field('cultivated');
|
||||
$show->field('output');
|
||||
$show->field('created_by');
|
||||
$show->field('updated_by');
|
||||
$show->field('created_at');
|
||||
$show->field('updated_at');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a form builder.
|
||||
*
|
||||
* @return Form
|
||||
*/
|
||||
protected function form()
|
||||
{
|
||||
$builder = CropYield::with(['base', 'crop']);
|
||||
return Form::make($builder, function (Form $form) {
|
||||
$model = $form->model();
|
||||
|
||||
$form->display('id');
|
||||
$form->select('base_id')->options(AgriculturalBase::all()->pluck('name', 'id'));
|
||||
$form->select('crop_id')->options(Crop::where('is_end', 1)->pluck('name', 'id'));
|
||||
|
||||
$form->datetime('time_year')->format('YYYY')->required();
|
||||
$form->radio('quarter')->options([
|
||||
1=>'1季度',2=>'2季度',3=>'3季度',4=>'4季度',
|
||||
])->default(1)->required();
|
||||
$form->currency('yield')->symbol($model->crop?->unit ?? '斤');
|
||||
|
||||
Admin::script(
|
||||
<<<JS
|
||||
let crop;
|
||||
$('body').on('select2:select', 'select.field_crop_id', function(e){
|
||||
let url_path = '/admin/api/crops/' + e.params.data.id
|
||||
$.ajax({
|
||||
type: 'get',
|
||||
dataType: 'json',
|
||||
url: url_path,
|
||||
success: function(result){
|
||||
crop = result.data;
|
||||
$('input[name=yield]').parent().find('span.input-group-text').text(crop.unit);
|
||||
}
|
||||
});
|
||||
});
|
||||
JS
|
||||
);
|
||||
$form->cropExtends('extends', '扩展信息')->crop($model->crop)->listen('crop_id');
|
||||
|
||||
$form->currency('cultivated')->symbol('亩')->default(0)->required()->saving(function ($v) {
|
||||
if ($v === null) {
|
||||
$v = 0;
|
||||
}
|
||||
return $v;
|
||||
});
|
||||
$form->currency('output')->symbol('元')->default(0)->required()->saving(function ($v) {
|
||||
if ($v === null) {
|
||||
$v = 0;
|
||||
}
|
||||
return $v;
|
||||
});
|
||||
// $form->text('created_by');
|
||||
// $form->text('updated_by');
|
||||
|
||||
$form->display('created_at');
|
||||
$form->display('updated_at');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
<?php
|
||||
|
||||
namespace App\Admin\Form;
|
||||
|
||||
use Dcat\Admin\Form\Field;
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
class CropExtends extends Field
|
||||
{
|
||||
protected $view = 'admin.form.crop_extends';
|
||||
|
||||
protected $listen = '';
|
||||
|
||||
protected static $js = [
|
||||
'/vendor/vue/vue.js',
|
||||
// 'https://cdn.jsdelivr.net/npm/vue/dist/vue.js' // 这里可以将vue.js下载下来引入
|
||||
];
|
||||
|
||||
public function listen($listen = '')
|
||||
{
|
||||
$this->listen = $listen;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
$this->addVariables(['listen' => $this->listen]);
|
||||
return parent::render();
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化保存值
|
||||
*
|
||||
* @param [type] $data
|
||||
* @return void
|
||||
*/
|
||||
protected function prepareInputValue($value)
|
||||
{
|
||||
$value = json_decode($value, true);
|
||||
$toValue = null;
|
||||
if($value){
|
||||
foreach($value as $item){
|
||||
$toValue[$item['name']] = $item['value'];
|
||||
}
|
||||
}
|
||||
return $toValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化渲染值
|
||||
*
|
||||
* @param [type] $value
|
||||
* @return void
|
||||
*/
|
||||
protected function formatFieldData($data)
|
||||
{
|
||||
$value = parent::formatFieldData($data);
|
||||
|
||||
$crop = Arr::get($this->variables, 'crop', null);
|
||||
$toValue = [];
|
||||
if($crop && $crop->extends){
|
||||
$extends = json_decode($crop->extends, true);
|
||||
foreach ($extends as $ext){
|
||||
$toValue[] = array_merge($ext, ['value'=>$value[$ext['name']] ?? null]);
|
||||
}
|
||||
}
|
||||
|
||||
return json_encode($toValue);
|
||||
}
|
||||
|
||||
public function crop($crop)
|
||||
{
|
||||
return $this->addVariables(['crop' => $crop]);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -5,6 +5,7 @@ use Dcat\Admin\Grid;
|
|||
use Dcat\Admin\Show;
|
||||
use Dcat\Admin\Admin;
|
||||
use App\Admin\Form\Amap;
|
||||
use App\Admin\Form\CropExtends;
|
||||
|
||||
/**
|
||||
* Dcat-admin - admin builder based on Laravel.
|
||||
|
|
@ -25,6 +26,7 @@ use App\Admin\Form\Amap;
|
|||
* Admin::js('/packages/prettydocs/js/main.js');
|
||||
*/
|
||||
Form::extend('amap', Amap::class);
|
||||
Form::extend('cropExtends', CropExtends::class);
|
||||
|
||||
Grid::resolving(function (Grid $grid) {
|
||||
$grid->disableRowSelector();
|
||||
|
|
|
|||
|
|
@ -18,4 +18,7 @@ Route::group([
|
|||
$router->resource('agricultural-bases', 'AgriculturalBaseController')->names('agricultural_bases');
|
||||
|
||||
$router->resource('crops', 'CropController')->names('crops');
|
||||
$router->get('api/crops/{id}', 'CropController@info')->name('api.crops.info');
|
||||
|
||||
$router->resource('crop-yields', 'CropYieldController')->names('crop_yields');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -4,10 +4,11 @@ namespace App\Models;
|
|||
|
||||
use EloquentFilter\Filterable;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Dcat\Admin\Traits\HasDateTimeFormatter;
|
||||
|
||||
class CropYield extends Model
|
||||
{
|
||||
use Filterable;
|
||||
use Filterable, HasDateTimeFormatter;
|
||||
|
||||
protected $casts = [
|
||||
'extends'=>'array',
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
return [
|
||||
'labels' => [
|
||||
'CropYield' => 'CropYield',
|
||||
'crop-yield' => 'CropYield',
|
||||
],
|
||||
'fields' => [
|
||||
'base_id' => '基地',
|
||||
'crop_id' => '农产品',
|
||||
'time_year' => '年份',
|
||||
'quarter' => '季度',
|
||||
'yield' => '产量',
|
||||
'cultivated' => '耕地面积(亩)',
|
||||
'output' => '产值(元)',
|
||||
'created_by' => '创建人',
|
||||
'updated_by' => '修改人',
|
||||
],
|
||||
'options' => [
|
||||
],
|
||||
];
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,105 @@
|
|||
<div class="{{$viewClass['form-group']}}">
|
||||
|
||||
<label class="{{$viewClass['label']}} control-label">{!! $label !!}</label>
|
||||
|
||||
<div class="{{$viewClass['field']}}">
|
||||
|
||||
@include('admin::form.error')
|
||||
|
||||
<div class="{{ $class }}" style="width: 100%; height: 100%;">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="form-group row form-field" initialized="1" >
|
||||
<table class="table table-hover">
|
||||
<tbody class="kv-table">
|
||||
<tr v-for="i in extend_data">
|
||||
<td>
|
||||
<div class="form-group " style="margin-bottom: 0 !important;">
|
||||
<div class="col-sm-12 input-group">
|
||||
<div class="help-block with-errors"></div>
|
||||
<span class="input-group-prepend"><span class="input-group-text bg-white">@{{i.unit}}</span></span>
|
||||
<input name="" class="form-control" v-model="i.name" disabled>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="form-group " style="margin-bottom: 0 !important;">
|
||||
<div class="col-sm-12 input-group">
|
||||
<div class="help-block with-errors"></div>
|
||||
<input name="" class="form-control" v-model="i.value" onInput="value=value.replace(/[^\d^\.]+/g,'').replace('.','$#$').replace(/\./g,'').replace('$#$','.')" :placeholder="i.unit">
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<input type="hidden" name="{{ $name }}" :value="getExtends">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@include('admin::form.help-block')
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script init="{!! $selector !!}">
|
||||
|
||||
var vm = new Vue({
|
||||
el: '#' + id,
|
||||
data: {
|
||||
extend_data:[]
|
||||
},
|
||||
created() {
|
||||
this.createStart();
|
||||
},
|
||||
computed: {
|
||||
getExtends() {
|
||||
return JSON.stringify(this.extend_data);
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
createStart(){//初始化数据
|
||||
var selectExtendValue = (new Function("return " + '{!! $value !!}'))();
|
||||
if(selectExtendValue && selectExtendValue.length > 0){
|
||||
for(j = 0, len=selectExtendValue.length; j < len; j++){
|
||||
this.extend_data.push(selectExtendValue[j]);
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function getCropExtends(cropId){
|
||||
$.ajax({
|
||||
type: 'get',
|
||||
dataType: 'json',
|
||||
url: '/admin/api/crops/' + cropId,
|
||||
success: function (result) {
|
||||
vm.extend_data = [];
|
||||
let crop = result.data;
|
||||
let crop_extends;
|
||||
if(crop && crop.extends){
|
||||
crop_extends = JSON.parse(crop.extends);
|
||||
}
|
||||
|
||||
if(crop_extends && crop_extends.length > 0){
|
||||
for(j = 0, len=crop_extends.length; j < len; j++){
|
||||
vm.extend_data.push({
|
||||
"name": crop_extends[j].name,
|
||||
"unit": crop_extends[j].unit,
|
||||
"value": null,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
$("[name='{{ $listen }}']").on('change', function(){
|
||||
var crop_id = this.options[this.options.selectedIndex].value;
|
||||
getCropExtends(crop_id);
|
||||
})
|
||||
|
||||
</script>
|
||||
Loading…
Reference in New Issue