liuhairui 3 nedēļas atpakaļ
vecāks
revīzija
91975bfcf8
29 mainītis faili ar 2530 papildinājumiem un 1184 dzēšanām
  1. 1 1
      application/admin/controller/Customer.php
  2. 665 124
      application/admin/controller/Procuremen.php
  3. 112 19
      application/admin/controller/Procuremenarchive.php
  4. 306 22
      application/admin/controller/Procuremenexport.php
  5. 1 1
      application/admin/controller/Procuremensms.php
  6. 2 0
      application/admin/controller/Purchaseemail.php
  7. 102 530
      application/admin/view/procuremen/add.html
  8. 81 72
      application/admin/view/procuremen/audit_issue.html
  9. 62 14
      application/admin/view/procuremen/details_fragment.html
  10. 16 0
      application/admin/view/procuremen/details_pdf_shell.html
  11. 36 4
      application/admin/view/procuremen/index.html
  12. 168 67
      application/admin/view/procuremen/outward_detail.html
  13. 3 3
      application/admin/view/procuremen/review.html
  14. 12 0
      application/admin/view/procuremen/rfqlist.html
  15. 6 2
      application/admin/view/procuremenexport/index.html
  16. 30 10
      application/api/controller/Fourth.php
  17. 0 70
      application/api/controller/Index.php
  18. 2 2
      application/api/controller/Procuremen.php
  19. 0 1
      application/api/controller/Third.php
  20. 7 2
      application/extra/mproc.php
  21. 54 15
      application/index/controller/Index.php
  22. 30 10
      application/index/view/index/login.html
  23. 18 0
      public/assets/css/backend.css
  24. 3 1
      public/assets/js/backend/customer.js
  25. 652 164
      public/assets/js/backend/procuremen.js
  26. 72 5
      public/assets/js/backend/procuremenarchive.js
  27. 84 43
      public/assets/js/backend/procuremenexport.js
  28. 3 1
      public/assets/js/backend/procuremensms.js
  29. 2 1
      public/assets/js/backend/purchaseemail.js

+ 1 - 1
application/admin/controller/Customer.php

@@ -22,7 +22,7 @@ class Customer extends Backend
     protected $model = null;
     protected $model = null;
 
 
     /** 顶部搜索框:多字段模糊匹配(OR + LIKE) */
     /** 顶部搜索框:多字段模糊匹配(OR + LIKE) */
-    protected $searchFields = 'company_name,username,account,email,phone,company_type';
+    protected $searchFields = 'company_name,username,account,email,phone,company_type,status';
 
 
     protected $noNeedRight = ['company_type_options', 'companyTypeOptions'];
     protected $noNeedRight = ['company_type_options', 'companyTypeOptions'];
 
 

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 665 - 124
application/admin/controller/Procuremen.php


+ 112 - 19
application/admin/controller/Procuremenarchive.php

@@ -27,27 +27,17 @@ class Procuremenarchive extends Backend
         $this->relationSearch = false;
         $this->relationSearch = false;
         $this->request->filter(['strip_tags', 'trim']);
         $this->request->filter(['strip_tags', 'trim']);
         if ($this->request->isAjax()) {
         if ($this->request->isAjax()) {
-            list(, $sort, $order, $offset, $limit) = $this->buildparams();
-            $ccydhKw = trim((string)$this->request->get('ccydh', ''));
-            if ($ccydhKw === '') {
-                $ccydhKw = trim((string)$this->request->get('search', ''));
-            }
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+            $limit = max(10, min(500, (int)$limit));
+            $offset = max(0, (int)$offset);
 
 
-            $applyFilters = function ($query) use ($ccydhKw) {
+            $applyFilters = function ($query) use ($where) {
                 $this->applyPurchaseOrderCompletedWhere($query);
                 $this->applyPurchaseOrderCompletedWhere($query);
-                if ($ccydhKw !== '') {
-                    $query->where(function ($q) use ($ccydhKw) {
-                        $q->where('CCYDH', 'like', '%' . $ccydhKw . '%')
-                            ->whereOr('CYJMC', 'like', '%' . $ccydhKw . '%')
-                            ->whereOr('CGYMC', 'like', '%' . $ccydhKw . '%');
-                    });
+                if (!empty($where)) {
+                    $query->where($where);
                 }
                 }
             };
             };
 
 
-            $countQuery = Db::table('purchase_order');
-            $applyFilters($countQuery);
-            $total = (int)$countQuery->count();
-
             $sortField = preg_match('/^[a-zA-Z0-9_]+$/', (string)$sort) ? $sort : 'id';
             $sortField = preg_match('/^[a-zA-Z0-9_]+$/', (string)$sort) ? $sort : 'id';
             $orderDir = strtoupper((string)$order) === 'ASC' ? 'ASC' : 'DESC';
             $orderDir = strtoupper((string)$order) === 'ASC' ? 'ASC' : 'DESC';
             $listQuery = Db::table('purchase_order');
             $listQuery = Db::table('purchase_order');
@@ -55,7 +45,6 @@ class Procuremenarchive extends Backend
             $rows = $listQuery
             $rows = $listQuery
                 ->field('id,scydgy_id,CCYDH,CYJMC,CGYMC,createtime,dStamp')
                 ->field('id,scydgy_id,CCYDH,CYJMC,CGYMC,createtime,dStamp')
                 ->order($sortField, $orderDir)
                 ->order($sortField, $orderDir)
-                ->limit($offset, $limit)
                 ->select();
                 ->select();
             if (!is_array($rows)) {
             if (!is_array($rows)) {
                 $rows = [];
                 $rows = [];
@@ -69,12 +58,16 @@ class Procuremenarchive extends Backend
                 $sid = (int)($r['scydgy_id'] ?? 0);
                 $sid = (int)($r['scydgy_id'] ?? 0);
                 $doneText = '';
                 $doneText = '';
                 $ct = $r['createtime'] ?? null;
                 $ct = $r['createtime'] ?? null;
+                $ctNum = 0;
                 if (is_numeric($ct) && (int)$ct > 946684800) {
                 if (is_numeric($ct) && (int)$ct > 946684800) {
-                    $doneText = date('Y-m-d H:i:s', (int)$ct);
+                    $ctNum = (int)$ct;
+                    $doneText = date('Y-m-d H:i:s', $ctNum);
                 } elseif (is_string($ct) && trim($ct) !== '' && stripos(trim($ct), '0000-00-00') !== 0) {
                 } elseif (is_string($ct) && trim($ct) !== '' && stripos(trim($ct), '0000-00-00') !== 0) {
                     $doneText = trim($ct);
                     $doneText = trim($ct);
+                    $ctNum = (int)strtotime($doneText);
                 } elseif (!empty($r['dStamp']) && stripos((string)$r['dStamp'], '0000-00-00') !== 0) {
                 } elseif (!empty($r['dStamp']) && stripos((string)$r['dStamp'], '0000-00-00') !== 0) {
                     $doneText = trim((string)$r['dStamp']);
                     $doneText = trim((string)$r['dStamp']);
+                    $ctNum = (int)strtotime($doneText);
                 }
                 }
                 $out[] = [
                 $out[] = [
                     'id'              => (int)($r['id'] ?? 0),
                     'id'              => (int)($r['id'] ?? 0),
@@ -82,13 +75,113 @@ class Procuremenarchive extends Backend
                     'CCYDH'           => trim((string)($r['CCYDH'] ?? '')),
                     'CCYDH'           => trim((string)($r['CCYDH'] ?? '')),
                     'CYJMC'           => trim((string)($r['CYJMC'] ?? '')),
                     'CYJMC'           => trim((string)($r['CYJMC'] ?? '')),
                     'CGYMC'           => trim((string)($r['CGYMC'] ?? '')),
                     'CGYMC'           => trim((string)($r['CGYMC'] ?? '')),
+                    'createtime'      => $ctNum > 0 ? $ctNum : (is_numeric($ct) ? (int)$ct : $ct),
                     'createtime_text' => $doneText,
                     'createtime_text' => $doneText,
                 ];
                 ];
             }
             }
 
 
-            return json(['total' => $total, 'rows' => $out]);
+            $merged = $this->collapseArchiveRowsByOrder($out);
+            $nMerged = count($merged);
+            if ($nMerged > 1 && $sortField === 'id') {
+                usort($merged, function ($a, $b) use ($orderDir) {
+                    $cmp = ((int)($a['id'] ?? 0)) <=> ((int)($b['id'] ?? 0));
+                    if ($cmp === 0) {
+                        return strcmp((string)($a['CCYDH'] ?? ''), (string)($b['CCYDH'] ?? ''));
+                    }
+
+                    return $orderDir === 'ASC' ? $cmp : -$cmp;
+                });
+            } elseif ($nMerged > 1 && $sortField === 'createtime') {
+                usort($merged, function ($a, $b) use ($orderDir) {
+                    $ta = (int)($a['createtime'] ?? 0);
+                    $tb = (int)($b['createtime'] ?? 0);
+                    if ($ta === $tb) {
+                        return ((int)($b['id'] ?? 0)) <=> ((int)($a['id'] ?? 0));
+                    }
+
+                    return $orderDir === 'ASC' ? ($ta <=> $tb) : ($tb <=> $ta);
+                });
+            }
+
+            $pageRows = array_slice($merged, $offset, $limit);
+
+            return json(['total' => $nMerged, 'rows' => $pageRows]);
         }
         }
 
 
         return $this->view->fetch();
         return $this->view->fetch();
     }
     }
+
+    /**
+     * 历史存证:同一订单号 CCYDH 合并为一行(与审批/确认列表一致)
+     *
+     * @param array<int, array<string, mixed>> $rows
+     * @return array<int, array<string, mixed>>
+     */
+    protected function collapseArchiveRowsByOrder(array $rows): array
+    {
+        if ($rows === []) {
+            return [];
+        }
+        $groups = [];
+        foreach ($rows as $row) {
+            if (!is_array($row)) {
+                continue;
+            }
+            $dh = trim((string)($row['CCYDH'] ?? ''));
+            $key = $dh !== '' ? $dh : ('_id_' . (int)($row['id'] ?? 0));
+            if (!isset($groups[$key])) {
+                $groups[$key] = [];
+            }
+            $groups[$key][] = $row;
+        }
+        $out = [];
+        foreach ($groups as $groupRows) {
+            if ($groupRows === []) {
+                continue;
+            }
+            usort($groupRows, function ($a, $b) {
+                return ((int)($a['id'] ?? 0)) <=> ((int)($b['id'] ?? 0));
+            });
+            $head = $groupRows[0];
+            $gymcList = [];
+            foreach ($groupRows as $r) {
+                $g = trim((string)($r['CGYMC'] ?? ''));
+                if ($g !== '' && !in_array($g, $gymcList, true)) {
+                    $gymcList[] = $g;
+                }
+            }
+            $merged = $head;
+            if (count($groupRows) > 1) {
+                $merged['CGYMC'] = implode('、', $gymcList);
+            }
+            $merged['process_count'] = count($groupRows);
+            $latestTs = 0;
+            $latestText = '';
+            foreach ($groupRows as $r) {
+                $ts = (int)($r['createtime'] ?? 0);
+                if ($ts <= 0 && !empty($r['createtime_text'])) {
+                    $ts = (int)strtotime((string)$r['createtime_text']);
+                }
+                if ($ts > $latestTs) {
+                    $latestTs = $ts;
+                    $latestText = trim((string)($r['createtime_text'] ?? ''));
+                }
+            }
+            if ($latestTs > 0) {
+                $merged['createtime'] = $latestTs;
+                if ($latestText === '') {
+                    $latestText = date('Y-m-d H:i:s', $latestTs);
+                }
+                $merged['createtime_text'] = $latestText;
+            }
+            $maxId = (int)($head['id'] ?? 0);
+            foreach ($groupRows as $r) {
+                $maxId = max($maxId, (int)($r['id'] ?? 0));
+            }
+            $merged['id'] = $maxId;
+            $out[] = $merged;
+        }
+
+        return $out;
+    }
 }
 }

+ 306 - 22
application/admin/controller/Procuremenexport.php

@@ -3,6 +3,7 @@
 namespace app\admin\controller;
 namespace app\admin\controller;
 
 
 use app\common\controller\Backend;
 use app\common\controller\Backend;
