This commit is contained in:
1378012178@qq.com 2025-08-05 15:59:27 +08:00
commit 171e8f14e4
12 changed files with 149 additions and 47 deletions

View File

@ -253,4 +253,17 @@
height: calc(100% - @detail-header-height);
}
}
.jeecg-basic-title[data-v-ddd32716] {
position: relative;
display: flex;
padding-left: 7px;
font-size: 16px;
font-weight: 600;
line-height: 24px;
color: rgba(51, 51, 51, 0.88);
cursor: move;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
</style>

View File

@ -25,9 +25,32 @@
</a-button>
</div>
</a-upload>
<a-modal :open="previewVisible" :footer="null" @cancel="handleCancel()">
<img alt="example" style="width: 100%" :src="previewImage" />
</a-modal>
<!-- <img alt="example" style="width: 100%" :src="previewImage" /> -->
<!-- <a-modal :open="previewVisible" width="70%" class="imgView" :footer="null" @cancel="handleCancel()">
<div class="img-container">
<img
alt="example"
class="preview-img"
:src="previewImage"
/>
</div>
</a-modal> -->
<a-modal
:open="previewVisible"
:width="modalWidth"
:bodyStyle="{ padding: 0, display: 'flex', justifyContent: 'center', alignItems: 'center' }"
:footer="null"
@cancel="handleCancel"
:style="{ maxWidth: '90vw' }"
>
<img
ref="previewImgRef"
class="preview-img"
:src="previewImage"
@load="handleImageLoad"
/>
</a-modal>
</div>
</template>
<script lang="ts">
@ -106,6 +129,7 @@
//
const previewVisible = ref<boolean>(false);
//
const multiple = computed(() => {
return props['fileMax'] > 1 || props['fileMax'] === 0;
@ -227,7 +251,8 @@
//
console.log(file);
}
const previewImgRef = ref<HTMLImageElement | null>(null);
const modalWidth = ref('auto');
/**
* 预览图片
*/
@ -247,6 +272,20 @@
previewVisible.value = false;
}
//
const handleImageLoad = () => {
if (!previewImgRef.value) return;
const img = previewImgRef.value;
const maxWidth = window.innerWidth * 0.9; // 90%
const maxHeight = window.innerHeight * 0.8; // 80%
//
const ratio = Math.min(maxWidth / img.naturalWidth, maxHeight / img.naturalHeight, 1);
modalWidth.value = `${img.naturalWidth * ratio}px`;
};
return {
state,
attrs,
@ -262,6 +301,9 @@
handlePreview,
handleCancel,
handleChange,
handleImageLoad,
previewImgRef,
modalWidth,
};
},
});
@ -276,4 +318,27 @@
margin-top: 8px;
color: #666;
}
/* 确保 Modal 内容区域填满 */
.imgView .ant-modal-body {
height: 80vh; /* 限制模态框高度,避免超出屏幕 */
display: flex;
align-items: center;
justify-content: center;
}
/* 图片容器 */
.img-container {
max-width: 100%;
max-height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
/* 图片自适应 */
.preview-img {
max-width: 100%;
max-height: 100%;
object-fit: contain; /* 保持比例,不拉伸 */
}
</style>

View File

@ -1,7 +1,7 @@
export default {
okText: '确认',
closeText: '关闭',
cancelText: '取消',
cancelText: '关闭',
loadingText: '加载中...',
saveText: '保存',
delText: '删除',

View File

@ -414,10 +414,10 @@ const getCardStyle = (index,allSize) => {
var params = {levle,categoryId:data.categoryId,typeId:data.typeId}
if(data.levle == 1){
registerTypeDrawer.value.disableSubmit = false;
registerTypeDrawer.value.edit(params);
registerTypeDrawer.value.add(params);
}else if(data.levle == 2){
registerMedicationDrawer.value.disableSubmit = false;
registerMedicationDrawer.value.edit(params);
registerMedicationDrawer.value.add(params);
}
}
//

View File

@ -1,5 +1,5 @@
<template>
<a-drawer :title="title" :width="width" v-model:visible="visible" :closable="false"
<a-drawer :title="title" :width="width" v-model:visible="visible" :closable="true"
:footer-style="{ textAlign: 'right' }" @close="handleCancel">
<ConfigMaterialCategoryForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></ConfigMaterialCategoryForm>
<template #footer>

View File

@ -21,32 +21,32 @@
</a-col>
<a-col :span="8">
<a-form-item label="货品名称" v-bind="validateInfos.materialName" id="ConfigMaterialInfoForm-materialName" name="materialName">
<a-input v-model:value="formData.materialName" placeholder="请输入货品名称" allow-clear ></a-input>
<a-input v-model:value="formData.materialName" placeholder="请输入货品名称" maxlength="20" allow-clear ></a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="货品编码" v-bind="validateInfos.materialNo" id="ConfigMaterialInfoForm-materialNo" name="materialNo">
<a-input v-model:value="formData.materialNo" placeholder="请输入货品编码" allow-clear ></a-input>
<a-input v-model:value="formData.materialNo" placeholder="请输入货品编码" maxlength="20" allow-clear ></a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="规格型号" v-bind="validateInfos.specificationModel" id="ConfigMaterialInfoForm-specificationModel" name="specificationModel">
<a-input v-model:value="formData.specificationModel" placeholder="请输入规格型号" allow-clear ></a-input>
<a-input v-model:value="formData.specificationModel" placeholder="请输入规格型号" maxlength="20" allow-clear ></a-input>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="销售单价" v-bind="validateInfos.salesUnitPrice" id="ConfigMaterialInfoForm-salesUnitPrice" name="salesUnitPrice">
<a-input-number v-model:value="formData.salesUnitPrice" placeholder="请输入销售单价" style="width: 100%" />
<a-input v-model:value="formData.salesUnitPrice" placeholder="请输入销售单价" maxlength="10" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="参考单价" v-bind="validateInfos.referenceUnitPrice" id="ConfigMaterialInfoForm-referenceUnitPrice" name="referenceUnitPrice">
<a-input-number v-model:value="formData.referenceUnitPrice" placeholder="请输入参考单价" style="width: 100%" />
<a-input v-model:value="formData.referenceUnitPrice" placeholder="请输入参考单价" maxlength="10" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="货品单位" v-bind="validateInfos.materialUnits" id="ConfigMaterialInfoForm-materialUnits" name="materialUnits">
<a-input v-model:value="formData.materialUnits" placeholder="请输入货品单位" allow-clear ></a-input>
<a-input v-model:value="formData.materialUnits" placeholder="请输入货品单位" maxlength="10" allow-clear ></a-input>
</a-form-item>
</a-col>
<a-col :span="8">
@ -66,57 +66,57 @@
</a-col>
<a-col :span="8" v-if="formData.multiUnitSwitch == '1'">
<a-form-item label="二级单位" v-bind="validateInfos.oneUnit" id="ConfigMaterialInfoForm-oneUnit" name="oneUnit">
<a-input v-model:value="formData.oneUnit" placeholder="请输入二级单位" allow-clear ></a-input>
<a-input v-model:value="formData.oneUnit" placeholder="请输入二级单位" maxlength="10" allow-clear ></a-input>
</a-form-item>
</a-col>
<a-col :span="8" v-if="formData.multiUnitSwitch == '1'">
<a-form-item label="二级单位兑换比例" v-bind="validateInfos.oneUnitProportion" id="ConfigMaterialInfoForm-oneUnitProportion" name="oneUnitProportion">
<a-input-number v-model:value="formData.oneUnitProportion" placeholder="请输入二级单位兑换比例" style="width: 100%" />
<a-input-number v-model:value="formData.oneUnitProportion" maxlength="10" placeholder="请输入二级单位兑换比例" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8" v-if="formData.multiUnitSwitch == '1'">
<a-form-item label="二级单位价格" v-bind="validateInfos.oneUnitPrice" id="ConfigMaterialInfoForm-oneUnitPrice" name="oneUnitPrice">
<a-input-number v-model:value="formData.oneUnitPrice" placeholder="请输入二级单位价格" style="width: 100%" />
<a-input-number v-model:value="formData.oneUnitPrice" maxlength="10" placeholder="请输入二级单位价格" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8" v-if="formData.multiUnitSwitch == '1'">
<a-form-item label="一级单位" v-bind="validateInfos.twoUnit" id="ConfigMaterialInfoForm-twoUnit" name="twoUnit">
<a-input v-model:value="formData.twoUnit" placeholder="请输入一级单位" allow-clear ></a-input>
<a-input v-model:value="formData.twoUnit" placeholder="请输入一级单位" maxlength="10" allow-clear ></a-input>
</a-form-item>
</a-col>
<a-col :span="8" v-if="formData.multiUnitSwitch == '1'">
<a-form-item label="一级单位兑换比例" v-bind="validateInfos.twoUnitProportion" id="ConfigMaterialInfoForm-twoUnitProportion" name="twoUnitProportion">
<a-input-number v-model:value="formData.twoUnitProportion" placeholder="请输入一级单位兑换比例" style="width: 100%" />
<a-input-number v-model:value="formData.twoUnitProportion" maxlength="10" placeholder="请输入一级单位兑换比例" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8" v-if="formData.multiUnitSwitch == '1'">
<a-form-item label="一级单位价格" v-bind="validateInfos.twoUnitPrice" id="ConfigMaterialInfoForm-twoUnitPrice" name="twoUnitPrice">
<a-input-number v-model:value="formData.twoUnitPrice" placeholder="请输入一级单位价格" style="width: 100%" />
<a-input-number v-model:value="formData.twoUnitPrice" maxlength="10" placeholder="请输入一级单位价格" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="物料上限" v-bind="validateInfos.upperLimit" id="ConfigMaterialInfoForm-upperLimit" name="twoUnitPrice">
<a-input-number v-model:value="formData.upperLimit" placeholder="请输入物料上限" style="width: 100%" />
<a-form-item label="物料上限" v-bind="validateInfos.upperLimit" id="ConfigMaterialInfoForm-upperLimit" name="upperLimit">
<a-input v-model:value="formData.upperLimit" maxlength="10" placeholder="请输入物料上限" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="物料下限" v-bind="validateInfos.lowerLimit" id="ConfigMaterialInfoForm-lowerLimit" name="twoUnitPrice">
<a-input-number v-model:value="formData.lowerLimit" placeholder="请输入物料下限" style="width: 100%" />
<a-form-item label="物料下限" v-bind="validateInfos.lowerLimit" id="ConfigMaterialInfoForm-lowerLimit" name="lowerLimit">
<a-input v-model:value="formData.lowerLimit" maxlength="10" placeholder="请输入物料下限" style="width: 100%" />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="供应商" v-bind="validateInfos.suppliers" id="ConfigMaterialInfoForm-suppliers" name="suppliers" :labelCol="labelCol3" :wrapperCol="wrapperCol3">
<j-select-multiple placeholder="请选择一级级分类" v-model:value="formData.suppliers" dictCode="nu_config_suppliers_info,suppliers_name,id,supply_state = 1 and del_flag = 0" allow-clear />
<j-select-multiple placeholder="请选择供应商" v-model:value="formData.suppliers" dictCode="nu_config_suppliers_info,suppliers_name,id,del_flag = 0" allow-clear />
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="物料图片" v-bind="validateInfos.materialImg" id="ConfigMaterialInfoForm-materialImg" name="materialImg">
<j-image-upload :fileMax="0" v-model:value="formData.materialImg" ></j-image-upload>
<j-image-upload :fileMax="1" v-model:value="formData.materialImg" ></j-image-upload>
</a-form-item>
</a-col>
<a-col :span="8">
<a-form-item label="物料标识" v-bind="validateInfos.materialIdent" id="ConfigMaterialInfoForm-materialIdent" name="materialIdent">
<j-image-upload :fileMax="0" v-model:value="formData.materialIdent" ></j-image-upload>
<j-image-upload :fileMax="1" v-model:value="formData.materialIdent" ></j-image-upload>
</a-form-item>
</a-col>
</a-row>
@ -183,10 +183,12 @@
//
const validatorRules = reactive({
materialName: [{ required: true, message: '请输入货品名称!'},],
salesUnitPrice: [{ required: true, message: '请输入销售单价!'},],
referenceUnitPrice: [{ required: true, message: '请输入参考单价!'},],
materialUnits: [{ required: true, message: '请输入货品单位!'},],
salesUnitPrice: [{ required: true, message: '请输入销售单价!'},{ pattern: /^\d+(\.\d+)?$/, message: '只能输入数字(可包含小数点)!' }],
referenceUnitPrice: [{ required: true, message: '请输入参考单价!'},{ pattern: /^\d+(\.\d+)?$/, message: '只能输入数字(可包含小数点)!' }],
materialUnits: [{ required: true, message: '请输入货品单位!'}],
suppliers: [{ required: true, message: '请选择供应商!'},],
upperLimit: [{ required: false, message: '请输入物料上限!'},{ pattern: /^\d+(\.\d+)?$/, message: '只能输入数字(可包含小数点)!' }],
lowerLimit: [{ required: false, message: '请输入物料下限!'},{ pattern: /^\d+(\.\d+)?$/, message: '只能输入数字(可包含小数点)!' }],
});
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });

View File

@ -3,7 +3,7 @@
<ConfigMaterialInfoForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></ConfigMaterialInfoForm>
</j-modal>
-->
<a-drawer :title="title" :width="width" v-model:visible="visible" :closable="false"
<a-drawer :title="title" :width="width" v-model:visible="visible" :closable="true"
:footer-style="{ textAlign: 'right' }" @close="handleCancel">
<ConfigMaterialInfoForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></ConfigMaterialInfoForm>
<template #footer>

View File

@ -78,8 +78,8 @@
/**
* 新增
*/
function add() {
edit({});
function add(record) {
edit(record);
}
/**

View File

@ -1,6 +1,6 @@
<template>
<a-drawer :title="title" :width="width" v-model:visible="visible" :closable="false"
<a-drawer :title="title" :width="width" v-model:visible="visible" :closable="true"
:footer-style="{ textAlign: 'right' }" @close="handleCancel">
<ConfigMaterialMedicationForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></ConfigMaterialMedicationForm>
<template #footer>
@ -25,11 +25,11 @@
/**
* 新增
*/
function add() {
function add(record) {
title.value = '新增';
visible.value = true;
nextTick(() => {
registerForm.value.add();
registerForm.value.add(record);
});
}

View File

@ -71,8 +71,8 @@
/**
* 新增
*/
function add() {
edit({});
function add(record) {
edit(record);
}
/**

View File

@ -1,5 +1,5 @@
<template>
<a-drawer :title="title" :width="width" v-model:visible="visible" :closable="false"
<a-drawer :title="title" :width="width" v-model:visible="visible" :closable="true"
:footer-style="{ textAlign: 'right' }" @close="handleCancel">
<ConfigMaterialTypeForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></ConfigMaterialTypeForm>
<template #footer>
@ -24,11 +24,11 @@
/**
* 新增
*/
function add() {
function add(record) {
title.value = '新增';
visible.value = true;
nextTick(() => {
registerForm.value.add();
registerForm.value.add(record);
});
}

View File

@ -96,6 +96,7 @@ export const formSchema: FormSchema[] = [
dynamicRules: ({model,schema}) => {
return [
{ required: true, message: '请输入供应商名称!'},
{ max: 20, message: '不能超过20个字符!' }
];
},
},
@ -112,11 +113,21 @@ export const formSchema: FormSchema[] = [
label: '供应商地址',
field: 'suppliersAddress',
component: 'Input',
dynamicRules: ({model,schema}) => {
return [
{ max: 30, message: '不能超过30个字符!' }
];
},
},
{
label: '负责人',
field: 'personInCharge',
component: 'Input',
dynamicRules: ({model,schema}) => {
return [
{ max: 10, message: '不能超过10个字符!' }
];
},
},
{
label: '联系电话',
@ -125,6 +136,7 @@ export const formSchema: FormSchema[] = [
dynamicRules: ({model,schema}) => {
return [
{ required: true, message: '请输入联系电话!'},
{ max: 11, message: '不能超过11个字符!' }
];
},
},
@ -138,7 +150,7 @@ export const formSchema: FormSchema[] = [
},
dynamicRules: ({model,schema}) => {
return [
{ required: true, message: '请输入供应状态!'},
{ required: true, message: '请选择供应状态!'},
];
},
},
@ -146,17 +158,27 @@ export const formSchema: FormSchema[] = [
label: '开户行',
field: 'openingBank',
component: 'Input',
dynamicRules: ({model,schema}) => {
return [
{ max: 20, message: '不能超过20个字符!' }
];
},
},
{
label: '开户行账号',
field: 'openingBankNo',
component: 'Input',
dynamicRules: ({model,schema}) => {
return [
{ max: 32, message: '不能超过32个字符!' }
];
},
},
{
label: '微信账号',
field: 'wechartId',
component: 'Input',
},
// {
// label: '微信账号',
// field: 'wechartId',
// component: 'Input',
// },
{
label: '资质照片',
field: 'imgPath',