This commit is contained in:
weiz 2024-01-09 11:24:53 +08:00
parent 6a57ca15c9
commit 24a4e1f3b1
7 changed files with 435 additions and 273 deletions

View File

@ -16,6 +16,10 @@ namespace app\adminapi\lists\project;
use app\adminapi\lists\BaseAdminDataLists; use app\adminapi\lists\BaseAdminDataLists;
use app\common\model\material\Material;
use app\common\model\material\MaterialClassify;
use app\common\model\project\Project;
use app\common\model\project\ProjectMaterialBudget;
use app\common\model\project\ProjectMaterialBudgetDetail; use app\common\model\project\ProjectMaterialBudgetDetail;
use app\common\lists\ListsSearchInterface; use app\common\lists\ListsSearchInterface;
@ -38,7 +42,7 @@ class ProjectMaterialBudgetDetailLists extends BaseAdminDataLists implements Lis
public function setSearch(): array public function setSearch(): array
{ {
return [ return [
'=' => ['material_budget_id', 'material_id', 'budget_type'], '=' => ['material_budget_id', 'project_id', 'material_id', 'budget_type'],
]; ];
} }
@ -55,10 +59,33 @@ class ProjectMaterialBudgetDetailLists extends BaseAdminDataLists implements Lis
public function lists(): array public function lists(): array
{ {
return ProjectMaterialBudgetDetail::where($this->searchWhere) return ProjectMaterialBudgetDetail::where($this->searchWhere)
->field(['id', 'material_budget_id', 'material_id', 'budget_type', 'price', 'num', 'amount', 'remark']) ->field('id,project_id,material_budget_id,material_id,budget_type,price,num,amount,remark')
->limit($this->limitOffset, $this->limitLength) ->limit($this->limitOffset, $this->limitLength)
->order(['id' => 'desc']) ->order(['id' => 'desc'])
->select() ->select()->each(function($data){
$material_budget = ProjectMaterialBudget::field('material_budget_code')->where('id',$data['material_budget_id'])->findOrEmpty();
$project = Project::field('name,project_code')->where('id',$data['project_id'])->findOrEmpty();
$material = Material::field('first_level,second_level,three_level,name,code,specs,brand,parameter_description,unit')->where('id',$data['material_id'])->findOrEmpty();
$material_classify = MaterialClassify::where('id','in',[$material['first_level'],$material['second_level'],$material['three_level']])->column('name','id');
$data['budget_type'] = $data->budget_type_text;
$data['material_budget_code'] = $material_budget['material_budget_code'];
$data['project_name'] = $project['name'];
$data['project_code'] = $project['project_code'];
$data['material_first_level'] = $material_classify[$material['first_level']];
$data['material_second_level'] = !empty($material_classify[$material['second_level']]) ? $material_classify[$material['second_level']] : '';
$data['material_three_level'] = !empty($material_classify[$material['three_level']]) ? $material_classify[$material['three_level']] : '';
$data['material_name'] = $material['name'];
$data['material_code'] = $material['code'];
$data['material_specs'] = $material['specs'];
$data['material_brand'] = $material['brand'];
$data['material_parameter_description'] = $material['parameter_description'];
$data['material_unit'] = $material['unit'];
//申购数量
$data['apply_num'] = 0;
//剩余预算数量
$data['residual_num'] = $data['num'] - $data['apply_num'];
return $data;
})
->toArray(); ->toArray();
} }

View File

