删除
@@ -242,12 +253,16 @@ import {
delMaterialIssue,
addMaterialIssue,
updateMaterialIssue,
+ inventoryList,
getMaterialName
} from '@/api/materials/materialIssue';
import { MaterialIssueVO, MaterialIssueQuery, MaterialIssueForm } from '@/api/materials/materialIssue/types';
import { useUserStoreHook } from '@/store/modules/user';
import wordllssue from './word/index.vue';
+import { watch, onMounted, onUnmounted, ref, reactive, computed, getCurrentInstance } from 'vue';
+import type { ComponentInternalInstance, ElFormInstance, DialogOption } from 'element-plus';
+
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
// 获取用户 store
const userStore = useUserStoreHook();
@@ -265,6 +280,8 @@ const total = ref(0);
const wordllssueRef = ref
>();
const queryFormRef = ref();
const materialIssueFormRef = ref();
+// 存储每个条目的watch停止函数
+const itemWatchStopFns = ref void>>([]);
const dialog = reactive({
visible: false,
@@ -279,7 +296,7 @@ const getInitFormData = () => {
materialSource: '1',
formCode: undefined,
projectName: undefined,
- materialName: undefined,
+ materialName: '', // 初始化为空字符串
orderingUnit: undefined,
supplierUnit: undefined,
issueUnit: undefined,
@@ -302,13 +319,15 @@ const getInitFormData = () => {
stockQuantity: undefined,
issuedQuantity: undefined,
remainingQuantity: undefined,
- name: undefined,
- remark: undefined
+ name: undefined, // 数量验收的名称
+ remark: undefined,
+ materialsId: undefined
}
]
};
};
-const data = reactive>({
+
+const data = reactive({
form: getInitFormData(),
queryParams: {
pageNum: 1,
@@ -326,43 +345,127 @@ const data = reactive>({
params: {}
},
rules: {
- id: [{ required: true, message: '主键id不能为空', trigger: 'blur' }]
+ formCode: [{ required: true, message: '请输入表单编号', trigger: 'blur' }],
+ projectName: [{ required: true, message: '请输入工程名称', trigger: 'blur' }],
+ materialName: [{ required: true, message: '请先在数量验收列表中选择名称', trigger: 'blur' }], // 确保有名称生成
+ orderingUnit: [{ required: true, message: '请输入订货单位', trigger: 'blur' }],
+ supplierUnit: [{ required: true, message: '请输入供货单位', trigger: 'blur' }],
+ issueUnit: [{ required: true, message: '请输入领料单位', trigger: 'blur' }],
+ storageUnit: [{ required: true, message: '请输入保管单位', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
+const optionsName: any = ref([]);
+
+/**
+ * 核心函数:从数量验收列表提取名称,用逗号拼接生成设备材料名称
+ */
+const computeMaterialName = () => {
+ if (!form.value.itemList || form.value.itemList.length === 0) {
+ form.value.materialName = '';
+ return;
+ }
+ // 过滤空名称,去重(可选,根据业务需求决定是否去重)
+ const validNames = form.value.itemList
+ .filter((item) => item.name && item.name.trim() !== '')
+ .map((item) => item.name.trim())
+ .filter((name, index, self) => self.indexOf(name) === index); // 去重(如需保留重复则删除这行)
+
+ form.value.materialName = validNames.join(',');
+};
/** 查询物料领料单列表 */
const getList = async () => {
loading.value = true;
- const res = await listMaterialIssue(queryParams.value);
- materialIssueList.value = res.rows;
- total.value = res.total;
- loading.value = false;
-};
-const optionsName: any = ref([]);
-
-//获取一起名称
-const getName = async () => {
- const res = await getMaterialName(currentProject.value.id);
- console.log(res);
- if (res.code == 200) {
- optionsName.value = res.data;
+ try {
+ const res = await listMaterialIssue(queryParams.value);
+ materialIssueList.value = res.rows;
+ total.value = res.total;
+ } finally {
+ loading.value = false;
}
};
+// 获取材料名称列表
+const getName = async () => {
+ try {
+ const res = await inventoryList(currentProject.value.id);
+ console.log(res);
+
+ if (res.code == 200) {
+ optionsName.value = res.data;
+ }
+ } catch (error) {
+ proxy?.$modal.msgError('获取材料名称失败');
+ }
+};
+
+// 材料名称选择变化处理(修改select的value为名称,而非ID)
const getNameChange = (value, index, item) => {
- // 这里可以添加处理逻辑
- console.log(value);
+ const selected = optionsName.value.find((opt) => opt.id === value);
+ if (selected) {
+ item.name = selected.materialsName; // 直接赋值名称
+ item.materialsId = selected.id; // 保留ID用于后端
+ item.specification = selected.typeSpecificationName;
+ item.unit = selected.weightId;
+ item.issuedQuantity = selected.number;
+ item.stockQuantity = Number(selected.inventoryNumber) || 0;
+ // calculateRemaining(index); // 计算剩余数量
+ }
+};
- const data = optionsName.value.find((item) => item.id == value);
- console.log(data);
+/** 验证领取数量不能超过库存 */
+const validateIssuedQuantity = (rule, value, callback, index) => {
+ const item = form.value.itemList[index];
+ const stock = Number(item.stockQuantity) || 0;
+ const issued = Number(value) || 0;
- form.value.itemList[index].name = data.materialsName;
- form.value.itemList[index].materialsId = data.id;
- form.value.itemList[index].specification = data.typeSpecificationName;
- form.value.itemList[index].unit = data.weightId;
- form.value.itemList[index].stockQuantity = data.inventoryNumber;
+ if (stock === 0) {
+ callback();
+ return;
+ }
+
+ if (issued > stock) {
+ callback(new Error(`领取数量不能超过库存(${stock})`));
+ } else {
+ callback();
+ }
+};
+
+/** 计算剩余数量(库存 - 领取数量) */
+const calculateRemaining = (index: number) => {
+ const item = form.value.itemList[index];
+ const stock = Number(item.stockQuantity) || 0;
+ const issued = Number(item.issuedQuantity) || 0;
+
+ // 确保领取数量不超过库存
+ if (issued > stock) {
+ item.issuedQuantity = stock;
+ proxy?.$modal.msgWarning(`领取数量不能超过库存(${stock}),已自动调整`);
+ }
+
+ // 计算剩余数量
+ item.remainingQuantity = stock - (item.issuedQuantity || 0);
+};
+
+/** 库存变化时重新计算剩余数量 */
+const handleStockChange = (index: number) => {
+ calculateRemaining(index);
+ // 触发验证
+ if (materialIssueFormRef.value) {
+ materialIssueFormRef.value.validateField(`itemList.${index}.issuedQuantity`);
+ materialIssueFormRef.value.validateField(`itemList.${index}.remainingQuantity`);
+ }
+};
+
+/** 领取数量变化时重新计算剩余数量 */
+const handleIssuedChange = (index: number) => {
+ calculateRemaining(index);
+ // 触发验证
+ if (materialIssueFormRef.value) {
+ materialIssueFormRef.value.validateField(`itemList.${index}.remainingQuantity`);
+ }
};
/** 取消按钮 */
@@ -373,8 +476,38 @@ const cancel = () => {
/** 表单重置 */
const reset = () => {
+ // 停止所有监听
+ itemWatchStopFns.value.forEach((stop) => stop());
+ itemWatchStopFns.value = [];
+
form.value = getInitFormData();
materialIssueFormRef.value?.resetFields();
+
+ // 重新监听初始条目
+ if (form.value.itemList.length > 0) {
+ watchItemChanges(0);
+ }
+ // 初始计算一次材料名称
+ computeMaterialName();
+};
+
+/** 监听条目变化,自动计算剩余数量 */
+const watchItemChanges = (index: number) => {
+ // 停止已有监听
+ if (itemWatchStopFns.value[index]) {
+ itemWatchStopFns.value[index]();
+ }
+
+ // // 监听库存和领取数量变化
+ // const stop = watch(
+ // () => [form.value.itemList[index].stockQuantity, form.value.itemList[index].issuedQuantity],
+ // () => {
+ // calculateRemaining(index);
+ // },
+ // { immediate: true }
+ // );
+
+ itemWatchStopFns.value[index] = stop;
};
/** 搜索按钮操作 */
@@ -401,16 +534,58 @@ const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加物料领料单';
+ // 新增时初始计算材料名称
+ computeMaterialName();
};
/** 修改按钮操作 */
const handleUpdate = async (row?: MaterialIssueVO) => {
reset();
const _id = row?.id || ids.value[0];
- const res = await getMaterialIssue(_id);
- Object.assign(form.value, res.data);
- dialog.visible = true;
- dialog.title = '修改物料领料单';
+ try {
+ const res = await getMaterialIssue(_id);
+ Object.assign(form.value, res.data);
+
+ // 确保itemList存在且格式正确
+ if (!form.value.itemList) {
+ form.value.itemList = [];
+ }
+
+ // 转换数据类型并计算剩余数量
+ form.value.itemList = form.value.itemList.map((item) => ({
+ ...item,
+ stockQuantity: Number(item.stockQuantity) || 0,
+ issuedQuantity: Number(item.issuedQuantity) || 0,
+ remainingQuantity: Number(item.remainingQuantity) || 0,
+ name: item.name || '' // 确保名称不为undefined
+ }));
+
+ // 为每个条目添加监听并强制计算剩余数量
+ form.value.itemList.forEach((_, index) => {
+ watchItemChanges(index);
+ calculateRemaining(index);
+ });
+
+ // 关键:编辑时从itemList重新计算设备材料名称(覆盖后端返回的旧值)
+ computeMaterialName();
+
+ // 手动触发一次验证
+ setTimeout(() => {
+ if (materialIssueFormRef.value) {
+ form.value.itemList.forEach((_, index) => {
+ materialIssueFormRef.value.validateField(`itemList.${index}.issuedQuantity`);
+ materialIssueFormRef.value.validateField(`itemList.${index}.remainingQuantity`);
+ });
+ // 验证设备材料名称
+ materialIssueFormRef.value.validateField('materialName');
+ }
+ }, 0);
+
+ dialog.visible = true;
+ dialog.title = '修改物料领料单';
+ } catch (error) {
+ proxy?.$modal.msgError('获取详情失败');
+ }
};
/** 提交按钮 */
@@ -418,21 +593,38 @@ const submitForm = () => {
materialIssueFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
- if (form.value.id) {
- await updateMaterialIssue(form.value).finally(() => (buttonLoading.value = false));
- } else {
- await addMaterialIssue(form.value).finally(() => (buttonLoading.value = false));
+ try {
+ // 处理提交数据,确保数量为数字类型
+ const submitData = {
+ ...form.value,
+ itemList: form.value.itemList.map((item) => ({
+ ...item,
+ stockQuantity: Number(item.stockQuantity),
+ issuedQuantity: Number(item.issuedQuantity),
+ remainingQuantity: Number(item.remainingQuantity)
+ }))
+ };
+
+ if (form.value.id) {
+ await updateMaterialIssue(submitData);
+ } else {
+ await addMaterialIssue(submitData);
+ }
+ proxy?.$modal.msgSuccess('操作成功');
+ dialog.visible = false;
+ await getList();
+ } catch (error) {
+ proxy?.$modal.msgError('操作失败');
+ } finally {
+ buttonLoading.value = false;
}
- proxy?.$modal.msgSuccess('操作成功');
- dialog.visible = false;
- await getList();
}
});
};
// 添加数量验收条目
const addItem = () => {
- form.value.itemList.push({
+ const newItem = {
id: undefined,
specification: undefined,
unit: undefined,
@@ -440,46 +632,81 @@ const addItem = () => {
issuedQuantity: undefined,
remainingQuantity: undefined,
name: undefined,
- remark: undefined
- });
+ remark: undefined,
+ materialsId: undefined
+ };
+ form.value.itemList.push(newItem);
+ // 监听新条目
+ watchItemChanges(form.value.itemList.length - 1);
+ // 添加后重新计算材料名称
+ computeMaterialName();
};
// 删除数量验收条目
const removeItem = (index: number) => {
if (form.value.itemList.length > 1) {
+ // 停止该条目的监听
+ if (itemWatchStopFns.value[index]) {
+ itemWatchStopFns.value[index]();
+ }
form.value.itemList.splice(index, 1);
+ itemWatchStopFns.value.splice(index, 1);
+ // 删除后重新计算材料名称
+ computeMaterialName();
} else {
proxy?.$modal.msgWarning('至少需要保留一条数量验收记录');
}
};
+
/** 删除按钮操作 */
const handleDelete = async (row?: MaterialIssueVO) => {
const _ids = row?.id || ids.value;
- await proxy?.$modal.confirm('是否确认删除物料领料单编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
- await delMaterialIssue(_ids);
- proxy?.$modal.msgSuccess('删除成功');
- await getList();
+ try {
+ await proxy?.$modal.confirm(`是否确认删除物料领料单编号为"${_ids}"的数据项?`);
+ await delMaterialIssue(_ids);
+ proxy?.$modal.msgSuccess('删除成功');
+ await getList();
+ } catch (error) {
+ // 取消删除不提示
+ } finally {
+ loading.value = false;
+ }
};
+
const handleView = (row) => {
// 查看详情
wordllssueRef.value?.openDialog(row);
};
+
+// 关键:监听数量验收列表变化,实时更新设备材料名称
+watch(
+ () => form.value.itemList,
+ () => {
+ computeMaterialName();
+ },
+ { deep: true, immediate: true } // deep监听数组内部变化,immediate初始执行
+);
+
onMounted(() => {
getList();
getName();
});
-//监听项目id刷新数据
+
+// 监听项目id刷新数据
const listeningProject = watch(
() => currentProject.value?.id,
- (nid, oid) => {
+ (nid) => {
queryParams.value.projectId = nid;
form.value.projectId = nid;
getList();
+ getName();
}
);
onUnmounted(() => {
listeningProject();
+ // 清理所有监听
+ itemWatchStopFns.value.forEach((stop) => stop());
});
diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue
index c9d9247..e8c763e 100644
--- a/src/views/system/dept/index.vue
+++ b/src/views/system/dept/index.vue
@@ -1,7 +1,6 @@
-
+
@@ -9,13 +8,11 @@
-
+
-
+
@@ -31,8 +28,7 @@
- 新增
-
+ 新增
展开/折叠
@@ -41,8 +37,14 @@
-
+
@@ -64,16 +66,13 @@
-
+
-
-
+
+
-
+
@@ -85,9 +84,14 @@
-
+
@@ -108,8 +112,7 @@
-
+
@@ -126,32 +129,17 @@
- {{ dict.label
- }}
+ {{ dict.label }}
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -336,16 +324,6 @@ const handleUpdate = async (row: DeptVO) => {
dialog.title = '修改部门';
};
-const changeProject = async (val: any) => {
- if (val == '4' && (!projectList.value || !projectList.value.length)) {
- const res = await getDeptList();
- projectList.value = res.data;
- } else if (val == '5' && (!contractorList.value || !contractorList.value.length)) {
- const res = await optionProjectSelect(form.value.rowProjectId);
- contractorList.value = res;
- }
-};
-
/** 提交按钮 */
const submitForm = () => {
deptFormRef.value?.validate(async (valid: boolean) => {
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 4eb7e57..da397cf 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -174,8 +174,6 @@
/>
-
-
@@ -186,8 +184,6 @@
-
-
@@ -198,8 +194,6 @@
-
-
@@ -207,15 +201,6 @@
-
-
-
- {{ dict.label }}
-
-
-
-
-
@@ -229,21 +214,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+ {{ dict.label }}
+
-
-
@@ -317,8 +322,9 @@ import { RoleVO } from '@/api/system/role/types';
import { PostVO } from '@/api/system/post/types';
import { globalHeaders } from '@/utils/request';
import { to } from 'await-to-js';
-import { getRoleList, optionselect } from '@/api/system/post';
+import { getProjectByDeptId, getRoleList, optionselect } from '@/api/system/post';
import ShuttleFrame from '../../project/projectRelevancy/component/ShuttleFrame.vue';
+import { listProject } from '@/api/project/project';
const router = useRouter();
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -337,6 +343,8 @@ const enabledDeptOptions = ref([]);
const initPassword = ref('');
const postOptions = ref([]);
const roleOptions = ref([]);
+const projectOptions = ref([]);
+
/*** 用户导入参数 */
const upload = reactive({
// 是否显示弹出层(用户导入)
@@ -383,10 +391,15 @@ const initFormData: UserForm = {
phonenumber: undefined,
email: undefined,
sex: undefined,
+ projectRoles: [
+ {
+ projectId: '',
+ roleIds: []
+ }
+ ],
status: '0',
remark: '',
postIds: [],
- roleIds: [],
filePath: undefined
};
@@ -436,8 +449,7 @@ const initData: PageData = {
message: '请输入正确的手机号码',
trigger: 'blur'
}
- ],
- roleIds: [{ required: true, message: '用户角色不能为空', trigger: 'blur' }]
+ ]
}
};
const data = reactive>(initData);
@@ -473,6 +485,8 @@ const getDeptTree = async () => {
const res = await api.deptTreeSelect({ isShow: '1' });
deptOptions.value = res.data;
enabledDeptOptions.value = filterDisabledDept(res.data);
+ const projectList = await listProject();
+ projectOptions.value = projectList.rows;
};
/** 过滤禁用的部门 */
@@ -494,6 +508,19 @@ const handleNodeClick = (data: DeptVO) => {
handleQuery();
};
+/** 部门选择变化 */
+const handleAddProject = () => {
+ form.value.projectRoles.push({
+ projectId: '',
+ roleIds: []
+ });
+};
+
+/** 删除项目 */
+const delProject = (index: number) => {
+ form.value.projectRoles.splice(index, 1);
+};
+
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
@@ -609,6 +636,13 @@ function submitFileForm() {
/** 重置操作表单 */
const reset = () => {
form.value = { ...initFormData };
+ form.value.projectRoles = [
+ {
+ projectId: '',
+ roleIds: []
+ }
+ ];
+
userFormRef.value?.resetFields();
};
/** 取消按钮 */
@@ -638,12 +672,32 @@ const handleUpdate = async (row?: UserForm) => {
postOptions.value = data.posts;
roleOptions.value = data.roles;
form.value.postIds = data.postIds;
- form.value.roleIds = data.user.roleIds;
+ form.value.projectRoles = data.projectRoles;
form.value.password = '';
+ const roleList = await getRoleList(form.value.deptId);
+
+ roleOptions.value = roleList.data;
+};
+
+const validate = () => {
+ for (let i = 0; i < form.value.projectRoles.length; i++) {
+ const item = form.value.projectRoles[i];
+ if (!item.projectId || item.projectId.length === 0) {
+ proxy?.$modal.msgError(`第 ${i + 1} 行“项目列表”未填写`);
+ return false; // 阻止提交
+ }
+ if (!item.roleIds || item.roleIds.length === 0) {
+ proxy?.$modal.msgError(`第 ${i + 1} 行“角色”未填写`);
+ return false; // 阻止提交
+ }
+ }
+ return true;
};
/** 提交按钮 */
const submitForm = () => {
+ const isValid = validate();
+ if (!isValid) return;
userFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
form.value.userId ? await api.updateUser(form.value) : await api.addUser(form.value);
@@ -683,10 +737,16 @@ onMounted(() => {
async function handleDeptChange(value: number | string) {
const response = await optionselect(value);
const roleList = await getRoleList(value);
+
roleOptions.value = roleList.data;
postOptions.value = response.data;
form.value.postIds = [];
- form.value.roleIds = [];
+ form.value.projectRoles = [
+ {
+ projectId: [],
+ roleIds: []
+ }
+ ];
}
const shuttleVisible = ref(false);
diff --git a/src/views/tender/bidd/index.vue b/src/views/tender/bidd/index.vue
index f06a0c7..27afe21 100644
--- a/src/views/tender/bidd/index.vue
+++ b/src/views/tender/bidd/index.vue
@@ -15,12 +15,14 @@
+
一键展开
一键收起
+
审核
- 查看流程
@@ -58,12 +65,21 @@
-
+
+
+ {{ scope.row.children.length > 0 ? '' : scope.row.quantity }}
+
+
(scope.row.unitPrice = val)"
+ @change="
+ (val) => {
+ scope.row.unitPrice = val;
+ changePrice(scope.row);
+ }
+ "
:precision="2"
:step="0.1"
:controls="false"
@@ -82,7 +98,7 @@
{
activeTab.value = tab;
+ tableData.value = [];
+ versionsData.value = {};
getVersionNums();
};
//切换版本
@@ -205,6 +223,8 @@ const getSheetName = async () => {
//获取表格数据
const getTableData = async () => {
try {
+ loading.value = true;
+
const params = {
projectId: currentProject.value?.id,
versions: queryForm.value.versions,
@@ -217,6 +237,8 @@ const getTableData = async () => {
}
} catch (error) {
console.log(error);
+ } finally {
+ loading.value = false;
}
};
//导入
@@ -257,29 +279,51 @@ const handleExport = () => {
`招标一览表${queryForm.value.sheet}.xlsx`
);
};
-//确认修改
-const handleSave = (row: any) => {
+const modifyPrice = new Map();
+
+const changePrice = (row: any) => {
+ modifyPrice.set(row.id, row);
+ // if (!row.unitPrice) {
+ // modifyPrice.delete(row.id);
+ // }
+};
+//修改单价
+const handleSave = (row?: any, type?: any) => {
try {
- if (!row.unitPrice) {
- ElMessage({
- message: '请输入单价',
- type: 'warning'
+ if (type == 'single') {
+ loading.value = true;
+ const list = [{ ...row, type: activeTab.value }];
+ updatePrice(list).then((res) => {
+ if (res.code == 200) {
+ ElMessage({
+ message: '修改成功',
+ type: 'success'
+ });
+ getTableData();
+ }
+ });
+ }
+ if (type == 'all') {
+ loading.value = true;
+ const list = [];
+ modifyPrice.forEach((item) => {
+ list.push({ ...item, type: activeTab.value });
+ });
+ updatePrice(list).then((res) => {
+ if (res.code == 200) {
+ ElMessage({
+ message: '修改成功',
+ type: 'success'
+ });
+ getTableData();
+ }
});
- return;
}
- loading.value = true;
- updatePrice(row).then((res) => {
- if (res.code == 200) {
- ElMessage({
- message: '修改成功',
- type: 'success'
- });
- getTableData();
- }
- });
} catch (error) {
- console.log(error);
- loading.value = false;
+ ElMessage({
+ message: '修改失败',
+ type: 'error'
+ });
} finally {
loading.value = false;
}
diff --git a/src/views/tender/plan/comm/planPage.vue b/src/views/tender/plan/comm/planPage.vue
index b4b156c..4562ebc 100644
--- a/src/views/tender/plan/comm/planPage.vue
+++ b/src/views/tender/plan/comm/planPage.vue
@@ -1,245 +1,78 @@
-
-
-
-
-
-
-
-
-
-
- {{ isExpandAll ? '一键收起' : '一键展开' }}
-
-
-
-
- 导入excel
-
-
-
-
- 导出excel
-
-
-
-
-
-
-
-
-
-
-
-
- (scope.row.unitPrice = val)"
- :precision="2"
- :step="0.1"
- :controls="false"
- v-if="scope.row.quantity && scope.row.quantity != 0"
- />
-
-
-
-
- {{ scope.row.price }}
-
-
-
-
- 修改
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/src/views/tender/plan/comm/winTheBid.vue b/src/views/tender/plan/comm/winTheBid.vue
new file mode 100644
index 0000000..f0056d8
--- /dev/null
+++ b/src/views/tender/plan/comm/winTheBid.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/tender/plan/index.vue b/src/views/tender/plan/index.vue
index 8265b8c..dfc29b3 100644
--- a/src/views/tender/plan/index.vue
+++ b/src/views/tender/plan/index.vue
@@ -189,7 +189,8 @@
-
+
+
-
-
+
+
+
+
+
+ {{
+ ((scope.row.quantity ? Number(scope.row.quantity) : 0) - (scope.row.useQuantity ? Number(scope.row.useQuantity) : 0)) *
+ Number(scope.row.unitPrice) ==
+ 0
+ ? ''
+ : (
+ ((scope.row.quantity ? Number(scope.row.quantity) : 0) - (scope.row.useQuantity ? Number(scope.row.useQuantity) : 0)) *
+ Number(scope.row.unitPrice)
+ ).toFixed(2)
+ }}
+
+
@@ -266,6 +287,9 @@ import { useUserStoreHook } from '@/store/modules/user';
import { getDicts } from '@/api/system/dict/data';
import { Plus } from '@element-plus/icons-vue';
import { FormInstance } from 'element-plus';
+import winTheBid from './comm/winTheBid.vue';
+import information from './comm/planPage.vue';
+
import {
sheetList,
tenderPlanList,
@@ -279,7 +303,6 @@ import {
delBiddView,
editStatus
} from '@/api/tender/index';
-import { it } from 'element-plus/es/locale/index.mjs';
const userStore = useUserStoreHook();
const currentProject = computed(() => userStore.selectedProject);
diff --git a/src/views/tender/supplierInput/index.vue b/src/views/tender/supplierInput/index.vue
index bbebc86..680aaf1 100644
--- a/src/views/tender/supplierInput/index.vue
+++ b/src/views/tender/supplierInput/index.vue
@@ -275,6 +275,7 @@
+ * 入库资料
-
+
diff --git a/vite.config.ts.timestamp-1756395377501-e6f009967ecc8.mjs b/vite.config.ts.timestamp-1756395377501-e6f009967ecc8.mjs
new file mode 100644
index 0000000..ec49d52
--- /dev/null
+++ b/vite.config.ts.timestamp-1756395377501-e6f009967ecc8.mjs
@@ -0,0 +1,230 @@
+// vite.config.ts
+import { loadEnv, defineConfig } from "file:///E:/XNY/new-project/node_modules/vite/dist/node/index.js";
+
+// vite/plugins/index.ts
+import vue from "file:///E:/XNY/new-project/node_modules/@vitejs/plugin-vue/dist/index.mjs";
+
+// vite/plugins/unocss.ts
+import UnoCss from "file:///E:/XNY/new-project/node_modules/unocss/dist/vite.mjs";
+var unocss_default = () => {
+ return UnoCss({
+ hmrTopLevelAwait: false
+ // unocss默认是true,低版本浏览器是不支持的,启动后会报错
+ });
+};
+
+// vite/plugins/auto-import.ts
+import AutoImport from "file:///E:/XNY/new-project/node_modules/unplugin-auto-import/dist/vite.js";
+import { ElementPlusResolver } from "file:///E:/XNY/new-project/node_modules/unplugin-vue-components/dist/resolvers.js";
+import IconsResolver from "file:///E:/XNY/new-project/node_modules/unplugin-icons/dist/resolver.js";
+var __vite_injected_original_dirname = "E:\\XNY\\new-project\\vite\\plugins";
+var auto_import_default = (path3) => {
+ return AutoImport({
+ // 自动导入 Vue 相关函数
+ imports: ["vue", "vue-router", "@vueuse/core", "pinia"],
+ eslintrc: {
+ enabled: false,
+ filepath: "./.eslintrc-auto-import.json",
+ globalsPropValue: true
+ },
+ resolvers: [
+ // 自动导入 Element Plus 相关函数ElMessage, ElMessageBox... (带样式)
+ ElementPlusResolver(),
+ IconsResolver({
+ prefix: "Icon"
+ })
+ ],
+ vueTemplate: true,
+ // 是否在 vue 模板中自动导入
+ dts: path3.resolve(path3.resolve(__vite_injected_original_dirname, "../../src"), "types", "auto-imports.d.ts")
+ });
+};
+
+// vite/plugins/components.ts
+import Components from "file:///E:/XNY/new-project/node_modules/unplugin-vue-components/dist/vite.js";
+import { ElementPlusResolver as ElementPlusResolver2 } from "file:///E:/XNY/new-project/node_modules/unplugin-vue-components/dist/resolvers.js";
+import IconsResolver2 from "file:///E:/XNY/new-project/node_modules/unplugin-icons/dist/resolver.js";
+var __vite_injected_original_dirname2 = "E:\\XNY\\new-project\\vite\\plugins";
+var components_default = (path3) => {
+ return Components({
+ resolvers: [
+ // 自动导入 Element Plus 组件
+ ElementPlusResolver2(),
+ // 自动注册图标组件
+ IconsResolver2({
+ enabledCollections: ["ep"]
+ })
+ ],
+ dts: path3.resolve(path3.resolve(__vite_injected_original_dirname2, "../../src"), "types", "components.d.ts")
+ });
+};
+
+// vite/plugins/icons.ts
+import Icons from "file:///E:/XNY/new-project/node_modules/unplugin-icons/dist/vite.js";
+var icons_default = () => {
+ return Icons({
+ // 自动安装图标库
+ autoInstall: true
+ });
+};
+
+// vite/plugins/svg-icon.ts
+import { createSvgIconsPlugin } from "file:///E:/XNY/new-project/node_modules/vite-plugin-svg-icons/dist/index.mjs";
+var __vite_injected_original_dirname3 = "E:\\XNY\\new-project\\vite\\plugins";
+var svg_icon_default = (path3, isBuild) => {
+ return createSvgIconsPlugin({
+ // 指定需要缓存的图标文件夹
+ iconDirs: [path3.resolve(path3.resolve(__vite_injected_original_dirname3, "../../src"), "assets/icons/svg")],
+ // 指定symbolId格式
+ symbolId: "icon-[dir]-[name]",
+ svgoOptions: isBuild
+ });
+};
+
+// vite/plugins/compression.ts
+import compression from "file:///E:/XNY/new-project/node_modules/vite-plugin-compression/dist/index.mjs";
+var compression_default = (env) => {
+ const { VITE_BUILD_COMPRESS } = env;
+ const plugin = [];
+ if (VITE_BUILD_COMPRESS) {
+ const compressList = VITE_BUILD_COMPRESS.split(",");
+ if (compressList.includes("gzip")) {
+ plugin.push(
+ compression({
+ ext: ".gz",
+ deleteOriginFile: false
+ })
+ );
+ }
+ if (compressList.includes("brotli")) {
+ plugin.push(
+ compression({
+ ext: ".br",
+ algorithm: "brotliCompress",
+ deleteOriginFile: false
+ })
+ );
+ }
+ }
+ return plugin;
+};
+
+// vite/plugins/setup-extend.ts
+import setupExtend from "file:///E:/XNY/new-project/node_modules/unplugin-vue-setup-extend-plus/dist/vite.js";
+var setup_extend_default = () => {
+ return setupExtend({});
+};
+
+// vite/plugins/index.ts
+import path from "path";
+var plugins_default = (viteEnv, isBuild = false) => {
+ const vitePlugins = [];
+ vitePlugins.push(vue());
+ vitePlugins.push(unocss_default());
+ vitePlugins.push(auto_import_default(path));
+ vitePlugins.push(components_default(path));
+ vitePlugins.push(compression_default(viteEnv));
+ vitePlugins.push(icons_default());
+ vitePlugins.push(svg_icon_default(path, isBuild));
+ vitePlugins.push(setup_extend_default());
+ return vitePlugins;
+};
+
+// vite.config.ts
+import path2 from "path";
+var __vite_injected_original_dirname4 = "E:\\XNY\\new-project";
+var vite_config_default = defineConfig(({ mode, command }) => {
+ const env = loadEnv(mode, process.cwd());
+ return {
+ // 部署生产环境和开发环境下的URL。
+ // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上
+ // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
+ base: env.VITE_APP_CONTEXT_PATH,
+ resolve: {
+ alias: {
+ "~": path2.resolve(__vite_injected_original_dirname4, "./"),
+ "@": path2.resolve(__vite_injected_original_dirname4, "./src")
+ },
+ extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue", ".tif"]
+ },
+ // https://cn.vitejs.dev/config/#resolve-extensions
+ plugins: plugins_default(env, command === "build"),
+ server: {
+ host: "0.0.0.0",
+ port: Number(env.VITE_APP_PORT),
+ open: true,
+ proxy: {
+ [env.VITE_APP_BASE_API]: {
+ target: "http://localhost:8899",
+ changeOrigin: true,
+ ws: true,
+ rewrite: (path3) => path3.replace(new RegExp("^" + env.VITE_APP_BASE_API), "")
+ },
+ "/warm-flow-ui": {
+ target: env.VITE_APP_BASE_API,
+ changeOrigin: true,
+ ws: true,
+ rewrite: (path3) => path3.replace(new RegExp("^" + env.VITE_APP_BASE_API), "")
+ },
+ "/warm-flow": {
+ target: env.VITE_APP_BASE_API,
+ changeOrigin: true,
+ ws: true,
+ rewrite: (path3) => path3.replace(new RegExp("^" + env.VITE_APP_BASE_API), "")
+ },
+ "/workflow": {
+ target: env.VITE_APP_BASE_API,
+ changeOrigin: true,
+ ws: true,
+ rewrite: (path3) => path3.replace(new RegExp("^" + env.VITE_APP_BASE_API), "")
+ },
+ "/auth": {
+ target: env.VITE_APP_BASE_API,
+ changeOrigin: true,
+ ws: true,
+ rewrite: (path3) => path3.replace(new RegExp("^" + env.VITE_APP_BASE_API), "")
+ }
+ }
+ },
+ css: {
+ preprocessorOptions: {
+ scss: {
+ javascriptEnabled: true
+ }
+ },
+ postcss: {
+ plugins: [
+ {
+ postcssPlugin: "internal:charset-removal",
+ AtRule: {
+ charset: (atRule) => {
+ if (atRule.name === "charset") {
+ atRule.remove();
+ }
+ }
+ }
+ }
+ ]
+ }
+ },
+ // 预编译
+ optimizeDeps: {
+ include: [
+ "vue",
+ "vue-router",
+ "pinia",
+ "axios",
+ "@vueuse/core",
+ "echarts",
+ "vue-i18n",
+ "@vueup/vue-quill",
+ "image-conversion",
+ "element-plus/es/components/**/css"
+ ]
+ }
+ };
+});
+export {
+ vite_config_default as default
+};
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAidml0ZS9wbHVnaW5zL2luZGV4LnRzIiwgInZpdGUvcGx1Z2lucy91bm9jc3MudHMiLCAidml0ZS9wbHVnaW5zL2F1dG8taW1wb3J0LnRzIiwgInZpdGUvcGx1Z2lucy9jb21wb25lbnRzLnRzIiwgInZpdGUvcGx1Z2lucy9pY29ucy50cyIsICJ2aXRlL3BsdWdpbnMvc3ZnLWljb24udHMiLCAidml0ZS9wbHVnaW5zL2NvbXByZXNzaW9uLnRzIiwgInZpdGUvcGx1Z2lucy9zZXR1cC1leHRlbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxYTllcXFxcbmV3LXByb2plY3RcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovWE5ZL25ldy1wcm9qZWN0L3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgVXNlckNvbmZpZywgQ29uZmlnRW52LCBsb2FkRW52LCBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJztcclxuXHJcbmltcG9ydCBjcmVhdGVQbHVnaW5zIGZyb20gJy4vdml0ZS9wbHVnaW5zJztcclxuXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoKHsgbW9kZSwgY29tbWFuZCB9OiBDb25maWdFbnYpOiBVc2VyQ29uZmlnID0+IHtcclxuICBjb25zdCBlbnYgPSBsb2FkRW52KG1vZGUsIHByb2Nlc3MuY3dkKCkpO1xyXG4gIHJldHVybiB7XHJcbiAgICAvLyBcdTkwRThcdTdGNzJcdTc1MUZcdTRFQTdcdTczQUZcdTU4ODNcdTU0OENcdTVGMDBcdTUzRDFcdTczQUZcdTU4ODNcdTRFMEJcdTc2ODRVUkxcdTMwMDJcclxuICAgIC8vIFx1OUVEOFx1OEJBNFx1NjBDNVx1NTFCNVx1NEUwQlx1RkYwQ3ZpdGUgXHU0RjFBXHU1MDQ3XHU4QkJFXHU0RjYwXHU3Njg0XHU1RTk0XHU3NTI4XHU2NjJGXHU4OEFCXHU5MEU4XHU3RjcyXHU1NzI4XHU0RTAwXHU0RTJBXHU1N0RGXHU1NDBEXHU3Njg0XHU2ODM5XHU4REVGXHU1Rjg0XHU0RTBBXHJcbiAgICAvLyBcdTRGOEJcdTU5ODIgaHR0cHM6Ly93d3cucnVveWkudmlwL1x1MzAwMlx1NTk4Mlx1Njc5Q1x1NUU5NFx1NzUyOFx1ODhBQlx1OTBFOFx1N0Y3Mlx1NTcyOFx1NEUwMFx1NEUyQVx1NUI1MFx1OERFRlx1NUY4NFx1NEUwQVx1RkYwQ1x1NEY2MFx1NUMzMVx1OTcwMFx1ODk4MVx1NzUyOFx1OEZEOVx1NEUyQVx1OTAwOVx1OTg3OVx1NjMwN1x1NUI5QVx1OEZEOVx1NEUyQVx1NUI1MFx1OERFRlx1NUY4NFx1MzAwMlx1NEY4Qlx1NTk4Mlx1RkYwQ1x1NTk4Mlx1Njc5Q1x1NEY2MFx1NzY4NFx1NUU5NFx1NzUyOFx1ODhBQlx1OTBFOFx1N0Y3Mlx1NTcyOCBodHRwczovL3d3dy5ydW95aS52aXAvYWRtaW4vXHVGRjBDXHU1MjE5XHU4QkJFXHU3RjZFIGJhc2VVcmwgXHU0RTNBIC9hZG1pbi9cdTMwMDJcclxuICAgIGJhc2U6IGVudi5WSVRFX0FQUF9DT05URVhUX1BBVEgsXHJcbiAgICByZXNvbHZlOiB7XHJcbiAgICAgIGFsaWFzOiB7XHJcbiAgICAgICAgJ34nOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi8nKSxcclxuICAgICAgICAnQCc6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL3NyYycpXHJcbiAgICAgIH0sXHJcbiAgICAgIGV4dGVuc2lvbnM6IFsnLm1qcycsICcuanMnLCAnLnRzJywgJy5qc3gnLCAnLnRzeCcsICcuanNvbicsICcudnVlJywgJy50aWYnXVxyXG4gICAgfSxcclxuICAgIC8vIGh0dHBzOi8vY24udml0ZWpzLmRldi9jb25maWcvI3Jlc29sdmUtZXh0ZW5zaW9uc1xyXG4gICAgcGx1Z2luczogY3JlYXRlUGx1Z2lucyhlbnYsIGNvbW1hbmQgPT09ICdidWlsZCcpLFxyXG4gICAgc2VydmVyOiB7XHJcbiAgICAgIGhvc3Q6ICcwLjAuMC4wJyxcclxuICAgICAgcG9ydDogTnVtYmVyKGVudi5WSVRFX0FQUF9QT1JUKSxcclxuICAgICAgb3BlbjogdHJ1ZSxcclxuICAgICAgcHJveHk6IHtcclxuICAgICAgICBbZW52LlZJVEVfQVBQX0JBU0VfQVBJXToge1xyXG4gICAgICAgICAgdGFyZ2V0OiAnaHR0cDovL2xvY2FsaG9zdDo4ODk5JyxcclxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcclxuICAgICAgICAgIHdzOiB0cnVlLFxyXG4gICAgICAgICAgcmV3cml0ZTogKHBhdGgpID0+IHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKCdeJyArIGVudi5WSVRFX0FQUF9CQVNFX0FQSSksICcnKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJy93YXJtLWZsb3ctdWknOiB7XHJcbiAgICAgICAgICB0YXJnZXQ6IGVudi5WSVRFX0FQUF9CQVNFX0FQSSxcclxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcclxuICAgICAgICAgIHdzOiB0cnVlLFxyXG4gICAgICAgICAgcmV3cml0ZTogKHBhdGgpID0+IHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKCdeJyArIGVudi5WSVRFX0FQUF9CQVNFX0FQSSksICcnKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJy93YXJtLWZsb3cnOiB7XHJcbiAgICAgICAgICB0YXJnZXQ6IGVudi5WSVRFX0FQUF9CQVNFX0FQSSxcclxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcclxuICAgICAgICAgIHdzOiB0cnVlLFxyXG4gICAgICAgICAgcmV3cml0ZTogKHBhdGgpID0+IHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKCdeJyArIGVudi5WSVRFX0FQUF9CQVNFX0FQSSksICcnKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJy93b3JrZmxvdyc6IHtcclxuICAgICAgICAgIHRhcmdldDogZW52LlZJVEVfQVBQX0JBU0VfQVBJLFxyXG4gICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICAgICAgd3M6IHRydWUsXHJcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoJ14nICsgZW52LlZJVEVfQVBQX0JBU0VfQVBJKSwgJycpXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgJy9hdXRoJzoge1xyXG4gICAgICAgICAgdGFyZ2V0OiBlbnYuVklURV9BUFBfQkFTRV9BUEksXHJcbiAgICAgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgICAgICB3czogdHJ1ZSxcclxuICAgICAgICAgIHJld3JpdGU6IChwYXRoKSA9PiBwYXRoLnJlcGxhY2UobmV3IFJlZ0V4cCgnXicgKyBlbnYuVklURV9BUFBfQkFTRV9BUEkpLCAnJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBjc3M6IHtcclxuICAgICAgcHJlcHJvY2Vzc29yT3B0aW9uczoge1xyXG4gICAgICAgIHNjc3M6IHtcclxuICAgICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBwb3N0Y3NzOiB7XHJcbiAgICAgICAgcGx1Z2luczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBwb3N0Y3NzUGx1Z2luOiAnaW50ZXJuYWw6Y2hhcnNldC1yZW1vdmFsJyxcclxuICAgICAgICAgICAgQXRSdWxlOiB7XHJcbiAgICAgICAgICAgICAgY2hhcnNldDogKGF0UnVsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGF0UnVsZS5uYW1lID09PSAnY2hhcnNldCcpIHtcclxuICAgICAgICAgICAgICAgICAgYXRSdWxlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIC8vIFx1OTg4NFx1N0YxNlx1OEJEMVxyXG4gICAgb3B0aW1pemVEZXBzOiB7XHJcbiAgICAgIGluY2x1ZGU6IFtcclxuICAgICAgICAndnVlJyxcclxuICAgICAgICAndnVlLXJvdXRlcicsXHJcbiAgICAgICAgJ3BpbmlhJyxcclxuICAgICAgICAnYXhpb3MnLFxyXG4gICAgICAgICdAdnVldXNlL2NvcmUnLFxyXG4gICAgICAgICdlY2hhcnRzJyxcclxuICAgICAgICAndnVlLWkxOG4nLFxyXG4gICAgICAgICdAdnVldXAvdnVlLXF1aWxsJyxcclxuICAgICAgICAnaW1hZ2UtY29udmVyc2lvbicsXHJcbiAgICAgICAgJ2VsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzLyoqL2NzcydcclxuICAgICAgXVxyXG4gICAgfVxyXG4gIH07XHJcbn0pO1xyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlXFxcXHBsdWdpbnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlXFxcXHBsdWdpbnNcXFxcaW5kZXgudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6L1hOWS9uZXctcHJvamVjdC92aXRlL3BsdWdpbnMvaW5kZXgudHNcIjtpbXBvcnQgdnVlIGZyb20gJ0B2aXRlanMvcGx1Z2luLXZ1ZSc7XHJcbmltcG9ydCBjcmVhdGVVbm9Dc3MgZnJvbSAnLi91bm9jc3MnO1xyXG5pbXBvcnQgY3JlYXRlQXV0b0ltcG9ydCBmcm9tICcuL2F1dG8taW1wb3J0JztcclxuaW1wb3J0IGNyZWF0ZUNvbXBvbmVudHMgZnJvbSAnLi9jb21wb25lbnRzJztcclxuaW1wb3J0IGNyZWF0ZUljb25zIGZyb20gJy4vaWNvbnMnO1xyXG5pbXBvcnQgY3JlYXRlU3ZnSWNvbnNQbHVnaW4gZnJvbSAnLi9zdmctaWNvbic7XHJcbmltcG9ydCBjcmVhdGVDb21wcmVzc2lvbiBmcm9tICcuL2NvbXByZXNzaW9uJztcclxuaW1wb3J0IGNyZWF0ZVNldHVwRXh0ZW5kIGZyb20gJy4vc2V0dXAtZXh0ZW5kJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCAodml0ZUVudjogYW55LCBpc0J1aWxkID0gZmFsc2UpOiBbXSA9PiB7XHJcbiAgY29uc3Qgdml0ZVBsdWdpbnM6IGFueSA9IFtdO1xyXG4gIHZpdGVQbHVnaW5zLnB1c2godnVlKCkpO1xyXG4gIHZpdGVQbHVnaW5zLnB1c2goY3JlYXRlVW5vQ3NzKCkpO1xyXG4gIHZpdGVQbHVnaW5zLnB1c2goY3JlYXRlQXV0b0ltcG9ydChwYXRoKSk7XHJcbiAgdml0ZVBsdWdpbnMucHVzaChjcmVhdGVDb21wb25lbnRzKHBhdGgpKTtcclxuICB2aXRlUGx1Z2lucy5wdXNoKGNyZWF0ZUNvbXByZXNzaW9uKHZpdGVFbnYpKTtcclxuICB2aXRlUGx1Z2lucy5wdXNoKGNyZWF0ZUljb25zKCkpO1xyXG4gIHZpdGVQbHVnaW5zLnB1c2goY3JlYXRlU3ZnSWNvbnNQbHVnaW4ocGF0aCwgaXNCdWlsZCkpO1xyXG4gIHZpdGVQbHVnaW5zLnB1c2goY3JlYXRlU2V0dXBFeHRlbmQoKSk7XHJcbiAgcmV0dXJuIHZpdGVQbHVnaW5zO1xyXG59O1xyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlXFxcXHBsdWdpbnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlXFxcXHBsdWdpbnNcXFxcdW5vY3NzLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi9YTlkvbmV3LXByb2plY3Qvdml0ZS9wbHVnaW5zL3Vub2Nzcy50c1wiO2ltcG9ydCBVbm9Dc3MgZnJvbSAndW5vY3NzL3ZpdGUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xyXG4gIHJldHVybiBVbm9Dc3Moe1xyXG4gICAgaG1yVG9wTGV2ZWxBd2FpdDogZmFsc2UgLy8gdW5vY3NzXHU5RUQ4XHU4QkE0XHU2NjJGdHJ1ZVx1RkYwQ1x1NEY0RVx1NzI0OFx1NjcyQ1x1NkQ0Rlx1ODlDOFx1NTY2OFx1NjYyRlx1NEUwRFx1NjUyRlx1NjMwMVx1NzY4NFx1RkYwQ1x1NTQyRlx1NTJBOFx1NTQwRVx1NEYxQVx1NjJBNVx1OTUxOVxyXG4gIH0pO1xyXG59O1xyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlXFxcXHBsdWdpbnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlXFxcXHBsdWdpbnNcXFxcYXV0by1pbXBvcnQudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6L1hOWS9uZXctcHJvamVjdC92aXRlL3BsdWdpbnMvYXV0by1pbXBvcnQudHNcIjtpbXBvcnQgQXV0b0ltcG9ydCBmcm9tICd1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlJztcclxuaW1wb3J0IHsgRWxlbWVudFBsdXNSZXNvbHZlciB9IGZyb20gJ3VucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3Jlc29sdmVycyc7XHJcbmltcG9ydCBJY29uc1Jlc29sdmVyIGZyb20gJ3VucGx1Z2luLWljb25zL3Jlc29sdmVyJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IChwYXRoOiBhbnkpID0+IHtcclxuICByZXR1cm4gQXV0b0ltcG9ydCh7XHJcbiAgICAvLyBcdTgxRUFcdTUyQThcdTVCRkNcdTUxNjUgVnVlIFx1NzZGOFx1NTE3M1x1NTFGRFx1NjU3MFxyXG4gICAgaW1wb3J0czogWyd2dWUnLCAndnVlLXJvdXRlcicsICdAdnVldXNlL2NvcmUnLCAncGluaWEnXSxcclxuICAgIGVzbGludHJjOiB7XHJcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBmaWxlcGF0aDogJy4vLmVzbGludHJjLWF1dG8taW1wb3J0Lmpzb24nLFxyXG4gICAgICBnbG9iYWxzUHJvcFZhbHVlOiB0cnVlXHJcbiAgICB9LFxyXG4gICAgcmVzb2x2ZXJzOiBbXHJcbiAgICAgIC8vIFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NSBFbGVtZW50IFBsdXMgXHU3NkY4XHU1MTczXHU1MUZEXHU2NTcwRWxNZXNzYWdlLCBFbE1lc3NhZ2VCb3guLi4gKFx1NUUyNlx1NjgzN1x1NUYwRilcclxuICAgICAgRWxlbWVudFBsdXNSZXNvbHZlcigpLFxyXG4gICAgICBJY29uc1Jlc29sdmVyKHtcclxuICAgICAgICBwcmVmaXg6ICdJY29uJ1xyXG4gICAgICB9KVxyXG4gICAgXSxcclxuICAgIHZ1ZVRlbXBsYXRlOiB0cnVlLCAvLyBcdTY2MkZcdTU0MjZcdTU3MjggdnVlIFx1NkEyMVx1Njc3Rlx1NEUyRFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NVxyXG4gICAgZHRzOiBwYXRoLnJlc29sdmUocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uLy4uL3NyYycpLCAndHlwZXMnLCAnYXV0by1pbXBvcnRzLmQudHMnKVxyXG4gIH0pO1xyXG59O1xyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlXFxcXHBsdWdpbnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlXFxcXHBsdWdpbnNcXFxcY29tcG9uZW50cy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovWE5ZL25ldy1wcm9qZWN0L3ZpdGUvcGx1Z2lucy9jb21wb25lbnRzLnRzXCI7aW1wb3J0IENvbXBvbmVudHMgZnJvbSAndW5wbHVnaW4tdnVlLWNvbXBvbmVudHMvdml0ZSc7XHJcbmltcG9ydCB7IEVsZW1lbnRQbHVzUmVzb2x2ZXIgfSBmcm9tICd1bnBsdWdpbi12dWUtY29tcG9uZW50cy9yZXNvbHZlcnMnO1xyXG5pbXBvcnQgSWNvbnNSZXNvbHZlciBmcm9tICd1bnBsdWdpbi1pY29ucy9yZXNvbHZlcic7XHJcblxyXG5leHBvcnQgZGVmYXVsdCAocGF0aDogYW55KSA9PiB7XHJcbiAgcmV0dXJuIENvbXBvbmVudHMoe1xyXG4gICAgcmVzb2x2ZXJzOiBbXHJcbiAgICAgIC8vIFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NSBFbGVtZW50IFBsdXMgXHU3RUM0XHU0RUY2XHJcbiAgICAgIEVsZW1lbnRQbHVzUmVzb2x2ZXIoKSxcclxuICAgICAgLy8gXHU4MUVBXHU1MkE4XHU2Q0U4XHU1MThDXHU1NkZFXHU2ODA3XHU3RUM0XHU0RUY2XHJcbiAgICAgIEljb25zUmVzb2x2ZXIoe1xyXG4gICAgICAgIGVuYWJsZWRDb2xsZWN0aW9uczogWydlcCddXHJcbiAgICAgIH0pXHJcbiAgICBdLFxyXG4gICAgZHRzOiBwYXRoLnJlc29sdmUocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uLy4uL3NyYycpLCAndHlwZXMnLCAnY29tcG9uZW50cy5kLnRzJylcclxuICB9KTtcclxufTtcclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxYTllcXFxcbmV3LXByb2plY3RcXFxcdml0ZVxcXFxwbHVnaW5zXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFxYTllcXFxcbmV3LXByb2plY3RcXFxcdml0ZVxcXFxwbHVnaW5zXFxcXGljb25zLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi9YTlkvbmV3LXByb2plY3Qvdml0ZS9wbHVnaW5zL2ljb25zLnRzXCI7aW1wb3J0IEljb25zIGZyb20gJ3VucGx1Z2luLWljb25zL3ZpdGUnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xyXG4gIHJldHVybiBJY29ucyh7XHJcbiAgICAvLyBcdTgxRUFcdTUyQThcdTVCODlcdTg4QzVcdTU2RkVcdTY4MDdcdTVFOTNcclxuICAgIGF1dG9JbnN0YWxsOiB0cnVlXHJcbiAgfSk7XHJcbn07XHJcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRTpcXFxcWE5ZXFxcXG5ldy1wcm9qZWN0XFxcXHZpdGVcXFxccGx1Z2luc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcWE5ZXFxcXG5ldy1wcm9qZWN0XFxcXHZpdGVcXFxccGx1Z2luc1xcXFxzdmctaWNvbi50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovWE5ZL25ldy1wcm9qZWN0L3ZpdGUvcGx1Z2lucy9zdmctaWNvbi50c1wiO2ltcG9ydCB7IGNyZWF0ZVN2Z0ljb25zUGx1Z2luIH0gZnJvbSAndml0ZS1wbHVnaW4tc3ZnLWljb25zJztcclxuZXhwb3J0IGRlZmF1bHQgKHBhdGg6IGFueSwgaXNCdWlsZDogYm9vbGVhbikgPT4ge1xyXG4gIHJldHVybiBjcmVhdGVTdmdJY29uc1BsdWdpbih7XHJcbiAgICAvLyBcdTYzMDdcdTVCOUFcdTk3MDBcdTg5ODFcdTdGMTNcdTVCNThcdTc2ODRcdTU2RkVcdTY4MDdcdTY1ODdcdTRFRjZcdTU5MzlcclxuICAgIGljb25EaXJzOiBbcGF0aC5yZXNvbHZlKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi8uLi9zcmMnKSwgJ2Fzc2V0cy9pY29ucy9zdmcnKV0sXHJcbiAgICAvLyBcdTYzMDdcdTVCOUFzeW1ib2xJZFx1NjgzQ1x1NUYwRlxyXG4gICAgc3ltYm9sSWQ6ICdpY29uLVtkaXJdLVtuYW1lXScsXHJcbiAgICBzdmdvT3B0aW9uczogaXNCdWlsZFxyXG4gIH0pO1xyXG59O1xyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlXFxcXHBsdWdpbnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFhOWVxcXFxuZXctcHJvamVjdFxcXFx2aXRlXFxcXHBsdWdpbnNcXFxcY29tcHJlc3Npb24udHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6L1hOWS9uZXctcHJvamVjdC92aXRlL3BsdWdpbnMvY29tcHJlc3Npb24udHNcIjtpbXBvcnQgY29tcHJlc3Npb24gZnJvbSAndml0ZS1wbHVnaW4tY29tcHJlc3Npb24nO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKGVudjogYW55KSA9PiB7XHJcbiAgY29uc3QgeyBWSVRFX0JVSUxEX0NPTVBSRVNTIH0gPSBlbnY7XHJcbiAgY29uc3QgcGx1Z2luOiBhbnlbXSA9IFtdO1xyXG4gIGlmIChWSVRFX0JVSUxEX0NPTVBSRVNTKSB7XHJcbiAgICBjb25zdCBjb21wcmVzc0xpc3QgPSBWSVRFX0JVSUxEX0NPTVBSRVNTLnNwbGl0KCcsJyk7XHJcbiAgICBpZiAoY29tcHJlc3NMaXN0LmluY2x1ZGVzKCdnemlwJykpIHtcclxuICAgICAgLy8gaHR0cDovL2RvYy5ydW95aS52aXAvcnVveWktdnVlL290aGVyL2ZhcS5odG1sI1x1NEY3Rlx1NzUyOGd6aXBcdTg5RTNcdTUzOEJcdTdGMjlcdTk3NTlcdTYwMDFcdTY1ODdcdTRFRjZcclxuICAgICAgcGx1Z2luLnB1c2goXHJcbiAgICAgICAgY29tcHJlc3Npb24oe1xyXG4gICAgICAgICAgZXh0OiAnLmd6JyxcclxuICAgICAgICAgIGRlbGV0ZU9yaWdpbkZpbGU6IGZhbHNlXHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChjb21wcmVzc0xpc3QuaW5jbHVkZXMoJ2Jyb3RsaScpKSB7XHJcbiAgICAgIHBsdWdpbi5wdXNoKFxyXG4gICAgICAgIGNvbXByZXNzaW9uKHtcclxuICAgICAgICAgIGV4dDogJy5icicsXHJcbiAgICAgICAgICBhbGdvcml0aG06ICdicm90bGlDb21wcmVzcycsXHJcbiAgICAgICAgICBkZWxldGVPcmlnaW5GaWxlOiBmYWxzZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBwbHVnaW47XHJcbn07XHJcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRTpcXFxcWE5ZXFxcXG5ldy1wcm9qZWN0XFxcXHZpdGVcXFxccGx1Z2luc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcWE5ZXFxcXG5ldy1wcm9qZWN0XFxcXHZpdGVcXFxccGx1Z2luc1xcXFxzZXR1cC1leHRlbmQudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6L1hOWS9uZXctcHJvamVjdC92aXRlL3BsdWdpbnMvc2V0dXAtZXh0ZW5kLnRzXCI7aW1wb3J0IHNldHVwRXh0ZW5kIGZyb20gJ3VucGx1Z2luLXZ1ZS1zZXR1cC1leHRlbmQtcGx1cy92aXRlJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0ICgpID0+IHtcclxuICByZXR1cm4gc2V0dXBFeHRlbmQoe30pO1xyXG59O1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQThPLFNBQWdDLFNBQVMsb0JBQW9COzs7QUNBOUIsT0FBTyxTQUFTOzs7QUNBZCxPQUFPLFlBQVk7QUFFbFMsSUFBTyxpQkFBUSxNQUFNO0FBQ25CLFNBQU8sT0FBTztBQUFBLElBQ1osa0JBQWtCO0FBQUE7QUFBQSxFQUNwQixDQUFDO0FBQ0g7OztBQ055UixPQUFPLGdCQUFnQjtBQUNoVCxTQUFTLDJCQUEyQjtBQUNwQyxPQUFPLG1CQUFtQjtBQUYxQixJQUFNLG1DQUFtQztBQUl6QyxJQUFPLHNCQUFRLENBQUNBLFVBQWM7QUFDNUIsU0FBTyxXQUFXO0FBQUE7QUFBQSxJQUVoQixTQUFTLENBQUMsT0FBTyxjQUFjLGdCQUFnQixPQUFPO0FBQUEsSUFDdEQsVUFBVTtBQUFBLE1BQ1IsU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BQ1Ysa0JBQWtCO0FBQUEsSUFDcEI7QUFBQSxJQUNBLFdBQVc7QUFBQTtBQUFBLE1BRVQsb0JBQW9CO0FBQUEsTUFDcEIsY0FBYztBQUFBLFFBQ1osUUFBUTtBQUFBLE1BQ1YsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUNBLGFBQWE7QUFBQTtBQUFBLElBQ2IsS0FBS0EsTUFBSyxRQUFRQSxNQUFLLFFBQVEsa0NBQVcsV0FBVyxHQUFHLFNBQVMsbUJBQW1CO0FBQUEsRUFDdEYsQ0FBQztBQUNIOzs7QUN2QnVSLE9BQU8sZ0JBQWdCO0FBQzlTLFNBQVMsdUJBQUFDLDRCQUEyQjtBQUNwQyxPQUFPQyxvQkFBbUI7QUFGMUIsSUFBTUMsb0NBQW1DO0FBSXpDLElBQU8scUJBQVEsQ0FBQ0MsVUFBYztBQUM1QixTQUFPLFdBQVc7QUFBQSxJQUNoQixXQUFXO0FBQUE7QUFBQSxNQUVUQyxxQkFBb0I7QUFBQTtBQUFBLE1BRXBCQyxlQUFjO0FBQUEsUUFDWixvQkFBb0IsQ0FBQyxJQUFJO0FB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QUFBQSxZQUNmLFFBQVE7QUFBQSxjQUNOLFNBQVMsQ0FBQyxXQUFXO0FBQ25CLG9CQUFJLE9BQU8sU0FBUyxXQUFXO0FBQzdCLHlCQUFPLE9BQU87QUFBQSxnQkFDaEI7QUFBQSxjQUNGO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQTtBQUFBLElBRUEsY0FBYztBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1A7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogWyJwYXRoIiwgIkVsZW1lbnRQbHVzUmVzb2x2ZXIiLCAiSWNvbnNSZXNvbHZlciIsICJfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSIsICJwYXRoIiwgIkVsZW1lbnRQbHVzUmVzb2x2ZXIiLCAiSWNvbnNSZXNvbHZlciIsICJfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSIsICJfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSIsICJwYXRoIiwgIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lIiwgInBhdGgiLCAiX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUiLCAicGF0aCIsICJfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSJdCn0K