|
|
@@ -338,26 +338,12 @@ class WorkOrder extends Api
|
|
|
$param['Sys_rq'] = date('Y-m-d H:i:s');
|
|
|
$param['gd_statu'] = '1-计划中';
|
|
|
|
|
|
-// $prefix = substr($param['订单编号'], 0, 2);
|
|
|
-// $maxOrder = \db('工单_基本资料')
|
|
|
-// ->where('订单编号', 'like', "{$prefix}%")
|
|
|
-// ->order('订单编号', 'desc')
|
|
|
-// ->limit(1)
|
|
|
-// ->value('订单编号');
|
|
|
-// if ($maxOrder) {
|
|
|
-// $numericPart = substr($maxOrder, 2);
|
|
|
-// $newNumericPart = str_pad((int)$numericPart + 1, strlen($numericPart), '0', STR_PAD_LEFT);
|
|
|
-// $param['订单编号'] = $prefix . $newNumericPart;
|
|
|
-// } else {
|
|
|
-// $param['订单编号'] = $param['订单编号'];
|
|
|
-// }
|
|
|
-// if ($maxOrder) {
|
|
|
-// $numericPart = substr($maxOrder, 2);
|
|
|
-// $newNumericPart = str_pad((int)$numericPart + 1, strlen($numericPart), '0', STR_PAD_LEFT);
|
|
|
-// $param['订单编号'] = $prefix . $newNumericPart;
|
|
|
-// } else {
|
|
|
-// $param['订单编号'] = $param['订单编号'];
|
|
|
-// }
|
|
|
+ // 验证订单编号是否已存在,冲突则按规则自动 +1 直到可用
|
|
|
+ if (empty($param['订单编号'])) {
|
|
|
+ $this->error('订单编号不能为空');
|
|
|
+ }
|
|
|
+ $param['订单编号'] = $this->resolveUniqueWorkOrderNo($param['订单编号']);
|
|
|
+
|
|
|
$data = $param;
|
|
|
unset($data['关联订单']);
|
|
|
unset($data['关联面料ID']);
|
|
|
@@ -1588,25 +1574,7 @@ class WorkOrder extends Api
|
|
|
if ($this->request->isGet() === false){
|
|
|
$this->error('请求错误');
|
|
|
}
|
|
|
- $time =substr( date('Ym',time()),2);
|
|
|
- $lastOrder = \db('工单_基本资料')
|
|
|
- ->where('订单编号','like','%'.$time.'%')
|
|
|
- ->order('Uniqid desc')
|
|
|
- ->whereNull('Mod_rq')
|
|
|
- ->find();
|
|
|
- if (empty($lastOrder)){
|
|
|
- $newNumber = 1;
|
|
|
- }else{
|
|
|
- $lastNumber = substr($lastOrder['订单编号'],6);
|
|
|
- $newNumber = (int)$lastNumber + 1;
|
|
|
- }
|
|
|
- if ($newNumber<10){
|
|
|
- $newOrder = 'DC'.$time.'00'.$newNumber;
|
|
|
- }elseif ($newNumber>=10 && $newNumber<100){
|
|
|
- $newOrder = 'DC'.$time.'0'.$newNumber;
|
|
|
- }else{
|
|
|
- $newOrder = 'DC'.$time.$newNumber;
|
|
|
- }
|
|
|
+ $newOrder = $this->generateNextWorkOrderNo();
|
|
|
$this->success('成功',$newOrder);
|
|
|
}
|
|
|
|
|
|
@@ -3683,7 +3651,7 @@ class WorkOrder extends Api
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- 成品入仓订单列表
|
|
|
+ 成品入仓订单列表
|
|
|
*/
|
|
|
public function GetWfpList()
|
|
|
{
|
|
|
@@ -3875,8 +3843,8 @@ class WorkOrder extends Api
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 成品入仓子订单列表
|
|
|
- */
|
|
|
+ * 成品入仓子订单列表
|
|
|
+ */
|
|
|
public function GetSubOrderStats()
|
|
|
{
|
|
|
if (!$this->request->isGet()) {
|
|
|
@@ -5344,7 +5312,7 @@ class WorkOrder extends Api
|
|
|
$res['msg'] = '成功';
|
|
|
$res['data'] = $limitedList;
|
|
|
return json($res);
|
|
|
- }
|
|
|
+ }
|
|
|
//Bom资料列表
|
|
|
public function Get_BomList(){
|
|
|
if (!$this->request->isGet()) {
|
|
|
@@ -5378,17 +5346,17 @@ class WorkOrder extends Api
|
|
|
->whereNull('a.Mod_rq')
|
|
|
->select();
|
|
|
$total = Db::name('工单_bom资料')->alias('a')
|
|
|
- ->whereNull('Mod_rq')
|
|
|
- ->where($where)
|
|
|
- ->count();
|
|
|
+ ->whereNull('Mod_rq')
|
|
|
+ ->where($where)
|
|
|
+ ->count();
|
|
|
$res['code'] = 0;
|
|
|
$res['msg'] = '成功';
|
|
|
$res['count'] = $total;
|
|
|
$res['data'] = $list;
|
|
|
return json($res);
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- //查询订单进度情况
|
|
|
+ //查询订单进度情况
|
|
|
public function GetOrderprogress(){
|
|
|
if (!$this->request->isGet()) {
|
|
|
$this->error('请求方式错误');
|
|
|
@@ -5537,7 +5505,7 @@ class WorkOrder extends Api
|
|
|
}
|
|
|
|
|
|
|
|
|
- //video_691c078dbb648190a17625bbef815ce50cbc1621ce1702d7
|
|
|
+ //video_691c078dbb648190a17625bbef815ce50cbc1621ce1702d7
|
|
|
public function video()
|
|
|
{
|
|
|
$params = $this->request->param();
|
|
|
@@ -5658,84 +5626,84 @@ class WorkOrder extends Api
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
+ /**
|
|
|
* 获取视频内容
|
|
|
* 下载已完成的视频内容
|
|
|
*/
|
|
|
public function videoContent(){
|
|
|
- // 从请求参数获取video_id,如果没有则使用默认值
|
|
|
- $video_id = input('get.video_id');
|
|
|
- $apiKey = 'sk-sWW1GFlnjbrDRb1DkMEzePIxgdvLK6cZt0Qg93yDMVP2z1yN';
|
|
|
+ // 从请求参数获取video_id,如果没有则使用默认值
|
|
|
+ $video_id = input('get.video_id');
|
|
|
+ $apiKey = 'sk-sWW1GFlnjbrDRb1DkMEzePIxgdvLK6cZt0Qg93yDMVP2z1yN';
|
|
|
|
|
|
- // 1. 先检查视频状态
|
|
|
- $statusUrl = 'https://chatapi.onechats.ai/v1/videos/' . $video_id;
|
|
|
- $statusData = $this->fetchVideoStatus($statusUrl, $apiKey);
|
|
|
+ // 1. 先检查视频状态
|
|
|
+ $statusUrl = 'https://chatapi.onechats.ai/v1/videos/' . $video_id;
|
|
|
+ $statusData = $this->fetchVideoStatus($statusUrl, $apiKey);
|
|
|
|
|
|
- // 检查视频状态
|
|
|
- if ($statusData['status'] !== 'completed') {
|
|
|
- return json([
|
|
|
- 'code' => 202,
|
|
|
- 'msg' => '视频尚未生成完成',
|
|
|
- 'data' => [
|
|
|
- 'video_id' => $video_id,
|
|
|
- 'status' => $statusData['status'],
|
|
|
- 'progress' => $statusData['progress'],
|
|
|
- 'created_at' => $statusData['created_at'],
|
|
|
- 'message' => '请稍后再试,视频仍在' . ($statusData['status'] === 'queued' ? '排队中' : '处理中')
|
|
|
- ]
|
|
|
- ]);
|
|
|
- }
|
|
|
+ // 检查视频状态
|
|
|
+ if ($statusData['status'] !== 'completed') {
|
|
|
+ return json([
|
|
|
+ 'code' => 202,
|
|
|
+ 'msg' => '视频尚未生成完成',
|
|
|
+ 'data' => [
|
|
|
+ 'video_id' => $video_id,
|
|
|
+ 'status' => $statusData['status'],
|
|
|
+ 'progress' => $statusData['progress'],
|
|
|
+ 'created_at' => $statusData['created_at'],
|
|
|
+ 'message' => '请稍后再试,视频仍在' . ($statusData['status'] === 'queued' ? '排队中' : '处理中')
|
|
|
+ ]
|
|
|
+ ]);
|
|
|
+ }
|
|
|
|
|
|
- // 2. 视频生成完成,准备下载
|
|
|
- $apiUrl = 'https://chatapi.onechats.ai/v1/videos/' . $video_id . '/content';
|
|
|
+ // 2. 视频生成完成,准备下载
|
|
|
+ $apiUrl = 'https://chatapi.onechats.ai/v1/videos/' . $video_id . '/content';
|
|
|
|
|
|
- // 获取可选的variant参数
|
|
|
- $variant = input('get.variant', '');
|
|
|
- if (!empty($variant)) {
|
|
|
- $apiUrl .= '?variant=' . urlencode($variant);
|
|
|
- }
|
|
|
+ // 获取可选的variant参数
|
|
|
+ $variant = input('get.variant', '');
|
|
|
+ if (!empty($variant)) {
|
|
|
+ $apiUrl .= '?variant=' . urlencode($variant);
|
|
|
+ }
|
|
|
|
|
|
- // 创建保存目录
|
|
|
- $saveDir = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'videos' . DS . date('Ymd');
|
|
|
- if (!is_dir($saveDir)) {
|
|
|
- mkdir($saveDir, 0755, true);
|
|
|
- }
|
|
|
+ // 创建保存目录
|
|
|
+ $saveDir = ROOT_PATH . 'public' . DS . 'uploads' . DS . 'videos' . DS . date('Ymd');
|
|
|
+ if (!is_dir($saveDir)) {
|
|
|
+ mkdir($saveDir, 0755, true);
|
|
|
+ }
|
|
|
|
|
|
- // 生成唯一文件名
|
|
|
- $filename = $video_id . '.mp4';
|
|
|
- $localPath = DS . 'uploads' . DS . 'videos' . DS . date('Ymd') . DS . $filename;
|
|
|
- $fullPath = $saveDir . DS . $filename;
|
|
|
+ // 生成唯一文件名
|
|
|
+ $filename = $video_id . '.mp4';
|
|
|
+ $localPath = DS . 'uploads' . DS . 'videos' . DS . date('Ymd') . DS . $filename;
|
|
|
+ $fullPath = $saveDir . DS . $filename;
|
|
|
|
|
|
- // 3. 下载视频
|
|
|
- $videoData = $this->downloadVideo($apiUrl, $apiKey);
|
|
|
+ // 3. 下载视频
|
|
|
+ $videoData = $this->downloadVideo($apiUrl, $apiKey);
|
|
|
|
|
|
- // 4. 保存视频文件
|
|
|
- if (file_put_contents($fullPath, $videoData) === false) {
|
|
|
- throw new Exception('视频保存失败');
|
|
|
- }
|
|
|
+ // 4. 保存视频文件
|
|
|
+ if (file_put_contents($fullPath, $videoData) === false) {
|
|
|
+ throw new Exception('视频保存失败');
|
|
|
+ }
|
|
|
|
|
|
- // 确保路径使用正斜杠,并只保存相对路径部分
|
|
|
- $localPath = str_replace('\\', '/', $localPath);
|
|
|
- // 移除开头的斜杠,确保路径格式为uploads/videos/...
|
|
|
- $savePath = ltrim($localPath, '/');
|
|
|
+ // 确保路径使用正斜杠,并只保存相对路径部分
|
|
|
+ $localPath = str_replace('\\', '/', $localPath);
|
|
|
+ // 移除开头的斜杠,确保路径格式为uploads/videos/...
|
|
|
+ $savePath = ltrim($localPath, '/');
|
|
|
|
|
|
- // 将正确格式的文件路径存入数据库
|
|
|
- Db::name('video')->where('video_id', $video_id)->update([
|
|
|
- 'web_url' => $savePath
|
|
|
- ]);
|
|
|
+ // 将正确格式的文件路径存入数据库
|
|
|
+ Db::name('video')->where('video_id', $video_id)->update([
|
|
|
+ 'web_url' => $savePath
|
|
|
+ ]);
|
|
|
|
|
|
- // 返回成功响应
|
|
|
- return json([
|
|
|
- 'code' => 0,
|
|
|
- 'msg' => '视频下载成功',
|
|
|
- 'data' => [
|
|
|
- 'video_id' => $video_id,
|
|
|
- 'local_path' => $localPath,
|
|
|
- 'web_url' => $savePath,
|
|
|
- 'file_size' => filesize($fullPath)
|
|
|
- ]
|
|
|
- ]);
|
|
|
- }
|
|
|
+ // 返回成功响应
|
|
|
+ return json([
|
|
|
+ 'code' => 0,
|
|
|
+ 'msg' => '视频下载成功',
|
|
|
+ 'data' => [
|
|
|
+ 'video_id' => $video_id,
|
|
|
+ 'local_path' => $localPath,
|
|
|
+ 'web_url' => $savePath,
|
|
|
+ 'file_size' => filesize($fullPath)
|
|
|
+ ]
|
|
|
+ ]);
|
|
|
+ }
|
|
|
|
|
|
|
|
|
/**
|
|
|
@@ -5921,4 +5889,78 @@ class WorkOrder extends Api
|
|
|
$this->success('修改成功');
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 订单编号是否已存在(未删除)
|
|
|
+ */
|
|
|
+ private function isWorkOrderNoExists($orderNo)
|
|
|
+ {
|
|
|
+ return (bool)\db('工单_基本资料')
|
|
|
+ ->where('订单编号', $orderNo)
|
|
|
+ ->whereNull('Mod_rq')
|
|
|
+ ->value('Uniqid');
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按 DC + 年月 + 序号 规则格式化订单编号
|
|
|
+ */
|
|
|
+ private function formatWorkOrderNo($prefix, $newNumber)
|
|
|
+ {
|
|
|
+ if ($newNumber < 10) {
|
|
|
+ return $prefix . '00' . $newNumber;
|
|
|
+ }
|
|
|
+ if ($newNumber >= 10 && $newNumber < 100) {
|
|
|
+ return $prefix . '0' . $newNumber;
|
|
|
+ }
|
|
|
+ return $prefix . $newNumber;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成下一个可用订单编号(与 getWorkOrder 规则一致)
|
|
|
+ */
|
|
|
+ private function generateNextWorkOrderNo()
|
|
|
+ {
|
|
|
+ $time = substr(date('Ym'), 2);
|
|
|
+ $prefix = 'DC' . $time;
|
|
|
+ $lastOrder = \db('工单_基本资料')
|
|
|
+ ->where('订单编号', 'like', '%' . $time . '%')
|
|
|
+ ->whereNull('Mod_rq')
|
|
|
+ ->order('Uniqid desc')
|
|
|
+ ->find();
|
|
|
+
|
|
|
+ $newNumber = empty($lastOrder) ? 1 : ((int)substr($lastOrder['订单编号'], 6) + 1);
|
|
|
+ $orderNo = $this->formatWorkOrderNo($prefix, $newNumber);
|
|
|
+ while ($this->isWorkOrderNoExists($orderNo)) {
|
|
|
+ $newNumber++;
|
|
|
+ $orderNo = $this->formatWorkOrderNo($prefix, $newNumber);
|
|
|
+ }
|
|
|
+ return $orderNo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 提交前确保订单编号唯一:不存在则原样使用,存在则递增直到可用
|
|
|
+ */
|
|
|
+ private function resolveUniqueWorkOrderNo($orderNo)
|
|
|
+ {
|
|
|
+ $orderNo = trim($orderNo);
|
|
|
+ if ($orderNo === '') {
|
|
|
+ return $this->generateNextWorkOrderNo();
|
|
|
+ }
|
|
|
+ if (!$this->isWorkOrderNoExists($orderNo)) {
|
|
|
+ return $orderNo;
|
|
|
+ }
|
|
|
+
|
|
|
+ $prefix = substr($orderNo, 0, 6);
|
|
|
+ $numericPart = (int)substr($orderNo, 6);
|
|
|
+ if ($prefix === '' || $numericPart <= 0) {
|
|
|
+ return $this->generateNextWorkOrderNo();
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ $numericPart++;
|
|
|
+ $orderNo = $this->formatWorkOrderNo($prefix, $numericPart);
|
|
|
+ } while ($this->isWorkOrderNoExists($orderNo));
|
|
|
+
|
|
|
+ return $orderNo;
|
|
|
+ }
|
|
|
+
|
|
|
}
|