cloud-web-corejs 1.1.0-dev.30 → 1.1.0-dev.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,288 +0,0 @@
1
- <template>
2
- <biz-tab-list-page
3
- ref="bizTab"
4
- :listLabel="$t1('列表')"
5
- :titleField="BILL.titleField"
6
- :addTitle="$t1('新增')"
7
- :behavior="tabBehavior"
8
- @refresh-list="searchEvent"
9
- >
10
- <!-- ===== 列表页签 ===== -->
11
- <template #list>
12
- <vxe-grid
13
- ref="table-m1"
14
- v-bind="vxeOption"
15
- @resizable-change="$vxeTableUtil.onColumnWitchChange"
16
- @custom="$vxeTableUtil.customHandle"
17
- >
18
- <template #form>
19
- <div class="clearfix screen-btns">
20
- <div class="fl">
21
- <vxe-button
22
- status="primary"
23
- type="text"
24
- plain
25
- class="button-sty"
26
- icon="el-icon-plus"
27
- @click="openAdd"
28
- >{{ $t1("新增") }}</vxe-button
29
- >
30
- <!-- demo 用:现场切换「提交/审批完成后」的页签行为,方便两种效果都看一遍 -->
31
- <el-switch
32
- v-model="closeAfterWf"
33
- class="behavior-switch"
34
- :active-text="$t1('提交/通过后关闭页签回列表')"
35
- ></el-switch>
36
- </div>
37
- <div class="fr">
38
- <vxe-button
39
- icon="el-icon-brush"
40
- class="button-sty"
41
- type="text"
42
- status="primary"
43
- plain
44
- @click="resetEvent"
45
- >{{ $t1("刷新") }}</vxe-button
46
- >
47
- <vxe-button
48
- status="warning"
49
- icon="el-icon-search"
50
- class="button-sty"
51
- @click="searchEvent"
52
- >{{ $t1("搜索") }}</vxe-button
53
- >
54
- </div>
55
- </div>
56
- <vxe-form
57
- ref="form"
58
- class="screen-box"
59
- title-width="92px"
60
- title-align="right"
61
- :data="formData"
62
- @submit="searchEvent"
63
- @reset="resetEvent"
64
- >
65
- <vxe-form-item :title="$t1('变更单号') + ':'" field="sn">
66
- <template v-slot>
67
- <el-input v-model="formData.sn" size="small" clearable />
68
- </template>
69
- </vxe-form-item>
70
- <vxe-form-item :title="$t1('变更原因') + ':'" field="remark">
71
- <template v-slot>
72
- <el-input v-model="formData.remark" size="small" clearable />
73
- </template>
74
- </vxe-form-item>
75
- <vxe-form-item :title="$t1('状态') + ':'" field="status">
76
- <template v-slot>
77
- <el-select
78
- v-model="formData.status"
79
- size="small"
80
- clearable
81
- @clear="formData.status = null"
82
- >
83
- <el-option
84
- v-for="(item, key) in STATUS_MAP"
85
- :key="key"
86
- :label="item.label"
87
- :value="key"
88
- ></el-option>
89
- </el-select>
90
- </template>
91
- </vxe-form-item>
92
- </vxe-form>
93
- </template>
94
-
95
- <template #sn="{ row, rowIndex }">
96
- <a href="javascript:void(0);" class="a-link" @click="openDetail(row, rowIndex)">
97
- {{ row.sn }}
98
- </a>
99
- </template>
100
- <template #status="{ row }">
101
- <div :class="getStatus(row).cls">{{ getStatus(row).label }}</div>
102
- </template>
103
- <template #operate="{ row, rowIndex }">
104
- <a href="javascript:void(0);" class="a-link" @click="openDetail(row, rowIndex)">
105
- <el-tooltip
106
- :enterable="false"
107
- effect="dark"
108
- :content="$t1('查看')"
109
- placement="top"
110
- popper-class="tooltip-skin"
111
- ><i class="el-icon-view"
112
- /></el-tooltip>
113
- </a>
114
- </template>
115
- </vxe-grid>
116
- </template>
117
-
118
- <!-- ===== 详情页签(新增/查看共用同一个组件) ===== -->
119
- <template #detail="{ tab }">
120
- <bill-detail :tab="tab" />
121
- </template>
122
- </biz-tab-list-page>
123
- </template>
124
-
125
- <script>
126
- /**
127
- * demo B:真实单据 + 真实流程。
128
- *
129
- * 覆盖场景:
130
- * 1. 新增、查看详情都开独立页签,同一单据不重复开
131
- * 2. 新增页上直接「保存并提交流程」
132
- * 3. 提交流程 / 审批通过后按配置关页签回列表刷新(用工具栏开关现场切换)
133
- * 4. 审批点「通过」自动保存单据(见 detail.vue 的 wfAgreeBindSave)
134
- * 5. 详情头部「上一单/下一单」按列表当时的顺序翻单
135
- *
136
- * 后台前置条件见 ./billConfig.js 顶部注释;不想吃前置条件看 ../simple/list.vue。
137
- * 菜单/路由:@base/views/demo/bizTab/bill/list(本地已在 router/modules/customer.js 注册)
138
- */
139
- import BizTabListPage from "@base/components/bizTab/BizTabListPage.vue";
140
- import billDetail from "./detail.vue";
141
- import { BILL, STATUS_MAP } from "./billConfig";
142
-
143
- export default {
144
- name: "demo_bizTab_bill:list",
145
- components: { BizTabListPage, billDetail },
146
- data() {
147
- return {
148
- BILL,
149
- STATUS_MAP,
150
- vxeOption: {},
151
- formData: {},
152
- closeAfterWf: false,
153
- };
154
- },
155
- computed: {
156
- /**
157
- * 页签行为配置:默认全部「刷新当前页签」;打开开关后,提交流程和审批通过
158
- * 改成「关页签 → 回列表 → 刷新列表」。驳回/中断这类还没走完的动作仍留在当前页。
159
- */
160
- tabBehavior() {
161
- if (!this.closeAfterWf) return "refreshCurrent";
162
- return {
163
- submit: "closeToList",
164
- agree: "closeToList",
165
- default: "refreshCurrent",
166
- };
167
- },
168
- },
169
- mounted() {
170
- this.initTableList();
171
- },
172
- methods: {
173
- searchEvent() {
174
- this.$refs["table-m1"].commitProxy("reload");
175
- },
176
- resetEvent() {
177
- this.formData = {};
178
- this.$refs["table-m1"].commitProxy("reload");
179
- },
180
- getStatus(row) {
181
- return STATUS_MAP[row.status] || { label: "", cls: "" };
182
- },
183
- // 新增页签也传快照:保存成功后新单会被插到序列首位,翻单按钮随即可用
184
- openAdd() {
185
- this.$refs.bizTab.openAdd(null, { navRows: this.getListRows() });
186
- },
187
- // 把当前列表顺序和行下标一起传进去,详情头部就有「上一单/下一单」
188
- openDetail(row, rowIndex) {
189
- this.$refs.bizTab.openDetail(row, null, {
190
- navRows: this.getListRows(),
191
- navIndex: rowIndex != null ? rowIndex : -1,
192
- });
193
- },
194
- getListRows() {
195
- let grid = this.$refs["table-m1"];
196
- return grid ? grid.getTableData().fullData : null;
197
- },
198
- initTableList() {
199
- let tableOption = {
200
- vue: this,
201
- tableRef: "table-m1",
202
- tableName: "demo-bizTab-bill-list-m1",
203
- path: BILL.prefix + `/bd_api/${BILL.listFormCode}/getPage`,
204
- param: () => {
205
- return {
206
- ...this.formData,
207
- type: BILL.type,
208
- };
209
- },
210
- paramHandle: (queryParam) => {
211
- return {
212
- fixeData: {},
213
- formCode: BILL.listFormCode,
214
- taBm: BILL.taBm,
215
- data: {
216
- ...queryParam,
217
- },
218
- };
219
- },
220
- columns: [
221
- { type: "checkbox", width: 48, resizable: false, fixed: "left" },
222
- {
223
- title: this.$t1("变更单号"),
224
- field: "sn",
225
- width: 160,
226
- sortable: false,
227
- filterType: false,
228
- fixed: "left",
229
- slots: { default: "sn" },
230
- },
231
- {
232
- title: this.$t1("状态"),
233
- field: "status",
234
- width: 100,
235
- sortable: false,
236
- filterType: false,
237
- slots: { default: "status" },
238
- },
239
- {
240
- title: this.$t1("产品编码"),
241
- field: "itemcodes",
242
- width: 180,
243
- sortable: false,
244
- filterType: false,
245
- },
246
- {
247
- title: this.$t1("变更原因"),
248
- field: "remark",
249
- minWidth: 180,
250
- sortable: false,
251
- filterType: false,
252
- },
253
- {
254
- title: this.$t1("创建人"),
255
- field: "_createBy",
256
- width: 120,
257
- sortable: false,
258
- filterType: false,
259
- },
260
- {
261
- title: this.$t1("创建时间"),
262
- field: "create_date",
263
- width: 160,
264
- sortable: false,
265
- filterType: false,
266
- },
267
- {
268
- title: "",
269
- width: 47,
270
- fixed: "right",
271
- sortable: false,
272
- slots: { default: "operate" },
273
- },
274
- ],
275
- };
276
- this.$vxeTableUtil.initVxeTable(tableOption).then((opts) => {
277
- this.vxeOption = opts;
278
- });
279
- },
280
- },
281
- };
282
- </script>
283
-
284
- <style scoped>
285
- .behavior-switch {
286
- margin-left: 16px;
287
- }
288
- </style>
@@ -1,176 +0,0 @@
1
- <template>
2
- <el-dialog
3
- :title="$t1('产品列表')"
4
- :append-to-body="true"
5
- :modal-append-to-body="true"
6
- :close-on-click-modal="falseValue"
7
- :visible.sync="showDialog"
8
- :modal="falseValue"
9
- custom-class="dialog-style list-dialog"
10
- width="1200px"
11
- @close="dialogClose"
12
- v-el-drag-dialog
13
- v-el-dialog-center
14
- >
15
- <div class="cont" style="height: 450px">
16
- <vxe-grid
17
- class="is-pointer"
18
- ref="table-m1"
19
- v-bind="vxeOption"
20
- @resizable-change="$vxeTableUtil.onColumnWitchChange"
21
- @custom="$vxeTableUtil.customHandle"
22
- @checkbox-change="addDataTable"
23
- @checkbox-all="checkAll"
24
- @cell-dblclick="checkWithSubmit"
25
- >
26
- <template #form>
27
- <div class="clearfix screen-btns">
28
- <div class="fr">
29
- <vxe-button
30
- icon="el-icon-brush"
31
- class="button-sty"
32
- type="text"
33
- status="primary"
34
- plain
35
- @click="resetEvent"
36
- >{{ $t1("刷新") }}</vxe-button
37
- >
38
- <vxe-button
39
- status="warning"
40
- icon="el-icon-search"
41
- class="button-sty"
42
- @click="searchEvent"
43
- >{{ $t1("搜索") }}</vxe-button
44
- >
45
- </div>
46
- </div>
47
- <vxe-form
48
- class="screen-box"
49
- title-width="92px"
50
- title-align="right"
51
- :data="formData"
52
- @submit="searchEvent"
53
- @reset="resetEvent"
54
- >
55
- <vxe-form-item :title="$t1('产品编码') + ':'" field="itemcode">
56
- <template v-slot>
57
- <el-input v-model="formData.itemcode" size="small" clearable />
58
- </template>
59
- </vxe-form-item>
60
- <vxe-button type="submit" v-show="false" @click="searchEvent"></vxe-button>
61
- </vxe-form>
62
- </template>
63
- </vxe-grid>
64
- </div>
65
- <label id="labBtn" class="transverse">
66
- <div class="icon">
67
- <i class="el-icon-more"></i>
68
- <i class="el-icon-more"></i>
69
- </div>
70
- </label>
71
- <div class="multipleChoice">
72
- <el-tooltip :enterable="false" effect="dark" :content="$t1('全部删除')" placement="top">
73
- <a class="allDel icon-quanbushanchu" @click="clearChecked()"></a>
74
- </el-tooltip>
75
- <div class="list">
76
- <div class="item" v-for="(checkRow, index) in checkRows" :key="index">
77
- <p>{{ checkRow.itemdesc }}</p>
78
- <a class="el-icon-close" @click="clearTable1Select(index)"></a>
79
- </div>
80
- </div>
81
- </div>
82
- <span slot="footer" class="dialog-footer">
83
- <el-button type="primary" plain class="button-sty" @click="dialogClose">
84
- <i class="el-icon-close el-icon"></i>
85
- {{ $t1("取 消") }}
86
- </el-button>
87
- <el-button type="primary" class="button-sty" @click="dialogPrimary">
88
- <i class="el-icon-check el-icon"></i>
89
- {{ $t1("确 定") }}
90
- </el-button>
91
- </span>
92
- </el-dialog>
93
- </template>
94
-
95
- <script>
96
- /**
97
- * 产品选择弹框,走的是同一个 formCode 下的 findItemPage 脚本
98
- * (与 stdxx 的 pmd/product/product_change/productItemDialog.vue 同源)。
99
- * 选择类弹框的勾选态/回填/双击确认这些都在 selectDialogMixins 里,本文件只配表格。
100
- */
101
- import { selectDialogMixins } from "@base/mixins/selectDialog/index.js";
102
- import { BILL } from "./billConfig";
103
-
104
- export default {
105
- name: "demoBizTabProductDialog",
106
- props: ["visiable", "multi", "param", "allowSelected"],
107
- mixins: [selectDialogMixins],
108
- data() {
109
- return {
110
- showDialog: true,
111
- falseValue: false,
112
- selectMulti: true,
113
- formData: {},
114
- vxeOption: {},
115
- };
116
- },
117
- created() {
118
- this.initSetting();
119
- },
120
- mounted() {
121
- this.initTableM1();
122
- },
123
- methods: {
124
- initTableM1() {
125
- let tableOption = {
126
- vue: this,
127
- tableRef: "table-m1",
128
- tableName: "demo-bizTab-productDialog-m1",
129
- path: BILL.prefix + `/bd_api/${BILL.formCode}/findItemPage`,
130
- param: () => {
131
- return {
132
- ...this.formData,
133
- ...this.param,
134
- };
135
- },
136
- columns: [
137
- { type: "checkbox", width: 48, resizable: false, fixed: "left" },
138
- {
139
- title: this.$t1("产品描述"),
140
- field: "itemdesc",
141
- width: 350,
142
- sortable: false,
143
- filterType: false,
144
- fixed: "left",
145
- },
146
- {
147
- title: this.$t1("产品编码"),
148
- field: "itemcode",
149
- width: 150,
150
- sortable: false,
151
- filterType: false,
152
- },
153
- {
154
- title: this.$t1("产品分类名称"),
155
- field: "category_name",
156
- width: 150,
157
- sortable: false,
158
- filterType: false,
159
- },
160
- { title: "", width: 47, fixed: "right", sortable: false },
161
- ],
162
- config: {
163
- checkboxConfig: {
164
- checkStrictly: true,
165
- showHeader: this.selectMulti,
166
- trigger: "row",
167
- },
168
- },
169
- };
170
- this.$vxeTableUtil.initVxeTable(tableOption).then((opts) => {
171
- this.vxeOption = opts;
172
- });
173
- },
174
- },
175
- };
176
- </script>
@@ -1,123 +0,0 @@
1
- /**
2
- * demo A 的「接口适配层」——整个 demo 只有这个文件碰数据源。
3
- *
4
- * 这里是一份进程内 mock:不打后台、不依赖任何表单模板或流程配置,clone 下来就能跑,
5
- * 目的是把 bizTab 的页签链路(新增/详情/翻单/脏数据拦截/保存后升编辑态)演示清楚。
6
- *
7
- * 换成真实后台时只改本文件,list.vue / detail.vue 一行都不用动:
8
- * getPage → this.$http({ url: XX_PREFIX + "/demo_bill/listPage", ... })
9
- * getOne → this.$http({ url: XX_PREFIX + "/demo_bill/get", data: { id } })
10
- * save → this.$http({ url: XX_PREFIX + (id ? "/demo_bill/update" : "/demo_bill/save") })
11
- * 也就是 std 那些手写页面(如 basic/stock/stock_check)的写法。
12
- */
13
-
14
- // 假延时,让 loading / 重挂载的时序和真实请求一致,不然页签切换看不出效果
15
- const LATENCY = 200;
16
-
17
- export const STATUS_MAP = {
18
- 0: { label: "草稿", cls: "list-tag warning" },
19
- 1: { label: "已提交", cls: "list-tag" },
20
- 2: { label: "已完成", cls: "list-tag success" },
21
- };
22
-
23
- let seq = 3;
24
- // 主表 + 子表都放在一起,模拟「整单读写」
25
- let store = [
26
- {
27
- id: 1,
28
- sn: "DEMO-0001",
29
- name: "华南区物料补货",
30
- status: 0,
31
- owner: "张三",
32
- amount: 1200,
33
- remark: "月度常规补货",
34
- createDate: "2026-08-01 09:12:00",
35
- items: [
36
- { id: 11, itemCode: "M-001", itemName: "包装膜", qty: 200, price: 3 },
37
- { id: 12, itemCode: "M-002", itemName: "标签纸", qty: 300, price: 2 },
38
- ],
39
- },
40
- {
41
- id: 2,
42
- sn: "DEMO-0002",
43
- name: "华东区样品申请",
44
- status: 1,
45
- owner: "李四",
46
- amount: 860,
47
- remark: "客户送样",
48
- createDate: "2026-08-03 14:20:00",
49
- items: [{ id: 21, itemCode: "M-003", itemName: "试剂盒", qty: 20, price: 43 }],
50
- },
51
- {
52
- id: 3,
53
- sn: "DEMO-0003",
54
- name: "西北区促销物料",
55
- status: 2,
56
- owner: "王五",
57
- amount: 4300,
58
- remark: "",
59
- createDate: "2026-08-05 10:00:00",
60
- items: [],
61
- },
62
- ];
63
-
64
- function clone(val) {
65
- return val == null ? val : JSON.parse(JSON.stringify(val));
66
- }
67
-
68
- function delay(val) {
69
- return new Promise((resolve) => setTimeout(() => resolve(clone(val)), LATENCY));
70
- }
71
-
72
- /** 列表分页(demo 只做条件过滤,不分页) */
73
- export function getPage(query) {
74
- let q = query || {};
75
- let rows = store.filter((row) => {
76
- if (q.sn && String(row.sn).indexOf(q.sn) < 0) return false;
77
- if (q.name && String(row.name).indexOf(q.name) < 0) return false;
78
- if (q.status != null && q.status !== "" && row.status !== Number(q.status)) {
79
- return false;
80
- }
81
- return true;
82
- });
83
- return delay(rows);
84
- }
85
-
86
- /** 单据详情(含子表) */
87
- export function getOne(id) {
88
- return delay(store.find((row) => String(row.id) === String(id)) || null);
89
- }
90
-
91
- /** 保存:无 id 为新增,返回新单号;有 id 为更新,返回原单号 */
92
- export function save(bill) {
93
- let data = clone(bill) || {};
94
- return new Promise((resolve) => {
95
- setTimeout(() => {
96
- if (data.id == null || data.id === "") {
97
- seq += 1;
98
- data.id = seq;
99
- data.sn = "DEMO-" + String(seq).padStart(4, "0");
100
- data.status = 0;
101
- data.createDate = formatNow();
102
- store.push(data);
103
- } else {
104
- let index = store.findIndex((row) => String(row.id) === String(data.id));
105
- if (index < 0) {
106
- store.push(data);
107
- } else {
108
- store.splice(index, 1, data);
109
- }
110
- }
111
- resolve(clone(data));
112
- }, LATENCY);
113
- });
114
- }
115
-
116
- function formatNow() {
117
- let d = new Date();
118
- let pad = (n) => String(n).padStart(2, "0");
119
- return (
120
- `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} `
121
- + `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`
122
- );
123
- }