248 lines
7.7 KiB
PHP
248 lines
7.7 KiB
PHP
<?php
|
|
|
|
namespace app\common\service;
|
|
|
|
use app\common\validate\InvRequisitionValidate;
|
|
use app\common\traits\crud\CrudServiceTrait;
|
|
use app\common\model\InvRequisition;
|
|
use app\common\model\InvRequisitionAttachment;
|
|
use app\common\model\InvRequisitionItem;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use support\Request;
|
|
use support\Db;
|
|
use support\exception\BusinessException;
|
|
|
|
class InvRequisitionService
|
|
{
|
|
|
|
use CrudServiceTrait;
|
|
|
|
/**
|
|
* 指定当前要操作的模型
|
|
*/
|
|
protected string $modelClass = InvRequisition::class;
|
|
|
|
/**
|
|
* 验证器
|
|
*/
|
|
protected $validator = InvRequisitionValidate::class;
|
|
|
|
/**
|
|
* 获取验证器
|
|
*/
|
|
public function getValidator()
|
|
{
|
|
return new $this->validator;
|
|
}
|
|
|
|
/**
|
|
* 构造 CrudUtil 查询配置
|
|
*/
|
|
protected function buildQueryConfig(Request $request, string $scene = 'default'): array
|
|
{
|
|
$p = $request->all();
|
|
|
|
$config = [];
|
|
$config['model'] = $this->modelClass;
|
|
switch ($scene) {
|
|
case 'default':
|
|
$config['where']['status'] = 1;
|
|
$config['order']['sort'] = 'desc';
|
|
$config['order']['id'] = 'desc';
|
|
break;
|
|
case 'index':
|
|
$config['where']['applicant_id'] = $request->user->uid;
|
|
$config['order']['sort'] = 'desc';
|
|
$config['order']['id'] = 'desc';
|
|
break;
|
|
case 'show':
|
|
$config['where']['id'] = $p['id'];
|
|
$config['where']['status'] = 1;
|
|
break;
|
|
case 'store':
|
|
break;
|
|
case 'update':
|
|
$config['where']['id'] = $p['id'];
|
|
break;
|
|
case 'destroy':
|
|
$config['where']['id'] = $p['id'];
|
|
break;
|
|
}
|
|
|
|
return $config;
|
|
}
|
|
|
|
/**
|
|
* 创建物品申请 前置
|
|
*
|
|
* @param array $data
|
|
* @param Request $request
|
|
* @return array
|
|
*/
|
|
public function beforeServiceStore($data, Request $request): array
|
|
{
|
|
$user = (new UserService())->getUserInfo($request->user->uid, '');
|
|
|
|
if (empty($user['user']['id']) || empty($user['user']['name'])) {
|
|
throw new BusinessException('无法获取当前用户信息');
|
|
}
|
|
|
|
$data['order_no'] = $this->generateOrderNo();
|
|
$data['applicant_id'] = (int)$user['user']['id'];
|
|
$data['applicant_name'] = (string)$user['user']['name'];
|
|
$data['leader_id'] = $user['user']['report_to'];
|
|
$data['status'] = InvRequisition::STATUS_LEADER;
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* 处理物品申请
|
|
*
|
|
* @param Request $request
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function serviceStore(Request $request, array $data, string $scene = '')
|
|
{
|
|
try {
|
|
// 关联表增加事务处理
|
|
return Db::transaction(function () use ($request, $data) {
|
|
$data = $this->preProcess('Store', $data, $request);
|
|
$dl = $this->getDataLimitFromRequest($request);
|
|
$created = $this->logicCreate($data, $dl);
|
|
// 处理物品申请项
|
|
$this->processRequisitionItems($created, $data['items']);
|
|
// 处理物品申请附件
|
|
$this->processRequisitionAttachmentItems($created, $data['attachment']);
|
|
return $this->postProcess('Store', $created);
|
|
});
|
|
} catch (\Throwable $e) {
|
|
throw new BusinessException("创建物品申请失败:" . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 更新物品申请
|
|
*
|
|
* @param Request $request
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
public function serviceUpdate(Request $request, array $data, string $scene = '')
|
|
{
|
|
try {
|
|
// 关联表增加事务处理
|
|
return Db::transaction(function () use ($request, $data) {
|
|
$data = $this->preProcess('Update', $data, $request);
|
|
$config = $this->buildQueryConfig($request, 'update');
|
|
|
|
// 获取申请项/附件
|
|
$items = $data['items'];
|
|
$attachment = $data['attachment'];
|
|
unset($data['items']);
|
|
unset($data['attachment']);
|
|
|
|
// 执行更新操作
|
|
$this->logicUpdateBy($config, $data);
|
|
|
|
// 获取更新后的完整记录
|
|
$updated = $this->logicShow($config);
|
|
|
|
// 重新创建新的申请项
|
|
$this->processRequisitionItems((object)$updated, $items, true);
|
|
|
|
// 重新创建新的附件
|
|
$this->processRequisitionAttachmentItems((object)$updated, $attachment, true);
|
|
|
|
return $this->postProcess('Update', $updated);
|
|
});
|
|
} catch (\Throwable $e) {
|
|
throw new BusinessException("更新物品申请失败:" . $e->getMessage()."|".$e->getLine()."|".$e->getFile());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 处理物品申请项
|
|
*
|
|
* @param Model $created
|
|
* @param array $items
|
|
* @return void
|
|
*/
|
|
private function processRequisitionItems(Model $created, array $items, bool $isUpdate = false): void
|
|
{
|
|
if ($isUpdate) {
|
|
$this->clearRequisitionItems($created->id);
|
|
}
|
|
|
|
foreach ($items as $item) {
|
|
$itemData = [
|
|
'requisition_id' => $created->id,
|
|
'item_id' => $item['item_id'],
|
|
'item_name_snap' => $item['item_name_snap'], // 修改:使用 snap 字段
|
|
'spec_model_snap' => $item['spec_model_snap']??'', // 修改:使用 snap 字段
|
|
'unit_snap' => $item['unit_snap']??'', // 修改:使用 snap 字段
|
|
'is_consumable_snap' => $item['is_consumable_snap']?? 0, // 修改:使用 snap 字段
|
|
'request_qty' => (int) $item['request_qty'] ?? 1, // 动态获取数量,转为整型
|
|
'approved_qty' => (int) $item['request_qty'] ?? 1, // 初始审批数量等于申请数量
|
|
'remark' => $item['remark'] ?? ''
|
|
];
|
|
InvRequisitionItem::create($itemData);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 处理物品申请项
|
|
*
|
|
* @param Model $created
|
|
* @param array $items
|
|
* @return void
|
|
*/
|
|
private function processRequisitionAttachmentItems(Model $created, array $attachment, bool $isUpdate = false): void
|
|
{
|
|
if ($isUpdate) {
|
|
$this->clearRequisitionAttachmentItems($created->id);
|
|
}
|
|
|
|
foreach ($attachment as $file) {
|
|
$attachmentData = [
|
|
'requisition_id' => $created->id,
|
|
'file_name' => $file['original_name'],
|
|
'file_path' => $file['file_path']
|
|
];
|
|
InvRequisitionAttachment::create($attachmentData);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除申请项
|
|
*
|
|
* @param int $requisitionId
|
|
* @return void
|
|
*/
|
|
public function clearRequisitionItems(int $requisitionId): void
|
|
{
|
|
InvRequisitionItem::where('requisition_id', $requisitionId)->delete();
|
|
}
|
|
|
|
/**
|
|
* 删除申请项
|
|
*
|
|
* @param int $requisitionId
|
|
* @return void
|
|
*/
|
|
public function clearRequisitionAttachmentItems(int $requisitionId): void
|
|
{
|
|
InvRequisitionAttachment::where('requisition_id', $requisitionId)->delete();
|
|
}
|
|
|
|
/**
|
|
* 生成申请单号
|
|
*
|
|
* @return string
|
|
*/
|
|
private function generateOrderNo(): string
|
|
{
|
|
return 'RQ' . date('Ymd') . strtoupper(substr(uniqid(), -6));
|
|
}
|
|
} |