From 9d192d0fbc46f56b7daef5a5130db1c64461cf20 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期二, 07 七月 2026 15:51:53 +0800
Subject: [PATCH] Merge branch 'dev_NEW_pro' into dev_山西晋中_平遥盛达
---
src/views/index.vue | 21
multiple/config.json | 9
src/views/officeProcessAutomation/HrManage/resign-apply/components/formDia.vue | 467 +++---
src/views/salesManagement/receiptPaymentLedger/index.vue | 24
src/views/salesManagement/returnOrder/components/detailDia.vue | 12
src/views/officeProcessAutomation/ApproveManage/approve-template/selectOptionSource.js | 77 +
src/views/personnelManagement/contractManagement/index.vue | 582 ++++----
multiple/assets/favicon/QLMCico.ico | 0
src/views/salesManagement/returnOrder/index.vue | 16
src/views/officeProcessAutomation/HrManage/work-handover/index.vue | 1
src/views/personnelManagement/attendanceCheckin/checkinRules/components/form.vue | 151 +
src/views/officeProcessAutomation/HrManage/regular-apply/index.vue | 1
multiple/assets/logo/QLMCLogo.png | 0
src/views/officeProcessAutomation/HrManage/staff-contract/index.vue | 520 ++++----
src/views/officeProcessAutomation/HrManage/transfer-apply/index.vue | 1
src/views/salesManagement/returnOrder/components/formDia.vue | 56
src/views/procurementManagement/purchaseReturnOrder/index.vue | 60
src/views/procurementManagement/purchaseReturnOrder/ProductList.vue | 13
src/views/officeProcessAutomation/HrManage/resign-apply/index.vue | 364 ++---
src/views/officeProcessAutomation/ApproveManage/approve-list/components/FormPayloadFields.vue | 17
src/views/financialManagement/receivable/salesReturn.vue | 24
src/views/procurementManagement/paymentLedger/index.vue | 16
src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js | 12
src/views/personnelManagement/dimission/components/formDia.vue | 467 +++---
src/views/procurementManagement/procurementLedger/index.vue | 2
src/views/officeProcessAutomation/ApproveManage/approve-template/useSelectOptionSources.js | 13
src/views/personnelManagement/classsSheduling/index.vue | 151 ++
src/views/salesManagement/indicatorStats/index.vue | 20
src/views/personnelManagement/attendanceCheckin/checkinRules/index.vue | 78
src/views/procurementManagement/purchaseReturnOrder/New.vue | 91 +
src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue | 2
src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue | 2
src/views/personnelManagement/dimission/index.vue | 399 +++---
src/views/financialManagement/payable/purchaseReturn.vue | 24
src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateFormSection.vue | 2
35 files changed, 2,124 insertions(+), 1,571 deletions(-)
diff --git a/multiple/assets/favicon/QLMCico.ico b/multiple/assets/favicon/QLMCico.ico
new file mode 100644
index 0000000..8a51d67
--- /dev/null
+++ b/multiple/assets/favicon/QLMCico.ico
Binary files differ
diff --git a/multiple/assets/logo/QLMCLogo.png b/multiple/assets/logo/QLMCLogo.png
new file mode 100644
index 0000000..f94d826
--- /dev/null
+++ b/multiple/assets/logo/QLMCLogo.png
Binary files differ
diff --git a/multiple/config.json b/multiple/config.json
index 5a6a34c..efb5665 100644
--- a/multiple/config.json
+++ b/multiple/config.json
@@ -24,6 +24,15 @@
"logo": "logo/SDZZLogo.png",
"favicon": "favicon/SDZZfavicon.ico"
},
+ "QLMC": {
+ "env": {
+ "VITE_APP_TITLE": "绁佽繛鐗у満淇℃伅绠$悊绯荤粺",
+ "VITE_BASE_API": "http://114.132.189.42:9066",
+ "VITE_JAVA_API": "http://114.132.189.42:9060"
+ },
+ "logo": "logo/QLMCLogo.png",
+ "favicon": "favicon/QLMCico.ico"
+ },
"logo": "/src/assets/logo/logo.png",
"favicon": "/public/favicon.ico"
}
diff --git a/src/views/financialManagement/payable/purchaseReturn.vue b/src/views/financialManagement/payable/purchaseReturn.vue
index 4171df2..5c274ac 100644
--- a/src/views/financialManagement/payable/purchaseReturn.vue
+++ b/src/views/financialManagement/payable/purchaseReturn.vue
@@ -85,6 +85,30 @@
{ label: "閫�璐у崟鍙�", prop: "returnNo", minWidth: "150" },
{ label: "渚涘簲鍟�", prop: "supplierName", minWidth: "180" },
{ label: "鍏宠仈鍏ュ簱鍗曞彿", prop: "inboundBatches", minWidth: "150" },
+ {
+ label: "鍙戣揣绫诲瀷",
+ prop: "shippingType",
+ minWidth: "110",
+ formatData: (val) => ({ 1: "璐ц溅", 2: "蹇��" }[String(val)] || "--"),
+ },
+ {
+ label: "鍙戣揣杞︾墝鍙�",
+ prop: "truckPlateNo",
+ minWidth: "140",
+ formatData: (_val, row) => (String(row?.shippingType) === "1" ? row?.truckPlateNo || "--" : "--"),
+ },
+ {
+ label: "蹇�掑叕鍙�",
+ prop: "expressCompany",
+ minWidth: "140",
+ formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressCompany || "--" : "--"),
+ },
+ {
+ label: "蹇�掑崟鍙�",
+ prop: "expressNo",
+ minWidth: "150",
+ formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressNo || "--" : "--"),
+ },
{ label: "閫�璐ф棩鏈�", prop: "preparedAt", minWidth: "170" },
{
label: "閫�娆炬�婚",
diff --git a/src/views/financialManagement/receivable/salesReturn.vue b/src/views/financialManagement/receivable/salesReturn.vue
index afe363c..85153bf 100644
--- a/src/views/financialManagement/receivable/salesReturn.vue
+++ b/src/views/financialManagement/receivable/salesReturn.vue
@@ -77,6 +77,30 @@
{ label: "閫�璐у崟鍙�", prop: "returnNo", minWidth: "150" },
{ label: "瀹㈡埛鍚嶇О", prop: "customerName", minWidth: "180" },
{ label: "鍏宠仈鍙戣揣鍗曞彿", prop: "shippingNo", minWidth: "150" },
+ {
+ label: "鍙戣揣绫诲瀷",
+ prop: "shippingType",
+ minWidth: "110",
+ formatData: (val) => ({ 1: "璐ц溅", 2: "蹇��" }[String(val)] || "--"),
+ },
+ {
+ label: "鍙戣揣杞︾墝鍙�",
+ prop: "truckPlateNo",
+ minWidth: "140",
+ formatData: (_val, row) => (String(row?.shippingType) === "1" ? row?.truckPlateNo || "--" : "--"),
+ },
+ {
+ label: "蹇�掑叕鍙�",
+ prop: "expressCompany",
+ minWidth: "140",
+ formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressCompany || "--" : "--"),
+ },
+ {
+ label: "蹇�掑崟鍙�",
+ prop: "expressNo",
+ minWidth: "150",
+ formatData: (_val, row) => (String(row?.shippingType) === "2" ? row?.expressNo || "--" : "--"),
+ },
{ label: "閫�璐ф棩鏈�", prop: "makeTime", minWidth: "170" },
{
label: "閫�娆炬�婚",
diff --git a/src/views/index.vue b/src/views/index.vue
index 4a03b41..5a76883 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -1031,8 +1031,8 @@
pathPrefixes: ["/inventorymanagement"],
},
production: {
- titles: ["鐢熶骇绠$悊", "涓荤敓浜ц鍒�", "鐢熶骇璁㈠崟", "鐢熶骇鎶ュ伐"],
- pathPrefixes: ["/productionmanagement", "/productionplan"],
+ titles: ["鐢熶骇绠℃帶"],
+ pathPrefixes: ["/productionManagement", "/productionPlan"],
},
quality: {
titles: ["璐ㄩ噺绠$悊"],
@@ -1086,7 +1086,7 @@
realtime: visibleModules.value.production,
quick: quickEntries.value.length > 0,
plan: visibleModules.value.production,
- receipt: visibleModules.value.sales || visibleModules.value.finance,
+ receipt: visibleModules.value.finance,
}));
const hasLeftPanels = computed(
@@ -1584,9 +1584,12 @@
}
.stats-grid {
- display: grid;
- grid-template-columns: repeat(4, minmax(0, 1fr));
+ display: flex;
gap: 14px;
+}
+
+.stats-grid .stat-card {
+ flex: 1;
}
.stat-card {
@@ -2457,10 +2460,6 @@
.main-grid {
grid-template-columns: minmax(0, 1fr) 340px;
}
-
- .stats-grid {
- grid-template-columns: repeat(2, minmax(0, 1fr));
- }
}
@media (max-width: 1200px) {
@@ -2504,10 +2503,6 @@
.meta-extra {
justify-content: flex-start;
- }
-
- .stats-grid {
- grid-template-columns: repeat(2, minmax(0, 1fr));
}
.right-column {
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/FormPayloadFields.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/FormPayloadFields.vue
index 7933db5..817a007 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/FormPayloadFields.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/FormPayloadFields.vue
@@ -80,12 +80,12 @@
clearable
filterable
>
- <el-option
- v-for="o in getOptions(field)"
- :key="String(o.value)"
- :label="o.label"
- :value="o.value"
- />
+ <el-option
+ v-for="o in getOptions(field, { moduleKey: props.moduleKey })"
+ :key="String(o.value)"
+ :label="o.label"
+ :value="o.value"
+ />
</el-select>
<span v-else class="field-value">{{ displayValue(field) }}</span>
</el-form-item>
@@ -103,13 +103,14 @@
fields: { type: Array, default: () => [] },
formPayload: { type: Object, default: () => ({}) },
readonly: { type: Boolean, default: false },
+ moduleKey: { type: String, default: "" },
});
const { loading: optionSourceLoading, ensureForFields, getOptions, getDisplayLabel } =
useSelectOptionSources();
async function loadOptionCaches() {
- await ensureForFields(props.fields);
+ await ensureForFields(props.fields, { moduleKey: props.moduleKey });
}
onMounted(() => {
@@ -127,7 +128,7 @@
function displayValue(field) {
const val = props.formPayload?.[field.key];
if (field.type === "select" && field.optionSource && field.optionSource !== "static") {
- return getDisplayLabel(field, val);
+ return getDisplayLabel(field, val, { moduleKey: props.moduleKey });
}
return formatFieldDisplayValue(field, val);
}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
index 25b6ae5..737e2de 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -310,7 +310,10 @@
else if (row.businessType === 5) {
const purchaseContractNumber = row?.purchaseContractNumber;
if (purchaseContractNumber) {
- const res = await getPurchaseByCode({ purchaseContractNumber });
+ const res = await getPurchaseByCode({
+ purchaseContractNumber,
+ approvalInstanceId: row?.id,
+ });
detailData.value = res || {};
}
}
@@ -355,7 +358,10 @@
else if (row.businessType === 5) {
const purchaseContractNumber = row?.purchaseContractNumber;
if (purchaseContractNumber) {
- const res = await getPurchaseByCode({ purchaseContractNumber });
+ const res = await getPurchaseByCode({
+ purchaseContractNumber,
+ approvalInstanceId: row?.id,
+ });
detailData.value = res || {};
}
}
@@ -699,4 +705,4 @@
openApprove,
fetchApprovalList,
};
-}
\ No newline at end of file
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue
index 53de9e1..0f9646c 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue
@@ -24,6 +24,7 @@
v-model:attachments="form.storageBlobDTOs"
:template-attachments="form.templateAttachments"
:user-options="userOptions"
+ :module-key="moduleKey"
:show-template-name="!isEdit"
:allow-change-template="false"
:flow-attachments-only="flowAttachmentsOnly"
@@ -56,6 +57,7 @@
fields: { type: Array, default: () => [] },
activeTemplate: { type: Object, default: null },
userOptions: { type: Array, default: () => [] },
+ moduleKey: { type: String, default: "" },
isEdit: { type: Boolean, default: false },
saving: { type: Boolean, default: false },
formRef: { type: Object, default: null },
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue
index 409dd41..6d56084 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue
@@ -4,7 +4,7 @@
鐢ㄦ硶锛�
<ApprovalTemplateBindDialog
v-model:visible="visible"
- module-key="regular"
+ :module-key="APPROVAL_MODULE_KEYS.REGULAR"
@confirm="onTemplateBound"
/>
-->
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateFormSection.vue b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateFormSection.vue
index d6e7073..ebc5ac4 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateFormSection.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateFormSection.vue
@@ -15,6 +15,7 @@
v-if="!hideFormFields && !flowAttachmentsOnly && !flowOnly"
:fields="fields"
:form-payload="formPayload"
+ :module-key="moduleKey"
/>
<el-form-item label="瀹℃壒娴佺▼" required>
@@ -87,6 +88,7 @@
uploadLimit: { type: Number, default: 10 },
/** 涓� true 鏃跺彲缂栬緫妯℃澘棰勭疆鐨勫鎵逛汉锛堜粎瀹℃壒妯℃澘绠$悊椤典娇鐢級 */
flowEditable: { type: Boolean, default: false },
+ moduleKey: { type: String, default: "" },
});
const emit = defineEmits(["update:flowNodes", "update:attachments", "change-template"]);
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/selectOptionSource.js b/src/views/officeProcessAutomation/ApproveManage/approve-template/selectOptionSource.js
index 99706b4..3dbc6f0 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-template/selectOptionSource.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/selectOptionSource.js
@@ -1,30 +1,42 @@
import { deptTreeSelect, userListNoPageByTenantId } from "@/api/system/user.js";
+import { staffOnJobListPage } from "@/api/personnelManagement/staffOnJob.js";
/** 涓嬫媺閫夐」鏉ユ簮锛堝啓鍏� formConfig锛屾彁浜ら〉鎸夋潵婧愭媺鍙栨暟鎹級 */
export const SELECT_OPTION_SOURCE = {
STATIC: "static",
USER: "user",
DEPT: "dept",
+ EMPLOYEE: "employee",
};
export const SELECT_OPTION_SOURCE_OPTIONS = [
{ value: SELECT_OPTION_SOURCE.STATIC, label: "鎵嬪姩閰嶇疆", desc: "鍦ㄦā鏉夸腑鑷畾涔夐�夐」鏂囨湰涓庡��" },
{ value: SELECT_OPTION_SOURCE.USER, label: "浜哄憳鍒楄〃", desc: "浠庣郴缁熺敤鎴蜂腑閫夋嫨锛屽�间负鐢ㄦ埛 ID" },
{ value: SELECT_OPTION_SOURCE.DEPT, label: "閮ㄩ棬鍒楄〃", desc: "浠庣粍缁囨灦鏋勪腑閫夋嫨锛屽�间负閮ㄩ棬 ID" },
+ { value: SELECT_OPTION_SOURCE.EMPLOYEE, label: "鍛樺伐鍒楄〃", desc: "浠庡湪鑱屽憳宸ヤ腑閫夋嫨锛屽�间负鍛樺伐 ID" },
];
+
+const EMPLOYEE_APPLICANT_MODULE_KEYS = new Set(["regular"]);
export function selectOptionSourceLabel(source) {
return SELECT_OPTION_SOURCE_OPTIONS.find((x) => x.value === source)?.label || "鈥�";
}
export function isDynamicOptionSource(source) {
- return source === SELECT_OPTION_SOURCE.USER || source === SELECT_OPTION_SOURCE.DEPT;
+ return (
+ source === SELECT_OPTION_SOURCE.USER ||
+ source === SELECT_OPTION_SOURCE.DEPT ||
+ source === SELECT_OPTION_SOURCE.EMPLOYEE
+ );
}
function unwrapArray(payload) {
if (Array.isArray(payload)) return payload;
+ if (Array.isArray(payload?.records)) return payload.records;
if (payload?.data && Array.isArray(payload.data)) return payload.data;
+ if (Array.isArray(payload?.data?.records)) return payload.data.records;
if (payload?.rows && Array.isArray(payload.rows)) return payload.rows;
+ if (Array.isArray(payload?.data?.rows)) return payload.data.rows;
return [];
}
@@ -39,6 +51,15 @@
const value = u.userId ?? u.id;
return {
label: u.nickName || u.userName || `鐢ㄦ埛${value}`,
+ value,
+ };
+}
+
+/** 鍦ㄨ亴鍛樺伐 鈫� 涓嬫媺 option */
+export function mapEmployeeToSelectOption(u) {
+ const value = u.id ?? u.staffOnJobId ?? u.staffId;
+ return {
+ label: u.staffName || u.name || u.userName || `鍛樺伐${value}`,
value,
};
}
@@ -70,21 +91,41 @@
}
/** 鎸夊瓧娈甸厤缃В鏋愪笅鎷� options锛堥渶浼犲叆宸插姞杞界殑缂撳瓨锛� */
-export function resolveFieldSelectOptions(field, caches = {}) {
+function isApplicantField(field) {
+ const key = String(field?.key || "").toLowerCase();
+ const label = String(field?.label || "");
+ return (
+ key === "applicant" ||
+ key === "applicantname" ||
+ label.includes("鐢宠浜�")
+ );
+}
+
+export function resolveFieldSelectOptions(field, caches = {}, context = {}) {
const source = field?.optionSource || SELECT_OPTION_SOURCE.STATIC;
+ if (
+ source === SELECT_OPTION_SOURCE.USER &&
+ EMPLOYEE_APPLICANT_MODULE_KEYS.has(context.moduleKey) &&
+ isApplicantField(field)
+ ) {
+ return (caches.employees || []).map(mapEmployeeToSelectOption);
+ }
if (source === SELECT_OPTION_SOURCE.USER) {
return (caches.users || []).map(mapUserToSelectOption);
}
if (source === SELECT_OPTION_SOURCE.DEPT) {
return caches.deptOptions || [];
}
+ if (source === SELECT_OPTION_SOURCE.EMPLOYEE) {
+ return (caches.employees || []).map(mapEmployeeToSelectOption);
+ }
return (field?.options || []).filter((o) => o.value !== "" && o.value != null);
}
/** 鏍规嵁宸茶В鏋愮殑 options 鍙嶆煡灞曠ず鏂囨湰 */
-export function resolveSelectDisplayLabel(field, val, caches = {}) {
+export function resolveSelectDisplayLabel(field, val, caches = {}, context = {}) {
if (val == null || val === "") return "鈥�";
- const options = resolveFieldSelectOptions(field, caches);
+ const options = resolveFieldSelectOptions(field, caches, context);
const hit = options.find((o) => String(o.value) === String(val));
return hit?.label || String(val);
}
@@ -93,9 +134,10 @@
export async function fetchSelectOptionCaches(sources = []) {
const needUser = sources.includes(SELECT_OPTION_SOURCE.USER);
const needDept = sources.includes(SELECT_OPTION_SOURCE.DEPT);
- const caches = { users: [], deptOptions: [] };
+ const needEmployee = sources.includes(SELECT_OPTION_SOURCE.EMPLOYEE);
+ const caches = { users: [], deptOptions: [], employees: [] };
- if (!needUser && !needDept) return caches;
+ if (!needUser && !needDept && !needEmployee) return caches;
const tasks = [];
if (needUser) {
@@ -123,17 +165,36 @@
})
);
}
+ if (needEmployee) {
+ tasks.push(
+ staffOnJobListPage({ current: -1, size: -1, staffState: 1 })
+ .then((res) => {
+ caches.employees = unwrapArray(res);
+ })
+ .catch(() => {
+ caches.employees = [];
+ })
+ );
+ }
await Promise.all(tasks);
return caches;
}
/** 浠庡瓧娈靛垪琛ㄦ敹闆嗛渶瑕侀鍔犺浇鐨勫姩鎬佹潵婧� */
-export function collectOptionSourcesFromFields(fields) {
+export function collectOptionSourcesFromFields(fields, context = {}) {
const set = new Set();
(fields || []).forEach((f) => {
if (f?.type === "select" && isDynamicOptionSource(f.optionSource)) {
- set.add(f.optionSource);
+ if (
+ EMPLOYEE_APPLICANT_MODULE_KEYS.has(context.moduleKey) &&
+ f.optionSource === SELECT_OPTION_SOURCE.USER &&
+ isApplicantField(f)
+ ) {
+ set.add(SELECT_OPTION_SOURCE.EMPLOYEE);
+ } else {
+ set.add(f.optionSource);
+ }
}
});
return [...set];
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/useSelectOptionSources.js b/src/views/officeProcessAutomation/ApproveManage/approve-template/useSelectOptionSources.js
index 8397288..5d246e1 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-template/useSelectOptionSources.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/useSelectOptionSources.js
@@ -14,25 +14,26 @@
deptOptions: [],
});
- async function ensureForFields(fields) {
- const sources = collectOptionSourcesFromFields(fields);
+ async function ensureForFields(fields, context = {}) {
+ const sources = collectOptionSourcesFromFields(fields, context);
if (!sources.length) return;
loading.value = true;
try {
const next = await fetchSelectOptionCaches(sources);
caches.users = next.users;
caches.deptOptions = next.deptOptions;
+ caches.employees = next.employees || [];
} finally {
loading.value = false;
}
}
- function getOptions(field) {
- return resolveFieldSelectOptions(field, caches);
+ function getOptions(field, context = {}) {
+ return resolveFieldSelectOptions(field, caches, context);
}
- function getDisplayLabel(field, val) {
- return resolveSelectDisplayLabel(field, val, caches);
+ function getDisplayLabel(field, val, context = {}) {
+ return resolveSelectDisplayLabel(field, val, caches, context);
}
return {
diff --git a/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue b/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue
index 291d57d..df70f4f 100644
--- a/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue
+++ b/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue
@@ -48,6 +48,7 @@
:fields="submitFormFields"
:active-template="activeTemplate"
:user-options="flowUserOptions"
+ :module-key="APPROVAL_MODULE_KEYS.REGULAR"
:is-edit="isSubmitEdit"
:saving="submitSaving"
:form-ref="submitFormRef"
diff --git a/src/views/officeProcessAutomation/HrManage/resign-apply/components/formDia.vue b/src/views/officeProcessAutomation/HrManage/resign-apply/components/formDia.vue
index 86c59ce..20c1794 100644
--- a/src/views/officeProcessAutomation/HrManage/resign-apply/components/formDia.vue
+++ b/src/views/officeProcessAutomation/HrManage/resign-apply/components/formDia.vue
@@ -1,29 +1,31 @@
<template>
<div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板绂昏亴' : '缂栬緫绂昏亴'"
- width="70%"
- @close="closeDia"
- >
+ <el-dialog v-model="dialogFormVisible"
+ :title="operationType === 'add' ? '鏂板绂昏亴' : '缂栬緫绂昏亴'"
+ width="70%"
+ @close="closeDia">
<!-- 鍛樺伐淇℃伅灞曠ず鍖哄煙 -->
<div class="info-section">
<div class="info-title">鍛樺伐淇℃伅</div>
- <el-form :model="form" label-width="200px" label-position="left" :rules="rules" ref="formRef" style="margin-top: 20px">
+ <el-form :model="form"
+ label-width="200px"
+ label-position="left"
+ :rules="rules"
+ ref="formRef"
+ style="margin-top: 20px">
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="濮撳悕锛�" prop="staffOnJobId">
+ <el-form-item label="濮撳悕锛�"
+ prop="staffOnJobId">
<el-select v-model="form.staffOnJobId"
placeholder="璇烽�夋嫨浜哄憳"
style="width: 100%"
:disabled="operationType === 'edit'"
@change="handleSelect">
- <el-option
- v-for="item in personList"
- :key="item.id"
- :label="item.staffName"
- :value="item.id"
- />
+ <el-option v-for="item in personList"
+ :key="item.id"
+ :label="item.staffName"
+ :value="item.id" />
</el-select>
</el-form-item>
</el-col>
@@ -39,21 +41,11 @@
{{ currentStaffRecord.sex || '-' }}
</el-form-item>
</el-col>
- <el-col :span="12">
- <el-form-item label="鎴风睄浣忓潃锛�">
- {{ currentStaffRecord.nativePlace || '-' }}
- </el-form-item>
- </el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
<el-form-item label="宀椾綅锛�">
{{ currentStaffRecord.postName || '-' }}
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐜颁綇鍧�锛�">
- {{ currentStaffRecord.adress || '-' }}
</el-form-item>
</el-col>
</el-row>
@@ -97,74 +89,74 @@
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="绂昏亴鏃ユ湡锛�" prop="leaveDate">
- <el-date-picker
- v-model="form.leaveDate"
- type="date"
- :disabled="operationType === 'edit'"
- :disabled-date="disabledFutureDate"
- placeholder="璇烽�夋嫨绂昏亴鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- style="width: 100%"
- />
+ <el-form-item label="绂昏亴鏃ユ湡锛�"
+ prop="leaveDate">
+ <el-date-picker v-model="form.leaveDate"
+ type="date"
+ :disabled="operationType === 'edit'"
+ :disabled-date="disabledFutureDate"
+ placeholder="璇烽�夋嫨绂昏亴鏃ユ湡"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="绂昏亴鍘熷洜锛�" prop="reason">
- <el-select v-model="form.reason" placeholder="璇烽�夋嫨绂昏亴鍘熷洜" style="width: 100%" @change="handleSelectDimissionReason">
- <el-option
- v-for="(item, index) in dimissionReasonOptions"
- :key="index"
- :label="item.label"
- :value="item.value"
- />
+ <el-form-item label="绂昏亴鍘熷洜锛�"
+ prop="reason">
+ <el-select v-model="form.reason"
+ placeholder="璇烽�夋嫨绂昏亴鍘熷洜"
+ style="width: 100%"
+ @change="handleSelectDimissionReason">
+ <el-option v-for="(item, index) in dimissionReasonOptions"
+ :key="index"
+ :label="item.label"
+ :value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="澶囨敞锛�" prop="remark" v-if="form.reason === 'other'">
- <el-input
- v-model="form.remark"
- type="textarea"
- :rows="3"
- placeholder="澶囨敞"
- maxlength="500"
- show-word-limit
- />
+ <el-form-item label="澶囨敞锛�"
+ prop="remark"
+ v-if="form.reason === 'other'">
+ <el-input v-model="form.remark"
+ type="textarea"
+ :rows="3"
+ placeholder="澶囨敞"
+ maxlength="500"
+ show-word-limit />
</el-form-item>
</el-col>
</el-row>
</el-form>
-
-<!-- <el-row :gutter="30">-->
-<!-- <el-col :span="12">-->
-<!-- <div class="info-item">-->
-<!-- <span class="info-label">绂昏亴鍘熷洜锛�</span>-->
-<!-- <el-select v-model="form.reason" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect">-->
-<!-- <el-option-->
-<!-- v-for="(item, index) in dimissionReasonOptions"-->
-<!-- :key="index"-->
-<!-- :label="item.label"-->
-<!-- :value="item.value"-->
-<!-- />-->
-<!-- </el-select>-->
-<!-- </div>-->
-<!-- </el-col>-->
-<!-- <el-col :span="12">-->
-<!-- <div class="info-item">-->
-<!-- <span class="info-label">鍛樺伐缂栧彿锛�</span>-->
-<!-- <span class="info-value">{{ form.staffNo || '-' }}</span>-->
-<!-- </div>-->
-<!-- </el-col>-->
-<!-- </el-row>-->
+ <!-- <el-row :gutter="30">-->
+ <!-- <el-col :span="12">-->
+ <!-- <div class="info-item">-->
+ <!-- <span class="info-label">绂昏亴鍘熷洜锛�</span>-->
+ <!-- <el-select v-model="form.reason" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect">-->
+ <!-- <el-option-->
+ <!-- v-for="(item, index) in dimissionReasonOptions"-->
+ <!-- :key="index"-->
+ <!-- :label="item.label"-->
+ <!-- :value="item.value"-->
+ <!-- />-->
+ <!-- </el-select>-->
+ <!-- </div>-->
+ <!-- </el-col>-->
+ <!-- <el-col :span="12">-->
+ <!-- <div class="info-item">-->
+ <!-- <span class="info-label">鍛樺伐缂栧彿锛�</span>-->
+ <!-- <span class="info-value">{{ form.staffNo || '-' }}</span>-->
+ <!-- </div>-->
+ <!-- </el-col>-->
+ <!-- </el-row>-->
</div>
-
<template #footer>
<div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
+ <el-button type="primary"
+ @click="submitForm">纭</el-button>
<el-button @click="closeDia">鍙栨秷</el-button>
</div>
</template>
@@ -173,175 +165,180 @@
</template>
<script setup>
-import {ref, reactive, toRefs, getCurrentInstance} from "vue";
-import {staffOnJobListPage} from "@/api/personnelManagement/staffOnJob.js";
-import {createStaffLeave, updateStaffLeave} from "@/api/personnelManagement/staffLeave.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
+ import { ref, reactive, toRefs, getCurrentInstance } from "vue";
+ import { staffOnJobListPage } from "@/api/personnelManagement/staffOnJob.js";
+ import {
+ createStaffLeave,
+ updateStaffLeave,
+ } from "@/api/personnelManagement/staffLeave.js";
+ const { proxy } = getCurrentInstance();
+ const emit = defineEmits(["close"]);
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const getTodayDate = () => {
- const now = new Date();
- const year = now.getFullYear();
- const month = `${now.getMonth() + 1}`.padStart(2, '0');
- const day = `${now.getDate()}`.padStart(2, '0');
- return `${year}-${month}-${day}`;
-};
-
-const disabledFutureDate = (time) => {
- const todayEnd = new Date();
- todayEnd.setHours(23, 59, 59, 999);
- return time.getTime() > todayEnd.getTime();
-};
-const data = reactive({
- form: {
- staffOnJobId: undefined,
- leaveDate: "",
- reason: "",
- remark: "",
- },
- rules: {
- staffName: [{ required: true, message: "璇烽�夋嫨浜哄憳" }],
- leaveDate: [{ required: true, message: "璇烽�夋嫨绂昏亴鏃ユ湡", trigger: "change" }],
- reason: [{ required: true, message: "璇烽�夋嫨绂昏亴鍘熷洜"}],
- },
- dimissionReasonOptions: [
- {label: '钖祫寰呴亣', value: 'salary'},
- {label: '鑱屼笟鍙戝睍', value: 'career_development'},
- {label: '宸ヤ綔鐜', value: 'work_environment'},
- {label: '涓汉鍘熷洜', value: 'personal_reason'},
- {label: '鍏朵粬', value: 'other'},
- ],
- currentStaffRecord: {},
-});
-const { form, rules, dimissionReasonOptions, currentStaffRecord } = toRefs(data);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- currentStaffRecord.value = row
- form.value.staffOnJobId = row.staffOnJobId
- form.value.leaveDate = row.leaveDate
- form.value.reason = row.reason
- form.value.remark = row.remark
- personList.value = [
- {
- staffName: row.staffName,
- id: row.staffOnJobId,
- }
- ]
- } else {
- form.value.leaveDate = getTodayDate()
- getList()
- }
-}
-
-const handleSelectDimissionReason = (val) => {
- if (val === 'other') {
- form.value.remark = ''
- }
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- form.value.staffState = 0
- if (form.value.reason !== 'other') {
- form.value.remark = ''
- }
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- createStaffLeave(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- updateStaffLeave(currentStaffRecord.value.id, form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- // 琛ㄥ崟宸叉敞閲婏紝鎵嬪姩閲嶇疆琛ㄥ崟鏁版嵁
- form.value = {
- staffOnJobId: undefined,
- leaveDate: "",
- reason: "",
- remark: "",
+ const dialogFormVisible = ref(false);
+ const operationType = ref("");
+ const getTodayDate = () => {
+ const now = new Date();
+ const year = now.getFullYear();
+ const month = `${now.getMonth() + 1}`.padStart(2, "0");
+ const day = `${now.getDate()}`.padStart(2, "0");
+ return `${year}-${month}-${day}`;
};
- dialogFormVisible.value = false;
- emit('close')
-};
-const personList = ref([]);
+ const disabledFutureDate = time => {
+ const todayEnd = new Date();
+ todayEnd.setHours(23, 59, 59, 999);
+ return time.getTime() > todayEnd.getTime();
+ };
+ const data = reactive({
+ form: {
+ staffOnJobId: undefined,
+ leaveDate: "",
+ reason: "",
+ remark: "",
+ },
+ rules: {
+ staffName: [{ required: true, message: "璇烽�夋嫨浜哄憳" }],
+ leaveDate: [
+ { required: true, message: "璇烽�夋嫨绂昏亴鏃ユ湡", trigger: "change" },
+ ],
+ reason: [{ required: true, message: "璇烽�夋嫨绂昏亴鍘熷洜" }],
+ },
+ dimissionReasonOptions: [
+ { label: "钖祫寰呴亣", value: "salary" },
+ { label: "鑱屼笟鍙戝睍", value: "career_development" },
+ { label: "宸ヤ綔鐜", value: "work_environment" },
+ { label: "涓汉鍘熷洜", value: "personal_reason" },
+ { label: "鍏朵粬", value: "other" },
+ ],
+ currentStaffRecord: {},
+ });
+ const { form, rules, dimissionReasonOptions, currentStaffRecord } =
+ toRefs(data);
-/**
- * 鑾峰彇褰撳墠鍦ㄨ亴浜哄憳鍒楄〃
- */
-const getList = () => {
- staffOnJobListPage({
- current: -1,
- size: -1,
- staffState: 1
- }).then(res => {
- personList.value = res.data.records || []
- })
-};
+ // 鎵撳紑寮规
+ const openDialog = (type, row) => {
+ operationType.value = type;
+ dialogFormVisible.value = true;
+ if (operationType.value === "edit") {
+ currentStaffRecord.value = row;
+ form.value.staffOnJobId = row.staffOnJobId;
+ form.value.leaveDate = row.leaveDate;
+ form.value.reason = row.reason;
+ form.value.remark = row.remark;
+ personList.value = [
+ {
+ staffName: row.staffName,
+ id: row.staffOnJobId,
+ },
+ ];
+ } else {
+ form.value.leaveDate = getTodayDate();
+ getList();
+ }
+ };
-const handleSelect = (val) => {
- let obj = personList.value.find(item => item.id === val)
- currentStaffRecord.value = {}
- if (obj) {
- // 淇濈暀绂昏亴鏃ユ湡鍜岀鑱屽師鍥狅紝鍙洿鏂板憳宸ヤ俊鎭�
- currentStaffRecord.value = obj
- }
-}
-defineExpose({
- openDialog,
-});
+ const handleSelectDimissionReason = val => {
+ if (val === "other") {
+ form.value.remark = "";
+ }
+ };
+ // 鎻愪氦浜у搧琛ㄥ崟
+ const submitForm = () => {
+ form.value.staffState = 0;
+ if (form.value.reason !== "other") {
+ form.value.remark = "";
+ }
+ proxy.$refs["formRef"].validate(valid => {
+ if (valid) {
+ if (operationType.value === "add") {
+ createStaffLeave(form.value).then(res => {
+ proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+ closeDia();
+ });
+ } else {
+ updateStaffLeave(currentStaffRecord.value.id, form.value).then(res => {
+ proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+ closeDia();
+ });
+ }
+ }
+ });
+ };
+ // 鍏抽棴寮规
+ const closeDia = () => {
+ // 琛ㄥ崟宸叉敞閲婏紝鎵嬪姩閲嶇疆琛ㄥ崟鏁版嵁
+ form.value = {
+ staffOnJobId: undefined,
+ leaveDate: "",
+ reason: "",
+ remark: "",
+ };
+ dialogFormVisible.value = false;
+ emit("close");
+ };
+
+ const personList = ref([]);
+
+ /**
+ * 鑾峰彇褰撳墠鍦ㄨ亴浜哄憳鍒楄〃
+ */
+ const getList = () => {
+ staffOnJobListPage({
+ current: -1,
+ size: -1,
+ staffState: 1,
+ }).then(res => {
+ personList.value = res.data.records || [];
+ });
+ };
+
+ const handleSelect = val => {
+ let obj = personList.value.find(item => item.id === val);
+ currentStaffRecord.value = {};
+ if (obj) {
+ // 淇濈暀绂昏亴鏃ユ湡鍜岀鑱屽師鍥狅紝鍙洿鏂板憳宸ヤ俊鎭�
+ currentStaffRecord.value = obj;
+ }
+ };
+ defineExpose({
+ openDialog,
+ });
</script>
<style scoped>
-.info-section {
- background: #f5f7fa;
- padding: 20px;
- border-radius: 8px;
- margin-bottom: 20px;
-}
+ .info-section {
+ background: #f5f7fa;
+ padding: 20px;
+ border-radius: 8px;
+ margin-bottom: 20px;
+ }
-.info-title {
- font-size: 16px;
- font-weight: 600;
- color: #303133;
- margin-bottom: 20px;
- padding-bottom: 10px;
- border-bottom: 1px solid #e4e7ed;
-}
+ .info-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #303133;
+ margin-bottom: 20px;
+ padding-bottom: 10px;
+ border-bottom: 1px solid #e4e7ed;
+ }
-.info-item {
- display: flex;
- align-items: center;
- margin-bottom: 16px;
- min-height: 32px;
-}
+ .info-item {
+ display: flex;
+ align-items: center;
+ margin-bottom: 16px;
+ min-height: 32px;
+ }
-.info-label {
- min-width: 140px;
- color: #606266;
- font-size: 14px;
- font-weight: 500;
-}
+ .info-label {
+ min-width: 140px;
+ color: #606266;
+ font-size: 14px;
+ font-weight: 500;
+ }
-.info-value {
- flex: 1;
- color: #303133;
- font-size: 14px;
-}
+ .info-value {
+ flex: 1;
+ color: #303133;
+ font-size: 14px;
+ }
</style>
diff --git a/src/views/officeProcessAutomation/HrManage/resign-apply/index.vue b/src/views/officeProcessAutomation/HrManage/resign-apply/index.vue
index 2b20970..8d96dd9 100644
--- a/src/views/officeProcessAutomation/HrManage/resign-apply/index.vue
+++ b/src/views/officeProcessAutomation/HrManage/resign-apply/index.vue
@@ -4,216 +4,206 @@
<div class="search_form mb20">
<div>
<span class="search_title">濮撳悕锛�</span>
- <el-input
- v-model="searchForm.staffName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
+ <el-input v-model="searchForm.staffName"
+ style="width: 240px"
+ placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
+ @change="handleQuery"
+ clearable
+ :prefix-icon="Search" />
+ <el-button type="primary"
+ @click="handleQuery"
+ style="margin-left: 10px">鎼滅储</el-button>
</div>
<div>
- <el-button type="primary" @click="openForm('add')">鏂板绂昏亴</el-button>
+ <el-button type="primary"
+ @click="openForm('add')">鏂板绂昏亴</el-button>
<el-button @click="handleOut">瀵煎嚭</el-button>
</div>
</div>
<div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
+ <PIMTable rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :page="page"
+ :isSelection="true"
+ @selection-change="handleSelectionChange"
+ :tableLoading="tableLoading"
+ @pagination="pagination"
+ :total="page.total"></PIMTable>
</div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
+ <form-dia ref="formDia"
+ @close="handleQuery"></form-dia>
</div>
</template>
<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/personnelManagement/dimission/components/formDia.vue";
-import { findStaffLeaveListPage } from "@/api/personnelManagement/staffLeave.js";
-import {ElMessageBox} from "element-plus";
+ import { Search } from "@element-plus/icons-vue";
+ import { onMounted, ref } from "vue";
+ import FormDia from "@/views/personnelManagement/dimission/components/formDia.vue";
+ import { findStaffLeaveListPage } from "@/api/personnelManagement/staffLeave.js";
+ import { ElMessageBox } from "element-plus";
-const data = reactive({
- searchForm: {
- staffName: "",
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍦ㄨ亴";
- } else {
- return null;
- }
+ const data = reactive({
+ searchForm: {
+ staffName: "",
},
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "绂昏亴鏃ユ湡",
- prop: "leaveDate",
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "鎴风睄浣忓潃",
- prop: "nativePlace",
- },
- {
- label: "閮ㄩ棬",
- prop: "deptName",
- },
- {
- label: "宀椾綅",
- prop: "postName",
- },
- {
- label: "鐜颁綇鍧�",
- prop: "adress",
- width:200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width:100
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width:150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
- prop: "emergencyContactPhone",
- width:150
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
+ });
+ const { searchForm } = toRefs(data);
+ const tableColumn = ref([
+ {
+ label: "鐘舵��",
+ prop: "staffState",
+ dataType: "tag",
+ formatData: params => {
+ if (params == 0) {
+ return "绂昏亴";
+ } else if (params == 1) {
+ return "鍦ㄨ亴";
+ } else {
+ return null;
+ }
},
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
+ formatType: params => {
+ if (params == 0) {
+ return "danger";
+ } else if (params == 1) {
+ return "primary";
+ } else {
+ return null;
+ }
+ },
+ },
+ {
+ label: "绂昏亴鏃ユ湡",
+ prop: "leaveDate",
+ },
+ {
+ label: "鍛樺伐缂栧彿",
+ prop: "staffNo",
+ },
+ {
+ label: "濮撳悕",
+ prop: "staffName",
+ },
+ {
+ label: "鎬у埆",
+ prop: "sex",
+ },
+ {
+ label: "閮ㄩ棬",
+ prop: "deptName",
+ },
+ {
+ label: "宀椾綅",
+ prop: "postName",
+ },
+ {
+ label: "绗竴瀛﹀巻",
+ prop: "firstStudy",
+ },
+ {
+ label: "涓撲笟",
+ prop: "profession",
+ width: 100,
+ },
+ {
+ label: "骞撮緞",
+ prop: "age",
+ },
+ {
+ label: "鑱旂郴鐢佃瘽",
+ prop: "phone",
+ width: 150,
+ },
+ {
+ label: "绱ф�ヨ仈绯讳汉",
+ prop: "emergencyContact",
+ width: 120,
+ },
+ {
+ label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
+ prop: "emergencyContactPhone",
+ width: 150,
+ },
+ {
+ dataType: "action",
+ label: "鎿嶄綔",
+ align: "center",
+ fixed: "right",
+ operation: [
+ {
+ name: "缂栬緫",
+ type: "text",
+ clickFun: row => {
+ openForm("edit", row);
+ },
+ },
+ ],
+ },
+ ]);
+ const tableData = ref([]);
+ const selectedRows = ref([]);
+ const tableLoading = ref(false);
+ const page = reactive({
+ current: 1,
+ size: 100,
+ total: 0,
+ });
+ const formDia = ref();
+ const { proxy } = getCurrentInstance();
+ // 鏌ヨ鍒楄〃
+ /** 鎼滅储鎸夐挳鎿嶄綔 */
+ const handleQuery = () => {
+ page.current = 1;
+ getList();
+ };
+ const pagination = obj => {
+ page.current = obj.page;
+ page.size = obj.limit;
+ getList();
+ };
+ const getList = () => {
+ tableLoading.value = true;
+ findStaffLeaveListPage({ ...page, ...searchForm.value })
+ .then(res => {
+ tableLoading.value = false;
+ tableData.value = res.data.records;
+ page.total = res.data.total;
+ })
+ .catch(err => {
+ tableLoading.value = false;
+ });
+ };
+ // 琛ㄦ牸閫夋嫨鏁版嵁
+ const handleSelectionChange = selection => {
+ selectedRows.value = selection;
+ };
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- findStaffLeaveListPage({...page, ...searchForm.value}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
+ // 鎵撳紑寮规
+ const openForm = (type, row) => {
+ nextTick(() => {
+ formDia.value?.openDialog(type, row);
+ });
+ };
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
+ // 瀵煎嚭
+ const handleOut = () => {
+ ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
.then(() => {
proxy.download("/staff/staffLeave/export", {}, "浜哄憳绂昏亴.xlsx");
})
.catch(() => {
proxy.$modal.msg("宸插彇娑�");
});
-};
-onMounted(() => {
- getList();
-});
+ };
+ onMounted(() => {
+ getList();
+ });
</script>
<style scoped></style>
diff --git a/src/views/officeProcessAutomation/HrManage/staff-contract/index.vue b/src/views/officeProcessAutomation/HrManage/staff-contract/index.vue
index 8186bdd..91b48be 100644
--- a/src/views/officeProcessAutomation/HrManage/staff-contract/index.vue
+++ b/src/views/officeProcessAutomation/HrManage/staff-contract/index.vue
@@ -4,43 +4,57 @@
<div class="search_form mb20">
<div>
<span class="search_title">濮撳悕锛�</span>
- <el-input v-model="searchForm.staffName" style="width: 240px" placeholder="璇疯緭鍏ュ鍚嶆悳绱�" @change="handleQuery"
- clearable :prefix-icon="Search" />
- <span style="margin-left: 10px" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+ <el-input v-model="searchForm.staffName"
+ style="width: 240px"
+ placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
+ @change="handleQuery"
+ clearable
+ :prefix-icon="Search" />
+ <span style="margin-left: 10px"
+ class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
+ <el-date-picker v-model="searchForm.entryDate"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ type="daterange"
+ placeholder="璇烽�夋嫨"
+ clearable
+ @change="changeDaterange" />
+ <el-button type="primary"
+ @click="handleQuery"
+ style="margin-left: 10px">鎼滅储</el-button>
</div>
<div>
<el-button @click="handleOut">瀵煎嚭</el-button>
</div>
</div>
<div class="table_list">
- <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true"
- @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination"
- :total="page.total"></PIMTable>
+ <PIMTable rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :page="page"
+ :isSelection="true"
+ @selection-change="handleSelectionChange"
+ :tableLoading="tableLoading"
+ @pagination="pagination"
+ :total="page.total"></PIMTable>
</div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
-
+ <form-dia ref="formDia"
+ @close="handleQuery"></form-dia>
<!-- 鍚堝悓瀵煎叆瀵硅瘽妗� -->
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :on-progress="handleFileUploadProgress"
- :on-success="handleFileSuccess"
- :auto-upload="false"
- drag
- >
+ <el-dialog :title="upload.title"
+ v-model="upload.open"
+ width="400px"
+ append-to-body>
+ <el-upload ref="uploadRef"
+ :limit="1"
+ accept=".xlsx, .xls"
+ :headers="upload.headers"
+ :action="upload.url + '?updateSupport=' + upload.updateSupport"
+ :disabled="upload.isUploading"
+ :on-progress="handleFileUploadProgress"
+ :on-success="handleFileSuccess"
+ :auto-upload="false"
+ drag>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
<template #tip>
@@ -51,7 +65,8 @@
</el-upload>
<template #footer>
<div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+ <el-button type="primary"
+ @click="submitFileForm">纭� 瀹�</el-button>
<el-button @click="upload.open = false">鍙� 娑�</el-button>
</div>
</template>
@@ -61,235 +76,232 @@
</template>
<script setup>
-import { Search } from "@element-plus/icons-vue";
-import { onMounted, ref } from "vue";
-import FormDia from "@/views/personnelManagement/contractManagement/components/formDia.vue";
-import { ElMessageBox } from "element-plus";
-import { staffOnJobListPage } from "@/api/personnelManagement/staffOnJob.js";
-import dayjs from "dayjs";
-import { getToken } from "@/utils/auth.js";
-import FilesDia from "./filesDia.vue";
-const data = reactive({
- searchForm: {
- staffName: "",
- entryDate: null, // 褰曞叆鏃ユ湡
- entryDateStart: undefined,
- entryDateEnd: undefined,
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍦ㄨ亴";
- } else {
- return null;
- }
+ import { Search } from "@element-plus/icons-vue";
+ import { onMounted, ref } from "vue";
+ import FormDia from "@/views/personnelManagement/contractManagement/components/formDia.vue";
+ import { ElMessageBox } from "element-plus";
+ import { staffOnJobListPage } from "@/api/personnelManagement/staffOnJob.js";
+ import dayjs from "dayjs";
+ import { getToken } from "@/utils/auth.js";
+ import FilesDia from "./filesDia.vue";
+ const data = reactive({
+ searchForm: {
+ staffName: "",
+ entryDate: null, // 褰曞叆鏃ユ湡
+ entryDateStart: undefined,
+ entryDateEnd: undefined,
},
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
+ });
+ const { searchForm } = toRefs(data);
+ const tableColumn = ref([
+ {
+ label: "鐘舵��",
+ prop: "staffState",
+ dataType: "tag",
+ formatData: params => {
+ if (params == 0) {
+ return "绂昏亴";
+ } else if (params == 1) {
+ return "鍦ㄨ亴";
+ } else {
+ return null;
+ }
+ },
+ formatType: params => {
+ if (params == 0) {
+ return "danger";
+ } else if (params == 1) {
+ return "primary";
+ } else {
+ return null;
+ }
+ },
},
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "鎴风睄浣忓潃",
- prop: "nativePlace",
- },
- {
- label: "宀椾綅",
- prop: "postName",
- },
- {
- label: "鐜颁綇鍧�",
- prop: "adress",
- width: 200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width: 100
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width: 150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
- prop: "emergencyContactPhone",
- width: 150
- },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractExpireTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: 120,
- operation: [
- {
- name: "璇︽儏",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
+ {
+ label: "鍛樺伐缂栧彿",
+ prop: "staffNo",
+ },
+ {
+ label: "濮撳悕",
+ prop: "staffName",
+ },
+ {
+ label: "鎬у埆",
+ prop: "sex",
+ },
+ {
+ label: "宀椾綅",
+ prop: "postName",
+ },
+ {
+ label: "绗竴瀛﹀巻",
+ prop: "firstStudy",
+ },
+ {
+ label: "涓撲笟",
+ prop: "profession",
+ width: 100,
+ },
+ {
+ label: "骞撮緞",
+ prop: "age",
+ },
+ {
+ label: "鑱旂郴鐢佃瘽",
+ prop: "phone",
+ width: 150,
+ },
+ {
+ label: "绱ф�ヨ仈绯讳汉",
+ prop: "emergencyContact",
+ width: 120,
+ },
+ {
+ label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
+ prop: "emergencyContactPhone",
+ width: 150,
+ },
+ {
+ label: "鍚堝悓缁撴潫鏃ユ湡",
+ prop: "contractExpireTime",
+ width: 120,
+ },
+ {
+ dataType: "action",
+ label: "鎿嶄綔",
+ align: "center",
+ fixed: "right",
+ width: 120,
+ operation: [
+ {
+ name: "璇︽儏",
+ type: "text",
+ clickFun: row => {
+ openForm("edit", row);
+ },
},
- }
- ],
- },
-]);
-const filesDia = ref()
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
+ ],
+ },
+ ]);
+ const filesDia = ref();
+ const tableData = ref([]);
+ const selectedRows = ref([]);
+ const tableLoading = ref(false);
+ const page = reactive({
+ current: 1,
+ size: 100,
+ total: 0,
+ });
+ const formDia = ref();
+ const { proxy } = getCurrentInstance();
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- nextTick(() => {
- filesDia.value?.openDialog( row,'鍚堝悓')
- })
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- params.staffState = 1
- staffOnJobListPage(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffOnJob/export", {staffState: 1}, "鍚堝悓绠$悊.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
+ const changeDaterange = value => {
+ searchForm.value.entryDateStart = undefined;
+ searchForm.value.entryDateEnd = undefined;
+ if (value) {
+ searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+ searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+ }
+ getList();
+ };
+ // 鎵撳紑闄勪欢寮规
+ const openFilesFormDia = row => {
+ nextTick(() => {
+ filesDia.value?.openDialog(row, "鍚堝悓");
});
-};
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙鍚堝悓瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙鍚堝悓瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
- updateSupport: 1,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/staff/staffOnJob/import",
-});
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "鍚堝悓瀵煎叆";
- upload.open = true;
-}
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- proxy.$refs["uploadRef"].submit();
-}
-/**鏂囦欢涓婁紶涓鐞� */
-const handleFileUploadProgress = (event, file, fileList) => {
- upload.isUploading = true;
-};
-/** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
-const handleFileSuccess = (response, file, fileList) => {
- upload.open = false;
- upload.isUploading = false;
- proxy.$refs["uploadRef"].handleRemove(file);
- getList();
-};
-onMounted(() => {
- getList();
-});
+ };
+ // 鏌ヨ鍒楄〃
+ /** 鎼滅储鎸夐挳鎿嶄綔 */
+ const handleQuery = () => {
+ page.current = 1;
+ getList();
+ };
+ const pagination = obj => {
+ page.current = obj.page;
+ page.size = obj.limit;
+ getList();
+ };
+ const getList = () => {
+ tableLoading.value = true;
+ const params = { ...searchForm.value, ...page };
+ params.entryDate = undefined;
+ params.staffState = 1;
+ staffOnJobListPage(params)
+ .then(res => {
+ tableLoading.value = false;
+ tableData.value = res.data.records;
+ page.total = res.data.total;
+ })
+ .catch(err => {
+ tableLoading.value = false;
+ });
+ };
+ // 琛ㄦ牸閫夋嫨鏁版嵁
+ const handleSelectionChange = selection => {
+ selectedRows.value = selection;
+ };
+
+ // 鎵撳紑寮规
+ const openForm = (type, row) => {
+ nextTick(() => {
+ formDia.value?.openDialog(type, row);
+ });
+ };
+ // 瀵煎嚭
+ const handleOut = () => {
+ ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ proxy.download(
+ "/staff/staffOnJob/export",
+ { staffState: 1 },
+ "鍚堝悓绠$悊.xlsx"
+ );
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+ };
+ const upload = reactive({
+ // 鏄惁鏄剧ず寮瑰嚭灞傦紙鍚堝悓瀵煎叆锛�
+ open: false,
+ // 寮瑰嚭灞傛爣棰橈紙鍚堝悓瀵煎叆锛�
+ title: "",
+ // 鏄惁绂佺敤涓婁紶
+ isUploading: false,
+ // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+ updateSupport: 1,
+ // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+ headers: { Authorization: "Bearer " + getToken() },
+ // 涓婁紶鐨勫湴鍧�
+ url: import.meta.env.VITE_APP_BASE_API + "/staff/staffOnJob/import",
+ });
+ /** 瀵煎叆鎸夐挳鎿嶄綔 */
+ function handleImport() {
+ upload.title = "鍚堝悓瀵煎叆";
+ upload.open = true;
+ }
+ /** 鎻愪氦涓婁紶鏂囦欢 */
+ function submitFileForm() {
+ proxy.$refs["uploadRef"].submit();
+ }
+ /**鏂囦欢涓婁紶涓鐞� */
+ const handleFileUploadProgress = (event, file, fileList) => {
+ upload.isUploading = true;
+ };
+ /** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
+ const handleFileSuccess = (response, file, fileList) => {
+ upload.open = false;
+ upload.isUploading = false;
+ proxy.$refs["uploadRef"].handleRemove(file);
+ getList();
+ };
+ onMounted(() => {
+ getList();
+ });
</script>
<style scoped></style>
diff --git a/src/views/officeProcessAutomation/HrManage/transfer-apply/index.vue b/src/views/officeProcessAutomation/HrManage/transfer-apply/index.vue
index f731d57..8b43805 100644
--- a/src/views/officeProcessAutomation/HrManage/transfer-apply/index.vue
+++ b/src/views/officeProcessAutomation/HrManage/transfer-apply/index.vue
@@ -58,6 +58,7 @@
:fields="submitFormFields"
:active-template="activeTemplate"
:user-options="flowUserOptions"
+ :module-key="APPROVAL_MODULE_KEYS.TRANSFER"
:is-edit="isSubmitEdit"
:saving="submitSaving"
:form-ref="submitFormRef"
diff --git a/src/views/officeProcessAutomation/HrManage/work-handover/index.vue b/src/views/officeProcessAutomation/HrManage/work-handover/index.vue
index a9b96ae..37ff223 100644
--- a/src/views/officeProcessAutomation/HrManage/work-handover/index.vue
+++ b/src/views/officeProcessAutomation/HrManage/work-handover/index.vue
@@ -58,6 +58,7 @@
:fields="submitFormFields"
:active-template="activeTemplate"
:user-options="flowUserOptions"
+ :module-key="APPROVAL_MODULE_KEYS.WORK_HANDOVER"
:is-edit="isSubmitEdit"
:saving="submitSaving"
:form-ref="submitFormRef"
diff --git a/src/views/personnelManagement/attendanceCheckin/checkinRules/components/form.vue b/src/views/personnelManagement/attendanceCheckin/checkinRules/components/form.vue
index cbbb8af..0ddea67 100644
--- a/src/views/personnelManagement/attendanceCheckin/checkinRules/components/form.vue
+++ b/src/views/personnelManagement/attendanceCheckin/checkinRules/components/form.vue
@@ -37,11 +37,17 @@
<el-option v-for="item in shifts_list"
:key="item.value"
:label="item.label"
- :value="item.value" />
+ :value="item.value"
+ :disabled="
+ operationType === 'add' &&
+ (String(item.label || '').includes('鍋�') ||
+ String(item.label || '').includes('浼�'))
+ " />
</el-select>
</el-form-item>
<el-form-item label="鎵撳崱鑼冨洿(m)"
- prop="radius">
+ prop="radius"
+ v-show="!hideClockFields">
<el-input-number v-model="form.radius"
:min="10"
:max="1000"
@@ -51,7 +57,8 @@
</el-form-item>
<!-- 楂樺痉鍦板浘閫夋嫨 -->
<el-form-item label="鎵撳崱浣嶇疆"
- prop="longitude">
+ prop="longitude"
+ v-show="!hideClockFields">
<div class="map-container">
<div class="map-header"
style="margin-bottom: 10px">
@@ -82,14 +89,16 @@
</div>
</el-form-item>
<el-form-item label="鍦扮偣鍚嶇О"
- prop="locationName">
+ prop="locationName"
+ v-show="!hideClockFields">
<el-input v-model="form.locationName"
:disabled="operationType === 'view'"
placeholder="璇疯緭鍏ュ湴鐐瑰悕绉�" />
</el-form-item>
<!-- 涓婁笅鐝椂闂� -->
<el-form-item label="涓婄彮鏃堕棿"
- prop="startAt">
+ prop="startAt"
+ v-show="!hideClockFields">
<el-time-picker v-model="form.startAt"
format="HH:mm"
value-format="HH:mm"
@@ -97,7 +106,8 @@
:disabled="operationType === 'view'" />
</el-form-item>
<el-form-item label="涓嬬彮鏃堕棿"
- prop="endAt">
+ prop="endAt"
+ v-show="!hideClockFields">
<el-time-picker v-model="form.endAt"
format="HH:mm"
value-format="HH:mm"
@@ -110,7 +120,9 @@
</el-form>
<template #footer>
<span class="dialog-footer">
- <el-button type="primary" @click="submitForm" v-if="operationType !== 'view'">纭畾</el-button>
+ <el-button type="primary"
+ @click="submitForm"
+ v-if="operationType !== 'view'">纭畾</el-button>
<el-button @click="dialogVisible = false">鍙栨秷</el-button>
</span>
</template>
@@ -157,6 +169,21 @@
// 鑾峰彇鐝瀛楀吀鍊�
const { shifts_list } = useDict("shifts_list");
+ const selectedShiftLabel = computed(() => {
+ const item = shifts_list.value?.find(
+ s => String(s.value) === String(form.shift)
+ );
+ return item?.label || "";
+ });
+
+ const hideClockFields = computed(() => {
+ if (props.operationType === "view") return false;
+ return (
+ selectedShiftLabel.value.includes("鍋�") ||
+ selectedShiftLabel.value.includes("浼�")
+ );
+ });
+
// 琛ㄥ崟鏁版嵁
const formRef = ref();
const form = reactive({
@@ -172,44 +199,53 @@
});
// 琛ㄥ崟楠岃瘉瑙勫垯
- const rules = {
- sysDeptId: [{ required: true, message: "璇烽�夋嫨閮ㄩ棬", trigger: "change" }],
- locationName: [
- { required: true, message: "璇疯緭鍏ュ湴鐐瑰悕绉�", trigger: "blur" },
- ],
- longitude: [{ required: true, message: "璇烽�夋嫨鎵撳崱浣嶇疆", trigger: "blur" }],
- latitude: [{ required: true, message: "璇烽�夋嫨鎵撳崱浣嶇疆", trigger: "blur" }],
- shift: [{ required: true, message: "璇烽�夋嫨鐝", trigger: "change" }],
- radius: [{ required: true, message: "璇疯緭鍏ユ墦鍗¤寖鍥�", trigger: "blur" }],
- startAt: [{ required: true, message: "璇烽�夋嫨涓婄彮鏃堕棿", trigger: "change" }],
- endAt: [
- { required: true, message: "璇烽�夋嫨涓嬬彮鏃堕棿", trigger: "change" },
- {
- validator: (rule, value, callback) => {
- // 濡傛灉鏄鐝紝涓嶉檺鍒舵椂闂撮『搴�
- if (form.shift && ['澶滅彮', '澶�'].includes(form.shift)) {
- callback();
- return;
- }
- if (form.startAt && value) {
- const startParts = form.startAt.split(":");
- const endParts = value.split(":");
- const startTime =
- parseInt(startParts[0]) * 60 + parseInt(startParts[1]);
- const endTime = parseInt(endParts[0]) * 60 + parseInt(endParts[1]);
- if (endTime <= startTime) {
- callback(new Error("涓嬬彮鏃堕棿涓嶈兘鏃╀簬涓婄彮鏃堕棿"));
+ const rules = computed(() => {
+ const base = {
+ sysDeptId: [{ required: true, message: "璇烽�夋嫨閮ㄩ棬", trigger: "change" }],
+ shift: [{ required: true, message: "璇烽�夋嫨鐝", trigger: "change" }],
+ };
+
+ if (hideClockFields.value) {
+ return base;
+ }
+
+ return {
+ ...base,
+ locationName: [
+ { required: true, message: "璇疯緭鍏ュ湴鐐瑰悕绉�", trigger: "blur" },
+ ],
+ longitude: [{ required: true, message: "璇烽�夋嫨鎵撳崱浣嶇疆", trigger: "blur" }],
+ latitude: [{ required: true, message: "璇烽�夋嫨鎵撳崱浣嶇疆", trigger: "blur" }],
+ radius: [{ required: true, message: "璇疯緭鍏ユ墦鍗¤寖鍥�", trigger: "blur" }],
+ startAt: [{ required: true, message: "璇烽�夋嫨涓婄彮鏃堕棿", trigger: "change" }],
+ endAt: [
+ { required: true, message: "璇烽�夋嫨涓嬬彮鏃堕棿", trigger: "change" },
+ {
+ validator: (rule, value, callback) => {
+ if (form.shift && ["澶滅彮", "澶�"].includes(form.shift)) {
+ callback();
+ return;
+ }
+ if (form.startAt && value) {
+ const startParts = form.startAt.split(":");
+ const endParts = value.split(":");
+ const startTime =
+ parseInt(startParts[0]) * 60 + parseInt(startParts[1]);
+ const endTime = parseInt(endParts[0]) * 60 + parseInt(endParts[1]);
+ if (endTime <= startTime) {
+ callback(new Error("涓嬬彮鏃堕棿涓嶈兘鏃╀簬涓婄彮鏃堕棿"));
+ } else {
+ callback();
+ }
} else {
callback();
}
- } else {
- callback();
- }
+ },
+ trigger: "change",
},
- trigger: "change",
- },
- ],
- };
+ ],
+ };
+ });
// 閮ㄩ棬閫夐」
const deptOptions = ref([]);
@@ -393,8 +429,8 @@
watch(
() => form.radius,
newValue => {
- if (circle) {
- circle.setRadius(newValue);
+ if (circle && newValue != null && newValue !== "") {
+ circle.setRadius(Number(newValue));
}
}
);
@@ -405,6 +441,29 @@
() => {
if (formRef.value && form.endAt) {
formRef.value.validateField("endAt");
+ }
+ }
+ );
+
+ watch(
+ () => hideClockFields.value,
+ val => {
+ if (!val) return;
+ form.radius = null;
+ form.longitude = "";
+ form.latitude = "";
+ form.locationName = "";
+ form.startAt = "";
+ form.endAt = "";
+ if (formRef.value) {
+ formRef.value.clearValidate([
+ "radius",
+ "longitude",
+ "latitude",
+ "locationName",
+ "startAt",
+ "endAt",
+ ]);
}
}
);
@@ -442,7 +501,9 @@
// 鍒濆鍖栧湴鍥�
setTimeout(() => {
- initMap();
+ if (!hideClockFields.value) {
+ initMap();
+ }
}, 100);
}
}
@@ -513,4 +574,4 @@
.mt8 {
margin-top: 8px;
}
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/personnelManagement/attendanceCheckin/checkinRules/index.vue b/src/views/personnelManagement/attendanceCheckin/checkinRules/index.vue
index c47dd2e..8bebe3b 100644
--- a/src/views/personnelManagement/attendanceCheckin/checkinRules/index.vue
+++ b/src/views/personnelManagement/attendanceCheckin/checkinRules/index.vue
@@ -13,30 +13,37 @@
</el-button>
</div>
</div>
- <!-- 鏌ヨ鏉′欢 -->
- <!-- <el-form :model="searchForm"
+ <el-form :model="searchForm"
:inline="true"
class="search-form mb16">
<el-form-item label="閮ㄩ棬锛�"
- prop="countId">
- <el-tree-select v-model="searchForm.countId"
+ prop="sysDeptId">
+ <el-tree-select v-model="searchForm.sysDeptId"
:data="deptOptions"
:props="{ value: 'id', label: 'label', children: 'children' }"
value-key="id"
placeholder="璇烽�夋嫨閮ㄩ棬"
check-strictly
+ clearable
style="width: 200px" />
</el-form-item>
- <el-form-item label="鍦扮偣锛�"
- prop="locationName">
- <el-input v-model="searchForm.locationName"
- placeholder="璇疯緭鍏ュ湴鐐瑰悕绉�"
- clearable
- style="width: 200px" />
+ <el-form-item label="鐝锛�"
+ prop="shift">
+ <el-select v-model="searchForm.shift"
+ placeholder="璇烽�夋嫨鐝"
+ clearable
+ style="width: 200px">
+ <el-option
+ v-for="item in shifts_list"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
</el-form-item>
<el-form-item>
<el-button type="primary"
- @click="fetchData">
+ @click="handleSearch">
<el-icon>
<Search />
</el-icon>
@@ -49,7 +56,7 @@
閲嶇疆
</el-button>
</el-form-item>
- </el-form> -->
+ </el-form>
<!-- 鐝鍒楄〃 -->
<el-card shadow="never"
class="mb16">
@@ -74,23 +81,39 @@
</template>
</el-table-column>
<el-table-column prop="locationName"
- label="鍦扮偣鍚嶇О" />
+ label="鍦扮偣鍚嶇О">
+ <template #default="scope">
+ {{ scope.row.locationName || "-" }}
+ </template>
+ </el-table-column>
<el-table-column prop="longitude"
- label="缁忓害" />
+ label="缁忓害">
+ <template #default="scope">
+ {{ scope.row.longitude ?? "-" }}
+ </template>
+ </el-table-column>
<el-table-column prop="latitude"
- label="绾害" />
+ label="绾害">
+ <template #default="scope">
+ {{ scope.row.latitude ?? "-" }}
+ </template>
+ </el-table-column>
<el-table-column prop="radius"
- label="鎵撳崱鑼冨洿(m)" />
+ label="鎵撳崱鑼冨洿(m)">
+ <template #default="scope">
+ {{ scope.row.radius ?? "-" }}
+ </template>
+ </el-table-column>
<el-table-column prop="startAt"
label="涓婄彮鏃堕棿">
<template #default="scope">
- {{ scope.row.startAt }}
+ {{ scope.row.startAt || "-" }}
</template>
</el-table-column>
<el-table-column prop="endAt"
label="涓嬬彮鏃堕棿">
<template #default="scope">
- {{ scope.row.endAt }}
+ {{ scope.row.endAt || "-" }}
</template>
</el-table-column>
<el-table-column label="鎿嶄綔"
@@ -124,7 +147,7 @@
</template>
<script setup>
- import { ref, reactive, onMounted } from "vue";
+ import { ref, reactive, onMounted, getCurrentInstance } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import {
Plus,
@@ -158,8 +181,8 @@
// 鏌ヨ琛ㄥ崟
const searchForm = reactive({
- countId: "",
- locationName: "",
+ sysDeptId: "",
+ shift: "",
});
// 閮ㄩ棬閫夐」
@@ -232,12 +255,18 @@
tableLoading.value = true;
getAttendanceRules({ ...page, ...searchForm })
.then(res => {
- tableData.value = res.data.records;
+ const records = Array.isArray(res?.data?.records) ? res.data.records : [];
+ tableData.value = records.filter(r => String(r?.id) !== "999");
page.total = res.data.total;
})
.finally(() => {
tableLoading.value = false;
});
+ };
+
+ const handleSearch = () => {
+ page.current = 1;
+ fetchData();
};
// 鍒嗛〉鍙樻洿
@@ -249,8 +278,9 @@
// 閲嶇疆鎼滅储
const resetSearch = () => {
- searchForm.countId = "";
- searchForm.locationName = "";
+ searchForm.sysDeptId = "";
+ searchForm.shift = "";
+ page.current = 1;
fetchData();
};
diff --git a/src/views/personnelManagement/classsSheduling/index.vue b/src/views/personnelManagement/classsSheduling/index.vue
index 140ffba..8228be9 100644
--- a/src/views/personnelManagement/classsSheduling/index.vue
+++ b/src/views/personnelManagement/classsSheduling/index.vue
@@ -149,12 +149,12 @@
'shift-box-early': m.shift === '鏃╃彮',
'shift-box-mid': m.shift === '涓彮',
'shift-box-night': m.shift === '澶滅彮',
- 'shift-box-rest': m.shift === '浼戞伅',
+ 'shift-box-rest': !m.shift || m.shift === '浼戞伅',
'shift-box-leave': m.shift === '璇峰亣',
'shift-box-other': m.shift === '澶�11',
'shift-box-business': m.shift === '澶�12',
}">
- <span class="shift-text">{{ getShiftNameByValue(m.shift) || '鈥�' }}</span>
+ <span class="shift-text">{{ getShiftNameByValue(m.shift) || '浼戞伅' }}</span>
</div>
<template #dropdown>
<el-dropdown-menu>
@@ -199,7 +199,7 @@
</div> -->
<div class="user-total">
<span class="total-label">鍚堣鍑哄嫟:</span>
- <span class="total-value">{{ item.work_time }}澶�</span>
+ <span class="total-value">{{ item.year.totalYearAttendance }}澶�</span>
</div>
</div>
</div>
@@ -271,6 +271,23 @@
<div class="search_thing">
<div class="search_label"
style="width: 90px">
+ <span style="color: red; margin-right: 4px">*</span>閮ㄩ棬锛�
+ </div>
+ <div class="search_input">
+ <el-tree-select v-model="schedulingQuery.deptId"
+ :data="deptOptions"
+ :props="{ value: 'id', label: 'label', children: 'children' }"
+ value-key="id"
+ placeholder="璇烽�夋嫨閮ㄩ棬"
+ check-strictly
+ clearable
+ @change="onSchedulingDeptChange"
+ style="width: 100%" />
+ </div>
+ </div>
+ <div class="search_thing">
+ <div class="search_label"
+ style="width: 90px">
<span style="color: red; margin-right: 4px">*</span>浜哄憳鍚嶇О锛�
</div>
<div class="search_input">
@@ -279,7 +296,8 @@
style="width: 100%"
multiple
clearable
- collapse-tags>
+ collapse-tags
+ :disabled="!schedulingQuery.deptId">
<el-option v-for="item in personList"
:key="item.id"
:label="item.staffName"
@@ -296,8 +314,9 @@
<div class="search_input">
<el-select v-model="schedulingQuery.shift"
placeholder="璇烽�夋嫨"
- style="width: 100%">
- <el-option v-for="item in classType"
+ style="width: 100%"
+ :disabled="!schedulingQuery.deptId">
+ <el-option v-for="item in schedulingClassType"
:key="item.id"
:label="getShiftNameByValue(item.shift)"
:value="item.id">
@@ -318,7 +337,14 @@
</template>
<script setup>
- import { ref, reactive, onMounted, getCurrentInstance } from "vue";
+ import {
+ ref,
+ reactive,
+ computed,
+ watch,
+ onMounted,
+ getCurrentInstance,
+ } from "vue";
import { useRouter } from "vue-router";
import {
page,
@@ -376,6 +402,7 @@
// 浜哄憳鍒楄〃
const personList = ref([]);
+ const personListAll = ref([]);
// 鍔犺浇鐘舵��
const loading = ref(false);
@@ -383,8 +410,18 @@
// 鎺掔彮鏌ヨ鏉′欢
const schedulingQuery = reactive({
week: "",
+ deptId: "",
userId: null,
shift: "",
+ });
+
+ const schedulingClassType = computed(() => {
+ if (!schedulingQuery.deptId) return classType.value || [];
+ return (classType.value || []).filter(item => {
+ if (["998", "999"].includes(String(item?.id))) return true;
+ const itemDeptId = item.deptId ?? item.sysDeptId ?? item.dept_id;
+ return String(itemDeptId) === String(schedulingQuery.deptId);
+ });
});
// 鍒楄〃鏁版嵁
@@ -593,6 +630,10 @@
proxy.$modal.msgError("璇烽�夋嫨鍛ㄦ");
return;
}
+ if (!schedulingQuery.deptId) {
+ proxy.$modal.msgError("璇烽�夋嫨閮ㄩ棬");
+ return;
+ }
let time = schedulingQuery.week.getTime();
// 鏍煎紡鍖栨棩鏈熶负 YYYY-MM-DD 鏍煎紡
@@ -628,8 +669,10 @@
proxy.$modal.msgSuccess("鎿嶄綔鎴愬姛");
schedulingVisible.value = false;
schedulingQuery.week = "";
+ schedulingQuery.deptId = "";
schedulingQuery.userId = null;
schedulingQuery.shift = "";
+ personList.value = [];
refresh();
})
.catch(err => {
@@ -683,8 +726,7 @@
}
proxy.$download.saveAs(blob, fileName + ".xlsx");
})
- .catch(err => {
- })
+ .catch(err => {})
.finally(() => {
downLoading.value = false;
});
@@ -709,7 +751,18 @@
// 鏌ヨ瑙勫垯鍒楄〃
const fetchData = () => {
getAttendanceRules({ current: -1, size: -1 }).then(res => {
- classType.value = res.data.records;
+ const records = Array.isArray(res?.data?.records) ? res.data.records : [];
+ const appendList = [
+ { id: 998, shift: "浼戞伅" },
+ { id: 999, shift: "璇峰亣" },
+ ];
+ const exists = new Set(records.map(r => String(r?.id)));
+ appendList.forEach(item => {
+ if (!exists.has(String(item.id))) {
+ records.push(item);
+ }
+ });
+ classType.value = records;
});
};
// 鑾峰彇鐢ㄦ埛
@@ -724,8 +777,61 @@
staffState: 1,
}).then(res => {
let arr = res.data.records;
- personList.value = arr;
+ personListAll.value = arr;
+ updatePersonListByDept();
});
+ };
+
+ const findDeptNodeById = (deptId, deptList = deptOptions.value) => {
+ const list = Array.isArray(deptList) ? deptList : [];
+ for (const node of list) {
+ if (String(node.id) === String(deptId)) return node;
+ if (node.children && node.children.length) {
+ const found = findDeptNodeById(deptId, node.children);
+ if (found) return found;
+ }
+ }
+ return null;
+ };
+
+ const collectDeptIds = node => {
+ const ids = [];
+ if (!node) return ids;
+ ids.push(String(node.id));
+ if (node.children && node.children.length) {
+ node.children.forEach(child => {
+ ids.push(...collectDeptIds(child));
+ });
+ }
+ return ids;
+ };
+
+ const updatePersonListByDept = () => {
+ if (!schedulingQuery.deptId) {
+ personList.value = [];
+ return;
+ }
+ const node = findDeptNodeById(schedulingQuery.deptId);
+ const deptIds = new Set(collectDeptIds(node));
+ personList.value = (personListAll.value || []).filter(item => {
+ const itemDeptId = item.deptId ?? item.sysDeptId ?? item.dept_id;
+ return deptIds.has(String(itemDeptId));
+ });
+ };
+
+ const setDefaultShiftByDept = () => {
+ if (!schedulingQuery.deptId) {
+ schedulingQuery.shift = "";
+ return;
+ }
+ const first = schedulingClassType.value?.[0];
+ schedulingQuery.shift = first ? first.id : "";
+ };
+
+ const onSchedulingDeptChange = () => {
+ schedulingQuery.userId = null;
+ updatePersonListByDept();
+ setDefaultShiftByDept();
};
// 鏍规嵁瀛楀吀鑾峰彇鏃ユ湡
@@ -761,6 +867,27 @@
}
monthList.value.reverse();
});
+
+ watch(
+ () => classType.value,
+ () => {
+ if (schedulingVisible.value && schedulingQuery.deptId) {
+ setDefaultShiftByDept();
+ }
+ }
+ );
+
+ watch(
+ () => schedulingVisible.value,
+ val => {
+ if (!val) return;
+ schedulingQuery.week = "";
+ schedulingQuery.deptId = "";
+ schedulingQuery.userId = null;
+ schedulingQuery.shift = "";
+ personList.value = [];
+ }
+ );
</script>
<style scoped>
@@ -973,7 +1100,7 @@
.user-stats {
/* display: flex; */
/* flex-wrap: wrap;
- gap: 10px; */
+ gap: 10px; */
margin-bottom: 4px;
}
diff --git a/src/views/personnelManagement/contractManagement/index.vue b/src/views/personnelManagement/contractManagement/index.vue
index ae0087e..bde498a 100644
--- a/src/views/personnelManagement/contractManagement/index.vue
+++ b/src/views/personnelManagement/contractManagement/index.vue
@@ -3,52 +3,64 @@
<div class="search_form mb20">
<div>
<span class="search_title">濮撳悕锛�</span>
- <el-input v-model="searchForm.staffName" style="width: 240px" placeholder="璇疯緭鍏ュ鍚嶆悳绱�" @change="handleQuery"
- clearable :prefix-icon="Search" />
- <span style="margin-left: 10px" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
- <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
- placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+ <el-input v-model="searchForm.staffName"
+ style="width: 240px"
+ placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
+ @change="handleQuery"
+ clearable
+ :prefix-icon="Search" />
+ <span style="margin-left: 10px"
+ class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
+ <el-date-picker v-model="searchForm.entryDate"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ type="daterange"
+ placeholder="璇烽�夋嫨"
+ clearable
+ @change="changeDaterange" />
+ <el-button type="primary"
+ @click="handleQuery"
+ style="margin-left: 10px">鎼滅储</el-button>
</div>
<div>
<!-- <el-button type="primary" @click="openForm('add')">鏂板鍏ヨ亴</el-button>-->
-<!-- <el-button type="info" @click="handleImport">瀵煎叆</el-button>-->
+ <!-- <el-button type="info" @click="handleImport">瀵煎叆</el-button>-->
<el-button @click="handleOut">瀵煎嚭</el-button>
<!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
</div>
</div>
<div class="table_list">
- <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true"
- @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination"
- :total="page.total"></PIMTable>
+ <PIMTable rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :page="page"
+ :isSelection="true"
+ @selection-change="handleSelectionChange"
+ :tableLoading="tableLoading"
+ @pagination="pagination"
+ :total="page.total"></PIMTable>
</div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
- <renew-contract
- v-if="isShowRenewContractModal"
- v-model:visible="isShowRenewContractModal"
- :id="id"
- @completed="handleQuery"
- />
-
+ <form-dia ref="formDia"
+ @close="handleQuery"></form-dia>
+ <renew-contract v-if="isShowRenewContractModal"
+ v-model:visible="isShowRenewContractModal"
+ :id="id"
+ @completed="handleQuery" />
<!-- 鍚堝悓瀵煎叆瀵硅瘽妗� -->
- <el-dialog
- :title="upload.title"
- v-model="upload.open"
- width="400px"
- append-to-body
- >
- <el-upload
- ref="uploadRef"
- :limit="1"
- accept=".xlsx, .xls"
- :headers="upload.headers"
- :action="upload.url + '?updateSupport=' + upload.updateSupport"
- :disabled="upload.isUploading"
- :on-progress="handleFileUploadProgress"
- :on-success="handleFileSuccess"
- :auto-upload="false"
- drag
- >
+ <el-dialog :title="upload.title"
+ v-model="upload.open"
+ width="400px"
+ append-to-body>
+ <el-upload ref="uploadRef"
+ :limit="1"
+ accept=".xlsx, .xls"
+ :headers="upload.headers"
+ :action="upload.url + '?updateSupport=' + upload.updateSupport"
+ :disabled="upload.isUploading"
+ :on-progress="handleFileUploadProgress"
+ :on-success="handleFileSuccess"
+ :auto-upload="false"
+ drag>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
<template #tip>
@@ -66,7 +78,8 @@
</el-upload>
<template #footer>
<div class="dialog-footer">
- <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+ <el-button type="primary"
+ @click="submitFileForm">纭� 瀹�</el-button>
<el-button @click="upload.open = false">鍙� 娑�</el-button>
</div>
</template>
@@ -76,258 +89,259 @@
</template>
<script setup>
-import { Search } from "@element-plus/icons-vue";
-import { onMounted, ref, defineAsyncComponent } from "vue";
-import FormDia from "@/views/personnelManagement/contractManagement/components/formDia.vue";
-const RenewContract = defineAsyncComponent(() => import("@/views/personnelManagement/employeeRecord/components/RenewContract.vue"));
-import { ElMessageBox } from "element-plus";
-import { staffOnJobListPage } from "@/api/personnelManagement/staffOnJob.js";
-import dayjs from "dayjs";
-import { getToken } from "@/utils/auth.js";
-import FilesDia from "./filesDia.vue";
-const data = reactive({
- searchForm: {
- staffName: "",
- entryDate: null, // 褰曞叆鏃ユ湡
- entryDateStart: undefined,
- entryDateEnd: undefined,
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍦ㄨ亴";
- } else {
- return null;
- }
+ import { Search } from "@element-plus/icons-vue";
+ import { onMounted, ref, defineAsyncComponent } from "vue";
+ import FormDia from "@/views/personnelManagement/contractManagement/components/formDia.vue";
+ const RenewContract = defineAsyncComponent(() =>
+ import(
+ "@/views/personnelManagement/employeeRecord/components/RenewContract.vue"
+ )
+ );
+ import { ElMessageBox } from "element-plus";
+ import { staffOnJobListPage } from "@/api/personnelManagement/staffOnJob.js";
+ import dayjs from "dayjs";
+ import { getToken } from "@/utils/auth.js";
+ import FilesDia from "./filesDia.vue";
+ const data = reactive({
+ searchForm: {
+ staffName: "",
+ entryDate: null, // 褰曞叆鏃ユ湡
+ entryDateStart: undefined,
+ entryDateEnd: undefined,
},
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "鎴风睄浣忓潃",
- prop: "nativePlace",
- },
- {
- label: "宀椾綅",
- prop: "postName",
- },
- {
- label: "鐜颁綇鍧�",
- prop: "adress",
- width: 200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width: 100
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width: 150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
- prop: "emergencyContactPhone",
- width: 150
- },
- // {
- // label: "鍚堝悓骞撮檺",
- // prop: "contractTerm",
- // },
- // {
- // label: "鍚堝悓寮�濮嬫棩鏈�",
- // prop: "contractStartTime",
- // width: 120
- // },
- {
- label: "鍚堝悓缁撴潫鏃ユ湡",
- prop: "contractExpireTime",
- width: 120
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- width: 160,
- operation: [
- {
- name: "璇︽儏",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
+ });
+ const { searchForm } = toRefs(data);
+ const tableColumn = ref([
+ {
+ label: "鐘舵��",
+ prop: "staffState",
+ dataType: "tag",
+ formatData: params => {
+ if (params == 0) {
+ return "绂昏亴";
+ } else if (params == 1) {
+ return "鍦ㄨ亴";
+ } else {
+ return null;
+ }
},
- {
- name: "缁鍚堝悓",
- type: "text",
- showHide: row => row.staffState === 1,
- clickFun: (row) => {
- isShowRenewContractModal.value = true;
- id.value = row.id;
+ formatType: params => {
+ if (params == 0) {
+ return "danger";
+ } else if (params == 1) {
+ return "primary";
+ } else {
+ return null;
+ }
+ },
+ },
+ {
+ label: "鍛樺伐缂栧彿",
+ prop: "staffNo",
+ },
+ {
+ label: "濮撳悕",
+ prop: "staffName",
+ },
+ {
+ label: "鎬у埆",
+ prop: "sex",
+ },
+ {
+ label: "宀椾綅",
+ prop: "postName",
+ },
+ {
+ label: "绗竴瀛﹀巻",
+ prop: "firstStudy",
+ },
+ {
+ label: "涓撲笟",
+ prop: "profession",
+ width: 100,
+ },
+ {
+ label: "骞撮緞",
+ prop: "age",
+ },
+ {
+ label: "鑱旂郴鐢佃瘽",
+ prop: "phone",
+ width: 150,
+ },
+ {
+ label: "绱ф�ヨ仈绯讳汉",
+ prop: "emergencyContact",
+ width: 120,
+ },
+ {
+ label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
+ prop: "emergencyContactPhone",
+ width: 150,
+ },
+ // {
+ // label: "鍚堝悓骞撮檺",
+ // prop: "contractTerm",
+ // },
+ // {
+ // label: "鍚堝悓寮�濮嬫棩鏈�",
+ // prop: "contractStartTime",
+ // width: 120
+ // },
+ {
+ label: "鍚堝悓缁撴潫鏃ユ湡",
+ prop: "contractExpireTime",
+ width: 120,
+ },
+ {
+ dataType: "action",
+ label: "鎿嶄綔",
+ align: "center",
+ fixed: "right",
+ width: 160,
+ operation: [
+ {
+ name: "璇︽儏",
+ type: "text",
+ clickFun: row => {
+ openForm("edit", row);
+ },
},
- }
- ],
- },
-]);
-const filesDia = ref()
-const isShowRenewContractModal = ref(false);
-const id = ref(0);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
+ {
+ name: "缁鍚堝悓",
+ type: "text",
+ showHide: row => row.staffState === 1,
+ clickFun: row => {
+ isShowRenewContractModal.value = true;
+ id.value = row.id;
+ },
+ },
+ ],
+ },
+ ]);
+ const filesDia = ref();
+ const isShowRenewContractModal = ref(false);
+ const id = ref(0);
+ const tableData = ref([]);
+ const selectedRows = ref([]);
+ const tableLoading = ref(false);
+ const page = reactive({
+ current: 1,
+ size: 100,
+ total: 0,
+ });
+ const formDia = ref();
+ const { proxy } = getCurrentInstance();
-const changeDaterange = (value) => {
- searchForm.value.entryDateStart = undefined;
- searchForm.value.entryDateEnd = undefined;
- if (value) {
- searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
- searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
- }
- getList();
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
- console.log(row)
- nextTick(() => {
- filesDia.value?.openDialog( row,'鍚堝悓')
- })
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- params.entryDate = undefined
- params.staffState = 1
- staffOnJobListPage(params).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
- .then(() => {
- proxy.download("/staff/staffOnJob/export", {staffState: 1}, "鍚堝悓绠$悊.xlsx");
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
+ const changeDaterange = value => {
+ searchForm.value.entryDateStart = undefined;
+ searchForm.value.entryDateEnd = undefined;
+ if (value) {
+ searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+ searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+ }
+ getList();
+ };
+ // 鎵撳紑闄勪欢寮规
+ const openFilesFormDia = row => {
+ console.log(row);
+ nextTick(() => {
+ filesDia.value?.openDialog(row, "鍚堝悓");
});
-};
-const upload = reactive({
- // 鏄惁鏄剧ず寮瑰嚭灞傦紙鍚堝悓瀵煎叆锛�
- open: false,
- // 寮瑰嚭灞傛爣棰橈紙鍚堝悓瀵煎叆锛�
- title: "",
- // 鏄惁绂佺敤涓婁紶
- isUploading: false,
- // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
- updateSupport: 1,
- // 璁剧疆涓婁紶鐨勮姹傚ご閮�
- headers: { Authorization: "Bearer " + getToken() },
- // 涓婁紶鐨勫湴鍧�
- url: import.meta.env.VITE_APP_BASE_API + "/staff/staffOnJob/import",
-});
-/** 瀵煎叆鎸夐挳鎿嶄綔 */
-function handleImport() {
- upload.title = "鍚堝悓瀵煎叆";
- upload.open = true;
-}
-/** 鎻愪氦涓婁紶鏂囦欢 */
-function submitFileForm() {
- console.log(upload.url + '?updateSupport=' + upload.updateSupport)
- proxy.$refs["uploadRef"].submit();
-}
-/**鏂囦欢涓婁紶涓鐞� */
-const handleFileUploadProgress = (event, file, fileList) => {
- upload.isUploading = true;
-};
-/** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
-const handleFileSuccess = (response, file, fileList) => {
- upload.open = false;
- upload.isUploading = false;
- proxy.$refs["uploadRef"].handleRemove(file);
- getList();
-};
-onMounted(() => {
- getList();
-});
+ };
+ // 鏌ヨ鍒楄〃
+ /** 鎼滅储鎸夐挳鎿嶄綔 */
+ const handleQuery = () => {
+ page.current = 1;
+ getList();
+ };
+ const pagination = obj => {
+ page.current = obj.page;
+ page.size = obj.limit;
+ getList();
+ };
+ const getList = () => {
+ tableLoading.value = true;
+ const params = { ...searchForm.value, ...page };
+ params.entryDate = undefined;
+ params.staffState = 1;
+ staffOnJobListPage(params)
+ .then(res => {
+ tableLoading.value = false;
+ tableData.value = res.data.records;
+ page.total = res.data.total;
+ })
+ .catch(err => {
+ tableLoading.value = false;
+ });
+ };
+ // 琛ㄦ牸閫夋嫨鏁版嵁
+ const handleSelectionChange = selection => {
+ selectedRows.value = selection;
+ };
+
+ // 鎵撳紑寮规
+ const openForm = (type, row) => {
+ nextTick(() => {
+ formDia.value?.openDialog(type, row);
+ });
+ };
+ // 瀵煎嚭
+ const handleOut = () => {
+ ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ proxy.download(
+ "/staff/staffOnJob/export",
+ { staffState: 1 },
+ "鍚堝悓绠$悊.xlsx"
+ );
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+ };
+ const upload = reactive({
+ // 鏄惁鏄剧ず寮瑰嚭灞傦紙鍚堝悓瀵煎叆锛�
+ open: false,
+ // 寮瑰嚭灞傛爣棰橈紙鍚堝悓瀵煎叆锛�
+ title: "",
+ // 鏄惁绂佺敤涓婁紶
+ isUploading: false,
+ // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+ updateSupport: 1,
+ // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+ headers: { Authorization: "Bearer " + getToken() },
+ // 涓婁紶鐨勫湴鍧�
+ url: import.meta.env.VITE_APP_BASE_API + "/staff/staffOnJob/import",
+ });
+ /** 瀵煎叆鎸夐挳鎿嶄綔 */
+ function handleImport() {
+ upload.title = "鍚堝悓瀵煎叆";
+ upload.open = true;
+ }
+ /** 鎻愪氦涓婁紶鏂囦欢 */
+ function submitFileForm() {
+ console.log(upload.url + "?updateSupport=" + upload.updateSupport);
+ proxy.$refs["uploadRef"].submit();
+ }
+ /**鏂囦欢涓婁紶涓鐞� */
+ const handleFileUploadProgress = (event, file, fileList) => {
+ upload.isUploading = true;
+ };
+ /** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
+ const handleFileSuccess = (response, file, fileList) => {
+ upload.open = false;
+ upload.isUploading = false;
+ proxy.$refs["uploadRef"].handleRemove(file);
+ getList();
+ };
+ onMounted(() => {
+ getList();
+ });
</script>
<style scoped></style>
diff --git a/src/views/personnelManagement/dimission/components/formDia.vue b/src/views/personnelManagement/dimission/components/formDia.vue
index 86c59ce..20c1794 100644
--- a/src/views/personnelManagement/dimission/components/formDia.vue
+++ b/src/views/personnelManagement/dimission/components/formDia.vue
@@ -1,29 +1,31 @@
<template>
<div>
- <el-dialog
- v-model="dialogFormVisible"
- :title="operationType === 'add' ? '鏂板绂昏亴' : '缂栬緫绂昏亴'"
- width="70%"
- @close="closeDia"
- >
+ <el-dialog v-model="dialogFormVisible"
+ :title="operationType === 'add' ? '鏂板绂昏亴' : '缂栬緫绂昏亴'"
+ width="70%"
+ @close="closeDia">
<!-- 鍛樺伐淇℃伅灞曠ず鍖哄煙 -->
<div class="info-section">
<div class="info-title">鍛樺伐淇℃伅</div>
- <el-form :model="form" label-width="200px" label-position="left" :rules="rules" ref="formRef" style="margin-top: 20px">
+ <el-form :model="form"
+ label-width="200px"
+ label-position="left"
+ :rules="rules"
+ ref="formRef"
+ style="margin-top: 20px">
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="濮撳悕锛�" prop="staffOnJobId">
+ <el-form-item label="濮撳悕锛�"
+ prop="staffOnJobId">
<el-select v-model="form.staffOnJobId"
placeholder="璇烽�夋嫨浜哄憳"
style="width: 100%"
:disabled="operationType === 'edit'"
@change="handleSelect">
- <el-option
- v-for="item in personList"
- :key="item.id"
- :label="item.staffName"
- :value="item.id"
- />
+ <el-option v-for="item in personList"
+ :key="item.id"
+ :label="item.staffName"
+ :value="item.id" />
</el-select>
</el-form-item>
</el-col>
@@ -39,21 +41,11 @@
{{ currentStaffRecord.sex || '-' }}
</el-form-item>
</el-col>
- <el-col :span="12">
- <el-form-item label="鎴风睄浣忓潃锛�">
- {{ currentStaffRecord.nativePlace || '-' }}
- </el-form-item>
- </el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
<el-form-item label="宀椾綅锛�">
{{ currentStaffRecord.postName || '-' }}
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="鐜颁綇鍧�锛�">
- {{ currentStaffRecord.adress || '-' }}
</el-form-item>
</el-col>
</el-row>
@@ -97,74 +89,74 @@
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="绂昏亴鏃ユ湡锛�" prop="leaveDate">
- <el-date-picker
- v-model="form.leaveDate"
- type="date"
- :disabled="operationType === 'edit'"
- :disabled-date="disabledFutureDate"
- placeholder="璇烽�夋嫨绂昏亴鏃ユ湡"
- value-format="YYYY-MM-DD"
- format="YYYY-MM-DD"
- style="width: 100%"
- />
+ <el-form-item label="绂昏亴鏃ユ湡锛�"
+ prop="leaveDate">
+ <el-date-picker v-model="form.leaveDate"
+ type="date"
+ :disabled="operationType === 'edit'"
+ :disabled-date="disabledFutureDate"
+ placeholder="璇烽�夋嫨绂昏亴鏃ユ湡"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="绂昏亴鍘熷洜锛�" prop="reason">
- <el-select v-model="form.reason" placeholder="璇烽�夋嫨绂昏亴鍘熷洜" style="width: 100%" @change="handleSelectDimissionReason">
- <el-option
- v-for="(item, index) in dimissionReasonOptions"
- :key="index"
- :label="item.label"
- :value="item.value"
- />
+ <el-form-item label="绂昏亴鍘熷洜锛�"
+ prop="reason">
+ <el-select v-model="form.reason"
+ placeholder="璇烽�夋嫨绂昏亴鍘熷洜"
+ style="width: 100%"
+ @change="handleSelectDimissionReason">
+ <el-option v-for="(item, index) in dimissionReasonOptions"
+ :key="index"
+ :label="item.label"
+ :value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="澶囨敞锛�" prop="remark" v-if="form.reason === 'other'">
- <el-input
- v-model="form.remark"
- type="textarea"
- :rows="3"
- placeholder="澶囨敞"
- maxlength="500"
- show-word-limit
- />
+ <el-form-item label="澶囨敞锛�"
+ prop="remark"
+ v-if="form.reason === 'other'">
+ <el-input v-model="form.remark"
+ type="textarea"
+ :rows="3"
+ placeholder="澶囨敞"
+ maxlength="500"
+ show-word-limit />
</el-form-item>
</el-col>
</el-row>
</el-form>
-
-<!-- <el-row :gutter="30">-->
-<!-- <el-col :span="12">-->
-<!-- <div class="info-item">-->
-<!-- <span class="info-label">绂昏亴鍘熷洜锛�</span>-->
-<!-- <el-select v-model="form.reason" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect">-->
-<!-- <el-option-->
-<!-- v-for="(item, index) in dimissionReasonOptions"-->
-<!-- :key="index"-->
-<!-- :label="item.label"-->
-<!-- :value="item.value"-->
-<!-- />-->
-<!-- </el-select>-->
-<!-- </div>-->
-<!-- </el-col>-->
-<!-- <el-col :span="12">-->
-<!-- <div class="info-item">-->
-<!-- <span class="info-label">鍛樺伐缂栧彿锛�</span>-->
-<!-- <span class="info-value">{{ form.staffNo || '-' }}</span>-->
-<!-- </div>-->
-<!-- </el-col>-->
-<!-- </el-row>-->
+ <!-- <el-row :gutter="30">-->
+ <!-- <el-col :span="12">-->
+ <!-- <div class="info-item">-->
+ <!-- <span class="info-label">绂昏亴鍘熷洜锛�</span>-->
+ <!-- <el-select v-model="form.reason" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect">-->
+ <!-- <el-option-->
+ <!-- v-for="(item, index) in dimissionReasonOptions"-->
+ <!-- :key="index"-->
+ <!-- :label="item.label"-->
+ <!-- :value="item.value"-->
+ <!-- />-->
+ <!-- </el-select>-->
+ <!-- </div>-->
+ <!-- </el-col>-->
+ <!-- <el-col :span="12">-->
+ <!-- <div class="info-item">-->
+ <!-- <span class="info-label">鍛樺伐缂栧彿锛�</span>-->
+ <!-- <span class="info-value">{{ form.staffNo || '-' }}</span>-->
+ <!-- </div>-->
+ <!-- </el-col>-->
+ <!-- </el-row>-->
</div>
-
<template #footer>
<div class="dialog-footer">
- <el-button type="primary" @click="submitForm">纭</el-button>
+ <el-button type="primary"
+ @click="submitForm">纭</el-button>
<el-button @click="closeDia">鍙栨秷</el-button>
</div>
</template>
@@ -173,175 +165,180 @@
</template>
<script setup>
-import {ref, reactive, toRefs, getCurrentInstance} from "vue";
-import {staffOnJobListPage} from "@/api/personnelManagement/staffOnJob.js";
-import {createStaffLeave, updateStaffLeave} from "@/api/personnelManagement/staffLeave.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
+ import { ref, reactive, toRefs, getCurrentInstance } from "vue";
+ import { staffOnJobListPage } from "@/api/personnelManagement/staffOnJob.js";
+ import {
+ createStaffLeave,
+ updateStaffLeave,
+ } from "@/api/personnelManagement/staffLeave.js";
+ const { proxy } = getCurrentInstance();
+ const emit = defineEmits(["close"]);
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const getTodayDate = () => {
- const now = new Date();
- const year = now.getFullYear();
- const month = `${now.getMonth() + 1}`.padStart(2, '0');
- const day = `${now.getDate()}`.padStart(2, '0');
- return `${year}-${month}-${day}`;
-};
-
-const disabledFutureDate = (time) => {
- const todayEnd = new Date();
- todayEnd.setHours(23, 59, 59, 999);
- return time.getTime() > todayEnd.getTime();
-};
-const data = reactive({
- form: {
- staffOnJobId: undefined,
- leaveDate: "",
- reason: "",
- remark: "",
- },
- rules: {
- staffName: [{ required: true, message: "璇烽�夋嫨浜哄憳" }],
- leaveDate: [{ required: true, message: "璇烽�夋嫨绂昏亴鏃ユ湡", trigger: "change" }],
- reason: [{ required: true, message: "璇烽�夋嫨绂昏亴鍘熷洜"}],
- },
- dimissionReasonOptions: [
- {label: '钖祫寰呴亣', value: 'salary'},
- {label: '鑱屼笟鍙戝睍', value: 'career_development'},
- {label: '宸ヤ綔鐜', value: 'work_environment'},
- {label: '涓汉鍘熷洜', value: 'personal_reason'},
- {label: '鍏朵粬', value: 'other'},
- ],
- currentStaffRecord: {},
-});
-const { form, rules, dimissionReasonOptions, currentStaffRecord } = toRefs(data);
-
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
- operationType.value = type;
- dialogFormVisible.value = true;
- if (operationType.value === 'edit') {
- currentStaffRecord.value = row
- form.value.staffOnJobId = row.staffOnJobId
- form.value.leaveDate = row.leaveDate
- form.value.reason = row.reason
- form.value.remark = row.remark
- personList.value = [
- {
- staffName: row.staffName,
- id: row.staffOnJobId,
- }
- ]
- } else {
- form.value.leaveDate = getTodayDate()
- getList()
- }
-}
-
-const handleSelectDimissionReason = (val) => {
- if (val === 'other') {
- form.value.remark = ''
- }
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- form.value.staffState = 0
- if (form.value.reason !== 'other') {
- form.value.remark = ''
- }
- proxy.$refs["formRef"].validate(valid => {
- if (valid) {
- if (operationType.value === "add") {
- createStaffLeave(form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- } else {
- updateStaffLeave(currentStaffRecord.value.id, form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
- }
- }
- })
-
-}
-// 鍏抽棴寮规
-const closeDia = () => {
- // 琛ㄥ崟宸叉敞閲婏紝鎵嬪姩閲嶇疆琛ㄥ崟鏁版嵁
- form.value = {
- staffOnJobId: undefined,
- leaveDate: "",
- reason: "",
- remark: "",
+ const dialogFormVisible = ref(false);
+ const operationType = ref("");
+ const getTodayDate = () => {
+ const now = new Date();
+ const year = now.getFullYear();
+ const month = `${now.getMonth() + 1}`.padStart(2, "0");
+ const day = `${now.getDate()}`.padStart(2, "0");
+ return `${year}-${month}-${day}`;
};
- dialogFormVisible.value = false;
- emit('close')
-};
-const personList = ref([]);
+ const disabledFutureDate = time => {
+ const todayEnd = new Date();
+ todayEnd.setHours(23, 59, 59, 999);
+ return time.getTime() > todayEnd.getTime();
+ };
+ const data = reactive({
+ form: {
+ staffOnJobId: undefined,
+ leaveDate: "",
+ reason: "",
+ remark: "",
+ },
+ rules: {
+ staffName: [{ required: true, message: "璇烽�夋嫨浜哄憳" }],
+ leaveDate: [
+ { required: true, message: "璇烽�夋嫨绂昏亴鏃ユ湡", trigger: "change" },
+ ],
+ reason: [{ required: true, message: "璇烽�夋嫨绂昏亴鍘熷洜" }],
+ },
+ dimissionReasonOptions: [
+ { label: "钖祫寰呴亣", value: "salary" },
+ { label: "鑱屼笟鍙戝睍", value: "career_development" },
+ { label: "宸ヤ綔鐜", value: "work_environment" },
+ { label: "涓汉鍘熷洜", value: "personal_reason" },
+ { label: "鍏朵粬", value: "other" },
+ ],
+ currentStaffRecord: {},
+ });
+ const { form, rules, dimissionReasonOptions, currentStaffRecord } =
+ toRefs(data);
-/**
- * 鑾峰彇褰撳墠鍦ㄨ亴浜哄憳鍒楄〃
- */
-const getList = () => {
- staffOnJobListPage({
- current: -1,
- size: -1,
- staffState: 1
- }).then(res => {
- personList.value = res.data.records || []
- })
-};
+ // 鎵撳紑寮规
+ const openDialog = (type, row) => {
+ operationType.value = type;
+ dialogFormVisible.value = true;
+ if (operationType.value === "edit") {
+ currentStaffRecord.value = row;
+ form.value.staffOnJobId = row.staffOnJobId;
+ form.value.leaveDate = row.leaveDate;
+ form.value.reason = row.reason;
+ form.value.remark = row.remark;
+ personList.value = [
+ {
+ staffName: row.staffName,
+ id: row.staffOnJobId,
+ },
+ ];
+ } else {
+ form.value.leaveDate = getTodayDate();
+ getList();
+ }
+ };
-const handleSelect = (val) => {
- let obj = personList.value.find(item => item.id === val)
- currentStaffRecord.value = {}
- if (obj) {
- // 淇濈暀绂昏亴鏃ユ湡鍜岀鑱屽師鍥狅紝鍙洿鏂板憳宸ヤ俊鎭�
- currentStaffRecord.value = obj
- }
-}
-defineExpose({
- openDialog,
-});
+ const handleSelectDimissionReason = val => {
+ if (val === "other") {
+ form.value.remark = "";
+ }
+ };
+ // 鎻愪氦浜у搧琛ㄥ崟
+ const submitForm = () => {
+ form.value.staffState = 0;
+ if (form.value.reason !== "other") {
+ form.value.remark = "";
+ }
+ proxy.$refs["formRef"].validate(valid => {
+ if (valid) {
+ if (operationType.value === "add") {
+ createStaffLeave(form.value).then(res => {
+ proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+ closeDia();
+ });
+ } else {
+ updateStaffLeave(currentStaffRecord.value.id, form.value).then(res => {
+ proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+ closeDia();
+ });
+ }
+ }
+ });
+ };
+ // 鍏抽棴寮规
+ const closeDia = () => {
+ // 琛ㄥ崟宸叉敞閲婏紝鎵嬪姩閲嶇疆琛ㄥ崟鏁版嵁
+ form.value = {
+ staffOnJobId: undefined,
+ leaveDate: "",
+ reason: "",
+ remark: "",
+ };
+ dialogFormVisible.value = false;
+ emit("close");
+ };
+
+ const personList = ref([]);
+
+ /**
+ * 鑾峰彇褰撳墠鍦ㄨ亴浜哄憳鍒楄〃
+ */
+ const getList = () => {
+ staffOnJobListPage({
+ current: -1,
+ size: -1,
+ staffState: 1,
+ }).then(res => {
+ personList.value = res.data.records || [];
+ });
+ };
+
+ const handleSelect = val => {
+ let obj = personList.value.find(item => item.id === val);
+ currentStaffRecord.value = {};
+ if (obj) {
+ // 淇濈暀绂昏亴鏃ユ湡鍜岀鑱屽師鍥狅紝鍙洿鏂板憳宸ヤ俊鎭�
+ currentStaffRecord.value = obj;
+ }
+ };
+ defineExpose({
+ openDialog,
+ });
</script>
<style scoped>
-.info-section {
- background: #f5f7fa;
- padding: 20px;
- border-radius: 8px;
- margin-bottom: 20px;
-}
+ .info-section {
+ background: #f5f7fa;
+ padding: 20px;
+ border-radius: 8px;
+ margin-bottom: 20px;
+ }
-.info-title {
- font-size: 16px;
- font-weight: 600;
- color: #303133;
- margin-bottom: 20px;
- padding-bottom: 10px;
- border-bottom: 1px solid #e4e7ed;
-}
+ .info-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #303133;
+ margin-bottom: 20px;
+ padding-bottom: 10px;
+ border-bottom: 1px solid #e4e7ed;
+ }
-.info-item {
- display: flex;
- align-items: center;
- margin-bottom: 16px;
- min-height: 32px;
-}
+ .info-item {
+ display: flex;
+ align-items: center;
+ margin-bottom: 16px;
+ min-height: 32px;
+ }
-.info-label {
- min-width: 140px;
- color: #606266;
- font-size: 14px;
- font-weight: 500;
-}
+ .info-label {
+ min-width: 140px;
+ color: #606266;
+ font-size: 14px;
+ font-weight: 500;
+ }
-.info-value {
- flex: 1;
- color: #303133;
- font-size: 14px;
-}
+ .info-value {
+ flex: 1;
+ color: #303133;
+ font-size: 14px;
+ }
</style>
diff --git a/src/views/personnelManagement/dimission/index.vue b/src/views/personnelManagement/dimission/index.vue
index c2b8c3e..4a37ae3 100644
--- a/src/views/personnelManagement/dimission/index.vue
+++ b/src/views/personnelManagement/dimission/index.vue
@@ -3,216 +3,209 @@
<div class="search_form mb20">
<div>
<span class="search_title">濮撳悕锛�</span>
- <el-input
- v-model="searchForm.staffName"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search"
- />
- <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
- >鎼滅储</el-button
- >
+ <el-input v-model="searchForm.staffName"
+ style="width: 240px"
+ placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
+ @change="handleQuery"
+ clearable
+ :prefix-icon="Search" />
+ <el-button type="primary"
+ @click="handleQuery"
+ style="margin-left: 10px">鎼滅储</el-button>
</div>
<div>
- <el-button type="primary" @click="openForm('add')">鏂板绂昏亴</el-button>
+ <el-button type="primary"
+ @click="openForm('add')">鏂板绂昏亴</el-button>
<el-button @click="handleOut">瀵煎嚭</el-button>
<!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> -->
</div>
</div>
<div class="table_list">
- <PIMTable
- rowKey="id"
- :column="tableColumn"
- :tableData="tableData"
- :page="page"
- :isSelection="true"
- @selection-change="handleSelectionChange"
- :tableLoading="tableLoading"
- @pagination="pagination"
- :total="page.total"
- ></PIMTable>
+ <PIMTable rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :page="page"
+ :isSelection="true"
+ @selection-change="handleSelectionChange"
+ :tableLoading="tableLoading"
+ @pagination="pagination"
+ :total="page.total"></PIMTable>
</div>
- <form-dia ref="formDia" @close="handleQuery"></form-dia>
+ <form-dia ref="formDia"
+ @close="handleQuery"></form-dia>
</div>
</template>
<script setup>
-import { Search } from "@element-plus/icons-vue";
-import {onMounted, ref} from "vue";
-import FormDia from "@/views/personnelManagement/dimission/components/formDia.vue";
-import {findStaffLeaveListPage, batchDeleteStaffLeaves} from "@/api/personnelManagement/staffLeave.js";
-import {ElMessageBox} from "element-plus";
+ import { Search } from "@element-plus/icons-vue";
+ import { onMounted, ref } from "vue";
+ import FormDia from "@/views/personnelManagement/dimission/components/formDia.vue";
+ import {
+ findStaffLeaveListPage,
+ batchDeleteStaffLeaves,
+ } from "@/api/personnelManagement/staffLeave.js";
+ import { ElMessageBox } from "element-plus";
-const data = reactive({
- searchForm: {
- staffName: "",
- },
-});
-const { searchForm } = toRefs(data);
-const tableColumn = ref([
- {
- label: "鐘舵��",
- prop: "staffState",
- dataType: "tag",
- formatData: (params) => {
- if (params == 0) {
- return "绂昏亴";
- } else if (params == 1) {
- return "鍦ㄨ亴";
- } else {
- return null;
- }
+ const data = reactive({
+ searchForm: {
+ staffName: "",
},
- formatType: (params) => {
- if (params == 0) {
- return "danger";
- } else if (params == 1) {
- return "primary";
- } else {
- return null;
- }
- },
- },
- {
- label: "绂昏亴鏃ユ湡",
- prop: "leaveDate",
- },
- {
- label: "鍛樺伐缂栧彿",
- prop: "staffNo",
- },
- {
- label: "濮撳悕",
- prop: "staffName",
- },
- {
- label: "鎬у埆",
- prop: "sex",
- },
- {
- label: "鎴风睄浣忓潃",
- prop: "nativePlace",
- },
- {
- label: "閮ㄩ棬",
- prop: "deptName",
- },
- {
- label: "宀椾綅",
- prop: "postName",
- },
- {
- label: "鐜颁綇鍧�",
- prop: "adress",
- width:200
- },
- {
- label: "绗竴瀛﹀巻",
- prop: "firstStudy",
- },
- {
- label: "涓撲笟",
- prop: "profession",
- width:100
- },
- {
- label: "骞撮緞",
- prop: "age",
- },
- {
- label: "鑱旂郴鐢佃瘽",
- prop: "phone",
- width:150
- },
- {
- label: "绱ф�ヨ仈绯讳汉",
- prop: "emergencyContact",
- width: 120
- },
- {
- label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
- prop: "emergencyContactPhone",
- width:150
- },
- {
- dataType: "action",
- label: "鎿嶄綔",
- align: "center",
- fixed: 'right',
- operation: [
- {
- name: "缂栬緫",
- type: "text",
- clickFun: (row) => {
- openForm("edit", row);
- },
+ });
+ const { searchForm } = toRefs(data);
+ const tableColumn = ref([
+ {
+ label: "鐘舵��",
+ prop: "staffState",
+ dataType: "tag",
+ formatData: params => {
+ if (params == 0) {
+ return "绂昏亴";
+ } else if (params == 1) {
+ return "鍦ㄨ亴";
+ } else {
+ return null;
+ }
},
- ],
- },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
- current: 1,
- size: 100,
- total: 0,
-});
-const formDia = ref()
-const { proxy } = getCurrentInstance()
+ formatType: params => {
+ if (params == 0) {
+ return "danger";
+ } else if (params == 1) {
+ return "primary";
+ } else {
+ return null;
+ }
+ },
+ },
+ {
+ label: "绂昏亴鏃ユ湡",
+ prop: "leaveDate",
+ },
+ {
+ label: "鍛樺伐缂栧彿",
+ prop: "staffNo",
+ },
+ {
+ label: "濮撳悕",
+ prop: "staffName",
+ },
+ {
+ label: "鎬у埆",
+ prop: "sex",
+ },
+ {
+ label: "閮ㄩ棬",
+ prop: "deptName",
+ },
+ {
+ label: "宀椾綅",
+ prop: "postName",
+ },
+ {
+ label: "绗竴瀛﹀巻",
+ prop: "firstStudy",
+ },
+ {
+ label: "涓撲笟",
+ prop: "profession",
+ width: 100,
+ },
+ {
+ label: "骞撮緞",
+ prop: "age",
+ },
+ {
+ label: "鑱旂郴鐢佃瘽",
+ prop: "phone",
+ width: 150,
+ },
+ {
+ label: "绱ф�ヨ仈绯讳汉",
+ prop: "emergencyContact",
+ width: 120,
+ },
+ {
+ label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
+ prop: "emergencyContactPhone",
+ width: 150,
+ },
+ {
+ dataType: "action",
+ label: "鎿嶄綔",
+ align: "center",
+ fixed: "right",
+ operation: [
+ {
+ name: "缂栬緫",
+ type: "text",
+ clickFun: row => {
+ openForm("edit", row);
+ },
+ },
+ ],
+ },
+ ]);
+ const tableData = ref([]);
+ const selectedRows = ref([]);
+ const tableLoading = ref(false);
+ const page = reactive({
+ current: 1,
+ size: 100,
+ total: 0,
+ });
+ const formDia = ref();
+ const { proxy } = getCurrentInstance();
+ // 鏌ヨ鍒楄〃
+ /** 鎼滅储鎸夐挳鎿嶄綔 */
+ const handleQuery = () => {
+ page.current = 1;
+ getList();
+ };
+ const pagination = obj => {
+ page.current = obj.page;
+ page.size = obj.limit;
+ getList();
+ };
+ const getList = () => {
+ tableLoading.value = true;
+ findStaffLeaveListPage({ ...page, ...searchForm.value })
+ .then(res => {
+ tableLoading.value = false;
+ tableData.value = res.data.records;
+ page.total = res.data.total;
+ })
+ .catch(err => {
+ tableLoading.value = false;
+ });
+ };
+ // 琛ㄦ牸閫夋嫨鏁版嵁
+ const handleSelectionChange = selection => {
+ selectedRows.value = selection;
+ };
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
- page.current = 1;
- getList();
-};
-const pagination = (obj) => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
-};
-const getList = () => {
- tableLoading.value = true;
- findStaffLeaveListPage({...page, ...searchForm.value}).then(res => {
- tableLoading.value = false;
- tableData.value = res.data.records
- page.total = res.data.total;
- }).catch(err => {
- tableLoading.value = false;
- })
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
- selectedRows.value = selection;
-};
+ // 鎵撳紑寮规
+ const openForm = (type, row) => {
+ nextTick(() => {
+ formDia.value?.openDialog(type, row);
+ });
+ };
-// 鎵撳紑寮规
-const openForm = (type, row) => {
- nextTick(() => {
- formDia.value?.openDialog(type, row)
- })
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
- let ids = [];
- if (selectedRows.value.length > 0) {
- ids = selectedRows.value.map((item) => item.id);
- } else {
- proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
- return;
- }
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
+ // 鍒犻櫎
+ const handleDelete = () => {
+ let ids = [];
+ if (selectedRows.value.length > 0) {
+ ids = selectedRows.value.map(item => item.id);
+ } else {
+ proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+ return;
+ }
+ ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
.then(() => {
- batchDeleteStaffLeaves(ids).then((res) => {
+ batchDeleteStaffLeaves(ids).then(res => {
proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
getList();
});
@@ -220,24 +213,24 @@
.catch(() => {
proxy.$modal.msg("宸插彇娑�");
});
-};
-// 瀵煎嚭
-const handleOut = () => {
- ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- })
+ };
+ // 瀵煎嚭
+ const handleOut = () => {
+ ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
.then(() => {
proxy.download("/staff/staffLeave/export", {}, "浜哄憳绂昏亴.xlsx");
})
.catch(() => {
proxy.$modal.msg("宸插彇娑�");
});
-};
-onMounted(() => {
- getList();
-});
+ };
+ onMounted(() => {
+ getList();
+ });
</script>
<style scoped></style>
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 99b4b39..7fba9cb 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -46,6 +46,10 @@
prop="paymentAmount"
show-overflow-tooltip
:formatter="formattedNumber" />
+ <el-table-column label="閫�璐ч噾棰�(鍏�)"
+ prop="returnAmount"
+ show-overflow-tooltip
+ :formatter="formattedNumber" />
<el-table-column label="搴斾粯閲戦(鍏�)"
prop="payableAmount"
show-overflow-tooltip>
@@ -153,6 +157,14 @@
},
},
{
+ label: "閫�璐ч噾棰�(鍏�)",
+ prop: "returnAmount",
+ width: 200,
+ formatData: params => {
+ return params ? parseFloat(params).toFixed(2) : 0;
+ },
+ },
+ {
label: "搴斾粯閲戦(鍏�)",
dataType: "slot",
width: 200,
@@ -170,7 +182,7 @@
const summarizeMainTable = param => {
return proxy.summarizeTable(
param,
- ["contractAmounts", "paymentAmount", "payableAmount"],
+ ["contractAmounts", "paymentAmount", "returnAmount", "payableAmount"],
{
ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -181,7 +193,7 @@
const summarizeMainTable1 = param => {
let summarizeTable = proxy.summarizeTable(
param,
- ["contractAmount", "invoiceAmount", "paymentAmount"],
+ ["contractAmount", "invoiceAmount", "paymentAmount", "returnAmount"],
{
ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 6d9cae6..7e1576b 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -121,6 +121,8 @@
</el-table-column>
<el-table-column label="鏁伴噺"
prop="quantity" />
+ <el-table-column label="閿�鍞彂璐ф暟閲�"
+ prop="shippedQuantity" />
<el-table-column label="鍙敤鏁伴噺"
prop="availableQuality" />
<el-table-column label="閫�璐ф暟閲�"
diff --git a/src/views/procurementManagement/purchaseReturnOrder/New.vue b/src/views/procurementManagement/purchaseReturnOrder/New.vue
index f4771d3..186a552 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/New.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/New.vue
@@ -58,6 +58,63 @@
</el-form-item>
<el-form-item
+ label="鍙戣揣绫诲瀷"
+ prop="shippingType"
+ :rules="[
+ {
+ required: true,
+ message: '璇烽�夋嫨鍙戣揣绫诲瀷',
+ trigger: 'change',
+ }
+ ]"
+ >
+ <el-select
+ v-model="formState.shippingType"
+ placeholder="璇烽�夋嫨鍙戣揣绫诲瀷"
+ style="width: 240px"
+ @change="handleShippingTypeChange"
+ >
+ <el-option label="璐ц溅" :value="1" />
+ <el-option label="蹇��" :value="2" />
+ </el-select>
+ </el-form-item>
+
+ <el-form-item
+ v-if="formState.shippingType === 1"
+ label="鍙戣揣杞︾墝鍙�"
+ prop="truckPlateNo"
+ >
+ <el-input
+ v-model="formState.truckPlateNo"
+ placeholder="璇疯緭鍏ュ彂璐ц溅鐗屽彿"
+ style="width: 240px"
+ />
+ </el-form-item>
+
+ <template v-else-if="formState.shippingType === 2">
+ <el-form-item
+ label="蹇�掑叕鍙�"
+ prop="expressCompany"
+ >
+ <el-input
+ v-model="formState.expressCompany"
+ placeholder="璇疯緭鍏ュ揩閫掑叕鍙�"
+ style="width: 240px"
+ />
+ </el-form-item>
+ <el-form-item
+ label="蹇�掑崟鍙�"
+ prop="expressNo"
+ >
+ <el-input
+ v-model="formState.expressNo"
+ placeholder="璇疯緭鍏ュ揩閫掑崟鍙�"
+ style="width: 240px"
+ />
+ </el-form-item>
+ </template>
+
+ <el-form-item
label="渚涘簲鍟嗗悕绉�"
prop="supplierId"
:rules="[
@@ -259,13 +316,16 @@
<el-table-column label="鏁伴噺"
prop="stockInNum"
width="100" />
+ <el-table-column label="閿�鍞彂璐ф暟閲�"
+ prop="saleOutQuantity"
+ width="120" />
<el-table-column label="鍙��璐ф暟閲�"
prop="unQuantity"
width="130" />
<el-table-column label="宸查��璐ф暟閲�"
width="130">
<template #default="scope">
- {{ calcAlreadyReturned(scope.row) }}
+ {{ formattedNumber(scope.row, null, scope.row.totalReturnNum || 0) }}
</template>
</el-table-column>
<el-table-column label="閫�璐ф暟閲�"
@@ -455,6 +515,10 @@
no: '',
isDefaultNo: true,
returnType: 0,
+ shippingType: undefined,
+ truckPlateNo: '',
+ expressCompany: '',
+ expressNo: '',
incomeType: undefined,
remark: '',
supplierId: undefined,
@@ -501,6 +565,19 @@
// 鏄惁灞曠ず浜у搧鍒楄〃鏁版嵁
const isShowProductsModal = ref(false)
+const handleShippingTypeChange = (val) => {
+ if (val === 1) {
+ formState.value.expressCompany = '';
+ formState.value.expressNo = '';
+ } else if (val === 2) {
+ formState.value.truckPlateNo = '';
+ } else {
+ formState.value.truckPlateNo = '';
+ formState.value.expressCompany = '';
+ formState.value.expressNo = '';
+ }
+};
+
const isShow = computed({
get() {
return props.visible;
@@ -528,14 +605,6 @@
const toNumber = (val) => {
const num = Number(val)
return Number.isNaN(num) ? 0 : num
-}
-
-/** 宸查��璐ф暟閲� = 鍏ュ簱琛屾�绘暟閲� 鈭� 褰撳墠鍙��璐ф暟閲忥紙鍓╀綑锛� */
-const calcAlreadyReturned = (row) => {
- const total = Number(row?.stockInNum ?? row?.totalQuantity ?? row?.quantity ?? 0)
- const un = Number(row?.unQuantity ?? 0)
- if (!Number.isFinite(total) || !Number.isFinite(un)) return 0
- return Math.max(total - un, 0)
}
const getReturnTotal = (row) => {
@@ -581,6 +650,10 @@
}
const closeModal = () => {
+ formState.value.shippingType = undefined;
+ formState.value.truckPlateNo = '';
+ formState.value.expressCompany = '';
+ formState.value.expressNo = '';
isShow.value = false;
};
diff --git a/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue b/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
index 27fae4a..9b3e6f7 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
@@ -34,13 +34,16 @@
<el-table-column label="鏁伴噺"
prop="stockInNum"
width="70" />
+ <el-table-column label="閿�鍞彂璐ф暟閲�"
+ prop="saleOutQuantity"
+ width="120" />
<el-table-column label="鍙��璐ф暟閲�"
prop="unQuantity"
width="130" />
<el-table-column label="宸查��璐ф暟閲�"
width="130">
<template #default="scope">
- {{ calcAlreadyReturned(scope.row) }}
+ {{ formattedNumber(scope.row, null, scope.row.totalReturnNum || 0) }}
</template>
</el-table-column>
<!-- <el-table-column label="搴撳瓨棰勮鏁伴噺"
@@ -118,14 +121,6 @@
const formattedNumber = (row, column, cellValue) => {
return parseFloat(cellValue).toFixed(2);
};
-
-/** 宸查��璐ф暟閲� = 鍏ュ簱琛屾�绘暟閲� 鈭� 褰撳墠鍙��璐ф暟閲忥紙鍓╀綑锛� */
-const calcAlreadyReturned = (row) => {
- const total = Number(row?.stockInNum ?? row?.totalQuantity ?? row?.quantity ?? 0)
- const un = Number(row?.unQuantity ?? 0)
- if (!Number.isFinite(total) || !Number.isFinite(un)) return 0
- return Math.max(total - un, 0)
-}
const handleChangeSelection = (val) => {
selectedRows.value = val;
diff --git a/src/views/procurementManagement/purchaseReturnOrder/index.vue b/src/views/procurementManagement/purchaseReturnOrder/index.vue
index f8866e1..2b73253 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/index.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/index.vue
@@ -45,8 +45,13 @@
@click="handleDetail(row)"
>璇︽儏</el-button
>
- <el-button link size="small" @click="handleDelete(row)"
- >鍒犻櫎</el-button
+ <el-button
+ link
+ size="small"
+ :disabled="row.stockOutApproved"
+ :style="{ color: row.stockOutApproved ? '#c0c4cc' : undefined }"
+ @click="handleDelete(row)"
+ >{{ row.stockOutApproved }}</el-button
>
</template>
</PIMTable>
@@ -89,6 +94,20 @@
<el-descriptions-item label="閫�鏂欎汉">{{
detailData.returnUserName || "--"
}}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣绫诲瀷">{{
+ getShippingTypeLabel(detailData.shippingType)
+ }}</el-descriptions-item>
+ <el-descriptions-item v-if="String(detailData.shippingType) === '1'" label="鍙戣揣杞︾墝鍙�">{{
+ detailData.truckPlateNo || "--"
+ }}</el-descriptions-item>
+ <template v-else-if="String(detailData.shippingType) === '2'">
+ <el-descriptions-item label="蹇�掑叕鍙�">{{
+ detailData.expressCompany || "--"
+ }}</el-descriptions-item>
+ <el-descriptions-item label="蹇�掑崟鍙�">{{
+ detailData.expressNo || "--"
+ }}</el-descriptions-item>
+ </template>
<el-descriptions-item label="鏁村崟鎶樻墸棰�">{{
formatAmount(detailData.totalDiscountAmount)
}}</el-descriptions-item>
@@ -142,13 +161,14 @@
/>
<el-table-column label="鍗曚綅" prop="unit" width="80" />
<el-table-column label="鏁伴噺" prop="stockInNum" width="80" />
+ <el-table-column label="閿�鍞彂璐ф暟閲�" prop="saleOutQuantity" width="110" />
<el-table-column label="鍙��璐ф暟閲�"
prop="unQuantity"
width="100" />
<el-table-column label="宸查��璐ф暟閲�"
width="100">
<template #default="scope">
- {{ calcAlreadyReturned(scope.row) }}
+ {{ formatAmount(scope.row.totalReturnNum || 0) }}
</template>
</el-table-column>
<!-- <el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum" width="120" /> -->
@@ -289,6 +309,15 @@
prop: "returnUserName",
width: 110,
},
+ {
+ label: "鍙戣揣绫诲瀷",
+ prop: "shippingType",
+ width: 100,
+ formatData: (val) => getShippingTypeLabel(val),
+ },
+ { label: "鍙戣揣杞︾墝鍙�", prop: "truckPlateDisplay", width: 140 },
+ { label: "蹇�掑叕鍙�", prop: "expressCompanyDisplay", width: 140 },
+ { label: "蹇�掑崟鍙�", prop: "expressNoDisplay", width: 150 },
{
label: "鏁村崟鎶樻墸棰�",
@@ -341,6 +370,7 @@
},
{
name: "鍒犻櫎",
+ disabled: (row) => !!row.stockOutApproved,
clickFun: (row) => {
handleDelete(row);
},
@@ -422,7 +452,12 @@
findPurchaseReturnOrderListPage({ ...searchForm.value, ...page })
.then((res) => {
tableLoading.value = false;
- tableData.value = res.data.records;
+ tableData.value = (res.data.records || []).map((row) => ({
+ ...row,
+ truckPlateDisplay: String(row?.shippingType) === "1" ? (row?.truckPlateNo || "--") : "--",
+ expressCompanyDisplay: String(row?.shippingType) === "2" ? (row?.expressCompany || "--") : "--",
+ expressNoDisplay: String(row?.shippingType) === "2" ? (row?.expressNo || "--") : "--",
+ }));
page.total = res.data.total;
})
.catch(() => {
@@ -450,6 +485,14 @@
);
};
+const getShippingTypeLabel = (value) => {
+ const shippingTypeMap = {
+ 1: "璐ц溅",
+ 2: "蹇��",
+ };
+ return shippingTypeMap[String(value)] || shippingTypeMap[value] || "--";
+};
+
const formatAmount = (value) => {
if (value === null || value === undefined || value === "") {
return "--";
@@ -461,14 +504,6 @@
return num.toFixed(2);
};
-/** 宸查��璐ф暟閲� = 鍏ュ簱琛屾�绘暟閲� 鈭� 褰撳墠鍙��璐ф暟閲忥紙鍓╀綑锛� */
-const calcAlreadyReturned = (row) => {
- const total = Number(row?.stockInNum ?? row?.totalQuantity ?? row?.quantity ?? 0);
- const un = Number(row?.unQuantity ?? 0);
- if (!Number.isFinite(total) || !Number.isFinite(un)) return 0;
- return Math.max(total - un, 0);
-};
-
onMounted(() => {
getList();
});
@@ -478,4 +513,3 @@
margin-top: unset;
}
</style>
-
diff --git a/src/views/salesManagement/indicatorStats/index.vue b/src/views/salesManagement/indicatorStats/index.vue
index 8ae15ed..52f1e6b 100644
--- a/src/views/salesManagement/indicatorStats/index.vue
+++ b/src/views/salesManagement/indicatorStats/index.vue
@@ -2,7 +2,7 @@
<div class="app-container indicator-stats">
<!-- KPI 姹囨�� -->
<el-row :gutter="20" class="stats-row">
- <el-col :xs="24" :sm="12" :md="8">
+ <el-col :xs="24" :sm="12" :md="12">
<div class="stat-card stat-card-blue">
<div class="stat-icon-wrapper">
<div class="stat-icon">
@@ -16,7 +16,7 @@
<div class="stat-bg-decoration"></div>
</div>
</el-col>
- <el-col :xs="24" :sm="12" :md="8">
+ <el-col :xs="24" :sm="12" :md="12">
<div class="stat-card stat-card-green">
<div class="stat-icon-wrapper">
<div class="stat-icon">
@@ -26,20 +26,6 @@
<div class="stat-content">
<div class="stat-value">楼{{ indicatorKpis.salesAmount.toLocaleString() }}</div>
<div class="stat-label">閿�鍞</div>
- </div>
- <div class="stat-bg-decoration"></div>
- </div>
- </el-col>
- <el-col :xs="24" :sm="12" :md="8">
- <div class="stat-card stat-card-orange">
- <div class="stat-icon-wrapper">
- <div class="stat-icon">
- <el-icon :size="32"><Van /></el-icon>
- </div>
- </div>
- <div class="stat-content">
- <div class="stat-value">{{ indicatorKpis.shipRate }}</div>
- <div class="stat-label">鍙戣揣鐜�</div>
</div>
<div class="stat-bg-decoration"></div>
</div>
@@ -132,7 +118,7 @@
<script setup>
import { ref, reactive, onMounted, onUnmounted, nextTick } from 'vue'
-import { Document, Van, Tickets, Search, Refresh } from '@element-plus/icons-vue'
+import { Document, Tickets, Search, Refresh } from '@element-plus/icons-vue'
import * as echarts from 'echarts'
import { getTotalStatistics, getStatisticsTable } from '@/api/salesManagement/indicatorStats'
import { productTreeList } from '@/api/basicData/product.js'
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index f5a9d8f..c5e3415 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -46,6 +46,11 @@
show-overflow-tooltip
:formatter="formattedNumber"
width="200" />
+ <el-table-column label="閫�璐ч噾棰�(鍏�)"
+ prop="returnAmount"
+ show-overflow-tooltip
+ :formatter="formattedNumber"
+ width="200" />
<el-table-column label="搴旀敹閲戦(鍏�)"
prop="receiptableAmount"
show-overflow-tooltip
@@ -93,6 +98,11 @@
width="200" />
<el-table-column label="鍥炴閲戦(鍏�)"
prop="receiptPaymentAmount"
+ show-overflow-tooltip
+ :formatter="formattedNumber"
+ width="200" />
+ <el-table-column label="閫�璐ч噾棰�(鍏�)"
+ prop="returnAmount"
show-overflow-tooltip
:formatter="formattedNumber"
width="200" />
@@ -180,7 +190,12 @@
const summarizeMainTable = param => {
return proxy.summarizeTable(
param,
- ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
+ [
+ "contractAmounts",
+ "receiptPaymentAmount",
+ "returnAmount",
+ "receiptableAmount",
+ ],
{
ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -191,7 +206,12 @@
const summarizeMainTable1 = param => {
var summarizeTable = proxy.summarizeTable(
param,
- ["contractAmount", "receiptPaymentAmount", "receiptableAmount"],
+ [
+ "contractAmount",
+ "receiptPaymentAmount",
+ "returnAmount",
+ "receiptableAmount",
+ ],
{
ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
diff --git a/src/views/salesManagement/returnOrder/components/detailDia.vue b/src/views/salesManagement/returnOrder/components/detailDia.vue
index 60b485b..a09149f 100644
--- a/src/views/salesManagement/returnOrder/components/detailDia.vue
+++ b/src/views/salesManagement/returnOrder/components/detailDia.vue
@@ -11,6 +11,12 @@
<el-descriptions-item label="閿�鍞崟鍙�">{{ detail.salesContractNo }}</el-descriptions-item>
<el-descriptions-item label="涓氬姟鍛�">{{ detail.salesman }}</el-descriptions-item>
<el-descriptions-item label="鍏宠仈鍙戣揣鍗曞彿">{{ detail.shippingNo }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戣揣绫诲瀷">{{ getShippingTypeText(detail.shippingType) }}</el-descriptions-item>
+ <el-descriptions-item v-if="String(detail.shippingType) === '1'" label="鍙戣揣杞︾墝鍙�">{{ detail.truckPlateNo || "--" }}</el-descriptions-item>
+ <template v-else-if="String(detail.shippingType) === '2'">
+ <el-descriptions-item label="蹇�掑叕鍙�">{{ detail.expressCompany || "--" }}</el-descriptions-item>
+ <el-descriptions-item label="蹇�掑崟鍙�">{{ detail.expressNo || "--" }}</el-descriptions-item>
+ </template>
<!-- <el-descriptions-item label="椤圭洰鍚嶇О">{{ detail.projectName }}</el-descriptions-item> -->
<el-descriptions-item label="鍒跺崟浜�">{{ detail.maker }}</el-descriptions-item>
<el-descriptions-item label="鍒跺崟鏃堕棿">{{ detail.makeTime }}</el-descriptions-item>
@@ -41,6 +47,10 @@
const detail = ref({});
const tableData = ref([]);
const availableProducts = ref([]);
+const shippingTypeMap = {
+ 1: "璐ц溅",
+ 2: "蹇��",
+};
const sameKey = (a, b) => a != null && b != null && String(a) === String(b);
@@ -111,6 +121,8 @@
return Math.max(total - un, 0);
};
+const getShippingTypeText = (value) => shippingTypeMap[String(value)] || shippingTypeMap[value] || "--";
+
/** 璇︽儏琛ㄧ敤 productName / model锛涘悎骞舵椂鍕胯绌轰覆鐩栨帀鍑哄簱琛屽瓧娈� */
const mergeDetailProductRow = (product, normalized) => {
const row = { ...product, ...normalized };
diff --git a/src/views/salesManagement/returnOrder/components/formDia.vue b/src/views/salesManagement/returnOrder/components/formDia.vue
index 40c98dc..4fc0859 100644
--- a/src/views/salesManagement/returnOrder/components/formDia.vue
+++ b/src/views/salesManagement/returnOrder/components/formDia.vue
@@ -69,6 +69,31 @@
</el-form-item>
</el-col>
<el-col :span="4">
+ <el-form-item label="鍙戣揣绫诲瀷锛�" prop="shippingType">
+ <el-select v-model="form.shippingType" placeholder="璇烽�夋嫨鍙戣揣绫诲瀷" @change="handleShippingTypeChange">
+ <el-option label="璐ц溅" :value="1" />
+ <el-option label="蹇��" :value="2" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="4" v-if="form.shippingType === 1">
+ <el-form-item label="鍙戣揣杞︾墝鍙凤細" prop="truckPlateNo">
+ <el-input v-model="form.truckPlateNo" placeholder="璇疯緭鍏ュ彂璐ц溅鐗屽彿" />
+ </el-form-item>
+ </el-col>
+ <template v-else-if="form.shippingType === 2">
+ <el-col :span="4">
+ <el-form-item label="蹇�掑叕鍙革細" prop="expressCompany">
+ <el-input v-model="form.expressCompany" placeholder="璇疯緭鍏ュ揩閫掑叕鍙�" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="4">
+ <el-form-item label="蹇�掑崟鍙凤細" prop="expressNo">
+ <el-input v-model="form.expressNo" placeholder="璇疯緭鍏ュ揩閫掑崟鍙�" />
+ </el-form-item>
+ </el-col>
+ </template>
+ <el-col :span="4">
<el-form-item label="閫�娆炬�婚锛�" prop="refundAmount">
<el-input v-model="form.refundAmount" disabled placeholder="鑷姩璁$畻" />
</el-form-item>
@@ -186,6 +211,10 @@
returnNo: "",
customerId: "",
shippingId: "",
+ shippingType: "",
+ truckPlateNo: "",
+ expressCompany: "",
+ expressNo: "",
projectId: "",
maker: "",
makeTime: "",
@@ -203,6 +232,7 @@
}],
customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
shippingId: [{ required: true, message: "璇烽�夋嫨鍏宠仈鍑哄簱鍗曞彿", trigger: "change" }],
+ shippingType: [{ required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change" }],
}
});
const { form, rules } = toRefs(data);
@@ -491,6 +521,10 @@
returnNo: "",
customerId: "",
shippingId: "",
+ shippingType: "",
+ truckPlateNo: "",
+ expressCompany: "",
+ expressNo: "",
projectId: "",
maker: "",
makeTime: "",
@@ -537,6 +571,11 @@
const payload = { ...form.value, returnSaleProducts };
delete payload.returnNoCheckbox;
if (operationType.value === "add" && form.value.returnNoCheckbox) delete payload.returnNo;
+ if (payload.shippingType !== 1) payload.truckPlateNo = "";
+ if (payload.shippingType !== 2) {
+ payload.expressCompany = "";
+ payload.expressNo = "";
+ }
if (operationType.value === "add") {
returnManagementAdd(payload).then(() => {
proxy.$modal.msgSuccess("鏂板鎴愬姛");
@@ -560,6 +599,10 @@
returnNo: "",
customerId: "",
shippingId: "",
+ shippingType: "",
+ truckPlateNo: "",
+ expressCompany: "",
+ expressNo: "",
projectId: "",
maker: "",
makeTime: "",
@@ -603,6 +646,19 @@
formRef.value?.validateField('returnNo');
};
+const handleShippingTypeChange = (val) => {
+ if (val === 1) {
+ form.value.expressCompany = "";
+ form.value.expressNo = "";
+ } else if (val === 2) {
+ form.value.truckPlateNo = "";
+ } else {
+ form.value.truckPlateNo = "";
+ form.value.expressCompany = "";
+ form.value.expressNo = "";
+ }
+};
+
const customerNameChange = async (val, clearDownstream = true) => {
// val is customerId now
if (clearDownstream) {
diff --git a/src/views/salesManagement/returnOrder/index.vue b/src/views/salesManagement/returnOrder/index.vue
index e190901..1bcda4d 100644
--- a/src/views/salesManagement/returnOrder/index.vue
+++ b/src/views/salesManagement/returnOrder/index.vue
@@ -123,6 +123,15 @@
{ label: "閿�鍞崟鍙�", prop: "salesContractNo", minWidth: 160 },
{ label: "涓氬姟鍛�", prop: "salesman", minWidth: 120 },
{ label: "鍏宠仈鍙戣揣鍗曞彿", prop: "shippingNo", minWidth: 170 },
+ {
+ label: "鍙戣揣绫诲瀷",
+ prop: "shippingType",
+ minWidth: 100,
+ formatData: (val) => ({ 1: "璐ц溅", 2: "蹇��" }[String(val)] || "--"),
+ },
+ { label: "鍙戣揣杞︾墝鍙�", prop: "truckPlateDisplay", minWidth: 140 },
+ { label: "蹇�掑叕鍙�", prop: "expressCompanyDisplay", minWidth: 140 },
+ { label: "蹇�掑崟鍙�", prop: "expressNoDisplay", minWidth: 150 },
{ label: "椤圭洰鍚嶇О", prop: "projectName", minWidth: 180 },
{ label: "鍒跺崟浜�", prop: "maker", minWidth: 120 },
{
@@ -168,7 +177,12 @@
tableLoading.value = true;
returnManagementList({ ...searchForm.value, ...page }).then(res => {
tableLoading.value = false;
- tableData.value = res?.data?.records || [];
+ tableData.value = (res?.data?.records || []).map((row) => ({
+ ...row,
+ truckPlateDisplay: String(row?.shippingType) === "1" ? (row?.truckPlateNo || "--") : "--",
+ expressCompanyDisplay: String(row?.shippingType) === "2" ? (row?.expressCompany || "--") : "--",
+ expressNoDisplay: String(row?.shippingType) === "2" ? (row?.expressNo || "--") : "--",
+ }));
page.total = res?.data?.total || 0;
}).finally(() => tableLoading.value = false);
};
--
Gitblit v1.9.3