+use think\Db;
 
 
 /**
 /**
  * 外发采购 — 月度报表导出列表
  * 外发采购 — 月度报表导出列表
@@ -11,36 +12,319 @@ use app\common\controller\Backend;
  */
  */
 class Procuremenexport extends Backend
 class Procuremenexport extends Backend
 {
 {
+    protected $searchFields = 'CCYDH,CYJMC,CGYMC';
+
+    public function index()
+    {
+        $this->relationSearch = false;
+        $this->request->filter(['strip_tags', 'trim']);
+        if ($this->request->isAjax()) {
+            $ym = trim((string)$this->request->request('ym', date('Y-m')));
+            if (!preg_match('/^\d{4}-\d{2}$/', $ym)) {
+                $ym = date('Y-m');
+            }
+            try {
+                $rows = $this->buildExportableOrderRows($ym);
+
+                return json(['total' => count($rows), 'rows' => $rows, 'ym' => $ym]);
+            } catch (\Throwable $e) {
+                return json(['total' => 0, 'rows' => [], 'ym' => $ym, 'msg' => $e->getMessage()]);
+            }
+        }
+
+        return $this->view->fetch();
+    }
+
     /**
     /**
-     * @var \app\admin\model\Purchasemonthexport
+     * 已完结、已选定供应商、可按月份导出的订单(合并为一单一行)
      */
      */
-    protected $model = null;
+    public function exportable()
+    {
+        if (!$this->request->isAjax()) {
+            $this->error(__('Invalid parameters'));
+        }
+        $ym = trim((string)$this->request->get('ym', date('Y-m')));
+        if (!preg_match('/^\d{4}-\d{2}$/', $ym)) {
+            $ym = date('Y-m');
+        }
+        try {
+            $rows = $this->buildExportableOrderRows($ym);
 
 
-    protected $searchFields = 'ym,admin_name';
+            return json(['total' => count($rows), 'rows' => $rows, 'ym' => $ym]);
+        } catch (\Throwable $e) {
+            return json(['total' => 0, 'rows' => [], 'ym' => $ym, 'msg' => $e->getMessage()]);
+        }
+    }
 
 
-    public function _initialize()
+    /**
+     * @return array<int, array<string, mixed>>
+     */
+    protected function buildExportableOrderRows(string $ym): array
     {
     {
-        parent::_initialize();
-        $this->model = new \app\admin\model\Purchasemonthexport;
+        $pickedSet = $this->loadPickedScydgyIdSet();
+        if ($pickedSet === []) {
+            return [];
+        }
+        try {
+            $query = Db::table('purchase_order');
+            $query->whereRaw("(TRIM(CAST(`status` AS CHAR)) = '1' OR CAST(`status` AS UNSIGNED) = 1)");
+            $query->where('scydgy_id', 'in', array_keys($pickedSet));
+            $dbRows = $query
+                ->field('id,scydgy_id,CCYDH,CYJMC,CGYMC,pick_time,createtime,dStamp')
+                ->order('id', 'desc')
+                ->select();
+        } catch (\Throwable $e) {
+            $dbRows = [];
+        }
+        if (!is_array($dbRows)) {
+            $dbRows = [];
+        }
+
+        $sidList = [];
+        foreach ($dbRows as $r) {
+            if (!is_array($r)) {
+                continue;
+            }
+            $sid = (int)($r['scydgy_id'] ?? 0);
+            if ($sid > 0) {
+                $sidList[$sid] = true;
+            }
+        }
+        $amountMap = $this->loadPickedAmountSumByScydgyIds(array_keys($sidList));
+
+        $pool = [];
+        foreach ($dbRows as $r) {
+            if (!is_array($r)) {
+                continue;
+            }
+            $rowYm = $this->resolvePurchaseOrderRowYm($r);
+            if ($rowYm !== $ym) {
+                continue;
+            }
+            $sid = (int)($r['scydgy_id'] ?? 0);
+            $doneText = $this->formatPurchaseOrderDoneTime($r);
+            $pool[] = [
+                'id'              => (int)($r['id'] ?? 0),
+                'scydgy_id'       => $sid,
+                'CCYDH'           => trim((string)($r['CCYDH'] ?? '')),
+                'CYJMC'           => trim((string)($r['CYJMC'] ?? '')),
+                'CGYMC'           => trim((string)($r['CGYMC'] ?? '')),
+                'ym'              => $rowYm,
+                'createtime_text' => $doneText,
+                'detail_amount'   => (float)($amountMap[$sid] ?? 0),
+            ];
+        }
+
+        $merged = $this->collapseExportRowsByOrder($pool);
+        foreach ($merged as &$row) {
+            $amt = 0.0;
+            $cnt = 0;
+            if (!empty($row['_merge_rows']) && is_array($row['_merge_rows'])) {
+                foreach ($row['_merge_rows'] as $mr) {
+                    if (!is_array($mr)) {
+                        continue;
+                    }
+                    $amt += (float)($mr['detail_amount'] ?? 0);
+                    $cnt++;
+                    if (trim((string)($row['ym'] ?? '')) === '') {
+                        $ymv = trim((string)($mr['ym'] ?? ''));
+                        if ($ymv !== '') {
+                            $row['ym'] = $ymv;
+                        }
+                    }
+                }
+            } else {
+                $amt = (float)($row['detail_amount'] ?? 0);
+                $cnt = 1;
+            }
+            $row['row_count'] = $cnt;
+            $row['total_amount'] = round($amt, 2);
+            $row['total_amount_text'] = number_format($amt, 2, '.', ',');
+            unset($row['_merge_rows'], $row['detail_amount']);
+        }
+        unset($row);
+
+        return $merged;
     }
     }
 
 
-    public function index()
+    /**
+     * @return array<int, true>
+     */
+    protected function loadPickedScydgyIdSet(): array
     {
     {
-        $this->relationSearch = false;
-        $this->request->filter(['strip_tags', 'trim']);
-        if ($this->request->isAjax()) {
-            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
-            $list = $this->model
-                ->where($where)
-                ->order($sort ?: 'id', $order ?: 'desc')
-                ->paginate($limit);
-            foreach ($list as $row) {
-                $ct = (int)($row['createtime'] ?? 0);
-                $row->createtime_text = $ct > 0 ? date('Y-m-d H:i:s', $ct) : '';
-                $row->total_amount_text = number_format((float)($row['total_amount'] ?? 0), 2, '.', ',');
-            }
-            return json(['total' => $list->total(), 'rows' => $list->items()]);
+        $set = [];
+        try {
+            $rows = Db::table('purchase_order_detail')->where('status', 1)->field('scydgy_id')->select();
+        } catch (\Throwable $e) {
+            $rows = [];
         }
         }
-        return $this->view->fetch();
+        if (!is_array($rows)) {
+            return $set;
+        }
+        foreach ($rows as $r) {
+            if (!is_array($r)) {
+                continue;
+            }
+            $sid = (int)($r['scydgy_id'] ?? 0);
+            if ($sid > 0) {
+                $set[$sid] = true;
+            }
+        }
+
+        return $set;
+    }
+
+    /**
+     * @param int[] $scydgyIds
+     * @return array<int, float>
+     */
+    protected function loadPickedAmountSumByScydgyIds(array $scydgyIds): array
+    {
+        $out = [];
+        $scydgyIds = array_values(array_unique(array_filter(array_map('intval', $scydgyIds))));
+        if ($scydgyIds === []) {
+            return $out;
+        }
+        try {
+            $rows = Db::table('purchase_order_detail')
+                ->where('scydgy_id', 'in', $scydgyIds)
+                ->where('status', 1)
+                ->field('scydgy_id,amount')
+                ->select();
+        } catch (\Throwable $e) {
+            $rows = [];
+        }
+        if (!is_array($rows)) {
+            return $out;
+        }
+        foreach ($rows as $r) {
+            if (!is_array($r)) {
+                continue;
+            }
+            $sid = (int)($r['scydgy_id'] ?? 0);
+            $am = trim((string)($r['amount'] ?? ''));
+            if ($sid <= 0 || $am === '' || $am === '0' || $am === '0.00') {
+                continue;
+            }
+            if (!isset($out[$sid])) {
+                $out[$sid] = 0.0;
+            }
+            $out[$sid] += (float)$am;
+        }
+
+        return $out;
+    }
+
+    /**
+     * @param array<string, mixed> $row
+     */
+    protected function resolvePurchaseOrderRowYm(array $row): string
+    {
+        foreach (['pick_time', 'createtime', 'dStamp'] as $key) {
+            $raw = $row[$key] ?? null;
+            if ($raw === null || $raw === '') {
+                continue;
+            }
+            if (is_numeric($raw) && (int)$raw > 946684800) {
+                return date('Y-m', (int)$raw);
+            }
+            $t = trim((string)$raw);
+            if ($t !== '' && preg_match('/^(\d{4}-\d{2})/', $t, $m)) {
+                return $m[1];
+            }
+        }
+
+        return '';
+    }
+
+    /**
+     * @param array<string, mixed> $row
+     */
+    protected function formatPurchaseOrderDoneTime(array $row): string
+    {
+        foreach (['createtime', 'pick_time', 'dStamp'] as $key) {
+            $raw = $row[$key] ?? null;
+            if ($raw === null || $raw === '') {
+                continue;
+            }
+            if (is_numeric($raw) && (int)$raw > 946684800) {
+                return date('Y-m-d H:i:s', (int)$raw);
+            }
+            $t = trim((string)$raw);
+            if ($t !== '' && stripos($t, '0000-00-00') !== 0) {
+                return $t;
+            }
+        }
+
+        return '';
+    }
+
+    /**
+     * @param array<int, array<string, mixed>> $rows
+     * @return array<int, array<string, mixed>>
+     */
+    protected function collapseExportRowsByOrder(array $rows): array
+    {
+        if ($rows === []) {
+            return [];
+        }
+        $groups = [];
+        foreach ($rows as $row) {
+            if (!is_array($row)) {
+                continue;
+            }
+            $dh = trim((string)($row['CCYDH'] ?? ''));
+            $key = $dh !== '' ? $dh : ('_id_' . (int)($row['id'] ?? 0));
+            if (!isset($groups[$key])) {
+                $groups[$key] = [];
+            }
+            $groups[$key][] = $row;
+        }
+        $out = [];
+        foreach ($groups as $groupRows) {
+            if ($groupRows === []) {
+                continue;
+            }
+            usort($groupRows, function ($a, $b) {
+                return ((int)($a['id'] ?? 0)) <=> ((int)($b['id'] ?? 0));
+            });
+            $head = $groupRows[0];
+            $gymcList = [];
+            foreach ($groupRows as $r) {
+                $g = trim((string)($r['CGYMC'] ?? ''));
+                if ($g !== '' && !in_array($g, $gymcList, true)) {
+                    $gymcList[] = $g;
+                }
+            }
+            $merged = $head;
+            $merged['_merge_rows'] = $groupRows;
+            if (count($groupRows) > 1) {
+                $merged['CGYMC'] = implode('、', $gymcList);
+            }
+            $latestText = '';
+            $latestTs = 0;
+            foreach ($groupRows as $r) {
+                $t = trim((string)($r['createtime_text'] ?? ''));
+                $ts = $t !== '' ? (int)strtotime($t) : 0;
+                if ($ts > $latestTs) {
+                    $latestTs = $ts;
+                    $latestText = $t;
+                }
+            }
+            if ($latestText !== '') {
+                $merged['createtime_text'] = $latestText;
+            }
+            $maxId = (int)($head['id'] ?? 0);
+            foreach ($groupRows as $r) {
+                $maxId = max($maxId, (int)($r['id'] ?? 0));
+            }
+            $merged['id'] = $maxId;
+            $out[] = $merged;
+        }
+        usort($out, function ($a, $b) {
+            return ((int)($b['id'] ?? 0)) <=> ((int)($a['id'] ?? 0));
+        });
+
+        return $out;
     }
     }
 }
 }

+ 1 - 1
application/admin/controller/Procuremensms.php

@@ -20,7 +20,7 @@ class Procuremensms extends Backend
      */
      */
     protected $model = null;
     protected $model = null;
 
 
-    protected $searchFields = 'title,content,remark';
+    protected $searchFields = 'title,content,remark,status';
 
 
     public function _initialize()
     public function _initialize()
     {
     {

+ 2 - 0
application/admin/controller/Purchaseemail.php

@@ -18,6 +18,8 @@ class Purchaseemail extends Backend
     /** @var \app\admin\model\Purchaseemail */
     /** @var \app\admin\model\Purchaseemail */
     protected $model = null;
     protected $model = null;
 
 
+    protected $searchFields = 'id,email_addr';
+
     public function _initialize()
     public function _initialize()
     {
     {
         parent::_initialize();
         parent::_initialize();

+ 102 - 530
application/admin/view/procuremen/add.html

@@ -1,531 +1,103 @@
-<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+<style>
+    .procuremen-add-wrap {
+        max-width: 720px;
+        padding: 4px 8px 24px;
+    }
+    .procuremen-add-form .form-tip {
+        margin: 0 0 16px;
+        font-size: 12px;
+        color: #888;
+        line-height: 1.55;
+    }
+    .procuremen-add-form .form-group {
+        margin-bottom: 12px;
+    }
+    .procuremen-add-form .form-control[readonly] {
+        background-color: #f5f5f5;
+        cursor: default;
+    }
+    .procuremen-add-form .layer-footer .btn + .btn {
+        margin-left: 12px;
+    }
+</style>
 
 
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Icydid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-ICYDID" class="form-control" name="row[ICYDID]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Idxid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-IDXID" class="form-control" name="row[IDXID]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cdxmc')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-CDXMC" class="form-control" name="row[CDXMC]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Idxlxid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-IDXLXID" class="form-control" name="row[IDXLXID]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cdxlxmc')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-CDXLXMC" class="form-control" name="row[CDXLXMC]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ixh')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-IXH" class="form-control" name="row[IXH]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Pid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-pid" class="form-control" name="row[pid]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Igyid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-IGYID" class="form-control" name="row[IGYID]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cgybh')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-CGYBH" class="form-control" name="row[CGYBH]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cgymc')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-CGYMC" class="form-control" name="row[CGYMC]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cdw')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-CDW" class="form-control" name="row[CDW]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cgzzxmc')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-cGzzxMc" class="form-control" name="row[cGzzxMc]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cgzzxbh')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-cGzzxBh" class="form-control" name="row[cGzzxBh]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cbmmc')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-CBMMC" class="form-control" name="row[CBMMC]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cbmbh')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-cBmBh" class="form-control" name="row[cBmBh]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Csbmc')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-CSBMC" class="form-control" name="row[CSBMC]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cdedw')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-CDEDW" class="form-control" name="row[CDEDW]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ndesl')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-NDESL" class="form-control" name="row[NDESL]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ngzl')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-NGZL" class="form-control" name="row[NGZL]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dqsrq')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-DQSRQ" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[DQSRQ]" type="text" value="{:date('Y-m-d H:i:s')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Djsrq')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-DJSRQ" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[DJSRQ]" type="text" value="{:date('Y-m-d H:i:s')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ngyzq')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-NGYZQ" class="form-control" name="row[NGYZQ]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Gybz')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-GyBz" class="form-control" name="row[GyBz]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Isccpid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-ISCCPID" class="form-control" name="row[ISCCPID]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cnextgy')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-Cnextgy" class="form-control" name="row[Cnextgy]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cpregy')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-Cpregy" class="form-control" name="row[Cpregy]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Itype')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iType" class="form-control" name="row[iType]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Iendbz')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iEndBz" class="form-control" name="row[iEndBz]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dfinishsl')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-dFinishsl" class="form-control" name="row[dFinishsl]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ngygs')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-ngyGs" class="form-control" step="0.01" name="row[ngyGs]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Bpb')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-bPb" class="form-control" name="row[bPb]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ipbid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iPbId" class="form-control" name="row[iPbId]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cpbbh')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-cPbBh" class="form-control" name="row[cPbBh]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Nifjs')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-nifjs" class="form-control" name="row[nifjs]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Nxhl')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-nxhl" class="form-control" step="0.001" name="row[nxhl]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cxhdw')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-cxhdw" class="form-control" name="row[cxhdw]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Nyjfsl')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-nyjfsl" class="form-control" name="row[nyjfsl]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Nyjssl')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-nyjssl" class="form-control" name="row[nyjssl]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cxhjsfs')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-cxhjsfs" class="form-control" name="row[cxhjsfs]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Biszj')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-biszj" class="form-control" name="row[biszj]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Czjnr')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-czjnr" class="form-control" name="row[czjnr]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dzjrq')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-dzjrq" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[dzjrq]" type="text" value="{:date('Y-m-d H:i:s')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Biszjbj')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-biszjbj" class="form-control" name="row[biszjbj]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Idxxh')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-idxxh" class="form-control" name="row[idxxh]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Igxxh')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-igxxh" class="form-control" name="row[igxxh]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Biszjwcbj')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-biszjwcbj" class="form-control" name="row[biszjwcbj]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Izjdid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-izjdid" class="form-control" name="row[izjdid]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Izjdlx')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-izjdlx" class="form-control" name="row[izjdlx]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dyjqsrq')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-dyjqsrq" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[dyjqsrq]" type="text" value="{:date('Y-m-d H:i:s')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dyjwcrq')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-dyjwcrq" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[dyjwcrq]" type="text" value="{:date('Y-m-d H:i:s')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dbhr')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-dbhr" class="form-control" step="0.0001" name="row[dbhr]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dfactgs')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-dfactgs" class="form-control" step="0.001" name="row[dfactgs]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dfactcb')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-dfactcb" class="form-control" step="0.001" name="row[dfactcb]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dbzcb')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-dbzcb" class="form-control" step="0.001" name="row[dbzcb]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Nyfpgzl')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-nyfpgzl" class="form-control" step="0.001" name="row[nyfpgzl]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Bwjg')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-bwjg" class="form-control" name="row[bwjg]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ijhfpbz')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-ijhfpbz" class="form-control" name="row[ijhfpbz]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Iywcgzl')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iywcgzl" class="form-control" step="0.001" name="row[iywcgzl]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ddexs')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-ddexs" class="form-control" step="0.001" name="row[ddexs]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ipjzs')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-ipjzs" class="form-control" step="0.001" name="row[ipjzs]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Nyfpgzl1')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-nyfpgzl1" class="form-control" step="0.001" name="row[nyfpgzl1]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Mbz')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <textarea id="c-Mbz" class="form-control " rows="5" name="row[Mbz]" cols="50"></textarea>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Iquality')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iQuality" class="form-control" name="row[iQuality]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ncs')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-ncs" class="form-control" name="row[ncs]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Igroupsort')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iGroupSort" class="form-control" name="row[iGroupSort]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ibornid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iBornID" class="form-control" name="row[iBornID]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ipicode')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-ipicode" class="form-control" name="row[ipicode]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Blasproc')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-BLasproc" class="form-control" name="row[BLasproc]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Igaoj')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iGaoJ" class="form-control" name="row[iGaoJ]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cbz')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-cBZ" class="form-control" name="row[cBZ]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Iscxh')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iScxh" class="form-control" name="row[iScxh]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Isbid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iSbid" class="form-control" name="row[iSbid]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Nxhlv')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-nXHLv" class="form-control" step="0.001" name="row[nXHLv]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cdescriptionxml')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <textarea id="c-cDescriptionXML" class="form-control " rows="5" name="row[cDescriptionXML]" cols="50"></textarea>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cdescription')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <textarea id="c-cDescription" class="form-control " rows="5" name="row[cDescription]" cols="50"></textarea>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Ibzhjxmid')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iBzHjxmID" class="form-control" name="row[iBzHjxmID]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Nsl')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-nsl" class="form-control" step="0.001" name="row[nsl]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Imaterialstate')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iMaterialState" class="form-control" name="row[iMaterialState]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Inumberorder')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iNumberOrder" class="form-control" name="row[iNumberOrder]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Inum_fb')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iNum_FB" class="form-control" name="row[iNum_FB]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Istatus')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iStatus" class="form-control" name="row[iStatus]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dstamp')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-dStamp" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[dStamp]" type="text" value="{:date('Y-m-d H:i:s')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Npreparetime')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-nPrepareTime" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[nPrepareTime]" type="text" value="{:date('Y-m-d H:i:s')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Iendtech')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iEndTech" class="form-control" name="row[iEndTech]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Imcpaperstatus')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-iMCPaperStatus" class="form-control" name="row[iMCPaperStatus]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Dmcpaperarrival')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-dMCPaperArrival" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[dMCPaperArrival]" type="text" value="{:date('Y-m-d H:i:s')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Web_order_product_pbom_tech_id')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-web_order_product_pbom_tech_id" data-rule="required" data-source="web/order/product/pbom/tech/index" class="form-control selectpage" name="row[web_order_product_pbom_tech_id]" type="text" value="">
-        </div>
-    </div>
-    <div class="form-group layer-footer">
-        <label class="control-label col-xs-12 col-sm-2"></label>
-        <div class="col-xs-12 col-sm-8">
-            <button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
-        </div>
-    </div>
-</form>
+<div class="procuremen-add-wrap">
+    <form id="add-form" class="form-horizontal procuremen-add-form" role="form" data-toggle="validator" method="POST" action="">
+        <p class="form-tip">
+            手工录入一条外发工序,保存后可在「外发初选列表」中勾选并进行下发。
+        </p>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">订单号:</label>
+            <div class="col-xs-12 col-sm-8">
+                <input class="form-control" type="text" value="{$nextOrderCcydh|default=''|htmlentities}" readonly>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">印件名称:</label>
+            <div class="col-xs-12 col-sm-8">
+                <input class="form-control" name="row[CYJMC]" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">承揽部门:</label>
+            <div class="col-xs-12 col-sm-8">
+                <input class="form-control" name="row[CCLBMMC]" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">工序名称:</label>
+            <div class="col-xs-12 col-sm-8">
+                <input class="form-control" name="row[CGYMC]" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">单位:</label>
+            <div class="col-xs-12 col-sm-8">
+                <input class="form-control" name="row[CDW]" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">本次数量:</label>
+            <div class="col-xs-12 col-sm-8">
+                <input class="form-control" name="row[This_quantity]" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">最高限价:</label>
+            <div class="col-xs-12 col-sm-8">
+                <input class="form-control" name="row[ceilingPrice]" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">订法:</label>
+            <div class="col-xs-12 col-sm-8">
+                <input class="form-control" name="row[CDF]" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">外厂单位:</label>
+            <div class="col-xs-12 col-sm-8">
+                <input class="form-control" name="row[cGzzxMc]" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">业务员:</label>
+            <div class="col-xs-12 col-sm-8">
+                <input class="form-control" name="row[cywyxm]" type="text" value="{$adminNickname|default=''|htmlentities}" readonly>
+            </div>
+        </div>
+        <div class="form-group">
+            <label class="control-label col-xs-12 col-sm-2">备注:</label>
+            <div class="col-xs-12 col-sm-8">
+                <textarea class="form-control" name="row[MBZ]" rows="4" autocomplete="off"></textarea>
+            </div>
+        </div>
+        <div class="form-group layer-footer">
+            <label class="control-label col-xs-12 col-sm-2"></label>
+            <div class="col-xs-12 col-sm-8">
+                <button type="submit" class="btn btn-primary btn-embossed disabled">新增</button>
+                <button type="reset" class="btn btn-default btn-embossed">重置</button>
+            </div>
+        </div>
+    </form>
+</div>

