liuhairui 2 weeks ago
parent
commit
c64220169b

+ 146 - 5
application/admin/controller/Procuremen.php

@@ -44,7 +44,7 @@ class Procuremen extends Backend
     protected $noNeedRight = [
         'review', 'reviewCompanies', 'outward_detail', 'export_month_outward', 'snapshotToProcure',
         'pick', 'audit', 'confirm', 'pickreview', 'picksubmit', 'pickadd', 'auditissue', 'auditsubmit',
-        'auditresendsms', 'auditabandon', 'auditresendemail', 'purchaseconfirmpick', 'purchaseapprovalreject', 'add', 'pickdelete', 'completeDirectly', 'rfqlist', 'details',
+        'auditresendsms', 'auditabandon', 'archiveabandon', 'auditresendemail', 'purchaseconfirmpick', 'purchaseapprovalreject', 'add', 'pickdelete', 'completeDirectly', 'rfqlist', 'details',
     ];
 
     public function _initialize()
@@ -5706,12 +5706,12 @@ class Procuremen extends Backend
     }
 
     /**
-     * 废弃单个审批订单 bundle(退回外发初选,明细归档留痕)
+     * 废弃单个订单 bundle(退回外发初选,明细归档留痕)
      *
      * @param array{ccydh:string, pos:array, merge_rows:array} $bundle
      * @return array<int, true> 已处理的 scydgy_id 集合
      */
-    protected function abandonAuditOrderBundle(array $bundle): array
+    protected function abandonOrderBundleToPick(array $bundle, string $logAction, string $logSuffix = ',退回外发初选'): array
     {
         $pos = $bundle['pos'] ?? [];
         if (!is_array($pos) || $pos === []) {
@@ -5732,7 +5732,7 @@ class Procuremen extends Backend
         }
 
         $ccydhLog = trim((string)($bundle['ccydh'] ?? ''));
-        $logMsg = '重新下发' . ($ccydhLog !== '' ? '(' . $ccydhLog . ')' : '') . ',退回外发初选';
+        $logMsg = '重新下发' . ($ccydhLog !== '' ? '(' . $ccydhLog . ')' : '') . $logSuffix;
 
         Db::table('purchase_order')
             ->where('scydgy_id', 'in', array_keys($sids))
@@ -5746,12 +5746,78 @@ class Procuremen extends Backend
         $this->voidPurchaseOrderDetailsForScydgyIds(array_keys($sids));
 
         foreach (array_keys($sids) as $sid) {
-            $this->addOrderLog((int)$sid, 'audit_abandon', $logMsg, null);
+            $this->addOrderLog((int)$sid, $logAction, $logMsg, null);
         }
 
         return $sids;
     }
 
+    /**
+     * 废弃单个审批订单 bundle(退回外发初选,明细归档留痕)
+     *
+     * @param array{ccydh:string, pos:array, merge_rows:array} $bundle
+     * @return array<int, true> 已处理的 scydgy_id 集合
+     */
+    protected function abandonAuditOrderBundle(array $bundle): array
+    {
+        return $this->abandonOrderBundleToPick($bundle, 'audit_abandon');
+    }
+
+    /**
+     * 历史存证 — 已完结订单 bundle(同一 CCYDH 下 status=1 的全部工序)
+     *
+     * @return array{ccydh:string, pos:array<int,array>, merge_rows:array<int,array>}
+     */
+    protected function loadArchiveOrderBundleByScydgyId(string $scydgyId): array
+    {
+        $scydgyId = trim($scydgyId);
+        $empty = ['ccydh' => '', 'pos' => [], 'merge_rows' => []];
+        if ($scydgyId === '') {
+            return $empty;
+        }
+        try {
+            $anchor = Db::table('purchase_order')->where('scydgy_id', $scydgyId)->find();
+        } catch (\Throwable $e) {
+            $anchor = null;
+        }
+        if (!is_array($anchor) || !$this->purchaseOrderRowIsCompleted($anchor)) {
+            return $empty;
+        }
+        $ccydh = trim((string)($anchor['CCYDH'] ?? ''));
+        if ($ccydh === '') {
+            return ['ccydh' => '', 'pos' => [$anchor], 'merge_rows' => $this->scydgyRowsForPurchaseOrders([$anchor])];
+        }
+        try {
+            $query = Db::table('purchase_order')->where('CCYDH', $ccydh);
+            $query->whereRaw("(TRIM(CAST(`status` AS CHAR)) = '1' OR CAST(`status` AS UNSIGNED) = 1)");
+            $pos = $query->order('scydgy_id', 'asc')->select();
+        } catch (\Throwable $e) {
+            $pos = [$anchor];
+        }
+        if (!is_array($pos) || $pos === []) {
+            $pos = [$anchor];
+        }
+
+        return [
+            'ccydh'      => $ccydh,
+            'pos'        => $pos,
+            'merge_rows' => $this->scydgyRowsForPurchaseOrders($pos),
+        ];
+    }
+
+    protected function purchaseOrderRowIsCompleted(array $po): bool
+    {
+        $st = $po['status'] ?? null;
+        if ($st === 1 || $st === '1') {
+            return true;
+        }
+        if (is_string($st) && trim($st) === '1') {
+            return true;
+        }
+
+        return is_numeric($st) && (int)$st === 1;
+    }
+
     /**
      * 废弃订单 — 退回外发初选重新询价(支持单条或批量)
      */
