添加后台产量录入

dev
vine_liutk 2022-11-03 18:47:05 +08:00
parent d68bf141ce
commit 7ea9994dba
9 changed files with 12366 additions and 1 deletions

View File

@ -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);
}
}

View File

@ -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');
});
}
}

View File

@ -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]);
}
}

View File

@ -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();

View File

@ -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');
});

View File

@ -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',

View File

@ -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' => [
],
];

12014
public/vendor/vue/vue.js vendored 100644

File diff suppressed because it is too large Load Diff

View File

@ -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>