+ 81 - 72
application/admin/view/procuremen/audit_issue.html

@@ -10,6 +10,16 @@
         font-size: 13px;
         font-size: 13px;
         color: #333;
         color: #333;
     }
     }
+    .audit-issue-wrap .audit-notify-tip {
+        margin: 0 0 10px;
+        padding: 8px 12px;
+        font-size: 12px;
+        line-height: 1.65;
+        color: #8a6d3b;
+        background: #fcf8e3;
+        border: 1px solid #faebcc;
+        border-radius: 3px;
+    }
     .audit-issue-wrap .audit-table-wrap {
     .audit-issue-wrap .audit-table-wrap {
         max-height: 240px;
         max-height: 240px;
         overflow: auto;
         overflow: auto;
@@ -21,7 +31,7 @@
         font-size: 12px;
         font-size: 12px;
         table-layout: fixed;
         table-layout: fixed;
         width: 100%;
         width: 100%;
-        min-width: 860px;
+        min-width: 980px;
     }
     }
     .audit-issue-wrap .audit-process-table th {
     .audit-issue-wrap .audit-process-table th {
         background: #f5f5f5;
         background: #f5f5f5;
@@ -47,56 +57,52 @@
         background: #f5f5f5;
         background: #f5f5f5;
         white-space: nowrap;
         white-space: nowrap;
     }
     }
-    .audit-issue-wrap .audit-quote-lines {
-        margin: 0;
-        padding: 0;
-        font-size: 11px;
-        color: #555;
-        line-height: 1.65;
+    .audit-issue-wrap .audit-table td {
+        padding: 6px 8px;
+        vertical-align: middle;
+        word-wrap: break-word;
     }
     }
-    .audit-issue-wrap .audit-quote-line {
+    .audit-issue-wrap .audit-notify-pick-table td label {
         margin: 0;
         margin: 0;
-        padding: 0;
-        list-style: none;
-    }
-    .audit-issue-wrap .audit-quote-line + .audit-quote-line {
-        margin-top: 4px;
-    }
-    .audit-issue-wrap .audit-quote-line .quote-gymc {
-        color: #333;
+        font-weight: normal;
+        cursor: pointer;
     }
     }
-    .audit-issue-wrap .audit-quote-line .quote-ok {
-        color: #3c763d;
+    .audit-issue-wrap .audit-notify-pick-table tbody tr {
+        cursor: pointer;
     }
     }
-    .audit-issue-wrap .audit-quote-line .quote-wait {
-        color: #999;
+    .audit-issue-wrap .audit-deadline-row {
+        display: flex;
+        align-items: center;
+        flex-wrap: wrap;
+        gap: 8px 12px;
+        margin: 0 0 12px;
+        font-size: 13px;
     }
     }
-    .audit-issue-wrap .audit-quote-line .quote-meta {
-        color: #666;
+    .audit-issue-wrap .audit-deadline-row .audit-field-label {
+        font-weight: 600;
+        color: #333;
+        white-space: nowrap;
     }
     }
-    .audit-issue-wrap .audit-quote-line .quote-empty {
-        color: #d9534f;
+    .audit-issue-wrap .audit-deadline-input-wrap {
+        flex: 1 1 220px;
+        max-width: 300px;
     }
     }
-    .audit-issue-wrap .audit-pick-table td label {
-        margin: 0;
-        font-weight: normal;
+    .audit-issue-wrap .audit-deadline-input-wrap .input-group-addon {
         cursor: pointer;
         cursor: pointer;
+        background: #f9f9f9;
     }
     }
-    .audit-issue-wrap tr.audit-row-no-quote td {
-        color: #666;
-    }
-    .audit-issue-wrap tr.audit-row-no-quote label {
+    .audit-issue-wrap .audit-deadline-input-wrap .form-control {
+        height: 32px;
+        font-size: 13px;
         cursor: pointer;
         cursor: pointer;
+        background-color: #fff;
     }
     }
-    .audit-issue-wrap .text-quote-ok {
-        color: #3c763d;
-    }
-    .audit-issue-wrap .text-quote-wait {
-        color: #999;
+    body.is-dialog .bootstrap-datetimepicker-widget.dropdown-menu {
+        z-index: 19999999 !important;
+        box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);
     }
     }
 </style>
 </style>
 <div class="audit-issue-wrap">
 <div class="audit-issue-wrap">
-    <div class="audit-block-title">本单工序({$processCount|default='1'} 项)</div>
     <div class="audit-table-wrap">
     <div class="audit-table-wrap">
         <table class="table table-bordered table-condensed audit-process-table">
         <table class="table table-bordered table-condensed audit-process-table">
             <thead>
             <thead>
@@ -109,6 +115,7 @@
                 <th class="text-center" style="width:72px;">本次数量</th>
                 <th class="text-center" style="width:72px;">本次数量</th>
                 <th class="text-center" style="width:72px;">最高限价</th>
                 <th class="text-center" style="width:72px;">最高限价</th>
                 <th class="text-center" style="width:80px;">订法</th>
                 <th class="text-center" style="width:80px;">订法</th>
+                <th style="min-width:120px;">备注</th>
             </tr>
             </tr>
             </thead>
             </thead>
             <tbody>
             <tbody>
@@ -124,65 +131,67 @@
                 <td class="text-center">{$pr.This_quantity|default=''}</td>
                 <td class="text-center">{$pr.This_quantity|default=''}</td>
                 <td class="text-center">{$pr.ceilingPrice|default=''}</td>
                 <td class="text-center">{$pr.ceilingPrice|default=''}</td>
                 <td class="text-center">{$pr.CDF|default=''}</td>
                 <td class="text-center">{$pr.CDF|default=''}</td>
+                <td>{$pr.MBZ|default=''}</td>
             </tr>
             </tr>
             {/volist}
             {/volist}
             </tbody>
             </tbody>
         </table>
         </table>
     </div>
     </div>
-    <div class="audit-block-title">供应商报价(请勾选一家)</div>
+    <form id="audit-issue-form" class="form-horizontal" role="form" style="margin-bottom:0;">
+        {:token()}
+        <input type="hidden" name="scydgy_id" value="{$scydgyId|htmlentities}"/>
+        <input type="hidden" id="audit-notify-groups-json" value="{$notifyGroupsJson|htmlentities}"/>
+        <div class="audit-deadline-row">
+            <span class="audit-field-label">截止时间:<span class="text-danger">*</span></span>
+            <div class="audit-deadline-input-wrap input-group">
+                <input type="text" id="audit-sys-rq" name="sys_rq" class="form-control"
+                       value="{$sysRq|default=''|htmlentities}"
+                       data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true"
+                       placeholder="请选择年月日时分" autocomplete="off" required="required"/>
+                <span class="input-group-addon procuremen-sys-rq-addon" title="选择截止时间"><i class="fa fa-calendar"></i></span>
+            </div>
+        </div>
+    </form>
+    <p class="audit-notify-tip">
+        请勾选需要通知的供应商,点击「确认通知」后仅向已勾选项发送短信与邮件。本步骤发送后无法撤回,请仔细核对后再提交。
+    </p>
     <div class="audit-table-wrap">
     <div class="audit-table-wrap">
-        <table class="table table-bordered table-condensed audit-table audit-pick-table">
+        <table class="table table-bordered table-condensed audit-table audit-notify-pick-table">
             <thead>
             <thead>
             <tr>
             <tr>
-                <th style="width:42px;"></th>
+                <th class="text-center" style="width:42px;">
+                    <input type="checkbox" id="audit-notify-check-all" title="全选/取消"/>
+                </th>
                 <th>公司名称</th>
                 <th>公司名称</th>
-                <th>联系人</th>
-                <th>邮箱</th>
-                <th>手机号</th>
-                <th>报价明细</th>
+                <th style="width:88px;">联系人</th>
+                <th style="min-width:160px;">邮箱</th>
+                <th style="width:120px;">手机号</th>
+                <th style="min-width:200px;">通知工序</th>
             </tr>
             </tr>
             </thead>
             </thead>
-            <tbody id="audit-pick-tbody">
-            {volist name="supplierGroups" id="co" key="k"}
-            <tr class="{if !$co.has_quote}audit-row-no-quote{/if}" data-has-quote="{if $co.has_quote}1{else /}0{/if}">
+            <tbody id="audit-notify-tbody">
+            {volist name="notifyGroups" id="co" key="k"}
+            <tr>
                 <td class="text-center">
                 <td class="text-center">
                     <label>
                     <label>
-                        <input type="radio" name="audit_pick_company" class="audit-pick-radio" value="{$k-1}"/>
+                        <input type="checkbox" class="audit-notify-pick" name="audit_notify_pick[]" value="{$k-1}"/>
                     </label>
                     </label>
                 </td>
                 </td>
-                <td>{$co.name|default=''}</td>
-                <td>{$co.username|default=''}</td>
-                <td>{$co.email|default=''}</td>
-                <td>{$co.phone|default=''}</td>
-                <td>
-                    {if isset($co.lines) && $co.lines}
-                    <div class="audit-quote-lines">
-                        {volist name="co.lines" id="ln"}
-                        <div class="audit-quote-line">
-                            <span class="quote-meta">工序名称:</span><span class="quote-gymc">{$ln.cgymc|default='工序'}</span>
-                            <span class="quote-meta"> · 金额 </span>{if condition="$ln.amount_filled"}<span>{$ln.amount_show}</span>{else /}<span class="quote-empty">未填</span>{/if}<span class="quote-meta">,货期 </span>{if condition="$ln.delivery_filled"}<span>{$ln.delivery_show}</span>{else /}<span class="quote-empty">未填</span>{/if}
-                        </div>
-                        {/volist}
-                    </div>
-                    {else /}
-                    <span class="text-quote-wait">待报价</span>
-                    {/if}
-                </td>
+                <td>{$co.name|default=''|htmlentities}</td>
+                <td>{$co.username|default=''|htmlentities}</td>
+                <td>{$co.email|default=''|htmlentities}</td>
+                <td>{$co.phone|default=''|htmlentities}</td>
+                <td>{$co.process_text|default=''|htmlentities}</td>
             </tr>
             </tr>
             {/volist}
             {/volist}
             </tbody>
             </tbody>
         </table>
         </table>
     </div>
     </div>
