| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- namespace app\common\library\ps;
- use app\common\model\ps\Product;
- use app\common\model\ps\Workorder;
- use think\Exception;
- /**
- * 产品/工单统一入库(页面、AI 导入、Open API 共用)
- */
- class BizIngest
- {
- /**
- * @param array $payload
- * @param int $userId
- * @return Product
- * @throws Exception
- */
- public static function saveProduct(array $payload, $userId = 0)
- {
- $factoryId = FactoryContext::requireId();
- $code = self::str($payload, ['code', 'product_code', 'no'], 64);
- $name = self::str($payload, ['name', 'product_name', 'title'], 100);
- if ($code === '' && $name === '') {
- throw new Exception('产品缺少编码或名称');
- }
- if ($code === '') {
- $code = 'P' . date('ymdHis') . substr((string)mt_rand(100, 999), 0, 3);
- }
- if ($name === '') {
- $name = $code;
- }
- $processes = self::normalizeProcesses($payload);
- $row = (new Product())->where('factory_id', $factoryId)->where('code', $code)->find();
- $data = [
- 'code' => $code,
- 'name' => $name,
- 'spec' => self::str($payload, ['spec'], 100),
- 'unit' => self::str($payload, ['unit'], 20) ?: '件',
- 'remark' => self::str($payload, ['remark'], 255),
- 'status' => 'normal',
- 'creator_user_id' => $userId,
- ];
- if ($row) {
- unset($data['creator_user_id']);
- $row->allowField(true)->save($data);
- } else {
- $row = new Product();
- $row->allowField(true)->save($data);
- }
- ProcessWriter::save($row->id, $processes, 'product');
- return $row;
- }
- /**
- * @param array $payload
- * @param int $userId
- * @return Workorder
- * @throws Exception
- */
- public static function saveWorkorder(array $payload, $userId = 0)
- {
- $factoryId = FactoryContext::requireId();
- $no = self::str($payload, ['no', 'workorder_no', 'code'], 64);
- if ($no === '') {
- $no = 'WO' . date('ymdHis') . substr((string)mt_rand(100, 999), 0, 3);
- }
- $productId = (int)($payload['product_id'] ?? 0);
- $productCode = self::str($payload, ['product_code'], 64);
- if ($productId <= 0 && $productCode !== '') {
- $product = (new Product())->where('factory_id', $factoryId)->where('code', $productCode)->find();
- if (!$product) {
- $product = self::saveProduct([
- 'code' => $productCode,
- 'name' => self::str($payload, ['product_name', 'name'], 100) ?: $productCode,
- 'spec' => self::str($payload, ['spec'], 100),
- 'unit' => self::str($payload, ['unit'], 20),
- 'processes' => [],
- ], $userId);
- }
- $productId = (int)$product->id;
- }
- $processes = self::normalizeProcesses($payload);
- if (!$processes && $productId > 0) {
- $product = Product::with('processes')->find($productId);
- $processes = $product ? $product['processes'] : [];
- }
- $productName = self::str($payload, ['product_name', 'name'], 100);
- if ($productName === '' && $productId > 0) {
- $linked = isset($product) ? $product : Product::get($productId);
- $productName = $linked ? (string)$linked['name'] : '';
- }
- if ($productName === '') {
- throw new Exception('请选择产品或填写名称');
- }
- $row = (new Workorder())->where('factory_id', $factoryId)->where('no', $no)->find();
- $data = [
- 'no' => $no,
- 'product_id' => $productId,
- 'product_name' => $productName,
- 'batch_no' => self::str($payload, ['batch_no', 'batch'], 64),
- 'customer' => self::str($payload, ['customer'], 100),
- 'plan_date' => self::date($payload, ['plan_date', 'date']),
- 'remark' => self::str($payload, ['remark'], 255),
- 'status' => self::str($payload, ['status'], 20) ?: 'draft',
- 'creator_user_id' => $userId,
- ];
- if ($row) {
- unset($data['creator_user_id']);
- $row->allowField(true)->save($data);
- } else {
- $row = new Workorder();
- $row->allowField(true)->save($data);
- }
- ProcessWriter::save($row->id, $processes, 'workorder');
- return $row;
- }
- /**
- * @param array $payload
- * @return array
- */
- public static function normalizeProcesses($payload)
- {
- $rows = [];
- if (isset($payload['processes']) && is_array($payload['processes'])) {
- $rows = $payload['processes'];
- } elseif (isset($payload['process_list']) && is_array($payload['process_list'])) {
- $rows = $payload['process_list'];
- }
- $out = [];
- $seq = 1;
- foreach ($rows as $row) {
- if (!is_array($row)) {
- continue;
- }
- $name = self::str($row, ['name', 'process_name', 'title'], 100);
- $code = self::str($row, ['code', 'process_code', 'no'], 64);
- if ($name === '' && $code === '') {
- continue;
- }
- $out[] = [
- 'seq' => isset($row['seq']) && $row['seq'] !== '' ? (int)$row['seq'] : $seq,
- 'code' => $code,
- 'name' => $name !== '' ? $name : $code,
- 'workstation' => self::str($row, ['workstation', 'station'], 64),
- 'standard_time' => self::str($row, ['standard_time', 'time'], 32),
- 'qc_points' => self::str($row, ['qc_points', 'qc'], 255),
- 'remark' => self::str($row, ['remark'], 255),
- ];
- $seq++;
- }
- return $out;
- }
- protected static function str(array $data, array $keys, $max = 255)
- {
- foreach ($keys as $key) {
- if (!isset($data[$key])) {
- continue;
- }
- $v = trim((string)$data[$key]);
- if ($v !== '') {
- return mb_substr($v, 0, $max);
- }
- }
- return '';
- }
- protected static function num(array $data, array $keys)
- {
- foreach ($keys as $key) {
- if (!isset($data[$key]) || $data[$key] === '') {
- continue;
- }
- return (float)$data[$key];
- }
- return 0;
- }
- protected static function date(array $data, array $keys)
- {
- $v = self::str($data, $keys, 32);
- if ($v === '') {
- return null;
- }
- $ts = strtotime($v);
- return $ts ? date('Y-m-d', $ts) : null;
- }
- }
|