Merge remote-tracking branch 'websoft/master'

This commit is contained in:
2026-08-13 20:56:00 +08:00
44 changed files with 1170 additions and 806 deletions
+2 -2
View File
@@ -370,7 +370,7 @@ export default {
label: '详细地址',
prop: 'detailAddress',
type: 'textarea',
minRows: 3,
minRows: 2,
span: 24,
minWidth: 220,
overHidden: false,
@@ -429,7 +429,7 @@ export default {
label: '备注',
prop: 'remark',
type: 'textarea',
minRows: 4,
minRows: 2,
span: 24,
hide: true,
maxlength: 200,
+1 -1
View File
@@ -271,7 +271,7 @@ export default {
label: '备注',
prop: 'remark',
type: 'textarea',
minRows: 4,
minRows: 2,
span: 24,
hide: true,
maxlength: 200,
+101 -18
View File
@@ -75,6 +75,7 @@
filterable
:disabled="isParentRegionLocked"
:placeholder="isParentRegionLocked ? '自动带出' : '请选择国家'"
autocomplete="off"
style="width: 100%"
@change="handleCountryChange"
>
@@ -171,6 +172,27 @@
<template #detailAddress="{ row }">
<span class="port-terminal-page__detail-address">{{ row.detailAddress || '-' }}</span>
</template>
<template #detailAddress-form>
<el-input
v-model="form.detailAddress"
class="detail-address-input"
clearable
maxlength="255"
show-word-limit
placeholder="请输入"
/>
</template>
<template #remark-form>
<el-input
v-model="form.remark"
class="remark-input"
type="textarea"
:rows="2"
maxlength="200"
show-word-limit
placeholder="请输入"
/>
</template>
<template #longitude-form>
<el-input
v-model="form.longitude"
@@ -195,7 +217,7 @@
@load="onLoad(page, query)"
/>
<el-dialog title="港口码头主数据导入" append-to-body v-model="excelBox" width="555px">
<el-dialog title="港口码头主数据导入" append-to-body v-model="excelBox" width="500px">
<avue-form :option="excelOption" v-model="excelForm">
<template #excelTemplate>
<el-button type="primary" @click="handleTemplate">
@@ -303,6 +325,7 @@ const removeExcelColumnsByHeaders = async (blob, options = {}) => {
return new Blob([buffer], { type: 'application/vnd.ms-excel' });
};
const newLocal = '请选择类型';
export default {
data() {
const validateCode = (rule, value, callback) => {
@@ -368,9 +391,10 @@ export default {
option: {
height: 'auto',
calcHeight: 32,
dialogWidth: 980,
dialogWidth: 900,
dialogCustomClass: 'port-terminal-edit-dialog',
labelPosition: 'right',
labelWidth: 'auto',
labelWidth: '108px',
tip: false,
searchShow: true,
searchLabelWidth: 160,
@@ -396,7 +420,7 @@ export default {
formslot: true,
width: 140,
span: 12,
order: 70,
order: 89,
placeholder: '请输入编码',
rules: [
{ required: true, message: '请输入编码', trigger: 'blur' },
@@ -412,7 +436,7 @@ export default {
search: true,
searchOrder: 7,
span: 12,
order: 80,
order: 90,
placeholder: '请输入',
rules: [{ required: true, message: '请输入港口/码头名称', trigger: 'blur' }],
},
@@ -444,7 +468,7 @@ export default {
dicData: [],
hide: true,
span: 12,
order: 90,
order: 100,
placeholder: '请选择',
rules: [{ required: false, message: '请选择上级港口', trigger: 'change' }],
change: ({ value }) => this.handleParentChange(value),
@@ -478,7 +502,7 @@ export default {
filterable: true,
dicData: [],
span: 12,
order: 60,
order: 89,
minWidth: 140,
overHidden: false,
placeholder: '自动带出',
@@ -492,7 +516,7 @@ export default {
formslot: true,
hide: true,
span: 12,
order: 50,
order: 88,
placeholder: '自动带出',
rules: [{ required: true, message: '请选择所属城市', trigger: 'change' }],
},
@@ -515,6 +539,7 @@ export default {
type: 'select',
formslot: true,
hide: true,
order: 87,
props: {
label: 'title',
value: 'id',
@@ -543,7 +568,7 @@ export default {
formslot: true,
minWidth: 130,
span: 12,
order: 20,
order: 68,
placeholder: '请输入',
overHidden: false,
rules: [
@@ -557,7 +582,7 @@ export default {
formslot: true,
minWidth: 130,
span: 12,
order: 10,
order: 66,
placeholder: '请输入',
overHidden: false,
rules: [
@@ -578,13 +603,12 @@ export default {
{
label: '详细地址',
prop: 'detailAddress',
type: 'textarea',
slot: true,
minRows: 3,
span: 24,
formslot: true,
span: 12,
minWidth: 220,
overHidden: false,
order: 30,
order: 86,
placeholder: '请输入',
maxlength: 255,
showWordLimit: true,
@@ -611,8 +635,9 @@ export default {
label: '备注',
prop: 'remark',
type: 'textarea',
minRows: 4,
minRows: 2,
span: 24,
formslot: true,
hide: true,
maxlength: 200,
showWordLimit: true,
@@ -805,9 +830,12 @@ export default {
this.clearCityValue();
},
handleCategoryChange(value, reset = true) {
const required = value === '码头';
const parentColumn = this.findColumn(this.option.column, 'parentId');
parentColumn.rules[0].required = value === '码头';
this.setColumnDisplay('parentId', value === '码头');
if (parentColumn && parentColumn.rules && parentColumn.rules[0]) {
parentColumn.rules[0].required = required;
}
this.setColumnDisplay('parentId', required);
if (value === '港口') {
this.form.parentId = undefined;
this.form.parentCode = '';
@@ -1057,7 +1085,7 @@ export default {
return false;
}
if (isBlank(row.category)) {
this.$message.warning('请选择类型');
this.$message.warning(newLocal);
return false;
}
if (row.category === '码头' && isBlank(row.parentId)) {
@@ -1209,6 +1237,7 @@ export default {
this.handleCategoryChange(this.form.category, false);
this.syncTerminalCode();
done();
setTimeout(() => this.disableDialogAutocomplete(), 50);
});
});
return;
@@ -1232,8 +1261,21 @@ export default {
this.handleDistrictChange(this.form.districtCode);
}
done();
setTimeout(() => this.disableDialogAutocomplete(), 50);
});
},
disableDialogAutocomplete() {
this.$nextTick(() => {
const dialog = document.querySelector('.port-terminal-edit-dialog');
if (!dialog) return;
dialog.querySelectorAll('input, textarea').forEach(el => {
el.setAttribute('autocomplete', 'off');
el.setAttribute('autocorrect', 'off');
el.setAttribute('autocapitalize', 'off');
el.setAttribute('spellcheck', 'false');
});
});
},
searchReset() {
this.query = {};
this.setCityOptions([]);
@@ -1338,3 +1380,44 @@ export default {
padding: 4px 0;
}
</style>
<style lang="scss">
/* 港口码头编辑/新增弹窗:对齐 railway-station 统一风格(灰底 + 白卡表单 + 浮动底栏,padding 24px 与全局弹窗标准一致) */
//.port-terminal-edit-dialog {
// /* 灰底内容区 */
// .el-dialog__body {
// background-color: #f2f2f2;
// padding: 8px;
// }
// /* 表单白卡(与全局 .el-dialog .avue-form 一致,padding 24px 对齐 customer-archive / railway-station */
// .avue-form {
// background: #fff;
// border-radius: 6px;
// box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
// padding: 24px !important;
// margin-bottom: 0;
// }
// /* 底部按钮区白卡(Avue 弹窗 footer 在 body 内,接续白卡) */
// .avue-dialog__footer {
// background: #fff;
// border-radius: 0 0 6px 6px;
// box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
// padding: 16px 24px !important;
// display: flex;
// justify-content: flex-end;
// }
// /* label 宽度统一 108px(对齐 railway-station,标签对齐更整齐) */
// .el-form-item__label {
// width: 108px !important;
// }
// /* 所有 input 文本框、select 下拉控件统一宽度 250px */
// .el-input,
// .el-select {
// width: 250px !important;
// }
// /* 备注宽度 85% */
// .remark-input {
// width: 85% !important;
// }
//}
</style>
+15 -3
View File
@@ -202,8 +202,9 @@ export default {
height: 'auto',
calcHeight: 32,
dialogWidth: 980,
dialogCustomClass: 'railway-station-edit-dialog',
labelPosition: 'right',
labelWidth: 'auto',
labelWidth: '140px',
tip: false,
searchShow: true,
searchMenuSpan: 24,
@@ -339,7 +340,7 @@ export default {
label: '详细地址',
prop: 'detailAddress',
type: 'textarea',
minRows: 3,
minRows: 2,
span: 24,
minWidth: 220,
overHidden: false,
@@ -393,7 +394,7 @@ export default {
label: '备注',
prop: 'remark',
type: 'textarea',
minRows: 4,
minRows: 2,
span: 24,
hide: true,
maxlength: 200,
@@ -892,5 +893,16 @@ export default {
:deep(.el-table td .cell) {
white-space: nowrap;
}
}
</style>
<style lang="scss">
/* 铁路车站编辑/新增弹窗:强制 label 宽度 140px(覆盖 Avue 默认 auto 计算值),灰底白卡与浮动底栏由全局 element-ui.scss 弹窗标准规则统一提供 */
.railway-station-edit-dialog {
.el-form-item__label {
width: 140px !important;
}
}
</style>
@@ -27,7 +27,7 @@
:icon="actionButtonLikeSearch ? undefined : 'el-icon-plus'"
v-if="canCreate"
@click="$refs.crud.rowAdd()"
>{{ config.createText || '新增' }}
>{{ config.createText || '新增' }}
</el-button>
<el-button
type="primary"
@@ -39,7 +39,7 @@
!readonlyScope
"
@click="handleImport"
>{{ config.importText || '批量导入' }}
>{{ config.importText || '批量导入' }}
</el-button>
<el-button
type="primary"
@@ -47,7 +47,7 @@
plain
v-if="config.templateUrl && hasPermission(`${config.permission}_template`)"
@click="handleTemplate"
>下载模板
>下载模板
</el-button>
<el-button
type="primary"
@@ -55,7 +55,7 @@
plain
v-if="config.exportUrl && hasPermission(`${config.permission}_export`)"
@click="handleExport"
>批量导出
>批量导出
</el-button>
<el-button
type="success"
@@ -63,14 +63,14 @@
plain
v-if="canBatchComplete"
@click="handleBatchComplete"
>批量完成
>批量完成
</el-button>
<el-button
type="primary"
:plain="!actionButtonLikeSearch"
v-if="canRoadLoading"
@click="handleRoadLoading"
>{{ config.roadLoadingText || '公路配载' }}
>{{ config.roadLoadingText || '公路配载' }}
</el-button>
<el-button
type="danger"
@@ -82,7 +82,7 @@
!readonlyScope
"
@click="handleDelete"
>批量删除
>批量删除
</el-button>
</template>
@@ -1130,20 +1130,20 @@
</el-radio-group>
</el-form-item>
<template v-if="hasTransportType">
<el-form-item v-if="isCarrierMode" label="承运商" required>
<el-select
v-model="form.carrierName"
placeholder="请选择承运商"
filterable
clearable
:loading="taskCarrierLoading"
:disabled="dialogReadonly || form.carrierType !== '承运商'"
@visible-change="visible => visible && loadTaskCarrierOptions()"
@change="handleTaskCarrierChange"
>
<el-option
v-for="item in taskCarrierOptions"
:key="
<el-form-item v-if="isCarrierMode" label="承运商" required>
<el-select
v-model="form.carrierName"
placeholder="请选择承运商"
filterable
clearable
:loading="taskCarrierLoading"
:disabled="dialogReadonly || form.carrierType !== '承运商'"
@visible-change="visible => visible && loadTaskCarrierOptions()"
@change="handleTaskCarrierChange"
>
<el-option
v-for="item in taskCarrierOptions"
:key="
item.id ||
item.customerName ||
item.carrierName ||
@@ -1151,275 +1151,275 @@
item.name ||
item.customerCode
"
:label="item.customerName || item.carrierName || item.fullName || item.name"
:value="item.customerName || item.carrierName || item.fullName || item.name"
:label="item.customerName || item.carrierName || item.fullName || item.name"
:value="item.customerName || item.carrierName || item.fullName || item.name"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="isRoadTransport"
label="司机"
:required="form.carrierType === '自运'"
>
<el-select
v-model="form.driverName"
placeholder="请选择或输入司机"
filterable
clearable
allow-create
default-first-option
:loading="taskDriverLoading"
:disabled="dialogReadonly"
@visible-change="visible => visible && loadTaskDriverOptions()"
@change="handleTaskDriverChange"
>
<el-option
v-for="item in taskDriverOptions"
:key="item.id || item.driverName || item.mobile"
:label="item.driverName || item.name"
:value="item.driverName || item.name"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="isRoadTransport"
label="手机号"
:required="form.carrierType === '自运'"
>
<el-input
v-model="form.driverPhone"
placeholder="请输入手机号"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="isRoadTransport"
label="司机"
:required="form.carrierType === '自运'"
>
<el-select
v-model="form.driverName"
placeholder="请选择或输入司机"
filterable
clearable
allow-create
default-first-option
:loading="taskDriverLoading"
:disabled="dialogReadonly"
@visible-change="visible => visible && loadTaskDriverOptions()"
@change="handleTaskDriverChange"
>
<el-option
v-for="item in taskDriverOptions"
:key="item.id || item.driverName || item.mobile"
:label="item.driverName || item.name"
:value="item.driverName || item.name"
</el-form-item>
<el-form-item :label="transportVehicleNoLabel" required>
<el-input
v-model="form.vehicleNo"
:placeholder="`请输入${transportVehicleNoLabel}`"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="isRoadTransport"
label="手机号"
:required="form.carrierType === '自运'"
>
<el-input
v-model="form.driverPhone"
placeholder="请输入手机号"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item :label="transportVehicleNoLabel" required>
<el-input
v-model="form.vehicleNo"
:placeholder="`请输入${transportVehicleNoLabel}`"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="isNonRoadTransport" label="船长">
<el-input
v-model="form.captainName"
placeholder="请输入船长"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="isNonRoadTransport && isCarrierMode" label="联系电话">
<el-input
v-model="form.driverPhone"
placeholder="请输入联系电话"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="isNonRoadTransport" label="箱号">
<el-input
v-model="form.containerNo"
placeholder="请输入箱号"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="isNonRoadTransport" label="舱位">
<el-input
v-model="form.cabinNo"
placeholder="请输入舱位"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="showRoadEscortFields" label="挂车车牌号">
<el-input
v-model="form.trailerVehicleNo"
placeholder="请输入挂车车牌号"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="showRoadEscortFields" label="押运人">
<el-input
v-model="form.escortName"
placeholder="请输入押运人"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="showRoadEscortFields" label="押运人手机号">
<el-input
v-model="form.escortPhone"
placeholder="请输入押运人手机号"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item label="货物类型" required>
<el-cascader
v-model="form.cargoTypePath"
:options="transportCargoTypeOptions"
:props="transportCargoTypeCascaderProps"
placeholder="请选择到二级"
clearable
filterable
:disabled="dialogReadonly"
:filter-method="filterBillingCargoType"
@visible-change="visible => visible && ensureBillingCargoTypeOptions()"
@change="handleTaskCargoTypeChange"
/>
</el-form-item>
<el-form-item label="货物名称">
<el-select
v-model="form.cargoName"
placeholder="请选择或输入货物"
filterable
allow-create
default-first-option
clearable
:disabled="dialogReadonly || !form.cargoType"
:loading="taskCargoLoading"
@visible-change="visible => visible && loadTaskCargoOptionsForForm()"
@change="handleTaskCargoChange"
>
<el-option
v-for="item in taskCargoOptions"
:key="item.id || item.cargoCode || item.cargoName"
:label="formatBillingCargoTypeLabel(item)"
:value="formatBillingCargoTypeLabel(item)"
</el-form-item>
<el-form-item v-if="isNonRoadTransport" label="船长">
<el-input
v-model="form.captainName"
placeholder="请输入船长"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-select>
</el-form-item>
<el-form-item label="规格">
<el-input
v-model="form.specification"
placeholder="选择货物自动回填"
clearable
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item label="号">
<el-input
v-model="form.model"
placeholder="选择货物自动回填"
clearable
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item label="数量">
<el-input
v-model="form.quantity"
placeholder="请输入数量"
clearable
:disabled="dialogReadonly"
@input="value => handleTaskNumberInput('quantity', value)"
>
<template #append>
<el-select
v-model="form.quantityUnit"
class="business-crud-page__append-select business-crud-page__append-select--wide"
placeholder="单位"
:disabled="dialogReadonly"
@visible-change="visible => visible && loadTaskQuantityUnitOptions()"
>
<el-option
v-for="item in taskQuantityUnitOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
</el-input>
</el-form-item>
<el-form-item label="里程(km)">
<el-input
v-model="form.mileage"
placeholder="请输入里程"
clearable
maxlength="10"
inputmode="numeric"
:disabled="dialogReadonly"
@input="handleTaskMileageInput"
/>
</el-form-item>
<el-form-item :label="isRoadTransport ? '计划发货日期' : '预计发货日期'">
<el-date-picker
v-model="form.estimatedStartTime"
type="date"
placeholder="请选择预计发货日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item :label="isRoadTransport ? '计划完成日期' : '预计完成日期'">
<el-date-picker
v-model="form.estimatedEndTime"
type="date"
placeholder="请选择预计完成日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item label="单价">
<el-input
v-model="form.unitPrice"
placeholder="请输入单价"
clearable
:disabled="dialogReadonly"
@input="value => handleTaskNumberInput('unitPrice', value)"
>
<template #append>
<el-select
v-model="form.priceUnit"
class="business-crud-page__append-select business-crud-page__append-select--wide"
placeholder="单位"
:disabled="dialogReadonly"
@visible-change="visible => visible && loadTaskFeeUnitOptions()"
>
<el-option
v-for="item in taskFeeUnitOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
</el-input>
</el-form-item>
<el-form-item label="其他费用合计">
<el-input
v-model="form.otherFeeTotal"
placeholder="请输入其他费用合计"
clearable
:disabled="dialogReadonly"
@input="value => handleTaskNumberInput('otherFeeTotal', value)"
/>
</el-form-item>
<el-form-item label="备注" class="business-crud-page__task-remark">
<el-input
v-model="form.taskRemark"
type="textarea"
:rows="2"
maxlength="200"
show-word-limit
placeholder="请输入备注,200字以内"
:disabled="dialogReadonly"
/>
</el-form-item>
</el-form-item>
<el-form-item v-if="isNonRoadTransport && isCarrierMode" label="联系电话">
<el-input
v-model="form.driverPhone"
placeholder="请输入联系电话"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="isNonRoadTransport" label="箱号">
<el-input
v-model="form.containerNo"
placeholder="请输入箱号"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="isNonRoadTransport" label="舱位">
<el-input
v-model="form.cabinNo"
placeholder="请输入舱位"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="showRoadEscortFields" label="挂车车牌号">
<el-input
v-model="form.trailerVehicleNo"
placeholder="请输入挂车车牌号"
clearable
maxlength="30"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="showRoadEscortFields" label="押运人">
<el-input
v-model="form.escortName"
placeholder="请输入押运人"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item v-if="showRoadEscortFields" label="押运人手机号">
<el-input
v-model="form.escortPhone"
placeholder="请输入押运人手机号"
clearable
maxlength="20"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item label="货物类型" required>
<el-cascader
v-model="form.cargoTypePath"
:options="transportCargoTypeOptions"
:props="transportCargoTypeCascaderProps"
placeholder="请选择到二级"
clearable
filterable
:disabled="dialogReadonly"
:filter-method="filterBillingCargoType"
@visible-change="visible => visible && ensureBillingCargoTypeOptions()"
@change="handleTaskCargoTypeChange"
/>
</el-form-item>
<el-form-item label="货物名称">
<el-select
v-model="form.cargoName"
placeholder="请选择或输入货物"
filterable
allow-create
default-first-option
clearable
:disabled="dialogReadonly || !form.cargoType"
:loading="taskCargoLoading"
@visible-change="visible => visible && loadTaskCargoOptionsForForm()"
@change="handleTaskCargoChange"
>
<el-option
v-for="item in taskCargoOptions"
:key="item.id || item.cargoCode || item.cargoName"
:label="formatBillingCargoTypeLabel(item)"
:value="formatBillingCargoTypeLabel(item)"
/>
</el-select>
</el-form-item>
<el-form-item label="规格">
<el-input
v-model="form.specification"
placeholder="选择货物自动回填"
clearable
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item label="型号">
<el-input
v-model="form.model"
placeholder="选择货物自动回填"
clearable
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item label="数量">
<el-input
v-model="form.quantity"
placeholder="请输入数量"
clearable
:disabled="dialogReadonly"
@input="value => handleTaskNumberInput('quantity', value)"
>
<template #append>
<el-select
v-model="form.quantityUnit"
class="business-crud-page__append-select business-crud-page__append-select--wide"
placeholder="单位"
:disabled="dialogReadonly"
@visible-change="visible => visible && loadTaskQuantityUnitOptions()"
>
<el-option
v-for="item in taskQuantityUnitOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
</el-input>
</el-form-item>
<el-form-item label="里程(km)">
<el-input
v-model="form.mileage"
placeholder="请输入里程"
clearable
maxlength="10"
inputmode="numeric"
:disabled="dialogReadonly"
@input="handleTaskMileageInput"
/>
</el-form-item>
<el-form-item :label="isRoadTransport ? '计划发货日期' : '预计发货日期'">
<el-date-picker
v-model="form.estimatedStartTime"
type="date"
placeholder="请选择预计发货日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item :label="isRoadTransport ? '计划完成日期' : '预计完成日期'">
<el-date-picker
v-model="form.estimatedEndTime"
type="date"
placeholder="请选择预计完成日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
:disabled="dialogReadonly"
/>
</el-form-item>
<el-form-item label="单价">
<el-input
v-model="form.unitPrice"
placeholder="请输入单价"
clearable
:disabled="dialogReadonly"
@input="value => handleTaskNumberInput('unitPrice', value)"
>
<template #append>
<el-select
v-model="form.priceUnit"
class="business-crud-page__append-select business-crud-page__append-select--wide"
placeholder="单位"
:disabled="dialogReadonly"
@visible-change="visible => visible && loadTaskFeeUnitOptions()"
>
<el-option
v-for="item in taskFeeUnitOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
</el-input>
</el-form-item>
<el-form-item label="其他费用合计">
<el-input
v-model="form.otherFeeTotal"
placeholder="请输入其他费用合计"
clearable
:disabled="dialogReadonly"
@input="value => handleTaskNumberInput('otherFeeTotal', value)"
/>
</el-form-item>
<el-form-item label="备注" class="business-crud-page__task-remark">
<el-input
v-model="form.taskRemark"
type="textarea"
:rows="2"
maxlength="200"
show-word-limit
placeholder="请输入备注,200字以内"
:disabled="dialogReadonly"
/>
</el-form-item>
</template>
</el-form>
</div>
@@ -2285,7 +2285,7 @@
</template>
<template v-else>
<el-link type="primary" v-if="showDetailButton(row)" @click="openDetail(row)"
>详情</el-link
>详情</el-link
>
<el-link
type="primary"
@@ -2376,8 +2376,8 @@
><strong>{{
detailRow.departureName || detailRow.departureAddress || '-'
}}</strong
><b class="end"></b
><strong>{{ detailRow.arrivalName || detailRow.arrivalAddress || '-' }}</strong>
><b class="end"></b
><strong>{{ detailRow.arrivalName || detailRow.arrivalAddress || '-' }}</strong>
</div>
<div class="business-crud-page__waybill-route-text">
{{ detailRow.departureAddress || '-' }}  {{ detailRow.arrivalAddress || '-' }}
@@ -2417,7 +2417,7 @@
<el-table-column prop="deviceCode" label="设备编码" min-width="130" />
<el-table-column prop="brand" label="品牌" min-width="110" />
<el-table-column label="规格型号" min-width="140"
><template #default="{ row }">{{
><template #default="{ row }">{{
[row.specification, row.model].filter(Boolean).join('/') || '-'
}}</template></el-table-column
>
@@ -2439,13 +2439,13 @@
>
<span>司机</span
><strong
>{{ detailRow.driverName || '-' }} {{ detailRow.driverPhone || '' }}</strong
>
>{{ detailRow.driverName || '-' }} {{ detailRow.driverPhone || '' }}</strong
>
</div>
<div class="business-crud-page__waybill-detail-field">
<span>{{
waybillIsRoadTransport(detailRow) ? '车牌号' : '航班号/船次号/班列号'
}}</span
waybillIsRoadTransport(detailRow) ? '车牌号' : '航班号/船次号/班列号'
}}</span
><strong>{{ detailRow.vehicleNo || '-' }}</strong>
</div>
<div
@@ -2460,8 +2460,8 @@
>
<span>押运人</span
><strong
>{{ detailRow.escortName || '-' }} {{ detailRow.escortPhone || '' }}</strong
>
>{{ detailRow.escortName || '-' }} {{ detailRow.escortPhone || '' }}</strong
>
</div>
<div
v-if="!waybillIsRoadTransport(detailRow)"
@@ -2514,7 +2514,7 @@
v-for="(node, index) in waybillDetailProcessNodes"
:key="node.key || index"
:timestamp="node.time || ''"
>{{ node.name || node.nodeName || node.label }}</el-timeline-item
>{{ node.name || node.nodeName || node.label }}</el-timeline-item
>
</el-timeline>
<el-empty v-else description="暂无打卡详情" :image-size="50" />
@@ -2550,7 +2550,7 @@
<template #extra>
<div class="business-crud-page__waybill-track-actions">
<el-button plain @click="handleWaybillTrackAction('playback')"
>轨迹回放</el-button
>轨迹回放</el-button
>
<el-button plain @click="handleWaybillTrackAction('locate')">实时定位</el-button>
</div>
@@ -2924,7 +2924,7 @@
<el-button type="primary">添加附件</el-button>
</el-upload>
<span class="business-crud-page__import-file-tip"
>请上传计划明细表仅支持 Excel 格式</span
>请上传计划明细表仅支持 Excel 格式</span
>
<el-link type="primary" @click="handleTransportPlanTemplate">下载模板</el-link>
</el-form-item>
@@ -3030,7 +3030,7 @@
type="primary"
:loading="transportPlanImportLoading"
@click="submitTransportPlanImport"
>提交</el-button
>提交</el-button
>
<el-button @click="transportPlanImportBox = false">返回</el-button>
</template>
@@ -3835,7 +3835,7 @@
<el-table-column label="操作" width="100" align="center" fixed="right">
<template #default="{ $index }">
<el-link type="danger" @click="removeDispatchItemAttachment($index)"
>删除</el-link
>删除</el-link
>
</template>
</el-table-column>
@@ -4505,7 +4505,7 @@
<div class="business-crud-page__map-info">
<span>{{ transportMapStatus }}</span>
<span v-if="transportMapSelected.regionName"
>行政区划{{ transportMapSelected.regionName }}</span
>行政区划{{ transportMapSelected.regionName }}</span
>
</div>
<template #footer>
@@ -5422,9 +5422,9 @@ export default {
this.getDispatchQuantityUnit(row),
'total',
row.quantity ||
row.cargoQuantity ||
row.goodsQuantity ||
row.totalQuantity ||
row.cargoQuantity ||
row.goodsQuantity ||
row.totalQuantity ||
row.totalCargoQuantity
);
});
@@ -6206,8 +6206,8 @@ export default {
const taskInfo = this.parseJsonObject(this.detailRow.taskInfoJson);
this.waybillRouteChangeRecords = Array.isArray(taskInfo.routeChangeRecords)
? [...taskInfo.routeChangeRecords].sort((a, b) =>
String(b.changeTime).localeCompare(String(a.changeTime))
)
String(b.changeTime).localeCompare(String(a.changeTime))
)
: [];
},
openWaybillRouteChangeDialog() {
@@ -6302,8 +6302,8 @@ export default {
const content = changed
? `${row.waybillNo || '运单'}:发货地 ${row.originalDepartureAddress || '-'}${
row.departureAddress || '-'
}到货地 ${row.originalArrivalAddress || '-'} ${row.arrivalAddress || '-'}`
row.departureAddress || '-'
}到货地 ${row.originalArrivalAddress || '-'} ${row.arrivalAddress || '-'}`
: '调整运输路线顺序';
const records = [
{
@@ -8031,21 +8031,21 @@ export default {
const goodsRows = this.isTaskFullMode
? this.transportCargoRows.map(item => this.normalizeTransportCargoRow(item))
: [
{
cargoType: row.cargoType,
cargoTypeCode: row.cargoTypeCode,
cargoTypePath: row.cargoTypePath,
cargoName: row.cargoName,
specification: row.specification,
model: row.model,
quantity: row.quantity,
quantityUnit: row.quantityUnit,
mileage: row.mileage,
unitPrice: row.unitPrice,
priceUnit: row.priceUnit,
remark: row.taskRemark,
},
];
{
cargoType: row.cargoType,
cargoTypeCode: row.cargoTypeCode,
cargoTypePath: row.cargoTypePath,
cargoName: row.cargoName,
specification: row.specification,
model: row.model,
quantity: row.quantity,
quantityUnit: row.quantityUnit,
mileage: row.mileage,
unitPrice: row.unitPrice,
priceUnit: row.priceUnit,
remark: row.taskRemark,
},
];
if (this.isTaskFullMode) {
const firstCargo = goodsRows[0] || {};
taskInfo.unitPrice = firstCargo.unitPrice || '';
@@ -9398,8 +9398,8 @@ export default {
const children =
level === 1
? (cargoType.children || [])
.map(item => this.normalizeBillingCargoTypeNode(item, level + 1, path))
.filter(Boolean)
.map(item => this.normalizeBillingCargoTypeNode(item, level + 1, path))
.filter(Boolean)
: [];
return {
...cargoType,
@@ -9466,8 +9466,8 @@ export default {
const children =
level === 1
? (region.children || [])
.map(item => this.normalizeBillingMatchRegionNode(item, level + 1))
.filter(Boolean)
.map(item => this.normalizeBillingMatchRegionNode(item, level + 1))
.filter(Boolean)
: [];
return {
...region,
@@ -11008,8 +11008,8 @@ export default {
mode === 'draft'
? '生成草稿成功'
: shouldCompletePlan
? '确认生成成功,运输计划已完成'
: '确认生成成功';
? '确认生成成功,运输计划已完成'
: '确认生成成功';
this.$message.success(message);
this.dispatchBox = false;
this.onLoad(this.page, this.query);
+1 -1
View File
@@ -2348,7 +2348,7 @@ export default {
.loading-detail {
display: flex;
flex-direction: column;
gap: 8px;
//gap: 8px;
color: #303133;
.loading-detail__summary { display: flex; align-items: center; flex-wrap: wrap; gap: 24px; padding: 4px 0 16px; }
.loading-detail__heading { font-size: 20px; font-weight: 600; margin-right: 8px; }
+1 -1
View File
@@ -416,7 +416,7 @@ export default {
.master-list-panel {
background: #fff;
.toolbar {
padding: 12px 12px 0;
padding: 8px;
}
}
.master-card {
+84 -115
View File
@@ -80,106 +80,100 @@
</template>
<template #basicInfo-form>
<div class="process-config-page__section">
<div class="dialog-section-title">基本信息</div>
<el-row :gutter="16">
<el-col :span="8">
<div class="process-config-page__field">
<span
class="process-config-page__field-label process-config-page__field-label--required"
>
配置名称
</span>
<el-input
v-model="form.configName"
:disabled="dialogReadonly"
maxlength="100"
placeholder="请输入"
/>
</div>
</el-col>
<el-col :span="8">
<div class="process-config-page__field">
<span
class="process-config-page__field-label process-config-page__field-label--required"
>
项目
</span>
<el-select
v-model="selectedProjectId"
clearable
filterable
remote
:remote-method="loadProjectOptions"
:loading="projectLoading"
:disabled="dialogReadonly"
placeholder="请选择"
style="width: 100%"
@change="handleProjectChange"
>
<el-option
v-for="item in projectOptions"
:key="item.id"
:label="formatProjectLabel(item)"
:value="String(item.id)"
/>
</el-select>
</div>
</el-col>
<el-col :span="8">
<div class="process-config-page__field">
<span class="process-config-page__field-label">运输完成时限</span>
<div class="process-config-page__finish-days">
<span>默认</span>
<section-card title="基本信息">
<el-form
:model="form"
label-position="right"
label-width="calc(6em + 24px)"
>
<el-row :gutter="18">
<el-col :span="6">
<el-form-item label="配置名称" required>
<el-input
v-model="form.defaultFinishDays"
v-model="form.configName"
:disabled="dialogReadonly"
maxlength="3"
maxlength="100"
placeholder="请输入"
@input="handleFinishDaysInput"
/>
<span>天后完成运输</span>
</div>
</div>
</el-col>
<el-col :span="24">
<div class="process-config-page__field">
<span class="process-config-page__field-label">备注</span>
<el-input
v-model="form.remark"
type="textarea"
:rows="4"
:disabled="dialogReadonly"
maxlength="500"
show-word-limit
placeholder="请输入"
/>
</div>
</el-col>
</el-row>
</div>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="项目" required>
<el-select
v-model="selectedProjectId"
clearable
filterable
remote
:remote-method="loadProjectOptions"
:loading="projectLoading"
:disabled="dialogReadonly"
placeholder="请选择"
style="width: 100%"
@change="handleProjectChange"
>
<el-option
v-for="item in projectOptions"
:key="item.id"
:label="formatProjectLabel(item)"
:value="String(item.id)"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="运输完成时限">
<div class="process-config-page__finish-days">
<span>默认</span>
<el-input
v-model="form.defaultFinishDays"
:disabled="dialogReadonly"
maxlength="3"
placeholder="请输入"
@input="handleFinishDaysInput"
/>
<span>天后完成运输</span>
</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注">
<el-input
v-model="form.remark"
type="textarea"
:rows="4"
:disabled="dialogReadonly"
maxlength="500"
show-word-limit
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</section-card>
</template>
<template #nodeConfigJson-form>
<div class="process-config-page__custom-form">
<div class="dialog-section-title">现行过程节点</div>
<div class="process-config-page__timeline" v-if="enabledNodes.length">
<div class="process-config-page__timeline-line"></div>
<div
v-for="node in enabledNodes"
:key="node.key"
class="process-config-page__timeline-item"
>
<span class="process-config-page__timeline-dot"></span>
<div class="process-config-page__timeline-name">{{ node.name }}</div>
<div class="process-config-page__timeline-desc">
<div v-for="text in timelineDescriptions(node)" :key="text">{{ text }}</div>
<section-card title="现行过程节点">
<div class="process-config-page__timeline" v-if="enabledNodes.length">
<div class="process-config-page__timeline-line"></div>
<div
v-for="node in enabledNodes"
:key="node.key"
class="process-config-page__timeline-item"
>
<span class="process-config-page__timeline-dot"></span>
<div class="process-config-page__timeline-name">{{ node.name }}</div>
<div class="process-config-page__timeline-desc">
<div v-for="text in timelineDescriptions(node)" :key="text">{{ text }}</div>
</div>
</div>
</div>
</div>
<el-empty v-else description="请在节点设置中勾选过程节点" :image-size="72" />
<el-empty v-else description="请在节点设置中勾选过程节点" :image-size="72" />
</section-card>
<div class="dialog-section-title">节点设置</div>
<section-card title="节点设置">
<el-table
class="process-config-page__node-table"
border
@@ -363,6 +357,7 @@
</template>
</el-table-column>
</el-table>
</section-card>
</div>
</template>
@@ -1106,32 +1101,6 @@ export default {
<style lang="scss" scoped>
.process-config-page {
&__section {
width: 100%;
}
&__field {
display: flex;
align-items: flex-start;
gap: 10px;
margin-bottom: 16px;
}
&__field-label {
flex: 0 0 150px;
line-height: 32px;
color: #303133;
font-weight: 500;
text-align: right;
white-space: nowrap;
&--required::before {
margin-right: 4px;
color: #f56c6c;
content: '*';
}
}
&__node-value {
white-space: normal;
word-break: break-all;
+5 -5
View File
@@ -1908,7 +1908,7 @@ export default {
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
column-gap: 72px;
row-gap: 0;
margin-bottom: 16px;
margin-bottom: 12px;
background: #fff;
border-radius: 0 0 6px 6px;
padding: 14px 16px 4px;
@@ -1934,7 +1934,7 @@ export default {
&__table {
width: 100%;
margin-bottom: 16px;
margin-bottom: 12px;
background: #fff;
border-radius: 0 0 6px 6px;
padding: 12px;
@@ -1952,7 +1952,7 @@ export default {
}
&__textarea-list {
margin-bottom: 16px;
margin-bottom: 12px;
background: #fff;
border-radius: 0 0 6px 6px;
padding: 14px 16px 4px;
@@ -1975,7 +1975,7 @@ export default {
}
&__material-card {
margin-bottom: 16px;
margin-bottom: 12px;
background: #fff;
border-radius: 6px;
padding: 14px 16px;
@@ -2016,7 +2016,7 @@ export default {
margin: 0 0 16px;
background: #fff;
border-radius: 6px;
padding: 12px;
padding: 12px 0;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
}
+3 -3
View File
@@ -200,7 +200,7 @@ export default {
prop: 'oldData',
type: 'textarea',
span: 24,
minRows: 3,
minRows: 2,
hide: true,
},
{
@@ -208,7 +208,7 @@ export default {
prop: 'newData',
type: 'textarea',
span: 24,
minRows: 3,
minRows: 2,
hide: true,
},
{
@@ -216,7 +216,7 @@ export default {
prop: 'recordResult',
type: 'textarea',
span: 24,
minRows: 3,
minRows: 2,
hide: true,
},
{
+1 -1
View File
@@ -153,7 +153,7 @@ const option = reactive({
url: 'link',
},
hide: true,
minRows: 4,
minRows: 2,
span: 24,
},
],
+1 -1
View File
@@ -155,7 +155,7 @@ export default {
url: 'link',
},
hide: true,
minRows: 4,
minRows: 2,
span: 24,
},
+18 -6
View File
@@ -21,12 +21,24 @@
<el-tag>{{ row.suspensionState === 1 ? '激活' : '挂起' }}</el-tag>
</template>
</avue-crud>
<el-dialog title="流程删除" append-to-body v-model="followBox" width="20%">
<el-form :model="form" ref="form" label-width="auto">
<el-form-item label="删除理由">
<el-input v-model="deleteReason" placeholder="请输入删除理由" />
</el-form-item>
</el-form>
<el-dialog
title="流程删除"
append-to-body
v-model="followBox"
width="400px"
class="dialog-form--carded"
>
<section-card title="删除理由">
<el-form :model="form" ref="form" label-position="right" label-width="calc(6em + 24px)">
<el-row :gutter="18">
<el-col :span="24">
<el-form-item label="删除理由">
<el-input v-model="deleteReason" placeholder="请输入删除理由" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</section-card>
<template #footer>
<span class="dialog-footer">
<el-button @click="followBox = false"> </el-button>
+26 -14
View File
@@ -81,20 +81,32 @@
</span>
</template>
</el-dialog>
<el-dialog title="流程变更" append-to-body v-model="stateBox" width="20%">
<el-form :model="form" ref="form" label-width="auto">
<el-form-item label="流程状态">
<el-select v-model="flowState" placeholder="请选择" value="">
<el-option
v-for="item in stateOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<el-dialog
title="流程变更"
append-to-body
v-model="stateBox"
width="400px"
class="dialog-form--carded"
>
<section-card title="流程状态">
<el-form :model="form" ref="form" label-position="right" label-width="calc(6em + 24px)">
<el-row :gutter="18">
<el-col :span="24">
<el-form-item label="流程状态">
<el-select v-model="flowState" placeholder="请选择" value="">
<el-option
v-for="item in stateOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</section-card>
<template #footer>
<span class="dialog-footer">
<el-button @click="stateBox = false"> </el-button>
+81 -43
View File
@@ -61,38 +61,60 @@
</el-drawer>
<!-- 手动锁定用户 -->
<el-dialog title="锁定用户" append-to-body v-model="lockUserBox" width="500px">
<el-form :model="lockUserForm" label-width="auto" :rules="lockUserRules" ref="lockUserFormRef">
<el-form-item label="用户账号">
<el-input :model-value="lockUserForm.account" disabled />
</el-form-item>
<el-form-item label="锁定原因" prop="lockReason">
<el-input
v-model="lockUserForm.lockReason"
type="textarea"
:rows="3"
placeholder="请输入锁定原因"
/>
</el-form-item>
<el-form-item label="锁定开始" prop="lockBeginTime">
<el-date-picker
v-model="lockUserForm.lockBeginTime"
type="datetime"
placeholder="不填则立即生效"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="锁定结束" prop="lockEndTime">
<el-date-picker
v-model="lockUserForm.lockEndTime"
type="datetime"
placeholder="不填则永久锁定"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
</el-form>
<el-dialog
title="锁定用户"
append-to-body
v-model="lockUserBox"
width="520px"
class="dialog-form--carded"
>
<section-card title="锁定信息">
<el-form
:model="lockUserForm"
label-position="right"
label-width="calc(6em + 24px)"
:rules="lockUserRules"
ref="lockUserFormRef"
>
<el-row :gutter="18">
<el-col :span="24">
<el-form-item label="用户账号">
<el-input :model-value="lockUserForm.account" disabled />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="锁定原因" prop="lockReason">
<el-input
v-model="lockUserForm.lockReason"
type="textarea"
:rows="3"
placeholder="请输入锁定原因"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="锁定开始" prop="lockBeginTime">
<el-date-picker
v-model="lockUserForm.lockBeginTime"
type="datetime"
placeholder="不填则立即生效"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="锁定结束" prop="lockEndTime">
<el-date-picker
v-model="lockUserForm.lockEndTime"
type="datetime"
placeholder="不填则永久锁定"
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</section-card>
<template #footer>
<span class="dialog-footer">
<el-button @click="lockUserBox = false"> </el-button>
@@ -102,17 +124,33 @@
</el-dialog>
<!-- 解锁原因确认 -->
<el-dialog title="解锁确认" append-to-body v-model="unlockReasonBox" width="450px">
<el-form :model="unlockReasonForm" label-width="auto">
<el-form-item label="解锁原因">
<el-input
v-model="unlockReasonForm.unlockReason"
type="textarea"
:rows="3"
placeholder="请输入解锁原因(可选)"
/>
</el-form-item>
</el-form>
<el-dialog
title="解锁确认"
append-to-body
v-model="unlockReasonBox"
width="520px"
class="dialog-form--carded"
>
<section-card title="解锁原因">
<el-form
:model="unlockReasonForm"
label-position="right"
label-width="calc(6em + 24px)"
>
<el-row :gutter="18">
<el-col :span="24">
<el-form-item label="解锁原因">
<el-input
v-model="unlockReasonForm.unlockReason"
type="textarea"
:rows="3"
placeholder="请输入解锁原因(可选)"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</section-card>
<template #footer>
<span class="dialog-footer">
<el-button @click="unlockReasonBox = false"> </el-button>
+46 -28
View File
@@ -126,37 +126,55 @@
<el-dialog
:title="title"
v-model="box"
width="50%"
width="560px"
:before-close="beforeClose"
append-to-body
class="dialog-form--carded"
>
<el-form :disabled="view" ref="form" :model="form" label-width="auto">
<!-- 表单字段 -->
<el-form-item label="参数名:" prop="paramName">
<el-input v-model="form.paramName" placeholder="请输入参数名" />
</el-form-item>
<el-form-item prop="paramKey">
<template #label>
<el-tooltip content="参数键为系统内部唯一标识,请勿随意修改" placement="top">
<el-icon style="margin-right: 4px; vertical-align: middle; color: #909399; cursor: pointer"><el-icon-question-filled /></el-icon>
</el-tooltip>
<span>参数键:</span>
</template>
<el-input v-model="form.paramKey" placeholder="请输入参数键" />
</el-form-item>
<el-form-item prop="paramValue">
<template #label>
<el-tooltip content="包含敏感关键词的配置不展示具体数值" placement="top">
<el-icon style="margin-right: 4px; vertical-align: middle; color: #909399; cursor: pointer"><el-icon-question-filled /></el-icon>
</el-tooltip>
<span>参数值:</span>
</template>
<el-input v-model="form.paramValue" placeholder="请输入参数值" />
</el-form-item>
<el-form-item label="备注:" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<section-card title="参数信息">
<el-form
:disabled="view"
ref="form"
:model="form"
label-position="right"
label-width="calc(6em + 24px)"
>
<el-row :gutter="18">
<el-col :span="24">
<el-form-item label="参数名" prop="paramName">
<el-input v-model="form.paramName" placeholder="请输入参数名" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="paramKey">
<template #label>
<el-tooltip content="参数键为系统内部唯一标识,请勿随意修改" placement="top">
<el-icon style="margin-right: 4px; vertical-align: middle; color: #909399; cursor: pointer"><el-icon-question-filled /></el-icon>
</el-tooltip>
<span>参数键</span>
</template>
<el-input v-model="form.paramKey" placeholder="请输入参数键" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="paramValue">
<template #label>
<el-tooltip content="包含敏感关键词的配置不展示具体数值" placement="top">
<el-icon style="margin-right: 4px; vertical-align: middle; color: #909399; cursor: pointer"><el-icon-question-filled /></el-icon>
</el-tooltip>
<span>参数值</span>
</template>
<el-input v-model="form.paramValue" placeholder="请输入参数值" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</section-card>
<!-- 表单按钮 -->
<template #footer>
<span v-if="!view" class="dialog-footer">
+1 -1
View File
@@ -216,7 +216,7 @@ export default {
label: '备注',
prop: 'remark',
span: 24,
minRows: 3,
minRows: 2,
hide: true,
type: 'textarea',
},
+53 -34
View File
@@ -181,27 +181,29 @@
top="5vh"
append-to-body
destroy-on-close
class="user-edit-dialog"
class="user-edit-dialog dialog-form--carded"
>
<template #header>
<span class="dialog-title">{{ userDialogMode === 'add' ? '新增用户' : '编辑用户' }}</span>
</template>
<el-form ref="userFormRef" :model="form" :rules="userRules" label-position="right" label-width="120px">
<el-row :gutter="20">
<el-col :span="6"><el-form-item label="账号名" prop="account"><el-input v-model="form.account" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="名" prop="realName"><el-input v-model="form.realName" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="手机号" prop="phone"><el-input v-model="form.phone" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="邮箱"><el-input v-model="form.email" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="性别"><el-select v-model="form.sex" class="full-width"><el-option label="男" :value="1" /><el-option label="女" :value="2" /><el-option label="未知" :value="3" /></el-select></el-form-item></el-col>
<el-col :span="6"><el-form-item label="岗位" prop="postId"><el-tree-select v-model="form.postId" :data="postList" :props="{ label: 'postName', value: 'id' }" check-strictly class="full-width" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="所属组织" prop="deptId"><el-tree-select v-model="form.deptId" :data="permissionDeptTree" :props="{ label: 'title', value: 'id' }" multiple check-strictly show-checkbox class="full-width" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="工号"><el-input v-model="form.code" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="人员类别"><el-select v-model="form.personCategory" class="full-width"><el-option label="内部员工" :value="1" /><el-option label="承运商" :value="2" /></el-select></el-form-item></el-col>
<el-col :span="18"><el-form-item label="数据权限范围"><el-radio-group v-model="form.dataScopeRange"><el-radio :value="1">仅所属组织</el-radio><el-radio :value="2">全部组织</el-radio><el-radio :value="3">自定义</el-radio></el-radio-group></el-form-item></el-col>
<el-col :span="18" :offset="6"><el-form-item label="数据层级范围"><el-radio-group v-model="form.dataLevelRange"><el-radio :value="1">包含下级</el-radio><el-radio :value="2">仅本级</el-radio></el-radio-group></el-form-item></el-col>
<el-col :span="24"><el-form-item label="备注"><el-input v-model="form.remark" type="textarea" :rows="3" maxlength="200" show-word-limit /></el-form-item></el-col>
</el-row>
</el-form>
<section-card title="用户信息">
<el-form ref="userFormRef" :model="form" :rules="userRules" label-position="right" label-width="calc(6em + 24px)">
<el-row :gutter="18">
<el-col :span="6"><el-form-item label="账号名" prop="account"><el-input v-model="form.account" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="姓名" prop="realName"><el-input v-model="form.realName" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="手机号" prop="phone"><el-input v-model="form.phone" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="邮箱"><el-input v-model="form.email" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="性别"><el-select v-model="form.sex"><el-option label="男" :value="1" /><el-option label="女" :value="2" /><el-option label="未知" :value="3" /></el-select></el-form-item></el-col>
<el-col :span="6"><el-form-item label="岗位" prop="postId"><el-tree-select v-model="form.postId" :data="postList" :props="{ label: 'postName', value: 'id' }" check-strictly /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="所属组织" prop="deptId"><el-tree-select v-model="form.deptId" :data="permissionDeptTree" :props="{ label: 'title', value: 'id' }" multiple check-strictly show-checkbox /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="工号"><el-input v-model="form.code" /></el-form-item></el-col>
<el-col :span="6"><el-form-item label="人员类别"><el-select v-model="form.personCategory"><el-option label="内部员工" :value="1" /><el-option label="承运商" :value="2" /></el-select></el-form-item></el-col>
<el-col :span="18"><el-form-item label="数据权限范围"><el-radio-group v-model="form.dataScopeRange"><el-radio :value="1">仅所属组织</el-radio><el-radio :value="2">全部组织</el-radio><el-radio :value="3">自定义</el-radio></el-radio-group></el-form-item></el-col>
<el-col :span="18" :offset="6"><el-form-item label="数据层级范围"><el-radio-group v-model="form.dataLevelRange"><el-radio :value="1">包含下级</el-radio><el-radio :value="2">仅本级</el-radio></el-radio-group></el-form-item></el-col>
<el-col :span="24"><el-form-item label="备注"><el-input v-model="form.remark" type="textarea" :rows="3" maxlength="200" show-word-limit /></el-form-item></el-col>
</el-row>
</el-form>
</section-card>
<el-tabs class="user-permission-tabs">
<el-tab-pane label="已拥有角色">
<el-table :data="formRoleList" border>
@@ -288,23 +290,40 @@
</el-dialog>
<!-- 管理员修改密码 -->
<el-dialog title="修改密码" append-to-body v-model="passwordBox" width="460px">
<el-form
ref="passwordFormRef"
:model="passwordForm"
:rules="passwordRules"
label-width="auto"
>
<el-form-item label="账号名">
<el-input v-model="passwordForm.account" disabled />
</el-form-item>
<el-form-item label="新密码" prop="password">
<el-input v-model="passwordForm.password" type="password" show-password />
</el-form-item>
<el-form-item label="确认密码" prop="password2">
<el-input v-model="passwordForm.password2" type="password" show-password />
</el-form-item>
</el-form>
<el-dialog
title="修改密码"
append-to-body
v-model="passwordBox"
width="520px"
class="dialog-form--carded"
>
<section-card title="密码信息">
<el-form
ref="passwordFormRef"
:model="passwordForm"
:rules="passwordRules"
label-position="right"
label-width="calc(6em + 24px)"
>
<el-row :gutter="18">
<el-col :span="24">
<el-form-item label="账号名">
<el-input v-model="passwordForm.account" disabled />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="新密码" prop="password">
<el-input v-model="passwordForm.password" type="password" show-password />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="确认密码" prop="password2">
<el-input v-model="passwordForm.password2" type="password" show-password />
</el-form-item>
</el-col>
</el-row>
</el-form>
</section-card>
<template #footer>
<span class="dialog-footer">
<el-button @click="passwordBox = false"> </el-button>
+1 -1
View File
@@ -217,7 +217,7 @@ export default {
label: '备注',
prop: 'remark',
span: 24,
minRows: 3,
minRows: 2,
hide: true,
type: 'textarea',
},
+169 -167
View File
@@ -967,179 +967,181 @@
class="score-detail-dialog"
@closed="resetScoreDialog"
>
<el-form
ref="scoreForm"
:model="currentScore"
label-position="right"
label-width="auto"
:disabled="readonly"
class="score-detail-form"
>
<el-row :gutter="42">
<el-col :span="12">
<el-form-item label="评定日期" required>
<el-date-picker
v-model="currentScore.scoreDate"
type="date"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item label="拟申请总资金使用额度(万元)" required>
<el-input
v-model="currentScore.applyCreditLimit"
maxlength="18"
@input="value => handleScoreDecimalInput('applyCreditLimit', value)"
/>
</el-form-item>
<el-form-item label="最终得分">
<el-input :model-value="formatScoreValue(currentScore.finalScore)" disabled />
</el-form-item>
<el-form-item label="临时额度申请使用期限">
<div class="score-detail-form__range">
<section-card>
<el-form
ref="scoreForm"
:model="currentScore"
label-position="right"
label-width="auto"
:disabled="readonly"
class="score-detail-form"
>
<el-row :gutter="42">
<el-col :span="12">
<el-form-item label="评定日期" required>
<el-date-picker
v-model="currentScore.tempCreditStartDate"
v-model="currentScore.scoreDate"
type="date"
value-format="YYYY-MM-DD"
/>
<span>至</span>
<el-date-picker
v-model="currentScore.tempCreditEndDate"
type="date"
value-format="YYYY-MM-DD"
</el-form-item>
<el-form-item label="拟申请总资金使用额度(万元)" required>
<el-input
v-model="currentScore.applyCreditLimit"
maxlength="18"
@input="value => handleScoreDecimalInput('applyCreditLimit', value)"
/>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="最大资金使用额度(万元)">
<el-input
:model-value="formatScoreValue(currentScore.maxCreditLimit)"
disabled
/>
</el-form-item>
<el-form-item label="信用等级">
<el-input :model-value="formatScoreValue(currentScore.creditLevel)" disabled />
</el-form-item>
<el-form-item label="临时申请额度">
<el-input
v-model="currentScore.tempApplyCreditLimit"
maxlength="18"
@input="value => handleScoreDecimalInput('tempApplyCreditLimit', value)"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="currentScore.remark" maxlength="200" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="评分量化表" required>
<el-select
v-model="currentScore.quantificationId"
filterable
clearable
:loading="scoreQuantificationLoading"
placeholder="请选择评分量化表"
@change="handleScoreQuantificationChange"
>
<el-option
v-for="item in scoreQuantificationOptions"
:key="item.id"
:label="item.name"
:value="String(item.id)"
</el-form-item>
<el-form-item label="最终得分">
<el-input :model-value="formatScoreValue(currentScore.finalScore)" disabled />
</el-form-item>
<el-form-item label="临时额度申请使用期限">
<div class="score-detail-form__range">
<el-date-picker
v-model="currentScore.tempCreditStartDate"
type="date"
value-format="YYYY-MM-DD"
/>
<span>至</span>
<el-date-picker
v-model="currentScore.tempCreditEndDate"
type="date"
value-format="YYYY-MM-DD"
/>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="最大资金使用额度(万元)">
<el-input
:model-value="formatScoreValue(currentScore.maxCreditLimit)"
disabled
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-form-item>
<el-form-item label="信用等级">
<el-input :model-value="formatScoreValue(currentScore.creditLevel)" disabled />
</el-form-item>
<el-form-item label="临时申请额度">
<el-input
v-model="currentScore.tempApplyCreditLimit"
maxlength="18"
@input="value => handleScoreDecimalInput('tempApplyCreditLimit', value)"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="currentScore.remark" maxlength="200" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="评分量化表" required>
<el-select
v-model="currentScore.quantificationId"
filterable
clearable
:loading="scoreQuantificationLoading"
placeholder="请选择评分量化表"
@change="handleScoreQuantificationChange"
>
<el-option
v-for="item in scoreQuantificationOptions"
:key="item.id"
:label="item.name"
:value="String(item.id)"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-table
v-if="currentScore.quantificationId"
ref="scoreCategoryTable"
:data="scoreCategoryRows"
border
:show-header="false"
row-key="categoryCode"
:expand-row-keys="expandedScoreCategoryKeys"
class="score-category-table"
@row-click="toggleScoreCategory"
@expand-change="handleScoreCategoryExpandChange"
>
<el-table-column type="expand" width="1" class-name="score-category-table__expand-column">
<template #default="{ row }">
<el-table
:data="getScoreCategoryDetails(row.categoryCode)"
border
class="score-detail-table score-detail-table--inline"
max-height="520"
>
<el-table-column label="评分项目" prop="itemName" width="150" align="center" />
<el-table-column label="评分标准" min-width="430">
<template #default="{ row: detail }">
<div class="score-standard-cell">
<div class="score-standard-cell__label">请选择:</div>
<el-select
v-model="detail.selectedOption"
filterable
:disabled="readonly"
@change="scoreOptionChange(detail, $event)"
<el-table
v-if="currentScore.quantificationId"
ref="scoreCategoryTable"
:data="scoreCategoryRows"
border
:show-header="false"
row-key="categoryCode"
:expand-row-keys="expandedScoreCategoryKeys"
class="score-category-table"
@row-click="toggleScoreCategory"
@expand-change="handleScoreCategoryExpandChange"
>
<el-table-column type="expand" width="1" class-name="score-category-table__expand-column">
<template #default="{ row }">
<el-table
:data="getScoreCategoryDetails(row.categoryCode)"
border
class="score-detail-table score-detail-table--inline"
max-height="520"
>
<el-table-column label="评分项目" prop="itemName" width="150" align="center" />
<el-table-column label="评分标准" min-width="430">
<template #default="{ row: detail }">
<div class="score-standard-cell">
<div class="score-standard-cell__label">请选择:</div>
<el-select
v-model="detail.selectedOption"
filterable
:disabled="readonly"
@change="scoreOptionChange(detail, $event)"
>
<el-option
v-for="item in parseScoreOptions(detail.optionsJson)"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</template>
</el-table-column>
<el-table-column label="得分说明" prop="scoreDescription" min-width="160" />
<el-table-column label="自评得分" width="130" align="center">
<template #default="{ row: detail }">
<span>{{ formatScoreValue(getSignedScore(detail, 'selfScore')) }}分</span>
</template>
</el-table-column>
<el-table-column label="复评得分" width="150" align="center">
<template #default="{ row: detail }">
<el-input
v-model="detail.reviewScore"
maxlength="10"
inputmode="numeric"
:disabled="readonly || !hasPermission('customer_type_re_cert')"
@input="value => handleScoreDetailScoreInput(detail, 'reviewScore', value)"
>
<el-option
v-for="item in parseScoreOptions(detail.optionsJson)"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</template>
</el-table-column>
<el-table-column label="得分说明" prop="scoreDescription" min-width="160" />
<el-table-column label="自评得分" width="130" align="center">
<template #default="{ row: detail }">
<span>{{ formatScoreValue(getSignedScore(detail, 'selfScore')) }}</span>
</template>
</el-table-column>
<el-table-column label="复评得分" width="150" align="center">
<template #default="{ row: detail }">
<el-input
v-model="detail.reviewScore"
maxlength="10"
inputmode="numeric"
:disabled="readonly || !hasPermission('customer_type_re_cert')"
@input="value => handleScoreDetailScoreInput(detail, 'reviewScore', value)"
>
<template v-if="isMinusScoreDetail(detail) && Number(detail.reviewScore) > 0" #prefix>
-
</template>
<template #suffix>分</template>
</el-input>
</template>
</el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column label="序号" prop="index" width="50" align="center" />
<el-table-column min-width="560">
<template #default="{ row }">
<span class="score-category-table__name">{{ row.categoryName }}</span>
<span>自评:{{ getSignedScore(row, 'selfScore') }}分</span>
<span>复评:{{ getSignedScore(row, 'reviewScore') }}分</span>
</template>
</el-table-column>
<el-table-column width="60" align="center">
<template #default="{ row }">
<el-icon
class="score-category-table__arrow"
:class="{ 'is-expanded': isScoreCategoryExpanded(row.categoryCode) }"
>
<ArrowRight />
</el-icon>
</template>
</el-table-column>
</el-table>
<template v-if="isMinusScoreDetail(detail) && Number(detail.reviewScore) > 0" #prefix>
-
</template>
<template #suffix>分</template>
</el-input>
</template>
</el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column label="序号" prop="index" width="50" align="center" />
<el-table-column min-width="560">
<template #default="{ row }">
<span class="score-category-table__name">{{ row.categoryName }}</span>
<span>自评:{{ getSignedScore(row, 'selfScore') }}分</span>
<span>复评:{{ getSignedScore(row, 'reviewScore') }}分</span>
</template>
</el-table-column>
<el-table-column width="60" align="center">
<template #default="{ row }">
<el-icon
class="score-category-table__arrow"
:class="{ 'is-expanded': isScoreCategoryExpanded(row.categoryCode) }"
>
<ArrowRight />
</el-icon>
</template>
</el-table-column>
</el-table>
</section-card>
<section-card title="证明材料" class="score-material-card">
<template #extra>
@@ -3797,7 +3799,7 @@ export default {
}
.archive-detail-card {
margin-top: 8px;
margin-top: 12px;
}
.archive-tabs {
:deep(.el-tabs__header) {
@@ -3849,7 +3851,7 @@ export default {
.score-category-table {
width: calc(100% - 72px);
margin: 8px 36px 0;
margin: 8px 36px 16px;
:deep(.el-table__body td) {
height: 56px;