-    <form id="audit-issue-form" class="form-horizontal" role="form">
-        {:token()}
-        <input type="hidden" name="scydgy_id" value="{$scydgyId|htmlentities}"/>
-        <input type="hidden" id="audit-supplier-groups-json" value="{$supplierGroupsJson|htmlentities}"/>
-    </form>
     <div class="form-group layer-footer">
     <div class="form-group layer-footer">
         <div class="row procuremen-audit-issue-footer-row">
         <div class="row procuremen-audit-issue-footer-row">
             <div class="col-xs-12 procuremen-audit-issue-footer-btns">
             <div class="col-xs-12 procuremen-audit-issue-footer-btns">
                 <button type="button" style="margin-right: 20px" class="btn btn-primary btn-embossed" id="btn-audit-issue-submit">
                 <button type="button" style="margin-right: 20px" class="btn btn-primary btn-embossed" id="btn-audit-issue-submit">
-                    <i class="fa fa-check"></i> 确认
+                    <i class="fa fa-paper-plane"></i> 确认通知
                 </button>
                 </button>
                 <button type="button" style="margin-right: 20px" class="btn btn-default btn-embossed" id="btn-audit-issue-close">
                 <button type="button" style="margin-right: 20px" class="btn btn-default btn-embossed" id="btn-audit-issue-close">
                     <i class="fa fa-times"></i> 关闭
                     <i class="fa fa-times"></i> 关闭

+ 62 - 14
application/admin/view/procuremen/details_fragment.html

@@ -129,6 +129,36 @@
         font-weight: 700;
         font-weight: 700;
         word-break: break-word;
         word-break: break-word;
     }
     }
+    .procuremen-details-wrap .details-process-table-wrap {
+        overflow-x: auto;
+        -webkit-overflow-scrolling: touch;
+    }
+    .procuremen-details-wrap .details-process-table {
+        margin: 0;
+        font-size: 12px;
+        table-layout: fixed;
+        width: 100%;
+        min-width: 820px;
+        border-collapse: collapse;
+    }
+    .procuremen-details-wrap .details-process-table th {
+        background: #f5f5f5;
+        white-space: nowrap;
+        font-weight: 600;
+        padding: 8px 10px;
+        vertical-align: middle;
+        border: 1px solid #ddd;
+    }
+    .procuremen-details-wrap .details-process-table td {
+        padding: 8px 10px;
+        vertical-align: middle;
+        word-wrap: break-word;
+        border: 1px solid #ddd;
+    }
+    .procuremen-details-wrap .details-process-table th.text-center,
+    .procuremen-details-wrap .details-process-table td.text-center {
+        text-align: center;
+    }
     .procuremen-details-wrap .procuremen-oper-log {
     .procuremen-details-wrap .procuremen-oper-log {
         list-style: none;
         list-style: none;
         margin: 0 0 8px;
         margin: 0 0 8px;
@@ -198,7 +228,7 @@
     <table class="proc-steps-table-pdf" width="100%" cellpadding="0" cellspacing="0" style="border-collapse:collapse;table-layout:fixed;width:100%;margin:0 0 18px;">
     <table class="proc-steps-table-pdf" width="100%" cellpadding="0" cellspacing="0" style="border-collapse:collapse;table-layout:fixed;width:100%;margin:0 0 18px;">
         <tr>
         <tr>
             {volist name="steps" id="st"}
             {volist name="steps" id="st"}
-            <td style="vertical-align:top;text-align:center;padding:4px 1px 0;border:0 !important;width:20%;">
+            <td style="vertical-align:top;text-align:center;padding:4px 1px 0;border:0 !important;width:16.666%;">
                 <table width="100%" cellpadding="0" cellspacing="0" style="border-collapse:collapse;height:152px;margin:0 auto;">
                 <table width="100%" cellpadding="0" cellspacing="0" style="border-collapse:collapse;height:152px;margin:0 auto;">
                     <tr>
                     <tr>
                         <td style="vertical-align:top;padding:0;border:0 !important;">
                         <td style="vertical-align:top;padding:0;border:0 !important;">
@@ -277,25 +307,43 @@
     {/notempty}
     {/notempty}
 
 
     <div class="procuremen-order-info-block">
     <div class="procuremen-order-info-block">
-    <div class="procuremen-order-info-head">订单信息</div>
-    <table class="procuremen-order-grid table">
-        <tbody>
-            {notempty name="orderSummaryGrid"}
-            {volist name="orderSummaryGrid" id="gr"}
+    <div class="procuremen-order-info-head">本单工序({$processCount|default='1'} 项)</div>
+    <div class="details-process-table-wrap">
+        <table class="table table-bordered table-condensed details-process-table">
+            <thead>
             <tr>
             <tr>
-                <td class="og-label">{$gr.l1|htmlentities}</td>
-                <td class="og-value">{$gr.v1|htmlentities}</td>
-                <td class="og-label">{if $gr.l2 != ''}{$gr.l2|htmlentities}{/if}</td>
-                <td class="og-value">{if $gr.l2 != ''}{$gr.v2|htmlentities}{/if}</td>
+                <th class="text-center" style="width:100px;">订单号</th>
+                <th style="min-width:160px;">印件名称</th>
+                <th>工序名称</th>
+                <th class="text-center" style="width:88px;">本次数量</th>
+                <th class="text-center" style="width:72px;">最高限价</th>
+                <th class="text-center" style="width:80px;">订法</th>
+                <th style="min-width:120px;">备注</th>
+            </tr>
+            </thead>
+            <tbody>
+            {notempty name="processDisplayRows"}
+            {volist name="processDisplayRows" id="pr"}
+            <tr>
+                {if $pr.show_order_cells}
+                <td class="text-center"{if condition="$pr.order_rowspan gt 1"} rowspan="{$pr.order_rowspan}"{/if}>{$pr.CCYDH|default=''|htmlentities}</td>
+                <td{if condition="$pr.order_rowspan gt 1"} rowspan="{$pr.order_rowspan}"{/if}>{$pr.CYJMC|default=''|htmlentities}</td>
+                {/if}
+                <td>{$pr.CGYMC|default=''|htmlentities}</td>
+                <td class="text-center">{$pr.This_quantity|default=''|htmlentities}</td>
+                <td class="text-center">{$pr.ceilingPrice|default=''|htmlentities}</td>
+                <td class="text-center">{$pr.CDF|default=''|htmlentities}</td>
+                <td>{$pr.MBZ|default=''|htmlentities}</td>
             </tr>
             </tr>
             {/volist}
             {/volist}
             {else /}
             {else /}
             <tr>
             <tr>
-                <td colspan="4" class="text-muted" style="text-align:center;padding:14px;">暂无数据</td>
+                <td colspan="7" class="text-center text-muted" style="padding:14px;">暂无工序数据</td>
             </tr>
             </tr>
             {/notempty}
             {/notempty}
-        </tbody>
-    </table>
+            </tbody>
+        </table>
+    </div>
     </div>
     </div>
 
 
     <div class="section-title">供应商</div>
     <div class="section-title">供应商</div>
@@ -304,7 +352,7 @@
             <thead>
             <thead>
             <tr>
             <tr>
                 <th>公司名称</th>
                 <th>公司名称</th>
-                <th>加工金额</th>
+                <th>单价</th>
                 <th>交货日期</th>
                 <th>交货日期</th>
                 <th>采购确认</th>
                 <th>采购确认</th>
                 <th>操作时间</th>
                 <th>操作时间</th>

+ 16 - 0
application/admin/view/procuremen/details_pdf_shell.html

@@ -37,6 +37,22 @@
         }
         }
         body.procuremen-pdf-export .text-muted { color: #888; }
         body.procuremen-pdf-export .text-muted { color: #888; }
         body.procuremen-pdf-export .text-center { text-align: center; }
         body.procuremen-pdf-export .text-center { text-align: center; }
+        body.procuremen-pdf-export .details-process-table {
+            border-collapse: collapse;
+            width: 100%;
+            font-size: 10pt;
+            table-layout: fixed;
+        }
+        body.procuremen-pdf-export .details-process-table th,
+        body.procuremen-pdf-export .details-process-table td {
+            border: 1px solid #ddd;
+            padding: 6px 8px;
+            vertical-align: middle;
+        }
+        body.procuremen-pdf-export .details-process-table th {
+            background: #f5f5f5;
+            font-weight: 600;
+        }
         body.procuremen-pdf-export .proc-steps-table-pdf {
         body.procuremen-pdf-export .proc-steps-table-pdf {
             border-collapse: collapse;
             border-collapse: collapse;
             table-layout: fixed;
             table-layout: fixed;

+ 36 - 4
application/admin/view/procuremen/index.html

@@ -33,6 +33,9 @@
         align-items: stretch;
         align-items: stretch;
     }
     }
     @media (min-width: 768px) {
     @media (min-width: 768px) {
+        #procuremen-layout .procuremen-layout.row {
+            min-height: calc(100vh - 132px);
+        }
         #procuremen-layout .procuremen-layout > .procuremen-sidebar,
         #procuremen-layout .procuremen-layout > .procuremen-sidebar,
         #procuremen-layout .procuremen-layout > .procuremen-main {
         #procuremen-layout .procuremen-layout > .procuremen-main {
             float: none !important;
             float: none !important;
@@ -43,9 +46,12 @@
     #procuremen-layout .procuremen-main {
     #procuremen-layout .procuremen-main {
         overflow-x: visible !important;
         overflow-x: visible !important;
         padding-right: 18px !important;
         padding-right: 18px !important;
+        flex: 1 1 0%;
+        min-width: 0;
     }
     }
     .procuremen-sidebar {
     .procuremen-sidebar {
-        flex: 1 1 auto;
+        flex: 0 0 auto;
+        align-self: stretch;
         min-height: 0;
         min-height: 0;
         overflow-y: auto;
         overflow-y: auto;
         border-right: 1px solid #e7e7e7;
         border-right: 1px solid #e7e7e7;
@@ -81,7 +87,7 @@
     #procuremen-layout .procuremen-main .widget-body {
     #procuremen-layout .procuremen-main .widget-body {
         overflow-x: visible;
         overflow-x: visible;
         overflow-y: hidden;
         overflow-y: hidden;
-        flex: 1 1 0%;
+        flex: 1 1 auto;
         min-height: 0;
         min-height: 0;
         display: flex;
         display: flex;
         flex-direction: column;
         flex-direction: column;
@@ -178,6 +184,13 @@
     #procuremen-layout .procuremen-main .procuremen-table-area {
     #procuremen-layout .procuremen-main .procuremen-table-area {
         flex: 1 1 auto;
         flex: 1 1 auto;
         min-height: 0;
         min-height: 0;
+        overflow: hidden;
+        display: flex;
+        flex-direction: column;
+    }
+    #procuremen-layout .procuremen-table-area > .bootstrap-table {
+        flex: 1 1 auto;
+        min-height: 0;
     }
     }
     .procuremen-table-area .toolbar.procuremen-toolbar-empty {
     .procuremen-table-area .toolbar.procuremen-toolbar-empty {
         display: none !important;
         display: none !important;
@@ -232,7 +245,7 @@
     }
     }
     /* 避免出现纵向滚动条时表头与表体列宽错位 */
     /* 避免出现纵向滚动条时表头与表体列宽错位 */
     #procuremen-layout .bootstrap-table .fixed-table-body {
     #procuremen-layout .bootstrap-table .fixed-table-body {
-        overflow-y: scroll;
+        overflow-y: auto;
     }
     }
     #procuremen-layout .nice-validator .bootstrap-table td.bs-checkbox input[type="checkbox"],
     #procuremen-layout .nice-validator .bootstrap-table td.bs-checkbox input[type="checkbox"],
     #procuremen-layout .nice-validator .bootstrap-table th.bs-checkbox input[type="checkbox"] {
     #procuremen-layout .nice-validator .bootstrap-table th.bs-checkbox input[type="checkbox"] {
@@ -284,6 +297,25 @@
         border-color: #d58512 !important;
         border-color: #d58512 !important;
         color: #fff !important;
         color: #fff !important;
     }
     }
+    #procuremen-layout .procuremen-po-field.procuremen-po-dirty {
+        border-color: #f0ad4e;
+        box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 4px rgba(240, 173, 78, 0.45);
+    }
+    .procuremen-po-popover {
+        position: fixed;
+        z-index: 100050;
+        padding: 6px 8px;
+        background: #fff;
+        border: 1px solid #d2d6de;
+        border-radius: 4px;
+        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+    }
+    .procuremen-po-popover-inner {
+        white-space: nowrap;
+    }
+    .procuremen-po-popover-inner .btn + .btn {
+        margin-left: 6px;
+    }
 </style>
 </style>
 
 
 <div class="panel panel-default panel-intro" id="procuremen-layout"
 <div class="panel panel-default panel-intro" id="procuremen-layout"
@@ -312,9 +344,9 @@
                             <div class="procuremen-table-area">
                             <div class="procuremen-table-area">
                                 <div id="toolbar" class="toolbar">
                                 <div id="toolbar" class="toolbar">
                                     <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" >刷新 <i class="fa fa-refresh"></i> </a>
                                     <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" >刷新 <i class="fa fa-refresh"></i> </a>
-                                    <a href="javascript:;" class="btn btn-success" id="btn-procuremen-pick-add" title="手工新增一条外发工序" style="display:none;"><i class="fa fa-plus"></i> 新增</a>
                                     <a href="javascript:;" class="btn btn-info" id="btn-procuremen-pick-review" title="勾选一条或多条工序进行下发(多条须同一订单号)" style="display:none;"><i class="fa fa-paper-plane"></i> 下发</a>
                                     <a href="javascript:;" class="btn btn-info" id="btn-procuremen-pick-review" title="勾选一条或多条工序进行下发(多条须同一订单号)" style="display:none;"><i class="fa fa-paper-plane"></i> 下发</a>
                                     <a href="javascript:;" class="btn btn-warning" id="btn-procuremen-batch-finish" title="勾选一条或多条工序标记为已完结" style="display:none;"><i class="fa fa-flag-checkered"></i> 完结</a>
                                     <a href="javascript:;" class="btn btn-warning" id="btn-procuremen-batch-finish" title="勾选一条或多条工序标记为已完结" style="display:none;"><i class="fa fa-flag-checkered"></i> 完结</a>