@@ -5827,6 +5893,81 @@ class Procuremen extends Backend
         $this->success($msg);
     }
 
+    /**
+     * 历史存证 — 已完结订单重新下发,退回外发初选(支持单条或批量)
+     */
+    public function archiveAbandon()
+    {
+        if (!$this->request->isPost()) {
+            $this->error(__('Invalid parameters'));
+        }
+
+        $anchorIds = [];
+        $batchRaw = trim((string)$this->request->post('scydgy_ids_json', ''));
+        if ($batchRaw !== '') {
+            $decoded = json_decode($batchRaw, true);
+            if (is_array($decoded)) {
+                foreach ($decoded as $id) {
+                    $s = trim((string)$id);
+                    if ($s !== '') {
+                        $anchorIds[] = $s;
+                    }
+                }
+            }
+        }
+        if ($anchorIds === []) {
+            $single = trim((string)$this->request->post('scydgy_id', ''));
+            if ($single !== '') {
+                $anchorIds[] = $single;
+            }
+        }
+        if ($anchorIds === []) {
+            $this->error('请至少选择一条订单');
+        }
+
+        $processedCcydh = [];
+        $doneOrders = 0;
+
+        Db::startTrans();
+        try {
+            foreach ($anchorIds as $anchorId) {
+                $bundle = $this->loadArchiveOrderBundleByScydgyId($anchorId);
+                if (($bundle['pos'] ?? []) === []) {
+                    continue;
+                }
+                $ccydh = trim((string)($bundle['ccydh'] ?? ''));
+                $dedupeKey = $ccydh !== '' ? $ccydh : ('sid:' . $anchorId);
+                if (isset($processedCcydh[$dedupeKey])) {
+                    continue;
+                }
+                $processedCcydh[$dedupeKey] = true;
+                $sids = $this->abandonOrderBundleToPick(
+                    $bundle,
+                    'archive_abandon',
+                    ',从历史存证退回外发初选'
+                );
+                if ($sids === []) {
+                    continue;
+                }
+                $doneOrders++;
+            }
+            if ($doneOrders < 1) {
+                throw new \Exception('所选订单均不是已完结状态');
+            }
+            Db::commit();
+        } catch (\Throwable $e) {
+            Db::rollback();
+            $this->error($e->getMessage());
+        }
+
+        $this->pickHiddenScydgySetCache = null;
+
+        $msg = $doneOrders > 1
+            ? ('已重新下发 ' . $doneOrders . ' 个订单并退回外发初选,历史记录已保留')
+            : '已退回外发初选,请重新选择供应商下发(历史记录已保留)';
+        $this->success($msg);
+    }
+
     /**
      * 采购终审 — 审批驳回(退回外发审批下发,并发送驳回短信)
      */

+ 1 - 0
application/admin/view/procuremenarchive/index.html

@@ -5,6 +5,7 @@
         <div class="widget-body no-padding">
             <div id="toolbar" class="toolbar">
                 {:build_toolbar('refresh')}
