添加组件及页面

This commit is contained in:
zhengw
2026-01-21 17:05:30 +08:00
parent a89e69c381
commit 7ff1a911dd
54 changed files with 1078 additions and 1009 deletions

View File

@@ -1,10 +1,11 @@
{
"navigationBarTitleText": "流程录入",
"navigationBarTitleText": "录入流程",
"usingComponents": {
"t-input": "tdesign-miniprogram/input/input",
"t-checkbox": "tdesign-miniprogram/checkbox/checkbox",
"t-icon": "tdesign-miniprogram/icon/icon",
"popup-plugin": "/pages/components/popup-plugin/popup-plugin",
"tab-bar-plugin": "/pages/components/tab-bar-plugin/tab-bar-plugin"
"tab-bar-plugin": "/pages/components/tab-bar-plugin/tab-bar-plugin",
"card-item-plugin": "/pages/components/card-item-plugin/card-item-plugin"
}
}

View File

@@ -1,43 +1,36 @@
import { loginStatus, post } from "@/utils/https";
import {
formatTime,
getAuthInfo,
getDataSet,
isArray,
toArray,
toObject,
} from "@/utils/util";
import { voiceRequest } from "@/utils/voiceUtil";
import { loginStatus, post } from '@/utils/https';
import { formatTime, getAuthInfo, getDataSet, isArray, toArray, toObject } from '@/utils/util';
import { voiceRequest } from '@/utils/voiceUtil';
/** 拼接符号 */
const ProcessCodeConcatSymbol = "&&";
const ProcessCodeConcatSymbol = '&&';
/** 撤回码标记 */
const RecallCodeMarking = "-";
const RecallCodeMarking = '-';
/**
* 解析流程码
* @param {string} value
*/
const parseQrCode = (value: string) => {
value = `${value || ""}`;
value = `${value || ''}`;
const obj = {
/** 工序码 */
code: value,
/** 提成自定义字段 */
key: "",
key: '',
/** - => 撤回码 */
type: "",
type: '',
};
if (value.includes(ProcessCodeConcatSymbol)) {
obj.code = value.substring(0, value.indexOf(ProcessCodeConcatSymbol));
obj.key = value.substring(
value.indexOf(ProcessCodeConcatSymbol) + ProcessCodeConcatSymbol.length
value.indexOf(ProcessCodeConcatSymbol) + ProcessCodeConcatSymbol.length,
);
}
if (obj.code.includes(RecallCodeMarking)) {
obj.type = RecallCodeMarking;
obj.code = obj.code.replace(RecallCodeMarking, "");
obj.code = obj.code.replace(RecallCodeMarking, '');
}
return obj;
@@ -48,10 +41,12 @@ Page({
* 页面的初始数据
*/
data: {
action: "end",
processCodeMsg: "",
rel_order_no: "",
process_code: "",
action: 'end',
processCodeMsg: '',
// rel_order_no: 'XSDD2026011500000190',
// process_code: 'jd',
rel_order_no: '',
process_code: '',
logsList: [] as any[],
show: false,
orders: [] as any[],
@@ -63,49 +58,42 @@ Page({
hideTabKeys: [] as string[],
processItems: [] as any[],
backFlag: false,
selectedProcessCode: "",
result: "",
logType: "0",
/** 默认提成 */
defaultBonus: true,
showDefaultBonus: false,
defaultBonusConfig: {},
defaultBonusConfigKeys: [] as string[],
rel_order_no_temp: "",
selectedProcessCode: '',
result: '',
logType: '0',
rel_order_no_temp: '',
},
handleLogin(e: any) {
this.setData({ isLogin: e.detail });
if (e.detail) {
this.setData({ isLogin: true, authInfo: getAuthInfo() });
this.init();
} else {
this.setData({ isLogin: false });
}
},
backChange(e: any) {
this.data.backFlag = e.detail;
this.setData({ backFlag: e.detail });
wx.setStorageSync("processBackFlag", e.detail ? 1 : 0);
const checked = e.detail.checked;
this.data.backFlag = checked;
this.setData({ backFlag: checked });
wx.setStorageSync('processBackFlag', checked ? 1 : 0);
if (this.data.selectedProcessCode) {
const { code, key } = parseQrCode(this.data.selectedProcessCode);
this.data.selectedProcessCode = `${code}${
e.detail ? RecallCodeMarking : ""
}`;
this.data.selectedProcessCode = `${code}${checked ? RecallCodeMarking : ''}`;
if (key) {
this.data.selectedProcessCode += `${ProcessCodeConcatSymbol}${key}`;
}
}
wx.setStorageSync('selectedProcessCode', this.data.selectedProcessCode);
this.getProcessName();
},
getProcessName() {
if (this.data.selectedProcessCode) {
const { code, type } = parseQrCode(this.data.selectedProcessCode);
for (const ell of this.data.processItems) {
if (ell.code == code) {
if (ell.process_code == code) {
this.setData({
processCodeMsg: `工序名称:${ell.name || ""}(${ell.code})`,
processCodeMsg: `工序名称:${ell.process_name || ''}(${ell.process_code})`,
selectedProcessCode: this.data.selectedProcessCode,
process_code: this.data.selectedProcessCode,
action: type ? "back" : "end",
action: type ? 'back' : 'end',
});
break;
}
@@ -113,19 +101,19 @@ Page({
}
},
processItemTap(e: any) {
this.data.selectedProcessCode =
e.currentTarget.dataset.code + (this.data.backFlag ? "-" : "");
wx.setStorageSync("selectedProcessCode", this.data.selectedProcessCode);
this.data.selectedProcessCode = e.currentTarget.dataset.code + (this.data.backFlag ? '-' : '');
wx.setStorageSync('selectedProcessCode', this.data.selectedProcessCode);
this.setData({
selectedProcessCode: this.data.selectedProcessCode,
});
this.getProcessName();
},
getExecProcess() {
post("Orders/getExecProcess1").then((res: any) => {
post('CompanyProcessV2/getProcessByCode').then((res: any) => {
this.data.processItems = toArray(res.data);
if (this.data.processItems.length == 1) {
this.data.selectedProcessCode = this.data.processItems[0].code;
this.data.selectedProcessCode = this.data.processItems[0].process_code;
this.getProcessName();
} else {
this.getProcessName();
@@ -136,15 +124,16 @@ Page({
});
},
init() {
const companyInfo = toObject(wx.getStorageSync("company_info"));
const code = wx.getStorageSync("selectedProcessCode") || "";
const companyInfo = toObject(wx.getStorageSync('company_info'));
const code = wx.getStorageSync('selectedProcessCode') || '';
this.data.selectedProcessCode = code;
this.data.process_code = code;
this.data.backFlag = wx.getStorageSync("processBackFlag") == 1;
const logType = wx.getStorageSync("processEntry_logType");
this.data.backFlag = wx.getStorageSync('processBackFlag') == 1;
const logType = wx.getStorageSync('processEntry_logType');
this.setData({
hideTabKeys: companyInfo.staff_type == 3 ? ["2"] : [],
authInfo: getAuthInfo(),
hideTabKeys: companyInfo.staff_type == 3 ? ['2'] : [],
backFlag: this.data.backFlag,
selectedProcessCode: code,
process_code: code,
@@ -156,9 +145,10 @@ Page({
this.setData({
voice: event.detail,
});
wx.setStorageSync("processEntryVoice", `${event.detail}`);
wx.setStorageSync('processEntryVoice', `${event.detail}`);
},
getVoice(msg: string, cacheVoice?: boolean) {
return;
if (this.data.voice && msg) {
voiceRequest(msg, cacheVoice);
}
@@ -166,18 +156,19 @@ Page({
onLogTypeChange(e: any) {
const data = getDataSet(e);
this.setData({ logType: data.key });
wx.setStorageSync("processEntry_logType", data.key);
wx.setStorageSync('processEntry_logType', data.key);
},
scanCode() {
this.data.isScanCode = true;
wx.scanCode({
onlyFromCamera: true,
scanType: ["qrCode"],
scanType: ['qrCode'],
success: (res) => {
console.log(res);
const qrcode = res.result || "";
const qrcode = res.result || '';
if (qrcode) {
if (qrcode.startsWith("DD") || qrcode.startsWith("LC")) {
if (qrcode.startsWith('XSDD')) {
if (this.data.process_code) {
this.data.rel_order_no = qrcode;
this.setData({
@@ -185,16 +176,13 @@ Page({
});
this.processEnter();
} else {
wx.showToast({
title: "请扫流程码",
icon: "none",
});
wx.showToast({ title: '请扫流程码', icon: 'none' });
}
} else {
const code = parseQrCode(qrcode);
this.setData({
action: code.type == RecallCodeMarking ? "back" : "end",
rel_order_no: "",
action: code.type == RecallCodeMarking ? 'back' : 'end',
rel_order_no: '',
});
this.getProcess(qrcode);
}
@@ -208,41 +196,32 @@ Page({
},
});
},
getProcess(real_code: any) {
const code = parseQrCode(real_code);
post("CompanyProcess/processChildList", {
getProcess(process_code: any) {
const code = parseQrCode(process_code);
post('/CompanyProcessV2/getProcessByCode', {
curr_page: 1,
page_count: 1,
real_code: code.code,
process_code: code.code,
})
.then((res: any) => {
const data = res.data;
if (Array.isArray(res.data) && data.length) {
this.setData({
processCodeMsg: `工序名称:${data[0].name || ""}(${real_code})`,
process_code: real_code,
selectedProcessCode: real_code,
});
this.getVoice(`${data[0].name}工序`, true);
wx.showToast({
title: "请扫订单二维码",
icon: "none",
processCodeMsg: `工序名称:${data[0].process_name || ''}(${process_code})`,
process_code: process_code,
selectedProcessCode: process_code,
});
this.getVoice(`${data[0].process_name}工序`, true);
wx.showToast({ title: '请扫订单二维码', icon: 'none' });
} else {
this.addMsg("未找到 " + real_code + " 工序");
wx.showToast({
title: "未找到该工序",
icon: "error",
});
this.addMsg('未找到 ' + process_code + ' 工序');
wx.showToast({ title: '未找到该工序', icon: 'error' });
this.getVoice(`未找到工序`, true);
}
})
.catch(() => {
this.addMsg("未找到 " + real_code + " 工序");
wx.showToast({
title: "未找到该工序",
icon: "error",
});
this.addMsg('未找到 ' + process_code + ' 工序');
wx.showToast({ title: '未找到该工序', icon: 'error' });
});
},
processEnter() {
@@ -253,8 +232,12 @@ Page({
},
LCProcessEnter(e: any) {
const item = this.data.orders[e.currentTarget.dataset.index];
this.data.rel_order_no_temp = item.rel_order_no;
this.setProcess();
this.data.rel_order_no_temp = item.order_no;
this.setProcess({
info_process_id: JSON.stringify([item.info_process_id]),
action: this.data.action,
if_scan: 1,
});
},
setProcess(other?: any) {
const code = parseQrCode(this.data.process_code);
@@ -262,42 +245,31 @@ Page({
if (code.key) {
obj[this.data.rel_order_no_temp] = code.key;
}
post("Orders/setProcess", {
param: JSON.stringify({
rel_order_no: this.data.rel_order_no_temp,
process_code: code.code,
action: this.data.action,
if_scan: 1,
same_process: this.data.rel_order_no_temp.startsWith("LC")
? 1
: undefined,
// defaultBonus: getDefaultBonus() != "0",
}),
other: JSON.stringify({ ...other, ...obj }),
})
post(
'ProduceOrder/setProcessV2',
other
? other
: {
order_no: this.data.rel_order_no_temp,
process_code: code.code,
action: this.data.action,
if_scan: 1,
},
)
.then((res: any) => {
if (res.bonus == 1) {
const data = toObject(res.data);
this.setData({
defaultBonusConfig: data,
defaultBonusConfigKeys: Object.keys(data),
showDefaultBonus: true,
});
} else if (isArray(res.data) && res.data.length) {
if (isArray(res.data) && res.data.length) {
res.data.forEach((el: any) => {
el.product_info_str = toArray(el.product_info)
.map((ell) => {
return `${ell.room_name || "未命名"}(${
ell.goods_name || "未命名"
})`;
return `${ell.room_name || '未命名'}(${ell.goods_name || '未命名'})`;
})
.join("");
.join('');
el.sale_info_str = toArray(el.sale_info)
.map((ell) => {
return `${ell.goods_name}`;
})
.join("");
.join('');
});
this.setData({
@@ -307,57 +279,42 @@ Page({
} else {
this.addMsg(res.err_msg);
// this.getVoice(res.err_msg);
this.getVoice("通过");
this.getVoice('通过');
this.setData({
show: false,
result: "success",
showDefaultBonus: false,
result: 'success',
});
wx.showToast({
title: res.err_msg,
icon: "none",
icon: 'none',
});
}
})
.catch((res: any) => {
this.addMsg(res.err_msg);
if (res.err_code == "244269") {
if (res.err_code == '244269') {
this.setData({
result: "success",
result: 'success',
});
wx.showToast({
title: res.err_msg,
icon: "none",
icon: 'none',
});
this.getVoice("通过");
this.getVoice('通过');
} else {
this.setData({
result: "error",
result: 'error',
});
this.getVoice(res.err_msg);
}
});
},
onSelectBonus(e: any) {
const data = getDataSet(e);
this.setProcess({ [data.order_no]: data.key });
},
closeDefaultBonusHandle() {
this.setData({
showDefaultBonus: false,
});
},
// defaultBonusChange(e) {
// this.setData({
// defaultBonus: e.detail ? "1" : "0",
// });
// setDefaultBonus(e.detail ? "1" : "0");
// },
addMsg(msg: any) {
const now = new Date();
this.data.logsList.unshift({
date: formatTime(now).substring(5),
msg: msg || "",
msg: msg || '',
});
if (this.data.logsList.length > 100) {
this.data.logsList.length = 100;
@@ -381,20 +338,16 @@ Page({
onLoad(_options) {
this.setData({
loading: true,
voice: wx.getStorageSync("processEntryVoice") == "false" ? false : true,
voice: wx.getStorageSync('processEntryVoice') == 'false' ? false : true,
});
loginStatus()
.then(() => {
this.setData({
isLogin: true,
loading: false,
authInfo: getAuthInfo(),
});
this.setData({ isLogin: true, loading: false });
this.init();
})
.catch((err) => {
this.setData({ isLogin: false, loading: false });
console.log("调用登录状态请求失败", err);
console.log('调用登录状态请求失败', err);
});
},
@@ -408,11 +361,6 @@ Page({
*/
onShow() {
wx.hideHomeButton();
this.setData({
// defaultBonus: getDefaultBonus() != "0",
});
// if (!this.data.isScanCode) {
// }
},
/**

View File

@@ -1,41 +1,41 @@
<page-plugin
is-login="{{isLogin}}"
is-auth="{{authInfo['SF_ENTER_PROCESS']}}"
loading="{{loading}}"
bind:handleLogin="handleLogin"
customStyle="padding: 0;"
>
<page-plugin is-login="{{isLogin}}" is-auth="{{authInfo['SF_ERP_PRODUCT_PROCESS_ENTER']}}"
loading="{{loading}}" bind:handleLogin="handleLogin" customStyle="padding: 0;" hasTabBar="1">
<view class="container">
<view style="display: flex;padding: 12px 12px 4px 12px;">
<view style="display: flex;flex-shrink: 0;flex-direction: column;margin-right: 12px;align-items: flex-end;">
<view style="margin-bottom: 4px;font-weight: bold;">工序:</view>
<view style="display: flex;padding: 24rpx 24rpx 8rpx 24rpx;">
<view
style="display: flex;flex-shrink: 0;flex-direction: column;margin-right: 24rpx;align-items: flex-end;">
<view style="margin-bottom: 8rpx;font-weight: bold;">工序:</view>
<view>
<t-checkbox style="padding: 0;" value="{{ backFlag }}" bind:change="backChange">撤回</t-checkbox>
<t-checkbox style="padding: 0;" checked="{{ backFlag }}" bind:change="backChange">撤回
</t-checkbox>
</view>
</view>
<view style="display: flex;flex-wrap: wrap;min-height: 44px;max-height: 88px;overflow: auto;flex: 1;">
<view wx:if="{{processItems.length == 0}}" style="display: flex;justify-content: center;height: 100%;width: 100%;align-items: center;color: #999;">暂无工序
<view
style="display: flex;flex-wrap: wrap;min-height: 44px;max-height: 88px;overflow: auto;flex: 1;">
<view wx:if="{{processItems.length == 0}}"
style="display: flex;justify-content: center;height: 100%;width: 100%;align-items: center;color: #999;">
暂无工序
</view>
<block wx:for="{{processItems}}" wx:key="process_id">
<view class="process-item {{item.code == selectedProcessCode || (item.code + '-') == selectedProcessCode ? 'active': ''}}" bind:tap="processItemTap" data-code="{{item.code}}">{{item.name}}</view>
<view
class="process-item {{item.process_code == selectedProcessCode || (item.process_code + '-') == selectedProcessCode ? 'active': ''}}"
bind:tap="processItemTap" data-code="{{item.process_code}}">{{item.process_name}}</view>
</block>
</view>
</view>
<t-input
label="订单编号"
value="{{rel_order_no}}"
readonly
placeholder="扫码流程编码, 订单编号"
/>
<t-input label="订单编号" value="{{rel_order_no}}" readonly placeholder="扫码流程编码, 订单编号" />
<t-input label="流程编码" readonly value="{{process_code}}" />
<view wx:if="{{processCodeMsg}}" style="padding: 8px 12px 0 12px;color: {{action == 'end'? '#52c41a': '#ff4d4f'}};">
<view wx:if="{{processCodeMsg}}"
style="padding: 16rpx 24rpx 0 24rpx;color: {{action == 'end'? '#52c41a': '#ff4d4f'}};">
{{processCodeMsg}}
</view>
<view style="padding: 12px;padding-top: 0;">
<view style="display: flex;justify-content: center;margin-top: 12px;align-items: center;column-gap: 16px;">
<t-button theme="primary" bind:tap="scanCode" icon="qr">扫码</t-button>
<t-button theme="primary" disabled="{{!(rel_order_no && process_code)}}" bind:tap="processEnter">流程录入</t-button>
<view style="padding: 24rpx;padding-top: 0;">
<view style="display: flex;justify-content: center;margin-top: 24rpx;align-items: center;">
<t-button theme="primary" custom-style="margin-right: 32rpx" bind:tap="scanCode" icon="qr">
扫码</t-button>
<t-button theme="primary" disabled="{{!(rel_order_no && process_code)}}"
bind:tap="processEnter">录入流程</t-button>
<!-- <view style="width: 16px;"></view> -->
<!-- <van-checkbox value="{{voice}}" bind:change="voiceChange">语音播报</van-checkbox> -->
</view>
@@ -45,24 +45,17 @@
<!-- <text>扫码记录</text> -->
<text bind:tap="addMsg2">扫码结果</text>
<view>
<t-button
size="extra-small"
theme="{{logType == '0' ? 'primary' :'default'}}"
bind:tap="onLogTypeChange"
data-key="0"
>图标
<t-button size="extra-small" theme="{{logType == '0' ? 'primary' :'default'}}"
bind:tap="onLogTypeChange" data-key="0">图标
</t-button>
<t-button
size="extra-small"
theme="{{logType == '1' ? 'primary' :'default'}}"
bind:tap="onLogTypeChange"
data-key="1"
>记录
<t-button size="extra-small" theme="{{logType == '1' ? 'primary' :'default'}}"
bind:tap="onLogTypeChange" data-key="1">记录
</t-button>
</view>
<!-- <t-button size="extra-small" theme="primary" bind:tap="clearMsg">清空</t-button> -->
</view>
<view wx:if="{{logType == 0}}" class="log-box" style="display: flex;justify-content: center;align-items: center;font-size: 65vw;">
<view wx:if="{{logType == 0}}" class="log-box"
style="display: flex;justify-content: center;align-items: center;font-size: 65vw;">
<!-- <view wx:for="{{logsList}}" wx:for-item="item" wx:key="date" style="font-size: 14px;word-break: break-all;margin-bottom: 8px;width: 100%;align-items: flex-start;">
{{item.date}}
{{item.msg}}
@@ -72,37 +65,45 @@
</view>
<view wx:else class="log-box">
<view
wx:for="{{logsList}}"
wx:for-item="item"
wx:key="date"
style="word-break: break-all;margin-bottom: 8px;width: 100%;align-items: flex-start;"
>
<text style="color: #666;margin-right: 4px;">{{item.date}}</text>
<view wx:for="{{logsList}}" wx:for-item="item" wx:key="date"
style="word-break: break-all;margin-bottom: 16rpx;width: 100%;align-items: flex-start;">
<text style="color: #666;margin-right: 8rpx;">{{item.date}}</text>
{{item.msg}}
</view>
</view>
<popup-plugin visible="{{ show }}" bind:close="onClose" title="订单流程完成">
<!-- <view wx:for="{{orders}}" wx:key="rel_order_no"
style="border: 1rpx solid #ddd;border-radius: 4px;display: flex;flex-direction: column;margin-bottom: 12px;">
<view style="padding: 8px;">
<list-item label="流程单号" value="{{item.rel_order_no}}" />
<list-item label="流程名称" value="{{item.p_process_name}}" />
<list-item label="自定义名称" wx:if="{{item.process_custom_no}}" value="{{item.process_custom_no}}" />
<list-item label="工序名称" value="{{item.c_process_name}}" />
<list-item label="材料名称" wx:if="{{item.sale_info_str}}" value="{{item.sale_info_str}}" />
<list-item wx:if="{{item.product_info_str}}" label="房柜名称" value="{{item.product_info_str}}" />
<list-item label="状态" value="{{item.state== 2 ? '已完成' :''}}" />
<view style="padding: 24rpx;">
<view wx:for="{{orders}}" wx:key="rel_order_no"
style="border: 1rpx solid #ddd;border-radius: 8rpx;display: flex;flex-direction: column;margin-bottom: 24rpx;">
<view style="padding: 16rpx;">
<card-item-plugin label="销售单号" value="{{item.order_no}}" />
<card-item-plugin label="自定义单号" value="{{item.custom_order_no}}" />
<card-item-plugin label="流程名称" value="{{item.p_process_name}}" />
<card-item-plugin label="自定义名称" wx:if="{{item.process_custom_no}}"
value="{{item.process_custom_no}}" />
<card-item-plugin label="工序名称" value="{{item.c_process_name}}" />
<card-item-plugin label="材料名称" wx:if="{{item.sale_info_str}}"
value="{{item.sale_info_str}}" />
<card-item-plugin wx:if="{{item.product_info_str}}" label="房柜名称"
value="{{item.product_info_str}}" />
<card-item-plugin label="产品名称" value="{{item.goods_name}}" />
</view>
<view
style="display: flex;border-top: 1rpx solid #ddd;padding: 16rpx;justify-content: center;">
<block wx:if="{{action == 'end'}}">
<t-button size='small' theme="primary" data-index="{{index}}"
bind:tap="LCProcessEnter">
完成</t-button>
</block>
<block wx:else>
<t-button size='small' theme="danger" data-index="{{index}}"
bind:tap="LCProcessEnter">
撤回
</t-button>
</block>
</view>
</view>
</view>
<view style="display: flex;border-top: 1rpx solid #ddd;padding: 8px;justify-content: center;">
<block wx:if="{{action == 'end'}}">
<t-button size='small' type="primary" data-index="{{index}}" bind:tap="LCProcessEnter">完成</t-button>
</block>
<block wx:else>
<t-button size='small' type="danger" data-index="{{index}}" bind:tap="LCProcessEnter">撤回</t-button>
</block>
</view>
</view> -->
</popup-plugin>
<!-- <popup-plugin show="{{ showDefaultBonus }}" bind:close="closeDefaultBonusHandle" title="选择提成配置">
@@ -129,5 +130,4 @@
</view>
</page-plugin>
<tab-bar-plugin active="scan" />
<tab-bar-plugin active="scan" />

View File

@@ -1,25 +1,25 @@
.log-header {
display: flex;
justify-content: space-between;
padding: 8px 12px;
padding: 16rpx 24rpx;
border: 1rpx solid #ddd;
align-items: center;
margin-left: 12px;
margin-right: 12px;
margin-left: 24rpx;
margin-right: 24rpx;
}
.log-box {
flex: 1;
min-height: 0;
overflow: auto;
padding: 12px 12px 12px 12px;
padding: 24rpx;
border: 1rpx solid #ddd;
margin-left: 12px;
margin-right: 12px;
margin-left: 24rpx;
margin-right: 24rpx;
/* margin-bottom: calc(constant(safe-area-inset-bottom) + 12px); */
/*兼容 IOS<11.2*/
/* margin-bottom: calc(env(safe-area-inset-bottom) + 12px); */
margin-bottom: 12px;
margin-bottom: 24rpx;
border-top: none;
display: flex;
flex-direction: column;
@@ -28,18 +28,18 @@
.container {
display: flex;
flex-direction: column;
height: calc(100vh - var(--td-tab-bar-height, 80rpx) - env(safe-area-inset-bottom));
height: calc(100vh - var(--td-tab-bar-height, 80rpx) - env(safe-area-inset-bottom) - 32rpx);
}
.process-item {
height: 34px;
padding: 0 8px;
height: 64rpx;
padding: 0 16rpx;
border: 1rpx solid #ddd;
border-radius: 4px;
border-radius: 8rpx;
display: flex;
align-items: center;
margin-right: 8px;
margin-bottom: 8px;
margin-right: 16rpx;
margin-bottom: 16rpx;
}
.process-item.active {