+                                    <a href="javascript:;" class="btn btn-danger" id="btn-procuremen-pick-delete" title="勾选一条或多条工序从初选列表移除" style="display:none;"><i class="fa fa-trash"></i> 删除</a>
                                 </div>
                                 </div>
                                 <table id="table"
                                 <table id="table"
                                        class="table table-striped table-bordered table-hover">
                                        class="table table-striped table-bordered table-hover">

+ 168 - 67
application/admin/view/procuremen/outward_detail.html

@@ -12,11 +12,19 @@
     .outward-detail-head strong {
     .outward-detail-head strong {
         color: #333;
         color: #333;
     }
     }
-    .outward-detail-table-wrap {
+    .outward-detail-table-wrap,
+    .outward-confirm-process-wrap,
+    .outward-confirm-company-wrap {
         overflow-x: auto;
         overflow-x: auto;
         overflow-y: auto;
         overflow-y: auto;
-        max-height: calc(72vh - 120px);
+        max-height: min(280px, 42vh);
         -webkit-overflow-scrolling: touch;
         -webkit-overflow-scrolling: touch;
+        margin-bottom: 12px;
+        border: 1px solid #e5e5e5;
+    }
+    .outward-detail-table-wrap {
+        max-height: min(520px, 68vh);
+        border: 0;
     }
     }
     .outward-detail-table {
     .outward-detail-table {
         table-layout: fixed;
         table-layout: fixed;
@@ -24,8 +32,20 @@
         min-width: 1180px;
         min-width: 1180px;
         margin-bottom: 0;
         margin-bottom: 0;
     }
     }
+    .outward-confirm-process-table,
+    .outward-confirm-company-table {
+        margin: 0;
+        font-size: 12px;
+        table-layout: fixed;
+        width: 100%;
+        min-width: 860px;
+    }
     .outward-detail-table > thead > tr > th,
     .outward-detail-table > thead > tr > th,
-    .outward-detail-table > tbody > tr > td {
+    .outward-detail-table > tbody > tr > td,
+    .outward-confirm-process-table th,
+    .outward-confirm-process-table td,
+    .outward-confirm-company-table th,
+    .outward-confirm-company-table td {
         vertical-align: middle;
         vertical-align: middle;
         word-wrap: break-word;
         word-wrap: break-word;
         word-break: break-word;
         word-break: break-word;
@@ -33,6 +53,12 @@
         line-height: 1.45;
         line-height: 1.45;
         padding: 8px 10px;
         padding: 8px 10px;
     }
     }
+    .outward-confirm-process-table th,
+    .outward-confirm-company-table th {
+        background: #f5f5f5;
+        font-weight: 600;
+        white-space: nowrap;
+    }
     .outward-detail-table > thead > tr > th {
     .outward-detail-table > thead > tr > th {
         font-weight: 600;
         font-weight: 600;
         white-space: nowrap;
         white-space: nowrap;
@@ -46,30 +72,47 @@
         white-space: nowrap;
         white-space: nowrap;
     }
     }
     .outward-detail-table .col-sn,
     .outward-detail-table .col-sn,
-    .outward-detail-table .col-time,
-    .outward-detail-table .col-chk {
+    .outward-detail-table .col-time {
         white-space: nowrap;
         white-space: nowrap;
     }
     }
-    .outward-detail-foot {
-        margin-top: 12px;
-        padding-top: 10px;
-        border-top: 1px solid #eee;
-        display: flex;
-        justify-content: flex-end;
-        align-items: center;
-        gap: 8px;
-        flex-wrap: wrap;
-    }
-    .procuremen-purchase-confirm-tip {
-        margin: 0 0 10px 0;
-        border: 1px solid #eea236;
-        background: #fcf8e3;
-        color: #8a6d3b;
+    .outward-confirm-block-title {
+        margin: 0 0 6px;
+        font-weight: 600;
         font-size: 13px;
         font-size: 13px;
-        line-height: 1.65;
+        color: #333;
+    }
+    .outward-confirm-company-table td label {
+        margin: 0;
+        font-weight: normal;
+        cursor: pointer;
     }
     }
-    .procuremen-purchase-confirm-tip .fa {
-        margin-right: 6px;
+    .outward-confirm-company-table tbody tr {
+        cursor: pointer;
+    }
+    .outward-confirm-quote-cell {
+        font-size: 12px;
+        line-height: 1.55;
+    }
+    .outward-confirm-quote-item {
+        padding: 4px 0;
+    }
+    .outward-confirm-quote-item + .outward-confirm-quote-item {
+        margin-top: 6px;
+        padding-top: 6px;
+        border-top: 1px dashed #e8e8e8;
+    }
+    .outward-confirm-quote-item div {
+        margin: 0;
+    }
+    .outward-detail-wrap .audit-notify-tip {
+        margin: 0 0 10px;
+        padding: 8px 12px;
+        font-size: 12px;
+        line-height: 1.65;
+        color: #8a6d3b;
+        background: #fcf8e3;
+        border: 1px solid #faebcc;
+        border-radius: 3px;
     }
     }
     .btn.procuremen-btn-slate {
     .btn.procuremen-btn-slate {
         color: #fff !important;
         color: #fff !important;
@@ -85,19 +128,115 @@
     }
     }
 </style>
 </style>
 
 
-<div class="panel panel-default panel-intro outward-detail-wrap" style="border:0;box-shadow:none;" data-scydgy-id="{$scydgyId|htmlentities}" data-purchase-order-id="{$purchaseOrderId|default=0}">
+<div class="panel panel-default panel-intro outward-detail-wrap" style="border:0;box-shadow:none;"
+     data-scydgy-id="{$scydgyId|htmlentities}"
+     data-purchase-order-id="{$purchaseOrderId|default=0}"
+     data-confirm-process-count="{$confirmProcessCount|default=1}"
+     data-required-sids="{$requiredSidListJson|htmlentities}"
+     data-all-details-by-sid="{$allDetailsBySidJson|htmlentities}">
     <div style="display:none;">{:token()}</div>
     <div style="display:none;">{:token()}</div>
+
     {if $showPurchaseConfirm}
     {if $showPurchaseConfirm}
-    <div class="alert alert-warning procuremen-purchase-confirm-tip">
-        <i class="fa fa-exclamation-triangle"></i>
-        <strong>重要提示:</strong>选择确认并提交后,系统将<strong>立即向各供应商下发短信</strong>;该操作<strong>不可撤回或更改</strong>,请仔细核对勾选结果后再点击「确认」。
+
+    {if $processDisplayRows}
+    <div class="outward-confirm-process-wrap">
+        <table class="table table-bordered table-condensed outward-confirm-process-table">
+            <thead>
+            <tr>
+                <th class="text-center" style="width:100px;">订单号</th>
+                <th style="min-width:160px;">印件名称</th>
+                <th>工序名称</th>
+                <th class="text-center" style="width:56px;">单位</th>
+                <th class="text-center" style="width:72px;">工作量</th>
+                <th class="text-center" style="width:72px;">本次数量</th>
+                <th class="text-center" style="width:72px;">最高限价</th>
+                <th class="text-center" style="width:80px;">订法</th>
+                <th style="min-width:120px;">备注</th>
+            </tr>
+            </thead>
+            <tbody>
+            {volist name="processDisplayRows" id="pr"}
+            <tr>
+                {if $pr.show_order_cells}
+                <td class="text-center"{if condition="$pr.order_rowspan gt 1"} rowspan="{$pr.order_rowspan}"{/if}>{$pr.CCYDH|default=''}</td>
+                <td{if condition="$pr.order_rowspan gt 1"} rowspan="{$pr.order_rowspan}"{/if}>{$pr.CYJMC|default=''}</td>
+                {/if}
+                <td>{$pr.CGYMC|default=''}</td>
+                <td class="text-center">{$pr.CDW|default=''}</td>
+                <td class="text-center">{$pr.NGZL|default=''}</td>
+                <td class="text-center">{$pr.This_quantity|default=''}</td>
+                <td class="text-center">{$pr.ceilingPrice|default=''}</td>
+                <td class="text-center">{$pr.CDF|default=''}</td>
+                <td>{$pr.MBZ|default=''}</td>
+            </tr>
+            {/volist}
+            </tbody>
+        </table>
     </div>
     </div>
     {/if}
     {/if}
+
+    <p class="audit-notify-tip">
+        提示:本步骤发送后无法撤回,请仔细核对后再提交。
+    </p>
+    <p class="outward-confirm-block-title">供应商({$confirmPickCount|default=0} 家)</p>
+    <div class="outward-confirm-company-wrap">
+        <table class="table table-bordered table-condensed outward-confirm-company-table">
+            <thead>
+            <tr>
+                <th class="text-center" style="width:42px;">选择</th>
+                <th>公司名称</th>
+                <th style="width:88px;">联系人</th>
+                <th style="min-width:160px;">邮箱</th>
+                <th style="width:120px;">手机号</th>
+                <th style="min-width:220px;">报价工序</th>
+            </tr>
+            </thead>
+            <tbody>
+            {volist name="confirmPickGroups" id="co" key="k"}
+            <tr>
+                <td class="text-center">
+                    <label>
+                        <input type="checkbox" class="pod-company-pick-cb" name="pod_company_pick[]" value="{$k-1}"
+                               data-detail-picks="{$co.detail_picks_json|htmlentities}"/>
+                    </label>
+                </td>
+                <td>{$co.name|default=''|htmlentities}</td>
+                <td>{$co.username|default=''|htmlentities}</td>
+                <td>{$co.email|default=''|htmlentities}</td>
+                <td>{$co.phone|default=''|htmlentities}</td>
+                <td class="outward-confirm-quote-cell">
+                    {volist name="co.pick_lines" id="ql"}
+                    <div class="outward-confirm-quote-item">
+                        <div>工序:{$ql.cgymc|default=''|htmlentities}</div>
+                        <div>单价:{$ql.amount_text|default='未填写'|htmlentities}</div>
+                        <div>交货日期:{$ql.delivery_text|default='未填写'|htmlentities}</div>
+                    </div>
+                    {/volist}
+                </td>
+            </tr>
+            {/volist}
+            {empty name="confirmPickGroups"}
+            <tr>
+                <td colspan="6" class="text-center text-muted">暂无供应商报价</td>
+            </tr>
+            {/empty}
+            </tbody>
+        </table>
+    </div>
+
+    <div class="form-group layer-footer">
+        <div class="row procuremen-outward-confirm-footer-row">
+            <div class="col-xs-12 procuremen-outward-confirm-footer-btns">
+                <button type="button" style="margin-right: 20px" class="btn procuremen-btn-slate btn-embossed" id="btn-pod-purchase-confirm"><i class="fa fa-check"></i> 确认</button>
+                <button type="button" style="margin-right: 20px" class="btn btn-default btn-embossed" id="btn-pod-purchase-close"><i class="fa fa-times"></i> 关闭</button>
+            </div>
+        </div>
+    </div>
+
+    {else /}
     <div class="table-responsive outward-detail-table-wrap">
     <div class="table-responsive outward-detail-table-wrap">
         <table class="table table-striped table-bordered table-hover outward-detail-table">
         <table class="table table-striped table-bordered table-hover outward-detail-table">
-            {if $showPurchaseConfirm}
             <colgroup>
             <colgroup>
-                <col style="width:56px" />
                 <col style="width:48px" />
                 <col style="width:48px" />
                 <col style="width:118px" />
                 <col style="width:118px" />
                 <col style="width:200px" />
                 <col style="width:200px" />
@@ -108,23 +247,8 @@
                 <col style="width:108px" />
                 <col style="width:108px" />
                 <col style="width:148px" />
                 <col style="width:148px" />
             </colgroup>
             </colgroup>
-            {else /}
-            <colgroup>
-                <col style="width:48px" />
-                <col style="width:118px" />
-                <col style="width:200px" />
-                <col style="width:92px" />
-                <col style="width:128px" />
-                <col style="width:200px" />
-                <col style="width:240px" />
-                <col style="width:108px" />
-                <col style="width:148px" />
-            </colgroup>
-            {/if}
             <thead>
             <thead>
-            {if $showPurchaseConfirm}
             <tr>
             <tr>
-                <th class="col-chk text-center">选择</th>
                 <th class="col-sn">序号</th>
                 <th class="col-sn">序号</th>
                 <th>订单号</th>
                 <th>订单号</th>
                 <th class="col-title">印件名称</th>
                 <th class="col-title">印件名称</th>
@@ -135,28 +259,10 @@
                 <th>手机号</th>
                 <th>手机号</th>
                 <th class="col-time">审核时间</th>
                 <th class="col-time">审核时间</th>
             </tr>
             </tr>
-            {else /}
-            <tr>
-                <th class="col-sn">序号</th>
-                <th>订单号</th>
-                <th class="col-title">印件名称</th>
-                <th class="col-amount">加工金额</th>
-                <th class="col-delivery">交货日期</th>
-                <th>公司名称</th>
-                <th>邮箱</th>
-                <th>手机号</th>
-                <th class="col-time">审核时间</th>
-            </tr>
-            {/if}
             </thead>
             </thead>
             <tbody>
             <tbody>
             {volist name="rows" id="r"}
             {volist name="rows" id="r"}
             <tr>
             <tr>
-                {if $showPurchaseConfirm}
-                <td class="text-center col-chk">
-                    <input type="checkbox" class="pod-pick-cb" name="pod_pick[]" value="{$r.id|default=''}" title="单选" />
-                </td>
-                {/if}
                 <td class="text-center col-sn">{$i}</td>
                 <td class="text-center col-sn">{$i}</td>
                 <td>{$r.CCYDH|default=''}</td>
                 <td>{$r.CCYDH|default=''}</td>
                 <td class="col-title">{$r.CYJMC|default=''}</td>
                 <td class="col-title">{$r.CYJMC|default=''}</td>
@@ -176,10 +282,5 @@
             </tbody>
             </tbody>
         </table>
         </table>
     </div>
     </div>
-    {if $showPurchaseConfirm}
-    <div class="outward-detail-foot">
-        <button type="button" class="btn procuremen-btn-slate" id="btn-pod-purchase-confirm"><i class="fa fa-check"></i> 确认</button>
-        <button type="button" class="btn btn-default" id="btn-pod-purchase-close"><i class="fa fa-times"></i> 关闭</button>
-    </div>
     {/if}
     {/if}
 </div>
 </div>

+ 3 - 3
application/admin/view/procuremen/review.html

@@ -503,10 +503,10 @@
                             <th style="min-width:160px;">印件名称</th>
                             <th style="min-width:160px;">印件名称</th>
                             <th>工序名称</th>
                             <th>工序名称</th>
                             <th class="text-center" style="width:56px;">单位</th>
                             <th class="text-center" style="width:56px;">单位</th>
-                            <th class="text-center" style="width:72px;">工作量</th>
                             <th class="text-center" style="width:72px;">本次数量</th>
                             <th class="text-center" style="width:72px;">本次数量</th>
                             <th class="text-center" style="width:72px;">最高限价</th>
                             <th class="text-center" style="width:72px;">最高限价</th>
                             <th class="text-center" style="width:80px;">订法</th>
                             <th class="text-center" style="width:80px;">订法</th>
