Facility.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Db;
  5. use think\Request;
  6. /**
  7. * 质量继绩效管理
  8. */
  9. class Facility extends Api{
  10. protected $noNeedLogin = ['*'];
  11. protected $noNeedRight = ['*'];
  12. /**
  13. * 1.0查询子订单编号
  14. * 通过订单编号查询对应子订单编号
  15. */
  16. public function Apiorderids() {
  17. if ($this->request->isGet() === false) {
  18. $this->error('请求错误');
  19. }
  20. $param = $this->request->param();
  21. $gdlist = \db('工单_印件资料')
  22. ->field('子订单编号')
  23. ->where('订单编号',$param['order'])
  24. ->where('Mod_rq', null)
  25. ->select();
  26. $this->success('成功', [
  27. 'list' => $gdlist,
  28. ]);
  29. }
  30. /**
  31. * 1.1查询订单号或生产款号
  32. * 查询对应订单编号或生产款号
  33. */
  34. public function Apiorder() {
  35. if ($this->request->isGet() === false) {
  36. $this->error('请求错误');
  37. }
  38. $param = $this->request->param();
  39. $gdlist = \db('工单_基本资料')
  40. ->field('订单编号,生产款号')
  41. ->where('订单编号|生产款号','like','%'.$param['search'].'%')
  42. ->where('Mod_rq', null)
  43. ->select();
  44. $this->success('成功', [
  45. 'list' => $gdlist,
  46. ]);
  47. }
  48. /**
  49. * 1.2查询新增基本信息
  50. * 新增查询信息
  51. */
  52. public function queryOrderSize() {
  53. // 检查请求类型是否为GET
  54. if ($this->request->isGet() === false) {
  55. $this->error('请求错误');
  56. }
  57. $param = $this->request->param();
  58. //问题分类
  59. $fetchCategory = \db('db_问题分类')->field('问题类型, classification as 分类名称,num')->order('num desc')->select();
  60. $groupedCategories = [];
  61. // 遍历数据,将相同分类名称的问题类型归类
  62. foreach ($fetchCategory as $item) {
  63. $categoryname = $item['分类名称'];
  64. $category = $item['问题类型'];
  65. // 如果分类名称不存在,则初始化为空数组
  66. if (!isset($groupedCategories[$categoryname])) {
  67. $groupedCategories[$categoryname] = [];
  68. }
  69. // 避免重复添加相同的问题类型
  70. if (!in_array($category, $groupedCategories[$categoryname])) {
  71. $groupedCategories[$categoryname][] = $category;
  72. }
  73. }
  74. $gdlist = \db('工单_基本资料')
  75. ->field('订单编号,生产款号,款式,订单数量')
  76. ->where(['订单编号|生产款号' => $param['订单编号']])
  77. ->where('Mod_rq', null)
  78. ->find();
  79. if (empty($gdlist)) {
  80. $this->error('未找到相关数据');
  81. }
  82. // 查询订单尺码信息
  83. $sizeData = \db('工单_印件资料')->where(['订单编号' => $gdlist['订单编号']])->where('Mod_rq', null)->select();
  84. if (empty($sizeData)) {
  85. $this->error('未找到相关数据');
  86. }
  87. // 计算所有尺码数据
  88. $sizes = [];
  89. foreach ($sizeData as $order) {
  90. foreach ($order as $key => $value) {
  91. if (strpos($key, 'cm') === 0 && strpos($key, 'cmsl') === false && $value !== null && $value !== '') {
  92. $sizes[] = $value;
  93. }
  94. }
  95. }
  96. // 去重后所有子订单重复的尺码数据
  97. $sizes = array_values(array_unique($sizes));
  98. // 获取颜色备注并统计每个颜色的sctotal和zdtotal
  99. $colorData = []; // 用于存储每个颜色备注对应的sctotal和zdtotal
  100. foreach ($sizeData as $item) {
  101. if (!empty($item['颜色备注'])) {
  102. $color = $item['颜色备注'];
  103. $sctotal = (int)$item['sctotal'];
  104. $zdtotal = (int)$item['zdtotal'];
  105. if (isset($colorData[$color])) {
  106. $colorData[$color]['sctotal'] += $sctotal;
  107. $colorData[$color]['zdtotal'] += $zdtotal;
  108. } else {
  109. $colorData[$color] = [
  110. 'sctotal' => $sctotal,
  111. 'zdtotal' => $zdtotal
  112. ];
  113. }
  114. }
  115. }
  116. // 获取颜色备注(去重)
  117. $colorremark = array_values(array_unique(array_keys($colorData)));
  118. //面料分类|面料名称
  119. $getarr = \db('工单_bom资料')
  120. ->field('物料分类,BOM_物料名称')
  121. ->where('BOM_工单编号', $param['订单编号'])
  122. ->where('Mod_rq', null)
  123. ->select();
  124. $fabricArr = []; // 存储拼接后的数据
  125. foreach ($getarr as $value) {
  126. $materialName = $value['BOM_物料名称'];
  127. // 如果物料分类为空,就用'-'代替
  128. $bomDesc = !empty($value['物料分类']) ? $value['物料分类'] : '';
  129. // 拼接字符串,并去除多余空格
  130. $combinedData = trim($bomDesc . ' - ' . $materialName);
  131. // 存入数组
  132. $fabricArr[] = $combinedData;
  133. // $bomDesc = !empty($value['物料分类']) ? $value['物料分类'] : ''; // 防止null
  134. // // 拼接字符串,并去除可能的前后空格
  135. // $combinedData = trim($bomDesc . ' - ' . $materialName, ' -');
  136. // // 存入数组
  137. // $fabricArr[] = $combinedData;
  138. }
  139. // 获取面料颜色
  140. $getAllFabricData = \db('工单_面料资料')
  141. ->field('BOM_物料名称,BOM_定额门幅,BOM_计划门幅,BOM_颜色')
  142. ->where('BOM_工单编号', $param['订单编号'])
  143. ->where('Mod_rq', null)
  144. ->select();
  145. // 用于统计每个物料的用料情况
  146. $uniqueFabricData = []; // 去重后的面料数据
  147. foreach ($getAllFabricData as $fabric) {
  148. $key = $fabric['BOM_颜色'] . '-' . $fabric['BOM_物料名称']; // 以颜色和物料名称为唯一标识
  149. $uniqueFabricData[$key] = $fabric; // 使用唯一标识作为数组的键,自动去重
  150. }
  151. // 重建数组索引,移除键名
  152. $uniqueFabricData = array_values($uniqueFabricData);
  153. $materialUsage = [];
  154. // 遍历每种颜色的统计数据
  155. foreach ($colorData as $color => $data) {
  156. // 遍历去重后的面料数据
  157. foreach ($uniqueFabricData as $fabric) {
  158. // 判断颜色是否匹配
  159. if ($fabric['BOM_颜色'] === $color) {
  160. // 直接统计每个物料的数量,而不进行用料的计算
  161. $materialUsage[$color][$fabric['BOM_物料名称']][] = $fabric; // 使用物料名称作为键,存储所有相关的面料数据
  162. }
  163. }
  164. }
  165. // 生成实际用料数据
  166. $actualUsage = [];
  167. foreach ($materialUsage as $color => $materials) {
  168. foreach ($materials as $materialName => $fabricData) {
  169. // 获取该颜色下的 sctotal 和 zdtotal
  170. $sctotal = isset($colorData[$color]['sctotal']) ? $colorData[$color]['sctotal'] : 0;
  171. $zdtotal = isset($colorData[$color]['zdtotal']) ? $colorData[$color]['zdtotal'] : 0;
  172. // 获取定额门幅和计划门幅
  173. $standardWidth = isset($fabricData[0]['BOM_定额门幅']) ? $fabricData[0]['BOM_定额门幅'] : 0;
  174. $plannedWidth = isset($fabricData[0]['BOM_计划门幅']) ? $fabricData[0]['BOM_计划门幅'] : 0;
  175. // 直接根据去重后的面料数据进行统计
  176. $actualUsage[] = [
  177. '颜色' => $color,
  178. '物料名称' => $materialName,
  179. '定额门幅' => $standardWidth,
  180. '计划门幅' => $plannedWidth,
  181. 'sctotal' => $sctotal,
  182. 'zdtotal' => $zdtotal
  183. ];
  184. }
  185. }
  186. foreach ($actualUsage as &$item) {
  187. // 如果 'sctotal' 或 '定额门幅' 为空,则默认为 0
  188. $sctotal = isset($item['sctotal']) && is_numeric($item['sctotal']) ? $item['sctotal'] : 0;
  189. $demf = isset($item['定额门幅']) && is_numeric($item['定额门幅']) ? $item['定额门幅'] : 0;
  190. $zdtotal = isset($item['zdtotal']) && is_numeric($item['zdtotal']) ? $item['zdtotal'] : 0;
  191. $jhmf = isset($item['计划门幅']) && is_numeric($item['计划门幅']) ? $item['计划门幅'] : 0;
  192. $item['实际用料'] = $sctotal * $demf;
  193. $item['计划用料'] = $zdtotal * $jhmf;
  194. }
  195. // 选择显示的字段
  196. $fieldsToShow = ['颜色', '物料名称', '实际用料', '计划用料'];
  197. $finalResult = array();
  198. foreach ($actualUsage as $item) {
  199. $filteredItem = array();
  200. foreach ($fieldsToShow as $field) {
  201. if (isset($item[$field])) {
  202. $filteredItem[$field] = $item[$field];
  203. }
  204. }
  205. $finalResult[] = $filteredItem;
  206. }
  207. //定义接口
  208. $this->success('成功', [
  209. 'list' => $gdlist,
  210. 'colorremark' => $colorremark,
  211. 'fetchCategory' => $groupedCategories,
  212. 'FabricData' => $fabricArr,
  213. 'size' => $sizes,
  214. '面料统计' => $finalResult
  215. ]);
  216. }
  217. /**
  218. * 1.3新增次品或返工
  219. * 新增到设备_质量汇总表
  220. */
  221. public function ApiAddDefective(){
  222. if (!$this->request->isPost()) {
  223. $this->error('非法请求');
  224. }
  225. $params = $this->request->param();
  226. if (empty($params)){
  227. $this->error('参数错误');
  228. }
  229. $res = \db('设备_质量汇总')->where('mod_rq', null)->order('status_num desc')->find();
  230. //记录每次新增次数排序,判断是否有返回值,没有则从1开始
  231. $status_num = isset($res['status_num']) ? $res['status_num'] : 1;
  232. // 构建单条记录的函数,传递 $list_gd 作为参数
  233. function buildRecords($item,$status_num) {
  234. // 拆分物料名称(假设格式为 面料分类-面料名称)
  235. $materialParts = explode('-', $item['物料名称']);
  236. // 面料分类
  237. $materialCategory = isset($materialParts[0]) ? $materialParts[0] : '';
  238. // 面料名称
  239. $materialName = isset($materialParts[1]) ? $materialParts[1] : '';
  240. // 获取最新的单据编号
  241. $resd = \db('设备_质量汇总')
  242. ->field('单据编号')
  243. ->where('mod_rq', null)
  244. ->order('单据编号 desc')
  245. ->find();
  246. // 获取当前日期
  247. $currentDate = date('Ymd');
  248. // 如果查询到最新的单据编号
  249. if ($resd) {
  250. // 提取最新单据编号的日期和流水号部分
  251. preg_match('/ZL(\d{8})(\d{4})/', $resd['单据编号'], $matches);
  252. // 如果匹配成功,进行累加
  253. if ($matches) {
  254. $lastDate = $matches[1];
  255. $lastNumber = (int)$matches[2]; // 将流水号转为数字
  256. // 如果当前日期和最新单据的日期不同,则从0001开始
  257. $newNumber = ($currentDate !== $lastDate) ? '0001' : str_pad($lastNumber + 1, 4, '0', STR_PAD_LEFT);
  258. } else {
  259. // 如果没有匹配到正确的格式,则从0001开始
  260. $newNumber = '0001';
  261. }
  262. } else {
  263. // 如果没有查询到单据编号,默认从0001开始
  264. $newNumber = '0001';
  265. }
  266. return [
  267. '单据编号' => 'ZL' . $currentDate . $newNumber,
  268. '订单编号' => $item['订单编号'],
  269. '生产款号' => $item['生产款号'],
  270. '款式' => $item['款式'],
  271. '颜色' => $item['颜色'],
  272. '尺码' => $item['尺码'],
  273. '数量' => $item['数量'],
  274. '组别' => $item['组别'],
  275. '实际用料' => $item['实际用料'],
  276. '计划用料' => $item['计划用料'],
  277. '备注' => $item['备注'],
  278. '问题分类' => $item['问题分类'],
  279. 'sczl_rq' => date('Y-m-d H:i:s'),
  280. 'Sys_rq' => $item['Sys_rq'],
  281. 'Sys_id' => $item['Sys_id'],
  282. '状态' => $item['状态'],
  283. 'status_num' => $status_num + 1,
  284. '面料分类' => $materialCategory,
  285. '面料名称' => $materialName,
  286. ];
  287. }
  288. // 检查是否是索引数组(多条记录)
  289. if (isset($params[0]) && is_array($params[0])) {
  290. foreach ($params as $item) {
  291. $list[] = buildRecords($item,$status_num);
  292. }
  293. } else {
  294. // 处理单条记录
  295. $list[] = buildRecords($params,$status_num);
  296. }
  297. // 插入前统计问题分类的使用次数
  298. foreach ($list as $item) {
  299. $category = $item['问题分类'];
  300. // 查询满足 问题类型 + classification 的记录
  301. $record = \db('db_问题分类')
  302. ->where('问题类型', $category)
  303. // 可选,防止 null 报错
  304. ->whereNotNull('classification')
  305. ->find();
  306. if ($record) {
  307. $newNum = intval($record['num']) + 1;
  308. // 使用 update 替代 setInc,手动加1
  309. $updateSql = \db('db_问题分类')->fetchSql(true)
  310. ->where('id', $record['id']) // 建议用主键精确定位
  311. ->update(['num' => $newNum]);
  312. \db()->query($updateSql);
  313. }
  314. }
  315. $result = \db('设备_质量汇总')->insertAll($list);
  316. if ($result) {
  317. $this->success('数据插入成功 : ' . date('H:i:s'));
  318. } else {
  319. $this->error('数据插入失败');
  320. }
  321. }
  322. /**
  323. * 1.4质量管理左侧菜单栏查询
  324. */
  325. public function ApiMouthlist() {
  326. // 检查请求类型是否为GET
  327. if ($this->request->isGet() === false) {
  328. $this->error('请求错误');
  329. }
  330. $param = $this->request->param();
  331. // 查询符合条件的数据
  332. $list = \db('设备_质量汇总')
  333. ->where('状态', $param['code'])
  334. ->where('mod_rq', null)
  335. ->order('Sys_rq desc')
  336. ->group('Sys_rq')
  337. ->select();
  338. if (empty($list)) {
  339. $this->success('成功', '');
  340. return;
  341. //$this->error('未查询到数据');
  342. }
  343. // 用于存储按年和月分类的数据
  344. $data = [];
  345. // 遍历查询结果,将日期按年、月分组
  346. foreach ($list as $item) {
  347. // 获取 Sys_rq 字段的值(日期)
  348. $sys_rq = $item['Sys_rq'];
  349. // 提取年、月、日
  350. $year = date('Y', strtotime($sys_rq));
  351. $month = date('Y-m', strtotime($sys_rq));
  352. $day = date('Y-m-d', strtotime($sys_rq));
  353. // 将数据按年、月、日分类
  354. if (!isset($data[$year])) {
  355. $data[$year] = [];
  356. }
  357. if (!isset($data[$year][$month])) {
  358. $data[$year][$month] = [];
  359. }
  360. // 将日期加入到对应的年、月下
  361. $data[$year][$month][] = $day;
  362. }
  363. $this->success('成功', $data);
  364. }
  365. /**
  366. * 1.5查询单据汇总次片、返工列表数据
  367. */
  368. public function ApiSubPieceAnd() {
  369. if ($this->request->isGet() === false) {
  370. $this->error('请求错误');
  371. }
  372. $params = $this->request->param();
  373. $where = ['mod_rq' => null];
  374. if (!empty($params['code'])) {
  375. $where['状态'] = $params['code'];
  376. }
  377. if (!empty($params['组别'])) {
  378. $where['组别'] = $params['组别'];
  379. }
  380. if (!empty($params['search'])) {
  381. $where['单据编号|订单编号|生产款号|面料名称|面料分类|颜色|问题分类|款式|组别'] = ['like', '%' . $params['search'] . '%'];
  382. }
  383. // 处理日期查询(支持按天和按月)
  384. if (!empty($params['Sys_rq'])) {
  385. if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $params['Sys_rq'])) {
  386. // 按天查询
  387. $where['Sys_rq'] = $params['Sys_rq'];
  388. } elseif (preg_match('/^\d{4}-\d{2}$/', $params['Sys_rq'])) {
  389. // 按月查询
  390. $where['Sys_rq'] = ['like', $params['Sys_rq'] . '%'];
  391. }elseif (preg_match('/^\d{4}$/', $params['Sys_rq'])) {
  392. // 按年查询
  393. //需要年份查询将代码屏蔽取消
  394. // $where['Sys_rq'] = $params['Sys_rq'];
  395. $this->success('成功', ['data' => '', 'total' => '']);
  396. }
  397. }
  398. $data = \db('设备_质量汇总')
  399. ->field('单据编号,订单编号,生产款号,面料名称,面料分类,问题分类,颜色,数量,款式,Sys_rq,尺码,组别')
  400. ->where($where)
  401. ->select();
  402. $mergedData = [];
  403. foreach ($data as $item) {
  404. //一条数据
  405. if (!isset($mergedData[$item['单据编号']])) {
  406. $mergedData[$item['单据编号']] = [
  407. '单据编号' => $item['单据编号'],
  408. '订单编号' => $item['订单编号'],
  409. '款式' => $item['款式'],
  410. '生产款号' => $item['生产款号'],
  411. '问题分类' => $item['问题分类'],
  412. '颜色' => $item['颜色'],
  413. '面料名称' => $item['面料名称'],
  414. '面料分类' => $item['面料分类'],
  415. '数量' => $item['数量'],
  416. '组别' => $item['组别'],
  417. '尺码' => $item['尺码'],
  418. 'Sys_rq' => $item['Sys_rq']
  419. ];
  420. } else {
  421. // 多条合并数据、数量进行累加
  422. $mergedData[$item['单据编号']]['问题分类'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['问题分类']), [$item['问题分类']]))));
  423. $mergedData[$item['单据编号']]['颜色'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['颜色']), [$item['颜色']]))));
  424. $mergedData[$item['单据编号']]['面料名称'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['面料名称']), [$item['面料名称']]))));
  425. $mergedData[$item['单据编号']]['面料分类'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['面料分类']), [$item['面料分类']]))));
  426. $mergedData[$item['单据编号']]['订单编号'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['订单编号']), [$item['订单编号']]))));
  427. $mergedData[$item['单据编号']]['生产款号'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['生产款号']), [$item['生产款号']]))));
  428. $mergedData[$item['单据编号']]['款式'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['款式']), [$item['款式']]))));
  429. $mergedData[$item['单据编号']]['尺码'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['尺码']), [$item['尺码']]))));
  430. $mergedData[$item['单据编号']]['组别'] = implode(',', array_unique(array_filter(array_merge(explode(',', $mergedData[$item['单据编号']]['组别']), [$item['组别']]))));
  431. $mergedData[$item['单据编号']]['数量'] += $item['数量'];
  432. }
  433. }
  434. $finalData = array_values($mergedData);
  435. $this->success('成功', ['data' => $finalData, 'total' => count($finalData)]);
  436. }
  437. /**
  438. * 1.6查询单据明细次片、返工列表数据
  439. */
  440. public function ApiSubPieceAndReworkList() {
  441. if ($this->request->isGet() === false) {
  442. $this->error('请求错误');
  443. }
  444. $params = $this->request->param();
  445. $where = ['mod_rq' => null];
  446. // 状态查询
  447. if (!empty($params['code'])) {
  448. $where['状态'] = $params['code'];
  449. }
  450. // 关键词模糊搜索
  451. if (!empty($params['search'])) {
  452. $where['单据编号|订单编号|生产款号|面料名称|面料分类|颜色|问题分类'] = ['like', '%' . $params['search'] . '%'];
  453. }
  454. // 处理日期查询(支持按天和按月)
  455. if (!empty($params['Sys_rq'])) {
  456. if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $params['Sys_rq'])) {
  457. // 按天查询(2025-03-27)
  458. $where['Sys_rq'] = $params['Sys_rq'];
  459. } elseif (preg_match('/^\d{4}-\d{2}$/', $params['Sys_rq'])) {
  460. // 按月查询(2025-03),匹配该月的所有数据
  461. $where['Sys_rq'] = ['like', $params['Sys_rq'] . '%'];
  462. }
  463. }
  464. $res = \db('设备_质量汇总')
  465. ->where($where)
  466. ->limit(($params['page'] - 1) * $params['limit'], $params['limit'])
  467. ->order('sczl_rq','desc')
  468. ->select();
  469. $this->success('获取成功', ['data' => $res, 'total' => count($res)]);
  470. }
  471. /**
  472. * 查询获取问题分类
  473. */
  474. public function getProblemCategories() {
  475. if (!$this->request->isGet()) {
  476. $this->error('请求错误');
  477. }
  478. $params = $this->request->param();
  479. // 仅查询未被删除的数据
  480. $where = ['mod_rq' => null];
  481. // 允许通过问题类型进行搜索
  482. if (!empty($params['search'])) {
  483. $where['问题类型'] = ['like', '%' . $params['search'] . '%'];
  484. }
  485. $data = \db('db_问题分类')->where($where)->order('update_time desc')->select();
  486. if (!$data) {
  487. $this->error('未查询到数据');
  488. }
  489. $this->success('获取成功', ['data' => $data, 'total' => count($data)]);
  490. }
  491. /**
  492. * 添加问题分类接口
  493. */
  494. public function addProblemCategory() {
  495. if (!$this->request->isPost()) {
  496. $this->error('非法请求');
  497. }
  498. $params = $this->request->param();
  499. if (empty($params['问题类型'])) {
  500. $this->error('问题类型不能为空');
  501. }
  502. $insertData = [
  503. '问题类型' => $params['问题类型'],
  504. 'sys_id' => $params['sys_id'],
  505. 'classification' => $params['classification'],
  506. 'Sys_rq' => date('Y-m-d H:i:s')
  507. ];
  508. $sql = \db('db_问题分类')
  509. ->fetchSql(true)
  510. ->insert($insertData);
  511. $res = \db()->query($sql);
  512. $this->success('添加成功');
  513. }
  514. /**
  515. * 删除问题分类接口
  516. */
  517. public function deleteProblemCategory() {
  518. if (!$this->request->isPost()) {
  519. $this->error('非法请求');
  520. }
  521. $params = $this->request->param();
  522. if (empty($params['id'])) {
  523. $this->error('ID 不能为空');
  524. }
  525. $updateData = [
  526. 'mod_rq' => date('Y-m-d H:i:s')
  527. ];
  528. $res = \db('db_问题分类')->where('id', $params['id'])->update($updateData);
  529. if ($res) {
  530. $this->success('删除成功');
  531. } else {
  532. $this->error('删除失败');
  533. }
  534. }
  535. /**
  536. * 机台设备查询
  537. */
  538. public function getMachineDeviceTypes(){
  539. $res = \db('设备_基本资料')
  540. ->where('mod_rq', null)
  541. ->select();
  542. $this->success('成功', [
  543. 'list' => $res,
  544. ]);
  545. }
  546. /**
  547. * 设备_基本资料
  548. * 更新机台设备
  549. */
  550. public function updateMachineDeviceTypes() {
  551. if (!$this->request->isPost()) {
  552. $this->error('非法请求');
  553. }
  554. $params = $this->request->param();
  555. if (empty($params['UniqId'])) {
  556. $this->error('UniqId 参数不能为空');
  557. }
  558. $deviceData = [
  559. // 'sys_sbID' => $params['sys_sbID'],
  560. // '工序' => $params['工序'],
  561. // '设备编号' => $params['设备编号'],
  562. // '生产工序' => $params['生产工序'],
  563. // '设备编组' => $params['设备编组'],
  564. // '组长' => $params['组长'],
  565. 'status' => $params['status'],
  566. ];
  567. $result = \db('设备_基本资料')
  568. ->where('UniqId', $params['UniqId'])
  569. ->where('mod_rq', null)
  570. ->update($deviceData);
  571. if ($result) {
  572. $this->success('设备更新成功');
  573. } else {
  574. $this->error('设备更新失败');
  575. }
  576. }
  577. /**
  578. * 新增设备_基本资料
  579. * 新增机台设备
  580. */
  581. public function addMachineDeviceTypes() {
  582. if (!$this->request->isPost()) {
  583. $this->error('非法请求');
  584. }
  585. $params = $this->request->param();
  586. // 生产工序与工序号的映射
  587. $processMapping = [
  588. '裁剪' => 2,
  589. '车缝' => 3,
  590. '手工' => 4,
  591. '总检' => 6,
  592. '大烫' => 5,
  593. '包装' => 7,
  594. ];
  595. $productionProcess = $params['生产工序'] ?? '';
  596. $UniqId = \db('设备_基本资料')
  597. ->field('UniqId')
  598. ->order('UniqId desc')
  599. ->find();
  600. // 新的设备数据
  601. $deviceData = [
  602. 'UniqId' => $UniqId['UniqId'] + 1,
  603. 'sys_sbID' => $params['sys_sbID'],
  604. '工序' => $processMapping[$productionProcess],
  605. '设备编号' => $params['设备编号'],
  606. '生产工序' => $params['生产工序'],
  607. '设备编组' => $params['设备编组'],
  608. '组长' => $params['组长'],
  609. 'sys_id' => $params['sys_id'],
  610. 'sys_rq' => date('Y-m-d H:i:s'),
  611. 'status' => 1,
  612. ];
  613. $result = \db('设备_基本资料')->fetchSql(true)
  614. ->insert($deviceData);
  615. $list_gd = \db()->query($result);
  616. if ($result) {
  617. $this->success('设备新增成功');
  618. } else {
  619. $this->error('设备新增失败');
  620. }
  621. }
  622. /**
  623. * 订单状态更新
  624. */
  625. public function Apigdstatus() {
  626. if (!$this->request->isPost()) {
  627. $this->error('非法请求');
  628. }
  629. $params = $this->request->param();
  630. $uniqids = explode(',', $params['Uniqid']);
  631. // 判断gd_statu是否为“3-已完工”,只判断一次
  632. $isFinished = $params['gd_statu'] == '3-已完工';
  633. foreach ($uniqids as $uniqid) {
  634. $uniqid = trim($uniqid);
  635. $updateData = [
  636. 'gd_statu' => $params['gd_statu']
  637. ];
  638. // 如果是“已完工”,加上完工日期
  639. if ($isFinished) {
  640. $updateData['工单完工日期'] = date('Y-m-d H:i:s');
  641. } else {
  642. // 如果不是已完工,清空完工日期
  643. $updateData['工单完工日期'] = null;
  644. }
  645. $ReportSql = \db('工单_基本资料')->where('Uniqid', $uniqid)->fetchSql(true)->update($updateData);
  646. \db()->query($ReportSql);
  647. }
  648. $this->success('订单状态更新成功');
  649. }
  650. /**
  651. * 产品BOM资料
  652. */
  653. public function Apibomlistarr(){
  654. if ($this->request->isGet() === false) {
  655. $this->error('请求错误');
  656. }
  657. $param = $this->request->param();
  658. $page = isset($param['page']) ? (int)$param['page'] : 1; // 默认第1页
  659. $limit = isset($param['limit']) ? (int)$param['limit'] : 50; // 默认每页50条
  660. $bomlist = Db::name('工单_bom资料')
  661. ->alias('a')
  662. ->field('
  663. a.BOM_工单编号 as 订单编号,
  664. a.BOM_desc as 备注,
  665. a.BOM_库存总量 as 库存总量,
  666. a.BOM_面料结余 as 面料结余,
  667. a.BOM_实际门幅 as 实际门幅,
  668. a.BOM_物料编码 as 物料编码,
  669. a.BOM_物料名称 as 物料名称,
  670. a.BOM_投料单位 as 投料单位,
  671. a.BOM_标准用量 as 定额用料,
  672. a.BOM_计划用量 as 计划用料,
  673. a.BOM_实际用量 as 标准用料,
  674. a.Bom_领用数量 as 领用数量,
  675. a.BOM_退还数量 as 退还数量,
  676. a.BOM_退还数量 as 退还数量,
  677. a.Sys_ID,
  678. a.Sys_rq,
  679. a.UNIQID,
  680. a.物料分类 as 物料分类,
  681. a.BOM_计划门幅 as 计划门幅,
  682. a.BOM_定额门幅 as 定额门幅,
  683. b.生产款号,
  684. b.客户编号,
  685. b.款式
  686. ')
  687. ->join('工单_基本资料 b', 'a.BOM_工单编号 = b.订单编号', 'left') // 多条件关联
  688. ->where('a.BOM_工单编号|a.BOM_物料编码|a.BOM_物料名称|a.物料分类|b.生产款号|b.款式|b.客户编号', 'like', "{$param['search']}%")
  689. ->order('a.BOM_工单编号 desc')
  690. ->where('a.Mod_rq',null)
  691. ->limit(($page - 1) * $limit, $limit)
  692. ->select();
  693. // 处理数据,去掉计划用料字段的小数点后多余的0
  694. foreach ($bomlist as &$item) {
  695. // 转换为浮点数,去掉无意义的 0
  696. $item['计划用料'] = floatval($item['计划用料']);
  697. }
  698. // 解除引用,防止意外修改
  699. unset($item);
  700. $count = Db::name('工单_bom资料')
  701. ->where('Mod_rq',null)
  702. ->count();
  703. $data['total'] = $count;
  704. $data['list'] = $bomlist;
  705. $this->success('成功',$data);
  706. }
  707. }