Ver código fonte

Merge branch 'dev' of http://110.41.163.243:9980/kd-aiot/kd-aiot-frontend-wt into dev

xieyong 2 semanas atrás
pai
commit
d2eb0e1c3d

+ 11 - 0
docs/仓储看板审批接入说明.md

@@ -0,0 +1,11 @@
+# 仓储看板审批接入说明
+
+更新日期:2026-10-16。
+
+- `bpm/todo/index.vue`在`dashboard=1`时接收`warehouseScope/warehouseId/month/taskId`,先通过原`POST /bpm/task/todo-page`核实真实任务与范围,再调用原审批容器。无任务时提示已处理或不在授权范围,不用单据ID代替任务ID。
+- `bpm/handleTask/components/stagnantDisposal/detailDialog.vue`通过`GET /wms/dashboard/action/disposal/{businessId}`展示真实处置单、仓库名称、批次、数量、原因及执行状态;加载失败明确展示错误。
+- `stagnantDisposal/submit.vue`继承现有`stockBatchChange/submit.vue`,复用同一任务审批意见、通过与驳回请求。后端处置流程的`pcView/pcHandle`须指向这两个本地Vue组件路径,不能配置WMS页面URL或`/home/index`。
+- 已与后端实际变量核对:`pcView=/bpm/handleTask/components/stagnantDisposal/detailDialog.vue`,`pcHandle=/bpm/handleTask/components/stagnantDisposal/submit.vue`。
+- `router.afterEach`仅在`dashboard=1`时启用`wms-dashboard-theme`;对应Element样式覆盖挂到`body`的弹层,普通页面离开后移除该类。
+
+最终5个改动的Vue/JS/SCSS文件通过模板编译、脚本解析及看板Sass编译,`git diff --check`通过。Vue实际选项合并断言确认处置审批子组件继承原渲染函数、审批方法和任务参数;后端两个路径与本地文件一致。未做完整构建、浏览器联调或实际审批写操作;发布前须核实目标流程模型、审批人规则、仓储权限及详情权限。

+ 26 - 0
src/assets/styles/warehouse-dashboard.scss