+                            <th style="min-width:120px;">备注</th>
                         </tr>
                         </tr>
                         </thead>
                         </thead>
                         <tbody id="review-merge-tbody"></tbody>
                         <tbody id="review-merge-tbody"></tbody>
@@ -529,7 +529,7 @@
                 </div>
                 </div>
                 <p class="review-selected-tip procuremen-review-submit-tip" role="note">
                 <p class="review-selected-tip procuremen-review-submit-tip" role="note">
                     <i class="fa fa-exclamation-triangle"></i>
                     <i class="fa fa-exclamation-triangle"></i>
-                    <strong>重要提示:</strong>提交将向<strong>已勾选</strong>供应商发送<strong>邮件</strong>与<strong>手机短信</strong>;该操作<strong>不可撤回</strong>,请核对后再确认
+                    <strong>重要提示:</strong>本步骤仅保存下发并勾选供应商,<strong>不发送短信或邮件</strong>
                 </p>
                 </p>
             </div>
             </div>
             <p class="review-selected-empty" id="review-selected-empty">暂未选择供应商</p>
             <p class="review-selected-empty" id="review-selected-empty">暂未选择供应商</p>
@@ -579,7 +579,7 @@
     <div class="layer-footer clearfix">
     <div class="layer-footer clearfix">
         <div class="pull-right">
         <div class="pull-right">
             <button type="button" style="margin-right: 20px" id="btn-review-submit" class="btn procuremen-btn-slate btn-embossed">确认</button>
             <button type="button" style="margin-right: 20px" id="btn-review-submit" class="btn procuremen-btn-slate btn-embossed">确认</button>
-            <button type="reset"  style="margin-right: 20px" class="btn btn-default btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
+            <button type="button" style="margin-right: 20px" class="btn btn-default btn-embossed btn-close">{:__('Close')}</button>
         </div>
         </div>
     </div>
     </div>
 </form>
 </form>

+ 12 - 0
application/admin/view/procuremen/rfqlist.html

@@ -0,0 +1,12 @@
+<div class="panel panel-default panel-intro procuremen-rfqlist-wrap" data-super-admin="{if condition='$isSuperAdmin'}1{else /}0{/if}">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div class="widget-body no-padding">
+            <div id="toolbar" class="toolbar">
+                {:build_toolbar('refresh')}
+            </div>
+            <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%"></table>
+        </div>
+    </div>
+</div>

+ 6 - 2
application/admin/view/procuremenexport/index.html

@@ -5,10 +5,14 @@
         <div class="widget-body no-padding">
         <div class="widget-body no-padding">
             <div id="toolbar" class="toolbar">
             <div id="toolbar" class="toolbar">
                 <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}"><i class="fa fa-refresh"></i> 刷新</a>
                 <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}"><i class="fa fa-refresh"></i> 刷新</a>
-                <a href="javascript:;" class="btn btn-success" id="btn-export-month-outward" title="按月份导出外发明细(8 列固定表头,已完结且已选外协)"><i class="fa fa-download"></i> 月份下发明细导出</a>
+                <a href="javascript:;" class="btn btn-success" id="btn-export-month-outward" title="导出当前所选月份的外发明细 Excel"><i class="fa fa-download"></i> 导出 Excel</a>
+                <span class="procuremen-export-ym-wrap" style="display:inline-block;margin-left:12px;vertical-align:middle;">
+                    <label style="margin:0 6px 0 0;font-weight:normal;">查看月份</label>
+                    <input type="month" id="export-preview-ym" class="form-control input-sm" style="display:inline-block;width:150px;height:30px;" />
+                </span>
             </div>
             </div>
             <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%"></table>
             <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%"></table>
-            <p class="help-block" style="padding:8px 12px;margin:0;">在此选择月份导出外发明细 Excel(已完结且采购确认已选定供应商);下方列表记录每次导出的时间与统计。</p>
+            <p class="help-block" style="padding:8px 12px;margin:0;">显示所选月份内<strong>已采购确认完结</strong>的外发订单(同一订单号合并为一行),点击「导出 Excel」下载该月外发明细。</p>
         </div>
         </div>
     </div>
     </div>
 </div>
 </div>

+ 30 - 10
application/api/controller/Fourth.php

@@ -2425,16 +2425,36 @@ ORDER BY
     public function yesterday_amount_redis(){
     public function yesterday_amount_redis(){
         $redis = redis();
         $redis = redis();
         $redis_key = md5('yesterday_amount_redis');
         $redis_key = md5('yesterday_amount_redis');
-        $sql = "SELECT aa.承印日期,COUNT(aa.订单号) 订单量,SUM(aa.合同金额)订单金额,SUM(aa.nwshjje)未税订单金额
-        FROM  (SELECT CONVERT(a.DCYRQ,CHAR(10)) 承印日期,
-                      a.CCYDH                            订单号,
-                      a.CYWDWMC                          委印单位,
-                      a.CYJMC                            印件名称,
-                      a.NJSHJJE                            合同金额,
-                      a.nwshjje
-               FROM   MCYD a
-               WHERE  CONVERT(a.DCYRQ,CHAR(10)) = CONVERT(DATE_SUB(NOW(),INTERVAL 0 DAY),CHAR(10)))aa
-        GROUP  BY aa.承印日期 ";
+
+        //优化前面
+        // $sql = "SELECT aa.承印日期,COUNT(aa.订单号) 订单量,SUM(aa.合同金额)订单金额,SUM(aa.nwshjje)未税订单金额
+        // FROM  (SELECT CONVERT(a.DCYRQ,CHAR(10)) 承印日期,
+        //               a.CCYDH                            订单号,
+        //               a.CYWDWMC                          委印单位,
+        //               a.CYJMC                            印件名称,
+        //               a.NJSHJJE                            合同金额,
+        //               a.nwshjje
+        //        FROM   MCYD a
+        //        WHERE  CONVERT(a.DCYRQ,CHAR(10)) = CONVERT(DATE_SUB(NOW(),INTERVAL 0 DAY),CHAR(10)))aa
+        // GROUP  BY aa.承印日期 ";
+
+        //优化后sql
+        $sql = "SELECT CONVERT
+                    (
+                      a.DCYRQ,
+                    CHAR ( 10 )) 承印日期,
+                    COUNT( a.CCYDH ) 订单量,
+                    SUM( a.NJSHJJE ) 订单金额,
+                    SUM( a.nwshjje ) 未税订单金额 
+                  FROM
+                    MCYD a 
+                  WHERE
+                    a.DCYRQ >= CURDATE() 
+                    AND a.DCYRQ < CURDATE() + INTERVAL 1 DAY 
+                  GROUP BY
+                    CONVERT (
+                    a.DCYRQ,
+                    CHAR ( 10 ))";
         $result=Db::query($sql);
         $result=Db::query($sql);
         $res['status']=0;
         $res['status']=0;
         $res['msg']='';
         $res['msg']='';

+ 0 - 70
application/api/controller/Index.php

@@ -14362,74 +14362,4 @@ class Index extends Api{
         return $redis_data;
         return $redis_data;
     }
     }
 
 
-
-
-    /**
-     * 第三方调用:外发采购询价审核接口
-     * 请求方式:GET
-     * 请求参数:
-     *  limit       返回条数 选填 默认100 最大200
-     */
-    public function GetProcuremen()
-    {
-        // 只允许GET请求
-        if (!$this->request->isGet()) {
-            return json([
-                'code' => 400,
-                'msg' => '请求方式错误,请使用GET',
-                'data' => []
-            ]);
-        }
-
-        // 接收参数 + 安全过滤
-        $start_time = $this->request->get('start_time', '', 'trim');
-        $end_time   = $this->request->get('end_time', '', 'trim');
-        $limit      = (int)$this->request->get('limit', 100);
-
-        // 限制最大返回条数,防止拖垮服务器
-        $limit = min($limit, 200);
-
-        // 时间范围:不传则自动取 30天前 ~ 现在
-        if (empty($start_time)) {
-            $start_time = date('Y-m-d H:i:s', strtotime('-30 days'));
-        }
-        if (empty($end_time)) {
-            $end_time = date('Y-m-d H:i:s');
-        }
-
-        $list = Db::table('scydgy')->alias('a')
-            ->join('mcyd b', 'b.ICYDID = a.ICYDID AND b.iStatus >= 10', 'inner')
-            ->field('a.ID,
-                 b.CCYDH as 传票号,
-                 b.CYJMC as 传票名称,
-                 a.CDXMC as 类型名称,
-                 a.CGYBH as 工序号,
-                 a.CGYMC as 工序名称,
-                 a.CDW as 单位,
-                 a.NGZL as 已下达总量,
-                 b.CDF,
-                 a.cGzzxMc as 客户名称,
-                 a.MBZ as 备注,
-                 a.iStatus as 状态,
-                 a.dStamp as 操作时间,
-                 b.dputrecord as 录入日期,
-                 b.cywyxm as 业务员')
-            ->where([
-                'a.bwjg'     => 1,      // 完成结果=1
-                'a.iEndBz'   => 0,      // 未结束
-                'a.iType'    => 0,      // 外发类型
-                'a.iStatus'  => 10,     // 已审核
-            ])
-            ->where('a.dStamp', '>=', $start_time)
-            ->where('a.dStamp', '<=', $end_time)
-            ->limit($limit)
-            ->select();
-
-        // 返回第三方标准格式
-        return json([
-            'code' => 200,
-            'msg'  => '获取成功',
-            'data' => $list
-        ]);
-    }
 }
 }

+ 2 - 2
application/api/controller/Procuremen.php

@@ -11,7 +11,7 @@ use think\Db;
 class Procuremen extends Controller
 class Procuremen extends Controller
 {
 {
     /**
     /**
-     * 外发加工候选列表
+     * 外发采购询价审核接口
      *
      *
      * 请求:GET
      * 请求:GET
      * 参数:
      * 参数:
@@ -69,7 +69,7 @@ class Procuremen extends Controller
             $query = Db::table('scydgy')
             $query = Db::table('scydgy')
                 ->alias('a')
                 ->alias('a')
                 ->join('mcyd b', 'b.ICYDID = a.ICYDID AND b.iStatus >= 10', 'inner')
                 ->join('mcyd b', 'b.ICYDID = a.ICYDID AND b.iStatus >= 10', 'inner')
-                ->field('a.ID, b.CCYDH, b.CYJMC, a.CDXMC, a.CGYBH, a.CGYMC, a.CDW, a.NGZL, b.CDF, a.cGzzxMc, a.MBZ, a.bwjg, a.iStatus, a.dStamp, b.dputrecord, b.cywyxm')
+                ->field('a.ID, b.CCYDH, b.CYJMC, b.CCLBMMC, a.CDXMC, a.CGYBH, a.CGYMC, a.CDW, a.NGZL, b.CDF, a.cGzzxMc, a.MBZ, a.bwjg, a.iStatus, a.dStamp, b.dputrecord, b.cywyxm')
                 ->where([
                 ->where([
                     'a.bwjg'    => 1,
                     'a.bwjg'    => 1,
                     'a.iEndBz'  => 0,
                     'a.iEndBz'  => 0,

+ 0 - 1
application/api/controller/Third.php

@@ -1943,7 +1943,6 @@ WHERE   (iStop = 0)
         $res = ['status' => 0, 'msg' => '', 'data' => $result];
         $res = ['status' => 0, 'msg' => '', 'data' => $result];
         return json($res);
         return json($res);
     }
     }
-
     //折、配、锁、糊机台实时生产进度->接口
     //折、配、锁、糊机台实时生产进度->接口
     public function zpsh_schedule(){
     public function zpsh_schedule(){
         $redis = redis();
         $redis = redis();

+ 7 - 2
application/extra/mproc.php

@@ -7,12 +7,17 @@
  */
  */
 return [
 return [
     // 邮件根地址(正式环境);本地未配或校验不通过时自动用当前访问域名
     // 邮件根地址(正式环境);本地未配或校验不通过时自动用当前访问域名
-    'mobile_base_url'   => 'http://xh.7in6.com',
+    'mobile_base_url'   => 'https://xh.7in6.com',
     // 手机端首页路径(相对上项),留空为 /index.php/index/index/index
     // 手机端首页路径(相对上项),留空为 /index.php/index/index/index
     'mobile_index_path' => '',
     'mobile_index_path' => '',
     'session_days'  => 7,
     'session_days'  => 7,
     'sms_code_ttl'  => 300,
     'sms_code_ttl'  => 300,
     'sms_resend_cd' => 55,
     'sms_resend_cd' => 55,
+    // 登录短信全文(须与短信宝 VIP 已审核模板一致:签名+正文,{code} 为 6 位验证码)
+    'sms_login_template' => '【可集达】您的验证码是{code}。如非本人操作,请忽略本短信',
+    // 短信宝账号(留空则用代码内默认)
+    // 'smsbao_user' => 'zhuwei123',
+    // 'smsbao_pass' => '明文密码',
     // 仅本地调试:与登录页输入的 6 位验证码一致时跳过短信缓存校验;上线请注释或删除
     // 仅本地调试:与登录页输入的 6 位验证码一致时跳过短信缓存校验;上线请注释或删除
-    'mock_sms_code' => '123456',
+    'mock_sms_code' => '123123',
 ];
 ];

+ 54 - 15
application/index/controller/Index.php

@@ -8,6 +8,7 @@ use think\captcha\Captcha;
 use think\Config;
 use think\Config;
 use think\Cookie;
 use think\Cookie;
 use think\Db;
 use think\Db;
+use think\Log;
 use think\Session;
 use think\Session;
 use think\Validate;
 use think\Validate;
 
 
@@ -161,7 +162,7 @@ class Index extends Frontend
         } elseif (isset($raw[0]) && $raw[0] === '/') {
         } elseif (isset($raw[0]) && $raw[0] === '/') {
             $pq = parse_url('http://127.0.0.1' . $raw);
             $pq = parse_url('http://127.0.0.1' . $raw);
             $queryStr = (is_array($pq) && !empty($pq['query']) && is_string($pq['query'])) ? $pq['query'] : '';
             $queryStr = (is_array($pq) && !empty($pq['query']) && is_string($pq['query'])) ? $pq['query'] : '';
-        } else {
+                    } else {
             $pq = parse_url('http://127.0.0.1/' . ltrim($raw, '/'));
             $pq = parse_url('http://127.0.0.1/' . ltrim($raw, '/'));
             $queryStr = (is_array($pq) && !empty($pq['query']) && is_string($pq['query'])) ? $pq['query'] : '';
             $queryStr = (is_array($pq) && !empty($pq['query']) && is_string($pq['query'])) ? $pq['query'] : '';
         }
         }
@@ -571,7 +572,7 @@ class Index extends Frontend
                         if ($firstPo) {
                         if ($firstPo) {
                             $sub->where($pf, 'like', $like);
                             $sub->where($pf, 'like', $like);
                             $firstPo = false;
                             $firstPo = false;
-                        } else {
+            } else {
                             $sub->whereOr($pf, 'like', $like);
                             $sub->whereOr($pf, 'like', $like);
                         }
                         }
                     }
                     }
