feat(front): 事项编辑补服务承诺字段 + 列表加承诺时限/跑动列
build / build (push) Failing after 2m2s

- ServiceItemEdit.vue:新增「服务承诺」区块(协办部门/经办人/办理时段/跑动次数/快递/收费)
- ServiceItemList.vue:列表新增承诺时限、跑动次数两列
- SvcItemSaveRequest 类型补 7 字段,去掉原来的 & Record<string,any> 兜底
- .gitignore 忽略 vite.config.ts.timestamp-* 临时文件
This commit is contained in:
chenxing
2026-10-20 18:02:00 +08:00
parent e9009dc53a
commit 983c1a7512
4 changed files with 95 additions and 1 deletions
+3
View File
@@ -27,3 +27,6 @@ yarn.lock
# scratch # scratch
.temp .temp
# Vite 配置热重载产生的临时文件(构建时自动生成,勿入库)
vite.config.ts.timestamp-*
+8
View File
@@ -130,6 +130,14 @@ export interface SvcItemSaveRequest {
formCode?: string; formCode?: string;
flowGuid?: string; flowGuid?: string;
applyUrl?: string; applyUrl?: string;
// ===== 服务承诺(P1-1):与后端 SvcModels.SvcItemSaveRequest 同名,勿改 =====
coopDepts?: string;
handlerName?: string;
handleTimeDesc?: string;
runCount?: number;
expressFlag?: number;
feeDesc?: string;
feeBasis?: string;
sortNo?: number; sortNo?: number;
attachmentIds?: number[]; attachmentIds?: number[];
} }
+76 -1
View File
@@ -25,13 +25,20 @@ const saveRules = {
title: [{ required: true, message: "请填写红色星号内容!", trigger: "blur" }], title: [{ required: true, message: "请填写红色星号内容!", trigger: "blur" }],
}; };
const form = ref<SvcItemSaveRequest & Record<string, any>>({ const form = ref<SvcItemSaveRequest>({
siteCode: "", siteCode: "",
itemCode: "", itemCode: "",
title: "", title: "",
handleMode: 1, handleMode: 1,
onlineFlag: 1, onlineFlag: 1,
sortNo: 0, sortNo: 0,
coopDepts: "",
handlerName: "",
handleTimeDesc: "",
runCount: undefined,
expressFlag: undefined,
feeDesc: "",
feeBasis: "",
}); });
const objects = ref<{ dictKey: string; dictName: string }[]>([]); const objects = ref<{ dictKey: string; dictName: string }[]>([]);
const categories = ref<{ dictKey: string; dictName: string }[]>([]); const categories = ref<{ dictKey: string; dictName: string }[]>([]);
@@ -225,6 +232,7 @@ onMounted(loadAll);
<Col span="8"> <Col span="8">
<FormItem label="承诺时限"> <FormItem label="承诺时限">
<Input v-model="form.promiseTimeLimit" :maxlength="64" /> <Input v-model="form.promiseTimeLimit" :maxlength="64" />
<div class="tip">建议填纯数字(天),详情页会用它推算预计完成日期</div>
</FormItem> </FormItem>
</Col> </Col>
<Col span="8"> <Col span="8">
@@ -239,6 +247,53 @@ onMounted(loadAll);
</Col> </Col>
</Row> </Row>
<div class="section-title">
<span>服务承诺</span><span class="new-tag">新增</span>
</div>
<Row :gutter="16">
<Col span="12">
<FormItem label="协办部门">
<Input v-model="form.coopDepts" :maxlength="500" placeholder="多个部门用顿号分隔" />
</FormItem>
</Col>
<Col span="12">
<FormItem label="经办人员">
<Input v-model="form.handlerName" :maxlength="64" />
</FormItem>
</Col>
<Col span="12">
<FormItem label="办理时间(时段)">
<Input v-model="form.handleTimeDesc" :maxlength="200" placeholder="工作日 08:00–11:45" />
<div class="tip">区别于办理时限,指窗口办公时段</div>
</FormItem>
</Col>
<Col span="12">
<FormItem label="跑现场次数">
<InputNumber v-model="form.runCount" :min="0" style="width: 100%" />
<div class="tip">0 = 零跑动</div>
</FormItem>
</Col>
<Col span="12">
<FormItem label="是否快递送达">
<Select v-model="form.expressFlag" clearable>
<Option :value="0">否</Option>
<Option :value="1">是(到付)</Option>
<Option :value="2">是(学校承担)</Option>
</Select>
</FormItem>
</Col>
<Col span="12">
<FormItem label="收费标准">
<Input v-model="form.feeDesc" :maxlength="200" />
</FormItem>
</Col>
<Col span="12">
<FormItem label="收费依据">
<Input v-model="form.feeBasis" :maxlength="200" />
</FormItem>
</Col>
</Row>
<Divider orientation="left">在线办理绑定</Divider> <Divider orientation="left">在线办理绑定</Divider>
<Row :gutter="16"> <Row :gutter="16">
<Col span="12"> <Col span="12">
@@ -346,6 +401,26 @@ onMounted(loadAll);
</template> </template>
<style scoped> <style scoped>
.section-title {
display: flex;
align-items: center;
gap: 8px;
margin: 24px 0 16px;
padding-bottom: 8px;
font-size: 14px;
font-weight: 500;
color: #17233d;
border-bottom: 1px solid #e8eaec;
}
.new-tag {
padding: 0 8px;
font-size: 12px;
font-weight: 400;
line-height: 18px;
color: #808695;
border: 1px solid #dcdee2;
border-radius: 9px;
}
.flow-select { .flow-select {
display: flex; display: flex;
gap: 8px; gap: 8px;
+8
View File
@@ -21,6 +21,10 @@ const dataParams = ref<{ status?: number; keyword: string }>({ status: undefined
const handleModeName = (m: number) => (m === 1 ? "线上" : m === 2 ? "线下" : "线上线下"); const handleModeName = (m: number) => (m === 1 ? "线上" : m === 2 ? "线下" : "线上线下");
// 表头"新增"标记(验收识别用,灰色小字)
const titleWithNew = (h: any, text: string) =>
h("span", [text, h("span", { style: { marginLeft: "4px", fontSize: "10px", color: "#808695" } }, "新增")]);
const columns = [ const columns = [
{ title: "序号", type: "index", width: 70, align: "center" }, { title: "序号", type: "index", width: 70, align: "center" },
{ title: "编码", key: "itemCode", width: 140 }, { title: "编码", key: "itemCode", width: 140 },
@@ -28,6 +32,10 @@ const columns = [
{ title: "类别", key: "categoryName", width: 110 }, { title: "类别", key: "categoryName", width: 110 },
{ title: "部门", key: "deptName", width: 130 }, { title: "部门", key: "deptName", width: 130 },
{ title: "办理方式", width: 90, align: "center", render: (h: any, p: any) => h("span", handleModeName(p.row.handleMode)) }, { title: "办理方式", width: 90, align: "center", render: (h: any, p: any) => h("span", handleModeName(p.row.handleMode)) },
{ title: "承诺时限", width: 110, align: "center", renderHeader: (h: any) => titleWithNew(h, "承诺时限"),
render: (h: any, p: any) => h("span", p.row.promiseTimeLimit || "—") },
{ title: "跑动", width: 100, align: "center", renderHeader: (h: any) => titleWithNew(h, "跑动"),
render: (h: any, p: any) => h("span", p.row.runCount === null || p.row.runCount === undefined ? "—" : (p.row.runCount === 0 ? "零跑动" : `${p.row.runCount} 次`)) },
{ title: "在线办理", width: 110, align: "center", render: (h: any, p: any) => { title: "在线办理", width: 110, align: "center", render: (h: any, p: any) =>
p.row.onlineFlag === 1 p.row.onlineFlag === 1
? h(Tag, { color: "green" }, () => "可在线办理") ? h(Tag, { color: "green" }, () => "可在线办理")