@@ -0,0 +1,26 @@
+/* 仅看板及携带 dashboard=1 的下钻页面生效,包含挂载到 body 的弹层。 */
+body.wms-dashboard-theme {
+  .el-card,.el-dialog,.el-message-box,.el-select-dropdown,.el-picker-panel,.el-cascader-panel,.el-popover,.el-dropdown-menu,.el-autocomplete-suggestion { background: #0A1A30; color: #EAF4FF; border-color: rgba(70,160,230,.28); }
+  .el-card__header,.el-dialog__header,.el-message-box__header { border-color: rgba(70,160,230,.28); }
+  .el-dialog__title,.el-message-box__title,.el-dialog__body,.el-message-box__content,.el-form-item__label,.el-checkbox__label,.el-radio__label { color: #EAF4FF; }
+  .el-input__inner,.el-textarea__inner,.el-range-input { background: #071528; color: #EAF4FF; border-color: rgba(70,160,230,.35); }
+  .el-input.is-disabled .el-input__inner,.el-textarea.is-disabled .el-textarea__inner { background: #10243A; color: #9FB8D4; }
+  .el-select-dropdown__item,.el-dropdown-menu__item,.el-cascader-node,.el-date-table td { color: #9FB8D4; }
+  .el-select-dropdown__item.hover,.el-select-dropdown__item:hover,.el-dropdown-menu__item:hover,.el-cascader-node:hover,.el-date-table td.available:hover { background: #173655; color: #38C8F5; }
+  .el-table,.el-table__expanded-cell,.el-table tr { background: #0A1A30; color: #EAF4FF; }
+  .el-table th.el-table__cell,.el-table th { background: #102A48; color: #6FA6D8; }
+  .el-table td,.el-table th.is-leaf,.el-table--border,.el-table--group { border-color: rgba(70,160,230,.28); }
+  .el-table--enable-row-hover .el-table__body tr:hover > td,.el-table__body tr.current-row > td { background: #173655; }
+  .el-table::before,.el-table--border::after { background: rgba(70,160,230,.28); }
+  .el-tabs--border-card,.el-tabs--border-card > .el-tabs__header,.el-tabs__nav-wrap::after { background: #0A1A30; border-color: rgba(70,160,230,.28); }
+  .el-tabs--border-card > .el-tabs__header .el-tabs__item.is-active { background: #173655; color: #38C8F5; border-color: rgba(70,160,230,.28); }
+  .el-tabs__item,.el-pagination,.el-pagination__total,.el-pagination__jump,.el-upload-list__item-name { color: #9FB8D4; }
+  .el-pagination button,.el-pager li { background: #102A48; color: #9FB8D4; }
+  .el-pager li.active { color: #38C8F5; }
+  .el-button--default { background: #102A48; color: #EAF4FF; border-color: rgba(70,160,230,.35); }
+  .el-button--primary { background: #2E8BE8; border-color: #38C8F5; }
+  .el-input-number__increase,.el-input-number__decrease { background: #102A48; color: #9FB8D4; border-color: rgba(70,160,230,.28); }
+  .el-loading-mask { background: rgba(6,15,31,.75); }
+  .dashboard-note { color: #9FB8D4; line-height: 1.8; margin: 0 0 14px; }
+  .dashboard-success { color: #3BD48A; } .dashboard-error { color: #F25E5E; }
+}

+ 2 - 0
src/router/index.js

@@ -1,3 +1,4 @@
+import '@/assets/styles/warehouse-dashboard.scss';
 /**
  * 路由配置
  */
@@ -99,6 +100,7 @@ router.beforeEach((to, from, next) => {
 });
 
 router.afterEach((to) => {
+  document.body.classList.toggle('wms-dashboard-theme', to.query.dashboard === '1');
   if (!to.path.includes(REDIRECT_PATH) && NProgress.isStarted()) {
     setTimeout(() => {
       NProgress.done(true);

+ 44 - 0
src/views/bpm/handleTask/components/stagnantDisposal/detailDialog.vue

@@ -0,0 +1,44 @@
+<template>
+  <div v-loading="loading">
+    <el-alert v-if="error" :title="error" type="error" :closable="false" />
+    <el-descriptions v-else :column="3" border size="small">
+      <el-descriptions-item label="处置单号">{{ value(form.code) }}</el-descriptions-item>
+      <el-descriptions-item label="审批状态">{{ approvalLabels[form.approvalStatus] || '待核实' }}</el-descriptions-item>
+      <el-descriptions-item label="执行状态">{{ form.executionStatus === 1 ? '已执行' : '未执行' }}</el-descriptions-item>
+      <el-descriptions-item label="物料">{{ value(form.categoryName) }}</el-descriptions-item>
+      <el-descriptions-item label="系统批次">{{ value(form.systemBatchNo) }}</el-descriptions-item>
+      <el-descriptions-item label="业务批次">{{ value(form.batchNo) }}</el-descriptions-item>
+      <el-descriptions-item label="来源仓库">{{ value(form.warehouseName || form.warehouseId) }}</el-descriptions-item>
+      <el-descriptions-item label="处置数量">{{ value(form.quantity) }} {{ form.measureUnit }}</el-descriptions-item>
+      <el-descriptions-item label="处置方式">{{ form.method === 'TRANSFER' ? '调拨' : form.method === 'SCRAP' ? '报废出库' : '待核实' }}</el-descriptions-item>
+      <el-descriptions-item v-if="form.method === 'TRANSFER'" label="目标仓库">{{ value(form.targetWarehouseName || form.targetWarehouseId) }}</el-descriptions-item>
+      <el-descriptions-item label="处置原因" :span="3">{{ value(form.reason) }}</el-descriptions-item>
+      <el-descriptions-item label="关联执行单据" :span="3">{{ value(form.documentCode || form.documentId) }}</el-descriptions-item>
+    </el-descriptions>
+    <p>审批通过后需由仓储人员执行处置,执行前库存不变。</p>
+  </div>
+</template>
+<script>
+import request from '@/utils/request';
+
+export default {
+  name: 'StagnantDisposalDetail',
+  props: { businessId: { default: '' } },
+  data() { return { form:{},loading:false,error:'',sequence:0,approvalLabels:{ 0:'草稿',1:'审批中',2:'已通过',3:'已驳回',4:'已撤销' } }; },
+  watch: { businessId: { immediate:true,handler(id) { this.load(id); } } },
+  methods: {
+    value(value) { return value == null || value === '' ? '—' : value; },
+    // 读取处置申请本身,避免用实时库存替代审批内容。
+    async load(id) {
+      const sequence = ++this.sequence; this.form = {}; this.error = ''; this.loading = !!id;
+      if (!id) { this.error = '缺少处置单身份'; return; }
+      try {
+        const { data } = await request.get('/wms/dashboard/action/disposal/' + encodeURIComponent(id));
+        if (data.code != 0) throw new Error(data.message || '处置详情读取失败');
+        if (sequence === this.sequence) this.form = data.data || {};
+      } catch (e) { if (sequence === this.sequence) this.error = e.message || '处置详情读取失败'; }
+      finally { if (sequence === this.sequence) this.loading = false; }
+    }
+  }
+};
+</script>

+ 6 - 0
src/views/bpm/handleTask/components/stagnantDisposal/submit.vue

@@ -0,0 +1,6 @@
+<script>
+import TaskSubmit from '../stockBatchChange/submit.vue';
+
+// 两类业务均只提交当前任务的审批意见,沿用已验证的通过与驳回处理。
+export default { name:'StagnantDisposalSubmit',extends:TaskSubmit };
+</script>

+ 19 - 1
src/views/bpm/todo/index.vue

@@ -275,8 +275,26 @@
         ]
       };
     },
-    created() {},
+    created() { this.applyDashboardTask(); },
+    watch: { '$route.query': { deep:true,handler() { this.applyDashboardTask(); } } },
     methods: {
+      applyDashboardTask() {
+        const q = this.$route.query;
+        if (q.dashboard !== '1') return;
+        this.params = { ...this.params,warehouseScope:true,warehouseId:q.warehouseId || undefined,month:q.month || undefined };
+        const sequence = (this.dashboardSequence || 0) + 1; this.dashboardSequence = sequence;
+        this.$nextTick(async () => {
+          this.reload();
+          if (!q.taskId) return;
+          try {
+            const data = await getTodoTaskPage({ pageNo:1,pageSize:1,...this.params,taskId:q.taskId });
+            if (sequence !== this.dashboardSequence) return;
+            const row = (data.list || []).find((item) => String(item.id) === String(q.taskId));
+            if (row) this.handleAudit('audit',row);
+            else this.$message.warning('该任务已处理,或不在当前授权仓库及月份范围内');
+          } catch (e) { this.$message.error(e.message || '审批任务读取失败'); }
+        });
+      },
       /* 表格数据源 */
       datasource({ page, limit, where, order }) {
         return getTodoTaskPage({