cqp hace 4 semanas
padre
commit
5d7391a5bb

+ 13 - 0
app/Http/Controllers/Api/DingTalkController.php

@@ -65,6 +65,19 @@ class DingTalkController extends BaseController
         }
         }
     }
     }
 
 
+    public function executeProcess(Request $request)
+    {
+        $service = new DingService();
+        $userData = $request->userData;
+        list($status,$data) = $service->executeProcess($request->all(), $userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
     public function executeApproval(Request $request)
     public function executeApproval(Request $request)
     {
     {
         $service = new DingService();
         $service = new DingService();

+ 373 - 2
app/Jobs/ProcessDataJob.php

@@ -3,8 +3,10 @@
 namespace App\Jobs;
 namespace App\Jobs;
 
 
 use App\Model\DDEmployee;
 use App\Model\DDEmployee;
+use App\Model\Inventory;
 use App\Model\Record;
 use App\Model\Record;
 use App\Model\U8State;
 use App\Model\U8State;
+use App\Model\Vendor;
 use App\Service\U8DatabaseServerService;
 use App\Service\U8DatabaseServerService;
 use Illuminate\Bus\Queueable;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -89,9 +91,11 @@ class ProcessDataJob implements ShouldQueue
                             "dVeriDate" => $time1 . ".000",
                             "dVeriDate" => $time1 . ".000",
                         ]);
                         ]);
                 }elseif($type == Record::type_four){
                 }elseif($type == Record::type_four){
-
+                    list($status, $msg) = $this->inventoryAddToU8($record, $service);
+                    if(! $status) return [false, $msg];
                 }elseif($type == Record::type_five){
                 }elseif($type == Record::type_five){
-
+                    list($status, $msg) = $this->vendorAddToU8($record, $service);
+                    if(! $status) return [false, $msg];
                 }
                 }
 
 
                 // 更新本地数据 通过状态
                 // 更新本地数据 通过状态
@@ -112,6 +116,373 @@ class ProcessDataJob implements ShouldQueue
         return [true, ''];
         return [true, ''];
     }
     }
 
 
