feat: sync full workspace including web modules, docs, and configurations to Gitea

Optimized the root .gitignore to exclude virtual environments, node modules,
and temp folders to ensure clean and lightweight version tracking.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
王冕
2026-06-09 18:12:25 +08:00
parent 351688006e
commit a27e3b8e43
1510 changed files with 162044 additions and 1517 deletions

View File

@@ -41,6 +41,7 @@ const Component = function () {
id: 'pair_2',
replaceType: '临时替换',
replaceReason: '客户原因',
replaceFee: '500.00',
replaceReasonDesc: '',
originalPlate: '浙A55555',
originalVin: 'LGHXCAE28M5555555',
@@ -61,6 +62,7 @@ const Component = function () {
id: 'pair_' + pairIdRef.current,
replaceType: undefined,
replaceReason: undefined,
replaceFee: '',
replaceReasonDesc: '',
originalPlate: undefined,
originalVin: '',
@@ -324,10 +326,12 @@ const Component = function () {
return;
}
var incomplete = pairs.find(function (p) {
return !p.originalPlate || !p.replacePlate || !p.replaceType || !p.replaceReason;
if (!p.originalPlate || !p.replacePlate || !p.replaceType || !p.replaceReason) return true;
if (p.replaceReason === '客户原因' && !(p.replaceFee || '').toString().trim()) return true;
return false;
});
if (incomplete) {
message.warning('请完善每条替换的新车、替换类型替换原因');
message.warning('请完善每条替换的新车、替换类型替换原因及客户原因下的替换费用');
return;
}
message.success('已提交 ' + pairs.length + ' 条替换车申请(原型)');
@@ -455,7 +459,7 @@ const Component = function () {
'4.2 被替换车辆信息(只读):车牌号、品牌、型号;品牌/型号占位「选择车辆后自动显示」。',
'4.3 替换说明',
' 4.3.1 替换类型:必填,单选——永久替换、临时替换。',
' 4.3.2 替换原因:必填,单选——客户原因、车辆原因。',
' 4.3.2 替换原因:必填,单选——客户原因、车辆原因;选「客户原因」时右侧展示「替换费用」必填输入框(¥ 前缀,仅数字与小数点)。',
' 4.3.3 替换原因说明:选填,多行文本,最多 500 字,占位「请说明替换原因」,显示字数统计。',
'4.4 替换车辆',
' 4.4.1 新车:必填,单选下拉,支持搜索;未选被替换车时禁用,占位「请先选择被替换车辆」。',
@@ -487,7 +491,7 @@ const Component = function () {
]),
specSection('9. 校验与提示汇总', [
'请选择被替换车辆并完善替换信息',
'请完善每条替换的新车、替换类型替换原因',
'请完善每条替换的新车、替换类型替换原因及客户原因下的替换费用',
'多台替换须为同一客户、同一项目,已忽略不同项目的车辆',
'该新车已在其他替换项中选择',
'请先选择被替换车辆'
@@ -623,7 +627,12 @@ const Component = function () {
placeholder: '请选择',
style: { width: '100%' },
value: pair.replaceReason,
onChange: function (v) { updatePair(pair.id, { replaceReason: v }); },
onChange: function (v) {
updatePair(pair.id, {
replaceReason: v,
replaceFee: v === '客户原因' ? pair.replaceFee : ''
});
},
allowClear: true,
options: [
{ value: '客户原因', label: '客户原因' },
@@ -631,6 +640,24 @@ const Component = function () {
]
})
),
pair.replaceReason === '客户原因'
? renderField(
'替换费用',
true,
React.createElement(Input, {
placeholder: '请输入替换费用',
style: { width: '100%' },
value: pair.replaceFee || '',
addonBefore: '¥',
onChange: function (e) {
var val = e.target.value.replace(/[^\d.]/g, '');
var parts = val.split('.');
if (parts.length > 2) val = parts[0] + '.' + parts.slice(1).join('');
updatePair(pair.id, { replaceFee: val });
}
})
)
: null,
renderField(
'替换原因说明',
false,