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