+    //U8 存货新增到用友
+    public function inventoryAddToU8($data, $service){
+        $inventory = Inventory::where('del_time', 0)
+            ->where('order_number', $data['order_number'])
+            ->where('login_type', $data['login_type'])
+            ->first();
+        if(empty($inventory)) return [false, '存货记录不存在或已被删除'];
+        $inventory = $inventory->toArray();
+
+        $title = $inventory['title'];
+        $category_code = $inventory['category_code'];
+        if(! empty($data['code'])){
+            //用户传入
+            $no = $inventory['code'];
+            $flag_title = "重填";
+        }else{
+            //生成编码
+            list($status, $msg) = $this->generate('inventory',$category_code, $service);
+            if(! $status) return [false, $msg];
+            $no = $msg;
+            $flag_title = "重试";
+        }
+
+        $inventoryData = [
+            'cInvCode' => $no,
+            'cInvName' => $title,
+            'cInvCCode' => $category_code,
+            'cInvStd' => $inventory['size'] ?? null, // 规格型号
+            'bSale'         => $inventory['bSale'], //内销
+            'bExpSale'        => $inventory['bExpSale'], //外销
+            'bPurchase'     => $inventory['bPurchase'], // 采购
+            'bSelf'         => $inventory['bSelf'], // 自制
+            'bComsume'      => $inventory['bComsume'], // 生产耗材
+            'iGroupType' => $inventory['unit_group_type'], // 计量单位组类别
+            'cGroupCode' => $inventory['unit_group_code'], //计量单位组
+            'cComUnitCode' => $inventory['unit_code'], // 主计量单位
+            'cShopUnit' => $inventory['unit_code'], // 零售计量单位
+            'iImpTaxRate' => $inventory['iImpTaxRate'], // 进项税率
+            'iTaxRate'      => $inventory['iTaxRate'], // 销项税率
+            'dSDate' => date("Y-m-d 00:00:00.000"), // 启用日期
+            'cEnterprise' => $inventory['vendor_code_title'] ?? null,
+            'iSupplyType' => '0', // 供应类型
+            'fConvertRate' => '1.0', // 转换因子
+            'bInTotalCost' => '1', // 成本累计否
+            'cPlanMethod' => 'R',
+            'cSRPolicy' => 'PE',
+            'bBomMain' => '0', // 允许BOM母件
+            'bBomSub' => '0', // 允许BOM子件
+            'bProductBill' => '0', // 允许生产订单
+            'iPlanDefault' => '1',
+            'iAllocatePrintDgt' => '4',
+            'bService' => '0',
+            'bAccessary' => '0',
+            'iInvAdvance' => '0.0',
+            'bInvQuality' => '0',
+            'bInvBatch' => '0',
+            'bInvEntrust' => '0',
+            'bInvOverStock' => '0',
+            'bFree1' => '0',
+            'bFree2' => '0',
+            'bInvType' => '0',
+            'bFree3' => '0',
+            'bFree4' => '0',
+            'bFree5' => '0',
+            'bFree6' => '0',
+            'bFree7' => '0',
+            'bFree8' => '0',
+            'bFree9' => '0',
+            'bFree10' => '0',
+            'cCreatePerson' => 'demo',
+            'cModifyPerson' => 'demo', // 变更
+            'dModifyDate' => date("Y-m-d H:i:s.000"),
+            'bFixExch' => '0',
+            'bTrack' => '0',
+            'bSerial' => '0',
+            'bBarCode' => '0',
+            'bSolitude' => '0',
+            'bSpecialties' => '0',
+            'bPropertyCheck' => '0',
+            'iRecipeBatch' => '0',
+            'bPromotSales' => '0',
+            'bPlanInv' => '0',
+            'bProxyForeign' => '0',
+            'bATOModel' => '0',
+            'bCheckItem' => '0',
+            'bPTOModel' => '0',
+            'bEquipment' => '0',
+            'bMPS' => '0',
+            'bROP' => '0',
+            'bRePlan' => '0',
+            'bBillUnite' => '0',
+            'bCutMantissa' => '0',
+            'bConfigFree1' => '0',
+            'bConfigFree2' => '0',
+            'bConfigFree3' => '0',
+            'bConfigFree4' => '0',
+            'bConfigFree5' => '0',
+            'bConfigFree6' => '0',
+            'bConfigFree7' => '0',
+            'bConfigFree8' => '0',
+            'bConfigFree9' => '0',
+            'bConfigFree10' => '0',
+            'bPeriodDT' => '0',
+            'bOutInvDT' => '0',
+            'bBackInvDT' => '0',
+            'bDTWarnInv' => '0',
+            'bImportMedicine' => '0',
+            'bFirstBusiMedicine' => '0',
+            'bForeExpland' => '0',
+            'bInvModel' => '0',
+            'bKCCutMantissa' => '0',
+            'bReceiptByDT' => '0',
+            'bCheckBSATP' => '0',
+            'bCheckFree1' => '0',
+            'bCheckFree2' => '0',
+            'bCheckFree3' => '0',
+            'bCheckFree4' => '0',
+            'bCheckFree5' => '0',
+            'bCheckFree6' => '0',
+            'bCheckFree7' => '0',
+            'bCheckFree8' => '0',
+            'bCheckFree9' => '0',
+            'bCheckFree10' => '0',
+            'iCheckATP' => '0',
+            'bPiece' => '0',
+            'bSrvItem' => '0',
+            'bSrvFittings' => '0',
+            'bSpecialOrder' => '0',
+            'bTrackSaleBill' => '0',
+            'bCheckBatch' => '0',
+            'bMngOldpart' => '0',
+        ];
+
+        $inventorySubData = [
+            'cInvSubCode' => $no,
+            'iSurenessType' => '1',
+            'bIsAttachFile' => '0',
+            'bInByProCheck' => '1',
+            'iRequireTrackStyle' => '0',
+            'iExpiratDateCalcu' => '0',
+            'iBOMExpandUnitType' => '1',
+            'iDrawType' => $inventory['iDrawType'] ?? 0, // 领用方式
+            'fInvCIQExch' => $inventory['customs_change_rate'] ?? 1, // 海关换算率
+            'bInvKeyPart' => '1',
+            'iAcceptEarlyDays' => '999',
+            'dInvCreateDatetime' => date("Y-m-d H:i:s.000"),
+            'bPUQuota' => '0',
+            'bInvROHS' => '0',
+            'bPrjMat' => '0',
+            'bInvAsset' => '0',
+            'bSrvProduct' => '0',
+            'iAcceptDelayDays' => '0',
+            'bSCkeyProjections' => '0',
+            'iSupplyPeriodType' => '1',
+            'iAvailabilityDate' => '1',
+            'bImport' => '0',
+            'bCheckSubitemCost' => '1',
+            'fRoundFactor' => '0.0',
+            'bConsiderFreeStock' => '1',
+            'bSuitRetail' => '0',
+            'bFeatureMatch' => '0',
+            'bProduceByFeatureAllocate' => '0',
+            'bMaintenance' => '0',
+            'iMaintenanceCycleUnit' => '0',
+            'bCoupon' => '0',
+            'bStoreCard' => '0',
+            'bProcessProduct' => '0',
+            'bProcessMaterial' => '0',
+            // 所有的价格自由项默认设为 '0'
+            'bPurPriceFree1' => '0', 'bPurPriceFree2' => '0', 'bPurPriceFree3' => '0', 'bPurPriceFree4' => '0', 'bPurPriceFree5' => '0',
+            'bPurPriceFree6' => '0', 'bPurPriceFree7' => '0', 'bPurPriceFree8' => '0', 'bPurPriceFree9' => '0', 'bPurPriceFree10' => '0',
+            'bOMPriceFree1' => '0', 'bOMPriceFree2' => '0', 'bOMPriceFree3' => '0', 'bOMPriceFree4' => '0', 'bOMPriceFree5' => '0',
+            'bOMPriceFree6' => '0', 'bOMPriceFree7' => '0', 'bOMPriceFree8' => '0', 'bOMPriceFree9' => '0', 'bOMPriceFree10' => '0',
+            'bSalePriceFree1' => '0', 'bSalePriceFree2' => '0', 'bSalePriceFree3' => '0', 'bSalePriceFree4' => '0', 'bSalePriceFree5' => '0',
+            'bSalePriceFree6' => '0', 'bSalePriceFree7' => '0', 'bSalePriceFree8' => '0', 'bSalePriceFree9' => '0', 'bSalePriceFree10' => '0',
+            // 所有的控制自由项默认设为 '0'
+            'bControlFreeRange1' => '0', 'bControlFreeRange2' => '0', 'bControlFreeRange3' => '0', 'bControlFreeRange4' => '0', 'bControlFreeRange5' => '0',
+            'bControlFreeRange6' => '0', 'bControlFreeRange7' => '0', 'bControlFreeRange8' => '0', 'bControlFreeRange9' => '0', 'bControlFreeRange10' => '0',
+            // 所有的批次属性默认设为 '0'
+            'bBatchProperty1' => '0', 'bBatchProperty2' => '0', 'bBatchProperty3' => '0', 'bBatchProperty4' => '0', 'bBatchProperty5' => '0',
+            'bBatchProperty6' => '0', 'bBatchProperty7' => '0', 'bBatchProperty8' => '0', 'bBatchProperty9' => '0', 'bBatchProperty10' => '0',
+            'bBondedInv' => '0',
+            'bBatchCreate' => '0',
+        ];
+
+        try {
+            $service->beginTransaction();
+
+            $exists = $service->table('Inventory')
+                ->where('cInvCode', $inventoryData['cInvCode'])
+                ->lockForUpdate() // 锁定该行,防止并发冲突
+                ->exists();
+
+            if ($exists) return [false, '存货编码已存在,请' . $flag_title];
+
+            $service->table('Inventory')->insert($inventoryData);
+            $service->table('Inventory_sub')->insert($inventorySubData);
+
+            $service->commit();
+        } catch (\Throwable $exception) {
+            $service->rollBack();
+
+            return [false, "创建用友失败: " . $exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
+    //U8 供应商新增
+    public function vendorAddToU8($data, $user,$service){
+        $vendor = Vendor::where('del_time', 0)
+            ->where('order_number', $data['order_number'])
+            ->where('login_type', $data['login_type'])
+            ->first();
+        if(empty($vendor)) return [false, '供应商记录不存在或已被删除'];
+        $vendor = $vendor->toArray();
+
+        if(! empty($vendor['code'])){
+            //用户传入
+            $no = $vendor['code'];
+            $flag_title = "重填";
+        }else{
+            //生成编码
+            list($status, $msg) = $this->generate('vendor','', $service);
+            if(! $status) return [false, $msg];
+            $no = $msg;
+            $flag_title = "重试";
+        }
+
+        $vendorData = [
+            'cVenCode' => $no,
+            'cVenName' => $vendor['title'],
+            'cVenAbbName' => $vendor['easy_title'],
+            'cVCCode' => $vendor['category_code'],
+            'dVenDevDate' => date("Y-m-d 00:00:00.000"),
+            'iVenDisRate' => '0.0',
+            'iVenCreLine' => '0.0',
+            'iVenCreDate' => '0',
+            'cVenHeadCode' => $no,
+            'iAPMoney' => '0.0',
+            'iLastMoney' => '0.0',
+            'iLRMoney' => '0.0',
+            'iFrequency' => '0',
+            'bVenTax' => '1',
+            'cCreatePerson' => 'demo',
+            'cModifyPerson' => 'demo',
+            'dModifyDate' => date("Y-m-d H:i:s.000"),
+            'iGradeABC' => '-1',
+            'bLicenceDate' => '0',
+            'bBusinessDate' => '0',
+            'bProxyDate' => '0',
+            'bPassGMP' => '0',
+            'bVenCargo' => '1', // 采购
+            'bProxyForeign' => '0', // 委外
+            'bVenService' => '0', // 服务
+            'bVenOverseas' => '0', // 国外
+            'cVenExch_name' => '人民币',
+            'iVenGSPType' => '0',
+            'iVenGSPAuth' => '-1',
+            'bVenAccPeriodMng' => '0',
+            'bVenHomeBranch' => '0',
+            'dVenCreateDatetime' => date("Y-m-d H:i:s.000"),
+            'bIsVenAttachFile' => '0',
+            'bRetail' => '0',
+        ];
+
+        try {
+            $service->beginTransaction();
+
+            $exists = $service->table('Vendor')
+                ->where('cVenCode', $vendorData['cVenCode'])
+                ->lockForUpdate() // 锁定该行,防止并发冲突
+                ->exists();
+
+            if ($exists) return [false, '供应商编码已存在,请' . $flag_title];
+
+            $service->table('Vendor')->insert($vendorData);
+
+            $service->commit();
+
+        } catch (\Throwable $exception) {
+            $service->rollBack();
+
+            return [false, "创建供应商失败: " . $exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
+    // 生成编码
+    public function generate($type, $classCode = "", $service)
+    {
+        try {
+            // 1. 确定对象映射
+            $cardNumber = ($type === 'inventory') ? 'inventory' : 'Vendor';
+            $cardNumber_name = ($type === 'inventory') ? '存货' : '供应商';
+            $table = ($type === 'inventory') ? 'Inventory' : 'Vendor';
+            $codeField = ($type === 'inventory') ? 'cInvCode' : 'cVenCode';
+
+            // 2. 获取 U8 规则定义
+            $rule = $service->table('VoucherNumber')
+                ->where('CardNumber', $cardNumber)
+                ->first();
+
+            if (!$rule) return [false, "未找到 {$cardNumber_name} 的规则定义"];
+
+            /**
+             * 3. 动态解析前缀 (Prefix1, Prefix2, Prefix3)
+             * U8 的规则通常存放在 PrefixRule 或 Prefix 字段中
+             */
+            $prefix = "";
+            for ($i = 1; $i <= 3; $i++) {
+                $ruleField = "Prefix{$i}Rule";
+                $valField = "Prefix{$i}";
+
+                // 检查规则描述
+                $ruleDesc = $rule->$ruleField ?? ''; // 例如 "存货分类编码" 或 "GYS"
+                $staticVal = $rule->$valField ?? '';
+
+                if (str_contains($ruleDesc, '分类') || str_contains($staticVal, '分类')) {
+                    // 如果规则提到“分类”,则填入传入的分类编码
+                    $prefix .= $classCode;
+                } elseif (!empty($ruleDesc)) {
+                    // 如果规则是具体的字符(如 "GYS"),直接拼接
+                    $prefix .= $ruleDesc;
+                } elseif (!empty($staticVal) && $staticVal !== '手工输入' && $staticVal !== '存货分类编码') {
+                    // 如果静态值不是提示语,则作为前缀
+                    $prefix .= $staticVal;
+                }
+            }
+
+            // 4. 获取流水号配置 (Glide)
+            $glideLen = $rule->GlideLen > 0 ? $rule->GlideLen : 4;
+            $startNum = $rule->iStartNumber ?? 1;
+
+            // 5. 查找当前最大编码
+            $expectedLen = strlen($prefix) + $glideLen;
+
+            $lastCode = $service->table($table)
+                ->where($codeField, 'like', $prefix . '%')
+                ->whereRaw("LEN($codeField) = $expectedLen")
+                ->orderBy($codeField, 'desc')
+                ->value($codeField);
+
+            // 6. 生成编码
+            if (!$lastCode) {
+                // 初始:前缀 + 起始值补零
+                $finalCode = $prefix . str_pad($startNum, $glideLen, '0', STR_PAD_LEFT);
+            } else {
+                // 截取流水号自增
+                $lastSerial = substr($lastCode, -$glideLen);
+                $nextSerial = ++$lastSerial;
+
+                // 溢出检查
+                if (strlen($nextSerial) > $glideLen) {
+                    return [false, "流水号已溢出"];
+                }
+                $finalCode = $prefix . str_pad($nextSerial, $glideLen, '0', STR_PAD_LEFT);
+            }
+
+            return [true, $finalCode];
+
+        } catch (\Throwable $e) {
+            return [false, "生成失败: " . $e->getMessage()];
+        }
+    }
+
     protected function echoMessage(OutputInterface $output)
     protected function echoMessage(OutputInterface $output)
     {
     {
         //输出消息
         //输出消息

+ 136 - 41
app/Service/DingService.php

@@ -2,9 +2,11 @@
 
 
 namespace App\Service;
 namespace App\Service;
 
 
+use App\Jobs\ProcessDataJob;
 use App\Model\DDEmployee;
 use App\Model\DDEmployee;
 use App\Model\Record;
 use App\Model\Record;
 use App\Model\U8State;
 use App\Model\U8State;
+use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Redis;
 use Illuminate\Support\Facades\Redis;
 
 
 class DingService extends Service
 class DingService extends Service
@@ -245,68 +247,164 @@ class DingService extends Service
         return [true, $res['process_instance_id']];
         return [true, $res['process_instance_id']];
     }
     }
 
 
-    /**
-     * 获取当前用户待审批的实例 ID 列表
-     * @param string $accessToken
-     * @param string $userId 钉钉用户的 userId
-     * @param int $cursor 分页游标,从0开始
-     * @param int $size 分页大小,最大100
-     */
+    //待审核
     public function getTodoProcessList($data, $user)
     public function getTodoProcessList($data, $user)
     {
     {
+        // 获取 AccessToken
         [$success, $tokenData] = $this->getAccessToken($user['login_type']);
         [$success, $tokenData] = $this->getAccessToken($user['login_type']);
         if (!$success) return [false, $tokenData];
         if (!$success) return [false, $tokenData];
         $accessToken = $tokenData['access_token'];
         $accessToken = $tokenData['access_token'];
 
 
-        $cursor = $data['cursor'] ?? 0;
-        $size = $data['size'] ?? 20;
+        // 新版接口分页参数(pageNumber 从 1 开始)
+        $pageNumber = $data['page_index'] ?? 1;
+        $pageSize = $data['page_size'] ?? 20;
 
 
         // 1. 请求 URL
         // 1. 请求 URL
-        $url = "https://oapi.dingtalk.com/topapi/process/todo/list?access_token={$accessToken}";
+        $url = "https://api.dingtalk.com/v1.0/workflow/processCentres/todoTasks?userId={$user['userid']}&pageNumber={$pageNumber}&pageSize={$pageSize}";
+
+        // 2. 发送请求
+        $resp = $this->curlOpen1($url, [
+            'request' => 'get', // 这个接口是 GET 请求
+            'header'  => [
+                "Content-Type: application/json",
+                "x-acs-dingtalk-access-token: {$accessToken}" // 新版标准的 Header 鉴权
+            ]
+        ]);
+
+        $res = json_decode($resp, true);
+
+        // 3. 错误处理
+        if (isset($res['code']) && $res['code'] !== 'success') return [false, "获取新版待办列表失败: " . ($res['message'] ?? '未知错误')];
+
+        // 4. 提取实例 ID
+        $result = $res['result'];
+        $hasMore = $result['hasMore'];
+        $tasks = $result['list'];
+        $instanceIds = array_column($tasks, 'processInstanceId');
+
+        if (empty($instanceIds)) {
+            return [true, [
+                'list' => [],
+                'has_more' => $hasMore,
+            ]];
+        }
+
+        $map = array_column($tasks,'taskId','processInstanceId');
+
+        // 5. 关联本地
+        $record = Record::where('del_time',0)
+            ->whereIn('process_instance_id', $instanceIds)
+            ->where('login_type', $user['login_type'])
+            ->select('type', 'order_number', 'process_instance_id')
+            ->get()
+            ->toArray();
+
+        foreach ($record as $key => $item) {
+            $record[$key]['type_title'] = U8State::type_name[$item['type']];
+            $record[$key]['task_id'] = $map[$item['process_instance_id']];
+        }
+
+        return [true, [
+            'list' => $record,
+            'has_more' => $hasMore
+        ]];
+    }
+
+    //审核
+    public function executeProcess($data, $user)
+    {
+        if(empty($data['result']) || ! in_array($data['result'], ['agree','refuse'])) return [false, 'result错误或不存在'];
+        if(empty($data['task_id'])) return [false, 'task_id错误或不存在'];
+        if(empty($data['process_instance_id'])) return [false, 'process_instance_id错误或不存在'];
+
+        // 1. 获取 AccessToken
+        [$success, $tokenData] = $this->getAccessToken($user['login_type']);
+        if (!$success) return [false, $tokenData];
+        $accessToken = $tokenData['access_token'];
 
 
-        // 2. 请求体
+        // 2. 接口 URL (新版 v1.0 路径)
+        $url = "https://api.dingtalk.com/v1.0/workflow/processInstances/execute";
+
+        // 3. 构建请求体
+        // 注意:taskId 必须从待办任务接口中获取,不能随意填写
         $payload = [
         $payload = [
-            "userid" => $user['userid'],
-            "cursor" => $cursor,
-            "size"   => $size,
+            "processInstanceId" => $data['process_instance_id'], // 审批实例 ID
+            "actionerUserId"    => $user['userid'],             // 操作人钉钉 ID
+            "result"            => $data['result'],
+            "remark"            => $data['remark'] ?? '同意。',  // 审批意见
+            "taskId"            => $data['task_id'],
         ];
         ];
 
 
-        // 3. 发送请求
+        // 如果有图片或附件,则加入 file 字段
+        if (!empty($data['photos']) || !empty($data['attachments'])) {
+            $payload['file'] = [
+                "photos"      => $data['photos'] ?? [],
+                "attachments" => $data['attachments'] ?? []
+            ];
+        }
+
+        // 4. 发送请求
         $resp = $this->curlOpen1($url, [
         $resp = $this->curlOpen1($url, [
             'request' => 'post',
             'request' => 'post',
-            'header'  => ["Content-Type: application/json"],
+            'header'  => [
+                "Content-Type: application/json",
+                "x-acs-dingtalk-access-token: {$accessToken}"
+            ],
             'json'    => $payload
             'json'    => $payload
         ]);
         ]);
 
 
         $res = json_decode($resp, true);
         $res = json_decode($resp, true);
 
 
-        if (!isset($res['errcode']) || $res['errcode'] !== 0) return [false, "获取待办列表失败: " . ($res['errmsg'] ?? '未知错误')];
+        // 5. 结果处理
+        // 新版接口成功时通常返回空对象或 {"result": true}
+        if (isset($res['code']) && $res['code'] !== 'success') {
+            return [false, "审批操作失败: " . ($res['message'] ?? '未知错误')];
+        }
+
+        try {
+            DB::beginTransaction();
 
 
+            // 成功后续业务逻辑
+            if(isset($res['success']) && $res['success'] == true) $this->updateDatabase($data, $user);
 
 
-        // 4. 提取 process_instance_id
-        // 返回的结果中包含数据列表,我们需要从中提取所有的实例ID
-        $list = $res['result']['list'] ?? [];
-        $instanceIds = array_column($list, 'process_instance_id');
+            DB::commit();
+        }catch (\Throwable $exception){
+            DB::rollBack();
+            return [false, $exception->getMessage()];
+        }
 
 
-        $result = Record::whereIn('process_instance_id', $instanceIds)
-            ->select('type', 'order_number')
-            ->get()->toArray();
+        return [true, ""];
+    }
 
 
-        return [true, [
-            'list' => $result, // 所有的待我审核
-            'has_more'     => $res['result']['has_more'] ?? false, // 是否还有更多
-            'next_cursor'  => $res['result']['next_cursor'] ?? null // 下一页游标
-        ]];
+    private function updateDatabase($data, $user){
+        $record = Record::where('login_type', $user['login_type'])
+            ->where('process_instance_id')
+            ->first();
+        if(empty($record)) return [false, 'record记录不存在'];
+
+        $record = $record->toArray();
+        if($data['result'] == 'agree'){
+            //通过
+            Record::where('login_type', $user['login_type'])
+                ->where('process_instance_id')
+                ->update(['del_time' => 2]);
+
+            ProcessDataJob::dispatch($record)->onQueue(Record::$job);
+        }else{
+            //驳回
+            Record::where('login_type', $user['login_type'])
+                ->where('process_instance_id')
+                ->update(['del_time' => 1]);
+
+            U8State::updateOrCreate(
+                ['order_number' => $record['order_number'], 'login_type' => $user['login_type'], 'type' => $record['type']],
+                ['state' => U8State::state_two]
+            );
+        }
+
+        return [true, ''];
     }
     }
 
 
-    /**
-     * 执行审批操作(同意/拒绝)
-     * @param string $accessToken
-     * @param string $processInstanceId 审批实例ID
-     * @param string $action 'agree' 为同意,'refuse' 为拒绝
-     * @param string $remark 审批意见
-     * @param string $userId 执行审批操作的人员ID
-     */
     public function executeApproval($data, $user)
     public function executeApproval($data, $user)
     {
     {
         [$success, $tokenData] = $this->getAccessToken($user['login_type']);
         [$success, $tokenData] = $this->getAccessToken($user['login_type']);
@@ -341,12 +439,9 @@ class DingService extends Service
             return [false, "审批操作失败: " . ($res['errmsg'] ?? '未知错误')];
             return [false, "审批操作失败: " . ($res['errmsg'] ?? '未知错误')];
         }
         }
 
 
-        return [true, "操作成功"];
+        return [true, ""];
     }
     }
 
 
-    /**
-     * 获取指定实例中属于某个用户的待办任务 ID
-     */
     private function getTaskIdByInstanceId($accessToken, $instanceId, $userId)
     private function getTaskIdByInstanceId($accessToken, $instanceId, $userId)
     {
     {
         $url = "https://oapi.dingtalk.com/topapi/processinstance/get?access_token={$accessToken}";
         $url = "https://oapi.dingtalk.com/topapi/processinstance/get?access_token={$accessToken}";

+ 0 - 1
app/Service/U8ServerService.php

@@ -752,7 +752,6 @@ class U8ServerService extends Service
             ->first();
             ->first();
         if(empty($inventory)) return [false, '存货记录不存在或已被删除'];
         if(empty($inventory)) return [false, '存货记录不存在或已被删除'];
         $inventory = $inventory->toArray();
         $inventory = $inventory->toArray();
-        if($inventory['status'] != Inventory::STATE_TWO) return [false, '存货记录未审核通过'];
 
 
         $title = $inventory['title'];
         $title = $inventory['title'];
         $category_code = $inventory['category_code'];
         $category_code = $inventory['category_code'];

+ 0 - 11
app/Service/U8XkyServerService.php

@@ -883,15 +883,4 @@ class U8XkyServerService extends Service
 
 
         return [true, $list];
         return [true, $list];
     }
     }
-
-    private function returnState($list, $type, $login_type){
-        if(empty($list['data'])) return [];
-
-        return U8State::where('del_time', 0)
-            ->where('type', $type)
-            ->where('login_type', $login_type)
-            ->whereIn('order_number', array_column($list['data'], 'order_number'))
-            ->pluck('state', 'order_number')
-            ->toArray();
-    }
 }
 }

+ 10 - 11
routes/api.php

@@ -93,7 +93,7 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     //获取待我审核
     //获取待我审核
     $route->any('getTodoProcessList','Api\DingTalkController@getTodoProcessList');
     $route->any('getTodoProcessList','Api\DingTalkController@getTodoProcessList');
     //审核
     //审核
-    $route->any('executeApproval','Api\DingTalkController@executeApproval');
+    $route->any('executeProcess','Api\DingTalkController@executeProcess');
     //审核中 | 已审核
     //审核中 | 已审核
     $route->any('recordList','Api\U8Controller@recordList');
     $route->any('recordList','Api\U8Controller@recordList');
 
 
@@ -112,16 +112,6 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('stockU8List', 'Api\U8Controller@stockList');
     $route->any('stockU8List', 'Api\U8Controller@stockList');
     // U8数据获取 -----------------------------------------------------
     // U8数据获取 -----------------------------------------------------
 
 
-    //获取钉钉人员列表
-    $route->any('ddEmployeeList', 'Api\U8Controller@ddEmployeeList');
-
-    //设置隐藏字段
-    $route->any('setField', 'Api\U8Controller@setField');
-    //隐藏字段列表
-    $route->any('fieldList', 'Api\U8Controller@fieldList');
-    //隐藏字段详情
-    $route->any('fieldDetail', 'Api\U8Controller@fieldDetail');
-
     //存货新增编辑(到本地)
     //存货新增编辑(到本地)
     $route->any('inventoryAdd', 'Api\U8Controller@inventoryAdd');
     $route->any('inventoryAdd', 'Api\U8Controller@inventoryAdd');
     $route->any('inventoryEdit', 'Api\U8Controller@inventoryEdit');
     $route->any('inventoryEdit', 'Api\U8Controller@inventoryEdit');
@@ -135,4 +125,13 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('vendorDel', 'Api\U8Controller@vendorDel');
     $route->any('vendorDel', 'Api\U8Controller@vendorDel');
     $route->any('vendorDetail', 'Api\U8Controller@vendorDetail');
     $route->any('vendorDetail', 'Api\U8Controller@vendorDetail');
     $route->any('vendorList', 'Api\U8Controller@vendorList');
     $route->any('vendorList', 'Api\U8Controller@vendorList');
+
+    //获取钉钉人员列表
+    $route->any('ddEmployeeList', 'Api\U8Controller@ddEmployeeList');
+    //设置隐藏字段
+    $route->any('setField', 'Api\U8Controller@setField');
+    //隐藏字段列表
+    $route->any('fieldList', 'Api\U8Controller@fieldList');
+    //隐藏字段详情
+    $route->any('fieldDetail', 'Api\U8Controller@fieldDetail');
 });
 });