@@ -855,6 +856,13 @@ class Index extends Frontend
     protected function mprocFetchProcuremenList(array $user, $tab, $q, $statusNameCol)
     protected function mprocFetchProcuremenList(array $user, $tab, $q, $statusNameCol)
     {
     {
         $query = Db::table('purchase_order_detail')->order('id', 'desc');
         $query = Db::table('purchase_order_detail')->order('id', 'desc');
+        // 初选下发(wflow_status=1)仅落明细、尚未通知供应商,手机端不可见;audit 通知后 wflow_status>=2 才展示
+        try {
+            $query->whereRaw(
+                'NOT EXISTS (SELECT 1 FROM purchase_order po WHERE po.scydgy_id = purchase_order_detail.scydgy_id AND po.wflow_status = 1 LIMIT 1)'
+            );
+        } catch (\Throwable $e) {
+        }
         $userWhere = $this->mprocListWhereForLoginUser($user);
         $userWhere = $this->mprocListWhereForLoginUser($user);
         if ($userWhere !== []) {
         if ($userWhere !== []) {
             $query->where($userWhere);
             $query->where($userWhere);
@@ -914,7 +922,7 @@ class Index extends Frontend
             // status_name 由库表/后端维护,不在此根据 amount 覆盖
             // status_name 由库表/后端维护,不在此根据 amount 覆盖
             if (!isset($row['status_name']) || $row['status_name'] === null) {
             if (!isset($row['status_name']) || $row['status_name'] === null) {
                 $row['status_name'] = '';
                 $row['status_name'] = '';
-            } else {
+                    } else {
                 $row['status_name'] = trim((string)$row['status_name']);
                 $row['status_name'] = trim((string)$row['status_name']);
             }
             }
             $row['mproc_can_edit'] = $this->mprocCanEditRow($user, $row) ? 1 : 0;
             $row['mproc_can_edit'] = $this->mprocCanEditRow($user, $row) ? 1 : 0;
@@ -1136,15 +1144,12 @@ class Index extends Frontend
         }
         }
         $phone = trim((string)$this->request->post('phone', ''));
         $phone = trim((string)$this->request->post('phone', ''));
         $captcha = trim((string)$this->request->post('captcha', ''));
         $captcha = trim((string)$this->request->post('captcha', ''));
-        if ($captcha === '') {
-            $this->error('请输入图形验证码');
-        }
-        if (!Validate::is($captcha, 'captcha')) {
-            $this->error('图形验证码不正确');
-        }
         if (!preg_match('/^1\d{10}$/', $phone)) {
         if (!preg_match('/^1\d{10}$/', $phone)) {
             $this->error('请输入正确的11位手机号');
             $this->error('请输入正确的11位手机号');
         }
         }
+        if ($captcha === '') {
+            $this->error('请输入图形验证码');
+        }
         if (!$this->mprocFindCustomerUserByMobile($phone)) {
         if (!$this->mprocFindCustomerUserByMobile($phone)) {
             $this->error('该手机号未开通或已禁用,请联系管理员');
             $this->error('该手机号未开通或已禁用,请联系管理员');
         }
         }
@@ -1152,6 +1157,9 @@ class Index extends Frontend
         if (Cache::get('mproc_sms_wait_' . $phone)) {
         if (Cache::get('mproc_sms_wait_' . $phone)) {
             $this->error('发送过于频繁,请稍后再试');
             $this->error('发送过于频繁,请稍后再试');
         }
         }
+        if (!Validate::is($captcha, 'captcha')) {
+            $this->error('图形验证码不正确');
+        }
         $code = (string)random_int(100000, 999999);
         $code = (string)random_int(100000, 999999);
         $ttl = (int)(Config::get('mproc.sms_code_ttl') ?: 300);
         $ttl = (int)(Config::get('mproc.sms_code_ttl') ?: 300);
         $ttl = max(60, min(600, $ttl));
         $ttl = max(60, min(600, $ttl));
@@ -1159,7 +1167,12 @@ class Index extends Frontend
         Cache::set('mproc_sms_wait_' . $phone, 1, $cd);
         Cache::set('mproc_sms_wait_' . $phone, 1, $cd);
 
 
         try {
         try {
-            $this->mprocSmsSend($phone, '【登录验证】您的验证码为' . $code . ',' . (int)($ttl / 60) . '分钟内有效,请勿泄露。');
+            $tpl = trim((string)Config::get('mproc.sms_login_template'));
+            if ($tpl === '') {
+                $tpl = '【可集达】您的验证码是{code}。如非本人操作,请忽略本短信';
+            }
+            $content = str_replace('{code}', $code, $tpl);
+            $this->mprocSmsSend($phone, $content);
         } catch (\Exception $e) {
         } catch (\Exception $e) {
             Cache::rm('mproc_code_' . $phone);
             Cache::rm('mproc_code_' . $phone);
             Cache::rm('mproc_sms_wait_' . $phone);
             Cache::rm('mproc_sms_wait_' . $phone);
@@ -1188,7 +1201,7 @@ class Index extends Frontend
         $mock = Config::get('mproc.mock_sms_code');
         $mock = Config::get('mproc.mock_sms_code');
         if ($mock !== null && $mock !== '' && (string)$mock === $code) {
         if ($mock !== null && $mock !== '' && (string)$mock === $code) {
             Cache::rm('mproc_code_' . $phone);
             Cache::rm('mproc_code_' . $phone);
-        } else {
+            } else {
             $cached = Cache::get('mproc_code_' . $phone);
             $cached = Cache::get('mproc_code_' . $phone);
             if ($cached === false || $cached === null || (string)$cached !== $code) {
             if ($cached === false || $cached === null || (string)$cached !== $code) {
                 $this->error('验证码错误或已过期');
                 $this->error('验证码错误或已过期');
@@ -1531,17 +1544,43 @@ class Index extends Frontend
      */
      */
     protected function mprocSmsSend($phone, $content)
     protected function mprocSmsSend($phone, $content)
     {
     {
+        $statusStr = [
+            '0'  => '短信发送成功',
+            '-1' => '参数不全',
+            '-2' => '服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间!',
+            '30' => '密码错误',
+            '40' => '账号不存在',
+            '41' => '余额不足',
+            '42' => '帐户已过期',
+            '43' => 'IP地址限制',
+            '50' => '内容含有敏感词',
+        ];
         $smsapi = 'http://api.smsbao.com/';
         $smsapi = 'http://api.smsbao.com/';
-        $user = 'zhuwei123';
-        $pass = md5('1d1e605c101e4c1f8a156c6d7b19f126');
-        $sendurl = $smsapi . 'sms?u=' . $user . '&p=' . $pass . '&m=' . $phone . '&c=' . urlencode($content);
+        $user = trim((string)Config::get('mproc.smsbao_user'));
+        if ($user === '') {
+            $user = 'zhuwei123';
+        }
+        $passPlain = Config::get('mproc.smsbao_pass');
+        $pass = ($passPlain !== null && $passPlain !== '')
+            ? md5((string)$passPlain)
+            : md5('1d1e605c101e4c1f8a156c6d7b19f126');
+        $phone = trim((string)$phone);
+        $content = trim((string)$content);
+        if ($phone === '' || $content === '') {
+            throw new \Exception('短信发送失败:参数不全');
+        }
+        $sendurl = $smsapi . 'sms?u=' . rawurlencode($user) . '&p=' . $pass . '&m=' . rawurlencode($phone) . '&c=' . rawurlencode($content);
         $result = @file_get_contents($sendurl);
         $result = @file_get_contents($sendurl);
         if ($result === false) {
         if ($result === false) {
+            Log::record('smsbao 请求失败 phone=' . $phone . ' content=' . $content, 'error');
             throw new \Exception('短信发送失败:网络异常');
             throw new \Exception('短信发送失败:网络异常');
         }
         }
         $result = trim((string)$result);
         $result = trim((string)$result);
         if ($result !== '0') {
         if ($result !== '0') {
-            throw new \Exception('短信发送失败,错误码:' . $result);
+            $msg = isset($statusStr[$result]) ? $statusStr[$result] : ('返回码 ' . $result);
+            Log::record('smsbao 发送失败 phone=' . $phone . ' code=' . $result . ' ' . $msg . ' content=' . $content, 'error');
+            throw new \Exception('短信发送失败:' . $msg);
         }
         }
+        Log::record('smsbao 发送成功 phone=' . $phone . ' content=' . $content, 'info');
     }
     }
 }
 }

+ 30 - 10
application/index/view/index/login.html

@@ -103,6 +103,10 @@
             background: rgba(60, 141, 188, .96);
             background: rgba(60, 141, 188, .96);
             color: #fff;
             color: #fff;
         }
         }
+        .login-toast.ok {
+            background: #27ae60;
+            color: #fff;
+        }
     </style>
     </style>
 </head>
 </head>
 <body>
 <body>
@@ -181,7 +185,7 @@
 
 
     /** 页内轻提示,替代 alert */
     /** 页内轻提示,替代 alert */
     function showToast(msg, kind) {
     function showToast(msg, kind) {
-        kind = kind === 'info' ? 'info' : 'err';
+        kind = (kind === 'ok' || kind === 'info') ? kind : 'err';
         if (!$toast) {
         if (!$toast) {
             return;
             return;
         }
         }
@@ -267,14 +271,19 @@
         }
         }
     }
     }
 
 
-    function refreshCaptcha() {
+    function refreshCaptchaImage() {
         if (!$imgCaptcha || !captchaBaseUrl) return;
         if (!$imgCaptcha || !captchaBaseUrl) return;
         $imgCaptcha.src = captchaBaseUrl + (captchaBaseUrl.indexOf('?') >= 0 ? '&' : '?') + 'r=' + Date.now();
         $imgCaptcha.src = captchaBaseUrl + (captchaBaseUrl.indexOf('?') >= 0 ? '&' : '?') + 'r=' + Date.now();
+    }
+
+    /** 手动换图 / 验证码已被服务端校验消耗后:刷新图片并清空输入 */
+    function resetCaptchaField() {
+        refreshCaptchaImage();
         if ($captcha) $captcha.value = '';
         if ($captcha) $captcha.value = '';
     }
     }
 
 
     if ($imgCaptcha) {
     if ($imgCaptcha) {
-        $imgCaptcha.addEventListener('click', refreshCaptcha);
+        $imgCaptcha.addEventListener('click', resetCaptchaField);
     }
     }
 
 
     $tabs.forEach(function (btn) {
     $tabs.forEach(function (btn) {
@@ -283,7 +292,7 @@
             $tabs.forEach(function (b) { b.classList.toggle('active', b === btn); });
             $tabs.forEach(function (b) { b.classList.toggle('active', b === btn); });
             $panelPhone.classList.toggle('active', tab === 'phone');
             $panelPhone.classList.toggle('active', tab === 'phone');
             $panelAccount.classList.toggle('active', tab === 'account');
             $panelAccount.classList.toggle('active', tab === 'account');
-            if (tab === 'phone') refreshCaptcha();
+            if (tab === 'phone') resetCaptchaField();
         });
         });
     });
     });
 
 
@@ -299,7 +308,7 @@
         cd--;
         cd--;
     }
     }
 
 
-    $btnSend.addEventListener('click', function () {
+    function sendSmsCode() {
         var phone = ($phone.value || '').trim();
         var phone = ($phone.value || '').trim();
         var captcha = ($captcha && $captcha.value) ? $captcha.value.trim() : '';
         var captcha = ($captcha && $captcha.value) ? $captcha.value.trim() : '';
         if (!/^1\d{10}$/.test(phone)) {
         if (!/^1\d{10}$/.test(phone)) {
@@ -318,24 +327,35 @@
                 cd = 60;
                 cd = 60;
                 tick();
                 tick();
                 timer = setInterval(tick, 1000);
                 timer = setInterval(tick, 1000);
-                showToast('验证码已发送,请查收短信', 'info');
-                refreshCaptcha();
+                showToast('已发送', 'ok');
             } else {
             } else {
                 $btnSend.disabled = false;
                 $btnSend.disabled = false;
                 $btnSend.textContent = '获取验证码';
                 $btnSend.textContent = '获取验证码';
-                showToast(ret && ret.msg ? ret.msg : '发送失败', 'err');
-                refreshCaptcha();
+                var errMsg = ret && ret.msg ? ret.msg : '发送失败';
+                showToast(errMsg, 'err');
+                // 图形码已通过校验(如短信发送失败)时才换图;填错/手机号/频控等保留原输入
+                if (/短信发送失败/.test(errMsg)) {
+                    resetCaptchaField();
+                }
             }
             }
         }).catch(function (e) {
         }).catch(function (e) {
             $btnSend.disabled = false;
             $btnSend.disabled = false;
             $btnSend.textContent = '获取验证码';
             $btnSend.textContent = '获取验证码';
-            refreshCaptcha();
             if (e && e.name === 'AbortError') {
             if (e && e.name === 'AbortError') {
                 showToast('请求超时,请稍后再试', 'err');
                 showToast('请求超时,请稍后再试', 'err');
             } else {
             } else {
                 showToast('网络错误', 'err');
                 showToast('网络错误', 'err');
             }
             }
         });
         });
