Index.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Controller;
  5. use think\Db;
  6. use think\Request;
  7. /**
  8. * 达成大屏数据接口
  9. */
  10. class Index extends Controller{
  11. protected $noNeedLogin = ['*'];
  12. protected $noNeedRight = ['*'];
  13. /**首页*/
  14. public function index(){$this->success('成功');}
  15. /**
  16. *当日班组报工产量【缓存】
  17. */
  18. public function GroupProductionRedis(){
  19. // 存缓存到 Redis
  20. $redis = redis();
  21. $redis_key = md5('GroupProductionRedis');
  22. // 获取当天的日期
  23. $todays = date('Y-m-d'); // 30天前
  24. // $today = date('Y-m-d'); // 当天日期
  25. // 自定义需要显示的生产工序顺序
  26. $customGroups = ['裁剪', '车缝', '手工', '大烫', '总检', '包装'];
  27. // 获取所有设备资料,并按自定义工序顺序过滤
  28. $Machine = db('设备_基本资料')
  29. ->field('生产工序, 设备编组')
  30. ->whereIn('生产工序', $customGroups)
  31. ->select();
  32. // 查询当天设备产量数据
  33. $res = db('设备_产量计酬')->alias('c')
  34. ->field('c.sczl_bh, SUM(c.数量) as 数量, c.工序名称')
  35. // ->where('c.Sys_rq', $today)
  36. ->group('c.sczl_bh')
  37. ->select();
  38. // 将产量数据转换为以设备编组为键的数组,并去除空格,方便合并
  39. $resIndexed = [];
  40. foreach ($res as $item) {
  41. $key = trim($item['sczl_bh']); // 去除空格
  42. $resIndexed[$key] = $item['数量'];
  43. }
  44. // 初始化结果数组,确保所有设备编组都有数量数据
  45. $mergedData = [];
  46. foreach ($Machine as $machine) {
  47. $groupName = trim($machine['设备编组']); // 去除空格
  48. $mergedData[] = [
  49. '工序名称' => $machine['生产工序'],
  50. '组别' => $groupName,
  51. '数量' => isset($resIndexed[$groupName]) ? $resIndexed[$groupName] : 0 // 更新数量
  52. ];
  53. }
  54. // 对 $mergedData 进行排序,先按生产工序的自定义顺序排序,再按设备编组的自然顺序排序
  55. usort($mergedData, function ($a, $b) use ($customGroups) {
  56. // 按生产工序自定义顺序排序
  57. $groupOrderA = array_search($a['工序名称'], $customGroups);
  58. $groupOrderB = array_search($b['工序名称'], $customGroups);
  59. if ($groupOrderA === $groupOrderB) {
  60. // 在同一生产工序内按设备编号自然排序
  61. return strnatcmp($a['组别'], $b['组别']);
  62. }
  63. return $groupOrderA - $groupOrderB;
  64. });
  65. $redis->set($redis_key, json_encode($mergedData));
  66. echo date("Y-m-d H:i:s").'存进去了';
  67. return $mergedData;
  68. }
  69. //车缝
  70. public function GroupMachineCFyi()
  71. {
  72. $redis = redis();
  73. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  74. // 初始化小组名称和数量
  75. $categories = [];
  76. $dataSeries = [];
  77. // 遍历数据,找到所有工序名称为“车缝”的小组,且不属于“大办组”、“小芬组”、“美英组”
  78. foreach ($row as $data) {
  79. if ($data['工序名称'] === '车缝' && $data['组别'] != '大办组' && $data['组别'] != '小芬组' && $data['组别'] != '美英组') {
  80. $categories[] = $data['组别']; // 添加组别到分类中
  81. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  82. }
  83. }
  84. // 构建输出数据格式
  85. $list = [
  86. 'categories' => $categories,
  87. 'series' => [
  88. [
  89. 'name' => '完成',
  90. 'data' => array_values($dataSeries) // 获取数量数组
  91. ]
  92. ]
  93. ];
  94. $res = [
  95. 'status' => 0,
  96. 'msg' => '',
  97. 'data' => $list
  98. ];
  99. // 返回 JSON 格式的结果
  100. return json($res);
  101. }
  102. // 板房车缝
  103. public function GroupMachinebfCFyi()
  104. {
  105. $redis = redis();
  106. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  107. // 初始化小组名称和数量
  108. $categories = [];
  109. $dataSeries = [];
  110. // 遍历数据,找到所有工序名称为“车缝”的小组,且只包含“大办组”、“小芬组”、“美英组”
  111. foreach ($row as $data) {
  112. if ($data['工序名称'] === '车缝' && in_array($data['组别'], ['大办组', '小芬组', '美英组'])) {
  113. $categories[] = $data['组别']; // 添加组别到分类中
  114. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  115. }
  116. }
  117. // 构建输出数据格式
  118. $list = [
  119. 'categories' => $categories,
  120. 'series' => [
  121. [
  122. 'name' => '完成',
  123. 'data' => array_values($dataSeries) // 获取数量数组
  124. ]
  125. ]
  126. ];
  127. $res = [
  128. 'status' => 0,
  129. 'msg' => '',
  130. 'data' => $list
  131. ];
  132. // 返回 JSON 格式的结果
  133. return json($res);
  134. }
  135. //裁剪
  136. public function GroupMachineCJyi()
  137. {
  138. $redis = redis();
  139. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  140. // 初始化小组名称和数量
  141. $categories = [];
  142. $dataSeries = [];
  143. // 遍历数据,找到所有工序名称为“车缝”的小组
  144. foreach ($row as $data) {
  145. if ($data['工序名称'] !== '车缝') {
  146. $categories[] = $data['组别']; // 添加组别到分类中
  147. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  148. }
  149. }
  150. // 构建输出数据格式
  151. $list = [
  152. 'categories' => $categories,
  153. 'series' => [
  154. [
  155. 'name' => '完成',
  156. 'data' => array_values($dataSeries) // 获取数量数组
  157. ]
  158. ]
  159. ];
  160. $res = [
  161. 'status' => 0,
  162. 'msg' => '',
  163. 'data' => $list
  164. ];
  165. // 返回 JSON 格式的结果
  166. return json($res);
  167. }
  168. //手工
  169. public function GroupMachineSGyi()
  170. {
  171. $redis = redis();
  172. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  173. // 初始化小组名称和数量
  174. $categories = [];
  175. $dataSeries = [];
  176. // 遍历数据,找到所有工序名称为“车缝”的小组
  177. foreach ($row as $data) {
  178. if ($data['工序名称'] === '手工') {
  179. $categories[] = $data['组别']; // 添加组别到分类中
  180. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  181. }
  182. }
  183. // 构建输出数据格式
  184. $list = [
  185. 'categories' => $categories,
  186. 'series' => [
  187. [
  188. 'name' => '完成',
  189. 'data' => array_values($dataSeries) // 获取数量数组
  190. ]
  191. ]
  192. ];
  193. $res = [
  194. 'status' => 0,
  195. 'msg' => '',
  196. 'data' => $list
  197. ];
  198. // 返回 JSON 格式的结果
  199. return json($res);
  200. }
  201. //大烫
  202. public function GroupMachineDTyi()
  203. {
  204. $redis = redis();
  205. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  206. // 初始化小组名称和数量
  207. $categories = [];
  208. $dataSeries = [];
  209. // 遍历数据,找到所有工序名称为“车缝”的小组
  210. foreach ($row as $data) {
  211. if ($data['工序名称'] === '大烫') {
  212. $categories[] = $data['组别']; // 添加组别到分类中
  213. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  214. }
  215. }
  216. // 构建输出数据格式
  217. $list = [
  218. 'categories' => $categories,
  219. 'series' => [
  220. [
  221. 'name' => '完成',
  222. 'data' => array_values($dataSeries) // 获取数量数组
  223. ]
  224. ]
  225. ];
  226. $res = [
  227. 'status' => 0,
  228. 'msg' => '',
  229. 'data' => $list
  230. ];
  231. // 返回 JSON 格式的结果
  232. return json($res);
  233. }
  234. //总检
  235. public function GroupMachineZJyi()
  236. {
  237. $redis = redis();
  238. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  239. // 初始化小组名称和数量
  240. $categories = [];
  241. $dataSeries = [];
  242. // 遍历数据,找到所有工序名称为“车缝”的小组
  243. foreach ($row as $data) {
  244. if ($data['工序名称'] === '总检') {
  245. $categories[] = $data['组别']; // 添加组别到分类中
  246. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  247. }
  248. }
  249. // 构建输出数据格式
  250. $list = [
  251. 'categories' => $categories,
  252. 'series' => [
  253. [
  254. 'name' => '完成',
  255. 'data' => array_values($dataSeries) // 获取数量数组
  256. ]
  257. ]
  258. ];
  259. $res = [
  260. 'status' => 0,
  261. 'msg' => '',
  262. 'data' => $list
  263. ];
  264. // 返回 JSON 格式的结果
  265. return json($res);
  266. }
  267. //包装
  268. public function GroupMachineBZyi()
  269. {
  270. $redis = redis();
  271. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  272. // 初始化小组名称和数量
  273. $categories = [];
  274. $dataSeries = [];
  275. // 遍历数据,找到所有工序名称为“车缝”的小组
  276. foreach ($row as $data) {
  277. if ($data['工序名称'] === '包装') {
  278. $categories[] = $data['组别']; // 添加组别到分类中
  279. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  280. }
  281. }
  282. // 构建输出数据格式
  283. $list = [
  284. 'categories' => $categories,
  285. 'series' => [
  286. [
  287. 'name' => '完成',
  288. 'data' => array_values($dataSeries) // 获取数量数组
  289. ]
  290. ]
  291. ];
  292. $res = [
  293. 'status' => 0,
  294. 'msg' => '',
  295. 'data' => $list
  296. ];
  297. // 返回 JSON 格式的结果
  298. return json($res);
  299. }
  300. /**
  301. * 在产订单工序完工详情【缓存】
  302. */
  303. public function getJhzByRedis(){
  304. //存缓存Redis
  305. $redis = redis();
  306. $redis_key = md5('getJhzByRedis');
  307. // 定义固定工序名称
  308. $processNames = ['裁剪', '车缝', '手工', '大烫', '总检', '包装'];
  309. $startTime = date('Y-m-d', strtotime('-30 days'));
  310. $endTime = date('Y-m-d');
  311. $where['c.Sys_rq'] = ['between', [$startTime, $endTime]];
  312. $where['j.出库日期'] = ['<>', 'NULL'];
  313. $where['c.mod_rq'] = null;
  314. // 第一个查询:获取完工数量
  315. $list = \db('工单_基本资料')->alias('j')
  316. ->join('设备_产量计酬 c', 'j.订单编号 = c.订单编号', 'LEFT')
  317. ->field('c.订单编号, j.工单入仓数量, j.客户编号, j.生产款号, j.款式, c.工序名称, sum(c.数量) as 完工数量, j.gd_statu as 订单状态')
  318. ->where($where)
  319. ->group('c.订单编号, c.工序名称')
  320. ->having('完工数量 > 0')
  321. ->select();
  322. // 第二个查询:获取制单数
  323. $yjwhere['y.Mod_rq'] = null;
  324. $yjlist = \db('工单_基本资料')->alias('j')
  325. ->join('工单_印件资料 y', 'j.订单编号 = y.订单编号', 'LEFT')
  326. ->field('y.订单编号, SUM(y.zdtotal) as 制单数')
  327. ->where($yjwhere)
  328. ->group('y.订单编号')
  329. ->select();
  330. // 将制单数结果转换为以订单编号为键的数组,方便后续合并
  331. $yjlistIndexed = [];
  332. foreach ($yjlist as $yj) {
  333. $yjlistIndexed[$yj['订单编号']] = $yj['制单数'];
  334. }
  335. // 合并数据
  336. $mergedData = [];
  337. foreach ($list as $order) {
  338. $orderId = $order['订单编号'];
  339. // 初始化订单数据,如果还未存在
  340. if (!isset($mergedData[$orderId])) {
  341. // 获取制单数和已完工数量
  342. $zdTotal = $yjlistIndexed[$orderId] ?? 0; // 制单数
  343. $completedTotal = $order['工单入仓数量']; // 已完工数量
  344. // 计算完成百分比
  345. $completionPercentage = $zdTotal > 0 ? round(($completedTotal / $zdTotal) * 100, 2) . '%' : '0%';
  346. // 初始化订单数据
  347. $mergedData[$orderId] = [
  348. '订单编号' => $orderId,
  349. '客户编号' => $order['客户编号'],
  350. '生产款号' => $order['生产款号'],
  351. '款式' => $order['款式'],
  352. '订单状态' => $order['订单状态'],
  353. '已完工数量' => $completedTotal,
  354. '制单数' => $zdTotal,
  355. '完成百分比' => $completionPercentage, // 新增字段:完成百分比
  356. ];
  357. // 初始化所有工序的完工数量为空
  358. foreach ($processNames as $process) {
  359. $mergedData[$orderId][$process] = '';
  360. }
  361. }
  362. // 更新对应的工序名称和完工数量
  363. if (in_array($order['工序名称'], $processNames)) {
  364. $mergedData[$orderId][$order['工序名称']] = $order['完工数量'];
  365. }
  366. }
  367. // 转换合并后的数组格式
  368. $result = array_values($mergedData);
  369. $redis->set($redis_key, json_encode($result));
  370. echo date("Y-m-d H:i:s").'存进去了';
  371. return $result;
  372. }
  373. /**
  374. * 在产订单工序完工详情【接口】
  375. */
  376. public function getJhzBy(){
  377. $redis = redis();
  378. $row = json_decode($redis->get(md5('getJhzByRedis')), true);
  379. // 列定义
  380. $result['columns'] = [
  381. ['name' => '订单编号', 'id' => 'ddbh', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  382. ['name' => '客户编号', 'id' => 'khbh', 'width' => '6%', 'textAlign' => 'left'],
  383. ['name' => '生产款号', 'id' => 'sckh', 'width' => '6%', 'textAlign' => 'left'],
  384. ['name' => '款式', 'id' => 'ks', 'width' => '5%', 'textAlign' => 'left'],
  385. ['name' => '订单状态', 'id' => 'ddzt', 'width' => '6%', 'autoWrap' => "true", 'textAlign' => 'left'],
  386. ['name' => '裁剪已完成', 'id' => 'cj', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  387. ['name' => '车缝已完成', 'id' => 'cf', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  388. ['name' => '手工已完成', 'id' => 'sg', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  389. ['name' => '大烫已完成', 'id' => 'dt', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  390. ['name' => '总检已完成', 'id' => 'zj', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  391. ['name' => '包装已完成', 'id' => 'bz', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  392. ['name' => '已完成数量', 'id' => 'ywgsl', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  393. ['name' => '制单总数', 'id' => 'zds', 'width' => '6%', 'autoWrap' => "true", 'textAlign' => 'left'],
  394. ['name' => '完成百分比', 'id' => 'bfb', 'width' => '9%', 'autoWrap' => "true", 'textAlign' => 'left'],
  395. ];
  396. if ($row) {
  397. foreach ($row as $k => $v) {
  398. $result['rows'][$k]['ddbh'] = $v['订单编号'];
  399. $result['rows'][$k]['khbh'] = $v['客户编号'];
  400. $result['rows'][$k]['sckh'] = $v['生产款号'];
  401. $result['rows'][$k]['ks'] = $v['款式'];
  402. $result['rows'][$k]['ddzt'] = $v['订单状态'];
  403. // 工序数量字段,根据之前的定义调整字段名
  404. $result['rows'][$k]['cj'] = $v['裁剪'] ?? '';
  405. $result['rows'][$k]['cf'] = $v['车缝'] ?? '';
  406. $result['rows'][$k]['sg'] = $v['手工'] ?? '';
  407. $result['rows'][$k]['dt'] = $v['大烫'] ?? '';
  408. $result['rows'][$k]['zj'] = $v['总检'] ?? '';
  409. $result['rows'][$k]['bz'] = $v['包装'] ?? '';
  410. // 其他数量字段
  411. $result['rows'][$k]['ywgsl'] = $v['已完工数量'] ?? ''; // 示例字段,需确保与数据一致
  412. $result['rows'][$k]['zds'] = $v['制单数'] ?? ''; // 对应制单数
  413. $result['rows'][$k]['bfb'] = $v['完成百分比'] ?? ''; // 对应制单数
  414. }
  415. } else {
  416. // 如果没有数据,初始化空行
  417. $result['rows'][0] = [
  418. 'ddbh' => '', 'khbh' => '', 'sckh' => '', 'ks' => '', 'ddzt' => '',
  419. 'cj' => '', 'cf' => '', 'sg' => '', 'dt' => '', 'zj' => '', 'bz' => '',
  420. 'ywgsl' => '', 'zds' => ''
  421. ];
  422. }
  423. // echo "<pre>";print_r($result);echo "<pre>";die;
  424. $res['status'] = 0;
  425. $res['msg'] = '';
  426. $res['data'] = $result;
  427. return json($res);
  428. }
  429. /**
  430. *已制单样衣未审、已审核待生产、生产中未完成【缓存】
  431. */
  432. public function yscjDbToRedis(){
  433. //存缓存Redis
  434. $redis = redis();
  435. $redis_key = md5('yscjDbToRedis');
  436. $res = \db('工单_基本资料')
  437. ->where('sys_rq', '>=', date('Y-m-d', strtotime('-30 days')))
  438. ->select();
  439. $redis->set($redis_key, json_encode($res));
  440. echo date("Y-m-d H:i:s").'存进去了';
  441. return $res;
  442. }
  443. /**
  444. *已制单样衣未审【接口】
  445. * 订单已下单 未审核数量
  446. */
  447. public function yhcjDbToRedis(){
  448. $redis = redis();
  449. // 从 Redis 中获取数据
  450. $row = json_decode($redis->get(md5('yscjDbToRedis')), true);
  451. // 初始化计数器
  452. $count = 0;
  453. // 遍历数据,统计审核日期为空、mod_rq 为空、审核状态为空的数据
  454. foreach ($row as $item) {
  455. if (empty($item['审核日期']) && empty($item['Mod_rq']) && empty($item['审核'])) {
  456. $count++;
  457. }
  458. }
  459. // 构造返回数据
  460. $result = [
  461. 'name' => '已制单样衣未审',
  462. 'value' => $count,
  463. ];
  464. // 构造最终的返回结构
  465. $res = [
  466. 'status' => 0,
  467. 'msg' => '',
  468. 'data' => [$result],
  469. ];
  470. // 返回JSON格式的结果
  471. return json($res);
  472. }
  473. /**
  474. *已审核待生产【接口】
  475. */
  476. public function getYscjByRedis(){
  477. $redis = redis();
  478. // 从 Redis 中获取数据
  479. $row = json_decode($redis->get(md5('yscjDbToRedis')), true);
  480. // 初始化计数器
  481. $count = 0;
  482. // 遍历数据,统计审核日期为空、mod_rq 为空、审核状态为空的数据
  483. foreach ($row as $item) {
  484. if (empty($item['出库日期'])) {
  485. $count++;
  486. }
  487. }
  488. // 构造返回数据
  489. $result = [
  490. 'name' => '已审核待生产',
  491. 'value' => $count,
  492. ];
  493. // 构造最终的返回结构
  494. $res = [
  495. 'status' => 0,
  496. 'msg' => '',
  497. 'data' => [$result],
  498. ];
  499. // 返回JSON格式的结果
  500. return json($res);
  501. }
  502. /**
  503. *生产中未完成【缓存】
  504. */
  505. public function getJtClDbByRedis(){
  506. //存缓存Redis
  507. $redis = redis();
  508. $redis_key = md5('getJtClDbByRedis');
  509. $res = \db('工单_排程班次')
  510. ->alias('a')
  511. ->join('工单_印件资料 b','b.订单编号 = a.订单编号 AND a.子订单编号 = a.子订单编号')
  512. ->join('设备_产量计酬 c','a.订单编号 = c.订单编号 AND a.子订单编号 = c.子订单编号','LEFT')
  513. ->field('a.订单编号,a.子订单编号,b.款号,b.颜色,b.船样,b.zdtotal as 制单数,SUM(c.数量) as 已完成')
  514. ->where('a.mod_rq',null)
  515. ->select();
  516. $redis->set($redis_key, json_encode($res));
  517. echo date("Y-m-d H:i:s").'存进去了';
  518. return $res;
  519. }
  520. /**
  521. *生产中未完成【接口】
  522. */
  523. public function getYhcjByRedis(){
  524. $redis = redis();
  525. // 从 Redis 中获取数据
  526. $row = json_decode($redis->get(md5('getJtClDbByRedis')), true);
  527. // 初始化计数器
  528. $count = 0;
  529. // 遍历数据,统计未完成的记录条数
  530. foreach ($row as $item) {
  531. // 假设 '制单数' 是生产总数,'已完成' 是完成的数量
  532. if (isset($item['制单数']) && isset($item['已完成'])) {
  533. // 判断未完成数量是否大于0
  534. if ($item['制单数'] > $item['已完成']) {
  535. $count++;
  536. }
  537. }
  538. }
  539. // 构造返回数据
  540. $result = [
  541. 'name' => '生产中未完成',
  542. 'value' => $count,
  543. ];
  544. // 构造最终的返回结构
  545. $res = [
  546. 'status' => 0,
  547. 'msg' => '',
  548. 'data' => [$result],
  549. ];
  550. // 返回JSON格式的结果
  551. return json($res);
  552. }
  553. public function jtClDbToRedis(){
  554. //本站API接口地址和OpenAI接口格式完全一致,请自行替换。
  555. //API地址: https://api.julianapi.com
  556. $url = "https://api.julianapi.com";
  557. }
  558. public function GtpAiOrder()
  559. {
  560. $param = Request::instance()->get();
  561. $maxOrder = \db('工单_基本资料')
  562. ->where('订单编号', 'like', "{$param['订单编号']}%")
  563. ->order('订单编号', 'desc')
  564. ->limit(1)
  565. ->value('订单编号');
  566. $list = \db('工单_基本资料')
  567. ->where('订单编号', 'like', "{$param['订单编号']}%")
  568. ->order('订单编号', 'desc')
  569. ->limit(1)
  570. ->find();
  571. if($list['面料'] == ''){
  572. $this->error('面料数据为空无法定义BOM');
  573. }
  574. if ($maxOrder) {
  575. $numericPart = substr($maxOrder, 2);
  576. $newNumericPart = str_pad((int)$numericPart + 1, strlen($numericPart), '0', STR_PAD_LEFT);
  577. $param['订单编号'] = $param['订单编号'] . $newNumericPart;
  578. } else {
  579. $param['订单编号'] = $param['订单编号'];
  580. }
  581. if($list['粘衬'] == '' || $list['粘衬'] == '无'){
  582. $massage = $list['面料'];
  583. }else{
  584. $massage = $list['面料'].',粘衬:'.$list['粘衬'];
  585. }
  586. $mianliao = $this->Gpt($massage);
  587. $data = [];
  588. foreach ($mianliao as $key => $value){
  589. $data[$key] = [
  590. 'BOM_工单编号' => $list['订单编号'],
  591. 'BOM_物料名称' => $value,
  592. 'Sys_rq' => date('Y-m-d H:i:s',time()),
  593. 'Sys_ID' => '超级管理员'
  594. ];
  595. }
  596. //插入订单物料信息
  597. $BomSql = \db('工单_bom资料')->fetchSql(true)->insertAll($data);
  598. $BomRes = \db()->query($BomSql);
  599. $this->success('成功');
  600. }
  601. //GPT
  602. public function Gpt($massage)
  603. {
  604. // 设置 API 密钥
  605. $apiKey = 'sk-e0JuPjMntkbgi1BoMjrqyyzMKzAxILkQzyGMSy3xiMupuoWY'; // 替换为您的 API 密钥
  606. // 要发送给 GPT 的消息
  607. $messages = [
  608. [
  609. 'role' => 'user',
  610. 'content' => '你好,帮我按照:面料1、面料2、面料3……来整理归纳下面的面料信息,我只需要面料信息,不需要其他:'.$massage
  611. ]
  612. ];
  613. // 创建请求数据
  614. $data = [
  615. 'model' => 'gpt-3.5-turbo', // 使用的模型
  616. 'messages' => $messages,
  617. 'max_tokens' => 100, // 设置最大 token 数
  618. ];
  619. // 初始化 cURL
  620. $ch = curl_init('https://niubi.zeabur.app/v1/chat/completions');
  621. // 设置 cURL 选项
  622. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  623. curl_setopt($ch, CURLOPT_HTTPHEADER, [
  624. 'Content-Type: application/json',
  625. 'Authorization: Bearer ' . $apiKey,
  626. ]);
  627. curl_setopt($ch, CURLOPT_POST, true);
  628. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
  629. curl_setopt($ch, CURLOPT_CAINFO, ROOT_PATH . '/public/uploads/cacert.pem');
  630. // 执行请求
  631. $response = curl_exec($ch);
  632. // 检查错误
  633. if (curl_errno($ch)) {
  634. echo 'Error:' . curl_error($ch);
  635. }
  636. // 关闭 cURL
  637. curl_close($ch);
  638. // 解析和输出响应
  639. $responseData = json_decode($response, true);
  640. // 获取 GPT 的回复
  641. if (isset($responseData['choices'][0]['message']['content'])) {
  642. //获取返回内容
  643. $gptReply = $responseData['choices'][0]['message']['content'];
  644. // halt($gptReply);
  645. //返回面料信息
  646. $gptArray = explode('面料',$gptReply);
  647. array_shift($gptArray);
  648. foreach ($gptArray as $key=>$value){
  649. $gptArray[$key] = preg_replace('/\s+/', '', substr($value,4));
  650. }
  651. return $gptArray;
  652. } else {
  653. echo "未能获取 GPT 的回复。";
  654. }
  655. }
  656. }