+                <a href="javascript:;" class="btn btn-danger" id="btn-archive-abandon" title="勾选一条或多条已完结订单退回外发初选重新下发"><i class="fa fa-repeat"></i> 重新下发</a>
             </div>
             <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%"></table>
         </div>

+ 59 - 0
public/assets/js/backend/procuremenarchive.js

@@ -1,5 +1,13 @@
 define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
 
+    function archiveEscHtml(s) {
+        return String(s == null ? '' : s)
+            .replace(/&/g, '&amp;')
+            .replace(/</g, '&lt;')
+            .replace(/>/g, '&gt;')
+            .replace(/"/g, '&quot;');
+    }
+
     var Controller = {
         index: function () {
             Table.api.init({
@@ -54,6 +62,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 showJumpto: true,
                 columns: [
                     [
+                        {checkbox: true},
                         {field: 'CCYDH', title: '订单号', operate: 'LIKE'},
                         {field: 'CYJMC', title: '印件名称', operate: 'LIKE', class: 'autocontent', formatter: Table.api.formatter.content},
                         {field: 'CGYMC', title: '工序名称', operate: 'LIKE', class: 'autocontent', formatter: Table.api.formatter.content},
@@ -120,6 +129,56 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 var url = Fast.api.fixurl('procuremen/details?ids=' + encodeURIComponent(String(sid)));
                 Backend.api.open(url, '详情', {area: ['76%', '100%']});
             });
+
+            $(document).off('click.procuremenArchiveAbandon', '#btn-archive-abandon').on('click.procuremenArchiveAbandon', '#btn-archive-abandon', function (e) {
+                e.preventDefault();
+                var sel = table.bootstrapTable('getSelections') || [];
+                if (!sel.length) {
+                    Toastr.warning('请先勾选至少 1 条订单');
+                    return;
+                }
+                var idSet = {};
+                var rowsHtml = '<table class="table table-bordered table-condensed" style="margin:8px 0 0;font-size:12px;">'
+                    + '<thead><tr><th>订单号</th><th>工序名称</th><th>印件名称</th></tr></thead><tbody>';
+                $.each(sel, function (i, row) {
+                    var sid = row && row.scydgy_id;
+                    if (sid != null && sid !== '' && String(sid) !== '0') {
+                        idSet[String(sid)] = true;
+                    }
+                    rowsHtml += '<tr><td>' + archiveEscHtml(String(row.CCYDH || '').trim() || '—') + '</td>'
+                        + '<td>' + archiveEscHtml(String(row.CGYMC || '').trim() || '—') + '</td>'
+                        + '<td>' + archiveEscHtml(String(row.CYJMC || '').trim() || '—') + '</td></tr>';
+                });
+                rowsHtml += '</tbody></table>';
+                var idList = Object.keys(idSet);
+                if (!idList.length) {
+                    Toastr.warning('所选行无效,请重新勾选');
+                    return;
+                }
+                var abandonMsg = '<div style="text-align:left;line-height:1.65;font-size:13px;">'
+                    + '<p style="margin:0 0 8px 0;">即将从历史存证退回外发初选并重新下发以下 <strong>' + idList.length + '</strong> 个订单(历史记录会保留):</p>'
+                    + rowsHtml
+                    + '<p style="margin:10px 0 0;color:#a94442;"><strong>提示:</strong>退回后需重新选择供应商下发。</p></div>';
+                Layer.confirm(abandonMsg, {
+                    title: '重新下发确认',
+                    area: ['560px', 'auto'],
+                    icon: 3,
+                    btn: ['确认重新下发', '取消']
+                }, function (idx) {
+                    Layer.close(idx);
+                    Fast.api.ajax({
+                        url: 'procuremen/archiveabandon',
+                        type: 'POST',
+                        data: {
+                            scydgy_ids_json: JSON.stringify(idList),
+                            __token__: $('input[name=\'__token__\']').val() || Config.token
+                        }
+                    }, function () {
+                        table.bootstrapTable('refresh');
+                        return false;
+                    });
+                });
+            });
         },
         api: {
             bindevent: function () {