+    }
+
+    $btnSend.addEventListener('click', function () {
+        var active = document.activeElement;
+        if (active && active !== $btnSend && typeof active.blur === 'function') {
+            active.blur();
+        }
+        // 移动端:先 blur 再读取输入框,避免点击按钮时图形码尚未写入 value
+        setTimeout(sendSmsCode, 0);
     });
     });
 
 
     $btnLogin.addEventListener('click', function () {
     $btnLogin.addEventListener('click', function () {

+ 18 - 0
public/assets/css/backend.css

@@ -1743,4 +1743,22 @@ table.table-nowrap thead > tr > th {
   padding-left: 0;
   padding-left: 0;
   padding-right: 0;
   padding-right: 0;
 }
 }
+/* 采购确认:footer 克隆到主窗口 */
+.layui-layer-fast .layui-layer-footer .procuremen-outward-confirm-footer-btns,
+.layui-layer-footer .procuremen-outward-confirm-footer-btns {
+  width: 100%;
+  text-align: right !important;
+  padding-right: 20px;
+  box-sizing: border-box;
+}
+.layui-layer-fast .layui-layer-footer .procuremen-outward-confirm-footer-row,
+.layui-layer-footer .procuremen-outward-confirm-footer-row {
+  margin-left: 0;
+  margin-right: 0;
+}
+.layui-layer-fast .layui-layer-footer .procuremen-outward-confirm-footer-row .procuremen-outward-confirm-footer-btns,
+.layui-layer-footer .procuremen-outward-confirm-footer-row .procuremen-outward-confirm-footer-btns {
+  padding-left: 0;
+  padding-right: 0;
+}
 /*# sourceMappingURL=backend.css.map */
 /*# sourceMappingURL=backend.css.map */

+ 3 - 1
public/assets/js/backend/customer.js

@@ -47,10 +47,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 url: $.fn.bootstrapTable.defaults.extend.index_url,
                 url: $.fn.bootstrapTable.defaults.extend.index_url,
                 pk: 'id',
                 pk: 'id',
                 sortName: 'id',
                 sortName: 'id',
+                commonSearch: true,
                 columns: [
                 columns: [
                     [
                     [
                         {checkbox: true},
                         {checkbox: true},
-                        {field: 'id', title: __('Id')},
+                        {field: 'id', title: __('Id'), operate: 'LIKE'},
                         {field: 'company_name', title: __('Company_name'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
                         {field: 'company_name', title: __('Company_name'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
                         {field: 'username', title: __('Username'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
                         {field: 'username', title: __('Username'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
                         {field: 'account', title: __('Account'), operate: 'LIKE', table: table, class: 'autocontent', formatter: function (value, row) {
                         {field: 'account', title: __('Account'), operate: 'LIKE', table: table, class: 'autocontent', formatter: function (value, row) {
@@ -66,6 +67,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                         {
                         {
                             field: 'status',
                             field: 'status',
                             title: __('Status'),
                             title: __('Status'),
+                            operate: '=',
                             searchList: {'1': __('Status 1'), '0': __('Status 0')},
                             searchList: {'1': __('Status 1'), '0': __('Status 0')},
                             formatter: function (value) {
                             formatter: function (value) {
                                 var st = value !== undefined && value !== null ? String(value) : '';
                                 var st = value !== undefined && value !== null ? String(value) : '';

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 652 - 164
public/assets/js/backend/procuremen.js


+ 72 - 5
public/assets/js/backend/procuremenarchive.js

@@ -10,24 +10,80 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
             });
             });
 
 
             var table = $("#table");
             var table = $("#table");
+            var archiveHeightCached = 0;
+            var archiveHeightTimer = null;
+
+            function archiveCalcTableHeight() {
+                var el = table[0];
+                if (!el) {
+                    return 400;
+                }
+                var top = el.getBoundingClientRect().top;
+                return Math.max(300, Math.floor(window.innerHeight - top - 28));
+            }
+
+            function archiveSyncTableHeight() {
+                if (archiveHeightTimer) {
+                    clearTimeout(archiveHeightTimer);
+                }
+                archiveHeightTimer = setTimeout(function () {
+                    archiveHeightTimer = null;
+                    var h = archiveCalcTableHeight();
+                    if (archiveHeightCached > 0 && Math.abs(archiveHeightCached - h) <= 3) {
+                        return;
+                    }
+                    archiveHeightCached = h;
+                    try {
+                        table.bootstrapTable('resetView', {height: h});
+                    } catch (ignore) {
+                    }
+                }, 100);
+            }
 
 
             table.bootstrapTable({
             table.bootstrapTable({
                 url: $.fn.bootstrapTable.defaults.extend.index_url,
                 url: $.fn.bootstrapTable.defaults.extend.index_url,
                 pk: 'scydgy_id',
                 pk: 'scydgy_id',
                 sortName: 'id',
                 sortName: 'id',
                 sortOrder: 'desc',
                 sortOrder: 'desc',
-                commonSearch: false,
+                height: archiveCalcTableHeight(),
+                commonSearch: true,
+                pagination: true,
+                smartDisplay: false,
+                pageSize: Config.pagesize || localStorage.getItem('pagesize') || 20,
+                pageList: [10, 15, 20, 25, 50],
+                showJumpto: true,
                 columns: [
                 columns: [
                     [
                     [
-                        {field: 'CCYDH', title: '订单号', operate: false},
-                        {field: 'CYJMC', title: '印件名称', operate: false, class: 'autocontent', formatter: Table.api.formatter.content},
-                        {field: 'CGYMC', title: '工序名称', operate: false, class: 'autocontent', formatter: Table.api.formatter.content},
-                        {field: 'createtime_text', title: '完结时间', operate: false, width: 165},
+                        {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},
+                        {
+                            field: 'createtime',
+                            title: '完结时间',
+                            operate: 'RANGE',
+                            addclass: 'datetimerange',
+                            autocomplete: false,
+                            width: 165,
+                            formatter: function (value, row) {
+                                if (row.createtime_text) {
+                                    return row.createtime_text;
+                                }
+                                if (value == null || value === '') {
+                                    return '';
+                                }
+                                var n = parseInt(value, 10);
+                                if (!isNaN(n) && n > 946684800) {
+                                    return Table.api.formatter.datetime.call(this, value, row);
+                                }
+                                return String(value);
+                            }
+                        },
                         {
                         {
                             field: 'operate',
                             field: 'operate',
                             title: '操作',
                             title: '操作',
                             width: 100,
                             width: 100,
                             align: 'center',
                             align: 'center',
+                            operate: false,
                             table: table,
                             table: table,
                             formatter: function (value, row) {
                             formatter: function (value, row) {
                                 var sid = row && row.scydgy_id;
                                 var sid = row && row.scydgy_id;
@@ -44,6 +100,17 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
 
 
             Table.api.bindevent(table);
             Table.api.bindevent(table);
 
 
+            table.on('load-success.bs.table', function () {
+                archiveSyncTableHeight();
+            });
+            $(window).off('resize.procuremenArchive').on('resize.procuremenArchive', function () {
+                archiveHeightCached = 0;
+                archiveSyncTableHeight();
+            });
+            $(document).off('click.procuremenArchiveCommonSearch', 'button[name="commonSearch"]').on('click.procuremenArchiveCommonSearch', 'button[name="commonSearch"]', function () {
+                setTimeout(archiveSyncTableHeight, 150);
+            });
+
             $(document).off('click.procuremenArchiveDetails', '.btn-archive-details').on('click.procuremenArchiveDetails', '.btn-archive-details', function (e) {
             $(document).off('click.procuremenArchiveDetails', '.btn-archive-details').on('click.procuremenArchiveDetails', '.btn-archive-details', function (e) {
                 e.preventDefault();
                 e.preventDefault();
                 var sid = $(this).data('scydgy-id') || $(this).attr('data-scydgy-id');
                 var sid = $(this).data('scydgy-id') || $(this).attr('data-scydgy-id');

+ 84 - 43
public/assets/js/backend/procuremenexport.js

@@ -2,72 +2,113 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
 
 
     var Controller = {
     var Controller = {
         index: function () {
         index: function () {
+            var currYm = Controller.api.currentYm();
+            $('#export-preview-ym').val(currYm);
+
+            function listUrl(ym) {
+                ym = (ym || '').trim();
+                if (!/^\d{4}-\d{2}$/.test(ym)) {
+                    ym = Controller.api.currentYm();
+                }
+                return Fast.api.fixurl('procuremenexport/index?ym=' + encodeURIComponent(ym));
+            }
+
+            function refreshTable() {
+                var ym = ($('#export-preview-ym').val() || '').trim();
+                if (!/^\d{4}-\d{2}$/.test(ym)) {
+                    ym = Controller.api.currentYm();
+                    $('#export-preview-ym').val(ym);
+                }
+                $('#table').bootstrapTable('refresh', {url: listUrl(ym)});
+            }
+
             Table.api.init({
             Table.api.init({
                 extend: {
                 extend: {
-                    index_url: 'procuremenexport/index' + location.search,
-                    table: 'purchase_month_export_log',
+                    index_url: listUrl(currYm),
+                    table: 'purchase_order',
                 }
                 }
             });
             });
 
 
-            var table = $("#table");
+            var table = $('#table');
 
 
             table.bootstrapTable({
             table.bootstrapTable({
-                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                url: listUrl(currYm),
                 pk: 'id',
                 pk: 'id',
                 sortName: 'id',
                 sortName: 'id',
                 sortOrder: 'desc',
                 sortOrder: 'desc',
+                pagination: true,
+                pageSize: Config.pagesize || localStorage.getItem('pagesize') || 20,
+                pageList: [10, 15, 20, 25, 50],
+                showJumpto: true,
+                commonSearch: false,
+                search: false,
                 columns: [
                 columns: [
                     [
                     [
-                        {field: 'id', title: __('Id')},
-                        {field: 'ym', title: '月份', operate: 'LIKE'},
-                        {field: 'admin_name', title: '导出人', operate: 'LIKE'},
-                        {field: 'row_count', title: '明细行数', operate: false},
-                        {field: 'total_amount_text', title: '金额合计', operate: false},
-                        {field: 'createtime_text', title: '导出时间', operate: false}
+                        {field: 'ym', title: '月份', width: 88},
+                        {field: 'CCYDH', title: '订单号'},
+                        {field: 'CYJMC', title: '印件名称', class: 'autocontent', formatter: Table.api.formatter.content},
+                        {field: 'CGYMC', title: '工序名称', class: 'autocontent', formatter: Table.api.formatter.content},
+                        {field: 'createtime_text', title: '完结时间', width: 165},
+                        {field: 'row_count', title: '工序数', width: 72, align: 'center'},
+                        {field: 'total_amount', title: '金额合计', formatter: function (value, row) {
+                            return row.total_amount_text != null && row.total_amount_text !== ''
+                                ? row.total_amount_text
+                                : (value != null ? String(value) : '');
+                        }},
+                        {
+                            field: 'operate',
+                            title: '操作',
+                            width: 88,
+                            align: 'center',
+                            formatter: function (value, row) {
+                                var sid = row && row.scydgy_id;
+                                if (!sid) {
+                                    return '';
+                                }
+                                return '<a href="javascript:;" class="btn btn-xs btn-info btn-export-details" data-scydgy-id="' + sid + '" title="详情"><i class="fa fa-file-text-o"></i> 详情</a>';
+                            }
+                        }
                     ]
                     ]
                 ]
                 ]
             });
             });
 
 
             Table.api.bindevent(table);
             Table.api.bindevent(table);
 
 
+            $('.btn-refresh').off('click.procuremenExportRefresh').on('click.procuremenExportRefresh', function () {
+                refreshTable();
+            });
+
+            $('#export-preview-ym').off('change.procuremenExportYm').on('change.procuremenExportYm', function () {
+                refreshTable();
+            });
+
             $(document).off('click.procuremenExportMonth', '#btn-export-month-outward').on('click.procuremenExportMonth', '#btn-export-month-outward', function () {
             $(document).off('click.procuremenExportMonth', '#btn-export-month-outward').on('click.procuremenExportMonth', '#btn-export-month-outward', function () {
-                var d = new Date();
-                var ymDefault = d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2);
-                var escYm = String(ymDefault).replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
-                var html = ''
-                    + '<div style="padding:14px 18px 6px;">'
-                    + '<div class="form-group" style="margin-bottom:0;">'
-                    + '<input type="month" id="export-outward-ym-input" class="form-control" value="' + escYm + '" style="max-width:220px;" />'
-                    + '</div>'
-                    + '</div>';
-                Layer.open({
-                    type: 1,
-                    title: '月份外发明细导出',
-                    area: ['370px', 'auto'],
-                    shadeClose: true,
-                    content: html,
-                    btn: ['导出 Excel'],
-                    yes: function (index, layero) {
-                        var v = (layero.find('#export-outward-ym-input').val() || '').trim();
-                        if (!/^\d{4}-\d{2}$/.test(v)) {
-                            Toastr.warning('请选择有效月份');
-                            return;
-                        }
-                        Layer.close(index);
-                        var url = Fast.api.fixurl('procuremen/export_month_outward?ym=' + encodeURIComponent(v));
-                        setTimeout(function () {
-                            window.open(url, '_blank');
-                        }, 100);
-                        setTimeout(function () {
-                            table.bootstrapTable('refresh');
-                        }, 1500);
-                    }
-                });
+                var ym = ($('#export-preview-ym').val() || '').trim();
+                if (!/^\d{4}-\d{2}$/.test(ym)) {
+                    Toastr.warning('请选择有效月份');
+                    return;
+                }
+                var url = Fast.api.fixurl('procuremen/export_month_outward?ym=' + encodeURIComponent(ym));
+                window.open(url, '_blank');
+            });
+
+            $(document).off('click.procuremenExportDetails', '.btn-export-details').on('click.procuremenExportDetails', '.btn-export-details', function (e) {
+                e.preventDefault();
+                var sid = $(this).data('scydgy-id') || $(this).attr('data-scydgy-id');
+                if (!sid) {
+                    return;
+                }
+                var url = Fast.api.fixurl('procuremen/details?ids=' + encodeURIComponent(String(sid)));
+                Backend.api.open(url, '详情', {area: ['76%', '100%']});
             });
             });
         },
         },
         api: {
         api: {
+            currentYm: function () {
+                var d = new Date();
+                return d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2);
+            },
             bindevent: function () {
             bindevent: function () {
-                Form.api.bindevent($("form[role=form]"));
+                Form.api.bindevent($('form[role=form]'));
             }
             }
         }
         }
     };
     };

+ 3 - 1
public/assets/js/backend/procuremensms.js

@@ -21,10 +21,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 sortName: 'id',
                 sortName: 'id',
                 singleSelect: true,
                 singleSelect: true,
                 clickToSelect: true,
                 clickToSelect: true,
+                commonSearch: true,
                 columns: [
                 columns: [
                     [
                     [
                         {checkbox: true, align: 'center', valign: 'middle'},
                         {checkbox: true, align: 'center', valign: 'middle'},
-                        $.extend({field: 'id', title: __('Id'), width: 52}, colCenter),
+                        $.extend({field: 'id', title: __('Id'), width: 52, operate: 'LIKE'}, colCenter),
                         $.extend({field: 'title', title: '模版名称', operate: 'LIKE', width: 160}, colCenter),
                         $.extend({field: 'title', title: '模版名称', operate: 'LIKE', width: 160}, colCenter),
                         $.extend({
                         $.extend({
                             field: 'content',
                             field: 'content',
@@ -47,6 +48,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                             field: 'status',
                             field: 'status',
                             title: __('Status'),
                             title: __('Status'),
                             width: 88,
                             width: 88,
+                            operate: '=',
                             searchList: {'1': '正常', '0': '禁用'},
                             searchList: {'1': '正常', '0': '禁用'},
                             formatter: function (value) {
                             formatter: function (value) {
                                 var v = String(value);
                                 var v = String(value);

+ 2 - 1
public/assets/js/backend/purchaseemail.js

@@ -17,10 +17,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 url: $.fn.bootstrapTable.defaults.extend.index_url,
                 url: $.fn.bootstrapTable.defaults.extend.index_url,
                 pk: 'id',
                 pk: 'id',
                 sortName: 'id',
                 sortName: 'id',
+                commonSearch: true,
                 columns: [
                 columns: [
                     [
                     [
                         $.extend({checkbox: true}, colCenter),
                         $.extend({checkbox: true}, colCenter),
-                        $.extend({field: 'id', title: __('Id'), width: 52}, colCenter),
+                        $.extend({field: 'id', title: __('Id'), width: 52, operate: 'LIKE'}, colCenter),
                         $.extend({field: 'email_addr', title: '发件邮箱', operate: 'LIKE'}, colCenter),
                         $.extend({field: 'email_addr', title: '发件邮箱', operate: 'LIKE'}, colCenter),
                         $.extend({
                         $.extend({
                             field: 'email_pass',
                             field: 'email_pass',

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels