1
0
forked from erp-dev/erp

feat: added print_count api, added merchant setting model, added manual mode setting for purchase order

This commit is contained in:
2025-11-28 15:01:11 +08:00
parent 53f2a24b20
commit 0c62398120
36 changed files with 1634 additions and 478 deletions

View File

@@ -38,6 +38,21 @@ class QuickInputAdmin(admin.ModelAdmin):
list_filter = ('group',)
@admin.register(models.MerchantSetting)
class MerchantSettingAdmin(admin.ModelAdmin):
list_display = (
'merchant', 'key', 'value',
'type', 'val_str', 'val_int',
'val_float', 'val_bool', 'description',
)
list_filter = ('merchant', 'type')
search_fields = ('merchant__name', 'key', 'description')
@admin.display(description='设置值')
def _value(self, obj):
return obj.value()
@admin.register(models.UserProfile)
class UserProfileAdmin(AdminBase):
list_display = ('user', 'merchant')

View File

@@ -0,0 +1,30 @@
# Generated by Django 5.2.7 on 2025-11-28 06:00
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('basic_info', '0013_alter_customer_options'),
]
operations = [
migrations.CreateModel(
name='MerchantSetting',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('id', models.BigAutoField(primary_key=True, serialize=False)),
('key', models.CharField(max_length=100, verbose_name='设置项')),
('val', models.CharField(max_length=100, verbose_name='设置值')),
('description', models.TextField(blank=True, null=True, verbose_name='备注')),
('merchant', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='settings', to='basic_info.merchant', verbose_name='所属商户')),
],
options={
'verbose_name': '商户设置',
'verbose_name_plural': '商户设置',
},
),
]

View File

@@ -0,0 +1,37 @@
# Generated by Django 5.2.7 on 2025-11-28 06:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('basic_info', '0014_merchantsetting'),
]
operations = [
migrations.RemoveField(
model_name='merchantsetting',
name='val',
),
migrations.AddField(
model_name='merchantsetting',
name='val_bool',
field=models.BooleanField(blank=True, null=True, verbose_name='设置值(布尔值)'),
),
migrations.AddField(
model_name='merchantsetting',
name='val_float',
field=models.FloatField(blank=True, null=True, verbose_name='设置值(浮点数)'),
),
migrations.AddField(
model_name='merchantsetting',
name='val_int',
field=models.IntegerField(blank=True, null=True, verbose_name='设置值(整数)'),
),
migrations.AddField(
model_name='merchantsetting',
name='val_str',
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='设置值(字符串)'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.7 on 2025-11-28 06:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('basic_info', '0015_remove_merchantsetting_val_merchantsetting_val_bool_and_more'),
]
operations = [
migrations.AddField(
model_name='merchantsetting',
name='type',
field=models.CharField(choices=[('str', '字符串'), ('int', '整数'), ('float', '浮点数'), ('bool', '布尔值')], default='str', max_length=20, verbose_name='设置类型'),
),
]

View File

@@ -452,3 +452,52 @@ class VehicleTransportRecord(ModelBase):
class Meta:
verbose_name = '司机车次'
verbose_name_plural = '司机车次'
class MerchantSettingTypeEnum(models.TextChoices):
"""商户设置类型枚举"""
STR = 'str', '字符串'
INT = 'int', '整数'
FLOAT = 'float', '浮点数'
BOOL = 'bool', '布尔值'
class MerchantSetting(ModelBase):
id = models.BigAutoField(primary_key=True)
merchant = models.ForeignKey('Merchant', on_delete=models.PROTECT, related_name='settings', verbose_name='所属商户')
key = models.CharField(max_length=100, verbose_name='设置项')
type = models.CharField(
max_length=20,
choices=MerchantSettingTypeEnum.choices,
default=MerchantSettingTypeEnum.STR,
verbose_name='设置类型',
)
val_str = models.CharField(max_length=100, null=True, blank=True, verbose_name='设置值(字符串)')
val_int = models.IntegerField(null=True, blank=True, verbose_name='设置值(整数)')
val_float = models.FloatField(null=True, blank=True, verbose_name='设置值(浮点数)')
val_bool = models.BooleanField(null=True, blank=True, verbose_name='设置值(布尔值)')
description = models.TextField(blank=True, null=True, verbose_name='备注')
@property
def value(self):
if self.type == MerchantSettingTypeEnum.STR:
return self.val_str
elif self.type == MerchantSettingTypeEnum.INT:
return self.val_int
elif self.type == MerchantSettingTypeEnum.FLOAT:
return self.val_float
elif self.type == MerchantSettingTypeEnum.BOOL:
return self.val_bool
raise ValueError(f'Invalid setting type: {self.type}')
def __str__(self):
return f'{self.merchant.name} - {self.key}'
class Meta:
verbose_name = '商户设置'
verbose_name_plural = '商户设置'
class MerchantSettingKeyEnum(models.TextChoices):
"""商户设置项枚举"""
AUTO_CREATE_STOCK_CHANGE_TASKS = 'auto_create_stock_change_tasks', '自动创建出入库记录任务'

View File

@@ -73,3 +73,9 @@ class DataVisibilityService:
return False
return basic_models.WareHouse.objects.filter(id=warehouse_id).filter(merchant=emp.merchant).exists()
class MerchantSettingService:
@staticmethod
def get_setting(merchant: basic_models.Merchant, key: basic_models.MerchantSettingKeyEnum):
return basic_models.MerchantSetting.objects.get(merchant=merchant, key=key)