@ -16,8 +16,10 @@ namespace app\adminapi\lists\project;
use app\adminapi\lists\BaseAdminDataLists; use app\adminapi\lists\BaseAdminDataLists;
use app\common\model\project\Project;
use app\common\model\project\ProjectMaterialBudget; use app\common\model\project\ProjectMaterialBudget;
use app\common\lists\ListsSearchInterface; use app\common\lists\ListsSearchInterface;
use app\common\model\project\ProjectMaterialBudgetDetail;
/** /**
@ -39,6 +41,7 @@ class ProjectMaterialBudgetLists extends BaseAdminDataLists implements ListsSear
{ {
return [ return [
'=' => ['project_id', 'material_id', 'budget_type'], '=' => ['project_id', 'material_id', 'budget_type'],
]; ];
} }
@ -55,10 +58,23 @@ class ProjectMaterialBudgetLists extends BaseAdminDataLists implements ListsSear
public function lists(): array public function lists(): array
{ {
return ProjectMaterialBudget::where($this->searchWhere) return ProjectMaterialBudget::where($this->searchWhere)
->field(['id', 'project_id', 'material_id', 'budget_type', 'num', 'price', 'amount', 'remark']) ->field('id,project_id,material_budget_code,remark,annex')
->limit($this->limitOffset, $this->limitLength) ->limit($this->limitOffset, $this->limitLength)
->order(['id' => 'desc']) ->order(['id' => 'desc'])
->select() ->select()->each(function($data){
$project = Project::field('name,project_code')->where('id',$data['project_id'])->findOrEmpty();
$data['project_name'] = $project['name'];
$data['project_code'] = $project['project_code'];
//预算总数量
$data['total_num'] = ProjectMaterialBudgetDetail::where('material_budget_id',$data['id'])->sum('num');
//预算总金额
$data['total_amount'] = ProjectMaterialBudgetDetail::where('material_budget_id',$data['id'])->sum('amount');
//申购总数量
$data['total_apply_num'] = 0;
//剩余预算总数量
$data['total_residual_num'] = $data['total_num'] - $data['total_apply_num'];
return $data;
})
->toArray(); ->toArray();
} }

View File

@ -15,6 +15,10 @@
namespace app\adminapi\logic\project; namespace app\adminapi\logic\project;
use app\common\model\material\Material;
use app\common\model\material\MaterialClassify;
use app\common\model\project\Project;
use app\common\model\project\ProjectMaterialBudget;
use app\common\model\project\ProjectMaterialBudgetDetail; use app\common\model\project\ProjectMaterialBudgetDetail;
use app\common\logic\BaseLogic; use app\common\logic\BaseLogic;
use think\facade\Db; use think\facade\Db;
@ -38,18 +42,19 @@ class ProjectMaterialBudgetDetailLogic extends BaseLogic
*/ */
public static function add(array $params): bool public static function add(array $params): bool
{ {
$material_budget = ProjectMaterialBudget::field('project_id')->where('id',$params['material_budget_id'])->findOrEmpty();
Db::startTrans(); Db::startTrans();
try { try {
ProjectMaterialBudgetDetail::create([ ProjectMaterialBudgetDetail::create([
'project_id' => $material_budget['project_id'],
'material_budget_id' => $params['material_budget_id'], 'material_budget_id' => $params['material_budget_id'],
'material_id' => $params['material_id'], 'material_id' => $params['material_id'],
'budget_type' => $params['budget_type'], 'budget_type' => $params['budget_type'],
'price' => $params['price'], 'price' => $params['price'],
'num' => $params['num'], 'num' => $params['num'],
'amount' => $params['amount'], 'amount' => $params['price'] * $params['num'],
'remark' => $params['remark'], 'remark' => $params['remark'] ?? '',
]); ]);
Db::commit(); Db::commit();
return true; return true;
} catch (\Exception $e) { } catch (\Exception $e) {
@ -69,18 +74,19 @@ class ProjectMaterialBudgetDetailLogic extends BaseLogic
*/ */
public static function edit(array $params): bool public static function edit(array $params): bool
{ {
$material_budget = ProjectMaterialBudget::field('project_id')->where('id',$params['material_budget_id'])->findOrEmpty();
Db::startTrans(); Db::startTrans();
try { try {
ProjectMaterialBudgetDetail::where('id', $params['id'])->update([ ProjectMaterialBudgetDetail::where('id', $params['id'])->update([
'project_id' => $material_budget['project_id'],
'material_budget_id' => $params['material_budget_id'], 'material_budget_id' => $params['material_budget_id'],
'material_id' => $params['material_id'], 'material_id' => $params['material_id'],
'budget_type' => $params['budget_type'], 'budget_type' => $params['budget_type'],
'price' => $params['price'], 'price' => $params['price'],
'num' => $params['num'], 'num' => $params['num'],
'amount' => $params['amount'], 'amount' => $params['price'] * $params['num'],
'remark' => $params['remark'], 'remark' => $params['remark'] ?? '',
]); ]);
Db::commit(); Db::commit();
return true; return true;
} catch (\Exception $e) { } catch (\Exception $e) {
@ -113,6 +119,24 @@ class ProjectMaterialBudgetDetailLogic extends BaseLogic
*/ */
public static function detail($params): array public static function detail($params): array
{ {
return ProjectMaterialBudgetDetail::findOrEmpty($params['id'])->toArray(); $data = ProjectMaterialBudgetDetail::field('id,project_id,material_budget_id,material_id,budget_type,price,num,amount,remark')->findOrEmpty($params['id']);
$material_budget = ProjectMaterialBudget::field('material_budget_code')->where('id',$data['material_budget_id'])->findOrEmpty();
$project = Project::field('name,project_code')->where('id',$data['project_id'])->findOrEmpty();
$material = Material::field('first_level,second_level,three_level,name,code,specs,brand,parameter_description,unit')->where('id',$data['material_id'])->findOrEmpty();
$material_classify = MaterialClassify::where('id','in',[$material['first_level'],$material['second_level'],$material['three_level']])->column('name','id');
$data['budget_type_text'] = $data->budget_type_text;
$data['material_budget_code'] = $material_budget['material_budget_code'];
$data['project_name'] = $project['name'];
$data['project_code'] = $project['project_code'];
$data['material_first_level'] = $material_classify[$material['first_level']];
$data['material_second_level'] = !empty($material_classify[$material['second_level']]) ? $material_classify[$material['second_level']] : '';
$data['material_three_level'] = !empty($material_classify[$material['three_level']]) ? $material_classify[$material['three_level']] : '';
$data['material_name'] = $material['name'];
$data['material_code'] = $material['code'];
$data['material_specs'] = $material['specs'];
$data['material_brand'] = $material['brand'];
$data['material_parameter_description'] = $material['parameter_description'];
$data['material_unit'] = $material['unit'];
return $data->toArray();
} }
} }

View File

@ -15,8 +15,12 @@
namespace app\adminapi\logic\project; namespace app\adminapi\logic\project;
use app\common\model\dept\Dept;
use app\common\model\dept\Orgs;
use app\common\model\project\Project;
use app\common\model\project\ProjectMaterialBudget; use app\common\model\project\ProjectMaterialBudget;
use app\common\logic\BaseLogic; use app\common\logic\BaseLogic;
use app\common\model\project\ProjectMaterialBudgetDetail;
use think\facade\Db; use think\facade\Db;
@ -38,9 +42,10 @@ class ProjectMaterialBudgetLogic extends BaseLogic
*/ */
public static function add(array $params): bool public static function add(array $params): bool
{ {
$detail = json_decode($params['material_budget_detail'],true);
Db::startTrans(); Db::startTrans();
try { try {
ProjectMaterialBudget::create([ $project_material_budget = ProjectMaterialBudget::create([
'org_id' => $params['org_id'], 'org_id' => $params['org_id'],
'dept_id' => $params['dept_id'], 'dept_id' => $params['dept_id'],
'project_id' => $params['project_id'], 'project_id' => $params['project_id'],
@ -48,6 +53,19 @@ class ProjectMaterialBudgetLogic extends BaseLogic
'remark' => $params['remark'] ?? '', 'remark' => $params['remark'] ?? '',
'annex' => !empty($params['annex']) ? $params['annex'] : null, 'annex' => !empty($params['annex']) ? $params['annex'] : null,
]); ]);
foreach ($detail as $item)
{
ProjectMaterialBudgetDetail::create([
'project_id' => $params['project_id'],
'material_budget_id' => $project_material_budget->id,
'material_id' => $item['material_id'],
'budget_type' => 0,
'price' => $item['price'],
'num' => $item['num'],
'amount' => $item['price'] * $item['num'],
'remark' => $item['remark'] ?? '',
]);
}
Db::commit(); Db::commit();
return true; return true;
} catch (\Exception $e) { } catch (\Exception $e) {
@ -67,6 +85,7 @@ class ProjectMaterialBudgetLogic extends BaseLogic
*/ */
public static function edit(array $params): bool public static function edit(array $params): bool
{ {
$detail = json_decode($params['material_budget_detail'],true);
Db::startTrans(); Db::startTrans();
try { try {
ProjectMaterialBudget::where('id', $params['id'])->update([ ProjectMaterialBudget::where('id', $params['id'])->update([
@ -76,6 +95,31 @@ class ProjectMaterialBudgetLogic extends BaseLogic
'remark' => $params['remark'] ?? '', 'remark' => $params['remark'] ?? '',
'annex' => !empty($params['annex']) ? $params['annex'] : null, 'annex' => !empty($params['annex']) ? $params['annex'] : null,
]); ]);
foreach ($detail as $item)
{
if(isset($item['id']) && $item['id'] != ''){
ProjectMaterialBudgetDetail::where('id',$item['id'])->update([
'project_id' => $params['project_id'],
'material_budget_id' => $params['id'],
'material_id' => $item['material_id'],
'price' => $item['price'],
'num' => $item['num'],
'amount' => $item['price'] * $item['num'],
'remark' => $item['remark'] ?? '',
]);
}else{
ProjectMaterialBudgetDetail::create([
'project_id' => $params['project_id'],
'material_budget_id' => $params['id'],
'material_id' => $item['material_id'],
'budget_type' => 0,
'price' => $item['price'],
'num' => $item['num'],
'amount' => $item['price'] * $item['num'],
'remark' => $item['remark'] ?? '',
]);
}
}
Db::commit(); Db::commit();
return true; return true;
} catch (\Exception $e) { } catch (\Exception $e) {
@ -108,6 +152,14 @@ class ProjectMaterialBudgetLogic extends BaseLogic
*/ */
public static function detail($params): array public static function detail($params): array
{ {
return ProjectMaterialBudget::findOrEmpty($params['id'])->toArray(); $data = ProjectMaterialBudget::field('id,org_id,dept_id,project_id,material_budget_code,remark,annex')->findOrEmpty($params['id']);
$org = Orgs::field('name')->where('id',$data['org_id'])->findOrEmpty();
$dept = Dept::field('name')->where('id',$data['dept_id'])->findOrEmpty();
$project = Project::field('name,project_code')->where('id',$data['project_id'])->findOrEmpty();
$data['org_name'] = $org['name'];
$data['dept_name'] = $dept['name'];
$data['project_name'] = $project['name'];
$data['project_code'] = $project['project_code'];
return $data->toArray();
} }
} }

View File

@ -15,6 +15,9 @@
namespace app\adminapi\validate\project; namespace app\adminapi\validate\project;
use app\common\model\dict\DictData;
use app\common\model\material\Material;
use app\common\model\project\ProjectMaterialBudget;
use app\common\validate\BaseValidate; use app\common\validate\BaseValidate;
@ -32,12 +35,11 @@ class ProjectMaterialBudgetDetailValidate extends BaseValidate
*/ */
protected $rule = [ protected $rule = [
'id' => 'require', 'id' => 'require',
'material_budget_id' => 'require', 'material_budget_id' => 'require|checkMaterialBudget',
'material_id' => 'require', 'material_id' => 'require|checkMaterial',
'budget_type' => 'require', 'budget_type' => 'require|checkBudgetType',
'price' => 'require', 'price' => 'require|float|egt:0',
'num' => 'require', 'num' => 'require|integer|gt:0',
'amount' => 'require',
]; ];
@ -45,14 +47,17 @@ class ProjectMaterialBudgetDetailValidate extends BaseValidate
* 参数描述 * 参数描述
* @var string[] * @var string[]
*/ */
protected $field = [ protected $message = [
'id' => 'id', 'id.require' => '缺少必要参数',
'material_budget_id' => '材料预算id', 'material_budget_id.require' => '请选择材料预算',
'material_id' => '材料id', 'material_id.require' => '请选择材料',
'budget_type' => '预算类型', 'budget_type.require' => '请选择类型',
'price' => '材料单价', 'price.require' => '请填写单价',
'num' => '材料数量', 'price.float' => '单价值必须是数字',
'amount' => '金额', 'price.egt' => '单价值必须大于等于0',
'num.require' => '请填写数量',
'num.integer' => '数量值必须时整数',
'num.gt' => '数量值必须大于0',
]; ];
@ -64,7 +69,7 @@ class ProjectMaterialBudgetDetailValidate extends BaseValidate
*/ */
public function sceneAdd() public function sceneAdd()
{ {
return $this->only(['material_budget_id','material_id','budget_type','price','num','amount']); return $this->remove('id',true);
} }
@ -75,9 +80,7 @@ class ProjectMaterialBudgetDetailValidate extends BaseValidate
* @date 2024/01/08 21:52 * @date 2024/01/08 21:52
*/ */
public function sceneEdit() public function sceneEdit()
{ {}
return $this->only(['id','material_budget_id','material_id','budget_type','price','num','amount']);
}
/** /**
@ -103,4 +106,31 @@ class ProjectMaterialBudgetDetailValidate extends BaseValidate
return $this->only(['id']); return $this->only(['id']);
} }
public function checkMaterialBudget($value): bool|string
{
$material_budget = ProjectMaterialBudget::where('id',$value)->findOrEmpty();
if($material_budget->isEmpty()){
return '材料预算信息不存在';
}
return true;
}
public function checkMaterial($value): bool|string
{
$material = Material::where('id',$value)->findOrEmpty();
if($material->isEmpty()){
return '材料信息不存在';
}
return true;
}
public function checkBudgetType($value): bool|string
{
$dict = DictData::where('type_value','budget_type')->column('value');
if(!in_array($value,$dict)){
return '类型值无效';
}
return true;
}
} }

View File

@ -18,6 +18,7 @@ use app\common\model\dept\Dept;
use app\common\model\dept\Orgs; use app\common\model\dept\Orgs;
use app\common\model\material\Material; use app\common\model\material\Material;
use app\common\model\project\Project; use app\common\model\project\Project;
use app\common\model\project\ProjectMaterialBudgetDetail;
use app\common\validate\BaseValidate; use app\common\validate\BaseValidate;
@ -44,6 +45,8 @@ class ProjectMaterialBudgetValidate extends BaseValidate
protected $message = [ protected $message = [
'id.require' => '缺少必要参数', 'id.require' => '缺少必要参数',
'org_id.require' => '请选择组织',
'dept_id.require' => '请选择部门',
'project_id.require' => '请选择项目', 'project_id.require' => '请选择项目',
'material_budget_detail.require' => '请填写材料预算清单' 'material_budget_detail.require' => '请填写材料预算清单'
]; ];
@ -146,6 +149,12 @@ class ProjectMaterialBudgetValidate extends BaseValidate
return '材料预算清单数据格式错误'; return '材料预算清单数据格式错误';
} }
foreach($detail as $v) { foreach($detail as $v) {
if(isset($v['id']) && $v['id'] != ''){
$data_detail = ProjectMaterialBudgetDetail::where('id',$v['id'])->findOrEmpty();
if($data_detail->isEmpty()){
return '材料预算明细信息不存在';
}
}
if(empty($v['material_id'])){ if(empty($v['material_id'])){
return '请选择材料'; return '请选择材料';
}else{ }else{

View File

@ -16,6 +16,7 @@ namespace app\common\model\project;
use app\common\model\BaseModel; use app\common\model\BaseModel;
use app\common\model\dict\DictData;
use think\model\concern\SoftDelete; use think\model\concern\SoftDelete;
@ -30,5 +31,8 @@ class ProjectMaterialBudgetDetail extends BaseModel
protected $name = 'project_material_budget_detail'; protected $name = 'project_material_budget_detail';
protected $deleteTime = 'delete_time'; protected $deleteTime = 'delete_time';
public function getBudgetTypeTextAttr($value,$data){
$dict = DictData::where('type_value','budget_type')->column('name','value');
return $dict[$data['budget_type']];
}
} }