Files
fdesk/app/common/service/InvRequisitionService.php
T

300 lines
10 KiB
PHP
Raw Normal View History

2025-12-05 09:22:53 +00:00
<?php
namespace app\common\service;
2026-01-07 17:23:03 +08:00
use app\common\model\InvItem;
2025-12-05 09:22:53 +00:00
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;
}
2026-01-07 10:57:28 +08:00
/**
* 构造 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':
2026-02-04 09:28:54 +08:00
if(isset($p['status']) && $p['status']){
$config['where']['status'] = $p['status'];
}
2026-02-06 13:04:51 +08:00
if (isset($p['applicant_id']) && $p['applicant_id'] == 'self') { //自己的领用申请
2026-02-04 09:28:54 +08:00
$config['where']['applicant_id'] = $request->user->uid;
2026-02-06 13:04:51 +08:00
} elseif (isset($p['applicant_id']) && $p['applicant_id']) { //指定人员的申请
2026-02-04 09:28:54 +08:00
$config['where']['applicant_id'] = $p['applicant_id'];
2026-02-06 13:04:51 +08:00
} else { //审批人对应的记录
$config['where']['approval.approver_id'] = $request->user->uid;
2026-02-04 09:28:54 +08:00
}
2026-02-05 13:18:29 +08:00
if(isset($p['phase']) && $p['phase'] == 'approve'){//借用审批中
$config['where']['status'] = ['in',[10,11,13]];
}elseif(isset($p['phase']) && $p['phase'] == 'repaid'){//已全部归还
$config['where']['unreturned'] = 17;
}elseif(isset($p['phase']) && $p['phase'] == 'unreturned'){ //未归还
$config['where']['status'] = ['in',[12,14,15,16,18]];
}
2026-01-07 10:57:28 +08:00
$config['order']['id'] = 'desc';
break;
case 'show':
$config['where']['id'] = $p['id'];
break;
case 'store':
break;
case 'update':
$config['where']['id'] = $p['id'];
break;
case 'destroy':
$config['where']['id'] = $p['id'];
break;
}
return $config;
}
2025-12-05 09:22:53 +00:00
/**
* 创建物品申请 前置
*
* @param array $data
* @param Request $request
* @return array
*/
public function beforeServiceStore($data, Request $request): array
{
$user = (new UserService())->getUserInfo($request->user->uid, '');
2025-12-09 07:33:04 +00:00
if (empty($user['user']['id']) || empty($user['user']['name'])) {
throw new BusinessException('无法获取当前用户信息');
}
2025-12-05 09:22:53 +00:00
$data['order_no'] = $this->generateOrderNo();
2025-12-09 07:33:04 +00:00
$data['applicant_id'] = (int)$user['user']['id'];
$data['applicant_name'] = (string)$user['user']['name'];
2025-12-05 09:22:53 +00:00
$data['leader_id'] = $user['user']['report_to'];
$data['status'] = InvRequisition::STATUS_LEADER;
2026-01-07 17:23:03 +08:00
//查询物品管理人是否是一个
if(count($data['items'])>=2){
$manage_user = [];
foreach ($data['items'] as $item) {
$manage_user[] = InvItem::where('id',$item['item_id'])->value('manage_user_id');
}
$manage_user = array_unique($manage_user);
if(count($manage_user)>1){
2026-02-05 10:48:26 +08:00
throw new BusinessException("物品管理员不是同一人");
2026-01-07 17:23:03 +08:00
}
}
2025-12-05 09:22:53 +00:00
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']);
2026-01-07 17:23:03 +08:00
$res = $this->postProcess('Store', $created);
2026-01-07 17:38:06 +08:00
$manage_user_id = InvItem::where('id',$data['items'][0]['item_id'])->value('manage_user_id');
2026-01-07 17:23:03 +08:00
$approval = [
'id' => $res['id'], //申请单id
'applicant_id' => $res['applicant_id'], //申请人id
'manage_user_id' => $manage_user_id,
];
$this->startApproval($approval);
return $res;
2025-12-05 09:22:53 +00:00
});
} catch (\Throwable $e) {
2026-02-05 11:06:05 +08:00
throw new BusinessException("创建物品申请失败:".$e->getMessage());
2025-12-05 09:22:53 +00:00
}
}
2026-01-07 17:23:03 +08:00
/**
* 启动审批
*/
public function startApproval($requisition)
{
// 启动审批
2026-02-02 13:17:11 +08:00
//$appro = new \app\common\utils\approval\service\ApprovalFlowService();
$appro = new \app\common\service\InvRequisitionApproveService();
2026-01-07 17:23:03 +08:00
$formData = [
'manage_user_id' => $requisition['manage_user_id'],
];
2026-02-02 13:17:11 +08:00
return $appro->start('inv_requisition', 'inv_requisition', $requisition['id'], $formData, $requisition['applicant_id']);
2026-01-07 17:23:03 +08:00
}
2025-12-05 09:22:53 +00:00
/**
* 更新物品申请
*
* @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) {
2026-02-05 14:41:58 +08:00
$invitem = InvItem::where('id',$item)->first();
2025-12-05 09:22:53 +00:00
$itemData = [
'requisition_id' => $created->id,
'item_id' => $item['item_id'],
'item_name_snap' => $item['item_name_snap'], // 修改:使用 snap 字段
2026-01-07 09:42:08 +08:00
'spec_model_snap' => $item['spec_model_snap']??'', // 修改:使用 snap 字段
'unit_snap' => $item['unit_snap']??'', // 修改:使用 snap 字段
2026-02-05 14:41:58 +08:00
'is_consumable_snap' => $item['is_consumable_snap']?? ($invitem['is_consumable_snap']??0), // 修改:使用 snap 字段
2025-12-05 09:22:53 +00:00
'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));
}
}