Merge branch 'dev_business' of http://114.132.189.42:9002/r/mom-pro2-after into dev_business
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # SQL è¯æ³è§è |
| | | |
| | | ## è§å |
| | | |
| | | - MySQL `ALTER TABLE ADD COLUMN` 䏿¯æ `IF NOT EXISTS` è¯æ³ï¼å³ä½¿ MySQL 8.0+ ä¹ä¸æ¯æã |
| | | - æ·»å åæ®µåéè¦å
æ£æ¥å段æ¯å¦åå¨ï¼æç´æ¥æ§è¡å¹¶å¿½ç¥"åæ®µå·²åå¨"é误ã |
| | | |
| | | ## æ£ç¡®ç¤ºä¾ |
| | | |
| | | ```sql |
| | | -- æ£ç¡®ï¼ç´æ¥æ·»å åæ®µ |
| | | ALTER TABLE mes_wm_sn ADD COLUMN uuid VARCHAR(64) COMMENT 'æ¹æ¬¡UUID' AFTER id; |
| | | |
| | | -- æ£ç¡®ï¼å
æ£æ¥åæ·»å ï¼å
¼å®¹èæ¬ï¼ |
| | | SET @exists = (SELECT COUNT(*) FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_wm_sn' AND column_name = 'uuid'); |
| | | SET @sql = IF(@exists = 0, |
| | | 'ALTER TABLE mes_wm_sn ADD COLUMN uuid VARCHAR(64) COMMENT ''æ¹æ¬¡UUID'' AFTER id', |
| | | 'SELECT 1'); |
| | | PREPARE stmt FROM @sql; |
| | | EXECUTE stmt; |
| | | DEALLOCATE PREPARE stmt; |
| | | ``` |
| | | |
| | | ## éè¯¯ç¤ºä¾ |
| | | |
| | | ```sql |
| | | -- é误ï¼ADD COLUMN 䏿¯æ IF NOT EXISTS |
| | | ALTER TABLE mes_wm_sn ADD COLUMN IF NOT EXISTS uuid VARCHAR(64) COMMENT 'æ¹æ¬¡UUID' AFTER id; |
| | | ``` |
| | | |
| | | ## IF NOT EXISTS æ¯æåºæ¯ |
| | | |
| | | | è¯å¥ | æ¯å¦æ¯æ | |
| | | |------|---------| |
| | | | CREATE TABLE IF NOT EXISTS | â
æ¯æ | |
| | | | CREATE INDEX IF NOT EXISTS | â
æ¯æï¼MySQL 8.0+ï¼ | |
| | | | ALTER TABLE ADD COLUMN IF NOT EXISTS | â 䏿¯æ | |
| | | | ALTER TABLE ADD INDEX IF NOT EXISTS | â
æ¯æï¼MySQL 8.0+ï¼ | |
| | | | ALTER TABLE ADD CONSTRAINT IF NOT EXISTS | â 䏿¯æ | |
| | |
| | | "Bash(dir /s /b \"C:\\\\Program Files \\(x86\\)\\\\MySQL\\\\*\\\\bin\\\\mysql.exe\")", |
| | | "Bash(cmd.exe /c \"where mysql\")", |
| | | "Bash(cmd.exe /c \"dir /s /b C:\\\\ProgramData\\\\MySQL\\\\*\\\\mysql.exe\")", |
| | | "Bash(cmd.exe /c \"dir /s /b C:\\\\Program Files\\\\MySQL\\\\*\\\\mysql.exe\")" |
| | | "Bash(cmd.exe /c \"dir /s /b C:\\\\Program Files\\\\MySQL\\\\*\\\\mysql.exe\")", |
| | | "Bash(mvn install *)", |
| | | "Bash(mvn dependency:tree -pl yudao-module-report)", |
| | | "Bash(xargs -I {} basename {} .java)", |
| | | "Bash(xargs grep -l \"HrmLeaveTypeEnum\\\\|HrmAuditStatusEnum\")" |
| | | ], |
| | | "deny": [ |
| | | "Bash(rm -rf *)", |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # HRM èå¤ç®¡çè¡¥å
åè½ - åç«¯ä¿®æ¹ææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | æ¬æ¬¡è¡¥å
äºèå¤ç®¡ççæ ¸å¿åè½ï¼èå¤è§å管çãè忥é
ç½®ãåå·¥æå¡ãèå¤ç»è®¡æ±æ»ã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãèå¤è§å管ç |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - èå¤è§åå表页é¢ï¼æ°å¢ï¼ |
| | | - èå¤è§åæ°å¢/ç¼è¾å¼¹çªï¼æ°å¢ï¼ |
| | | |
| | | ### API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /hrm/attendance/rule/create | æ°å¢èå¤è§å | |
| | | | PUT | /hrm/attendance/rule/update | æ´æ°èå¤è§å | |
| | | | DELETE | /hrm/attendance/rule/delete | å é¤èå¤è§å | |
| | | | GET | /hrm/attendance/rule/get | è·å¾èå¤è§å详æ
| |
| | | | GET | /hrm/attendance/rule/page | è·å¾èå¤è§åå页å表 | |
| | | | GET | /hrm/attendance/rule/list | è·å¾èå¤è§åå表ï¼å¯ç¨ç¶æï¼ | |
| | | | GET | /hrm/attendance/rule/export-excel | 导åºèå¤è§å Excel | |
| | | |
| | | **请æ±åæ°ï¼create/updateï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | å¦ | è§åIDï¼ä¿®æ¹æ¶å¿
å¡«ï¼ | |
| | | | name | String | æ¯ | è§ååç§° | |
| | | | deptId | Long | å¦ | éç¨é¨é¨IDï¼ç©ºè¡¨ç¤ºå
¨å±ï¼ | |
| | | | workStartTime | String | æ¯ | ä¸çæ¶é´ï¼æ ¼å¼ï¼HH:mm:ss | |
| | | | workEndTime | String | æ¯ | ä¸çæ¶é´ï¼æ ¼å¼ï¼HH:mm:ss | |
| | | | lateAllowMinutes | Integer | å¦ | è¿å°å
许åéæ°ï¼é»è®¤ 0 | |
| | | | earlyAllowMinutes | Integer | å¦ | æ©éå
许åéæ°ï¼é»è®¤ 0 | |
| | | | overtimeThreshold | BigDecimal | å¦ | å çèµ·ç®æ¶é¿ï¼å°æ¶ï¼ï¼é»è®¤ 1 | |
| | | | status | Integer | å¦ | ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨ | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | |
| | | **ååºï¼** `{ "code": 200, "data": 1, "msg": "æä½æå" }` |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | #### 1. è·¯ç±é
ç½® |
| | | |
| | | ```js |
| | | // src/router/modules/hrm.js |
| | | { |
| | | path: 'rule', |
| | | name: 'HrmAttendanceRule', |
| | | component: () => import('@/views/hrm/attendance/rule/index'), |
| | | meta: { title: 'èå¤è§å', icon: 'setting' } |
| | | } |
| | | ``` |
| | | |
| | | #### 2. å表页é¢è¡¨æ ¼ |
| | | |
| | | ```html |
| | | <el-table :data="list"> |
| | | <el-table-column label="è§ååç§°" prop="name" /> |
| | | <el-table-column label="éç¨é¨é¨" prop="deptName"> |
| | | <template #default="{ row }"> |
| | | {{ row.deptName || 'å
¨å±' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ä¸çæ¶é´" prop="workStartTime" /> |
| | | <el-table-column label="ä¸çæ¶é´" prop="workEndTime" /> |
| | | <el-table-column label="è¿å°å
许(åé)" prop="lateAllowMinutes" /> |
| | | <el-table-column label="æ©éå
许(åé)" prop="earlyAllowMinutes" /> |
| | | <el-table-column label="å çèµ·ç®(å°æ¶)" prop="overtimeThreshold" /> |
| | | <el-table-column label="ç¶æ" prop="status"> |
| | | <template #default="{ row }"> |
| | | <el-tag :type="row.status === 0 ? 'success' : 'danger'"> |
| | | {{ row.status === 0 ? 'å¯ç¨' : 'ç¦ç¨' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="180"> |
| | | <template #default="{ row }"> |
| | | <el-button type="primary" link @click="handleUpdate(row)">ç¼è¾</el-button> |
| | | <el-button type="danger" link @click="handleDelete(row.id)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | ``` |
| | | |
| | | #### 3. æ°å¢/ç¼è¾è¡¨å |
| | | |
| | | ```html |
| | | <el-form ref="formRef" :model="form" :rules="rules" label-width="120px"> |
| | | <el-form-item label="è§ååç§°" prop="name"> |
| | | <el-input v-model="form.name" placeholder="请è¾å
¥è§ååç§°" /> |
| | | </el-form-item> |
| | | <el-form-item label="éç¨é¨é¨" prop="deptId"> |
| | | <el-tree-select |
| | | v-model="form.deptId" |
| | | :data="deptList" |
| | | :props="{ label: 'name', value: 'id' }" |
| | | placeholder="è¯·éæ©é¨é¨ï¼ä¸é表示å
¨å±ï¼" |
| | | clearable |
| | | check-strictly |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¸çæ¶é´" prop="workStartTime"> |
| | | <el-time-picker v-model="form.workStartTime" value-format="HH:mm:ss" placeholder="éæ©ä¸çæ¶é´" /> |
| | | </el-form-item> |
| | | <el-form-item label="ä¸çæ¶é´" prop="workEndTime"> |
| | | <el-time-picker v-model="form.workEndTime" value-format="HH:mm:ss" placeholder="éæ©ä¸çæ¶é´" /> |
| | | </el-form-item> |
| | | <el-form-item label="è¿å°å
许" prop="lateAllowMinutes"> |
| | | <el-input-number v-model="form.lateAllowMinutes" :min="0" :max="60" placeholder="åé" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ©éå
许" prop="earlyAllowMinutes"> |
| | | <el-input-number v-model="form.earlyAllowMinutes" :min="0" :max="60" placeholder="åé" /> |
| | | </el-form-item> |
| | | <el-form-item label="å çèµ·ç®" prop="overtimeThreshold"> |
| | | <el-input-number v-model="form.overtimeThreshold" :min="0" :precision="1" placeholder="å°æ¶" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" prop="status"> |
| | | <el-radio-group v-model="form.status"> |
| | | <el-radio :value="0">å¯ç¨</el-radio> |
| | | <el-radio :value="1">ç¦ç¨</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | ``` |
| | | |
| | | #### 4. API æ¹æ³ |
| | | |
| | | ```js |
| | | // src/api/hrm/attendance.js |
| | | export function getAttendanceRulePage(params) { |
| | | return request({ url: '/hrm/attendance/rule/page', method: 'get', params }) |
| | | } |
| | | |
| | | export function getAttendanceRuleList() { |
| | | return request({ url: '/hrm/attendance/rule/list', method: 'get' }) |
| | | } |
| | | |
| | | export function createAttendanceRule(data) { |
| | | return request({ url: '/hrm/attendance/rule/create', method: 'post', data }) |
| | | } |
| | | |
| | | export function updateAttendanceRule(data) { |
| | | return request({ url: '/hrm/attendance/rule/update', method: 'put', data }) |
| | | } |
| | | |
| | | export function deleteAttendanceRule(id) { |
| | | return request({ url: '/hrm/attendance/rule/delete', method: 'delete', params: { id } }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãè忥é
ç½® |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - è忥é
ç½®å表页é¢ï¼æ°å¢ï¼ |
| | | - è忥æ°å¢/ç¼è¾å¼¹çªï¼æ°å¢ï¼ |
| | | |
| | | ### API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /hrm/attendance/holiday/create | æ°å¢è忥 | |
| | | | PUT | /hrm/attendance/holiday/update | æ´æ°è忥 | |
| | | | DELETE | /hrm/attendance/holiday/delete | å é¤è忥 | |
| | | | GET | /hrm/attendance/holiday/get | è·å¾èåæ¥è¯¦æ
| |
| | | | GET | /hrm/attendance/holiday/page | è·å¾è忥å页å表 | |
| | | | GET | /hrm/attendance/holiday/export-excel | 导åºè忥 Excel | |
| | | |
| | | **请æ±åæ°ï¼create/updateï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | å¦ | è忥IDï¼ä¿®æ¹æ¶å¿
å¡«ï¼ | |
| | | | name | String | æ¯ | è忥åç§° | |
| | | | date | String | æ¯ | æ¥æï¼æ ¼å¼ï¼yyyy-MM-dd | |
| | | | type | Integer | æ¯ | ç±»åï¼1-伿¯æ¥ï¼2-工使¥ | |
| | | | isLegal | Integer | å¦ | æ¯å¦æ³å®è忥ï¼0-å¦ï¼1-æ¯ | |
| | | | remark | String | å¦ | 夿³¨ | |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | #### 1. åè¡¨é¡µé¢ |
| | | |
| | | ```html |
| | | <el-table :data="list"> |
| | | <el-table-column label="è忥åç§°" prop="name" /> |
| | | <el-table-column label="æ¥æ" prop="date" /> |
| | | <el-table-column label="ç±»å" prop="type"> |
| | | <template #default="{ row }"> |
| | | <el-tag :type="row.type === 1 ? 'warning' : 'success'"> |
| | | {{ row.type === 1 ? '伿¯æ¥' : '工使¥' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ³å®è忥" prop="isLegal"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.isLegal === 1" type="danger">æ³å®</el-tag> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="夿³¨" prop="remark" /> |
| | | <el-table-column label="æä½" width="180"> |
| | | <template #default="{ row }"> |
| | | <el-button type="primary" link @click="handleUpdate(row)">ç¼è¾</el-button> |
| | | <el-button type="danger" link @click="handleDelete(row.id)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | ``` |
| | | |
| | | #### 2. 表å |
| | | |
| | | ```html |
| | | <el-form ref="formRef" :model="form" :rules="rules" label-width="120px"> |
| | | <el-form-item label="è忥åç§°" prop="name"> |
| | | <el-input v-model="form.name" placeholder="å¦ï¼æ¥èãå½åºè" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¥æ" prop="date"> |
| | | <el-date-picker v-model="form.date" value-format="YYYY-MM-DD" placeholder="éæ©æ¥æ" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç±»å" prop="type"> |
| | | <el-radio-group v-model="form.type"> |
| | | <el-radio :value="1">伿¯æ¥</el-radio> |
| | | <el-radio :value="2">工使¥ï¼è°ä¼ï¼</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="æ³å®è忥" prop="isLegal"> |
| | | <el-checkbox v-model="form.isLegal" :true-value="1" :false-value="0">æ¯æ³å®è忥</el-checkbox> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | ``` |
| | | |
| | | #### 3. API æ¹æ³ |
| | | |
| | | ```js |
| | | export function getAttendanceHolidayPage(params) { |
| | | return request({ url: '/hrm/attendance/holiday/page', method: 'get', params }) |
| | | } |
| | | |
| | | export function createAttendanceHoliday(data) { |
| | | return request({ url: '/hrm/attendance/holiday/create', method: 'post', data }) |
| | | } |
| | | |
| | | export function updateAttendanceHoliday(data) { |
| | | return request({ url: '/hrm/attendance/holiday/update', method: 'put', data }) |
| | | } |
| | | |
| | | export function deleteAttendanceHoliday(id) { |
| | | return request({ url: '/hrm/attendance/holiday/delete', method: 'delete', params: { id } }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãåå·¥æå¡ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - èå¤è®°å½å表页é¢ï¼å·²æï¼æ©å±åè½ï¼ |
| | | - æå¡æé®/ç»ä»¶ï¼æ°å¢ï¼ |
| | | |
| | | ### API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /hrm/attendance/record/clock-in | ä¸çæå¡ | |
| | | | POST | /hrm/attendance/record/clock-out | ä¸çæå¡ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | location | String | æ¯ | æå¡å°ç¹ | |
| | | |
| | | **ååºï¼æå¡æåï¼ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "data": { |
| | | "id": 1, |
| | | "userId": 100, |
| | | "userName": "å¼ ä¸", |
| | | "deptId": 1, |
| | | "deptName": "ç åé¨", |
| | | "date": "2024-01-15", |
| | | "clockInTime": "2024-01-15T09:05:00", |
| | | "clockInType": 1, |
| | | "clockOutTime": null, |
| | | "clockOutType": null, |
| | | "workHours": null, |
| | | "location": "å
¬å¸åå°" |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | #### 1. æå¡æé®ç»ä»¶ |
| | | |
| | | ```html |
| | | <template> |
| | | <div class="clock-container"> |
| | | <el-button type="primary" size="large" @click="handleClockIn"> |
| | | <el-icon><Clock /></el-icon> |
| | | ä¸çæå¡ |
| | | </el-button> |
| | | <el-button type="success" size="large" @click="handleClockOut"> |
| | | <el-icon><Clock /></el-icon> |
| | | ä¸çæå¡ |
| | | </el-button> |
| | | <div v-if="clockStatus" class="clock-status"> |
| | | <p>仿¥æå¡ç¶æï¼</p> |
| | | <p>ä¸çï¼{{ clockStatus.clockInTime || 'æªæå¡' }} |
| | | <el-tag v-if="clockStatus.clockInType === 2" type="warning">è¿å°</el-tag> |
| | | </p> |
| | | <p>ä¸çï¼{{ clockStatus.clockOutTime || 'æªæå¡' }} |
| | | <el-tag v-if="clockStatus.clockOutType === 3" type="warning">æ©é</el-tag> |
| | | </p> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { clockIn, clockOut } from '@/api/hrm/attendance' |
| | | import { ElMessage } from 'element-plus' |
| | | |
| | | const location = ref('å
¬å¸åå°') |
| | | |
| | | const handleClockIn = async () => { |
| | | try { |
| | | const res = await clockIn({ location: location.value }) |
| | | ElMessage.success('ä¸çæå¡æå') |
| | | // æ´æ°æå¡ç¶ææ¾ç¤º |
| | | } catch (e) { |
| | | ElMessage.error(e.message || 'æå¡å¤±è´¥') |
| | | } |
| | | } |
| | | |
| | | const handleClockOut = async () => { |
| | | try { |
| | | const res = await clockOut({ location: location.value }) |
| | | ElMessage.success('ä¸çæå¡æå') |
| | | } catch (e) { |
| | | ElMessage.error(e.message || 'æå¡å¤±è´¥') |
| | | } |
| | | } |
| | | </script> |
| | | ``` |
| | | |
| | | #### 2. API æ¹æ³ |
| | | |
| | | ```js |
| | | export function clockIn(params) { |
| | | return request({ url: '/hrm/attendance/record/clock-in', method: 'post', params }) |
| | | } |
| | | |
| | | export function clockOut(params) { |
| | | return request({ url: '/hrm/attendance/record/clock-out', method: 'post', params }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åãèå¤ç»è®¡æ±æ» |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - èå¤ç»è®¡å表页é¢ï¼æ°å¢ï¼ |
| | | - ç»è®¡çæå¼¹çªï¼æ°å¢ï¼ |
| | | |
| | | ### API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /hrm/attendance/summary/page | è·å¾èå¤ç»è®¡å页å表 | |
| | | | GET | /hrm/attendance/summary/get | è·å¾åå·¥æåº¦æ±æ» | |
| | | | POST | /hrm/attendance/summary/generate | çææåº¦è夿±æ» | |
| | | | GET | /hrm/attendance/summary/export-excel | 导åºèå¤ç»è®¡ Excel | |
| | | |
| | | **请æ±åæ°ï¼generateï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | yearMonth | String | æ¯ | å¹´æï¼æ ¼å¼ï¼yyyy-MM | |
| | | | deptId | Long | å¦ | é¨é¨IDï¼æå®é¨é¨æ¶å¡«åï¼ | |
| | | | userId | Long | å¦ | åå·¥IDï¼æå®åå·¥æ¶å¡«åï¼ | |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | #### 1. åè¡¨é¡µé¢ |
| | | |
| | | ```html |
| | | <el-form :inline="true"> |
| | | <el-form-item label="å¹´æ"> |
| | | <el-date-picker v-model="queryParams.yearMonth" type="month" value-format="YYYY-MM" placeholder="鿩年æ" /> |
| | | </el-form-item> |
| | | <el-form-item label="é¨é¨"> |
| | | <el-tree-select v-model="queryParams.deptId" :data="deptList" clearable check-strictly placeholder="éæ©é¨é¨" /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery">æç´¢</el-button> |
| | | <el-button type="success" @click="handleGenerate">çæç»è®¡</el-button> |
| | | <el-button type="warning" @click="handleExport">导åº</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <el-table :data="list"> |
| | | <el-table-column label="åå·¥å§å" prop="userName" /> |
| | | <el-table-column label="é¨é¨" prop="deptName" /> |
| | | <el-table-column label="å¹´æ" prop="yearMonth" /> |
| | | <el-table-column label="åºåºå¤å¤©æ°" prop="workDays" /> |
| | | <el-table-column label="å®é
åºå¤å¤©æ°" prop="actualDays" /> |
| | | <el-table-column label="è¿å°æ¬¡æ°" prop="lateCount"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.lateCount > 0" type="warning">{{ row.lateCount }}</el-tag> |
| | | <span v-else>{{ row.lateCount }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ©é次æ°" prop="earlyCount"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.earlyCount > 0" type="warning">{{ row.earlyCount }}</el-tag> |
| | | <span v-else>{{ row.earlyCount }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¼ºå¡æ¬¡æ°" prop="absentCount"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.absentCount > 0" type="danger">{{ row.absentCount }}</el-tag> |
| | | <span v-else>{{ row.absentCount }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å çæ¶é¿(h)" prop="overtimeHours" /> |
| | | <el-table-column label="è¯·åæ¶é¿(h)" prop="leaveHours" /> |
| | | </el-table> |
| | | ``` |
| | | |
| | | #### 2. çæç»è®¡å¼¹çª |
| | | |
| | | ```html |
| | | <el-dialog title="çæèå¤ç»è®¡" v-model="generateVisible"> |
| | | <el-form :model="generateForm" label-width="100px"> |
| | | <el-form-item label="å¹´æ"> |
| | | <el-date-picker v-model="generateForm.yearMonth" type="month" value-format="YYYY-MM" placeholder="鿩年æ" /> |
| | | </el-form-item> |
| | | <el-form-item label="çæèå´"> |
| | | <el-radio-group v-model="generateForm.rangeType"> |
| | | <el-radio value="all">å
¨å
¬å¸</el-radio> |
| | | <el-radio value="dept">æå®é¨é¨</el-radio> |
| | | <el-radio value="user">æå®åå·¥</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item v-if="generateForm.rangeType === 'dept'" label="é¨é¨"> |
| | | <el-tree-select v-model="generateForm.deptId" :data="deptList" check-strictly placeholder="éæ©é¨é¨" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="generateForm.rangeType === 'user'" label="åå·¥"> |
| | | <el-select v-model="generateForm.userId" filterable placeholder="éæ©åå·¥"> |
| | | <el-option v-for="item in employeeList" :key="item.id" :label="item.name" :value="item.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <el-button @click="generateVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="handleGenerateSubmit">çæ</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | ``` |
| | | |
| | | #### 3. API æ¹æ³ |
| | | |
| | | ```js |
| | | export function getAttendanceSummaryPage(params) { |
| | | return request({ url: '/hrm/attendance/summary/page', method: 'get', params }) |
| | | } |
| | | |
| | | export function getMonthlySummary(params) { |
| | | return request({ url: '/hrm/attendance/summary/get', method: 'get', params }) |
| | | } |
| | | |
| | | export function generateSummary(params) { |
| | | return request({ url: '/hrm/attendance/summary/generate', method: 'post', params }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãèå¤å¼å¸¸ç³è¯·æäº¤ |
| | | |
| | | ### ä¿®æ¹ç¹ |
| | | |
| | | åæäº¤æ¥å£ `/hrm/attendance/exception/submit` éå¢å `processDefinitionKey` åæ°ã |
| | | |
| | | **忥å£ï¼** |
| | | ```js |
| | | POST /hrm/attendance/exception/submit?id=xxx |
| | | ``` |
| | | |
| | | **æ°æ¥å£ï¼** |
| | | ```js |
| | | POST /hrm/attendance/exception/submit?id=xxx&processDefinitionKey=xxx |
| | | ``` |
| | | |
| | | ### åç«¯ä¿®æ¹ |
| | | |
| | | ```html |
| | | <!-- æäº¤å¼¹çªå¢å æµç¨éæ© --> |
| | | <el-dialog title="æäº¤è¡¥å¡ç³è¯·" v-model="submitVisible"> |
| | | <el-form :model="submitForm" label-width="100px"> |
| | | <el-form-item label="å®¡æ¹æµç¨"> |
| | | <el-select v-model="submitForm.processDefinitionKey" placeholder="éæ©å®¡æ¹æµç¨"> |
| | | <el-option v-for="item in processList" :key="item.key" :label="item.name" :value="item.key" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <el-button @click="submitVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="handleSubmit">æäº¤</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | ``` |
| | | |
| | | ```js |
| | | // æäº¤æ¹æ³ |
| | | const handleSubmit = async () => { |
| | | await submitException({ |
| | | id: currentId, |
| | | processDefinitionKey: submitForm.processDefinitionKey |
| | | }) |
| | | ElMessage.success('æäº¤æå') |
| | | submitVisible = false |
| | | getList() |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãåå
¸æ°æ®é
ç½® |
| | | |
| | | å¨ç³»ç»åå
¸ç®¡ç䏿·»å 以ä¸åå
¸ï¼ |
| | | |
| | | ### 1. hrm_clock_type - æå¡ç±»å |
| | | |
| | | | åå
¸å¼ | åå
¸æ ç¾ | |
| | | |--------|----------| |
| | | | 1 | æ£å¸¸ | |
| | | | 2 | è¿å° | |
| | | | 3 | æ©é | |
| | | | 4 | ç¼ºå¡ | |
| | | |
| | | ### 2. hrm_holiday_type - èåæ¥ç±»å |
| | | |
| | | | åå
¸å¼ | åå
¸æ ç¾ | |
| | | |--------|----------| |
| | | | 1 | 伿¯æ¥ | |
| | | | 2 | 工使¥ | |
| | | |
| | | ### 3. hrm_is_legal_holiday - æ¯å¦æ³å®è忥 |
| | | |
| | | | åå
¸å¼ | åå
¸æ ç¾ | |
| | | |--------|----------| |
| | | | 0 | å¦ | |
| | | | 1 | æ¯ | |
| | | |
| | | ### 4. hrm_data_source - æ°æ®æ¥æº |
| | | |
| | | | åå
¸å¼ | åå
¸æ ç¾ | |
| | | |--------|----------| |
| | | | 1 | æå¡ | |
| | | | 2 | 导å
¥ | |
| | | | 3 | è¡¥å¡å®¡æ¹ | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãèåé
ç½® |
| | | |
| | | å¨ç³»ç»èåä¸ç¡®è®¤ä»¥ä¸èåå·²é
ç½®ï¼ |
| | | |
| | | | èåID | èååç§° | è·¯ç±è·¯å¾ | ç»ä»¶è·¯å¾ | |
| | | |--------|----------|----------|----------| |
| | | | 6013 | èå¤è§å | rule | hrm/attendance/rule/index | |
| | | | 6014 | è忥é
ç½® | holiday | hrm/attendance/holiday/index | |
| | | | 6015 | èå¤ç»è®¡ | summary | hrm/attendance/summary/index | |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **æå¡é»è¾**ï¼æå¡ä¼èªå¨å¤ææ¯å¦å·¥ä½æ¥ãè¿å°ãæ©éï¼å端åªéä¼ å
¥æå¡å°ç¹å³å¯ |
| | | 2. **èå¤è§åä¼å
级**ï¼é¨é¨ä¸å±è§åä¼å
ï¼å
¶æ¬¡æ¥æ¾å
¨å±è§åï¼ä¸éé¨é¨ï¼ |
| | | 3. **è忥夿**ï¼æé
ç½®åæé
ç½®ï¼æ é
ç½®åæå¨æ«å¤æï¼å¨å
卿¥ä¸ºä¼æ¯æ¥ï¼ |
| | | 4. **è¡¥å¡å®¡æ¹**ï¼å®¡æ¹éè¿åä¼èªå¨æ´æ°èå¤è®°å½ï¼æ éæå¨æä½ |
| | | 5. **ç»è®¡çæ**ï¼å»ºè®®æ¯æç»æåæå¨è§¦åçæç»è®¡ï¼æé
ç½®å®æ¶ä»»å¡èªå¨çæ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # HRM 模åå 餿¥å£è¡¥å
¨ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | 为 HRM 模åä¸ç¼ºå¤±å 餿¥å£ç Controller è¡¥å
¨å é¤åè½ï¼ä¸»è¦æ¶ååå·¥ç¸å
³å模åï¼æè²ç»åãå·¥ä½ç»åãç´§æ¥è系人ï¼ä»¥åèªèµæ¨¡åçæ¤é/å é¤åè½ã |
| | | |
| | | ## ä¸ãå工模åå 餿¥å£ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - å工详æ
é¡µï¼æè²ç»åãå·¥ä½ç»åãç´§æ¥è系人模åï¼ |
| | | |
| | | ### API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | DELETE | /hrm/employee/education/delete | å 餿è²ç»å | |
| | | | DELETE | /hrm/employee/work-history/delete | å é¤å·¥ä½ç»å | |
| | | | DELETE | /hrm/employee/emergency-contact/delete | å é¤ç´§æ¥è系人 | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | è®°å½ID | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "data": true, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | #### 1. æè²ç»åå é¤æé® |
| | | |
| | | ```html |
| | | <el-button type="danger" size="small" @click="handleDeleteEducation(row)"> |
| | | å é¤ |
| | | </el-button> |
| | | ``` |
| | | |
| | | #### 2. å·¥ä½ç»åå é¤æé® |
| | | |
| | | ```html |
| | | <el-button type="danger" size="small" @click="handleDeleteWorkHistory(row)"> |
| | | å é¤ |
| | | </el-button> |
| | | ``` |
| | | |
| | | #### 3. ç´§æ¥è系人å é¤æé® |
| | | |
| | | ```html |
| | | <el-button type="danger" size="small" @click="handleDeleteEmergencyContact(row)"> |
| | | å é¤ |
| | | </el-button> |
| | | ``` |
| | | |
| | | #### 4. æ¹æ³å®ç° |
| | | |
| | | ```js |
| | | // å 餿è²ç»å |
| | | handleDeleteEducation(row) { |
| | | this.$modal.confirm('æ¯å¦ç¡®è®¤å é¤è¯¥æè²ç»åï¼').then(() => { |
| | | return deleteEducation(row.id); |
| | | }).then(() => { |
| | | this.getEducationList(); |
| | | this.$modal.msgSuccess('å 餿å'); |
| | | }).catch(() => {}); |
| | | }, |
| | | |
| | | // å é¤å·¥ä½ç»å |
| | | handleDeleteWorkHistory(row) { |
| | | this.$modal.confirm('æ¯å¦ç¡®è®¤å é¤è¯¥å·¥ä½ç»åï¼').then(() => { |
| | | return deleteWorkHistory(row.id); |
| | | }).then(() => { |
| | | this.getWorkHistoryList(); |
| | | this.$modal.msgSuccess('å 餿å'); |
| | | }).catch(() => {}); |
| | | }, |
| | | |
| | | // å é¤ç´§æ¥è系人 |
| | | handleDeleteEmergencyContact(row) { |
| | | this.$modal.confirm('æ¯å¦ç¡®è®¤å é¤è¯¥ç´§æ¥è系人ï¼').then(() => { |
| | | return deleteEmergencyContact(row.id); |
| | | }).then(() => { |
| | | this.getEmergencyContactList(); |
| | | this.$modal.msgSuccess('å 餿å'); |
| | | }).catch(() => {}); |
| | | }, |
| | | ``` |
| | | |
| | | #### 5. API æ¥å£å®ä¹ |
| | | |
| | | ```js |
| | | // api/hrm/employee.js |
| | | |
| | | // å 餿è²ç»å |
| | | export function deleteEducation(id) { |
| | | return request({ |
| | | url: '/hrm/employee/education/delete', |
| | | method: 'delete', |
| | | params: { id } |
| | | }); |
| | | } |
| | | |
| | | // å é¤å·¥ä½ç»å |
| | | export function deleteWorkHistory(id) { |
| | | return request({ |
| | | url: '/hrm/employee/work-history/delete', |
| | | method: 'delete', |
| | | params: { id } |
| | | }); |
| | | } |
| | | |
| | | // å é¤ç´§æ¥è系人 |
| | | export function deleteEmergencyContact(id) { |
| | | return request({ |
| | | url: '/hrm/employee/emergency-contact/delete', |
| | | method: 'delete', |
| | | params: { id } |
| | | }); |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãèªèµæ ¸ç®æ¨¡åæ¥å£ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - èªé
¬æ ¸ç®å表页 |
| | | |
| | | ### API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /hrm/salary/calculation/revoke | æ¹éæ¤éèªé
¬æ ¸ç®ç¡®è®¤ | |
| | | | DELETE | /hrm/salary/calculation/delete | å é¤èªé
¬æ ¸ç®è®°å½ï¼ä»
å¾
ç¡®è®¤ç¶æï¼ | |
| | | |
| | | **æ¤é确认请æ±ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "ids": [1, 2, 3] |
| | | } |
| | | ``` |
| | | |
| | | **å é¤è¯·æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | æ ¸ç®è®°å½ID | |
| | | |
| | | **æ¤é确认é»è¾è¯´æï¼** |
| | | |
| | | 1. ä»
å·²ç¡®è®¤ç¶æï¼status=10ï¼çæ ¸ç®è®°å½å¯ä»¥æ¤é |
| | | 2. æ¤éåç¶ææ¢å¤ä¸ºå¾
确认ï¼status=0ï¼ |
| | | 3. åæ¶å é¤å
³èçèªèµåæ¾æç» |
| | | 4. 妿已忾åä¸å
许æ¤é |
| | | |
| | | **å é¤é»è¾è¯´æï¼** |
| | | |
| | | 1. ä»
å¾
ç¡®è®¤ç¶æï¼status=0ï¼çæ ¸ç®è®°å½å¯ä»¥å é¤ |
| | | 2. 已确认æå·²åæ¾çè®°å½ä¸å¯å é¤ |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | ```js |
| | | // api/hrm/salary/calculation.js |
| | | |
| | | // æ¤éèªé
¬æ ¸ç®ç¡®è®¤ |
| | | export function revokeSalaryCalculation(ids) { |
| | | return request({ |
| | | url: '/hrm/salary/calculation/revoke', |
| | | method: 'post', |
| | | data: { ids } |
| | | }); |
| | | } |
| | | |
| | | // å é¤èªé
¬æ ¸ç®è®°å½ |
| | | export function deleteSalaryCalculation(id) { |
| | | return request({ |
| | | url: '/hrm/salary/calculation/delete', |
| | | method: 'delete', |
| | | params: { id } |
| | | }); |
| | | } |
| | | ``` |
| | | |
| | | ```html |
| | | <!-- æ¤é确认æé® --> |
| | | <el-button type="warning" size="small" @click="handleRevoke(row)" |
| | | v-if="row.status === 10"> |
| | | æ¤é确认 |
| | | </el-button> |
| | | |
| | | <!-- å é¤æé® --> |
| | | <el-button type="danger" size="small" @click="handleDelete(row)" |
| | | v-if="row.status === 0"> |
| | | å é¤ |
| | | </el-button> |
| | | ``` |
| | | |
| | | ```js |
| | | // æ¤é确认 |
| | | handleRevoke(row) { |
| | | this.$modal.confirm('æ¤é确认åï¼è¯¥è®°å½å°æ¢å¤ä¸ºå¾
ç¡®è®¤ç¶æï¼å
³èçåæ¾æç»å°è¢«å é¤ãæ¯å¦ç»§ç»ï¼').then(() => { |
| | | return revokeSalaryCalculation([row.id]); |
| | | }).then(() => { |
| | | this.getList(); |
| | | this.$modal.msgSuccess('æ¤éæå'); |
| | | }).catch(() => {}); |
| | | }, |
| | | |
| | | // å é¤ |
| | | handleDelete(row) { |
| | | this.$modal.confirm('æ¯å¦ç¡®è®¤å é¤è¯¥èªé
¬æ ¸ç®è®°å½ï¼').then(() => { |
| | | return deleteSalaryCalculation(row.id); |
| | | }).then(() => { |
| | | this.getList(); |
| | | this.$modal.msgSuccess('å 餿å'); |
| | | }).catch(() => {}); |
| | | }, |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãèªèµåæ¾æ¨¡åæ¥å£ |
| | | |
| | | ### æ¶åé¡µé¢ |
| | | |
| | | - èªèµåæ¾å表页 |
| | | - èªèµåæ¾æç»é¡µ |
| | | |
| | | ### API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /hrm/salary/payment/revoke-detail | æ¹éæ¤éèªèµåæ¾æç» | |
| | | | DELETE | /hrm/salary/payment/delete | å é¤èªèµåæ¾å°è´¦ï¼ä»
å¾
åæ¾ç¶æï¼ | |
| | | |
| | | **æ¤éåæ¾è¯·æ±ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "detailIds": [1, 2, 3] |
| | | } |
| | | ``` |
| | | |
| | | **å é¤è¯·æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | id | Long | æ¯ | åæ¾å°è´¦ID | |
| | | |
| | | **æ¤éåæ¾é»è¾è¯´æï¼** |
| | | |
| | | 1. ä»
å·²åæ¾ç¶æï¼status=10ï¼çæç»å¯ä»¥æ¤é |
| | | 2. æ¤éåæç»ç¶ææ¢å¤ä¸ºå¾
åæ¾ï¼status=0ï¼ |
| | | 3. åæ¶å°å
³èçæ ¸ç®è®°å½æ¢å¤ä¸ºå·²ç¡®è®¤ï¼status=10ï¼ |
| | | 4. 妿æ´ä¸ªå°è´¦çæææç»é½è¢«æ¤éï¼å°è´¦ç¶æä¹ä¼æ¢å¤ä¸ºå¾
åæ¾ |
| | | |
| | | **å é¤å°è´¦é»è¾è¯´æï¼** |
| | | |
| | | 1. ä»
å¾
åæ¾ç¶æï¼status=0ï¼çå°è´¦å¯ä»¥å é¤ |
| | | 2. 妿åå¨å·²åæ¾æç»ï¼éå
æ¤éæææç»æè½å é¤ |
| | | 3. å é¤å°è´¦ä¼åæ¶å 餿æå¾
åæ¾æç» |
| | | |
| | | ### å端修æ¹ç¹ |
| | | |
| | | ```js |
| | | // api/hrm/salary/payment.js |
| | | |
| | | // æ¤éèªèµåæ¾æç» |
| | | export function revokeSalaryPaymentDetail(detailIds) { |
| | | return request({ |
| | | url: '/hrm/salary/payment/revoke-detail', |
| | | method: 'post', |
| | | data: { detailIds } |
| | | }); |
| | | } |
| | | |
| | | // å é¤èªèµåæ¾å°è´¦ |
| | | export function deleteSalaryPayment(id) { |
| | | return request({ |
| | | url: '/hrm/salary/payment/delete', |
| | | method: 'delete', |
| | | params: { id } |
| | | }); |
| | | } |
| | | ``` |
| | | |
| | | ```html |
| | | <!-- æç»å表 - æ¤éåæ¾æé® --> |
| | | <el-button type="warning" size="small" @click="handleRevokeDetail(row)" |
| | | v-if="row.status === 10"> |
| | | æ¤éåæ¾ |
| | | </el-button> |
| | | |
| | | <!-- å°è´¦å表 - å é¤æé® --> |
| | | <el-button type="danger" size="small" @click="handleDelete(row)" |
| | | v-if="row.status === 0"> |
| | | å é¤ |
| | | </el-button> |
| | | ``` |
| | | |
| | | ```js |
| | | // æ¤éåæ¾æç» |
| | | handleRevokeDetail(row) { |
| | | this.$modal.confirm('æ¤éåæ¾åï¼è¯¥æç»å°æ¢å¤ä¸ºå¾
åæ¾ç¶æï¼å
³èçæ ¸ç®è®°å½å°æ¢å¤ä¸ºå·²ç¡®è®¤ãæ¯å¦ç»§ç»ï¼').then(() => { |
| | | return revokeSalaryPaymentDetail([row.id]); |
| | | }).then(() => { |
| | | this.getDetailList(); |
| | | this.$modal.msgSuccess('æ¤éæå'); |
| | | }).catch(() => {}); |
| | | }, |
| | | |
| | | // å é¤åæ¾å°è´¦ |
| | | handleDelete(row) { |
| | | this.$modal.confirm('å é¤åå°åæ¶å 餿æå¾
åæ¾æç»ï¼æ¯å¦ç»§ç»ï¼').then(() => { |
| | | return deleteSalaryPayment(row.id); |
| | | }).then(() => { |
| | | this.getList(); |
| | | this.$modal.msgSuccess('å 餿å'); |
| | | }).catch(() => {}); |
| | | }, |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åãç¶ææµè½¬è¯´æ |
| | | |
| | | ### èªé
¬æ ¸ç®ç¶æ |
| | | |
| | | | ç¶æå¼ | ç¶æåç§° | 说æ | |
| | | |--------|----------|------| |
| | | | 0 | å¾
确认 | åå§ç¶æï¼å¯å é¤ãå¯ç¡®è®¤ | |
| | | | 10 | 已确认 | 坿¤é确认 | |
| | | | 20 | 已忾 | 已宿忾ï¼ä¸å¯æä½ | |
| | | |
| | | ### èªèµåæ¾æç»ç¶æ |
| | | |
| | | | ç¶æå¼ | ç¶æåç§° | 说æ | |
| | | |--------|----------|------| |
| | | | 0 | å¾
åæ¾ | åå§ç¶æ | |
| | | | 10 | 已忾 | 坿¤éåæ¾ | |
| | | |
| | | ### ç¶ææµè½¬å¾ |
| | | |
| | | ``` |
| | | èªé
¬æ ¸ç®: |
| | | å¾
确认(0) --确认--> 已确认(10) --åæ¾--> 已忾(20) |
| | | 已确认(10) --æ¤é确认--> å¾
确认(0) |
| | | å¾
确认(0) --å é¤--> (å é¤) |
| | | |
| | | èªèµåæ¾æç»: |
| | | å¾
忾(0) --忾--> 已忾(10) |
| | | 已忾(10) --æ¤éåæ¾--> å¾
åæ¾(0) |
| | | |
| | | èªèµåæ¾å°è´¦: |
| | | å¾
åæ¾(0) --å é¤--> (å é¤) |
| | | 注ï¼éå
æ¤éææå·²åæ¾æç»æè½å é¤ |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãå·²æå 餿¥å£è¯´æ |
| | | |
| | | 以䏿¨¡åå·²æå 餿¥å£ï¼æ éå端é¢å¤ä¿®æ¹ï¼ |
| | | |
| | | | 模å | å 餿¥å£è·¯å¾ | |
| | | |------|-------------| |
| | | | å工主表 | /hrm/employee/delete | |
| | | | 请åç³è¯· | /hrm/leave/delete | |
| | | | è°å²ç³è¯· | /hrm/transfer/delete | |
| | | | 离èç³è¯· | /hrm/resignation/delete | |
| | | | èå¤å¼å¸¸ç³è¯· | /hrm/attendance/exception/delete | |
| | | | 社ä¿å
¬ç§¯éé
ç½® | /hrm/salary/social-security-config/delete | |
| | | | 个ç¨ç¨çé
ç½® | /hrm/salary/tax-rate-config/delete | |
| | | | 社ä¿å
¬ç§¯éæ¹æ¡ | /hrm/salary/social-security-scheme/delete | |
| | | | åå·¥ç¤¾ä¿æ¡£æ¡ | /hrm/salary/employee-social-security/delete | |
| | | |
| | | ## å
ã䏿ä¾å 餿¥å£è¯´æ |
| | | |
| | | 以䏿¨¡å䏿ä¾å 餿¥å£ï¼å®¡è®¡ç±»æ°æ®ä¸å
è®¸ç´æ¥å é¤ï¼ï¼ |
| | | |
| | | - èå¤è®°å½ï¼/hrm/attendance/recordï¼- è夿°æ®å±äºå®¡è®¡æ°æ® |
| | | |
| | | ## ä¸ãæé说æ |
| | | |
| | | | æéæ è¯ | 说æ | |
| | | |----------|------| |
| | | | hrm:employee:delete | åå·¥å忍¡åå 餿é | |
| | | | hrm:salary:confirm | èªé
¬æ ¸ç®ç¡®è®¤/æ¤éæé | |
| | | | hrm:salary:delete | èªé
¬æ ¸ç®/åæ¾å 餿é | |
| | | | hrm:salary:pay | èªèµåæ¾/æ¤éæé | |
| | | |
| | | ## å
«ã注æäºé¡¹ |
| | | |
| | | 1. å 餿ä½éè¦äºæ¬¡ç¡®è®¤ï¼é¿å
误å |
| | | 2. èªé
¬æ ¸ç®ç¡®è®¤åä¸å¯ç´æ¥å é¤ï¼éå
æ¤é确认 |
| | | 3. èªèµåæ¾åä¸å¯ç´æ¥å é¤å°è´¦ï¼éå
æ¤éææå·²åæ¾æç» |
| | | 4. æ¤éæä½ä¼çº§èæ´æ°å
³èæ°æ®ï¼å¦åæ¾æç»ãæ ¸ç®ç¶æçï¼ |
| | | 5. å 餿ä½éå·æ°åè¡¨æ°æ® |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # HRM 人åèµæºæ¨¡åå端å¼åææ¡£ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | HRM模åå
å«å工管çã人äºå®¡æ¹ãèå¤ç®¡çãèªé
¬ç®¡çå大åè½æ¨¡åã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãå工管ç |
| | | |
| | | ### 1.1 æ¶åé¡µé¢ |
| | | |
| | | - åå·¥å表页 `hrm/employee/index.vue` |
| | | - å工详æ
页 `hrm/employee/detail.vue` |
| | | - å工表åå¼¹çª `hrm/employee/EmployeeForm.vue` |
| | | - æè²ç»åç»ä»¶ `hrm/employee/components/EducationList.vue` |
| | | - å·¥ä½ç»åç»ä»¶ `hrm/employee/components/WorkHistoryList.vue` |
| | | - ç´§æ¥è系人ç»ä»¶ `hrm/employee/components/EmergencyContactList.vue` |
| | | |
| | | ### 1.2 API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /hrm/employee/page | åå·¥å页å表 | |
| | | | GET | /hrm/employee/get | è·åå工详æ
| |
| | | | POST | /hrm/employee/create | æ°å¢åå·¥ï¼åæ¥å建系ç»ç¨æ·ãæè²ç»åãå·¥ä½ç»åãç´§æ¥èç³»äººï¼ | |
| | | | PUT | /hrm/employee/update | æ´æ°åå·¥ | |
| | | | DELETE | /hrm/employee/delete | å é¤åå·¥ | |
| | | | GET | /hrm/employee/education/list | è·åæè²ç»åå表 | |
| | | | GET | /hrm/employee/work-history/list | è·åå·¥ä½ç»åå表 | |
| | | | GET | /hrm/employee/emergency-contact/list | è·åç´§æ¥è系人å表 | |
| | | |
| | | **注æï¼æè²ç»åãå·¥ä½ç»åãç´§æ¥è系人åªå¨æ°å¢åå·¥æ¶åæ¥æ·»å ï¼ä¸æä¾åç¬ç»´æ¤æ¥å£ã** |
| | | |
| | | ### 1.3 åå·¥å页æ¥è¯¢ |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | pageNo | Integer | æ¯ | 页ç | |
| | | | pageSize | Integer | æ¯ | æ¯é¡µæ°é | |
| | | | employeeNo | String | å¦ | åå·¥ç¼å· | |
| | | | name | String | å¦ | åå·¥å§å | |
| | | | deptId | Long | å¦ | é¨é¨ID | |
| | | | employeeStatus | Integer | å¦ | åå·¥ç¶æï¼1-å¨èï¼2-è¯ç¨ï¼3-离è | |
| | | |
| | | **ååºç»æï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "list": [ |
| | | { |
| | | "id": 1, |
| | | "deptId": 100, |
| | | "deptName": "ææ¯é¨", |
| | | "postId": 1, |
| | | "postName": "Javaå¼åå·¥ç¨å¸", |
| | | "employeeNo": "EMP001", |
| | | "name": "å¼ ä¸", |
| | | "gender": 1, |
| | | "birthday": "1990-01-15", |
| | | "phone": "13800138000", |
| | | "email": "zhangsan@example.com", |
| | | "idCard": "320102199001150011", |
| | | "hireDate": "2020-03-01", |
| | | "regularDate": "2020-06-01", |
| | | "leaveDate": null, |
| | | "employeeStatus": 1, |
| | | "annualLeaveBalance": 5.00, |
| | | "sickLeaveBalance": 10.00, |
| | | "bankName": "ä¸å½å·¥åé¶è¡", |
| | | "bankAccount": "6222021234567890123", |
| | | "address": "æ±èçå京å¸", |
| | | "createTime": "2024-01-01 10:00:00" |
| | | } |
| | | ], |
| | | "total": 100 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 1.4 åå·¥è¡¨åæ°æ® |
| | | |
| | | **注æï¼æ°å¢åå·¥æ¶ä¼èªå¨å建系ç»ç¨æ·è´¦å·ï¼ç¨æ·ååé»è®¤å¯ç åä¸ºææºå·ã** |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | form: { |
| | | id: undefined, |
| | | deptId: undefined, |
| | | postId: undefined, |
| | | employeeNo: undefined, // ç³»ç»èªå¨çæ |
| | | name: undefined, |
| | | gender: undefined, |
| | | birthday: undefined, |
| | | phone: undefined, // ææºå·ä½ä¸ºç³»ç»ç¨æ·è´¦å·ï¼å¿
å¡«ä¸å¯ä¸ |
| | | email: undefined, |
| | | idCard: undefined, |
| | | hireDate: undefined, |
| | | regularDate: undefined, |
| | | employeeStatus: 1, |
| | | annualLeaveBalance: 0, |
| | | sickLeaveBalance: 0, |
| | | salaryStructureId: undefined, // èªé
ȾID |
| | | baseSalary: undefined, // åºæ¬å·¥èµï¼ç¨äºèªé
¬æ ¸ç®ï¼ |
| | | roleIds: [], // è§è²IDå表ï¼ç¨äºåé
ç³»ç»ç¨æ·è§è²ï¼ |
| | | bankName: undefined, |
| | | bankAccount: undefined, |
| | | address: undefined, |
| | | remark: undefined |
| | | }, |
| | | // æè²ç»åå表 |
| | | educationList: [], |
| | | // å·¥ä½ç»åå表 |
| | | workHistoryList: [], |
| | | // ç´§æ¥è系人å表 |
| | | emergencyContactList: [], |
| | | // è§è²é项å表 |
| | | roleOptions: [] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 1.5 è§è²éæ©ç»ä»¶ |
| | | |
| | | ```html |
| | | <el-form-item label="ç¨æ·è§è²" prop="roleIds"> |
| | | <el-select v-model="form.roleIds" multiple placeholder="è¯·éæ©è§è²"> |
| | | <el-option v-for="role in roleOptions" :key="role.id" :label="role.name" :value="role.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | **è·åè§è²å表æ¥å£ï¼** |
| | | ``` |
| | | GET /system/role/simple-list |
| | | ``` |
| | | |
| | | ### 1.6 æè²ç»å表å |
| | | |
| | | ```html |
| | | <el-table :data="educationList" border> |
| | | <el-table-column label="妿 ¡åç§°" prop="schoolName" /> |
| | | <el-table-column label="ä¸ä¸" prop="major" /> |
| | | <el-table-column label="å¦å" prop="degree"> |
| | | <template #default="{ row }"> |
| | | <dict-tag :type="DICT_TYPE.HRM_DEGREE" :value="row.degree" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å
¥å¦æ¶é´" prop="startDate" /> |
| | | <el-table-column label="æ¯ä¸æ¶é´" prop="endDate" /> |
| | | <el-table-column label="è¯ä¹¦ç¼å·" prop="certificateNo" /> |
| | | <el-table-column label="æä½" width="120"> |
| | | <template #default="{ $index, row }"> |
| | | <el-button link type="primary" @click="editEducation($index)">ç¼è¾</el-button> |
| | | <el-button link type="danger" @click="deleteEducation($index)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | ``` |
| | | |
| | | ### 1.6 åå
¸ç±»å |
| | | |
| | | | åå
¸ç±»å | 说æ | |
| | | |---------|------| |
| | | | hrm_degree | å¦åï¼1-é«ä¸ï¼2-大ä¸ï¼3-æ¬ç§ï¼4-ç¡å£«ï¼5-å士 | |
| | | | hrm_employee_status | åå·¥ç¶æï¼1-å¨èï¼2-è¯ç¨ï¼3-离è | |
| | | | hrm_gender | æ§å«ï¼1-ç·ï¼2-女 | |
| | | |
| | | --- |
| | | |
| | | ## äºã人äºå®¡æ¹ - 请åç³è¯· |
| | | |
| | | ### 2.1 æ¶åé¡µé¢ |
| | | |
| | | - 请åç³è¯·å表页 `hrm/approval/leave/index.vue` |
| | | - 请åç³è¯·è¡¨åå¼¹çª `hrm/approval/leave/LeaveForm.vue` |
| | | |
| | | ### 2.2 API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /hrm/leave/page | 请åç³è¯·å页å表 | |
| | | | GET | /hrm/leave/get | è·å请åç³è¯·è¯¦æ
| |
| | | | POST | /hrm/leave/create | æ°å¢è¯·åç³è¯·ï¼èç¨¿ï¼ | |
| | | | PUT | /hrm/leave/update | æ´æ°è¯·åç³è¯· | |
| | | | DELETE | /hrm/leave/delete | å é¤è¯·åç³è¯· | |
| | | | POST | /hrm/leave/submit | æäº¤è¯·åç³è¯·ï¼å起审æ¹ï¼ | |
| | | | POST | /hrm/leave/cancel | æ¤é请åç³è¯· | |
| | | |
| | | ### 2.3 请åç³è¯·è¡¨åæ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | form: { |
| | | id: undefined, |
| | | leaveType: undefined, // 请åç±»å |
| | | startTime: undefined, // å¼å§æ¶é´ |
| | | endTime: undefined, // ç»ææ¶é´ |
| | | duration: undefined, // è¯·åæ¶é¿ï¼å¤©ï¼ |
| | | reason: undefined, // 请ååå |
| | | fileUrl: undefined, // éä»¶ |
| | | remark: undefined |
| | | }, |
| | | leaveTypeOptions: [ |
| | | { value: 1, label: 'äºå' }, |
| | | { value: 2, label: 'ç
å' }, |
| | | { value: 3, label: 'å¹´å' }, |
| | | { value: 4, label: 'å©å' }, |
| | | { value: 5, label: '产å' }, |
| | | { value: 6, label: '丧å' } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 2.4 表åç¤ºä¾ |
| | | |
| | | ```html |
| | | <el-form ref="formRef" :model="form" :rules="rules" label-width="100px"> |
| | | <el-form-item label="请åç±»å" prop="leaveType"> |
| | | <el-select v-model="form.leaveType" placeholder="è¯·éæ©è¯·åç±»å"> |
| | | <el-option v-for="item in leaveTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å¼å§æ¶é´" prop="startTime"> |
| | | <el-date-picker v-model="form.startTime" type="datetime" placeholder="è¯·éæ©å¼å§æ¶é´" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»ææ¶é´" prop="endTime"> |
| | | <el-date-picker v-model="form.endTime" type="datetime" placeholder="è¯·éæ©ç»ææ¶é´" @change="calcDuration" /> |
| | | </el-form-item> |
| | | <el-form-item label="è¯·åæ¶é¿" prop="duration"> |
| | | <el-input-number v-model="form.duration" :precision="2" :min="0.5" :step="0.5" /> |
| | | <span style="margin-left: 10px;">天</span> |
| | | <span v-if="form.leaveType === 3" style="margin-left: 10px; color: #999;"> |
| | | å¹´åä½é¢ï¼{{ annualLeaveBalance }} 天 |
| | | </span> |
| | | </el-form-item> |
| | | <el-form-item label="请ååå " prop="reason"> |
| | | <el-input v-model="form.reason" type="textarea" :rows="3" placeholder="请è¾å
¥è¯·ååå " maxlength="500" show-word-limit /> |
| | | </el-form-item> |
| | | <el-form-item label="éä»¶" prop="fileUrl"> |
| | | <UploadFile v-model="form.fileUrl" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | ``` |
| | | |
| | | ### 2.5 åè¡¨é¡µç¶ææ ç¾ |
| | | |
| | | ```html |
| | | <dict-tag :type="DICT_TYPE.HRM_AUDIT_STATUS" :value="row.status" /> |
| | | ``` |
| | | |
| | | | ç¶æå¼ | ç¶æå | æ ç¾é¢è² | |
| | | |--------|--------|---------| |
| | | | 0 | è稿 | info | |
| | | | 10 | 审æ¹ä¸ | warning | |
| | | | 20 | 审æ¹éè¿ | success | |
| | | | 30 | 审æ¹é©³å | danger | |
| | | | 40 | å·²æ¤é | info | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ã人äºå®¡æ¹ - è°å²ç³è¯· |
| | | |
| | | ### 3.1 æ¶åé¡µé¢ |
| | | |
| | | - è°å²ç³è¯·å表页 `hrm/approval/transfer/index.vue` |
| | | - è°å²ç³è¯·è¡¨åå¼¹çª `hrm/approval/transfer/TransferForm.vue` |
| | | |
| | | ### 3.2 API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /hrm/transfer/page | è°å²ç³è¯·å页å表 | |
| | | | GET | /hrm/transfer/get | è·åè°å²ç³è¯·è¯¦æ
| |
| | | | POST | /hrm/transfer/create | æ°å¢è°å²ç³è¯·ï¼èç¨¿ï¼ | |
| | | | PUT | /hrm/transfer/update | æ´æ°è°å²ç³è¯· | |
| | | | DELETE | /hrm/transfer/delete | å é¤è°å²ç³è¯· | |
| | | | POST | /hrm/transfer/submit | æäº¤è°å²ç³è¯·ï¼å起审æ¹ï¼ | |
| | | | POST | /hrm/transfer/cancel | æ¤éè°å²ç³è¯· | |
| | | |
| | | ### 3.3 è°å²ç³è¯·è¡¨åæ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | form: { |
| | | id: undefined, |
| | | currentDeptId: undefined, // åé¨é¨IDï¼èªå¨è·åå½ååå·¥é¨é¨ï¼ |
| | | currentPostId: undefined, // åå²ä½IDï¼èªå¨è·åå½ååå·¥å²ä½ï¼ |
| | | targetDeptId: undefined, // ç®æ é¨é¨ID |
| | | targetPostId: undefined, // ç®æ å²ä½ID |
| | | transferType: undefined, // è°å²ç±»åï¼1-å¹³è°ï¼2-åèï¼3-éè |
| | | effectiveDate: undefined, // çææ¥æ |
| | | reason: undefined, // è°å²åå |
| | | fileUrl: undefined, // éä»¶ |
| | | remark: undefined |
| | | }, |
| | | transferTypeOptions: [ |
| | | { value: 1, label: 'å¹³è°' }, |
| | | { value: 2, label: 'åè' }, |
| | | { value: 3, label: 'éè' } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 3.4 表åç¤ºä¾ |
| | | |
| | | ```html |
| | | <el-form ref="formRef" :model="form" :rules="rules" label-width="100px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="åé¨é¨"> |
| | | <el-input :value="currentDeptName" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="åå²ä½"> |
| | | <el-input :value="currentPostName" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç®æ é¨é¨" prop="targetDeptId"> |
| | | <DeptTreeSelect v-model="form.targetDeptId" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç®æ å²ä½" prop="targetPostId"> |
| | | <el-select v-model="form.targetPostId" placeholder="è¯·éæ©ç®æ å²ä½"> |
| | | <el-option v-for="post in postOptions" :key="post.id" :label="post.name" :value="post.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="è°å²ç±»å" prop="transferType"> |
| | | <el-radio-group v-model="form.transferType"> |
| | | <el-radio v-for="item in transferTypeOptions" :key="item.value" :label="item.value">{{ item.label }}</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="çææ¥æ" prop="effectiveDate"> |
| | | <el-date-picker v-model="form.effectiveDate" type="date" placeholder="è¯·éæ©çææ¥æ" /> |
| | | </el-form-item> |
| | | <el-form-item label="è°å²åå " prop="reason"> |
| | | <el-input v-model="form.reason" type="textarea" :rows="3" placeholder="请è¾å
¥è°å²åå " maxlength="500" show-word-limit /> |
| | | </el-form-item> |
| | | </el-form> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åã人äºå®¡æ¹ - 离èç³è¯· |
| | | |
| | | ### 4.1 æ¶åé¡µé¢ |
| | | |
| | | - 离èç³è¯·å表页 `hrm/approval/resignation/index.vue` |
| | | - 离èç³è¯·è¡¨åå¼¹çª `hrm/approval/resignation/ResignationForm.vue` |
| | | |
| | | ### 4.2 API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /hrm/resignation/page | 离èç³è¯·å页å表 | |
| | | | GET | /hrm/resignation/get | è·å离èç³è¯·è¯¦æ
| |
| | | | POST | /hrm/resignation/create | æ°å¢ç¦»èç³è¯·ï¼èç¨¿ï¼ | |
| | | | PUT | /hrm/resignation/update | æ´æ°ç¦»èç³è¯· | |
| | | | DELETE | /hrm/resignation/delete | å é¤ç¦»èç³è¯· | |
| | | | POST | /hrm/resignation/submit | æäº¤ç¦»èç³è¯·ï¼å起审æ¹ï¼ | |
| | | | POST | /hrm/resignation/cancel | æ¤é离èç³è¯· | |
| | | | PUT | /hrm/resignation/handover | æ´æ°äº¤æ¥ç¶æ | |
| | | |
| | | ### 4.3 离èç³è¯·è¡¨åæ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | form: { |
| | | id: undefined, |
| | | resignationType: undefined, // 离èç±»åï¼1-主å¨ç¦»èï¼2-被å¨ç¦»èï¼3-ååå°æ |
| | | expectedDate: undefined, // é¢è®¡ç¦»èæ¥æ |
| | | reason: undefined, // 离èåå |
| | | handoverUserId: undefined, // 交æ¥äººID |
| | | fileUrl: undefined, // éä»¶ |
| | | remark: undefined |
| | | }, |
| | | resignationTypeOptions: [ |
| | | { value: 1, label: '主å¨ç¦»è' }, |
| | | { value: 2, label: '被å¨ç¦»è' }, |
| | | { value: 3, label: 'ååå°æ' } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4.4 交æ¥ç¶æ |
| | | |
| | | | ç¶æå¼ | ç¶æå | |
| | | |--------|--------| |
| | | | 0 | æªå¼å§ | |
| | | | 10 | è¿è¡ä¸ | |
| | | | 20 | 已宿 | |
| | | |
| | | --- |
| | | |
| | | ## äºãèå¤ç®¡ç |
| | | |
| | | ### 5.1 æ¶åé¡µé¢ |
| | | |
| | | - èå¤è®°å½å表页 `hrm/attendance/record/index.vue` |
| | | - èå¤è®°å½å¯¼å
¥å¼¹çª `hrm/attendance/record/ImportForm.vue` |
| | | - èå¤å¼å¸¸ç³è¯·é¡µ `hrm/attendance/exception/index.vue` |
| | | |
| | | ### 5.2 API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /hrm/attendance/record/page | èå¤è®°å½å页å表 | |
| | | | GET | /hrm/attendance/record/statistics | èå¤ç»è®¡ï¼ææï¼ | |
| | | | POST | /hrm/attendance/record/import | 导å
¥èå¤è®°å½ | |
| | | | GET | /hrm/attendance/record/export | 导åºèå¤è®°å½ | |
| | | | GET | /hrm/attendance/exception/page | èå¤å¼å¸¸ç³è¯·å页å表 | |
| | | | POST | /hrm/attendance/exception/create | æ°å¢èå¤å¼å¸¸ç³è¯· | |
| | | | POST | /hrm/attendance/exception/submit | æäº¤èå¤å¼å¸¸ç³è¯· | |
| | | |
| | | ### 5.3 èå¤è®°å½æ¥è¯¢åæ° |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | queryParams: { |
| | | pageNo: 1, |
| | | pageSize: 10, |
| | | userId: undefined, // åå·¥ID |
| | | deptId: undefined, // é¨é¨ID |
| | | date: [], // è夿¥æèå´ |
| | | clockInType: undefined, // ä¸çæå¡ç±»å |
| | | clockOutType: undefined // ä¸çæå¡ç±»å |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 5.4 èå¤è®°å½ååºç»æ |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "list": [ |
| | | { |
| | | "id": 1, |
| | | "userId": 1, |
| | | "userName": "å¼ ä¸", |
| | | "deptId": 100, |
| | | "deptName": "ææ¯é¨", |
| | | "date": "2024-01-15", |
| | | "clockInTime": "2024-01-15 08:55:00", |
| | | "clockOutTime": "2024-01-15 18:30:00", |
| | | "clockInType": 1, |
| | | "clockInTypeName": "æ£å¸¸", |
| | | "clockOutType": 1, |
| | | "clockOutTypeName": "æ£å¸¸", |
| | | "workHours": 9.58, |
| | | "overtimeHours": 0.50, |
| | | "location": "å
¬å¸æ»é¨", |
| | | "dataSource": 1, |
| | | "dataSourceName": "æå¡" |
| | | } |
| | | ], |
| | | "total": 100 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 5.5 æå¡ç±»å |
| | | |
| | | | ç±»åå¼ | ç±»åå | é¢è² | |
| | | |--------|--------|------| |
| | | | 1 | æ£å¸¸ | success | |
| | | | 2 | è¿å°/æ©é | warning | |
| | | | 3 | ç¼ºå¡ | danger | |
| | | |
| | | ### 5.6 导å
¥æ¨¡æ¿ |
| | | |
| | | | åå | å¿
å¡« | 说æ | |
| | | |------|------|------| |
| | | | åå·¥ç¼å· | æ¯ | | |
| | | | åå·¥å§å | æ¯ | | |
| | | | è夿¥æ | æ¯ | æ ¼å¼ï¼yyyy-MM-dd | |
| | | | ä¸çæå¡æ¶é´ | å¦ | æ ¼å¼ï¼HH:mm:ss | |
| | | | ä¸çæå¡æ¶é´ | å¦ | æ ¼å¼ï¼HH:mm:ss | |
| | | | æå¡å°ç¹ | å¦ | | |
| | | | 夿³¨ | å¦ | | |
| | | |
| | | --- |
| | | |
| | | ## å
ãèªé
¬ç®¡ç |
| | | |
| | | ### 6.1 æ¶åé¡µé¢ |
| | | |
| | | - èªé
¬ç»æé
置页 `hrm/salary/structure/index.vue` |
| | | - åå·¥èªé
¬æ¡£æ¡é¡µ `hrm/salary/employee-salary/index.vue` |
| | | - èªé
¬æ ¸ç®é¡µ `hrm/salary/calculation/index.vue` |
| | | - èªèµåæ¾é¡µ `hrm/salary/payment/index.vue` |
| | | |
| | | ### 6.2 èªé
¬æ ¸ç®API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /hrm/salary/calculation/page | èªé
¬æ ¸ç®å页å表 | |
| | | | POST | /hrm/salary/calculation/calculate | æ§è¡èªé
¬æ ¸ç®ï¼æå¨æï¼ | |
| | | | POST | /hrm/salary/calculation/confirm | 确认èªé
¬æ ¸ç® | |
| | | | GET | /hrm/salary/calculation/export | 导åºèªé
¬æ ¸ç®è¡¨ | |
| | | |
| | | ### 6.3 èªé
¬æ ¸ç®æ¥è¯¢åæ° |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | queryParams: { |
| | | pageNo: 1, |
| | | pageSize: 10, |
| | | period: undefined, // æ ¸ç®å¨æï¼å¦ 2024-01ï¼ |
| | | userId: undefined, // åå·¥ID |
| | | deptId: undefined, // é¨é¨ID |
| | | status: undefined // ç¶æï¼0-å¾
确认ï¼10-已确认ï¼20-已忾 |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 6.4 èªé
¬æ ¸ç®ååºç»æ |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "list": [ |
| | | { |
| | | "id": 1, |
| | | "no": "SC202401001", |
| | | "period": "2024-01", |
| | | "userId": 1, |
| | | "userName": "å¼ ä¸", |
| | | "deptId": 100, |
| | | "deptName": "ææ¯é¨", |
| | | "baseSalary": 10000.00, |
| | | "performanceSalary": 2000.00, |
| | | "overtimePay": 500.00, |
| | | "mealAllowance": 300.00, |
| | | "transportAllowance": 200.00, |
| | | "otherAllowance": 0.00, |
| | | "socialSecurityDeduction": 1050.00, |
| | | "housingFundDeduction": 1200.00, |
| | | "taxDeduction": 290.00, |
| | | "otherDeduction": 0.00, |
| | | "actualSalary": 10460.00, |
| | | "workDays": 22, |
| | | "overtimeHours": 8.00, |
| | | "status": 0, |
| | | "statusName": "å¾
确认" |
| | | } |
| | | ], |
| | | "total": 100 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 6.5 èªé
¬æ ¸ç®ç¶æ |
| | | |
| | | | ç¶æå¼ | ç¶æå | é¢è² | |
| | | |--------|--------|------| |
| | | | 0 | å¾
确认 | warning | |
| | | | 10 | 已确认 | success | |
| | | | 20 | 已忾 | info | |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãèåé
ç½® |
| | | |
| | | ```js |
| | | // router/modules/hrm.js |
| | | export default { |
| | | path: '/hrm', |
| | | component: Layout, |
| | | name: 'Hrm', |
| | | meta: { title: '人äºç®¡ç', icon: 'ep:user' }, |
| | | children: [ |
| | | { |
| | | path: 'employee', |
| | | name: 'HrmEmployee', |
| | | component: () => import('@/views/hrm/employee/index.vue'), |
| | | meta: { title: 'å工管ç' } |
| | | }, |
| | | { |
| | | path: 'leave', |
| | | name: 'HrmLeave', |
| | | component: () => import('@/views/hrm/approval/leave/index.vue'), |
| | | meta: { title: '请åç³è¯·' } |
| | | }, |
| | | { |
| | | path: 'transfer', |
| | | name: 'HrmTransfer', |
| | | component: () => import('@/views/hrm/approval/transfer/index.vue'), |
| | | meta: { title: 'è°å²ç³è¯·' } |
| | | }, |
| | | { |
| | | path: 'resignation', |
| | | name: 'HrmResignation', |
| | | component: () => import('@/views/hrm/approval/resignation/index.vue'), |
| | | meta: { title: '离èç³è¯·' } |
| | | }, |
| | | { |
| | | path: 'attendance-record', |
| | | name: 'HrmAttendanceRecord', |
| | | component: () => import('@/views/hrm/attendance/record/index.vue'), |
| | | meta: { title: 'èå¤è®°å½' } |
| | | }, |
| | | { |
| | | path: 'attendance-exception', |
| | | name: 'HrmAttendanceException', |
| | | component: () => import('@/views/hrm/attendance/exception/index.vue'), |
| | | meta: { title: 'èå¤å¼å¸¸' } |
| | | }, |
| | | { |
| | | path: 'salary-calculation', |
| | | name: 'HrmSalaryCalculation', |
| | | component: () => import('@/views/hrm/salary/calculation/index.vue'), |
| | | meta: { title: 'èªé
¬æ ¸ç®' } |
| | | }, |
| | | { |
| | | path: 'salary-payment', |
| | | name: 'HrmSalaryPayment', |
| | | component: () => import('@/views/hrm/salary/payment/index.vue'), |
| | | meta: { title: 'èªèµåæ¾' } |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
«ãAPI æ¥å£æä»¶ |
| | | |
| | | ```js |
| | | // api/hrm/employee.js |
| | | import request from '@/utils/request' |
| | | |
| | | export function getEmployeePage(data) { |
| | | return request({ url: '/hrm/employee/page', method: 'GET', params: data }) |
| | | } |
| | | |
| | | export function getEmployee(id) { |
| | | return request({ url: '/hrm/employee/get', method: 'GET', params: { id } }) |
| | | } |
| | | |
| | | export function createEmployee(data) { |
| | | return request({ url: '/hrm/employee/create', method: 'POST', data }) |
| | | } |
| | | |
| | | export function updateEmployee(data) { |
| | | return request({ url: '/hrm/employee/update', method: 'PUT', data }) |
| | | } |
| | | |
| | | export function deleteEmployee(id) { |
| | | return request({ url: '/hrm/employee/delete', method: 'DELETE', params: { id } }) |
| | | } |
| | | |
| | | // api/hrm/leave.js |
| | | import request from '@/utils/request' |
| | | |
| | | export function getLeavePage(data) { |
| | | return request({ url: '/hrm/leave/page', method: 'GET', params: data }) |
| | | } |
| | | |
| | | export function getLeave(id) { |
| | | return request({ url: '/hrm/leave/get', method: 'GET', params: { id } }) |
| | | } |
| | | |
| | | export function createLeave(data) { |
| | | return request({ url: '/hrm/leave/create', method: 'POST', data }) |
| | | } |
| | | |
| | | export function updateLeave(data) { |
| | | return request({ url: '/hrm/leave/update', method: 'PUT', data }) |
| | | } |
| | | |
| | | export function deleteLeave(id) { |
| | | return request({ url: '/hrm/leave/delete', method: 'DELETE', params: { id } }) |
| | | } |
| | | |
| | | export function submitLeave(id) { |
| | | return request({ url: '/hrm/leave/submit', method: 'POST', params: { id } }) |
| | | } |
| | | |
| | | export function cancelLeave(id) { |
| | | return request({ url: '/hrm/leave/cancel', method: 'POST', params: { id } }) |
| | | } |
| | | |
| | | // api/hrm/attendance.js |
| | | import request from '@/utils/request' |
| | | |
| | | export function getAttendanceRecordPage(data) { |
| | | return request({ url: '/hrm/attendance/record/page', method: 'GET', params: data }) |
| | | } |
| | | |
| | | export function importAttendanceRecord(data) { |
| | | return request({ url: '/hrm/attendance/record/import', method: 'POST', data }) |
| | | } |
| | | |
| | | export function exportAttendanceRecord(data) { |
| | | return request({ url: '/hrm/attendance/record/export', method: 'GET', params: data, responseType: 'blob' }) |
| | | } |
| | | |
| | | // api/hrm/salary.js |
| | | import request from '@/utils/request' |
| | | |
| | | export function getSalaryCalculationPage(data) { |
| | | return request({ url: '/hrm/salary/calculation/page', method: 'GET', params: data }) |
| | | } |
| | | |
| | | export function calculateSalary(data) { |
| | | return request({ url: '/hrm/salary/calculation/calculate', method: 'POST', data }) |
| | | } |
| | | |
| | | export function confirmSalary(data) { |
| | | return request({ url: '/hrm/salary/calculation/confirm', method: 'POST', data }) |
| | | } |
| | | |
| | | export function exportSalaryCalculation(data) { |
| | | return request({ url: '/hrm/salary/calculation/export', method: 'GET', params: data, responseType: 'blob' }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¹ãBPM æµç¨éæ |
| | | |
| | | ### 9.1 æµç¨å®ä¹é
ç½® |
| | | |
| | | éè¦å¨ BPM ç³»ç»ä¸é
置以ä¸å®¡æ¹åç±»åæµç¨å®ä¹ï¼ |
| | | |
| | | | ä¸å¡ç±»å | åç±»ç¼ç | æµç¨å®ä¹Key | 说æ | |
| | | |---------|---------|------------|------| |
| | | | 请åç³è¯· | hrm_leave_approve | hrm_leave | 请åå®¡æ¹æµç¨ | |
| | | | è°å²ç³è¯· | hrm_transfer_approve | hrm_transfer | è°å²å®¡æ¹æµç¨ | |
| | | | 离èç³è¯· | hrm_resignation_approve | hrm_resignation | 离èå®¡æ¹æµç¨ | |
| | | |
| | | ### 9.2 æäº¤å®¡æ¹æ¥å£ |
| | | |
| | | **请åç³è¯·æäº¤ï¼** |
| | | |
| | | ``` |
| | | POST /hrm/leave/submit?id=1&processDefinitionKey=hrm_leave |
| | | ``` |
| | | |
| | | **è·åå¯ç¨æµç¨å®ä¹å表ï¼** |
| | | |
| | | ``` |
| | | GET /hrm/leave/approve-process-definition-list |
| | | ``` |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | [ |
| | | { |
| | | "id": "hrm_leave:1:xxx", |
| | | "key": "hrm_leave", |
| | | "name": "请åå®¡æ¹æµç¨", |
| | | "version": 1 |
| | | } |
| | | ] |
| | | ``` |
| | | |
| | | ### 9.3 审æ¹ç¶ææµè½¬ |
| | | |
| | | | ç¶æå¼ | ç¶æå | 说æ | |
| | | |--------|--------|------| |
| | | | 0 | è稿 | æ°å»ºæªæäº¤ | |
| | | | 10 | 审æ¹ä¸ | å·²æäº¤BPMæµç¨ | |
| | | | 20 | 审æ¹éè¿ | BPMæµç¨å®¡æ¹éè¿ | |
| | | | 30 | 审æ¹é©³å | BPMæµç¨å®¡æ¹é©³å | |
| | | | 40 | å·²æ¤é | BPMæµç¨è¢«æ¤é | |
| | | |
| | | --- |
| | | |
| | | ## åãæ³¨æäºé¡¹ |
| | | |
| | | 1. **æ°æ®æé**ï¼å表æ¥è¯¢ä¼èªå¨æ ¹æ®å½åç¨æ·çé¨é¨æéè¿æ»¤æ°æ® |
| | | 2. **å®¡æ¹æµç¨**ï¼æäº¤ç³è¯·åï¼ç¶æå为"审æ¹ä¸"ï¼éçå¾
BPMæµç¨å®æ |
| | | 3. **å¹´åæ ¡éª**ï¼è¯·åç±»åä¸ºå¹´åæ¶ï¼éæ ¡éªå¹´åä½é¢æ¯å¦å
è¶³ |
| | | 4. **èå¤å¯¼å
¥**ï¼å¯¼å
¥æ¶ä¼èªå¨æ ¹æ®èå¤è§å夿æå¡ç±»å |
| | | 5. **èªé
¬æ ¸ç®**ï¼æ ¸ç®åéç¡®ä¿å½æè夿°æ®å·²å¯¼å
¥å®æ |
| | | 6. **æ°æ®è¿½æº¯**ï¼æææä½é½ä¼è®°å½æä½æ¥å¿ï¼æ¯æ3ä¸ªææ°æ®è¿½æº¯ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 请åç±»åæ£æ¬¾é
ç½® & èªé
¬æ ¸ç®èå¨ & èªèµåæ¾æµç¨ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | èªé
¬æ ¸ç®æ¨¡åæ°å¢è¯·åæ£æ¬¾åè½ï¼å¹¶å®ç°èªé
¬æ ¸ç®å°èªèµåæ¾çèªå¨æµè½¬ã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - èªé
¬ç®¡ç -> èªé
¬è®¾ç½® -> è¯·åæ£æ¬¾é
ç½® |
| | | - èªé
¬ç®¡ç -> èªé
¬æ ¸ç® -> èªé
¬æ ¸ç®é¢è§ |
| | | - èªé
¬ç®¡ç -> èªèµåæ¾ -> èªèµåæ¾å°è´¦ |
| | | - èªé
¬ç®¡ç -> èªèµåæ¾ -> èªèµåæ¾æç» |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãè¯·åæ£æ¬¾é
ç½® |
| | | |
| | | ### 1. è·å请åç±»åé
ç½®å表 |
| | | |
| | | **请æ±ï¼** |
| | | ``` |
| | | GET /admin-api/hrm/leave-type-config/list |
| | | ``` |
| | | |
| | | **ååºï¼** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "id": 1, |
| | | "leaveType": 1, |
| | | "name": "äºå", |
| | | "deductionRatio": 1.0000, |
| | | "remark": "å
¨é¢æ£æ¬¾", |
| | | "status": 0 |
| | | }, |
| | | { |
| | | "id": 2, |
| | | "leaveType": 2, |
| | | "name": "ç
å", |
| | | "deductionRatio": 0.5000, |
| | | "remark": "æ50%æ£æ¬¾", |
| | | "status": 0 |
| | | }, |
| | | { |
| | | "id": 3, |
| | | "leaveType": 3, |
| | | "name": "å¹´å", |
| | | "deductionRatio": 0.0000, |
| | | "remark": "䏿£æ¬¾", |
| | | "status": 0 |
| | | } |
| | | ], |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | **åæ®µè¯´æï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | ä¸»é® | |
| | | | leaveType | Integer | 请åç±»åï¼1-äºå, 2-ç
å, 3-å¹´å, 4-å©å, 5-产å, 6-丧å | |
| | | | name | String | ç±»ååç§° | |
| | | | deductionRatio | BigDecimal | æ£æ¬¾æ¯ä¾ï¼0-1ä¹é´ï¼å¦0.5表示æ£50%ï¼ | |
| | | | remark | String | 夿³¨ | |
| | | | status | Integer | ç¶æï¼0-å¯ç¨, 1-ç¦ç¨ | |
| | | |
| | | ### 2. æ´æ°è¯·åç±»åé
ç½® |
| | | |
| | | **请æ±ï¼** |
| | | ``` |
| | | PUT /admin-api/hrm/leave-type-config/update |
| | | ``` |
| | | |
| | | **请æ±ä½ï¼** |
| | | ```json |
| | | { |
| | | "id": 2, |
| | | "deductionRatio": 0.3000, |
| | | "remark": "æ30%æ£æ¬¾", |
| | | "status": 0 |
| | | } |
| | | ``` |
| | | |
| | | **ååºï¼** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": true, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãèªé
¬æ ¸ç®ï¼å·²éæè¯·åæ£æ¬¾ï¼ |
| | | |
| | | ### 1. é¢è§èªé
¬æ ¸ç® |
| | | |
| | | **请æ±ï¼** |
| | | ``` |
| | | GET /admin-api/hrm/salary/calculation/preview?period=2026-02&deptId=103 |
| | | ``` |
| | | |
| | | **åæ°è¯´æï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | period | String | æ¯ | æ ¸ç®å¨æï¼æ ¼å¼å¦2026-02 | |
| | | | deptId | Long | å¦ | é¨é¨IDï¼ä¸ä¼ åæ¥è¯¢å
¨é¨ | |
| | | |
| | | **ååºï¼** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "id": null, |
| | | "no": null, |
| | | "period": "2026-02", |
| | | "userId": 1, |
| | | "userName": "å¼ ä¸", |
| | | "deptId": 103, |
| | | "deptName": "ç åé¨", |
| | | "baseSalary": 10000.00, |
| | | "performanceSalary": 2000.00, |
| | | "overtimePay": 0.00, |
| | | "mealAllowance": 500.00, |
| | | "transportAllowance": 300.00, |
| | | "otherAllowance": 0.00, |
| | | "socialSecurityDeduction": 1020.00, |
| | | "housingFundDeduction": 1200.00, |
| | | "taxDeduction": 0.00, |
| | | "otherDeduction": 0.00, |
| | | "leaveDeduction": 460.00, |
| | | "actualSalary": 10620.00, |
| | | "workDays": 22, |
| | | "overtimeHours": 0.00, |
| | | "status": null, |
| | | "remark": null |
| | | } |
| | | ], |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | **æ°å¢å段说æï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | leaveDeduction | BigDecimal | è¯·åæ£æ¬¾éé¢ | |
| | | |
| | | ### 2. æ¹é确认èªé
¬æ ¸ç® |
| | | |
| | | **请æ±ï¼** |
| | | ``` |
| | | POST /admin-api/hrm/salary/calculation/confirm |
| | | ``` |
| | | |
| | | **请æ±ä½ï¼** |
| | | ```json |
| | | { |
| | | "ids": [1, 2, 3] |
| | | } |
| | | ``` |
| | | |
| | | **ååºï¼** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": true, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãè¯·åæ£æ¬¾è®¡ç®è§å |
| | | |
| | | ### 计ç®å
¬å¼ |
| | | |
| | | ``` |
| | | è¯·åæ£æ¬¾ = æ¥å·¥èµ à 请åå¤©æ° Ã æ£æ¬¾æ¯ä¾ |
| | | æ¥å·¥èµ = åºæ¬å·¥èµ / 21.75 |
| | | ``` |
| | | |
| | | ### æ£æ¬¾è§å |
| | | |
| | | | 请åç±»å | é»è®¤æ£æ¬¾æ¯ä¾ | 说æ | |
| | | |----------|-------------|------| |
| | | | äºå | 100% | å
¨é¢æ£æ¬¾ | |
| | | | ç
å | 50% | ææ¯ä¾æ£æ¬¾ | |
| | | | å¹´å | 0% | 䏿£æ¬¾ | |
| | | | å©å | 0% | 䏿£æ¬¾ | |
| | | | 产å | 0% | 䏿£æ¬¾ | |
| | | | 丧å | 0% | 䏿£æ¬¾ | |
| | | |
| | | ### 计ç®ç¤ºä¾ |
| | | |
| | | åå·¥å¼ ä¸ï¼ |
| | | - åºæ¬å·¥èµï¼10000å
|
| | | - æ¥å·¥èµï¼10000 / 21.75 = 460å
|
| | | - 请åè®°å½ï¼äºå2天ï¼ç
å1天 |
| | | |
| | | 计ç®ï¼ |
| | | - äºåæ£æ¬¾ï¼460 à 2 à 100% = 920å
|
| | | - ç
åæ£æ¬¾ï¼460 à 1 à 50% = 230å
|
| | | - æ»è¯·åæ£æ¬¾ï¼920 + 230 = 1150å
|
| | | |
| | | --- |
| | | |
| | | ## åãæ°æ®åºåæ´ |
| | | |
| | | æ§è¡ä»¥ä¸SQLèæ¬ï¼ |
| | | |
| | | ```sql |
| | | -- 请åç±»åæ£æ¬¾é
置表 |
| | | CREATE TABLE IF NOT EXISTS hrm_leave_type_config ( |
| | | id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主é®', |
| | | leave_type INT NOT NULL COMMENT '请åç±»åï¼1-äºå, 2-ç
å, 3-å¹´å, 4-å©å, 5-产å, 6-丧å', |
| | | name VARCHAR(32) NOT NULL COMMENT 'ç±»ååç§°', |
| | | deduction_ratio DECIMAL(5,4) NOT NULL DEFAULT 0.0000 COMMENT 'æ£æ¬¾æ¯ä¾ï¼0-1ä¹é´ï¼', |
| | | remark VARCHAR(255) DEFAULT NULL COMMENT '夿³¨', |
| | | status INT NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¯ç¨, 1-ç¦ç¨', |
| | | create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | update_time DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | creator VARCHAR(64) DEFAULT '' COMMENT 'å建人', |
| | | updater VARCHAR(64) DEFAULT '' COMMENT 'æ´æ°äºº', |
| | | deleted BIT NOT NULL DEFAULT 0 COMMENT 'æ¯å¦å é¤' |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '请åç±»åæ£æ¬¾é
ç½®'; |
| | | |
| | | -- åå§åé»è®¤æ°æ® |
| | | INSERT INTO hrm_leave_type_config (leave_type, name, deduction_ratio, remark, status) VALUES |
| | | (1, 'äºå', 1.0000, 'å
¨é¢æ£æ¬¾', 0), |
| | | (2, 'ç
å', 0.5000, 'æ50%æ£æ¬¾', 0), |
| | | (3, 'å¹´å', 0.0000, '䏿£æ¬¾', 0), |
| | | (4, 'å©å', 0.0000, '䏿£æ¬¾', 0), |
| | | (5, '产å', 0.0000, '䏿£æ¬¾', 0), |
| | | (6, '丧å', 0.0000, '䏿£æ¬¾', 0); |
| | | |
| | | -- èªé
¬æ ¸ç®è¡¨æ·»å è¯·åæ£æ¬¾åæ®µ |
| | | ALTER TABLE hrm_salary_calculation ADD COLUMN leave_deduction DECIMAL(10,2) DEFAULT 0.00 COMMENT 'è¯·åæ£æ¬¾' AFTER other_deduction; |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãå端修æ¹ç¹ |
| | | |
| | | ### 1. è¯·åæ£æ¬¾é
ç½®é¡µé¢ |
| | | |
| | | ```html |
| | | <!-- é
ç½®åè¡¨è¡¨æ ¼ --> |
| | | <el-table :data="configList"> |
| | | <el-table-column prop="name" label="请åç±»å" /> |
| | | <el-table-column prop="deductionRatio" label="æ£æ¬¾æ¯ä¾"> |
| | | <template #default="{ row }"> |
| | | {{ (row.deductionRatio * 100).toFixed(0) }}% |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="remark" label="夿³¨" /> |
| | | <el-table-column label="æä½"> |
| | | <template #default="{ row }"> |
| | | <el-button @click="handleEdit(row)">ç¼è¾</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- ç¼è¾å¼¹çª --> |
| | | <el-dialog v-model="editVisible" title="ç¼è¾æ£æ¬¾æ¯ä¾"> |
| | | <el-form> |
| | | <el-form-item label="æ£æ¬¾æ¯ä¾"> |
| | | <el-input-number v-model="editForm.deductionRatio" :min="0" :max="100" :step="10" /> |
| | | <span>%</span> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨"> |
| | | <el-input v-model="editForm.remark" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-dialog> |
| | | ``` |
| | | |
| | | ### 2. èªé
¬æ ¸ç®è¡¨æ ¼æ°å¢å |
| | | |
| | | ```html |
| | | <el-table-column prop="leaveDeduction" label="è¯·åæ£æ¬¾" /> |
| | | ``` |
| | | |
| | | ### 3. æ¹é确认æé® |
| | | |
| | | ```html |
| | | <el-button @click="handleConfirm">æ¹é确认</el-button> |
| | | ``` |
| | | |
| | | ```js |
| | | handleConfirm() { |
| | | const ids = this.selectedRows.map(row => row.id); |
| | | if (ids.length === 0) { |
| | | this.$message.warning('è¯·éæ©è¦ç¡®è®¤çè®°å½'); |
| | | return; |
| | | } |
| | | request.post('/hrm/salary/calculation/confirm', { ids }).then(res => { |
| | | this.$message.success('确认æå'); |
| | | this.getList(); |
| | | }); |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. è¯·åæ£æ¬¾åªè®¡ç®å·²å®¡æ¹éè¿ç请åè®°å½ |
| | | 2. åªæå¯ç¨ç请åç±»åé
ç½®æä¼åä¸è®¡ç® |
| | | 3. æ¥å·¥èµæå½å®¶æ å21.75å¤©è®¡ç® |
| | | 4. èªé
¬æ ¸ç®é¢è§æ¥å£å®æ¶è®¡ç®ï¼ä¸ä¾èµæ°æ®åºå·²åå¨çæ°æ® |
| | | |
| | | --- |
| | | |
| | | ## å
ãèªèµåæ¾æµç¨ |
| | | |
| | | ### ä¸å¡æµç¨å¾ |
| | | |
| | | ``` |
| | | èªé
¬æ ¸ç®(å¾
确认) â æ¹é确认 â èªé
¬æ ¸ç®(已确认) â [å
¨é¨ç¡®è®¤åèªå¨çæåæ¾å°è´¦] â èªèµåæ¾(å¾
åæ¾) â åæ¾èªèµ â èªèµåæ¾(已忾) |
| | | ``` |
| | | |
| | | **èªå¨çæè§å**ï¼å½è¯¥å¨æææèªé
¬æ ¸ç®è®°å½é½ç¡®è®¤åï¼ç³»ç»èªå¨çæèªèµåæ¾å°è´¦ã |
| | | |
| | | ### 1. çæèªèµåæ¾å°è´¦ |
| | | |
| | | å°å·²ç¡®è®¤çèªé
¬æ ¸ç®è®°å½èªå¨è½¬å
¥åæ¾å°è´¦ã |
| | | |
| | | **请æ±ï¼** |
| | | ``` |
| | | POST /admin-api/hrm/salary/payment/generate?period=2026-02 |
| | | ``` |
| | | |
| | | **åæ°è¯´æï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | period | String | æ¯ | æ ¸ç®å¨æ | |
| | | |
| | | **ååºï¼** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": 1, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | è¿ååæ¾å°è´¦IDã |
| | | |
| | | ### 2. è·åèªèµåæ¾å°è´¦å页 |
| | | |
| | | **请æ±ï¼** |
| | | ``` |
| | | GET /admin-api/hrm/salary/payment/page?pageNo=1&pageSize=20 |
| | | ``` |
| | | |
| | | **ååºï¼** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "list": [ |
| | | { |
| | | "id": 1, |
| | | "no": "SF202602010001", |
| | | "period": "2026-02", |
| | | "totalAmount": 150000.00, |
| | | "totalCount": 15, |
| | | "paymentMethod": null, |
| | | "paymentTime": null, |
| | | "status": 0, |
| | | "fileUrl": null, |
| | | "remark": null |
| | | } |
| | | ], |
| | | "total": 1 |
| | | }, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | **åæ®µè¯´æï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | åæ¾å°è´¦ID | |
| | | | no | String | åæ¾åå· | |
| | | | period | String | 忾卿 | |
| | | | totalAmount | BigDecimal | åæ¾æ»éé¢ | |
| | | | totalCount | Integer | åæ¾äººæ° | |
| | | | paymentMethod | Integer | åæ¾æ¹å¼ï¼1-é¶è¡è½¬è´¦ï¼2-ç°é | |
| | | | paymentTime | LocalDateTime | åæ¾æ¶é´ | |
| | | | status | Integer | ç¶æï¼0-å¾
åæ¾ï¼10-已忾 | |
| | | | fileUrl | String | é¶è¡ååéä»¶ | |
| | | | remark | String | 夿³¨ | |
| | | |
| | | ### 3. è·åèªèµåæ¾æç»å表 |
| | | |
| | | **请æ±ï¼** |
| | | ``` |
| | | GET /admin-api/hrm/salary/payment/detail/list?paymentId=1 |
| | | ``` |
| | | |
| | | **ååºï¼** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { |
| | | "id": 1, |
| | | "paymentId": 1, |
| | | "calculationId": 1, |
| | | "userId": 1, |
| | | "userName": "å¼ ä¸", |
| | | "deptId": 103, |
| | | "deptName": "ç åé¨", |
| | | "actualSalary": 10620.00, |
| | | "status": 0, |
| | | "paymentTime": null, |
| | | "remark": null |
| | | } |
| | | ], |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | ### 4. åæ¾èªèµï¼æ´ä¸ªå°è´¦ï¼ |
| | | |
| | | **请æ±ï¼** |
| | | ``` |
| | | POST /admin-api/hrm/salary/payment/pay?id=1 |
| | | ``` |
| | | |
| | | **ååºï¼** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": true, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | åæ¾åï¼å°è´¦ç¶æåä¸ºå·²åæ¾ï¼æææç»ç¶æåä¸ºå·²åæ¾ã |
| | | |
| | | ### 5. æ¹éåæ¾èªèµæç» |
| | | |
| | | å¯éæ©æ§åæ¾é¨ååå·¥çèªèµã |
| | | |
| | | **请æ±ï¼** |
| | | ``` |
| | | POST /admin-api/hrm/salary/payment/pay-detail |
| | | ``` |
| | | |
| | | **请æ±ä½ï¼** |
| | | ```json |
| | | { |
| | | "detailIds": [1, 2, 3] |
| | | } |
| | | ``` |
| | | |
| | | **ååºï¼** |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": true, |
| | | "msg": "æä½æå" |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãèªèµåæ¾æ°æ®åºåæ´ |
| | | |
| | | ```sql |
| | | -- èªèµåæ¾æç»è¡¨ |
| | | CREATE TABLE IF NOT EXISTS hrm_salary_payment_detail ( |
| | | id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主é®', |
| | | payment_id BIGINT NOT NULL COMMENT 'åæ¾å°è´¦ID', |
| | | calculation_id BIGINT NOT NULL COMMENT 'èªé
¬æ ¸ç®ID', |
| | | user_id BIGINT NOT NULL COMMENT 'åå·¥ID', |
| | | dept_id BIGINT DEFAULT NULL COMMENT 'é¨é¨ID', |
| | | actual_salary DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT 'å®åå·¥èµ', |
| | | status INT NOT NULL DEFAULT 0 COMMENT 'åæ¾ç¶æï¼0-å¾
åæ¾ï¼10-已忾', |
| | | payment_time DATETIME DEFAULT NULL COMMENT 'åæ¾æ¶é´', |
| | | remark VARCHAR(255) DEFAULT NULL COMMENT '夿³¨', |
| | | create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | update_time DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | creator VARCHAR(64) DEFAULT '' COMMENT 'å建人', |
| | | updater VARCHAR(64) DEFAULT '' COMMENT 'æ´æ°äºº', |
| | | deleted BIT NOT NULL DEFAULT 0 COMMENT 'æ¯å¦å é¤', |
| | | INDEX idx_payment_id (payment_id), |
| | | INDEX idx_calculation_id (calculation_id) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT 'èªèµåæ¾æç»'; |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
«ãèªèµåæ¾å端修æ¹ç¹ |
| | | |
| | | ### 1. èªèµåæ¾å°è´¦é¡µé¢ |
| | | |
| | | ```html |
| | | <!-- çæåæ¾å°è´¦æé® --> |
| | | <el-button @click="handleGenerate">çæåæ¾å°è´¦</el-button> |
| | | |
| | | <!-- å°è´¦å表 --> |
| | | <el-table :data="paymentList"> |
| | | <el-table-column prop="no" label="åæ¾åå·" /> |
| | | <el-table-column prop="period" label="忾卿" /> |
| | | <el-table-column prop="totalAmount" label="åæ¾æ»éé¢" /> |
| | | <el-table-column prop="totalCount" label="åæ¾äººæ°" /> |
| | | <el-table-column prop="status" label="ç¶æ"> |
| | | <template #default="{ row }"> |
| | | {{ row.status === 0 ? 'å¾
忾' : '已忾' }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½"> |
| | | <template #default="{ row }"> |
| | | <el-button @click="handleViewDetail(row)">æ¥çæç»</el-button> |
| | | <el-button v-if="row.status === 0" @click="handlePay(row)">åæ¾èªèµ</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | ``` |
| | | |
| | | ### 2. åæ¾æç»å¼¹çª |
| | | |
| | | ```html |
| | | <el-dialog v-model="detailVisible" title="åæ¾æç»"> |
| | | <el-table :data="detailList"> |
| | | <el-table-column prop="userName" label="åå·¥å§å" /> |
| | | <el-table-column prop="deptName" label="é¨é¨" /> |
| | | <el-table-column prop="actualSalary" label="å®åå·¥èµ" /> |
| | | <el-table-column prop="status" label="ç¶æ"> |
| | | <template #default="{ row }"> |
| | | {{ row.status === 0 ? 'å¾
忾' : '已忾' }} |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-dialog> |
| | | ``` |
| | | |
| | | ### 3. çæåæ¾å°è´¦æ¹æ³ |
| | | |
| | | ```js |
| | | handleGenerate() { |
| | | this.$prompt('请è¾å
¥åæ¾å¨æ', 'çæåæ¾å°è´¦', { |
| | | inputPattern: /^\d{4}-\d{2}$/, |
| | | inputErrorMessage: 'å¨ææ ¼å¼ä¸æ£ç¡®ï¼å¦2026-02' |
| | | }).then(({ value }) => { |
| | | request.post(`/hrm/salary/payment/generate?period=${value}`).then(res => { |
| | | this.$message.success('çææå'); |
| | | this.getList(); |
| | | }); |
| | | }); |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ï¼èªèµåæ¾ï¼ |
| | | |
| | | 1. çæåæ¾å°è´¦åï¼å¿
é¡»å
确认èªé
¬æ ¸ç®è®°å½ |
| | | 2. æ¯ä¸ªå¨æåªè½çæä¸ä¸ªåæ¾å°è´¦ |
| | | 3. çæå°è´¦åï¼èªé
¬æ ¸ç®ç¶æå为"已忾" |
| | | 4. åæ¾èªèµåä¸å¯æ¤é |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # èªé
¬æ ¸ç®åè½ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - èªé
¬æ ¸ç®åè¡¨é¡µé¢ |
| | | - èªé
¬æ ¸ç®è¯¦æ
é¡µé¢ |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /hrm/salary/calculation/calculate | æ§è¡èªé
¬æ ¸ç® | |
| | | | POST | /hrm/salary/calculation/confirm | 确认èªé
¬æ ¸ç® | |
| | | | POST | /hrm/salary/calculation/save | æ¹éä¿åèªé
¬æ ¸ç®è®°å½ | |
| | | | GET | /hrm/salary/calculation/page | è·åèªé
¬æ ¸ç®å页å表 | |
| | | | GET | /hrm/salary/calculation/get | è·åèªé
¬æ ¸ç®è¯¦æ
| |
| | | | GET | /hrm/salary/calculation/preview | é¢è§é¨é¨ä¸ææåå·¥çèªèµæ ¸ç®ä¿¡æ¯ | |
| | | | GET | /hrm/salary/calculation/export-excel | 导åºèªé
¬æ ¸ç® Excel | |
| | | |
| | | **èªé
¬æ ¸ç®è¯·æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | period | String | æ¯ | æ ¸ç®å¨æï¼æ ¼å¼å¦ 2024-01 | |
| | | | deptId | Long | å¦ | é¨é¨IDï¼ä¸ºç©ºåæ ¸ç®ææé¨é¨ | |
| | | |
| | | **é¢è§æ¥å£è¯·æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | period | String | æ¯ | æ ¸ç®å¨æï¼æ ¼å¼å¦ 2024-01 | |
| | | | deptId | Long | æ¯ | é¨é¨ID | |
| | | |
| | | **æ¹éä¿åæ¥å£è¯·æ±ä½ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "period": "2024-01", |
| | | "list": [ |
| | | { |
| | | "id": null, |
| | | "userId": 1, |
| | | "deptId": 100, |
| | | "baseSalary": 10000.00, |
| | | "performanceSalary": 2000.00, |
| | | "overtimePay": 500.00, |
| | | "mealAllowance": 300.00, |
| | | "transportAllowance": 200.00, |
| | | "otherAllowance": 0.00, |
| | | "socialSecurityDeduction": 1050.00, |
| | | "housingFundDeduction": 1200.00, |
| | | "taxDeduction": 290.00, |
| | | "otherDeduction": 0.00, |
| | | "actualSalary": 10460.00, |
| | | "workDays": 22, |
| | | "overtimeHours": 8.00, |
| | | "remark": "" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | **èªé
¬æ ¸ç®è®°å½ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | æ ¸ç®ID | |
| | | | no | String | æ ¸ç®åå· | |
| | | | period | String | æ ¸ç®å¨æ | |
| | | | userId | Long | åå·¥ID | |
| | | | deptId | Long | é¨é¨ID | |
| | | | baseSalary | BigDecimal | åºæ¬å·¥èµ | |
| | | | performanceSalary | BigDecimal | 绩æå·¥èµ | |
| | | | overtimePay | BigDecimal | å çå·¥èµ | |
| | | | mealAllowance | BigDecimal | é¤è¡¥ | |
| | | | transportAllowance | BigDecimal | 交é补贴 | |
| | | | otherAllowance | BigDecimal | å
¶ä»è¡¥è´´ | |
| | | | socialSecurityDeduction | BigDecimal | ç¤¾ä¿æ£é¤ | |
| | | | housingFundDeduction | BigDecimal | å
¬ç§¯éæ£é¤ | |
| | | | taxDeduction | BigDecimal | ä¸ªç¨æ£é¤ | |
| | | | otherDeduction | BigDecimal | å
¶ä»æ£é¤ | |
| | | | actualSalary | BigDecimal | å®åå·¥èµ | |
| | | | workDays | Integer | åºå¤å¤©æ° | |
| | | | overtimeHours | BigDecimal | å çæ¶é¿ | |
| | | | status | Integer | ç¶æï¼0-å¾
确认ï¼10-已确认ï¼20-已忾 | |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. èªé
¬æ ¸ç®æé®ï¼æ·»å é¨é¨éæ©ï¼ |
| | | |
| | | ```html |
| | | <el-form-item label="æ ¸ç®é¨é¨"> |
| | | <el-select v-model="calculationDeptId" placeholder="å
¨é¨é¨é¨" clearable> |
| | | <el-option label="å
¨é¨é¨é¨" value="" /> |
| | | <el-option v-for="dept in deptList" :key="dept.id" :label="dept.name" :value="dept.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-button type="primary" @click="handleCalculate">æ§è¡æ ¸ç®</el-button> |
| | | ``` |
| | | |
| | | ### 2. data æ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | calculationPeriod: '', // æ ¸ç®å¨æ |
| | | calculationDeptId: null, // æ ¸ç®é¨é¨ID |
| | | deptList: [], // é¨é¨å表 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 3. æ¹æ³ |
| | | |
| | | ```js |
| | | // æ§è¡èªé
¬æ ¸ç® |
| | | handleCalculate() { |
| | | if (!this.calculationPeriod) { |
| | | this.$message.warning('è¯·éæ©æ ¸ç®å¨æ') |
| | | return |
| | | } |
| | | const params = { |
| | | period: this.calculationPeriod |
| | | } |
| | | if (this.calculationDeptId) { |
| | | params.deptId = this.calculationDeptId |
| | | } |
| | | request.post('/hrm/salary/calculation/calculate', null, { params }) |
| | | .then(res => { |
| | | this.$message.success('èªé
¬æ ¸ç®æ§è¡æå') |
| | | this.getList() // å·æ°å表 |
| | | }) |
| | | .catch(err => { |
| | | this.$message.error(err.message || 'èªé
¬æ ¸ç®æ§è¡å¤±è´¥') |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ## æ ¸ç®é»è¾è¯´æ |
| | | |
| | | 1. **è·ååå·¥**ï¼æ¥è¯¢ææå¨èï¼ç¶æ=1ï¼åè¯ç¨æï¼ç¶æ=2ï¼åå·¥ |
| | | 2. **è·åèªé
¬æ¡£æ¡**ï¼éè¿ `selectLatestByUserId(userId)` è·ååå·¥ææ°çæçèªé
¬æ¡£æ¡ |
| | | 3. **èªé
¬æ¡£æ¡ä¸å卿¶**ï¼ä½¿ç¨å工表ç `baseSalary` åæ®µä½ä¸ºåºæ¬å·¥èµï¼å
¶ä»èªèµé¡¹ç®è®¾ä¸º 0 |
| | | 4. **计ç®å®åå·¥èµ**ï¼å®åå·¥èµ = åºæ¬å·¥èµ + 绩æå·¥èµ + å项补贴 - å项æ£é¤ |
| | | 5. **鲿¢é夿 ¸ç®**ï¼åä¸åå·¥åä¸å¨æåªçæä¸æ¡æ ¸ç®è®°å½ |
| | | 6. **æ ¸ç®ç¶æ**ï¼åå§ç¶æä¸ºå¾
确认(0)ï¼ç¡®è®¤åå为已确认(10) |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - èªé
¬æ ¸ç®åéè¦ç¡®ä¿åå·¥æèªé
¬æ¡£æ¡æåå·¥è¡¨ä¸æåºæ¬å·¥èµ |
| | | - 社ä¿ãå
¬ç§¯éãä¸ªç¨æ£é¤ç®å设为 0ï¼åç»éè¦å¯¹æ¥å
·ä½è®¡ç®æå¡ |
| | | - æ ¸ç®å¨ææ ¼å¼ä¸º YYYY-MMï¼å¦ 2024-01ï¼ |
| | | - åä¸åå·¥åä¸å¨æåªè½æ ¸ç®ä¸æ¬¡ï¼éå¤è°ç¨ä¼è·³è¿å·²æ ¸ç®åå·¥ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 社ä¿å
¬ç§¯éä¸ªç¨æ£é¤åè½ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - èªé
¬ç®¡ç -> 社ä¿å
¬ç§¯éæ¹æ¡ |
| | | - èªé
¬ç®¡ç -> 个ç¨ç¨çé
ç½® |
| | | - èªé
¬ç®¡ç -> èªé
¬æ ¸ç® |
| | | - å工管ç -> å工社ä¿å
¬ç§¯éæ¡£æ¡ |
| | | |
| | | ## æ°æ®åºè¡¨ |
| | | |
| | | | 表å | 说æ | |
| | | |------|------| |
| | | | hrm_employee | åå·¥åºæ¬ä¿¡æ¯è¡¨ | |
| | | | hrm_employee_salary | åå·¥èªé
¬æ¡£æ¡è¡¨ | |
| | | | hrm_employee_social_security | å工社ä¿å
¬ç§¯éæ¡£æ¡è¡¨ï¼ç»å®æ¹æ¡ + 个人ååºæ°ï¼ | |
| | | | hrm_social_security_scheme | 社ä¿å
¬ç§¯éæ¹æ¡è¡¨ï¼æ¯ä¾æ¨¡æ¿ï¼ | |
| | | | hrm_tax_rate_config | 个ç¨ç¨çé
置表ï¼ç´¯è¿ç¨çï¼ | |
| | | |
| | | **设计说æï¼** |
| | | - **社ä¿å
¬ç§¯éæ¹æ¡**ï¼å®ä¹å项缴纳æ¯ä¾ï¼å¯è¢«å¤ä¸ªåå·¥å¤ç¨ |
| | | - **å工社ä¿å
¬ç§¯éæ¡£æ¡**ï¼åå·¥ç»å®æ¹æ¡ï¼è®¾ç½®ä¸ªäººåçç¼´çº³åºæ° |
| | | - ä¸ä¸ªç¤¾ä¿æ¹æ¡å¯ä»¥ç»å®å¤ä¸ªåå·¥ï¼ä¸ä¸ªåå·¥å¯ä»¥æå¤ä¸ªç¤¾ä¿æ¡£æ¡ï¼æçææ¥æåææ°ï¼ |
| | | |
| | | ## 表å
³èå
³ç³» |
| | | |
| | | **éè¦è¯´æï¼åå·¥ä¸ç³»ç»ç¨æ·éè¿ææºå·ç»å®ï¼userId æ¯ç³»ç»ç¨æ·IDï¼ä¸æ¯åå·¥IDã** |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â 表å
³èå
³ç³»å¾ â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â â |
| | | â system_users (ç³»ç»ç¨æ·è¡¨) â |
| | | â ââ id (ç¨æ·ID) âââââââââââââââââââ userId åæ®µå
³èæ¤ ID â |
| | | â ââ username (ç¨æ·åï¼çäºææºå·) â |
| | | â ââ mobile (ææºå·) â |
| | | â ââ nickname (æµç§°ï¼çäºåå·¥å§å) â |
| | | â â |
| | | â hrm_employee (å工表) â |
| | | â ââ id (åå·¥ID) â |
| | | â ââ user_id â å
³èç³»ç»ç¨æ·ID (system_users.id) â ç»å®å
³ç³» â |
| | | â ââ phone (ææºå·) â å建åå·¥æ¶åæ¥åå»ºç¨æ·(ç¨æ·å=ææºå·) â |
| | | â ââ deptId (é¨é¨ID) â |
| | | â ââ baseSalary (åºæ¬å·¥èµï¼å
åºæ°æ®) â |
| | | â ââ salaryStructureId â |
| | | â â |
| | | â hrm_employee_salary (åå·¥èªé
¬æ¡£æ¡) â |
| | | â ââ userId â å
³èç³»ç»ç¨æ·ID (system_users.id) â |
| | | â ââ baseSalary (åºæ¬å·¥èµ) â |
| | | â ââ performanceSalary (绩æå·¥èµ) â |
| | | â ââ effectiveDate (çææ¥æ) â |
| | | â â |
| | | â hrm_employee_social_security (å工社ä¿å
¬ç§¯éæ¡£æ¡) â |
| | | â ââ userId â å
³èç³»ç»ç¨æ·ID (system_users.id) â |
| | | â ââ socialSecuritySchemeId â å
³è社ä¿å
¬ç§¯éæ¹æ¡ID â |
| | | â ââ socialSecurityBase (社ä¿ç¼´çº³åºæ°) â |
| | | â ââ housingFundBase (å
¬ç§¯éç¼´çº³åºæ°) â |
| | | â ââ effectiveDate (çææ¥æ) â |
| | | â â |
| | | â hrm_social_security_scheme (社ä¿å
¬ç§¯éæ¹æ¡) â |
| | | â ââ id (æ¹æ¡ID) âââââââââââââââââââ socialSecuritySchemeId å
³èæ¤ ID â |
| | | â ââ name (æ¹æ¡åç§°) â |
| | | â ââ effectiveDate (çææ¥æ) â |
| | | â ââ åé©ç§ç¼´çº³æ¯ä¾ï¼å
»èãå»çã失ä¸ã工伤ãçè²ãå
¬ç§¯éï¼ â |
| | | â ââ ç¶æã夿³¨ â |
| | | â â |
| | | â hrm_salary_calculation (èªé
¬æ ¸ç®è®°å½) â |
| | | â ââ userId â å
³èç³»ç»ç¨æ·ID (system_users.id) â |
| | | â ââ deptId (é¨é¨IDï¼æ¥èªå工表) â |
| | | â ââ å项èªèµåæ£é¤ â |
| | | â â |
| | | â hrm_tax_rate_config (å
¨å±ä¸ªç¨ç¨çé
ç½®) â |
| | | â ââ 7级累è¿ç¨ç表 â |
| | | â â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | **ç»å®é»è¾è¯´æï¼** |
| | | |
| | | 1. å建åå·¥æ¶ï¼ç³»ç»èªå¨å建ä¸ä¸ªç³»ç»ç¨æ·ï¼ç¨æ·å=ææºå·ï¼ |
| | | 2. åå»ºç¨æ·åï¼è¿åç userId åå
¥åå·¥ç `user_id` åæ®µ |
| | | 3. èªé
¬æ¡£æ¡ãç¤¾ä¿æ¡£æ¡ãæ ¸ç®è®°å½ä¸ç `userId` 齿¯ç³»ç»ç¨æ·ID |
| | | 4. æ¥è¯¢åå·¥ä¿¡æ¯æ¶ï¼å¯ä»¥éè¿ `userId` å
³èç³»ç»ç¨æ·è·åç»å½è´¦å·ä¿¡æ¯ |
| | | |
| | | **社ä¿å
¬ç§¯éé
置说æï¼** |
| | | |
| | | - 社ä¿å
¬ç§¯éæ¹æ¡å®ä¹å项缴纳æ¯ä¾ï¼å¯è¢«å¤ä¸ªåå·¥å¤ç¨ |
| | | - å工社ä¿å
¬ç§¯éæ¡£æ¡ç»å®æ¹æ¡ï¼å¹¶è®¾ç½®ä¸ªäººåçç¼´çº³åºæ° |
| | | - èªé
¬æ ¸ç®æ¶ï¼è·ååå·¥ææ°ç¤¾ä¿æ¡£æ¡ â è·åç»å®çæ¹æ¡ â ä½¿ç¨æ¹æ¡çæ¯ä¾è®¡ç®æ£é¤ |
| | | |
| | | ## æ°æ®è·åä¼å
级 |
| | | |
| | | èªé
¬æ ¸ç®æ¶ï¼åæ°æ®çè·åä¼å
çº§ï¼ |
| | | |
| | | | æ°æ®é¡¹ | ä¼å
æ¥æº | å
åºæ¥æº | |
| | | |------|---------|---------| |
| | | | åºæ¬å·¥èµ | `hrm_employee_salary.baseSalary` | `hrm_employee.baseSalary` | |
| | | | 绩æå·¥èµ | `hrm_employee_salary.performanceSalary` | 0 | |
| | | | å项补贴 | `hrm_employee_salary.*Allowance` | 0 | |
| | | | 社ä¿åºæ° | `hrm_employee_social_security.socialSecurityBase` | åºæ¬å·¥èµ | |
| | | | å
¬ç§¯éåºæ° | `hrm_employee_social_security.housingFundBase` | åºæ¬å·¥èµ | |
| | | | ç¤¾ä¿æ¯ä¾ | `hrm_social_security_scheme.*PersonalRatio`ï¼éè¿æ¡£æ¡çæ¹æ¡IDè·åï¼ | é»è®¤æ¯ä¾ | |
| | | | å
¬ç§¯éæ¯ä¾ | `hrm_social_security_scheme.housingFundPersonalRatio`ï¼éè¿æ¡£æ¡çæ¹æ¡IDè·åï¼ | 12% | |
| | | | 个ç¨ç¨ç | `hrm_tax_rate_config` æåºçº³ç¨æå¾é¢å¹é
| - | |
| | | |
| | | **é»è®¤ç¼´çº³æ¯ä¾ï¼** |
| | | |
| | | | é©ç§ | 个人æ¯ä¾ | |
| | | |------|---------| |
| | | | å
»èä¿é© | 8% | |
| | | | å»çä¿é© | 2% | |
| | | | 失ä¸ä¿é© | 0.5% | |
| | | | å
¬ç§¯é | 12% | |
| | | |
| | | **userId 使ç¨åºæ¯ï¼** |
| | | |
| | | | åºæ¯ | ä½¿ç¨æ¹å¼ | |
| | | |------|---------| |
| | | | å建èªé
¬æ¡£æ¡ | userId = employee.getUserId() | |
| | | | åå»ºç¤¾ä¿æ¡£æ¡ | userId = employee.getUserId() | |
| | | | èªé
¬æ ¸ç®è®°å½ | userId = employee.getUserId() | |
| | | | æ¥è¯¢èªé
¬æ¡£æ¡ | selectLatestByUserId(userId) | |
| | | | æ¥è¯¢ç¤¾ä¿æ¡£æ¡ | selectLatestByUserId(userId) | |
| | | |
| | | ## API |
| | | |
| | | ### 社ä¿å
¬ç§¯éæ¹æ¡ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /hrm/salary/social-security-scheme/create | å建社ä¿å
¬ç§¯éæ¹æ¡ | |
| | | | PUT | /hrm/salary/social-security-scheme/update | æ´æ°ç¤¾ä¿å
¬ç§¯éæ¹æ¡ | |
| | | | DELETE | /hrm/salary/social-security-scheme/delete | å é¤ç¤¾ä¿å
¬ç§¯éæ¹æ¡ | |
| | | | GET | /hrm/salary/social-security-scheme/get | è·å社ä¿å
¬ç§¯éæ¹æ¡ | |
| | | | GET | /hrm/salary/social-security-scheme/list | è·å社ä¿å
¬ç§¯éæ¹æ¡å表 | |
| | | |
| | | **社ä¿å
¬ç§¯éæ¹æ¡å段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | æ¹æ¡ID | |
| | | | name | String | æ¹æ¡åç§° | |
| | | | effectiveDate | Date | çææ¥æ | |
| | | | pensionCompanyRatio | BigDecimal | å
»èä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ï¼å¦ 0.16 表示 16%ï¼ | |
| | | | pensionPersonalRatio | BigDecimal | å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾ | |
| | | | medicalCompanyRatio | BigDecimal | å»çä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ | |
| | | | medicalPersonalRatio | BigDecimal | å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾ | |
| | | | unemploymentCompanyRatio | BigDecimal | 失ä¸ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ | |
| | | | unemploymentPersonalRatio | BigDecimal | 失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾ | |
| | | | workInjuryRatio | BigDecimal | 工伤ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ | |
| | | | maternityRatio | BigDecimal | çè²ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ | |
| | | | housingFundCompanyRatio | BigDecimal | å
¬ç§¯éä¼ä¸ç¼´çº³æ¯ä¾ | |
| | | | housingFundPersonalRatio | BigDecimal | å
¬ç§¯é个人缴纳æ¯ä¾ | |
| | | | status | Integer | ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨ | |
| | | | remark | String | 夿³¨ | |
| | | |
| | | ### 个ç¨ç¨çé
ç½® |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /hrm/salary/tax-rate-config/create-list | æ¹éå建个ç¨ç¨çé
ç½® | |
| | | | PUT | /hrm/salary/tax-rate-config/update | æ´æ°ä¸ªç¨ç¨çé
ç½® | |
| | | | DELETE | /hrm/salary/tax-rate-config/delete | å é¤ä¸ªç¨ç¨çé
ç½® | |
| | | | GET | /hrm/salary/tax-rate-config/get | è·å个ç¨ç¨çé
ç½® | |
| | | | GET | /hrm/salary/tax-rate-config/list | è·å个ç¨ç¨çé
ç½®å表 | |
| | | | GET | /hrm/salary/tax-rate-config/get-effective | è·åçæç个ç¨ç¨çé
ç½®å表 | |
| | | |
| | | **个ç¨ç¨çé
ç½®åæ®µï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | é
ç½®ID | |
| | | | name | String | é
ç½®åç§° | |
| | | | effectiveDate | Date | çææ¥æ | |
| | | | level | Integer | ç¨ç级æ°ï¼1-7ï¼ | |
| | | | minAmount | BigDecimal | åºçº³ç¨æå¾é¢ä¸éï¼å«ï¼ | |
| | | | maxAmount | BigDecimal | åºçº³ç¨æå¾é¢ä¸éï¼ä¸å«ï¼ï¼0表示æ ä¸é | |
| | | | taxRate | BigDecimal | ç¨çï¼å¦ 0.03 表示 3%ï¼ | |
| | | | quickDeduction | BigDecimal | éç®æ£é¤æ° | |
| | | |
| | | ### å工社ä¿å
¬ç§¯éæ¡£æ¡ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /hrm/salary/employee-social-security/create | å建å工社ä¿å
¬ç§¯éæ¡£æ¡ | |
| | | | PUT | /hrm/salary/employee-social-security/update | æ´æ°å工社ä¿å
¬ç§¯éæ¡£æ¡ | |
| | | | DELETE | /hrm/salary/employee-social-security/delete | å é¤å工社ä¿å
¬ç§¯éæ¡£æ¡ | |
| | | | GET | /hrm/salary/employee-social-security/get | è·åå工社ä¿å
¬ç§¯éæ¡£æ¡ | |
| | | | GET | /hrm/salary/employee-social-security/page | è·åå工社ä¿å
¬ç§¯éæ¡£æ¡å页 | |
| | | | GET | /hrm/salary/employee-social-security/list-by-user | è·åå工社ä¿å
¬ç§¯éæ¡£æ¡åå²å表 | |
| | | | GET | /hrm/salary/employee-social-security/get-latest | è·ååå·¥ææ°çæç社ä¿å
¬ç§¯éæ¡£æ¡ | |
| | | |
| | | **å工社ä¿å
¬ç§¯éæ¡£æ¡å段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | id | Long | æ¡£æ¡ID | |
| | | | userId | Long | ç³»ç»ç¨æ·IDï¼å
³èåå·¥è¡¨ï¼ | |
| | | | userName | String | åå·¥å§åï¼ååºåæ®µï¼ | |
| | | | deptName | String | é¨é¨åç§°ï¼ååºåæ®µï¼ | |
| | | | socialSecuritySchemeId | Long | 社ä¿å
¬ç§¯éæ¹æ¡ID | |
| | | | schemeName | String | æ¹æ¡åç§°ï¼ååºåæ®µï¼ | |
| | | | socialSecurityBase | BigDecimal | 社ä¿ç¼´çº³åºæ°ï¼å工个æ§åè®¾ç½®ï¼ | |
| | | | housingFundBase | BigDecimal | å
¬ç§¯éç¼´çº³åºæ°ï¼å工个æ§åè®¾ç½®ï¼ | |
| | | | effectiveDate | Date | çææ¥æ | |
| | | | status | Integer | ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨ | |
| | | | remark | String | 夿³¨ | |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. 个ç¨ç¨çé
ç½®é¡µé¢ |
| | | |
| | | ```html |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- è¡¨æ ¼å±ç¤º7级累è¿ç¨ç --> |
| | | <el-table :data="list"> |
| | | <el-table-column label="级æ°" prop="level" width="80" /> |
| | | <el-table-column label="åºçº³ç¨æå¾é¢"> |
| | | <template #default="{ row }"> |
| | | {{ row.minAmount }} ~ {{ row.maxAmount === 0 ? 'â' : row.maxAmount }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¨ç" width="100"> |
| | | <template #default="{ row }"> |
| | | {{ (row.taxRate * 100).toFixed(0) }}% |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="éç®æ£é¤æ°" prop="quickDeduction" /> |
| | | <el-table-column label="æä½" width="100"> |
| | | <template #default="{ row }"> |
| | | <el-button link type="primary" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </template> |
| | | ``` |
| | | |
| | | ### 2. 社ä¿å
¬ç§¯éæ¹æ¡é¡µé¢ |
| | | |
| | | ```html |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- å·¥å
·æ --> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" @click="handleAdd">æ°å¢æ¹æ¡</el-button> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- è¡¨æ ¼ --> |
| | | <el-table :data="list"> |
| | | <el-table-column label="æ¹æ¡åç§°" prop="name" /> |
| | | <el-table-column label="çææ¥æ" prop="effectiveDate" /> |
| | | <el-table-column label="å
»è(ä¼ä¸)" width="100"> |
| | | <template #default="{ row }"> |
| | | {{ (row.pensionCompanyRatio * 100).toFixed(1) }}% |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å
»è(个人)" width="100"> |
| | | <template #default="{ row }"> |
| | | {{ (row.pensionPersonalRatio * 100).toFixed(1) }}% |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å»ç(个人)" width="100"> |
| | | <template #default="{ row }"> |
| | | {{ (row.medicalPersonalRatio * 100).toFixed(1) }}% |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å
¬ç§¯é(个人)" width="100"> |
| | | <template #default="{ row }"> |
| | | {{ (row.housingFundPersonalRatio * 100).toFixed(1) }}% |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç¶æ" prop="status"> |
| | | <template #default="{ row }"> |
| | | <el-tag :type="row.status === 0 ? 'success' : 'info'"> |
| | | {{ row.status === 0 ? 'å¯ç¨' : 'ç¦ç¨' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="150"> |
| | | <template #default="{ row }"> |
| | | <el-button link type="primary" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | <el-button link type="danger" @click="handleDelete(row)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- æ°å¢/ç¼è¾å¼¹çª --> |
| | | <el-dialog :title="title" v-model="open" width="700px"> |
| | | <el-form ref="formRef" :model="form" :rules="rules" label-width="120px"> |
| | | <el-form-item label="æ¹æ¡åç§°" prop="name"> |
| | | <el-input v-model="form.name" placeholder="å¦ï¼2024å¹´åé叿 å" /> |
| | | </el-form-item> |
| | | <el-form-item label="çææ¥æ" prop="effectiveDate"> |
| | | <el-date-picker v-model="form.effectiveDate" type="date" placeholder="éæ©çææ¥æ" /> |
| | | </el-form-item> |
| | | |
| | | <el-divider content-position="left">å
»èä¿é©</el-divider> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ä¼ä¸æ¯ä¾" prop="pensionCompanyRatio"> |
| | | <el-input-number v-model="form.pensionCompanyRatio" :min="0" :max="1" :step="0.01" :precision="4" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="个人æ¯ä¾" prop="pensionPersonalRatio"> |
| | | <el-input-number v-model="form.pensionPersonalRatio" :min="0" :max="1" :step="0.01" :precision="4" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-divider content-position="left">å»çä¿é©</el-divider> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ä¼ä¸æ¯ä¾" prop="medicalCompanyRatio"> |
| | | <el-input-number v-model="form.medicalCompanyRatio" :min="0" :max="1" :step="0.01" :precision="4" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="个人æ¯ä¾" prop="medicalPersonalRatio"> |
| | | <el-input-number v-model="form.medicalPersonalRatio" :min="0" :max="1" :step="0.01" :precision="4" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-divider content-position="left">失ä¸/工伤/çè²ä¿é©</el-divider> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="失ä¸ä¼ä¸" prop="unemploymentCompanyRatio"> |
| | | <el-input-number v-model="form.unemploymentCompanyRatio" :min="0" :max="1" :step="0.001" :precision="4" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="失ä¸ä¸ªäºº" prop="unemploymentPersonalRatio"> |
| | | <el-input-number v-model="form.unemploymentPersonalRatio" :min="0" :max="1" :step="0.001" :precision="4" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="工伤æ¯ä¾" prop="workInjuryRatio"> |
| | | <el-input-number v-model="form.workInjuryRatio" :min="0" :max="1" :step="0.001" :precision="4" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="çè²æ¯ä¾" prop="maternityRatio"> |
| | | <el-input-number v-model="form.maternityRatio" :min="0" :max="1" :step="0.001" :precision="4" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-divider content-position="left">å
¬ç§¯é</el-divider> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ä¼ä¸æ¯ä¾" prop="housingFundCompanyRatio"> |
| | | <el-input-number v-model="form.housingFundCompanyRatio" :min="0" :max="1" :step="0.01" :precision="4" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="个人æ¯ä¾" prop="housingFundPersonalRatio"> |
| | | <el-input-number v-model="form.housingFundPersonalRatio" :min="0" :max="1" :step="0.01" :precision="4" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <el-button @click="open = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitForm">ç¡®å®</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | form: { |
| | | id: null, |
| | | name: '', |
| | | effectiveDate: null, |
| | | pensionCompanyRatio: 0.16, |
| | | pensionPersonalRatio: 0.08, |
| | | medicalCompanyRatio: 0.095, |
| | | medicalPersonalRatio: 0.02, |
| | | unemploymentCompanyRatio: 0.005, |
| | | unemploymentPersonalRatio: 0.005, |
| | | workInjuryRatio: 0.005, |
| | | maternityRatio: 0.005, |
| | | housingFundCompanyRatio: 0.12, |
| | | housingFundPersonalRatio: 0.12, |
| | | status: 0, |
| | | remark: '', |
| | | }, |
| | | rules: { |
| | | name: [{ required: true, message: '请è¾å
¥æ¹æ¡åç§°', trigger: 'blur' }], |
| | | effectiveDate: [{ required: true, message: 'è¯·éæ©çææ¥æ', trigger: 'change' }], |
| | | }, |
| | | list: [], |
| | | open: false, |
| | | title: '', |
| | | } |
| | | }, |
| | | methods: { |
| | | getList() { |
| | | request.get('/hrm/salary/social-security-scheme/list', { params: { status: 0 } }) |
| | | .then(res => { this.list = res.data }) |
| | | }, |
| | | handleAdd() { |
| | | this.resetForm() |
| | | this.title = 'æ°å¢ç¤¾ä¿å
¬ç§¯éæ¹æ¡' |
| | | this.open = true |
| | | }, |
| | | handleEdit(row) { |
| | | this.resetForm() |
| | | this.title = 'ç¼è¾ç¤¾ä¿å
¬ç§¯éæ¹æ¡' |
| | | this.form = { ...row } |
| | | this.open = true |
| | | }, |
| | | submitForm() { |
| | | this.$refs.formRef.validate(valid => { |
| | | if (valid) { |
| | | const url = this.form.id |
| | | ? '/hrm/salary/social-security-scheme/update' |
| | | : '/hrm/salary/social-security-scheme/create' |
| | | request.post(url, this.form) |
| | | .then(() => { |
| | | this.$message.success('æä½æå') |
| | | this.open = false |
| | | this.getList() |
| | | }) |
| | | } |
| | | }) |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | ``` |
| | | |
| | | ### 3. å工社ä¿å
¬ç§¯éæ¡£æ¡é¡µé¢ |
| | | |
| | | ```html |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- æç´¢æ --> |
| | | <el-form :model="queryParams" ref="queryFormRef" :inline="true"> |
| | | <el-form-item label="åå·¥å§å" prop="userName"> |
| | | <el-input v-model="queryParams.userName" placeholder="请è¾å
¥åå·¥å§å" /> |
| | | </el-form-item> |
| | | <el-form-item label="é¨é¨" prop="deptId"> |
| | | <el-select v-model="queryParams.deptId" placeholder="è¯·éæ©é¨é¨" clearable> |
| | | <el-option v-for="dept in deptList" :key="dept.id" :label="dept.name" :value="dept.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery">æç´¢</el-button> |
| | | <el-button @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- å·¥å
·æ --> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" @click="handleAdd">æ°å¢</el-button> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- è¡¨æ ¼ --> |
| | | <el-table :data="list"> |
| | | <el-table-column label="åå·¥å§å" prop="userName" /> |
| | | <el-table-column label="é¨é¨" prop="deptName" /> |
| | | <el-table-column label="ç¤¾ä¿æ¹æ¡" prop="schemeName" /> |
| | | <el-table-column label="社ä¿åºæ°" prop="socialSecurityBase" /> |
| | | <el-table-column label="å
¬ç§¯éåºæ°" prop="housingFundBase" /> |
| | | <el-table-column label="çææ¥æ" prop="effectiveDate" /> |
| | | <el-table-column label="ç¶æ" prop="status"> |
| | | <template #default="{ row }"> |
| | | <el-tag :type="row.status === 0 ? 'success' : 'info'"> |
| | | {{ row.status === 0 ? 'å¯ç¨' : 'ç¦ç¨' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="200"> |
| | | <template #default="{ row }"> |
| | | <el-button link type="primary" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | <el-button link type="primary" @click="handleHistory(row)">åå²</el-button> |
| | | <el-button link type="danger" @click="handleDelete(row)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- æ°å¢/ç¼è¾å¼¹çª --> |
| | | <el-dialog :title="title" v-model="open" width="500px"> |
| | | <el-form ref="formRef" :model="form" :rules="rules" label-width="120px"> |
| | | <el-form-item label="åå·¥" prop="userId"> |
| | | <el-select v-model="form.userId" placeholder="è¯·éæ©åå·¥" filterable> |
| | | <el-option v-for="user in userList" :key="user.id" :label="user.name" :value="user.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ç¤¾ä¿æ¹æ¡" prop="socialSecuritySchemeId"> |
| | | <el-select v-model="form.socialSecuritySchemeId" placeholder="è¯·éæ©ç¤¾ä¿æ¹æ¡"> |
| | | <el-option v-for="scheme in schemeList" :key="scheme.id" :label="scheme.name" :value="scheme.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-divider content-position="left">ç¼´çº³åºæ°ï¼å工个æ§å设置ï¼</el-divider> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="社ä¿åºæ°" prop="socialSecurityBase"> |
| | | <el-input-number v-model="form.socialSecurityBase" :min="0" :precision="2" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å
¬ç§¯éåºæ°" prop="housingFundBase"> |
| | | <el-input-number v-model="form.housingFundBase" :min="0" :precision="2" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-form-item label="çææ¥æ" prop="effectiveDate"> |
| | | <el-date-picker v-model="form.effectiveDate" type="date" placeholder="éæ©çææ¥æ" /> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" placeholder="请è¾å
¥å¤æ³¨" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <el-button @click="open = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitForm">ç¡®å®</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <!-- åå²è®°å½å¼¹çª --> |
| | | <el-dialog title="社ä¿å
¬ç§¯éåå²è®°å½" v-model="historyOpen" width="600px"> |
| | | <el-table :data="historyList"> |
| | | <el-table-column label="ç¤¾ä¿æ¹æ¡" prop="schemeName" /> |
| | | <el-table-column label="社ä¿åºæ°" prop="socialSecurityBase" /> |
| | | <el-table-column label="å
¬ç§¯éåºæ°" prop="housingFundBase" /> |
| | | <el-table-column label="çææ¥æ" prop="effectiveDate" /> |
| | | <el-table-column label="ç¶æ"> |
| | | <template #default="{ row }"> |
| | | <el-tag :type="row.status === 0 ? 'success' : 'info'"> |
| | | {{ row.status === 0 ? 'å¯ç¨' : 'ç¦ç¨' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | data() { |
| | | return { |
| | | queryParams: { |
| | | userName: '', |
| | | deptId: null, |
| | | }, |
| | | form: { |
| | | id: null, |
| | | userId: null, |
| | | socialSecuritySchemeId: null, |
| | | socialSecurityBase: 0, |
| | | housingFundBase: 0, |
| | | effectiveDate: null, |
| | | remark: '', |
| | | }, |
| | | rules: { |
| | | userId: [{ required: true, message: 'è¯·éæ©åå·¥', trigger: 'change' }], |
| | | socialSecuritySchemeId: [{ required: true, message: 'è¯·éæ©ç¤¾ä¿æ¹æ¡', trigger: 'change' }], |
| | | socialSecurityBase: [{ required: true, message: '请è¾å
¥ç¤¾ä¿åºæ°', trigger: 'blur' }], |
| | | housingFundBase: [{ required: true, message: '请è¾å
¥å
¬ç§¯éåºæ°', trigger: 'blur' }], |
| | | effectiveDate: [{ required: true, message: 'è¯·éæ©çææ¥æ', trigger: 'change' }], |
| | | }, |
| | | list: [], |
| | | userList: [], |
| | | schemeList: [], |
| | | deptList: [], |
| | | historyList: [], |
| | | open: false, |
| | | historyOpen: false, |
| | | title: '', |
| | | } |
| | | }, |
| | | created() { |
| | | this.getList() |
| | | this.getSchemeList() |
| | | }, |
| | | methods: { |
| | | getSchemeList() { |
| | | request.get('/hrm/salary/social-security-scheme/list', { params: { status: 0 } }) |
| | | .then(res => { this.schemeList = res.data }) |
| | | }, |
| | | getList() { |
| | | request.get('/hrm/salary/employee-social-security/page', { params: this.queryParams }) |
| | | .then(res => { |
| | | this.list = res.data.list |
| | | this.total = res.data.total |
| | | }) |
| | | }, |
| | | handleAdd() { |
| | | this.resetForm() |
| | | this.title = 'æ°å¢å工社ä¿å
¬ç§¯éæ¡£æ¡' |
| | | this.open = true |
| | | }, |
| | | handleEdit(row) { |
| | | this.resetForm() |
| | | this.title = 'ç¼è¾å工社ä¿å
¬ç§¯éæ¡£æ¡' |
| | | this.form = { ...row } |
| | | this.open = true |
| | | }, |
| | | handleHistory(row) { |
| | | request.get('/hrm/salary/employee-social-security/list-by-user', { params: { userId: row.userId } }) |
| | | .then(res => { |
| | | this.historyList = res.data |
| | | this.historyOpen = true |
| | | }) |
| | | }, |
| | | submitForm() { |
| | | this.$refs.formRef.validate(valid => { |
| | | if (valid) { |
| | | const url = this.form.id |
| | | ? '/hrm/salary/employee-social-security/update' |
| | | : '/hrm/salary/employee-social-security/create' |
| | | request.post(url, this.form) |
| | | .then(() => { |
| | | this.$message.success('æä½æå') |
| | | this.open = false |
| | | this.getList() |
| | | }) |
| | | } |
| | | }) |
| | | }, |
| | | handleDelete(row) { |
| | | this.$confirm('确认å é¤è¯¥æ¡£æ¡?', 'æç¤º').then(() => { |
| | | request.delete('/hrm/salary/employee-social-security/delete', { params: { id: row.id } }) |
| | | .then(() => { |
| | | this.$message.success('å 餿å') |
| | | this.getList() |
| | | }) |
| | | }) |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | ``` |
| | | |
| | | ## æ£é¤è®¡ç®é»è¾è¯´æ |
| | | |
| | | ### ç¤¾ä¿æ£é¤ï¼ä¸ªäººé¨åï¼ |
| | | |
| | | æ¯ä¸ªå工使ç¨å
¶ç»å®æ¹æ¡ä¸ç缴纳æ¯ä¾è®¡ç®ï¼ |
| | | |
| | | ``` |
| | | ç¤¾ä¿æ£é¤ = 社ä¿åºæ° à (å
»èä¿é©ä¸ªäººæ¯ä¾ + å»çä¿é©ä¸ªäººæ¯ä¾ + 失ä¸ä¿é©ä¸ªäººæ¯ä¾) |
| | | ``` |
| | | |
| | | - åºæ°åå¼ï¼åå·¥ç¤¾ä¿æ¡£æ¡ç `socialSecurityBase` |
| | | - æ¯ä¾åå¼ï¼éè¿ `socialSecuritySchemeId` è·åæ¹æ¡çæ¯ä¾ |
| | | - è¥æ¹æ¡ä¸æ¯ä¾ä¸ºç©ºï¼ä½¿ç¨é»è®¤å¼ï¼å
»è8%ãå»ç2%ã失ä¸0.5% |
| | | |
| | | ### å
¬ç§¯éæ£é¤ï¼ä¸ªäººé¨åï¼ |
| | | |
| | | æ¯ä¸ªå工使ç¨å
¶ç»å®æ¹æ¡ä¸ç缴纳æ¯ä¾è®¡ç®ï¼ |
| | | |
| | | ``` |
| | | å
¬ç§¯éæ£é¤ = å
¬ç§¯éåºæ° à å
¬ç§¯é个人æ¯ä¾ |
| | | ``` |
| | | |
| | | - åºæ°åå¼ï¼åå·¥ç¤¾ä¿æ¡£æ¡ç `housingFundBase` |
| | | - æ¯ä¾åå¼ï¼éè¿ `socialSecuritySchemeId` è·åæ¹æ¡çæ¯ä¾ |
| | | - è¥æ¹æ¡ä¸æ¯ä¾ä¸ºç©ºï¼ä½¿ç¨é»è®¤å¼ï¼12% |
| | | |
| | | ### ä¸ªç¨æ£é¤ |
| | | |
| | | ``` |
| | | åºçº³ç¨æå¾é¢ = åºåå·¥èµ - ç¤¾ä¿æ£é¤ - å
¬ç§¯éæ£é¤ - 5000ï¼èµ·å¾ç¹ï¼ |
| | | ä¸ªç¨ = åºçº³ç¨æå¾é¢ à ç¨ç - éç®æ£é¤æ° |
| | | ``` |
| | | |
| | | - è¥åºçº³ç¨æå¾é¢ ⤠0ï¼å个ç¨ä¸º 0 |
| | | - æ ¹æ®7级累è¿ç¨çè¡¨æ¥æ¾å¯¹åºæ¡£ä½ |
| | | |
| | | ## 示ä¾è®¡ç® |
| | | |
| | | å设åå·¥ï¼ |
| | | - åºæ¬å·¥èµï¼10000 å
|
| | | - 绩æå·¥èµï¼2000 å
|
| | | - 社ä¿åºæ°ï¼10000 å
|
| | | - å
¬ç§¯éåºæ°ï¼10000 å
|
| | | |
| | | æ 2024 å¹´æ å计ç®ï¼ |
| | | |
| | | 1. **åºåå·¥èµ** = 10000 + 2000 = 12000 å
|
| | | |
| | | 2. **ç¤¾ä¿æ£é¤** = 10000 à (8% + 2% + 0.5%) = 1050 å
|
| | | |
| | | 3. **å
¬ç§¯éæ£é¤** = 10000 à 12% = 1200 å
|
| | | |
| | | 4. **åºçº³ç¨æå¾é¢** = 12000 - 1050 - 1200 - 5000 = 4750 å
|
| | | |
| | | 5. **个ç¨** = 4750 à 3% - 0 = 142.5 å
|
| | | |
| | | 6. **å®åå·¥èµ** = 12000 - 1050 - 1200 - 142.5 = 9607.5 å
|
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - 社ä¿å
¬ç§¯éé
ç½®éè¦æ ¹æ®å½å°æ¿ç设置æ¯ä¾ååºæ°ä¸ä¸é |
| | | - 个ç¨èµ·å¾ç¹ç®ååºå®ä¸º 5000 å
/æ |
| | | - å工社ä¿å
¬ç§¯éæ¡£æ¡å¯å¨å工管çä¸ç»´æ¤ï¼æ¯ææçææ¥æç®¡çåå²è®°å½ |
| | | - èªé
¬æ ¸ç®æ¶ä¼èªå¨è®¡ç®å项æ£é¤ï¼æ éæå¨å¹²é¢ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ä»å¨ç©æµæ¨¡ååç«¯ææ¡£ |
| | | |
| | | ## ä¸ãåè½æ¦è¿° |
| | | |
| | | å°MES模åçä»åºç®¡çæå为ç¬ç«çä¸çº§èå"ä»å¨ç©æµ"ï¼å¹¶å®ç°ï¼ |
| | | - ERPéè´å
¥åºå®¡æ ¸ â MESåºå忥å¢å |
| | | - ERPéå®åºåºå®¡æ ¸ â MESåºå忥åå° |
| | | - ä»åºçº§å«å®¡æ¹æµç¨é
ç½®ï¼æ¯ä¸ªä»åºå¯ç¬ç«å¯ç¨/ç¦ç¨å®¡æ¹ï¼ |
| | | |
| | | --- |
| | | |
| | | ## äºãSQLèæ¬æ§è¡é¡ºåº |
| | | |
| | | ```bash |
| | | # 1. èåè°æ´ï¼å°ä»åºç®¡çæå为ä¸çº§èåï¼ |
| | | sql/mysql/wls_menu_init.sql |
| | | |
| | | # 2. æ°æ®åºåå§åï¼å®¡æ¹é
置表 + åæ®BPMåæ®µï¼ |
| | | sql/mysql/wls_database_init.sql |
| | | |
| | | # 3. ERPä»åºä¸MESä»åºæ å°è¡¨ |
| | | sql/mysql/erp_mes_warehouse_mapping.sql |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãèåç»æ |
| | | |
| | | ### 3.1 æ°èåç»æ |
| | | |
| | | ``` |
| | | ä»å¨ç©æµï¼ä¸çº§èåï¼id=5780ï¼ |
| | | âââ ä»åºè®¾ç½® |
| | | âââ åºåç°æé |
| | | âââ éè´å
¥åº |
| | | âââ å°è´§éç¥ |
| | | âââ éè´éè´§ |
| | | âââ çäº§é¢æ |
| | | âââ çäº§éæ |
| | | âââ 产åå
¥åº |
| | | âââ åè´§éç¥ |
| | | âââ éå®åºåº |
| | | âââ éå®éè´§ |
| | | âââ è½¬ç§»è°æ¨ |
| | | âââ åºåçç¹ |
| | | âââ è£
箱管ç |
| | | âââ æ¡ç é
ç½® |
| | | âââ èµè½ç®¡ç |
| | | âââ SNç |
| | | âââ å¤ååæ |
| | | âââ å¤åå
¥åº |
| | | âââ æé¡¹å
¥åº |
| | | âââ æé¡¹åºåº |
| | | âââ 审æ¹é
ç½®ï¼æ°å¢ï¼ |
| | | âââ ä»åºæ å°ï¼æ°å¢ï¼å¨ERPèåä¸ï¼ |
| | | ``` |
| | | |
| | | ### 3.2 å端路ç±é
ç½® |
| | | |
| | | **æ¹æ¡ä¸ï¼è·¯å¾å«åï¼æ¨èï¼** |
| | | |
| | | ```js |
| | | // vite.config.js |
| | | export default defineConfig({ |
| | | resolve: { |
| | | alias: { |
| | | '@/views/wls': path.resolve(__dirname, 'src/views/mes/wm') |
| | | } |
| | | } |
| | | }) |
| | | ``` |
| | | |
| | | **æ¹æ¡äºï¼å¤å¶ç»ä»¶** |
| | | |
| | | å° `src/views/mes/wm` ç®å½å¤å¶ä¸º `src/views/wls` |
| | | |
| | | --- |
| | | |
| | | ## åãæ°å¢é¡µé¢ |
| | | |
| | | ### 4.1 审æ¹é
ç½®é¡µé¢ |
| | | |
| | | **è·¯å¾**ï¼`views/wls/approval/config/index.vue` |
| | | |
| | | **åè½**ï¼ |
| | | 1. ä»åºå表å±ç¤º |
| | | 2. æ¯ä¸ªä»åºå¯é
ç½®å
¥åº/åºåº/è°æ¨/çç¹æ¯å¦å¯ç¨å®¡æ¹ |
| | | 3. éæ©å®¡æ¹æµç¨ï¼ä»BPMæµç¨åè¡¨ï¼ |
| | | |
| | | ```vue |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- æç´¢æ --> |
| | | <el-form :inline="true"> |
| | | <el-form-item label="ä»åº"> |
| | | <el-select v-model="queryParams.warehouseId" placeholder="è¯·éæ©ä»åº" clearable> |
| | | <el-option v-for="warehouse in warehouseList" :key="warehouse.id" |
| | | :label="warehouse.warehouseName" :value="warehouse.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery">æç´¢</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- é
ç½®è¡¨æ ¼ --> |
| | | <el-table :data="configList" v-loading="loading"> |
| | | <el-table-column prop="warehouseName" label="ä»åºåç§°" width="150" /> |
| | | <el-table-column label="å
¥åºå®¡æ¹" width="120"> |
| | | <template #default="{ row }"> |
| | | <el-switch v-model="row.inboundEnabled" |
| | | @change="handleApprovalChange(row, 'INBOUND', $event)" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºåºå®¡æ¹" width="120"> |
| | | <template #default="{ row }"> |
| | | <el-switch v-model="row.outboundEnabled" |
| | | @change="handleApprovalChange(row, 'OUTBOUND', $event)" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="è°æ¨å®¡æ¹" width="120"> |
| | | <template #default="{ row }"> |
| | | <el-switch v-model="row.transferEnabled" |
| | | @change="handleApprovalChange(row, 'TRANSFER', $event)" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="çç¹å®¡æ¹" width="120"> |
| | | <template #default="{ row }"> |
| | | <el-switch v-model="row.checkEnabled" |
| | | @change="handleApprovalChange(row, 'CHECK', $event)" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="100"> |
| | | <template #default="{ row }"> |
| | | <el-button link type="primary" @click="handleConfigProcess(row)">é
ç½®æµç¨</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- æµç¨é
ç½®å¼¹çª --> |
| | | <el-dialog v-model="processDialogVisible" title="é
ç½®å®¡æ¹æµç¨" width="500px"> |
| | | <el-form label-width="100px"> |
| | | <el-form-item label="ä¸å¡ç±»å"> |
| | | <el-select v-model="currentConfig.bizType"> |
| | | <el-option label="å
¥åº" value="INBOUND" /> |
| | | <el-option label="åºåº" value="OUTBOUND" /> |
| | | <el-option label="è°æ¨" value="TRANSFER" /> |
| | | <el-option label="çç¹" value="CHECK" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å®¡æ¹æµç¨"> |
| | | <el-select v-model="currentConfig.processDefinitionKey" placeholder="è¯·éæ©æµç¨"> |
| | | <el-option v-for="process in processList" :key="process.key" |
| | | :label="process.name" :value="process.key" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <el-button @click="processDialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="handleSaveProcessConfig">ä¿å</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted } from 'vue' |
| | | import * as ApprovalApi from '@/api/wms/approval' |
| | | |
| | | const warehouseList = ref([]) |
| | | const configList = ref([]) |
| | | const processList = ref([]) |
| | | const loading = ref(false) |
| | | const queryParams = ref({ warehouseId: null }) |
| | | |
| | | const processDialogVisible = ref(false) |
| | | const currentConfig = ref({ warehouseId: null, bizType: null, processDefinitionKey: null }) |
| | | |
| | | // å è½½ä»åºå表ï¼ä»ä»åºè®¾ç½®æ¨¡åè·åï¼ |
| | | const loadWarehouseList = async () => { |
| | | // è°ç¨ä»åºè®¾ç½®æ¥å£è·åå表 |
| | | } |
| | | |
| | | // å 载审æ¹é
ç½® |
| | | const loadConfigList = async (warehouseId) => { |
| | | if (!warehouseId) return |
| | | loading.value = true |
| | | try { |
| | | configList.value = await ApprovalApi.getApprovalConfigList(warehouseId) |
| | | } finally { |
| | | loading.value = false |
| | | } |
| | | } |
| | | |
| | | // 忢审æ¹å¼å
³ |
| | | const handleApprovalChange = async (row, bizType, enabled) => { |
| | | await ApprovalApi.saveApprovalConfig({ |
| | | warehouseId: row.warehouseId, |
| | | bizType: bizType, |
| | | approvalEnabled: enabled |
| | | }) |
| | | } |
| | | |
| | | // é
ç½®æµç¨ |
| | | const handleConfigProcess = async (row) => { |
| | | currentConfig.value = { warehouseId: row.warehouseId, bizType: null, processDefinitionKey: null } |
| | | // å è½½å¯ç¨æµç¨å表 |
| | | processList.value = await ApprovalApi.getAvailableProcessList(row.warehouseId, 'INBOUND') |
| | | processDialogVisible.value = true |
| | | } |
| | | |
| | | // ä¿åæµç¨é
ç½® |
| | | const handleSaveProcessConfig = async () => { |
| | | await ApprovalApi.saveApprovalConfig(currentConfig.value) |
| | | processDialogVisible.value = false |
| | | loadConfigList(queryParams.value.warehouseId) |
| | | } |
| | | |
| | | onMounted(() => { |
| | | loadWarehouseList() |
| | | }) |
| | | </script> |
| | | ``` |
| | | |
| | | ### 4.2 ä»åºæ å°é
ç½®é¡µé¢ |
| | | |
| | | **è·¯å¾**ï¼`views/erp/warehouse/mapping/index.vue`ï¼æ¾å¨ERPä»åºç®¡çä¸ï¼ |
| | | |
| | | **åè½**ï¼ |
| | | 1. é
ç½®ERPä»åºä¸MESä»åºçæ å°å
³ç³» |
| | | 2. æ¯ææ°å¢ãä¿®æ¹ãå 餿 å° |
| | | |
| | | ```vue |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- æç´¢æ --> |
| | | <el-form :inline="true"> |
| | | <el-form-item label="ERPä»åº"> |
| | | <el-select v-model="queryParams.erpWarehouseId" placeholder="è¯·éæ©ERPä»åº" clearable> |
| | | <el-option v-for="warehouse in erpWarehouseList" :key="warehouse.id" |
| | | :label="warehouse.name" :value="warehouse.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="MESä»åº"> |
| | | <el-select v-model="queryParams.mesWarehouseId" placeholder="è¯·éæ©MESä»åº" clearable> |
| | | <el-option v-for="warehouse in mesWarehouseList" :key="warehouse.id" |
| | | :label="warehouse.warehouseName" :value="warehouse.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleQuery">æç´¢</el-button> |
| | | <el-button type="primary" @click="handleAdd">æ°å¢</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- æ å°è¡¨æ ¼ --> |
| | | <el-table :data="mappingList" v-loading="loading"> |
| | | <el-table-column prop="erpWarehouseName" label="ERPä»åº" /> |
| | | <el-table-column prop="mesWarehouseName" label="MESä»åº" /> |
| | | <el-table-column prop="status" label="ç¶æ"> |
| | | <template #default="{ row }"> |
| | | <el-tag :type="row.status === 1 ? 'success' : 'danger'"> |
| | | {{ row.status === 1 ? 'å¯ç¨' : 'ç¦ç¨' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="150"> |
| | | <template #default="{ row }"> |
| | | <el-button link type="primary" @click="handleEdit(row)">ç¼è¾</el-button> |
| | | <el-button link type="danger" @click="handleDelete(row.id)">å é¤</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页 --> |
| | | <el-pagination v-model:current-page="queryParams.pageNo" v-model:page-size="queryParams.pageSize" |
| | | :total="total" @change="handleQuery" /> |
| | | |
| | | <!-- æ°å¢/ç¼è¾å¼¹çª --> |
| | | <el-dialog v-model="dialogVisible" :title="dialogTitle" width="500px"> |
| | | <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px"> |
| | | <el-form-item label="ERPä»åº" prop="erpWarehouseId"> |
| | | <el-select v-model="formData.erpWarehouseId" placeholder="è¯·éæ©ERPä»åº"> |
| | | <el-option v-for="warehouse in erpWarehouseList" :key="warehouse.id" |
| | | :label="warehouse.name" :value="warehouse.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="MESä»åº" prop="mesWarehouseId"> |
| | | <el-select v-model="formData.mesWarehouseId" placeholder="è¯·éæ©MESä»åº"> |
| | | <el-option v-for="warehouse in mesWarehouseList" :key="warehouse.id" |
| | | :label="warehouse.warehouseName" :value="warehouse.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ"> |
| | | <el-radio-group v-model="formData.status"> |
| | | <el-radio :value="1">å¯ç¨</el-radio> |
| | | <el-radio :value="0">ç¦ç¨</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <el-button @click="dialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="handleSubmit">ç¡®å®</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted } from 'vue' |
| | | import * as MappingApi from '@/api/erp/warehouseMapping' |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | |
| | | const loading = ref(false) |
| | | const total = ref(0) |
| | | const mappingList = ref([]) |
| | | const queryParams = reactive({ |
| | | pageNo: 1, |
| | | pageSize: 10, |
| | | erpWarehouseId: null, |
| | | mesWarehouseId: null |
| | | }) |
| | | |
| | | const dialogVisible = ref(false) |
| | | const dialogTitle = ref('') |
| | | const formRef = ref() |
| | | const formData = reactive({ |
| | | id: null, |
| | | erpWarehouseId: null, |
| | | mesWarehouseId: null, |
| | | status: 1 |
| | | }) |
| | | const formRules = { |
| | | erpWarehouseId: [{ required: true, message: 'è¯·éæ©ERPä»åº', trigger: 'change' }], |
| | | mesWarehouseId: [{ required: true, message: 'è¯·éæ©MESä»åº', trigger: 'change' }] |
| | | } |
| | | |
| | | // ERPä»åºå表ï¼ä»ERPä»åºæ¥å£è·åï¼ |
| | | const erpWarehouseList = ref([]) |
| | | // MESä»åºå表ï¼ä»MESä»åºæ¥å£è·åï¼ |
| | | const mesWarehouseList = ref([]) |
| | | |
| | | // å è½½æ å°å表 |
| | | const loadMappingList = async () => { |
| | | loading.value = true |
| | | try { |
| | | const res = await MappingApi.getMappingPage(queryParams) |
| | | mappingList.value = res.list |
| | | total.value = res.total |
| | | } finally { |
| | | loading.value = false |
| | | } |
| | | } |
| | | |
| | | // æ°å¢ |
| | | const handleAdd = () => { |
| | | dialogTitle.value = 'æ°å¢ä»åºæ å°' |
| | | Object.assign(formData, { id: null, erpWarehouseId: null, mesWarehouseId: null, status: 1 }) |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | // ç¼è¾ |
| | | const handleEdit = (row) => { |
| | | dialogTitle.value = 'ç¼è¾ä»åºæ å°' |
| | | Object.assign(formData, row) |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | // æäº¤ |
| | | const handleSubmit = async () => { |
| | | await formRef.value.validate() |
| | | if (formData.id) { |
| | | await MappingApi.updateMapping(formData) |
| | | ElMessage.success('æ´æ°æå') |
| | | } else { |
| | | await MappingApi.createMapping(formData) |
| | | ElMessage.success('å建æå') |
| | | } |
| | | dialogVisible.value = false |
| | | loadMappingList() |
| | | } |
| | | |
| | | // å é¤ |
| | | const handleDelete = async (id) => { |
| | | await ElMessageBox.confirm('ç¡®å®å é¤è¯¥æ å°ï¼', 'æç¤º', { type: 'warning' }) |
| | | await MappingApi.deleteMapping(id) |
| | | ElMessage.success('å 餿å') |
| | | loadMappingList() |
| | | } |
| | | |
| | | onMounted(() => { |
| | | loadMappingList() |
| | | // å è½½ä»åºå表 |
| | | }) |
| | | </script> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãAPIæ¥å£ |
| | | |
| | | ### 5.1 审æ¹é
ç½®æ¥å£ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /mes/wms/approval/config/get | è·åå个审æ¹é
ç½® | |
| | | | GET | /mes/wms/approval/config/list | è·åä»åºææå®¡æ¹é
ç½® | |
| | | | POST | /mes/wms/approval/config/save | ä¿å审æ¹é
ç½® | |
| | | | GET | /mes/wms/approval/process-list | è·åå¯ç¨å®¡æ¹æµç¨ | |
| | | |
| | | **请æ±åæ°è¯¦æ
ï¼** |
| | | |
| | | #### GET /mes/wms/approval/config/get |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | warehouseId | Long | æ¯ | ä»åºID | |
| | | | bizType | String | æ¯ | ä¸å¡ç±»å(INBOUND/OUTBOUND/TRANSFER/CHECK) | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "id": 1, |
| | | "warehouseId": 100, |
| | | "bizType": "INBOUND", |
| | | "approvalEnabled": true, |
| | | "processDefinitionKey": "wms_inbound_approve", |
| | | "categoryCode": "wms_approve" |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### POST /mes/wms/approval/config/save |
| | | |
| | | **请æ±ä½ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "warehouseId": 100, |
| | | "bizType": "INBOUND", |
| | | "approvalEnabled": true, |
| | | "processDefinitionKey": "wms_inbound_approve" |
| | | } |
| | | ``` |
| | | |
| | | #### GET /mes/wms/approval/process-list |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | warehouseId | Long | æ¯ | ä»åºID | |
| | | | bizType | String | æ¯ | ä¸å¡ç±»å | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": [ |
| | | { "key": "wms_inbound_approve", "name": "å
¥åºå®¡æ¹æµç¨" }, |
| | | { "key": "wms_common_approve", "name": "éç¨å®¡æ¹æµç¨" } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | ### 5.2 ä»åºæ å°æ¥å£ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /erp/warehouse-mapping/page | å页æ¥è¯¢æ å°å表 | |
| | | | GET | /erp/warehouse-mapping/get | è·åå个æ å° | |
| | | | POST | /erp/warehouse-mapping/create | æ°å¢æ å° | |
| | | | PUT | /erp/warehouse-mapping/update | æ´æ°æ å° | |
| | | | DELETE | /erp/warehouse-mapping/delete | å 餿 å° | |
| | | |
| | | **请æ±åæ°è¯¦æ
ï¼** |
| | | |
| | | #### GET /erp/warehouse-mapping/page |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | pageNo | Integer | æ¯ | 页ç | |
| | | | pageSize | Integer | æ¯ | æ¯é¡µæ°é | |
| | | | erpWarehouseId | Long | å¦ | ERPä»åºID | |
| | | | mesWarehouseId | Long | å¦ | MESä»åºID | |
| | | | status | Integer | å¦ | ç¶æ | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 0, |
| | | "data": { |
| | | "list": [ |
| | | { |
| | | "id": 1, |
| | | "erpWarehouseId": 1, |
| | | "erpWarehouseName": "主ä»åº", |
| | | "mesWarehouseId": 100, |
| | | "mesWarehouseName": "æ»ä»", |
| | | "status": 1 |
| | | } |
| | | ], |
| | | "total": 1 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### POST /erp/warehouse-mapping/create |
| | | |
| | | **请æ±ä½ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "erpWarehouseId": 1, |
| | | "mesWarehouseId": 100, |
| | | "status": 1 |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãAPIæä»¶å建 |
| | | |
| | | ### 6.1 审æ¹é
ç½®API |
| | | |
| | | å建æä»¶ï¼`src/api/wms/approval/index.js` |
| | | |
| | | ```js |
| | | import request from '@/utils/request' |
| | | |
| | | // è·å审æ¹é
ç½® |
| | | export function getApprovalConfig(warehouseId, bizType) { |
| | | return request({ |
| | | url: '/mes/wms/approval/config/get', |
| | | method: 'get', |
| | | params: { warehouseId, bizType } |
| | | }) |
| | | } |
| | | |
| | | // è·åä»åºææå®¡æ¹é
ç½® |
| | | export function getApprovalConfigList(warehouseId) { |
| | | return request({ |
| | | url: '/mes/wms/approval/config/list', |
| | | method: 'get', |
| | | params: { warehouseId } |
| | | }) |
| | | } |
| | | |
| | | // ä¿å审æ¹é
ç½® |
| | | export function saveApprovalConfig(data) { |
| | | return request({ |
| | | url: '/mes/wms/approval/config/save', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // è·åå¯ç¨å®¡æ¹æµç¨å表 |
| | | export function getAvailableProcessList(warehouseId, bizType) { |
| | | return request({ |
| | | url: '/mes/wms/approval/process-list', |
| | | method: 'get', |
| | | params: { warehouseId, bizType } |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ### 6.2 ä»åºæ å°API |
| | | |
| | | å建æä»¶ï¼`src/api/erp/warehouseMapping/index.js` |
| | | |
| | | ```js |
| | | import request from '@/utils/request' |
| | | |
| | | // å页æ¥è¯¢æ å°å表 |
| | | export function getMappingPage(params) { |
| | | return request({ |
| | | url: '/erp/warehouse-mapping/page', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | // è·åå个æ å° |
| | | export function getMapping(id) { |
| | | return request({ |
| | | url: '/erp/warehouse-mapping/get', |
| | | method: 'get', |
| | | params: { id } |
| | | }) |
| | | } |
| | | |
| | | // æ°å¢æ å° |
| | | export function createMapping(data) { |
| | | return request({ |
| | | url: '/erp/warehouse-mapping/create', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ´æ°æ å° |
| | | export function updateMapping(data) { |
| | | return request({ |
| | | url: '/erp/warehouse-mapping/update', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // å 餿 å° |
| | | export function deleteMapping(id) { |
| | | return request({ |
| | | url: '/erp/warehouse-mapping/delete', |
| | | method: 'delete', |
| | | params: { id } |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãæ°æ®æ å°é
ç½® |
| | | |
| | | ### 7.1 ERP产åä¸MDMç©æ |
| | | |
| | | éè¿æ¡ç (barCode)å
³èï¼ |
| | | - ERP产åçbarCodeåæ®µå¼ = MDMç©æçbarCodeåæ®µå¼ |
| | | - ç³»ç»èªå¨éè¿barCodeå¹é
ï¼æ éé¢å¤é
置表 |
| | | |
| | | ### 7.2 ERPä»åºä¸MESä»åº |
| | | |
| | | éè¦å¨ä»åºæ å°é¡µé¢é
ç½®æ å°å
³ç³»ï¼ |
| | | |
| | | | ERPä»åº | MESä»åº | 说æ | |
| | | |---------|---------|------| |
| | | | 主ä»åº(ID=1) | æ»ä»(ID=100) | é»è®¤æ å° | |
| | | |
| | | **注æ**ï¼ERPä»åºå¿
é¡»é
ç½®æ å°åï¼ERPéè´å
¥åº/éå®åºåºå®¡æ ¸æè½åæ¥MESåºåã |
| | | |
| | | --- |
| | | |
| | | ## å
«ãä¸å¡æµç¨ |
| | | |
| | | ### 8.1 éè´å
¥åºæµç¨ï¼ERP â MESï¼ |
| | | |
| | | ``` |
| | | ERPéè´å
¥åºåå建 |
| | | â |
| | | ERPéè´å
¥åºåå®¡æ ¸ |
| | | â |
| | | è°ç¨ WmsStockApi.purchaseInbound() |
| | | â |
| | | æ¥æ¾ERPä»åº â MESä»åºæ å° |
| | | â |
| | | æ¥æ¾ERP产å(barCode) â MDMç©æ(barCode) |
| | | â |
| | | å建MESåºåäºå¡è®°å½ |
| | | â |
| | | MESåºåå¢å |
| | | ``` |
| | | |
| | | ### 8.2 éå®åºåºæµç¨ï¼ERP â MESï¼ |
| | | |
| | | ``` |
| | | ERPéå®åºåºåå建 |
| | | â |
| | | ERPéå®åºåºåå®¡æ ¸ |
| | | â |
| | | è°ç¨ WmsStockApi.salesOutbound() |
| | | â |
| | | æ¥æ¾ä»åºæ å° + äº§åæ å° |
| | | â |
| | | å建MESåºåäºå¡è®°å½ï¼æ°é为è´ï¼ |
| | | â |
| | | MESåºååå° |
| | | ``` |
| | | |
| | | ### 8.3 å®¡æ¹æµç¨ï¼å¯éï¼ |
| | | |
| | | ``` |
| | | MESå
¥åºåå建ï¼èç¨¿ï¼ |
| | | â |
| | | æ£æ¥ä»åºå®¡æ¹é
ç½® â æ¯å¦éè¦å®¡æ¹ï¼ |
| | | â (éè¦å®¡æ¹) |
| | | æäº¤å®¡æ¹ â BPMæµç¨å¯å¨ |
| | | â |
| | | 审æ¹éè¿ â åæ®ç¶ææ´æ° â æ§è¡å
¥åº |
| | | â (ä¸éè¦å®¡æ¹) |
| | | ç´æ¥æ§è¡å
¥åº |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¹ã注æäºé¡¹ |
| | | |
| | | 1. **æ§è¡é¡ºåº**ï¼å
æ§è¡SQLèæ¬ï¼åé¨ç½²åç«¯ï¼æåè°æ´å端 |
| | | 2. **æ å°é
ç½®**ï¼ERPä»åºå¿
é¡»å
é
ç½®æ å°æè½åæ¥MESåºå |
| | | 3. **æéåç¼**ï¼ |
| | | - 审æ¹é
ç½®ï¼`mes:wm-warehouse:query`ã`mes:wm-warehouse:update` |
| | | - ä»åºæ å°ï¼`erp:warehouse:query`ã`erp:warehouse:update`ã`erp:warehouse:delete` |
| | | 4. **å®¡æ¹æµç¨**ï¼éå¨BPM管çåå°å建"ä»åºå®¡æ ¸(wms_approve)"åç±»ä¸çæµç¨ |
| | | 5. **ç©ææ¡ç **ï¼MDMç©æå¿
须填åbarCodeï¼ä¸ä¸ERP产åbarCodeä¸è´ |
| | | |
| | | --- |
| | | |
| | | ## åãæµè¯éªè¯ |
| | | |
| | | ### 10.1 åè½æµè¯ |
| | | |
| | | 1. **èåéªè¯**ï¼ç»å½ç³»ç»ï¼ç¡®è®¤"ä»å¨ç©æµ"ä½ä¸ºä¸çº§èåæ¾ç¤º |
| | | 2. **æ å°é
ç½®**ï¼å¨ERPä»åºç®¡çä¸ï¼é
ç½®ERPä»åºä¸MESä»åºæ å° |
| | | 3. **éè´å
¥åº**ï¼ |
| | | - ERPå建éè´å
¥åºå â å®¡æ ¸ |
| | | - æ¥è¯¢MESåºåç°æé â 确认åºåå¢å |
| | | 4. **éå®åºåº**ï¼ |
| | | - ERPå建éå®åºåºå â å®¡æ ¸ |
| | | - æ¥è¯¢MESåºåç°æé â 确认åºååå° |
| | | 5. **å®¡æ¹æµç¨**ï¼ |
| | | - é
ç½®ä»åºå
¥åºå®¡æ¹ â å¯ç¨ |
| | | - å建MESå
¥åºå â æå®¡æ¹ â 审æ¹éè¿ â ç¶æåæ´ |
| | | |
| | | ### 10.2 å¼å¸¸åºæ¯ |
| | | |
| | | 1. æªé
ç½®ä»åºæ å° â ERPå®¡æ ¸æ¶æ¥éæç¤º"ä»åºæ å°ä¸åå¨" |
| | | 2. ç©ææ¡ç ä¸å¹é
â ERPå®¡æ ¸æ¶æ¥éæç¤º"ç©æä¸åå¨" |
| | | 3. åºåä¸è¶³ â éå®åºåºæ¶æ¥éæç¤º"åºåä¸è¶³" |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # å°è´§éç¥åå
³èéè´è®¢ååè½ |
| | | |
| | | ## æ¦è¿° |
| | | |
| | | å°å°è´§éç¥åçéè´è®¢åå·ä»æå¨è¾å
¥æ¹ä¸ºå
³è ERP éè´è®¢åï¼å®ç°æ°æ®èå¨åæ ¡éªã |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | | é¡µé¢ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | å°è´§éç¥åå表页 | `wls/arrivalnotice/index.vue` | å°è´§éç¥å管ç | |
| | | | å°è´§éç¥å详æ
/ç¼è¾é¡µ | `wls/arrivalnotice/form.vue` | æ°å¢/ç¼è¾å°è´§éç¥å | |
| | | |
| | | ## API |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | `/rpc-api/erp/purchase-order/get` | æ ¹æ® ID è·åéè´è®¢å | |
| | | | GET | `/rpc-api/erp/purchase-order/list-by-supplier` | æ ¹æ®ä¾åºåè·åéè´è®¢åå表ï¼å·²å®¡æ ¸ï¼ | |
| | | | POST | `/mes/wm-arrival-notice/create` | å建å°è´§éç¥å | |
| | | | PUT | `/mes/wm-arrival-notice/update` | æ´æ°å°è´§éç¥å | |
| | | |
| | | **请æ±åæ°åæ´ï¼create/updateï¼ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | purchaseOrderId | Long | å¦ | éè´è®¢åç¼å·ï¼æ°å¢ï¼ | |
| | | | purchaseOrderCode | String | å¦ | éè´è®¢åå·ï¼åä½ï¼å端èªå¨å¡«å
ï¼ | |
| | | | vendorId | Long | æ¯ | ä¾åºåç¼å·ï¼åæï¼ | |
| | | | ... | ... | ... | å
¶ä»åæå段ä¸å | |
| | | |
| | | **ååºåæ´ï¼** |
| | | |
| | | | åæ° | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | purchaseOrderId | Long | éè´è®¢åç¼å·ï¼æ°å¢ï¼ | |
| | | | purchaseOrderCode | String | éè´è®¢åå·ï¼åæï¼ | |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. 表ååæ®µä¿®æ¹ |
| | | |
| | | ```html |
| | | <!-- 忥çè¾å
¥æ¡ --> |
| | | <el-form-item label="éè´è®¢åå·" prop="purchaseOrderCode"> |
| | | <el-input v-model="formData.purchaseOrderCode" placeholder="请è¾å
¥éè´è®¢åå·" /> |
| | | </el-form-item> |
| | | |
| | | <!-- æ¹ä¸ºä¸æéæ©æ¡ --> |
| | | <el-form-item label="éè´è®¢å" prop="purchaseOrderId"> |
| | | <el-select |
| | | v-model="formData.purchaseOrderId" |
| | | placeholder="è¯·éæ©éè´è®¢å" |
| | | clearable |
| | | filterable |
| | | @change="handlePurchaseOrderChange" |
| | | > |
| | | <el-option |
| | | v-for="order in purchaseOrderList" |
| | | :key="order.id" |
| | | :label="order.no" |
| | | :value="order.id" |
| | | > |
| | | <span>{{ order.no }}</span> |
| | | <span style="color: #999; margin-left: 10px;">{{ order.orderTime }}</span> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | ### 2. data æ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | // æ°å¢ï¼éè´è®¢åå表 |
| | | purchaseOrderList: [], |
| | | formData: { |
| | | purchaseOrderId: undefined, // æ°å¢ |
| | | purchaseOrderCode: '', // ä¿çï¼æ¾ç¤ºç¨ï¼ |
| | | // ... å
¶ä»å段 |
| | | }, |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 3. æ¹æ³ |
| | | |
| | | ```js |
| | | // ä¾åºååæ´æ¶ï¼å 载对åºçéè´è®¢åå表 |
| | | handleVendorChange(vendorId) { |
| | | if (!vendorId) { |
| | | this.purchaseOrderList = []; |
| | | this.formData.purchaseOrderId = undefined; |
| | | this.formData.purchaseOrderCode = ''; |
| | | return; |
| | | } |
| | | getPurchaseOrderListBySupplier(vendorId).then(res => { |
| | | this.purchaseOrderList = res.data || []; |
| | | }); |
| | | } |
| | | |
| | | // éè´è®¢ååæ´æ¶ï¼èªå¨å¡«å
éè´è®¢åå· |
| | | handlePurchaseOrderChange(orderId) { |
| | | if (!orderId) { |
| | | this.formData.purchaseOrderCode = ''; |
| | | return; |
| | | } |
| | | const order = this.purchaseOrderList.find(o => o.id === orderId); |
| | | if (order) { |
| | | this.formData.purchaseOrderCode = order.no; |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4. API æ¹æ³ |
| | | |
| | | ```js |
| | | import request from '@/utils/request'; |
| | | |
| | | // æ ¹æ®ä¾åºåè·åéè´è®¢åå表ï¼å·²å®¡æ ¸ç¶æï¼ |
| | | export function getPurchaseOrderListBySupplier(supplierId) { |
| | | return request({ |
| | | url: `/rpc-api/erp/purchase-order/list-by-supplier?supplierId=${supplierId}`, |
| | | method: 'get' |
| | | }); |
| | | } |
| | | ``` |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - éè´è®¢å䏿æ¡åªå¨éæ©ä¾åºååæå è½½ |
| | | - åªå è½½å·²å®¡æ ¸ç¶æçéè´è®¢å |
| | | - å端ä¼èªå¨æ ¹æ® `purchaseOrderId` å¡«å
`purchaseOrderCode`ï¼å端æ éæå¨ä¼ é |
| | | - åæç `purchaseOrderCode` åæ®µä¿çç¨äºæ¾ç¤ºï¼ä½ä¸å»ºè®®æå¨è¾å
¥ |
| | | |
| | | ## æ°æ®åºåæ´ |
| | | |
| | | éè¦æ§è¡ SQL èæ¬ï¼`sql/mysql/mes_wm_arrival_notice_purchase_order.sql` |
| | | |
| | | ```sql |
| | | ALTER TABLE mes_wm_arrival_notice ADD COLUMN purchase_order_id BIGINT COMMENT 'éè´è®¢åç¼å·' AFTER name; |
| | | ``` |
| | | |
| | | ## 注æï¼mes_wm_item_receipt 表é®é¢ |
| | | |
| | | `mes_wm_item_receipt` è¡¨å¨æ°æ®åºä¸æ¯ **ç©æéåºå**ï¼å
³èç产工åï¼ï¼ä½ä»£ç 䏿³¨éåçæ¯"éè´å
¥åºå"ã |
| | | è¿æ¯ä¸ä¸ªä»£ç 䏿°æ®åºä¸ä¸è´çé®é¢ï¼éè¦åç»åç¬ä¿®å¤ãæ¬æ¬¡ä¿®æ¹ä¸å½±å该表ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ä»å¨ç©æµæ¨¡åä¸å¡åææ¥å |
| | | |
| | | ## ä¸ãåç°çé®é¢ä¸æ¼æ´ |
| | | |
| | | ### 1. å¹¶åå®å
¨é®é¢ ð´ é«é£é© |
| | | |
| | | **é®é¢æè¿°**ï¼ |
| | | åºåæ´æ°æä½ `updateQuantity` 使ç¨äºæ°æ®åºå±é¢ç CASï¼Compare And Setï¼é²è´åºåï¼ä½ç¼ºä¹åå¸å¼éä¿æ¤ã |
| | | |
| | | **é£é©åºæ¯**ï¼ |
| | | ``` |
| | | åºæ¯ï¼åä¸åºåè®°å½è¢«ä¸¤ä¸ªåºåºååæ¶æä½ |
| | | æ¶é´çº¿ï¼ |
| | | T1: 线ç¨A读ååºå quantity=100 |
| | | T2: 线ç¨B读ååºå quantity=100 |
| | | T3: 线ç¨Aæ§è¡åºåº50ï¼quantity=50 |
| | | T4: 线ç¨Bæ§è¡åºåº60ï¼quantity=-10ï¼CAS伿¦æªï¼ |
| | | ``` |
| | | |
| | | **å½åå®ç°**ï¼MesWmMaterialStockMapper.java:78-86ï¼ï¼ |
| | | ```java |
| | | default int updateQuantity(Long id, BigDecimal count, boolean checkFlag) { |
| | | LambdaUpdateWrapper<MesWmMaterialStockDO> updateWrapper = new LambdaUpdateWrapper<>() |
| | | .eq(MesWmMaterialStockDO::getId, id) |
| | | .setSql("quantity = quantity + " + count); |
| | | if (checkFlag && count.compareTo(BigDecimal.ZERO) < 0) { |
| | | updateWrapper.ge(MesWmMaterialStockDO::getQuantity, count.abs()); // CAS é²è´åºå |
| | | } |
| | | return update(null, updateWrapper); |
| | | } |
| | | ``` |
| | | |
| | | **é®é¢**ï¼ |
| | | - CASå¯ä»¥é²æ¢è´åºåï¼ä½æ æ³é²æ¢è¶
åï¼ä¸¤ä¸ªçº¿ç¨åæ¶æ£æ¥åºåå
è¶³ï¼ç¶ååæ¶æ£åï¼ |
| | | - 缺å°ä¹è§éçæ¬å·æºå¶ |
| | | |
| | | **建议修å¤**ï¼ |
| | | ```java |
| | | // æ¹æ¡1ï¼æ·»å ä¹è§éçæ¬å·å段 |
| | | ALTER TABLE mes_wm_material_stock ADD COLUMN version INT DEFAULT 0; |
| | | |
| | | // æ¹æ¡2ï¼ä½¿ç¨ Redis åå¸å¼éï¼æ¨èé«å¹¶ååºæ¯ï¼ |
| | | String lockKey = "stock:" + itemId + ":" + areaId; |
| | | RLock lock = redissonClient.getLock(lockKey); |
| | | try { |
| | | lock.lock(); |
| | | // æ§è¡åºåæ´æ° |
| | | } finally { |
| | | lock.unlock(); |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 2. åºåå¯ä¸é®è®¾è®¡é®é¢ ð¡ ä¸é£é© |
| | | |
| | | **é®é¢æè¿°**ï¼ |
| | | ææ¡£ä¸å®ä¹å¯ä¸é®ä¸º `(itemId, warehouseId, locationId, areaId, batchId)`ï¼ä½å®é
代ç ä¸ `vendorId` ä¹åä¸äºç»åæ¥è¯¢ã |
| | | |
| | | **é£é©**ï¼ |
| | | - åä¸ç©æåä¸åºä½ï¼ä¸åä¾åºåçå
¥åºä¼å建两æ¡åºåè®°å½ |
| | | - å¯è½å¯¼è´åºåè®°å½è¨èï¼æ¥è¯¢æçä¸é |
| | | |
| | | **代ç è¯æ®**ï¼MesWmMaterialStockServiceImpl.java:141-146ï¼ï¼ |
| | | ```java |
| | | MesWmMaterialStockDO existStock = materialStockMapper.selectByCompositeKey( |
| | | itemId, warehouseId, locationId, areaId, batchId); |
| | | // 注æï¼vendorId æªåä¸å¯ä¸é®æ¥è¯¢ |
| | | ``` |
| | | |
| | | **建议**ï¼ |
| | | - æç¡®ä¸å¡éæ±ï¼æ¯å¦éè¦æä¾åºååºååºåï¼ |
| | | - 妿éè¦ï¼å»ºè®®å¨å¯ä¸é®ä¸å¢å vendorId |
| | | - 妿ä¸éè¦ï¼å
¥åºæ¶ä¸åºå建æ°çåºåè®°å½ |
| | | |
| | | --- |
| | | |
| | | ### 2. 忮忶åçåºåå¤ç â
已确认设计æ£ç¡® |
| | | |
| | | **设计å³ç**ï¼ |
| | | - å·²å®æç¶æï¼FINISHEDï¼çåæ®**ä¸å
è®¸åæ¶** |
| | | - åªè½å¨è稿ãå¾
审æ¹ãå¾
æ§è¡çæªå®æç¶æåæ¶ |
| | | - å¦éåé已宿çåºåæä½ï¼åºå建对åºçå²éåæ®ï¼å¦éè´§åï¼ |
| | | |
| | | **代ç è¯æ®**ï¼ |
| | | ```java |
| | | // MesWmItemReceiptServiceImpl.java |
| | | @Override |
| | | public void cancelItemReceipt(Long id) { |
| | | MesWmItemReceiptDO receipt = validateItemReceiptExists(id); |
| | | // 已宿å已忶ä¸å
è®¸åæ¶ |
| | | if (ObjectUtils.equalsAny(receipt.getStatus(), |
| | | MesWmItemReceiptStatusEnum.FINISHED.getStatus(), |
| | | MesWmItemReceiptStatusEnum.CANCELED.getStatus())) { |
| | | throw exception(WM_ITEM_RECEIPT_CANCEL_NOT_ALLOWED); |
| | | } |
| | | // ... |
| | | } |
| | | ``` |
| | | |
| | | **è¯ä»·**ï¼è¿æ¯æ£ç¡®çä¸å¡è®¾è®¡ï¼é¿å
äºå¤æçåºåå²éé»è¾ã |
| | | |
| | | --- |
| | | |
| | | ### 4. 缺å°äºå¡åæ»æºå¶ ð¡ ä¸é£é© |
| | | |
| | | **é®é¢æè¿°**ï¼ |
| | | æ¹éå建äºå¡æ¶ï¼å¦æä¸é失败ï¼å·²æ§è¡çäºå¡ä¸ä¼åæ»ã |
| | | |
| | | **代ç è¯æ®**ï¼MesWmTransactionServiceImpl.java:100-107ï¼ï¼ |
| | | ```java |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void createTransactionList(List<MesWmTransactionSaveReqDTO> reqDTOs) { |
| | | if (CollUtil.isEmpty(reqDTOs)) { |
| | | throw exception(WM_TRANSACTION_LIST_EMPTY); |
| | | } |
| | | reqDTOs.forEach(this::createTransaction); // é个æ§è¡ï¼é¨åæåä¸ä¼åæ» |
| | | } |
| | | ``` |
| | | |
| | | **åæ**ï¼ |
| | | - æ¹æ³æ `@Transactional` 注解ï¼çè®ºä¸æäºå¡ä¿æ¤ |
| | | - ä½å¦æ `createTransaction` å
鍿è·å¼å¸¸æªæåºï¼ä¼å¯¼è´é¨åæå |
| | | |
| | | **建议**ï¼ |
| | | - ç¡®ä¿ææå¼å¸¸é½åä¸æåº |
| | | - èèæ·»å äºå¡è¡¥å¿æºå¶ |
| | | |
| | | --- |
| | | |
| | | ### 5. ç¶ææºç¼ºå¤±ä¸¥æ ¼æ ¡éª ð¡ ä¸é£é© |
| | | |
| | | **é®é¢æè¿°**ï¼ |
| | | ç¶ææµè½¬ä¾èµæ¹æ³å½å约å®ï¼ç¼ºå°æ¾å¼çç¶ææºæ ¡éªã |
| | | |
| | | **é£é©**ï¼ |
| | | - å¯è½åºç°éæ³ç¶æè·³è½¬ï¼å¦ä»èç¨¿ç´æ¥å°å·²å®æï¼ |
| | | - ç¶ææä¸¾å¼å¯è½è¢«éæè®¾ç½® |
| | | |
| | | **建议**ï¼ |
| | | ```java |
| | | // æ·»å ç¶ææµè½¬æ ¡éª |
| | | public enum ItemReceiptStateTransition { |
| | | PREPARE_TO_APPROVING(PREPARE, APPROVING), |
| | | APPROVING_TO_APPROVED(APPROVING, APPROVED), |
| | | APPROVED_TO_FINISHED(APPROVED, FINISHED), |
| | | ANY_TO_CANCELED(ANY, CANCELED); |
| | | |
| | | public static boolean isValidTransition(Integer from, Integer to) { |
| | | // æ ¡éªé»è¾ |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 6. çç¹å·®å¼å¤çé»è¾æªå®ç° ð¡ ä¸é£é© |
| | | |
| | | **é®é¢æè¿°**ï¼ |
| | | ææ¡£ä¸æå°"çç+åºåï¼çäº-åºå"ï¼ä½ä»£ç 䏿ªæ¾å°å·®å¼å¤ççå
·ä½å®ç°ã |
| | | |
| | | **é£é©**ï¼ |
| | | - çç¹ç»æå¯è½æ æ³æ£ç¡®å½±ååºå |
| | | - çç¹æµç¨ä¸å®æ´ |
| | | |
| | | --- |
| | | |
| | | ### 7. 缺å°å®å
¨åºåé¢è¦ ð¢ ä½é£é© |
| | | |
| | | **é®é¢æè¿°**ï¼ |
| | | ç³»ç»ç¼ºå°å®å
¨åºåä¸éé¢è¦åè½ã |
| | | |
| | | **建议**ï¼ |
| | | - å¨ç©æä¸»æ°æ®ä¸å¢å `safetyStock`ï¼å®å
¨åºåï¼å段 |
| | | - åºåºæ¶æ£æ¥æ¯å¦ä½äºå®å
¨åºåï¼è§¦åé¢è¦ |
| | | |
| | | --- |
| | | |
| | | ### 8. 缺å°åºåæææç®¡ç ð¢ ä½é£é© |
| | | |
| | | **é®é¢æè¿°**ï¼ |
| | | æ¹æ¬¡ç®¡ç䏿²¡ææææåæ®µï¼æ æ³è¿è¡ä¸´æ/è¿æé¢è¦ã |
| | | |
| | | **建议**ï¼ |
| | | - 卿¹æ¬¡è¡¨ä¸å¢å `expireDate`ï¼æææï¼å段 |
| | | - å¢å 临æé¢è¦åè½ |
| | | |
| | | --- |
| | | |
| | | ## äºãä¸å¡æµç¨æ¼æ´ |
| | | |
| | | ### 2.1 éè´å
¥åºæµç¨ |
| | | |
| | | | ç¯è | å½åå®ç° | æ½å¨é®é¢ | |
| | | |------|---------|---------| |
| | | | æäº¤ | æ ¡éªè³å°æä¸è¡ | â
æ£å¸¸ | |
| | | | 䏿¶ | æ ¡éªæç»æ°é=è¡æ°é | â
æ£å¸¸ | |
| | | | å
¥åº | å建äºå¡æµæ°´ | â
æ£å¸¸ | |
| | | | åæ¶ | åªæ´æ°ç¶æ | â ï¸ å¾
䏿¶ç¶æåæ¶åï¼å·²ä¸æ¶çæç»å¦ä½å¤çï¼ | |
| | | |
| | | ### 2.2 éå®åºåºæµç¨ |
| | | |
| | | | ç¯è | å½åå®ç° | æ½å¨é®é¢ | |
| | | |------|---------|---------| |
| | | | æäº¤ | æ£æ¥OQCéæ± | â
æ£å¸¸ | |
| | | | æ£è´§ | æ ¡éªæ¯è¡ææç» | â ï¸ æªæ ¡éªåºåå
è¶³ | |
| | | | åºåº | å建äºå¡æµæ°´ | â
æ£å¸¸ | |
| | | | åæ¶ | åªæ´æ°ç¶æ | â ï¸ å·²æ£è´§çåºåå¦ä½å¤çï¼ | |
| | | |
| | | **建议**ï¼æ£è´§æ¶åºå»ç»åºåï¼é²æ¢è¢«å
¶ä»åæ®æ¢å ã |
| | | |
| | | ### 2.3 è°æ¨æµç¨ |
| | | |
| | | | ç¯è | å½åå®ç° | æ½å¨é®é¢ | |
| | | |------|---------|---------| |
| | | | æäº¤ | é
鿍¡å¼å»ç»æºåºå | â
æ£å¸¸ | |
| | | | 䏿¶ | æ ¡éªæç»æ°é | â
æ£å¸¸ | |
| | | | æ§è¡ | å建åºåº+å
¥åºäºå¡ | â
æ£å¸¸ | |
| | | | åæ¶ | è§£é¤å»ç» | â
æ£å¸¸ | |
| | | |
| | | **è¯ä»·**ï¼è°æ¨æµç¨è®¾è®¡è¾ä¸ºå®åã |
| | | |
| | | --- |
| | | |
| | | ## ä¸ã已宿çä¼å项 |
| | | |
| | | ### 1. åºåå¯ä¸é®è®¾è®¡ â
å·²ä¼å |
| | | |
| | | **ä¼åå
容**ï¼ |
| | | - `vendorId` ç°å¨åä¸åºåå¯ä¸é® |
| | | - åä¸ç©æåä¸åºä½ï¼ä¸åä¾åºåçåºååå¼ç®¡ç |
| | | - ä¿®æ¹äº `selectByCompositeKey` æ¹æ³ï¼å¢å vendorId åæ° |
| | | |
| | | **ä¿®æ¹æä»¶**ï¼ |
| | | - `MesWmMaterialStockMapper.java` |
| | | - `MesWmMaterialStockServiceImpl.java` |
| | | |
| | | ### 2. ç¶ææµè½¬æ ¡éª â
å·²ä¼å |
| | | |
| | | **ä¼åå
容**ï¼ |
| | | - æ°å¢ `WmStatusTransitionUtils` ç¶ææµè½¬æ ¡éªå·¥å
·ç±» |
| | | - å®ä¹äºåä¸å¡åæ®çåæ³ç¶ææµè½¬è§å |
| | | - 鲿¢éæ³ç¶æè·³è½¬ |
| | | |
| | | **æ°å¢æä»¶**ï¼ |
| | | - `WmStatusTransitionUtils.java` |
| | | |
| | | **使ç¨ç¤ºä¾**ï¼ |
| | | ```java |
| | | WmStatusTransitionUtils.validateTransition("ITEM_RECEIPT", |
| | | receipt.getStatus(), MesWmItemReceiptStatusEnum.APPROVING.getStatus(), "éè´å
¥åºå"); |
| | | ``` |
| | | |
| | | ### 3. æ£è´§åºåæ ¡éª â
å·²ä¼å |
| | | |
| | | **ä¼åå
容**ï¼ |
| | | - éå®åºåºæ£è´§æ¶æ ¡éªåºåå
è¶³ |
| | | - è°ç¨ `materialStockService.validateSelectedStock()` æ¹æ³ |
| | | - æ ¡éªç©æãæ¹æ¬¡ãåºä½ãæ°éæ¯å¦å¹é
|
| | | |
| | | **ä¿®æ¹æä»¶**ï¼ |
| | | - `MesWmProductSalesServiceImpl.java` ç `stockProductSales` æ¹æ³ |
| | | |
| | | ### 4. çç¹å·®å¼å¤ç â
å·²ä¼å |
| | | |
| | | **ä¼åå
容**ï¼ |
| | | - æ°å¢ `processStockTakingDifference` æ¹æ³ |
| | | - æ¯è¾çç¹ç»æä¸åºåå°è´¦çå·®å¼ |
| | | - ççï¼åºåå¢å ï¼å建å
¥åºäºå¡ |
| | | - çäºï¼åºååå°ï¼å建åºåºäºå¡ |
| | | |
| | | **ä¿®æ¹æä»¶**ï¼ |
| | | - `MesWmStockTakingTaskService.java` |
| | | - `MesWmStockTakingTaskServiceImpl.java` |
| | | - `MesWmStockTakingTaskResultService.java` |
| | | - `MesWmStockTakingTaskResultServiceImpl.java` |
| | | - `MesWmStockTakingTaskResultMapper.java` |
| | | - `MesBizTypeConstants.java` (æ°å¢ WM_STOCK_TAKING 常é) |
| | | - `ErrorCodeConstants.java` (æ°å¢ WM_STOCK_TAKING_TASK_NOT_FINISHED é误ç ) |
| | | |
| | | ### 3.1 缺å°å¯ä¸çº¦æ |
| | | |
| | | **é®é¢**ï¼ |
| | | - `mes_wm_material_stock` 表å¯è½ç¼ºå°å¯ä¸ç´¢å¼ |
| | | - `mes_wm_item_receipt.code` çåæ®ç¼å·åºå»ºç«å¯ä¸ç´¢å¼ |
| | | |
| | | **建议**ï¼ |
| | | ```sql |
| | | ALTER TABLE mes_wm_material_stock |
| | | ADD UNIQUE INDEX uk_stock (item_id, warehouse_id, location_id, area_id, IFNULL(batch_id, 0)); |
| | | |
| | | ALTER TABLE mes_wm_item_receipt ADD UNIQUE INDEX uk_code (code); |
| | | ALTER TABLE mes_wm_product_sales ADD UNIQUE INDEX uk_code (code); |
| | | ALTER TABLE mes_wm_transfer ADD UNIQUE INDEX uk_code (code); |
| | | ``` |
| | | |
| | | ### 3.2 缺å°çº§èå 餿§å¶ |
| | | |
| | | **é®é¢**ï¼ |
| | | - å é¤ä»åºæ¶ï¼æªæ£æ¥æ¯å¦åå¨åºåè®°å½ |
| | | - å é¤ç©ææ¶ï¼æªæ£æ¥æ¯å¦åå¨åºåè®°å½ |
| | | |
| | | **建议**ï¼ |
| | | - å¨å é¤åå¢å å¼ç¨æ£æ¥ |
| | | - æä½¿ç¨è½¯å é¤ï¼ä¿çå岿°æ® |
| | | |
| | | --- |
| | | |
| | | ## åãæ¹è¿å»ºè®®æ±æ» |
| | | |
| | | ### é«ä¼å
级 ð´ |
| | | |
| | | | åºå· | é®é¢ | è§£å³æ¹æ¡ | |
| | | |------|------|---------| |
| | | | 1 | å¹¶åå®å
¨ | å¢å ä¹è§éçæ¬å·æåå¸å¼é | |
| | | | 2 | 已宿忮忶 | æç¡®ä¸å¡è§åï¼ç¦æ¢æå建å²éäºå¡ | |
| | | |
| | | ### ä¸ä¼å
级 ð¡ |
| | | |
| | | | åºå· | é®é¢ | è§£å³æ¹æ¡ | |
| | | |------|------|---------| |
| | | | 3 | å¯ä¸é®ä¸æç¡® | æç¡® vendorId æ¯å¦åä¸å¯ä¸é® | |
| | | | 4 | ç¶ææºæ ¡éªç¼ºå¤± | å¢å ç¶ææµè½¬æ ¡éª | |
| | | | 5 | çç¹å·®å¼å¤ç | è¡¥å
å·®å¼å¤çé»è¾ | |
| | | | 6 | æ£è´§åºåæ ¡éª | æ£è´§æ¶æ ¡éªå¹¶å»ç»åºå | |
| | | |
| | | ### ä½ä¼å
级 ð¢ |
| | | |
| | | | åºå· | é®é¢ | è§£å³æ¹æ¡ | |
| | | |------|------|---------| |
| | | | 7 | å®å
¨åºåé¢è¦ | å¢å å®å
¨åºååæ®µåé¢è¦åè½ | |
| | | | 8 | æææç®¡ç | æ¹æ¬¡å¢å æææåæ®µ | |
| | | |
| | | --- |
| | | |
| | | ## äºãæ¶æä¼å建议 |
| | | |
| | | ### 5.1 å¢å åºåé¢å æºå¶ |
| | | |
| | | ``` |
| | | éå®åºåºåå建 â é¢å åºåï¼é¢çéï¼ |
| | | â |
| | | æ§è¡åºåº â æ£åé¢çé + æ£åå®ç©åºå |
| | | â |
| | | åæ¶ â éæ¾é¢çé |
| | | ``` |
| | | |
| | | ### 5.2 å¢å åºåæä½æ¥å¿ |
| | | |
| | | - è®°å½æ¯æ¬¡åºååæ´çæä½äººãæä½æ¶é´ãæä½åå |
| | | - 便äºé®é¢è¿½æº¯å审计 |
| | | |
| | | ### 5.3 å¢å åºåå¿«ç
§åè½ |
| | | |
| | | - æ¯æ¥å®æ¶çæåºåå¿«ç
§ |
| | | - æ¯æåå²åºåæ¥è¯¢å对æ¯åæ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ä»å¨ç©æµæ¨¡å(WM)æ¶æææ¡£ |
| | | |
| | | ## ä¸ãæ¨¡åæ¦è¿° |
| | | |
| | | ä»å¨ç©æµæ¨¡å(WM)æ¯MESç³»ç»ä¸çæ ¸å¿æ¨¡åï¼è´è´£ç®¡çç©æåºåãåºå
¥åºä¸å¡ãä»åºè®¾ç½®çåè½ã |
| | | |
| | | ### 1.1 æ ¸å¿è®¾è®¡ç念 |
| | | |
| | | - **å
ç»´åºå模å**ï¼ç©æ + æ¹æ¬¡ + ä»åº + åºåº + åºä½ + ä¾åºå |
| | | - **äºå¡é©±å¨**ï¼ææåºååå¨éè¿äºå¡æµæ°´è®°å½ï¼ä¿è¯æ°æ®å¯è¿½æº¯ |
| | | - **ç¶ææºç®¡ç**ï¼åæ®ç¶ææµè½¬ä¸¥æ ¼æ§å¶ï¼ä¿è¯ä¸å¡å®æ´æ§ |
| | | |
| | | --- |
| | | |
| | | ## äºãæ ¸å¿æ°æ®æ¨¡å |
| | | |
| | | ### 2.1 åºåå°è´¦ï¼mes_wm_material_stockï¼ |
| | | |
| | | åºåç°æé表ï¼è®°å½æ¯ä¸ªç©æå¨æ¯ä¸ªåºä½ç宿¶åºåã |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â mes_wm_material_stock â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â ç©æç»´åº¦ï¼itemId(ç©æ) + batchId(æ¹æ¬¡) + batchCode(æ¹æ¬¡å·) â |
| | | â ä½ç½®ç»´åº¦ï¼warehouseId(ä»åº) + locationId(åºåº) + areaId(åºä½)â |
| | | â ä¸å¡ç»´åº¦ï¼vendorId(ä¾åºå) + receiptTime(å
¥åºæ¶é´) â |
| | | â æ°éç¶æï¼quantity(æ°é) + frozen(æ¯å¦å»ç») â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | **å¯ä¸é®**ï¼`(itemId, warehouseId, locationId, areaId, batchId)` |
| | | |
| | | ### 2.2 åºåäºå¡æµæ°´ï¼mes_wm_transactionï¼ |
| | | |
| | | è®°å½æ¯ä¸ç¬åºåå¢åäºä»¶ï¼ç³»ç»èªå¨çæï¼åªè¯»æ¥è¯¢ã |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â mes_wm_transaction â |
| | | ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ⤠|
| | | â ä¸å¡å½å±ï¼type(äºå¡ç±»å) + bizType(ä¸å¡ç±»å) â |
| | | â bizId(ä¸å¡åID) + bizCode(ä¸å¡åå·) + bizLineId(è¡ID)â |
| | | â ç©æä¿¡æ¯ï¼itemId + quantity(å卿°éï¼æ£è´) + batchId â |
| | | â ä½ç½®ä¿¡æ¯ï¼warehouseId + locationId + areaId â |
| | | â æ¶é´ä¿¡æ¯ï¼transactionTime + receiptTime â |
| | | â å
³èä¿¡æ¯ï¼materialStockId + relatedTransactionId â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | **quantity è§å**ï¼ |
| | | - æ£æ° = å
¥åºï¼åºåå¢å ï¼ |
| | | - è´æ° = åºåºï¼åºååå°ï¼ |
| | | |
| | | ### 2.3 ä»åºå±çº§ç»æ |
| | | |
| | | ``` |
| | | ä»åº(Warehouse) |
| | | âââ åºåº(Location) |
| | | âââ åºä½(Area) |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãä¸å¡åæ®åç±» |
| | | |
| | | ### 3.1 å
¥åºç±»åæ® |
| | | |
| | | | åæ® | 说æ | ç¶ææµè½¬ | åºåå½±å | |
| | | |------|------|---------|---------| |
| | | | éè´å
¥åºå | éè´ç©æå
¥åº | è稿âå¾
䏿¶âå¾
å
¥åºâ已宿 | +åºå | |
| | | | å°è´§éç¥å | éè´å°è´§ç»è®° | è稿âå¾
å
¥åºâ已宿 | æ ï¼çæéè´å
¥åºåï¼ | |
| | | | ç产å
¥åºå | ç产产åå
¥åº | è稿âå¾
审æ¹âå¾
æ§è¡â已宿 | +åºå | |
| | | | æé¡¹å
¥åºå | å
¶ä»åå å
¥åº | è稿âå¾
审æ¹â已宿 | +åºå | |
| | | | å¤åå
¥åºå | å¤åå å·¥å
¥åº | è稿âå¾
审æ¹âå¾
æ§è¡â已宿 | +åºå | |
| | | | éå®éè´§å | 客æ·éè´§å
¥åº | è稿âå¾
审æ¹âå¾
æ§è¡â已宿 | +åºå | |
| | | | ç产éæå | ç产éåç©æ | è稿âå¾
审æ¹âå¾
æ§è¡â已宿 | +åºå | |
| | | |
| | | ### 3.2 åºåºç±»åæ® |
| | | |
| | | | åæ® | 说æ | ç¶ææµè½¬ | åºåå½±å | |
| | | |------|------|---------|---------| |
| | | | éå®åºåºå | éå®äº§ååºåº | è稿âå¾
æ£æµ/å¾
æ£è´§âå¾
å¡«åè¿åâå¾
åºåºâ已宿 | -åºå | |
| | | | çäº§é¢æå | ç产é¢ç¨ç©æ | è稿âå¾
审æ¹âå¾
æ§è¡â已宿 | -åºå | |
| | | | æé¡¹åºåºå | å
¶ä»åå åºåº | è稿âå¾
审æ¹â已宿 | -åºå | |
| | | | å¤ååæå | å¤åå å·¥åæ | è稿âå¾
审æ¹âå¾
æ§è¡â已宿 | -åºå | |
| | | | éè´éè´§å | éåä¾åºå | è稿âå¾
审æ¹âå¾
æ§è¡â已宿 | -åºå | |
| | | |
| | | ### 3.3 è°æ¨ç±»åæ® |
| | | |
| | | | åæ® | 说æ | ç¶ææµè½¬ | åºåå½±å | |
| | | |------|------|---------|---------| |
| | | | è½¬ç§»è°æ¨å | åºä½é´ç§»åº | è稿âå¾
确认âå¾
䏿¶âå¾
æ§è¡â已宿 | ååºä½-åºåï¼ç®æ åºä½+åºå | |
| | | |
| | | ### 3.4 çç¹ç±»åæ® |
| | | |
| | | | åæ® | 说æ | ç¶ææµè½¬ | åºåå½±å | |
| | | |------|------|---------|---------| |
| | | | çç¹è®¡å | å¶å®çç¹ä»»å¡ | è稿âå·²åå¸â已宿 | æ | |
| | | | çç¹ä»»å¡ | æ§è¡çç¹ | å¾
æ§è¡âçç¹ä¸â已宿 | æ | |
| | | | çç¹ç»æ | çç¹å·®å¼å¤ç | è稿âå¾
审æ¹â已宿 | çç+åºåï¼çäº-åºå | |
| | | |
| | | --- |
| | | |
| | | ## åãåæ®ç¶ææµè½¬å¾ |
| | | |
| | | ### 4.1 éè´å
¥åºåï¼éè´å
¥åºï¼ |
| | | |
| | | ``` |
| | | ââââââââââ submit ââââââââââ stock âââââââââââ finish ââââââââââ |
| | | â è稿 â ââââââââââ â å¾
䏿¶ â ââââââââââ â å¾
å
¥åº â ââââââââââ â 已宿 â |
| | | â(PREPARE)â â(APPROVING)â â(APPROVED)â â(FINISHED)â |
| | | ââââââââââ ââââââââââ âââââââââââ ââââââââââ |
| | | â â â â |
| | | â â â â |
| | | ââââââââââââââââââââââââ´âââââââââââââââââââââââ´âââââââââââââââââââââââ |
| | | â |
| | | cancelâ |
| | | â |
| | | ââââââââââ |
| | | â 已忶 â |
| | | â(CANCELED)â |
| | | ââââââââââ |
| | | ``` |
| | | |
| | | ### 4.2 éå®åºåºåï¼éå®åºåºï¼ |
| | | |
| | | ``` |
| | | âââââââââââââââ |
| | | â è稿 â |
| | | â (PREPARE) â |
| | | ââââââââ¬âââââââ |
| | | â submit |
| | | ââââââââââââââââââ¼âââââââââââââââââ |
| | | â â â |
| | | â (éè¦OQC) â â (ä¸éè¦OQC) |
| | | âââââââââââââ â âââââââââââââ |
| | | â å¾
æ£æµ â â â å¾
æ£è´§ â |
| | | â(CONFIRMED)â â â(APPROVING)â |
| | | âââââââ¬ââââââ â âââââââ¬ââââââ |
| | | â OQC宿 â â |
| | | âââââââââââââââââ â |
| | | â â stock |
| | | â â |
| | | âââââââââââââ âââââââââââââ |
| | | â å¾
æ£è´§ ââââââå¾
å¡«åè¿å â |
| | | â(APPROVING)â â (SHIPPING)â |
| | | âââââââââââââ âââââââ¬ââââââ |
| | | â shipping |
| | | â |
| | | âââââââââââââ |
| | | â å¾
æ§è¡åºåºâ |
| | | â(APPROVED) â |
| | | âââââââ¬ââââââ |
| | | â finish |
| | | â |
| | | âââââââââââââ |
| | | â 已宿 â |
| | | â(FINISHED) â |
| | | âââââââââââââ |
| | | ``` |
| | | |
| | | ### 4.3 è½¬ç§»è°æ¨å |
| | | |
| | | ``` |
| | | ââââââââââ submit ââââââââââââ ââââââââââ stock ââââââââââ finish ââââââââââ |
| | | â è稿 â âââââââââ â å¾
确认/ â âââââââââ â å¾
䏿¶ â âââââââ â å¾
æ§è¡ â âââââââ â 已宿 â |
| | | â(PREPARE)â â å¾
䏿¶ â â(APPROVING)â â(APPROVED)â â(FINISHED)â |
| | | ââââââââââ â(UNCONFIRMED/â ââââââââââ ââââââââââ ââââââââââ |
| | | â APPROVING) â |
| | | ââââââââââââââ |
| | | â |
| | | (é
鿍¡å¼å
å¾
确认) |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## äºãæ ¸å¿æå¡æ¶æ |
| | | |
| | | ### 5.1 æå¡åå± |
| | | |
| | | ``` |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â Controller å± â |
| | | â (MesWmItemReceiptController, MesWmProductSalesController) â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â |
| | | â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â Service å± â |
| | | â 主åServiceï¼ä¸å¡é»è¾ãç¶ææµè½¬ â |
| | | â è¡Serviceï¼åæ®è¡ç®¡ç â |
| | | â æç»Serviceï¼åæ®æç»ç®¡ç â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â |
| | | â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â æ ¸å¿åºåæå¡ â |
| | | â MesWmTransactionServiceï¼äºå¡æå¡ï¼å
¥åº/åºåºçæ ¸å¿ï¼ â |
| | | â MesWmMaterialStockServiceï¼åºåå°è´¦æå¡ â |
| | | â MesWmBatchServiceï¼æ¹æ¬¡æå¡ â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â |
| | | â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | â Mapper å± â |
| | | â (MesWmTransactionMapper, MesWmMaterialStockMapper) â |
| | | âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | ### 5.2 äºå¡æå¡æ ¸å¿æµç¨ |
| | | |
| | | ```java |
| | | // MesWmTransactionService#createTransaction |
| | | public Long createTransaction(MesWmTransactionSaveReqDTO reqDTO) { |
| | | // 1. è·åæå建åºåå°è´¦è®°å½ |
| | | MesWmMaterialStockDO stock = materialStockService.getOrCreateMaterialStock(...); |
| | | |
| | | // 2. æ ¡éªåºåæ°éï¼åºåºæ¶ï¼ |
| | | if (quantity < 0 && checkFlag) { |
| | | validateStockQuantity(stock, quantity); |
| | | } |
| | | |
| | | // 3. æ´æ°åºåå°è´¦æ°é |
| | | materialStockService.updateMaterialStockQuantity(stock.getId(), quantity); |
| | | |
| | | // 4. æå
¥äºå¡æµæ°´è®°å½ |
| | | MesWmTransactionDO transaction = convertToTransaction(reqDTO, stock); |
| | | transactionMapper.insert(transaction); |
| | | |
| | | return transaction.getId(); |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
ãåæ®ç»æè®¾è®¡ |
| | | |
| | | æ¯ç§ä¸å¡åæ®éç¨**ä¸è¡¨ç»æ**ï¼ |
| | | |
| | | ``` |
| | | ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ |
| | | â 主å表 â 1:n â è¡è¡¨ â 1:n â æç»è¡¨ â |
| | | â (xxxDO) âââââââ (xxxLineDO) âââââââ(xxxDetailDO) â |
| | | ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ |
| | | â â â |
| | | â â â |
| | | â â â |
| | | åæ®å¤´ä¿¡æ¯ æç©æåç» å
·ä½åºä½æç» |
| | | - åå· - ç©æID - åºä½ID |
| | | - ç¶æ - è®¡åæ°é - å®é
æ°é |
| | | - ä¾åºå/å®¢æ· - æ¹æ¬¡ä¿¡æ¯ - æ¹æ¬¡ä¿¡æ¯ |
| | | ``` |
| | | |
| | | **示ä¾ï¼éè´å
¥åºå** |
| | | |
| | | ``` |
| | | mes_wm_item_receiptï¼ä¸»åï¼ |
| | | âââ mes_wm_item_receipt_lineï¼è¡ï¼ |
| | | â âââ ç©æA - 计åå
¥åº100个 |
| | | â âââ ç©æB - 计åå
¥åº50个 |
| | | âââ mes_wm_item_receipt_detailï¼æç»ï¼ |
| | | âââ ç©æA - åºä½01 - 60个 |
| | | âââ ç©æA - åºä½02 - 40个 |
| | | âââ ç©æB - åºä½01 - 50个 |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## ä¸ãä¸å¤é¨æ¨¡åéæ |
| | | |
| | | ### 7.1 ERPéæï¼éè´å
¥åº/éå®åºåºï¼ |
| | | |
| | | ``` |
| | | ERPéè´å
¥åºå ââå®¡æ ¸âââ WmsStockApi.purchaseInbound() |
| | | â |
| | | â |
| | | æ¥æ¾ä»åºæ å°(ERPä»åºâMESä»åº) |
| | | â |
| | | â |
| | | æ¥æ¾ç©ææ å°(ERP产åbarCodeâMDMç©æbarCode) |
| | | â |
| | | â |
| | | å建MESåºåäºå¡ |
| | | â |
| | | â |
| | | MESåºåå¢å |
| | | ``` |
| | | |
| | | ### 7.2 ç产模åéæ |
| | | |
| | | ``` |
| | | ç产工å ââå®å·¥æ±æ¥âââ å建ç产å
¥åºå |
| | | â |
| | | â |
| | | ç产å
¥åºåå®¡æ ¸éè¿ |
| | | â |
| | | â |
| | | MESåºåå¢å ï¼äº§åå
¥åºï¼ |
| | | ``` |
| | | |
| | | ### 7.3 è´¨æ£æ¨¡åéæ |
| | | |
| | | ``` |
| | | éå®åºåºå ââæäº¤âââ æ£æ¥æ¯å¦éè¦OQCæ£éª |
| | | â â |
| | | â â (éè¦) |
| | | â å建OQCæ£éªå |
| | | â â |
| | | â â OQCéè¿ |
| | | â éå®åºåºåç¶ææµè½¬ |
| | | â â |
| | | â (ä¸éè¦) â |
| | | ç´æ¥å¾
æ£è´§ âââââââââââââ |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å
«ãå
³é®ä¸å¡è§å |
| | | |
| | | ### 8.1 åºåæ ¡éªè§å |
| | | |
| | | - åºåºæ¶å¿
é¡»æ ¡éªåºåæ¯å¦å
è¶³ |
| | | - æ¯æå»ç»åºåï¼è°æ¨é
鿍¡å¼ä¸å»ç»æºåºåï¼ |
| | | - åºä½æ··æ¾è§åæ ¡éªï¼å¯é
ç½®æ¯å¦å
è®¸ç©æ/æ¹æ¬¡æ··æ¾ï¼ |
| | | |
| | | ### 8.2 æ¹æ¬¡ç®¡ç |
| | | |
| | | - å
¥åºæ¶èªå¨çæææå®æ¹æ¬¡å· |
| | | - æ¹æ¬¡ä¿¡æ¯è·éåºåæµè½¬ |
| | | - æ¯ææ¹æ¬¡è¿½æº¯ |
| | | |
| | | ### 8.3 æ¡ç /SNç 管ç |
| | | |
| | | - å
¥åºæ¶èªå¨çææ¡ç è®°å½ |
| | | - SNç æ¯ææ¹éçæï¼ææ¹æ¬¡UUID管çï¼ |
| | | - æ¡ç ä¸åºåè®°å½å
³è |
| | | |
| | | --- |
| | | |
| | | ## ä¹ãæ°æ®åºè¡¨æ¸
å |
| | | |
| | | ### 9.1 åºç¡è®¾ç½® |
| | | |
| | | | 表å | 说æ | |
| | | |------|------| |
| | | | mes_wm_warehouse | ä»åº | |
| | | | mes_wm_warehouse_location | åºåº | |
| | | | mes_wm_warehouse_area | åºä½ | |
| | | | mes_wm_batch | æ¹æ¬¡ | |
| | | | mes_wm_barcode | æ¡ç | |
| | | | mes_wm_barcode_config | æ¡ç é
ç½® | |
| | | | mes_wm_sn | SNç | |
| | | |
| | | ### 9.2 åºåæ ¸å¿ |
| | | |
| | | | 表å | 说æ | |
| | | |------|------| |
| | | | mes_wm_material_stock | åºåå°è´¦ï¼ç°æéï¼ | |
| | | | mes_wm_transaction | åºåäºå¡æµæ°´ | |
| | | |
| | | ### 9.3 å
¥åºåæ® |
| | | |
| | | | 表å | 说æ | |
| | | |------|------| |
| | | | mes_wm_arrival_notice | å°è´§éç¥å | |
| | | | mes_wm_arrival_notice_line | å°è´§éç¥åè¡ | |
| | | | mes_wm_item_receipt | éè´å
¥åºå | |
| | | | mes_wm_item_receipt_line | éè´å
¥åºåè¡ | |
| | | | mes_wm_item_receipt_detail | éè´å
¥åºåæç» | |
| | | | mes_wm_product_receipt | ç产å
¥åºå | |
| | | | mes_wm_misc_receipt | æé¡¹å
¥åºå | |
| | | | mes_wm_outsource_receipt | å¤åå
¥åºå | |
| | | | mes_wm_return_sales | éå®éè´§å | |
| | | | mes_wm_return_issue | ç产éæå | |
| | | |
| | | ### 9.4 åºåºåæ® |
| | | |
| | | | 表å | 说æ | |
| | | |------|------| |
| | | | mes_wm_sales_notice | åè´§éç¥å | |
| | | | mes_wm_product_sales | éå®åºåºå | |
| | | | mes_wm_product_issue | çäº§é¢æå | |
| | | | mes_wm_misc_issue | æé¡¹åºåºå | |
| | | | mes_wm_outsource_issue | å¤ååæå | |
| | | | mes_wm_return_vendor | éè´éè´§å | |
| | | |
| | | ### 9.5 è°æ¨çç¹ |
| | | |
| | | | 表å | 说æ | |
| | | |------|------| |
| | | | mes_wm_transfer | è½¬ç§»è°æ¨å | |
| | | | mes_wm_stock_taking_plan | çç¹è®¡å | |
| | | | mes_wm_stock_taking_task | çç¹ä»»å¡ | |
| | | | mes_wm_stock_taking_task_line | çç¹ä»»å¡è¡ | |
| | | | mes_wm_stock_taking_task_result | çç¹ç»æ | |
| | | |
| | | --- |
| | | |
| | | ## åãæ¥å£æéåç¼ |
| | | |
| | | | 模å | æéåç¼ | |
| | | |------|---------| |
| | | | ä»åºè®¾ç½® | mes:wm-warehouse | |
| | | | éè´å
¥åº | mes:wm-item-receipt | |
| | | | éå®åºåº | mes:wm-product-sales | |
| | | | çäº§é¢æ | mes:wm-product-issue | |
| | | | ç产å
¥åº | mes:wm-product-receipt | |
| | | | è½¬ç§»è°æ¨ | mes:wm-transfer | |
| | | | åºåç°æé | mes:wm-material-stock | |
| | | | çç¹ | mes:wm-stock-taking | |
| | | |
| | | --- |
| | | |
| | | ## åä¸ãå
³é®æä¸¾è¯´æ |
| | | |
| | | ### 11.1 éç¨ç¶æå¸¸é |
| | | |
| | | ```java |
| | | MesOrderStatusConstants: |
| | | PREPARE = 0 // è稿 |
| | | APPROVING = 10 // å¾
审æ¹/å¾
䏿¶/å¾
æ£è´§ |
| | | CONFIRMED = 5 // å¾
确认/å¾
æ£æµ |
| | | APPROVED = 20 // 已审æ¹/å¾
æ§è¡ |
| | | FINISHED = 30 // 已宿 |
| | | CANCELLED = 40 // 已忶 |
| | | ``` |
| | | |
| | | ### 11.2 ä¸å¡ç±»å常é |
| | | |
| | | ```java |
| | | MesBizTypeConstants: |
| | | WM_ITEM_RECEIPT_IN = 110 // éè´å
¥åº |
| | | WM_TRANSFER_OUT = 111 // è°æ¨åºåº |
| | | WM_TRANSFER_IN = 112 // è°æ¨å
¥åº |
| | | WM_PRODUCT_SALES = 118 // éå®åºåº |
| | | WM_ISSUE = 115 // çäº§é¢æ |
| | | WM_PRODUCT_RECPT = 117 // ç产å
¥åº |
| | | ... |
| | | ``` |
| | |
| | | <!-- <module>yudao-module-iot</module>--> |
| | | <module>yudao-module-mes</module> |
| | | <module>yudao-module-wms</module> |
| | | <module>yudao-module-wms-api</module> |
| | | <module>yudao-module-im</module> |
| | | <!-- MDM ä¸»æ°æ®ç®¡ç模å --> |
| | | <module>yudao-module-mdm-api</module> |
| | | <module>yudao-module-mdm</module> |
| | | <!-- HRM 人åèµæºç®¡ç模å --> |
| | | <module>yudao-module-hrm-api</module> |
| | | <module>yudao-module-hrm</module> |
| | | <!-- 请åè https://doc.iocoder.cn/ai/build/ ææ¡£ï¼å®æ AI 模åçå¯å¨ï¼ï¼ï¼ --> |
| | | <!-- <module>yudao-module-ai</module>--> |
| | | </modules> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- ERPä»åºä¸MESä»åºæ å°è¡¨ |
| | | -- ============================================= |
| | | |
| | | CREATE TABLE IF NOT EXISTS erp_mes_warehouse_mapping ( |
| | | id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主é®ID', |
| | | erp_warehouse_id BIGINT NOT NULL COMMENT 'ERPä»åºID', |
| | | erp_warehouse_name VARCHAR(255) COMMENT 'ERPä»åºåç§°ï¼åä½ï¼', |
| | | mes_warehouse_id BIGINT NOT NULL COMMENT 'MESä»åºID', |
| | | mes_warehouse_name VARCHAR(255) COMMENT 'MESä»åºåç§°ï¼åä½ï¼', |
| | | status TINYINT DEFAULT 1 COMMENT 'ç¶æï¼1-å¯ç¨ 0-ç¦ç¨ï¼', |
| | | creator VARCHAR(64) DEFAULT '' COMMENT 'å建è
', |
| | | create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | updater VARCHAR(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | deleted BIT DEFAULT 0 COMMENT 'æ¯å¦å é¤', |
| | | UNIQUE KEY uk_erp_warehouse (erp_warehouse_id), |
| | | INDEX idx_mes_warehouse (mes_warehouse_id) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERPä»åºä¸MESä»åºæ å°è¡¨'; |
| | | |
| | | -- ============================================= |
| | | -- 说æï¼ |
| | | -- 1. æ¤è¡¨ç¨äºå»ºç«ERPä»åºä¸MESä»åºçæ å°å
³ç³» |
| | | -- 2. ä¸ä¸ªERPä»åºåªè½æ å°å°ä¸ä¸ªMESä»åº |
| | | -- 3. æ å°å»ºç«åï¼ERPéè´å
¥åº/éå®åºåºå®¡æ ¸æ¶ä¼èªå¨æ´æ°å¯¹åºçMESåºå |
| | | -- ============================================= |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- HRM èå¤ç®¡çè¡¥å
SQL åå§åèæ¬ |
| | | -- å
å«è忥é
ç½®ãèå¤ç»è®¡æ±æ»è¡¨ãèåæé |
| | | -- ============================================= |
| | | |
| | | -- 1. è忥é
置表 |
| | | CREATE TABLE IF NOT EXISTS `hrm_attendance_holiday` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'è忥ID', |
| | | `name` varchar(100) NOT NULL COMMENT 'è忥åç§°', |
| | | `date` date NOT NULL COMMENT 'æ¥æ', |
| | | `type` tinyint NOT NULL DEFAULT 1 COMMENT 'ç±»åï¼1-伿¯æ¥ï¼2-工使¥', |
| | | `is_legal` tinyint NOT NULL DEFAULT 0 COMMENT 'æ¯å¦æ³å®è忥ï¼0-å¦ï¼1-æ¯', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_date` (`date`, `deleted`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMèå¤è忥é
置表'; |
| | | |
| | | -- 2. èå¤ç»è®¡æ±æ»è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_attendance_summary` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'æ±æ»ID', |
| | | `user_id` bigint NOT NULL COMMENT 'åå·¥ID', |
| | | `dept_id` bigint NOT NULL COMMENT 'é¨é¨ID', |
| | | `year_month` varchar(7) NOT NULL COMMENT 'å¹´æï¼æ ¼å¼ï¼yyyy-MM', |
| | | `work_days` int NOT NULL DEFAULT 0 COMMENT 'åºåºå¤å¤©æ°', |
| | | `actual_days` int NOT NULL DEFAULT 0 COMMENT 'å®é
åºå¤å¤©æ°', |
| | | `late_count` int NOT NULL DEFAULT 0 COMMENT 'è¿å°æ¬¡æ°', |
| | | `early_count` int NOT NULL DEFAULT 0 COMMENT 'æ©é次æ°', |
| | | `absent_count` int NOT NULL DEFAULT 0 COMMENT 'ç¼ºå¡æ¬¡æ°', |
| | | `overtime_hours` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT 'å çæ¶é¿ï¼å°æ¶ï¼', |
| | | `leave_hours` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT 'è¯·åæ¶é¿ï¼å°æ¶ï¼', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_user_year_month` (`user_id`, `year_month`, `deleted`), |
| | | KEY `idx_dept_year_month` (`dept_id`, `year_month`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMèå¤ç»è®¡æ±æ»è¡¨'; |
| | | |
| | | -- ============================================= |
| | | -- 3. èåæé |
| | | -- ============================================= |
| | | |
| | | -- 3.1 èå¤è§åèå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6013, 'èå¤è§å', '', 2, 0, 6010, 'rule', 'ep:setting', 'hrm/attendance/rule/index', 'HrmAttendanceRule', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60131, 'èå¤è§åæ¥è¯¢', 'hrm:attendance:query', 3, 1, 6013, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60132, 'èå¤è§åæ°å¢', 'hrm:attendance:create', 3, 2, 6013, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60133, 'èå¤è§åä¿®æ¹', 'hrm:attendance:update', 3, 3, 6013, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60134, 'èå¤è§åå é¤', 'hrm:attendance:delete', 3, 4, 6013, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60135, 'èå¤è§å导åº', 'hrm:attendance:export', 3, 5, 6013, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 3.2 è忥é
ç½®èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6014, 'è忥é
ç½®', '', 2, 3, 6010, 'holiday', 'ep:calendar', 'hrm/attendance/holiday/index', 'HrmAttendanceHoliday', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60141, 'è忥é
ç½®æ¥è¯¢', 'hrm:attendance:query', 3, 1, 6014, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60142, 'è忥é
ç½®æ°å¢', 'hrm:attendance:create', 3, 2, 6014, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60143, 'è忥é
置修æ¹', 'hrm:attendance:update', 3, 3, 6014, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60144, 'è忥é
ç½®å é¤', 'hrm:attendance:delete', 3, 4, 6014, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60145, 'è忥é
置导åº', 'hrm:attendance:export', 3, 5, 6014, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 3.3 èå¤ç»è®¡æ±æ»èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6015, 'èå¤ç»è®¡', '', 2, 4, 6010, 'summary', 'ep:data-analysis', 'hrm/attendance/summary/index', 'HrmAttendanceSummary', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60151, 'èå¤ç»è®¡æ¥è¯¢', 'hrm:attendance:query', 3, 1, 6015, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60152, 'èå¤ç»è®¡çæ', 'hrm:attendance:calculate', 3, 2, 6015, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60153, 'èå¤ç»è®¡å¯¼åº', 'hrm:attendance:export', 3, 3, 6015, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 3.4 æå¡æé |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60114, 'æå¡', 'hrm:attendance:clock', 3, 4, 6011, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- ============================================= |
| | | -- 4. è§è²èåå
³è |
| | | -- ============================================= |
| | | |
| | | -- ç»è§è² ID=1ï¼è¶
级管çåï¼åé
æ°å¢çèåæé |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6013, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60131, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60132, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60133, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60134, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60135, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6014, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60141, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60142, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60143, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60144, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60145, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6015, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60151, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60152, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60153, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60114, '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- ============================================= |
| | | -- 5. BPM 审æ¹åç±»é
ç½®ï¼å¯éï¼ |
| | | -- ============================================= |
| | | |
| | | -- è¡¥å¡å®¡æ¹åç±» |
| | | INSERT INTO `bpm_category` (`id`, `name`, `code`, `description`, `status`, `sort`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (200, 'èå¤å¼å¸¸å®¡æ¹', 'hrm_attendance_approve', 'HRMèå¤å¼å¸¸å®¡æ¹åç±»', 0, 50, '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- ============================================= |
| | | -- æ§è¡å®ææç¤º |
| | | -- ============================================= |
| | | SELECT 'HRM èå¤ç®¡çè¡¥å
SQL åå§å宿ï¼' AS result; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- 社ä¿å
¬ç§¯éä¸ªç¨æ£é¤åè½ SQL |
| | | -- ============================================= |
| | | |
| | | -- 1. 社ä¿å
¬ç§¯éé
置表ï¼å
¨å±é
ç½®ï¼ |
| | | CREATE TABLE IF NOT EXISTS `hrm_social_security_config` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'é
ç½®ID', |
| | | `name` varchar(100) NOT NULL COMMENT 'é
ç½®åç§°', |
| | | `effective_date` date NOT NULL COMMENT 'çææ¥æ', |
| | | -- å
»èä¿é© |
| | | `pension_company_ratio` decimal(5,4) NOT NULL DEFAULT 0.16 COMMENT 'å
»èä¿é©ä¼ä¸ç¼´çº³æ¯ä¾', |
| | | `pension_personal_ratio` decimal(5,4) NOT NULL DEFAULT 0.08 COMMENT 'å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾', |
| | | -- å»çä¿é© |
| | | `medical_company_ratio` decimal(5,4) NOT NULL DEFAULT 0.095 COMMENT 'å»çä¿é©ä¼ä¸ç¼´çº³æ¯ä¾', |
| | | `medical_personal_ratio` decimal(5,4) NOT NULL DEFAULT 0.02 COMMENT 'å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾', |
| | | -- 失ä¸ä¿é© |
| | | `unemployment_company_ratio` decimal(5,4) NOT NULL DEFAULT 0.005 COMMENT '失ä¸ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾', |
| | | `unemployment_personal_ratio` decimal(5,4) NOT NULL DEFAULT 0.005 COMMENT '失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾', |
| | | -- 工伤ä¿é©ï¼ä»
ä¼ä¸ç¼´çº³ï¼ |
| | | `work_injury_ratio` decimal(5,4) NOT NULL DEFAULT 0.005 COMMENT '工伤ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾', |
| | | -- çè²ä¿é©ï¼ä»
ä¼ä¸ç¼´çº³ï¼ |
| | | `maternity_ratio` decimal(5,4) NOT NULL DEFAULT 0.005 COMMENT 'çè²ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾', |
| | | -- å
¬ç§¯é |
| | | `housing_fund_company_ratio` decimal(5,4) NOT NULL DEFAULT 0.12 COMMENT 'å
¬ç§¯éä¼ä¸ç¼´çº³æ¯ä¾', |
| | | `housing_fund_personal_ratio` decimal(5,4) NOT NULL DEFAULT 0.12 COMMENT 'å
¬ç§¯é个人缴纳æ¯ä¾', |
| | | -- 社ä¿åºæ°ä¸ä¸é |
| | | `social_security_base_min` decimal(12,2) NOT NULL COMMENT '社ä¿åºæ°ä¸é', |
| | | `social_security_base_max` decimal(12,2) NOT NULL COMMENT '社ä¿åºæ°ä¸é', |
| | | -- å
¬ç§¯éåºæ°ä¸ä¸é |
| | | `housing_fund_base_min` decimal(12,2) NOT NULL COMMENT 'å
¬ç§¯éåºæ°ä¸é', |
| | | `housing_fund_base_max` decimal(12,2) NOT NULL COMMENT 'å
¬ç§¯éåºæ°ä¸é', |
| | | -- ç¶æ |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_effective_date` (`effective_date`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRM社ä¿å
¬ç§¯éé
置表'; |
| | | |
| | | -- 2. 个ç¨ç¨çé
置表ï¼ç´¯è¿ç¨çï¼ |
| | | CREATE TABLE IF NOT EXISTS `hrm_tax_rate_config` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'é
ç½®ID', |
| | | `name` varchar(100) NOT NULL COMMENT 'é
ç½®åç§°', |
| | | `effective_date` date NOT NULL COMMENT 'çææ¥æ', |
| | | `level` tinyint NOT NULL COMMENT 'ç¨ç级æ°ï¼1-7', |
| | | `min_amount` decimal(12,2) NOT NULL COMMENT 'åºçº³ç¨æå¾é¢ä¸éï¼å«ï¼', |
| | | `max_amount` decimal(12,2) NOT NULL COMMENT 'åºçº³ç¨æå¾é¢ä¸éï¼ä¸å«ï¼ï¼0表示æ ä¸é', |
| | | `tax_rate` decimal(5,4) NOT NULL COMMENT 'ç¨ç', |
| | | `quick_deduction` decimal(12,2) NOT NULL DEFAULT 0 COMMENT 'éç®æ£é¤æ°', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_effective_date` (`effective_date`), |
| | | KEY `idx_level` (`level`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRM个ç¨ç¨çé
置表'; |
| | | |
| | | -- 3. å工社ä¿å
¬ç§¯éæ¡£æ¡è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_employee_social_security` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'æ¡£æ¡ID', |
| | | `user_id` bigint NOT NULL COMMENT 'åå·¥ID', |
| | | `social_security_base` decimal(12,2) NOT NULL COMMENT '社ä¿ç¼´çº³åºæ°', |
| | | `housing_fund_base` decimal(12,2) NOT NULL COMMENT 'å
¬ç§¯éç¼´çº³åºæ°', |
| | | `effective_date` date NOT NULL COMMENT 'çææ¥æ', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_user_effective` (`user_id`, `effective_date`), |
| | | KEY `idx_user_id` (`user_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMå工社ä¿å
¬ç§¯éæ¡£æ¡è¡¨'; |
| | | |
| | | -- ============================================= |
| | | -- åå§åæ°æ® |
| | | -- ============================================= |
| | | |
| | | -- åå§å社ä¿å
¬ç§¯éé
ç½®ï¼2024å¹´æ åï¼ç¤ºä¾æ°æ®ï¼ |
| | | INSERT INTO `hrm_social_security_config` |
| | | (`name`, `effective_date`, `pension_company_ratio`, `pension_personal_ratio`, |
| | | `medical_company_ratio`, `medical_personal_ratio`, |
| | | `unemployment_company_ratio`, `unemployment_personal_ratio`, |
| | | `work_injury_ratio`, `maternity_ratio`, |
| | | `housing_fund_company_ratio`, `housing_fund_personal_ratio`, |
| | | `social_security_base_min`, `social_security_base_max`, |
| | | `housing_fund_base_min`, `housing_fund_base_max`, |
| | | `status`, `remark`, `creator`, `updater`) |
| | | VALUES |
| | | ('2024年社ä¿å
¬ç§¯éæ å', '2024-01-01', |
| | | 0.16, 0.08, -- å
»èï¼ä¼ä¸16%ï¼ä¸ªäºº8% |
| | | 0.095, 0.02, -- å»çï¼ä¼ä¸9.5%ï¼ä¸ªäºº2% |
| | | 0.005, 0.005, -- 失ä¸ï¼ä¼ä¸0.5%ï¼ä¸ªäºº0.5% |
| | | 0.005, 0.005, -- 工伤0.5%ï¼çè²0.5%ï¼ä»
ä¼ä¸ï¼ |
| | | 0.12, 0.12, -- å
¬ç§¯éï¼ä¼ä¸12%ï¼ä¸ªäºº12% |
| | | 4494.00, 28017.00, -- 社ä¿åºæ°ï¼ä¸é4494ï¼ä¸é28017 |
| | | 2420.00, 35091.00, -- å
¬ç§¯éåºæ°ï¼ä¸é2420ï¼ä¸é35091 |
| | | 0, '2024å¹´åéå¸ç¤¾ä¿å
¬ç§¯é缴纳æ å', '1', '1'); |
| | | |
| | | -- åå§å个ç¨ç¨ç表ï¼2024å¹´æ åï¼ |
| | | INSERT INTO `hrm_tax_rate_config` |
| | | (`name`, `effective_date`, `level`, `min_amount`, `max_amount`, `tax_rate`, `quick_deduction`, `status`, `remark`, `creator`, `updater`) |
| | | VALUES |
| | | ('2024年个ç¨ç¨ç表', '2024-01-01', 1, 0, 36000, 0.03, 0, 0, 'ä¸è¶
è¿36000å
', '1', '1'), |
| | | ('2024年个ç¨ç¨ç表', '2024-01-01', 2, 36000, 144000, 0.10, 2520, 0, 'è¶
è¿36000å
è³144000å
', '1', '1'), |
| | | ('2024年个ç¨ç¨ç表', '2024-01-01', 3, 144000, 300000, 0.20, 16920, 0, 'è¶
è¿144000å
è³300000å
', '1', '1'), |
| | | ('2024年个ç¨ç¨ç表', '2024-01-01', 4, 300000, 420000, 0.25, 31920, 0, 'è¶
è¿300000å
è³420000å
', '1', '1'), |
| | | ('2024年个ç¨ç¨ç表', '2024-01-01', 5, 420000, 660000, 0.30, 52920, 0, 'è¶
è¿420000å
è³660000å
', '1', '1'), |
| | | ('2024年个ç¨ç¨ç表', '2024-01-01', 6, 660000, 960000, 0.35, 85920, 0, 'è¶
è¿660000å
è³960000å
', '1', '1'), |
| | | ('2024年个ç¨ç¨ç表', '2024-01-01', 7, 960000, 0, 0.45, 181920, 0, 'è¶
è¿960000å
', '1', '1'); |
| | | |
| | | -- ============================================= |
| | | -- èåæé |
| | | -- ============================================= |
| | | |
| | | -- 社ä¿å
¬ç§¯éé
ç½®èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6023, '社ä¿å
¬ç§¯éé
ç½®', '', 2, 3, 6020, 'social-security', 'ep:setting', 'hrm/salary/social-security/index', 'HrmSocialSecurityConfig', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60231, '社ä¿é
ç½®æ¥è¯¢', 'hrm:social-security:query', 3, 1, 6023, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60232, '社ä¿é
ç½®æ°å¢', 'hrm:social-security:create', 3, 2, 6023, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60233, '社ä¿é
置修æ¹', 'hrm:social-security:update', 3, 3, 6023, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60234, '社ä¿é
ç½®å é¤', 'hrm:social-security:delete', 3, 4, 6023, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 个ç¨ç¨çé
ç½®èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6024, '个ç¨ç¨çé
ç½®', '', 2, 4, 6020, 'tax-rate', 'ep:document', 'hrm/salary/tax-rate/index', 'HrmTaxRateConfig', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60241, '个ç¨é
ç½®æ¥è¯¢', 'hrm:tax-rate:query', 3, 1, 6024, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60242, '个ç¨é
ç½®æ°å¢', 'hrm:tax-rate:create', 3, 2, 6024, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60243, '个ç¨é
置修æ¹', 'hrm:tax-rate:update', 3, 3, 6024, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60244, '个ç¨é
ç½®å é¤', 'hrm:tax-rate:delete', 3, 4, 6024, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- è§è²èåå
³è |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6023, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60231, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60232, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60233, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60234, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6024, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60241, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60242, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60243, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60244, '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | SELECT '社ä¿å
¬ç§¯éä¸ªç¨æ£é¤åè½ SQL åå§å宿ï¼' AS result; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- å工社ä¿å
¬ç§¯éæ¡£æ¡è¡¨éæ°è®¾è®¡ |
| | | -- ä¸ä¸ªç¤¾ä¿æ¹æ¡å¯ä»¥ç»å®å¤ä¸ªåå·¥ï¼ä¸ä¸ªåå·¥ç»å®ä¸ä¸ªç¤¾ä¿æ¹æ¡ |
| | | -- ============================================= |
| | | |
| | | -- å 餿§è¡¨ï¼å¦æåå¨ï¼ |
| | | DROP TABLE IF EXISTS `hrm_employee_social_security`; |
| | | |
| | | -- å建å工社ä¿å
¬ç§¯éæ¡£æ¡è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_employee_social_security` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'æ¡£æ¡ID', |
| | | `user_id` bigint NOT NULL COMMENT 'ç³»ç»ç¨æ·ID', |
| | | |
| | | -- ç»å®ç社ä¿å
¬ç§¯éæ¹æ¡ID |
| | | `social_security_scheme_id` bigint NOT NULL COMMENT '社ä¿å
¬ç§¯éæ¹æ¡ID', |
| | | |
| | | -- ç¼´çº³åºæ°ï¼å工个æ§åè®¾ç½®ï¼ |
| | | `social_security_base` decimal(12,2) NOT NULL COMMENT '社ä¿ç¼´çº³åºæ°', |
| | | `housing_fund_base` decimal(12,2) NOT NULL COMMENT 'å
¬ç§¯éç¼´çº³åºæ°', |
| | | |
| | | -- çæä¿¡æ¯ |
| | | `effective_date` date NOT NULL COMMENT 'çææ¥æ', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_user_effective` (`user_id`, `effective_date`), |
| | | KEY `idx_user_id` (`user_id`), |
| | | KEY `idx_scheme_id` (`social_security_scheme_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMå工社ä¿å
¬ç§¯éæ¡£æ¡è¡¨'; |
| | | |
| | | -- ============================================= |
| | | -- 社ä¿å
¬ç§¯éæ¹æ¡è¡¨ï¼åå
¨å±é
置表æ¹ä¸ºæ¹æ¡è¡¨ï¼ |
| | | -- ä¸ä¸ªæ¹æ¡å¯ä»¥è¢«å¤ä¸ªåå·¥ç»å® |
| | | -- ============================================= |
| | | |
| | | -- å 餿§è¡¨ |
| | | DROP TABLE IF EXISTS `hrm_social_security_config`; |
| | | |
| | | -- å建社ä¿å
¬ç§¯éæ¹æ¡è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_social_security_scheme` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'æ¹æ¡ID', |
| | | `name` varchar(100) NOT NULL COMMENT 'æ¹æ¡åç§°', |
| | | `effective_date` date NOT NULL COMMENT 'çææ¥æ', |
| | | |
| | | -- å
»èä¿é©æ¯ä¾ |
| | | `pension_company_ratio` decimal(5,4) NOT NULL DEFAULT 0.16 COMMENT 'å
»èä¿é©ä¼ä¸ç¼´çº³æ¯ä¾', |
| | | `pension_personal_ratio` decimal(5,4) NOT NULL DEFAULT 0.08 COMMENT 'å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾', |
| | | |
| | | -- å»çä¿é©æ¯ä¾ |
| | | `medical_company_ratio` decimal(5,4) NOT NULL DEFAULT 0.095 COMMENT 'å»çä¿é©ä¼ä¸ç¼´çº³æ¯ä¾', |
| | | `medical_personal_ratio` decimal(5,4) NOT NULL DEFAULT 0.02 COMMENT 'å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾', |
| | | |
| | | -- 失ä¸ä¿é©æ¯ä¾ |
| | | `unemployment_company_ratio` decimal(5,4) NOT NULL DEFAULT 0.005 COMMENT '失ä¸ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾', |
| | | `unemployment_personal_ratio` decimal(5,4) NOT NULL DEFAULT 0.005 COMMENT '失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾', |
| | | |
| | | -- 工伤ä¿é©æ¯ä¾ï¼ä»
ä¼ä¸ç¼´çº³ï¼ |
| | | `work_injury_ratio` decimal(5,4) NOT NULL DEFAULT 0.005 COMMENT '工伤ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾', |
| | | |
| | | -- çè²ä¿é©æ¯ä¾ï¼ä»
ä¼ä¸ç¼´çº³ï¼ |
| | | `maternity_ratio` decimal(5,4) NOT NULL DEFAULT 0.005 COMMENT 'çè²ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾', |
| | | |
| | | -- å
¬ç§¯éæ¯ä¾ |
| | | `housing_fund_company_ratio` decimal(5,4) NOT NULL DEFAULT 0.12 COMMENT 'å
¬ç§¯éä¼ä¸ç¼´çº³æ¯ä¾', |
| | | `housing_fund_personal_ratio` decimal(5,4) NOT NULL DEFAULT 0.12 COMMENT 'å
¬ç§¯é个人缴纳æ¯ä¾', |
| | | |
| | | -- ç¶æ |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_effective_date` (`effective_date`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRM社ä¿å
¬ç§¯éæ¹æ¡è¡¨'; |
| | | |
| | | -- ============================================= |
| | | -- åå§åé»è®¤æ¹æ¡ |
| | | -- ============================================= |
| | | |
| | | INSERT INTO `hrm_social_security_scheme` |
| | | (`name`, `effective_date`, |
| | | `pension_company_ratio`, `pension_personal_ratio`, |
| | | `medical_company_ratio`, `medical_personal_ratio`, |
| | | `unemployment_company_ratio`, `unemployment_personal_ratio`, |
| | | `work_injury_ratio`, `maternity_ratio`, |
| | | `housing_fund_company_ratio`, `housing_fund_personal_ratio`, |
| | | `status`, `remark`, `creator`, `updater`) |
| | | VALUES |
| | | ('2024å¹´åé叿 å', '2024-01-01', |
| | | 0.16, 0.08, |
| | | 0.095, 0.02, |
| | | 0.005, 0.005, |
| | | 0.005, 0.005, |
| | | 0.12, 0.12, |
| | | 0, '2024å¹´åéå¸ç¤¾ä¿å
¬ç§¯é缴纳æ å', '1', '1'); |
| | | |
| | | SELECT 'å工社ä¿å
¬ç§¯éæ¡£æ¡è¡¨éæ°è®¾è®¡å®æï¼' AS result; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- HRM åå·¥è¡¨ç»æåæ´ SQL |
| | | -- 1. å é¤ user_id åæ®µ |
| | | -- 2. æ·»å ææºå·å¯ä¸ç´¢å¼ |
| | | -- 3. æ·»å åºæ¬å·¥èµå段 |
| | | -- 4. æ·»å è§è²IDåè¡¨åæ®µ |
| | | -- ============================================= |
| | | |
| | | -- 1. å é¤ user_id ç¸å
³çå¯ä¸ç´¢å¼ |
| | | ALTER TABLE `hrm_employee` DROP INDEX `uk_user_id`; |
| | | |
| | | -- 2. å é¤ user_id åæ®µ |
| | | ALTER TABLE `hrm_employee` DROP COLUMN `user_id`; |
| | | |
| | | -- 3. æ·»å ææºå·å¯ä¸ç´¢å¼ |
| | | ALTER TABLE `hrm_employee` ADD UNIQUE INDEX `uk_phone` (`phone`); |
| | | |
| | | -- 4. æ·»å åºæ¬å·¥èµå段 |
| | | ALTER TABLE `hrm_employee` ADD COLUMN `base_salary` decimal(12,2) DEFAULT NULL COMMENT 'åºæ¬å·¥èµ' AFTER `salary_structure_id`; |
| | | |
| | | -- 5. æ·»å è§è²IDåè¡¨åæ®µï¼JSONæ ¼å¼åå¨ï¼ |
| | | ALTER TABLE `hrm_employee` ADD COLUMN `role_ids` varchar(500) DEFAULT NULL COMMENT 'è§è²IDå表ï¼JSONæ ¼å¼ï¼' AFTER `base_salary`; |
| | | |
| | | -- æ§è¡å®ææç¤º |
| | | SELECT 'HRM åå·¥è¡¨ç»æåæ´å®æï¼' AS result; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- 请åç±»åæ£æ¬¾é
置表 |
| | | CREATE TABLE IF NOT EXISTS hrm_leave_type_config ( |
| | | id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主é®', |
| | | leave_type INT NOT NULL COMMENT '请åç±»åï¼1-äºå, 2-ç
å, 3-å¹´å, 4-å©å, 5-产å, 6-丧å', |
| | | name VARCHAR(32) NOT NULL COMMENT 'ç±»ååç§°', |
| | | deduction_ratio DECIMAL(5,4) NOT NULL DEFAULT 0.0000 COMMENT 'æ£æ¬¾æ¯ä¾ï¼0-1ä¹é´ï¼å¦0.5表示æ£50%ï¼', |
| | | remark VARCHAR(255) DEFAULT NULL COMMENT '夿³¨', |
| | | status INT NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¯ç¨, 1-ç¦ç¨', |
| | | create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | update_time DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | creator VARCHAR(64) DEFAULT '' COMMENT 'å建人', |
| | | updater VARCHAR(64) DEFAULT '' COMMENT 'æ´æ°äºº', |
| | | deleted BIT NOT NULL DEFAULT 0 COMMENT 'æ¯å¦å é¤' |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '请åç±»åæ£æ¬¾é
ç½®'; |
| | | |
| | | -- åå§åé»è®¤æ°æ® |
| | | INSERT INTO hrm_leave_type_config (leave_type, name, deduction_ratio, remark, status) VALUES |
| | | (1, 'äºå', 1.0000, 'å
¨é¢æ£æ¬¾', 0), |
| | | (2, 'ç
å', 0.5000, 'æ50%æ£æ¬¾', 0), |
| | | (3, 'å¹´å', 0.0000, '䏿£æ¬¾', 0), |
| | | (4, 'å©å', 0.0000, '䏿£æ¬¾', 0), |
| | | (5, '产å', 0.0000, '䏿£æ¬¾', 0), |
| | | (6, '丧å', 0.0000, '䏿£æ¬¾', 0); |
| | | |
| | | -- èªé
¬æ ¸ç®è¡¨æ·»å è¯·åæ£æ¬¾åæ®µ |
| | | ALTER TABLE hrm_salary_calculation ADD COLUMN leave_deduction DECIMAL(10,2) DEFAULT 0.00 COMMENT 'è¯·åæ£æ¬¾' AFTER other_deduction; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- HRM 人åèµæºæ¨¡å SQL åå§åèæ¬ |
| | | -- å
å«äººäºå®¡æ¹ãèå¤ç®¡çãèªé
¬ç®¡çç¸å
³è¡¨ |
| | | -- ============================================= |
| | | |
| | | -- ============================================= |
| | | -- 1. åºç¡ä¿¡æ¯æ¨¡å表 |
| | | -- ============================================= |
| | | |
| | | -- 1.1 å工信æ¯è¡¨ï¼æ©å±ä¿¡æ¯ï¼ |
| | | CREATE TABLE IF NOT EXISTS `hrm_employee` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åå·¥ID', |
| | | `user_id` bigint NOT NULL COMMENT 'å
³èç³»ç»ç¨æ·ID', |
| | | `dept_id` bigint NOT NULL COMMENT 'é¨é¨ID', |
| | | `post_id` bigint DEFAULT NULL COMMENT 'å²ä½ID', |
| | | `employee_no` varchar(32) NOT NULL COMMENT 'åå·¥ç¼å·', |
| | | `name` varchar(100) NOT NULL COMMENT 'åå·¥å§å', |
| | | `gender` tinyint DEFAULT NULL COMMENT 'æ§å«ï¼1-ç·ï¼2-女', |
| | | `birthday` date DEFAULT NULL COMMENT 'åºçæ¥æ', |
| | | `phone` varchar(20) DEFAULT NULL COMMENT 'ææºå·ç ', |
| | | `email` varchar(100) DEFAULT NULL COMMENT 'é®ç®±', |
| | | `id_card` varchar(20) DEFAULT NULL COMMENT '身份è¯å·', |
| | | `hire_date` date NOT NULL COMMENT 'å
¥èæ¥æ', |
| | | `regular_date` date DEFAULT NULL COMMENT 'è½¬æ£æ¥æ', |
| | | `leave_date` date DEFAULT NULL COMMENT 'ç¦»èæ¥æ', |
| | | `employee_status` tinyint NOT NULL DEFAULT 1 COMMENT 'åå·¥ç¶æï¼1-å¨èï¼2-è¯ç¨ï¼3-离è', |
| | | `annual_leave_balance` decimal(4,2) DEFAULT 0 COMMENT 'å¹´åä½é¢ï¼å¤©ï¼', |
| | | `sick_leave_balance` decimal(4,2) DEFAULT 0 COMMENT 'ç
åä½é¢ï¼å¤©ï¼', |
| | | `salary_structure_id` bigint DEFAULT NULL COMMENT 'èªé
ȾID', |
| | | `bank_name` varchar(100) DEFAULT NULL COMMENT '弿·é¶è¡', |
| | | `bank_account` varchar(50) DEFAULT NULL COMMENT 'é¶è¡è´¦å·', |
| | | `address` varchar(200) DEFAULT NULL COMMENT 'å±
ä½å°å', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_user_id` (`user_id`), |
| | | UNIQUE KEY `uk_employee_no` (`employee_no`), |
| | | KEY `idx_dept_id` (`dept_id`), |
| | | KEY `idx_employee_status` (`employee_status`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMå工信æ¯è¡¨'; |
| | | |
| | | -- 1.2 åå·¥æè²ç»å表 |
| | | CREATE TABLE IF NOT EXISTS `hrm_employee_education` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'è®°å½ID', |
| | | `employee_id` bigint NOT NULL COMMENT 'åå·¥ID', |
| | | `school_name` varchar(100) NOT NULL COMMENT '妿 ¡åç§°', |
| | | `major` varchar(100) DEFAULT NULL COMMENT 'ä¸ä¸', |
| | | `degree` tinyint NOT NULL COMMENT 'å¦åï¼1-é«ä¸ï¼2-大ä¸ï¼3-æ¬ç§ï¼4-ç¡å£«ï¼5-å士', |
| | | `start_date` date NOT NULL COMMENT 'å
¥å¦æ¶é´', |
| | | `end_date` date NOT NULL COMMENT 'æ¯ä¸æ¶é´', |
| | | `certificate_no` varchar(50) DEFAULT NULL COMMENT 'è¯ä¹¦ç¼å·', |
| | | `remark` varchar(200) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_employee_id` (`employee_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMåå·¥æè²ç»å表'; |
| | | |
| | | -- 1.3 å工工ä½ç»å表 |
| | | CREATE TABLE IF NOT EXISTS `hrm_employee_work_history` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'è®°å½ID', |
| | | `employee_id` bigint NOT NULL COMMENT 'åå·¥ID', |
| | | `company_name` varchar(100) NOT NULL COMMENT 'å
¬å¸åç§°', |
| | | `position` varchar(100) NOT NULL COMMENT 'èä½', |
| | | `start_date` date NOT NULL COMMENT 'å
¥èæ¶é´', |
| | | `end_date` date DEFAULT NULL COMMENT 'ç¦»èæ¶é´', |
| | | `work_content` varchar(500) DEFAULT NULL COMMENT 'å·¥ä½å
容', |
| | | `leave_reason` varchar(200) DEFAULT NULL COMMENT '离èåå ', |
| | | `reference_name` varchar(50) DEFAULT NULL COMMENT 'è¯æäººå§å', |
| | | `reference_phone` varchar(20) DEFAULT NULL COMMENT 'è¯æäººçµè¯', |
| | | `remark` varchar(200) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_employee_id` (`employee_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMå工工ä½ç»å表'; |
| | | |
| | | -- 1.4 å工紧æ¥è系人表 |
| | | CREATE TABLE IF NOT EXISTS `hrm_employee_emergency_contact` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'è®°å½ID', |
| | | `employee_id` bigint NOT NULL COMMENT 'åå·¥ID', |
| | | `name` varchar(50) NOT NULL COMMENT 'è系人å§å', |
| | | `relationship` varchar(50) NOT NULL COMMENT 'ä¸åå·¥å
³ç³»', |
| | | `phone` varchar(20) NOT NULL COMMENT 'èç³»çµè¯', |
| | | `address` varchar(200) DEFAULT NULL COMMENT 'èç³»å°å', |
| | | `sort` tinyint DEFAULT 1 COMMENT 'æåºï¼å¯è®¾ç½®å¤ä¸ªç´§æ¥è系人ï¼', |
| | | `remark` varchar(200) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_employee_id` (`employee_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMå工紧æ¥è系人表'; |
| | | |
| | | -- ============================================= |
| | | -- 2. 人äºå®¡æ¹æ¨¡å表 |
| | | -- ============================================= |
| | | |
| | | -- 2.1 请åç³è¯·è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_leave_application` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç³è¯·ID', |
| | | `no` varchar(32) NOT NULL COMMENT 'ç³è¯·åå·', |
| | | `user_id` bigint NOT NULL COMMENT 'ç³è¯·äººID', |
| | | `dept_id` bigint NOT NULL COMMENT 'é¨é¨ID', |
| | | `leave_type` tinyint NOT NULL COMMENT '请åç±»åï¼1-äºåï¼2-ç
åï¼3-å¹´åï¼4-å©åï¼5-产åï¼6-丧å', |
| | | `start_time` datetime NOT NULL COMMENT 'å¼å§æ¶é´', |
| | | `end_time` datetime NOT NULL COMMENT 'ç»ææ¶é´', |
| | | `duration` decimal(4,2) NOT NULL COMMENT 'è¯·åæ¶é¿ï¼å¤©ï¼', |
| | | `reason` varchar(500) NOT NULL COMMENT '请ååå ', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-è稿ï¼10-审æ¹ä¸ï¼20-éè¿ï¼30-驳åï¼40-æ¤é', |
| | | `process_instance_id` varchar(64) DEFAULT NULL COMMENT 'BPMæµç¨å®ä¾ID', |
| | | `approve_time` datetime DEFAULT NULL COMMENT '审æ¹å®ææ¶é´', |
| | | `file_url` varchar(500) DEFAULT NULL COMMENT 'éä»¶å°å', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_no` (`no`), |
| | | KEY `idx_user_status` (`user_id`, `status`), |
| | | KEY `idx_dept_time` (`dept_id`, `start_time`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRM请åç³è¯·è¡¨'; |
| | | |
| | | -- 2.2 è°å²ç³è¯·è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_transfer_application` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç³è¯·ID', |
| | | `no` varchar(32) NOT NULL COMMENT 'ç³è¯·åå·', |
| | | `user_id` bigint NOT NULL COMMENT 'ç³è¯·äººID', |
| | | `current_dept_id` bigint NOT NULL COMMENT 'åé¨é¨ID', |
| | | `current_post_id` bigint NOT NULL COMMENT 'åå²ä½ID', |
| | | `target_dept_id` bigint NOT NULL COMMENT 'ç®æ é¨é¨ID', |
| | | `target_post_id` bigint NOT NULL COMMENT 'ç®æ å²ä½ID', |
| | | `transfer_type` tinyint NOT NULL COMMENT 'è°å²ç±»åï¼1-å¹³è°ï¼2-åèï¼3-éè', |
| | | `effective_date` date NOT NULL COMMENT 'çææ¥æ', |
| | | `reason` varchar(500) NOT NULL COMMENT 'è°å²åå ', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-è稿ï¼10-审æ¹ä¸ï¼20-éè¿ï¼30-驳åï¼40-æ¤é', |
| | | `process_instance_id` varchar(64) DEFAULT NULL COMMENT 'BPMæµç¨å®ä¾ID', |
| | | `approve_time` datetime DEFAULT NULL COMMENT '审æ¹å®ææ¶é´', |
| | | `file_url` varchar(500) DEFAULT NULL COMMENT 'éä»¶å°å', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_no` (`no`), |
| | | KEY `idx_user_status` (`user_id`, `status`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMè°å²ç³è¯·è¡¨'; |
| | | |
| | | -- 2.3 离èç³è¯·è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_resignation_application` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç³è¯·ID', |
| | | `no` varchar(32) NOT NULL COMMENT 'ç³è¯·åå·', |
| | | `user_id` bigint NOT NULL COMMENT 'ç³è¯·äººID', |
| | | `dept_id` bigint NOT NULL COMMENT 'é¨é¨ID', |
| | | `resignation_type` tinyint NOT NULL COMMENT '离èç±»åï¼1-主å¨ç¦»èï¼2-被å¨ç¦»èï¼3-ååå°æ', |
| | | `expected_date` date NOT NULL COMMENT 'é¢è®¡ç¦»èæ¥æ', |
| | | `actual_date` date DEFAULT NULL COMMENT 'å®é
ç¦»èæ¥æ', |
| | | `reason` varchar(500) NOT NULL COMMENT '离èåå ', |
| | | `handover_user_id` bigint DEFAULT NULL COMMENT '交æ¥äººID', |
| | | `handover_status` tinyint DEFAULT 0 COMMENT '交æ¥ç¶æï¼0-æªå¼å§ï¼10-è¿è¡ä¸ï¼20-已宿', |
| | | `handover_remark` varchar(500) DEFAULT NULL COMMENT '交æ¥è¯´æ', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-è稿ï¼10-审æ¹ä¸ï¼20-éè¿ï¼30-驳åï¼40-æ¤é', |
| | | `process_instance_id` varchar(64) DEFAULT NULL COMMENT 'BPMæµç¨å®ä¾ID', |
| | | `approve_time` datetime DEFAULT NULL COMMENT '审æ¹å®ææ¶é´', |
| | | `file_url` varchar(500) DEFAULT NULL COMMENT 'éä»¶å°å', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_no` (`no`), |
| | | KEY `idx_user_status` (`user_id`, `status`), |
| | | KEY `idx_dept_time` (`dept_id`, `expected_date`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRM离èç³è¯·è¡¨'; |
| | | |
| | | -- ============================================= |
| | | -- 3. èå¤ç®¡ç模å表 |
| | | -- ============================================= |
| | | |
| | | -- 3.1 èå¤è§åé
置表 |
| | | CREATE TABLE IF NOT EXISTS `hrm_attendance_rule` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'è§åID', |
| | | `name` varchar(100) NOT NULL COMMENT 'è§ååç§°', |
| | | `dept_id` bigint DEFAULT NULL COMMENT 'éç¨é¨é¨IDï¼ç©ºè¡¨ç¤ºå
¨å±ï¼', |
| | | `work_start_time` time NOT NULL COMMENT 'ä¸çæ¶é´', |
| | | `work_end_time` time NOT NULL COMMENT 'ä¸çæ¶é´', |
| | | `late_allow_minutes` tinyint DEFAULT 0 COMMENT 'è¿å°å
许åéæ°', |
| | | `early_allow_minutes` tinyint DEFAULT 0 COMMENT 'æ©éå
许åéæ°', |
| | | `overtime_threshold` decimal(4,2) DEFAULT 1 COMMENT 'å çèµ·ç®æ¶é¿ï¼å°æ¶ï¼', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | KEY `idx_dept_id` (`dept_id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMèå¤è§åé
置表'; |
| | | |
| | | -- 3.2 è夿å¡è®°å½è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_attendance_record` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'è®°å½ID', |
| | | `user_id` bigint NOT NULL COMMENT 'åå·¥ID', |
| | | `dept_id` bigint NOT NULL COMMENT 'é¨é¨ID', |
| | | `date` date NOT NULL COMMENT 'è夿¥æ', |
| | | `clock_in_time` datetime DEFAULT NULL COMMENT 'ä¸çæå¡æ¶é´', |
| | | `clock_out_time` datetime DEFAULT NULL COMMENT 'ä¸çæå¡æ¶é´', |
| | | `clock_in_type` tinyint DEFAULT NULL COMMENT 'ä¸çæå¡ç±»åï¼1-æ£å¸¸ï¼2-è¿å°ï¼3-缺å¡', |
| | | `clock_out_type` tinyint DEFAULT NULL COMMENT 'ä¸çæå¡ç±»åï¼1-æ£å¸¸ï¼2-æ©éï¼3-缺å¡', |
| | | `work_hours` decimal(4,2) DEFAULT NULL COMMENT '工使¶é¿ï¼å°æ¶ï¼', |
| | | `overtime_hours` decimal(4,2) DEFAULT 0 COMMENT 'å çæ¶é¿ï¼å°æ¶ï¼', |
| | | `location` varchar(200) DEFAULT NULL COMMENT 'æå¡å°ç¹', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `data_source` tinyint DEFAULT 1 COMMENT 'æ°æ®æ¥æºï¼1-æå¡ï¼2-导å
¥', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_user_date` (`user_id`, `date`), |
| | | KEY `idx_dept_date` (`dept_id`, `date`), |
| | | KEY `idx_create_time` (`create_time`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMè夿å¡è®°å½è¡¨'; |
| | | |
| | | -- 3.3 èå¤å¼å¸¸ç³è¯·è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_attendance_exception` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç³è¯·ID', |
| | | `no` varchar(32) NOT NULL COMMENT 'ç³è¯·åå·', |
| | | `user_id` bigint NOT NULL COMMENT 'ç³è¯·äººID', |
| | | `dept_id` bigint NOT NULL COMMENT 'é¨é¨ID', |
| | | `type` tinyint NOT NULL COMMENT 'å¼å¸¸ç±»åï¼1-è¡¥å¡ï¼2-å çï¼3-åºå·®', |
| | | `exception_date` date NOT NULL COMMENT 'å¼å¸¸æ¥æ', |
| | | `exception_time` datetime DEFAULT NULL COMMENT 'å¼å¸¸æ¶é´ç¹', |
| | | `reason` varchar(500) NOT NULL COMMENT 'ç³è¯·åå ', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-è稿ï¼10-审æ¹ä¸ï¼20-éè¿ï¼30-驳åï¼40-æ¤é', |
| | | `process_instance_id` varchar(64) DEFAULT NULL COMMENT 'BPMæµç¨å®ä¾ID', |
| | | `approve_time` datetime DEFAULT NULL COMMENT '审æ¹å®ææ¶é´', |
| | | `file_url` varchar(500) DEFAULT NULL COMMENT 'éä»¶å°å', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_no` (`no`), |
| | | KEY `idx_user_status` (`user_id`, `status`), |
| | | KEY `idx_dept_date` (`dept_id`, `exception_date`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMèå¤å¼å¸¸ç³è¯·è¡¨'; |
| | | |
| | | -- ============================================= |
| | | -- 3. èªé
¬ç®¡ç模å表 |
| | | -- ============================================= |
| | | |
| | | -- 3.1 èªé
¬ç»æè¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_salary_structure` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç»æID', |
| | | `name` varchar(100) NOT NULL COMMENT 'ç»æåç§°', |
| | | `base_salary` decimal(12,2) NOT NULL COMMENT 'åºæ¬å·¥èµ', |
| | | `performance_ratio` decimal(4,2) DEFAULT 0 COMMENT '绩æå·¥èµå æ¯ï¼%ï¼', |
| | | `overtime_pay_ratio` decimal(4,2) DEFAULT 1.5 COMMENT 'å çå·¥èµåç', |
| | | `social_security_base` decimal(12,2) DEFAULT NULL COMMENT '社ä¿åºæ°', |
| | | `housing_fund_base` decimal(12,2) DEFAULT NULL COMMENT 'å
¬ç§¯éåºæ°', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMèªé
¬ç»æè¡¨'; |
| | | |
| | | -- 3.2 åå·¥èªé
¬æ¡£æ¡è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_employee_salary` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'æ¡£æ¡ID', |
| | | `user_id` bigint NOT NULL COMMENT 'åå·¥ID', |
| | | `salary_structure_id` bigint NOT NULL COMMENT 'èªé
ȾID', |
| | | `base_salary` decimal(12,2) NOT NULL COMMENT 'åºæ¬å·¥èµ', |
| | | `performance_salary` decimal(12,2) DEFAULT NULL COMMENT '绩æå·¥èµ', |
| | | `meal_allowance` decimal(12,2) DEFAULT 0 COMMENT 'é¤è¡¥', |
| | | `transport_allowance` decimal(12,2) DEFAULT 0 COMMENT '交é补贴', |
| | | `other_allowance` decimal(12,2) DEFAULT 0 COMMENT 'å
¶ä»è¡¥è´´', |
| | | `effective_date` date NOT NULL COMMENT 'çææ¥æ', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_user_effective` (`user_id`, `effective_date`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMåå·¥èªé
¬æ¡£æ¡è¡¨'; |
| | | |
| | | -- 3.3 èªé
¬æ ¸ç®è®°å½è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_salary_calculation` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'æ ¸ç®ID', |
| | | `no` varchar(32) NOT NULL COMMENT 'æ ¸ç®åå·', |
| | | `period` varchar(20) NOT NULL COMMENT 'æ ¸ç®å¨æï¼å¦2024-01ï¼', |
| | | `user_id` bigint NOT NULL COMMENT 'åå·¥ID', |
| | | `dept_id` bigint NOT NULL COMMENT 'é¨é¨ID', |
| | | `base_salary` decimal(12,2) NOT NULL COMMENT 'åºæ¬å·¥èµ', |
| | | `performance_salary` decimal(12,2) DEFAULT NULL COMMENT '绩æå·¥èµ', |
| | | `overtime_pay` decimal(12,2) DEFAULT 0 COMMENT 'å çå·¥èµ', |
| | | `meal_allowance` decimal(12,2) DEFAULT 0 COMMENT 'é¤è¡¥', |
| | | `transport_allowance` decimal(12,2) DEFAULT 0 COMMENT '交é补贴', |
| | | `other_allowance` decimal(12,2) DEFAULT 0 COMMENT 'å
¶ä»è¡¥è´´', |
| | | `social_security_deduction` decimal(12,2) DEFAULT NULL COMMENT 'ç¤¾ä¿æ£é¤', |
| | | `housing_fund_deduction` decimal(12,2) DEFAULT NULL COMMENT 'å
¬ç§¯éæ£é¤', |
| | | `tax_deduction` decimal(12,2) DEFAULT NULL COMMENT 'ä¸ªç¨æ£é¤', |
| | | `other_deduction` decimal(12,2) DEFAULT 0 COMMENT 'å
¶ä»æ£é¤', |
| | | `actual_salary` decimal(12,2) NOT NULL COMMENT 'å®åå·¥èµ', |
| | | `work_days` tinyint DEFAULT NULL COMMENT 'åºå¤å¤©æ°', |
| | | `overtime_hours` decimal(4,2) DEFAULT NULL COMMENT 'å çæ¶é¿', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¾
确认ï¼10-已确认ï¼20-已忾', |
| | | `confirm_time` datetime DEFAULT NULL COMMENT '确认æ¶é´', |
| | | `confirm_user_id` bigint DEFAULT NULL COMMENT '确认人ID', |
| | | `payment_time` datetime DEFAULT NULL COMMENT 'åæ¾æ¶é´', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_no` (`no`), |
| | | KEY `idx_user_period` (`user_id`, `period`), |
| | | KEY `idx_dept_period` (`dept_id`, `period`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMèªé
¬æ ¸ç®è®°å½è¡¨'; |
| | | |
| | | -- 3.4 èªèµåæ¾å°è´¦è¡¨ |
| | | CREATE TABLE IF NOT EXISTS `hrm_salary_payment` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'åæ¾ID', |
| | | `no` varchar(32) NOT NULL COMMENT 'åæ¾åå·', |
| | | `period` varchar(20) NOT NULL COMMENT '忾卿', |
| | | `total_amount` decimal(14,2) NOT NULL COMMENT 'åæ¾æ»éé¢', |
| | | `total_count` int NOT NULL COMMENT 'åæ¾äººæ°', |
| | | `payment_method` tinyint NOT NULL COMMENT 'åæ¾æ¹å¼ï¼1-é¶è¡è½¬è´¦ï¼2-ç°é', |
| | | `payment_time` datetime NOT NULL COMMENT 'åæ¾æ¶é´', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'ç¶æï¼0-å¾
åæ¾ï¼10-已忾', |
| | | `file_url` varchar(500) DEFAULT NULL COMMENT 'é¶è¡ååéä»¶', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '夿³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`), |
| | | UNIQUE KEY `uk_no` (`no`), |
| | | KEY `idx_period` (`period`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='HRMèªèµåæ¾å°è´¦è¡¨'; |
| | | |
| | | -- ============================================= |
| | | -- 4. èåæé |
| | | -- ============================================= |
| | | |
| | | -- 4.1 HRM管çç®å½ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6001, '人äºç®¡ç', '', 1, 50, 0, '/hrm', 'ep:user', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.2 å工管çç®å½ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6006, 'å工管ç', '', 2, 0, 6001, 'employee', 'ep:avatar', 'hrm/employee/index', 'HrmEmployee', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60061, 'åå·¥æ¥è¯¢', 'hrm:employee:query', 3, 1, 6006, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60062, 'åå·¥æ°å¢', 'hrm:employee:create', 3, 2, 6006, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60063, 'å工修æ¹', 'hrm:employee:update', 3, 3, 6006, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60064, 'åå·¥å é¤', 'hrm:employee:delete', 3, 4, 6006, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60065, 'å工导åº', 'hrm:employee:export', 3, 5, 6006, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.3 人äºå®¡æ¹ç®å½ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6002, '人äºå®¡æ¹', '', 1, 1, 6001, 'approval', 'ep:document-checked', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.4 请åç³è¯·èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6003, '请åç³è¯·', '', 2, 1, 6002, 'leave', 'ep:calendar', 'hrm/approval/leave/index', 'HrmLeaveApplication', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60031, '请åç³è¯·æ¥è¯¢', 'hrm:leave:query', 3, 1, 6003, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60032, '请åç³è¯·æ°å¢', 'hrm:leave:create', 3, 2, 6003, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60033, '请åç³è¯·ä¿®æ¹', 'hrm:leave:update', 3, 3, 6003, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60034, '请åç³è¯·å é¤', 'hrm:leave:delete', 3, 4, 6003, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60035, '请åç³è¯·æäº¤', 'hrm:leave:submit', 3, 5, 6003, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.5 è°å²ç³è¯·èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6004, 'è°å²ç³è¯·', '', 2, 2, 6002, 'transfer', 'ep:sort', 'hrm/approval/transfer/index', 'HrmTransferApplication', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60041, 'è°å²ç³è¯·æ¥è¯¢', 'hrm:transfer:query', 3, 1, 6004, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60042, 'è°å²ç³è¯·æ°å¢', 'hrm:transfer:create', 3, 2, 6004, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60043, 'è°å²ç³è¯·ä¿®æ¹', 'hrm:transfer:update', 3, 3, 6004, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60044, 'è°å²ç³è¯·å é¤', 'hrm:transfer:delete', 3, 4, 6004, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60045, 'è°å²ç³è¯·æäº¤', 'hrm:transfer:submit', 3, 5, 6004, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.6 离èç³è¯·èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6005, '离èç³è¯·', '', 2, 3, 6002, 'resignation', 'ep:switch-button', 'hrm/approval/resignation/index', 'HrmResignationApplication', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60051, '离èç³è¯·æ¥è¯¢', 'hrm:resignation:query', 3, 1, 6005, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60052, '离èç³è¯·æ°å¢', 'hrm:resignation:create', 3, 2, 6005, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60053, '离èç³è¯·ä¿®æ¹', 'hrm:resignation:update', 3, 3, 6005, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60054, '离èç³è¯·å é¤', 'hrm:resignation:delete', 3, 4, 6005, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60055, '离èç³è¯·æäº¤', 'hrm:resignation:submit', 3, 5, 6005, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.6 èå¤ç®¡çç®å½ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6010, 'èå¤ç®¡ç', '', 1, 2, 6001, 'attendance', 'ep:clock', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.7 èå¤è®°å½èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6011, 'èå¤è®°å½', '', 2, 1, 6010, 'record', 'ep:document', 'hrm/attendance/record/index', 'HrmAttendanceRecord', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60111, 'èå¤è®°å½æ¥è¯¢', 'hrm:attendance:query', 3, 1, 6011, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60112, 'èå¤è®°å½å¯¼å
¥', 'hrm:attendance:import', 3, 2, 6011, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60113, 'èå¤è®°å½å¯¼åº', 'hrm:attendance:export', 3, 3, 6011, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.8 èå¤å¼å¸¸èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6012, 'èå¤å¼å¸¸', '', 2, 2, 6010, 'exception', 'ep:warning', 'hrm/attendance/exception/index', 'HrmAttendanceException', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.9 èªé
¬ç®¡çç®å½ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6020, 'èªé
¬ç®¡ç', '', 1, 3, 6001, 'salary', 'ep:money', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.10 èªé
¬æ ¸ç®èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6021, 'èªé
¬æ ¸ç®', '', 2, 1, 6020, 'calculation', 'ep:coin', 'hrm/salary/calculation/index', 'HrmSalaryCalculation', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60211, 'èªé
¬æ ¸ç®æ¥è¯¢', 'hrm:salary:query', 3, 1, 6021, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60212, 'èªé
¬æ ¸ç®æ§è¡', 'hrm:salary:calculate', 3, 2, 6021, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60213, 'èªé
¬æ ¸ç®ç¡®è®¤', 'hrm:salary:confirm', 3, 3, 6021, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (60214, 'èªé
¬æ ¸ç®å¯¼åº', 'hrm:salary:export', 3, 4, 6021, '', '', '', NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 4.11 èªèµåæ¾èå |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (6022, 'èªèµåæ¾', '', 2, 2, 6020, 'payment', 'ep:wallet', 'hrm/salary/payment/index', 'HrmSalaryPayment', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- ============================================= |
| | | -- 5. è§è²èåå
³è |
| | | -- ============================================= |
| | | |
| | | -- ç»è§è² ID=1ï¼è¶
级管çåï¼åé
HRM èåæé |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6001, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6006, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60061, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60062, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60063, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60064, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60065, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6002, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6003, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60031, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60032, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60033, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60034, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60035, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6004, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60041, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60042, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60043, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60044, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60045, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6005, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60051, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60052, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60053, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60054, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60055, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6010, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6011, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60111, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60112, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60113, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6012, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6020, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6021, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60211, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60212, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60213, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 60214, '1', NOW(), '1', NOW(), b'0'); |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1, 6022, '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- ============================================= |
| | | -- æ§è¡å®ææç¤º |
| | | -- ============================================= |
| | | SELECT 'HRM 人åèµæºæ¨¡å SQL åå§å宿ï¼' AS result; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- èªèµåæ¾æç»è¡¨ |
| | | CREATE TABLE IF NOT EXISTS hrm_salary_payment_detail ( |
| | | id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主é®', |
| | | payment_id BIGINT NOT NULL COMMENT 'åæ¾å°è´¦ID', |
| | | calculation_id BIGINT NOT NULL COMMENT 'èªé
¬æ ¸ç®ID', |
| | | user_id BIGINT NOT NULL COMMENT 'åå·¥ID', |
| | | dept_id BIGINT DEFAULT NULL COMMENT 'é¨é¨ID', |
| | | actual_salary DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT 'å®åå·¥èµ', |
| | | status INT NOT NULL DEFAULT 0 COMMENT 'åæ¾ç¶æï¼0-å¾
åæ¾ï¼10-已忾', |
| | | payment_time DATETIME DEFAULT NULL COMMENT 'åæ¾æ¶é´', |
| | | remark VARCHAR(255) DEFAULT NULL COMMENT '夿³¨', |
| | | create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | update_time DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | creator VARCHAR(64) DEFAULT '' COMMENT 'å建人', |
| | | updater VARCHAR(64) DEFAULT '' COMMENT 'æ´æ°äºº', |
| | | deleted BIT NOT NULL DEFAULT 0 COMMENT 'æ¯å¦å é¤', |
| | | INDEX idx_payment_id (payment_id), |
| | | INDEX idx_calculation_id (calculation_id) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT 'èªèµåæ¾æç»'; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- MES å°è´§éç¥åå¢å éè´è®¢åç¼å·å段 |
| | | -- å°éè´è®¢åå·ä»æå¨è¾å
¥æ¹ä¸ºå
³è ERP éè´è®¢å |
| | | |
| | | -- æ·»å éè´è®¢åç¼å·å段 |
| | | ALTER TABLE mes_wm_arrival_notice ADD COLUMN purchase_order_id BIGINT COMMENT 'éè´è®¢åç¼å·' AFTER name; |
| | | |
| | | -- æ°æ®è¿ç§»ï¼å°åæçéè´è®¢åå·ï¼purchase_order_codeï¼ä¸ ERP éè´è®¢å表ï¼erp_purchase_orderï¼å
³è |
| | | -- 注æï¼æ¤è¿ç§»èæ¬å设 purchase_order_code åå¨çæ¯ ERP éè´è®¢åç no åæ®µ |
| | | -- UPDATE mes_wm_arrival_notice a |
| | | -- SET a.purchase_order_id = (SELECT p.id FROM erp_purchase_order p WHERE p.no = a.purchase_order_code LIMIT 1) |
| | | -- WHERE a.purchase_order_code IS NOT NULL AND a.purchase_order_code != ''; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- MES SNç è¡¨ç»æä¿®å¤ï¼MySQL 5.7 å
¼å®¹çï¼ |
| | | -- ç´æ¥æ§è¡ä»¥ä¸è¯å¥ï¼å¦æå段已åå¨ä¼æ¥éï¼å¿½ç¥å³å¯ |
| | | |
| | | -- 1. æ·»å uuid åæ®µ |
| | | ALTER TABLE mes_wm_sn ADD COLUMN uuid VARCHAR(64) COMMENT 'æ¹æ¬¡UUID' AFTER id; |
| | | |
| | | -- 2. æ·»å batch_code åæ®µ |
| | | ALTER TABLE mes_wm_sn ADD COLUMN batch_code VARCHAR(100) COMMENT 'æ¹æ¬¡å·' AFTER item_id; |
| | | |
| | | -- 3. æ·»å work_order_id åæ®µ |
| | | ALTER TABLE mes_wm_sn ADD COLUMN work_order_id BIGINT COMMENT 'ç产工åç¼å·' AFTER batch_code; |
| | | |
| | | -- 4. æ·»å ç´¢å¼ |
| | | ALTER TABLE mes_wm_sn ADD INDEX idx_uuid (uuid); |
| | | ALTER TABLE mes_wm_sn ADD INDEX idx_item_id (item_id); |
| | | |
| | | -- 5. éªè¯ |
| | | SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT |
| | | FROM information_schema.columns |
| | | WHERE table_schema = DATABASE() AND table_name = 'mes_wm_sn' |
| | | ORDER BY ORDINAL_POSITION; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- æ¥è¡¨æ¨¡å SQL åå§åèæ¬ |
| | | -- å
å« GoView 大å±è®¾è®¡å¨ç¸å
³è¡¨ |
| | | -- ============================================= |
| | | |
| | | -- ============================================= |
| | | -- 1. æ°æ®åºè¡¨ç»æ |
| | | -- ============================================= |
| | | |
| | | -- 1.1 GoView 项ç®è¡¨ï¼å¤§å±è®¾è®¡å¨ï¼ |
| | | CREATE TABLE IF NOT EXISTS `report_go_view_project` ( |
| | | `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ç¼å·', |
| | | `name` varchar(100) NOT NULL COMMENT '项ç®åç§°', |
| | | `pic_url` varchar(255) DEFAULT NULL COMMENT 'é¢è§å¾ç URL', |
| | | `content` longtext COMMENT 'æ¥è¡¨å
容ï¼JSON é
ç½®ï¼', |
| | | `status` tinyint NOT NULL DEFAULT 0 COMMENT 'åå¸ç¶æï¼0-å·²åå¸ï¼1-æªåå¸', |
| | | `remark` varchar(500) DEFAULT NULL COMMENT '项ç®å¤æ³¨', |
| | | `creator` varchar(64) DEFAULT '' COMMENT 'å建è
', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `updater` varchar(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT 'æ¯å¦å é¤', |
| | | PRIMARY KEY (`id`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='GoView 项ç®è¡¨'; |
| | | |
| | | -- ============================================= |
| | | -- 2. èåæéï¼å¦æä¸» SQL ä¸å·²å
å«ï¼å¯è·³è¿ï¼ |
| | | -- ============================================= |
| | | |
| | | -- 2.1 æ¥è¡¨ç®¡çç®å½ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1281, 'æ¥è¡¨ç®¡ç', '', 1, 40, 0, '/report', 'ep:pie-chart', NULL, NULL, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 2.2 æ¥è¡¨è®¾è®¡å¨ï¼JimuReport ç§¯æ¨æ¥è¡¨ï¼ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (1282, 'æ¥è¡¨è®¾è®¡å¨', '', 2, 1, 1281, 'jimu-report', 'ep:trend-charts', 'report/jmreport/index', 'JimuReport', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 2.3 大å±è®¾è®¡å¨ï¼GoViewï¼ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2153, '大å±è®¾è®¡å¨', '', 2, 2, 1281, 'go-view', 'fa:area-chart', 'report/goview/index', 'GoView', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- 2.4 仪表ç设计å¨ï¼JimuBIï¼ |
| | | INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (5009, '仪表ç设计å¨', '', 2, 3, 1281, 'jimu-bi', 'fa:y-combinator', 'report/jmreport/bi', 'JimuBI', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- ============================================= |
| | | -- 3. è§è²èåå
³èï¼ç»ç®¡çåè§è²åé
æ¥è¡¨æéï¼ |
| | | -- ============================================= |
| | | |
| | | -- 注æï¼å¦æä¸» SQL ä¸å·²æè¿äºè®°å½ï¼å¯è½ä¼å²çªï¼å¯å
å é¤åæå
¥ |
| | | -- DELETE FROM `system_role_menu` WHERE `menu_id` IN (1281, 1282, 2153, 5009); |
| | | |
| | | -- 3.1 ç»è§è² ID=2ï¼å设为管çåï¼åé
æ¥è¡¨èåæé |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, 1281, '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, 1282, '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, 2153, '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) |
| | | VALUES (2, 5009, '1', NOW(), '1', NOW(), b'0'); |
| | | |
| | | -- ============================================= |
| | | -- æ§è¡å®ææç¤º |
| | | -- ============================================= |
| | | SELECT 'æ¥è¡¨æ¨¡å SQL åå§å宿ï¼' AS result; |
| | | SELECT COUNT(*) AS go_view_project_count FROM report_go_view_project WHERE deleted = 0; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- ä»å¨ç©æµæ¨¡åæ°æ®åºåå§åèæ¬ |
| | | -- å
å«ï¼ä»åºå®¡æ¹é
置表ãåæ®BPMåæ®µæ©å±ãBPMåç±» |
| | | -- ============================================= |
| | | |
| | | -- 1. å建ä»åºå®¡æ¹é
置表 |
| | | CREATE TABLE IF NOT EXISTS wms_warehouse_approval_config ( |
| | | id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主é®ID', |
| | | warehouse_id BIGINT NOT NULL COMMENT 'ä»åºID', |
| | | biz_type VARCHAR(32) NOT NULL COMMENT 'ä¸å¡ç±»å(INBOUND-å
¥åº/OUTBOUND-åºåº/TRANSFER-è°æ¨/CHECK-çç¹)', |
| | | approval_enabled TINYINT(1) DEFAULT 0 COMMENT 'æ¯å¦å¯ç¨å®¡æ¹(0-å¦ 1-æ¯)', |
| | | process_definition_key VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¹Key(为空å使ç¨åç±»é»è®¤)', |
| | | category_code VARCHAR(64) DEFAULT 'wms_approve' COMMENT 'BPMåç±»ç¼ç ', |
| | | creator VARCHAR(64) DEFAULT '' COMMENT 'å建è
', |
| | | create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | updater VARCHAR(64) DEFAULT '' COMMENT 'æ´æ°è
', |
| | | update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | deleted BIT DEFAULT 0 COMMENT 'æ¯å¦å é¤', |
| | | INDEX idx_warehouse_biz (warehouse_id, biz_type) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ä»åºå®¡æ¹é
置表'; |
| | | |
| | | -- 2. 为åºå
¥åºåæ®å¢å BPM审æ¹å段 |
| | | |
| | | -- éè´å
¥åºå |
| | | ALTER TABLE mes_wm_item_receipt |
| | | ADD COLUMN IF NOT EXISTS process_instance_id VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¾ID' AFTER remark, |
| | | ADD COLUMN IF NOT EXISTS process_definition_key VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¹Key' AFTER process_instance_id; |
| | | |
| | | -- éå®åºåºå |
| | | ALTER TABLE mes_wm_product_sales |
| | | ADD COLUMN IF NOT EXISTS process_instance_id VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¾ID' AFTER remark, |
| | | ADD COLUMN IF NOT EXISTS process_definition_key VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¹Key' AFTER process_instance_id; |
| | | |
| | | -- çäº§é¢æå |
| | | ALTER TABLE mes_wm_product_issue |
| | | ADD COLUMN IF NOT EXISTS process_instance_id VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¾ID' AFTER remark, |
| | | ADD COLUMN IF NOT EXISTS process_definition_key VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¹Key' AFTER process_instance_id; |
| | | |
| | | -- ç产å
¥åºåï¼äº§åæ¶è´§ï¼ |
| | | ALTER TABLE mes_wm_product_receipt |
| | | ADD COLUMN IF NOT EXISTS process_instance_id VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¾ID' AFTER remark, |
| | | ADD COLUMN IF NOT EXISTS process_definition_key VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¹Key' AFTER process_instance_id; |
| | | |
| | | -- è½¬ç§»è°æ¨å |
| | | ALTER TABLE mes_wm_transfer |
| | | ADD COLUMN IF NOT EXISTS process_instance_id VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¾ID' AFTER remark, |
| | | ADD COLUMN IF NOT EXISTS process_definition_key VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¹Key' AFTER process_instance_id; |
| | | |
| | | -- çç¹æ¹æ¡ |
| | | ALTER TABLE mes_wm_stock_taking_plan |
| | | ADD COLUMN IF NOT EXISTS process_instance_id VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¾ID' AFTER remark, |
| | | ADD COLUMN IF NOT EXISTS process_definition_key VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¹Key' AFTER process_instance_id; |
| | | |
| | | -- æé¡¹å
¥åºå |
| | | ALTER TABLE mes_wm_misc_receipt |
| | | ADD COLUMN IF NOT EXISTS process_instance_id VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¾ID' AFTER remark, |
| | | ADD COLUMN IF NOT EXISTS process_definition_key VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¹Key' AFTER process_instance_id; |
| | | |
| | | -- æé¡¹åºåºå |
| | | ALTER TABLE mes_wm_misc_issue |
| | | ADD COLUMN IF NOT EXISTS process_instance_id VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¾ID' AFTER remark, |
| | | ADD COLUMN IF NOT EXISTS process_definition_key VARCHAR(64) DEFAULT NULL COMMENT 'æµç¨å®ä¹Key' AFTER process_instance_id; |
| | | |
| | | -- 3. å建BPM审æ¹åç±» |
| | | INSERT INTO bpm_category (id, name, code, description, status, sort, creator, create_time, updater, update_time, deleted) |
| | | SELECT 120, 'ä»åºå®¡æ ¸', 'wms_approve', 'ä»åºç®¡çå®¡æ¹æµç¨åç±»', 0, 30, '1', NOW(), '1', NOW(), 0 |
| | | FROM DUAL |
| | | WHERE NOT EXISTS (SELECT 1 FROM bpm_category WHERE code = 'wms_approve'); |
| | | |
| | | -- ============================================= |
| | | -- ä¸å¡ç±»å说æï¼ |
| | | -- INBOUND - å
¥åºç±»ä¸å¡ï¼éè´å
¥åºãç产å
¥åºãéå®éè´§çï¼ |
| | | -- OUTBOUND - åºåºç±»ä¸å¡ï¼éå®åºåºãçäº§é¢æãéè´éè´§çï¼ |
| | | -- TRANSFER - è°æ¨ä¸å¡ï¼å
é¨è°æ¨ãå¤é¨è°æ¨ï¼ |
| | | -- CHECK - çç¹ä¸å¡ï¼éæçç¹ã卿çç¹ï¼ |
| | | -- ============================================= |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================= |
| | | -- ä»å¨ç©æµèåè°æ´èæ¬ |
| | | -- å°MESä»åºç®¡ç(5780)æå为ä¸çº§èå"ä»å¨ç©æµ" |
| | | -- ============================================= |
| | | |
| | | -- 1. å°ä»åºç®¡çèåæå为ä¸çº§èå"ä»å¨ç©æµ" |
| | | UPDATE system_menu SET |
| | | parent_id = 0, |
| | | name = 'ä»å¨ç©æµ', |
| | | path = 'wls', |
| | | icon = 'ep:truck', |
| | | sort = 280 -- æ¾å¨ERP(sort=250)ä¹å |
| | | WHERE id = 5780; |
| | | |
| | | -- 2. è°æ´åèåç»ä»¶è·¯å¾åç¼(wm -> wls) |
| | | -- 注æï¼å端éè¦åæ¥è°æ´ç»ä»¶è·¯å¾ï¼æå¨è·¯ç±é
ç½®ä¸æ·»å å«å |
| | | UPDATE system_menu SET component = REPLACE(component, 'mes/wm/', 'wls/') |
| | | WHERE parent_id = 5780; |
| | | |
| | | -- 3. è°æ´åèåçåèåï¼å¦çç¹ä»»å¡çä¸çº§èåï¼ |
| | | UPDATE system_menu SET component = REPLACE(component, 'mes/wm/', 'wls/') |
| | | WHERE parent_id IN (SELECT id FROM system_menu WHERE parent_id = 5780); |
| | | |
| | | -- ============================================= |
| | | -- 说æï¼ |
| | | -- 1. æ§è¡æ¤èæ¬åï¼å端ç»ä»¶è·¯å¾éè¦åæ¥è°æ´ |
| | | -- æå¨ router ä¸é
置路å¾å«åï¼mes/wm/* -> wls/* |
| | | -- 2. æéåç¼æä¸ä¿®æ¹ï¼ä¿æ mes:wm-* æ ¼å¼ |
| | | -- åç»å¯æ ¹æ®éè¦ç»ä¸è°æ´ä¸º wls:* |
| | | -- 3. å¦éæ¢å¤ï¼æ§è¡ä»¥ä¸ååèæ¬ï¼ |
| | | -- ============================================= |
| | | |
| | | -- ååèæ¬ï¼å¦éæ¢å¤ï¼ï¼ |
| | | -- UPDATE system_menu SET parent_id = 5100, name = 'ä»åºç®¡ç', path = 'wm', icon = 'ep:box', sort = 20 WHERE id = 5780; |
| | | -- UPDATE system_menu SET component = REPLACE(component, 'wls/', 'mes/wm/') WHERE parent_id = 5780 OR parent_id IN (SELECT id FROM system_menu WHERE parent_id = 5780); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ERP éè´è®¢å API æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface ErpPurchaseOrderApi { |
| | | |
| | | String PREFIX = "/rpc-api/erp/purchase-order"; |
| | | |
| | | /** |
| | | * è·åéè´è®¢å |
| | | * |
| | | * @param id 订åç¼å· |
| | | * @return éè´è®¢å |
| | | */ |
| | | CommonResult<ErpPurchaseOrderRespDTO> getPurchaseOrder(Long id); |
| | | |
| | | /** |
| | | * æ ¹æ®ä¾åºåç¼å·è·åéè´è®¢åå表ï¼å·²å®¡æ ¸ç¶æï¼ |
| | | * |
| | | * @param supplierId ä¾åºåç¼å· |
| | | * @return éè´è®¢åå表 |
| | | */ |
| | | CommonResult<List<ErpPurchaseOrderRespDTO>> getPurchaseOrderListBySupplierId(Long supplierId); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼å·å表è·åéè´è®¢åå表 |
| | | * |
| | | * @param ids ç¼å·å表 |
| | | * @return éè´è®¢åå表 |
| | | */ |
| | | CommonResult<List<ErpPurchaseOrderRespDTO>> getPurchaseOrderList(List<Long> ids); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.purchase.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "RPC æå¡ - ERP éè´è®¢å Response DTO") |
| | | @Data |
| | | public class ErpPurchaseOrderRespDTO { |
| | | |
| | | @Schema(description = "订åç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "éè´è®¢åå·", requiredMode = Schema.RequiredMode.REQUIRED, example = "PO001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ä¾åºåç¼å·", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | private Long supplierId; |
| | | |
| | | @Schema(description = "订åç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "ä¸åæ¶é´") |
| | | private LocalDateTime orderTime; |
| | | |
| | | @Schema(description = "å计æ°é") |
| | | private BigDecimal totalCount; |
| | | |
| | | @Schema(description = "å计éé¢ï¼åä½ï¼å
", example = "1000") |
| | | private BigDecimal totalPrice; |
| | | |
| | | @Schema(description = "å·²å
¥åºæ°é") |
| | | private BigDecimal inCount; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| | |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- WMS ä»å¨ç©æµ API --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-wms-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.api.purchase; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; |
| | | import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; |
| | | import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseOrderService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * ERP éè´è®¢å API å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @RestController |
| | | @RequestMapping(ErpPurchaseOrderApi.PREFIX) |
| | | @Validated |
| | | public class ErpPurchaseOrderApiImpl implements ErpPurchaseOrderApi { |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderService purchaseOrderService; |
| | | |
| | | @Override |
| | | public CommonResult<ErpPurchaseOrderRespDTO> getPurchaseOrder(Long id) { |
| | | ErpPurchaseOrderDO order = purchaseOrderService.getPurchaseOrder(id); |
| | | return success(BeanUtils.toBean(order, ErpPurchaseOrderRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<ErpPurchaseOrderRespDTO>> getPurchaseOrderListBySupplierId(Long supplierId) { |
| | | if (supplierId == null) { |
| | | return success(Collections.emptyList()); |
| | | } |
| | | // æ¥è¯¢å·²å®¡æ ¸ç¶æçéè´è®¢å |
| | | List<ErpPurchaseOrderDO> orders = purchaseOrderService.getPurchaseOrderListBySupplierIdAndStatus( |
| | | supplierId, ErpAuditStatus.APPROVE.getStatus()); |
| | | return success(BeanUtils.toBean(orders, ErpPurchaseOrderRespDTO.class)); |
| | | } |
| | | |
| | | @Override |
| | | public CommonResult<List<ErpPurchaseOrderRespDTO>> getPurchaseOrderList(List<Long> ids) { |
| | | if (ids == null || ids.isEmpty()) { |
| | | return success(Collections.emptyList()); |
| | | } |
| | | List<ErpPurchaseOrderDO> orders = purchaseOrderService.getPurchaseOrderList(ids); |
| | | return success(BeanUtils.toBean(orders, ErpPurchaseOrderRespDTO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.mapping; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingCreateReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingUpdateReqVO; |
| | | import cn.iocoder.yudao.module.erp.convert.mapping.ErpMesWarehouseMappingConvert; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.mapping.ErpMesWarehouseMappingDO; |
| | | import cn.iocoder.yudao.module.erp.service.product.mapping.ErpMesWarehouseMappingService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | /** |
| | | * ERPä»åºä¸MESä»åºæ å° Controller |
| | | */ |
| | | @Tag(name = "管çåå° - ERPä»åºä¸MESä»åºæ å°") |
| | | @RestController |
| | | @RequestMapping("/erp/warehouse-mapping") |
| | | @Validated |
| | | public class ErpMesWarehouseMappingController { |
| | | |
| | | @Resource |
| | | private ErpMesWarehouseMappingService mappingService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建ä»åºæ å°") |
| | | @PreAuthorize("@ss.hasPermission('erp:warehouse:update')") |
| | | public CommonResult<Long> createMapping(@Valid @RequestBody ErpMesWarehouseMappingCreateReqVO createReqVO) { |
| | | return success(mappingService.createMapping(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°ä»åºæ å°") |
| | | @PreAuthorize("@ss.hasPermission('erp:warehouse:update')") |
| | | public CommonResult<Boolean> updateMapping(@Valid @RequestBody ErpMesWarehouseMappingUpdateReqVO updateReqVO) { |
| | | mappingService.updateMapping(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ä»åºæ å°") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('erp:warehouse:delete')") |
| | | public CommonResult<Boolean> deleteMapping(@RequestParam("id") Long id) { |
| | | mappingService.deleteMapping(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·åä»åºæ å°") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('erp:warehouse:query')") |
| | | public CommonResult<ErpMesWarehouseMappingDO> getMapping(@RequestParam("id") Long id) { |
| | | return success(mappingService.getMapping(id)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·åä»åºæ å°å页") |
| | | @PreAuthorize("@ss.hasPermission('erp:warehouse:query')") |
| | | public CommonResult<PageResult<ErpMesWarehouseMappingDO>> getMappingPage(@Valid ErpMesWarehouseMappingPageReqVO pageReqVO) { |
| | | return success(mappingService.getMappingPage(pageReqVO)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.mapping.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * ERPä»åºä¸MESä»åºæ å°å建 Request VO |
| | | */ |
| | | @Schema(description = "管çåå° - ERPä»åºä¸MESä»åºæ å°å建 Request VO") |
| | | @Data |
| | | public class ErpMesWarehouseMappingCreateReqVO { |
| | | |
| | | @Schema(description = "ERPä»åºID", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "ERPä»åºIDä¸è½ä¸ºç©º") |
| | | private Long erpWarehouseId; |
| | | |
| | | @Schema(description = "ERPä»åºåç§°") |
| | | private String erpWarehouseName; |
| | | |
| | | @Schema(description = "MESä»åºID", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "MESä»åºIDä¸è½ä¸ºç©º") |
| | | private Long mesWarehouseId; |
| | | |
| | | @Schema(description = "MESä»åºåç§°") |
| | | private String mesWarehouseName; |
| | | |
| | | @Schema(description = "ç¶æï¼1-å¯ç¨ 0-ç¦ç¨ï¼") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.mapping.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | /** |
| | | * ERPä»åºä¸MESä»åºæ å°å页 Request VO |
| | | */ |
| | | @Schema(description = "管çåå° - ERPä»åºä¸MESä»åºæ å°å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class ErpMesWarehouseMappingPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "ERPä»åºID") |
| | | private Long erpWarehouseId; |
| | | |
| | | @Schema(description = "MESä»åºID") |
| | | private Long mesWarehouseId; |
| | | |
| | | @Schema(description = "ç¶æ") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.controller.admin.mapping.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | /** |
| | | * ERPä»åºä¸MESä»åºæ å°æ´æ° Request VO |
| | | */ |
| | | @Schema(description = "管çåå° - ERPä»åºä¸MESä»åºæ å°æ´æ° Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class ErpMesWarehouseMappingUpdateReqVO extends ErpMesWarehouseMappingCreateReqVO { |
| | | |
| | | @Schema(description = "ç¼å·", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "ç¼å·ä¸è½ä¸ºç©º") |
| | | private Long id; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.convert.mapping; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingCreateReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingUpdateReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.mapping.ErpMesWarehouseMappingDO; |
| | | import org.mapstruct.Mapper; |
| | | import org.mapstruct.factory.Mappers; |
| | | |
| | | /** |
| | | * ERPä»åºä¸MESä»åºæ å° Convert |
| | | */ |
| | | @Mapper |
| | | public interface ErpMesWarehouseMappingConvert { |
| | | |
| | | ErpMesWarehouseMappingConvert INSTANCE = Mappers.getMapper(ErpMesWarehouseMappingConvert.class); |
| | | |
| | | ErpMesWarehouseMappingDO convert(ErpMesWarehouseMappingCreateReqVO bean); |
| | | |
| | | ErpMesWarehouseMappingDO convert(ErpMesWarehouseMappingUpdateReqVO bean); |
| | | |
| | | default PageResult<ErpMesWarehouseMappingDO> convertPage(PageResult<ErpMesWarehouseMappingDO> page) { |
| | | return page; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.dataobject.mapping; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | /** |
| | | * ERPä»åºä¸MESä»åºæ å° DO |
| | | */ |
| | | @TableName("erp_mes_warehouse_mapping") |
| | | @KeySequence("erp_mes_warehouse_mapping_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class ErpMesWarehouseMappingDO extends BaseDO { |
| | | |
| | | /** |
| | | * 主é®ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ERPä»åºID |
| | | */ |
| | | private Long erpWarehouseId; |
| | | |
| | | /** |
| | | * ERPä»åºåç§°ï¼åä½ï¼ |
| | | */ |
| | | private String erpWarehouseName; |
| | | |
| | | /** |
| | | * MESä»åºID |
| | | */ |
| | | private Long mesWarehouseId; |
| | | |
| | | /** |
| | | * MESä»åºåç§°ï¼åä½ï¼ |
| | | */ |
| | | private String mesWarehouseName; |
| | | |
| | | /** |
| | | * ç¶æï¼1-å¯ç¨ 0-ç¦ç¨ï¼ |
| | | */ |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.dal.mysql.mapping; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.mapping.ErpMesWarehouseMappingDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * ERPä»åºä¸MESä»åºæ å° Mapper |
| | | */ |
| | | @Mapper |
| | | public interface ErpMesWarehouseMappingMapper extends BaseMapperX<ErpMesWarehouseMappingDO> { |
| | | |
| | | default ErpMesWarehouseMappingDO selectByErpWarehouseId(Long erpWarehouseId) { |
| | | return selectOne(new LambdaQueryWrapperX<ErpMesWarehouseMappingDO>() |
| | | .eq(ErpMesWarehouseMappingDO::getErpWarehouseId, erpWarehouseId) |
| | | .eq(ErpMesWarehouseMappingDO::getStatus, 1)); // åªæ¥è¯¢å¯ç¨ç¶æ |
| | | } |
| | | |
| | | default ErpMesWarehouseMappingDO selectByMesWarehouseId(Long mesWarehouseId) { |
| | | return selectOne(new LambdaQueryWrapperX<ErpMesWarehouseMappingDO>() |
| | | .eq(ErpMesWarehouseMappingDO::getMesWarehouseId, mesWarehouseId)); |
| | | } |
| | | |
| | | default PageResult<ErpMesWarehouseMappingDO> selectPage(ErpMesWarehouseMappingPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<ErpMesWarehouseMappingDO>() |
| | | .eqIfPresent(ErpMesWarehouseMappingDO::getErpWarehouseId, reqVO.getErpWarehouseId()) |
| | | .eqIfPresent(ErpMesWarehouseMappingDO::getMesWarehouseId, reqVO.getMesWarehouseId()) |
| | | .eqIfPresent(ErpMesWarehouseMappingDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(ErpMesWarehouseMappingDO::getId)); |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | |
| | | /** |
| | |
| | | return selectOne(ErpPurchaseOrderDO::getNo, no); |
| | | } |
| | | |
| | | default List<ErpPurchaseOrderDO> selectList(Long supplierId, Integer status) { |
| | | return selectList(new LambdaQueryWrapperX<ErpPurchaseOrderDO>() |
| | | .eqIfPresent(ErpPurchaseOrderDO::getSupplierId, supplierId) |
| | | .eqIfPresent(ErpPurchaseOrderDO::getStatus, status) |
| | | .orderByDesc(ErpPurchaseOrderDO::getId)); |
| | | } |
| | | |
| | | } |
| | |
| | | ErrorCode FINANCE_RECEIPT_NO_EXISTS = new ErrorCode(1_030_602_004, "çææ¶æ¬¾åå·å¤±è´¥ï¼è¯·éæ°æäº¤"); |
| | | ErrorCode FINANCE_RECEIPT_UPDATE_FAIL_APPROVE = new ErrorCode(1_030_602_005, "æ¶æ¬¾å({})å·²å®¡æ ¸ï¼æ æ³ä¿®æ¹"); |
| | | |
| | | // ========== ERP ä»åºæ å° 1-030-700-000 ========== |
| | | ErrorCode WAREHOUSE_MAPPING_NOT_EXISTS = new ErrorCode(1_030_700_000, "ä»åºæ å°ä¸åå¨"); |
| | | ErrorCode WAREHOUSE_MAPPING_EXISTS = new ErrorCode(1_030_700_001, "该ERPä»åºå·²å卿 å°é
ç½®"); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.product.mapping; |
| | | |
| | | /** |
| | | * ERP 产åä¸ MDM ç©ææ 尿塿¥å£ |
| | | * |
| | | * 说æï¼æ¬é¡¹ç®ç©æç»ä¸ä½¿ç¨ MDM ä¸»æ°æ®ç®¡çï¼ERP 产åéè¦ä¸ MDM ç©æå»ºç«æ å°å
³ç³»ã |
| | | * æ å°çç¥ï¼éè¿ ERP äº§åæ¡ç (barCode) ä¸ MDM ç©æç¼ç (code) ææ¡ç è¿è¡å
³èã |
| | | */ |
| | | public interface ErpMdmMappingService { |
| | | |
| | | /** |
| | | * æ ¹æ® ERP 产å ID è·å MDM ç©æ ID |
| | | * |
| | | * æ å°çç¥ï¼ |
| | | * 1. æ¥è¯¢ ERP 产åç barCode |
| | | * 2. éè¿ barCode å¹é
MDM ç©æç¼ç (code) ææ¡ç |
| | | * |
| | | * @param erpProductId ERP 产å ID |
| | | * @return MDM ç©æ IDï¼æªæ¾å°è¿å null |
| | | */ |
| | | Long getMdmItemId(Long erpProductId); |
| | | |
| | | /** |
| | | * æ ¹æ® ERP äº§åæ¡ç è·å MDM ç©æ ID |
| | | * |
| | | * @param barCode ERP äº§åæ¡ç |
| | | * @return MDM ç©æ IDï¼æªæ¾å°è¿å null |
| | | */ |
| | | Long getMdmItemIdByBarCode(String barCode); |
| | | |
| | | /** |
| | | * æ ¹æ® ERP ä»åº ID è·å MES ä»åº ID |
| | | * |
| | | * æ å°çç¥ï¼éè¿ä»åºå称精确å¹é
MES ä»åº |
| | | * |
| | | * @param erpWarehouseId ERP ä»åº ID |
| | | * @return MES ä»åº IDï¼æªæ¾å°è¿å null |
| | | */ |
| | | Long getMesWarehouseId(Long erpWarehouseId); |
| | | |
| | | /** |
| | | * æ ¹æ® ERP ä»åºåç§°è·å MES ä»åº ID |
| | | * |
| | | * @param erpWarehouseName ERP ä»åºåç§° |
| | | * @return MES ä»åº IDï¼æªæ¾å°è¿å null |
| | | */ |
| | | Long getMesWarehouseIdByName(String erpWarehouseName); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.product.mapping; |
| | | |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.mapping.ErpMesWarehouseMappingDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpWarehouseDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.mapping.ErpMesWarehouseMappingMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.product.ErpProductMapper; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpWarehouseMapper; |
| | | import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi; |
| | | import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | /** |
| | | * ERP 产åä¸ MDM ç©ææ å°æå¡å®ç°ç±» |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class ErpMdmMappingServiceImpl implements ErpMdmMappingService { |
| | | |
| | | @Resource |
| | | private ErpProductMapper productMapper; |
| | | |
| | | @Resource |
| | | private ErpWarehouseMapper warehouseMapper; |
| | | |
| | | @Resource |
| | | private ErpMesWarehouseMappingMapper warehouseMappingMapper; |
| | | |
| | | @Resource |
| | | private MdmItemApi mdmItemApi; |
| | | |
| | | @Override |
| | | public Long getMdmItemId(Long erpProductId) { |
| | | if (erpProductId == null) { |
| | | return null; |
| | | } |
| | | // 1. æ¥è¯¢ ERP 产å |
| | | ErpProductDO product = productMapper.selectById(erpProductId); |
| | | if (product == null || StrUtil.isEmpty(product.getBarCode())) { |
| | | log.warn("[getMdmItemId] ERP产åä¸å卿æ¡ç 为空ï¼erpProductId={}", erpProductId); |
| | | return null; |
| | | } |
| | | |
| | | // 2. éè¿æ¡ç æ¥è¯¢ MDM ç©æ |
| | | return getMdmItemIdByBarCode(product.getBarCode()); |
| | | } |
| | | |
| | | @Override |
| | | public Long getMdmItemIdByBarCode(String barCode) { |
| | | if (StrUtil.isEmpty(barCode)) { |
| | | return null; |
| | | } |
| | | |
| | | // ä¼å
éè¿æ¡ç æ¥è¯¢ |
| | | MdmItemRespDTO item = mdmItemApi.getItemByBarCode(barCode).getCheckedData(); |
| | | if (item != null) { |
| | | return item.getId(); |
| | | } |
| | | |
| | | // æ¡ç å¹é
ç¼ç |
| | | item = mdmItemApi.getItemByCode(barCode).getCheckedData(); |
| | | if (item != null) { |
| | | return item.getId(); |
| | | } |
| | | |
| | | log.warn("[getMdmItemIdByBarCode] æªæ¾å°å¯¹åºçMDMç©æï¼barCode={}", barCode); |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | | public Long getMesWarehouseId(Long erpWarehouseId) { |
| | | if (erpWarehouseId == null) { |
| | | return null; |
| | | } |
| | | |
| | | // 1. ä¼å
æ¥è¯¢æ å°è¡¨ |
| | | ErpMesWarehouseMappingDO mapping = warehouseMappingMapper.selectByErpWarehouseId(erpWarehouseId); |
| | | if (mapping != null) { |
| | | return mapping.getMesWarehouseId(); |
| | | } |
| | | |
| | | // 2. æ å°è¡¨æ²¡æè®°å½ï¼å°è¯éè¿åç§°å¹é
ï¼å¤ç¨æ¹æ¡ï¼ |
| | | ErpWarehouseDO erpWarehouse = warehouseMapper.selectById(erpWarehouseId); |
| | | if (erpWarehouse == null) { |
| | | log.warn("[getMesWarehouseId] ERPä»åºä¸åå¨ï¼erpWarehouseId={}", erpWarehouseId); |
| | | return null; |
| | | } |
| | | |
| | | log.warn("[getMesWarehouseId] æªæ¾å°ä»åºæ å°é
ç½®ï¼erpWarehouseId={}ï¼è¯·é
ç½®ä»åºæ å°", erpWarehouseId); |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | | public Long getMesWarehouseIdByName(String erpWarehouseName) { |
| | | // æ¤æ¹æ³å·²ä¸åæ¨è使ç¨ï¼å»ºè®®é
ç½®æ å°è¡¨ |
| | | log.warn("[getMesWarehouseIdByName] 建议é
ç½®ä»åºæ å°è¡¨æ¿ä»£åç§°å¹é
ï¼erpWarehouseName={}", erpWarehouseName); |
| | | return null; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.product.mapping; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingCreateReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingUpdateReqVO; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.mapping.ErpMesWarehouseMappingDO; |
| | | |
| | | /** |
| | | * ERPä»åºä¸MESä»åºæ å° Service æ¥å£ |
| | | */ |
| | | public interface ErpMesWarehouseMappingService { |
| | | |
| | | /** |
| | | * å建ä»åºæ å° |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç¼å· |
| | | */ |
| | | Long createMapping(ErpMesWarehouseMappingCreateReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°ä»åºæ å° |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateMapping(ErpMesWarehouseMappingUpdateReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤ä»åºæ å° |
| | | * |
| | | * @param id ç¼å· |
| | | */ |
| | | void deleteMapping(Long id); |
| | | |
| | | /** |
| | | * è·åä»åºæ å° |
| | | * |
| | | * @param id ç¼å· |
| | | * @return ä»åºæ å° |
| | | */ |
| | | ErpMesWarehouseMappingDO getMapping(Long id); |
| | | |
| | | /** |
| | | * è·åä»åºæ å°å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢åæ° |
| | | * @return ä»åºæ å°å页 |
| | | */ |
| | | PageResult<ErpMesWarehouseMappingDO> getMappingPage(ErpMesWarehouseMappingPageReqVO pageReqVO); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.erp.service.product.mapping; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingCreateReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingPageReqVO; |
| | | import cn.iocoder.yudao.module.erp.controller.admin.mapping.vo.ErpMesWarehouseMappingUpdateReqVO; |
| | | import cn.iocoder.yudao.module.erp.convert.mapping.ErpMesWarehouseMappingConvert; |
| | | import cn.iocoder.yudao.module.erp.dal.dataobject.mapping.ErpMesWarehouseMappingDO; |
| | | import cn.iocoder.yudao.module.erp.dal.mysql.mapping.ErpMesWarehouseMappingMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * ERPä»åºä¸MESä»åºæ å° Service å®ç°ç±» |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class ErpMesWarehouseMappingServiceImpl implements ErpMesWarehouseMappingService { |
| | | |
| | | @Resource |
| | | private ErpMesWarehouseMappingMapper mappingMapper; |
| | | |
| | | @Override |
| | | public Long createMapping(ErpMesWarehouseMappingCreateReqVO createReqVO) { |
| | | // æ ¡éªERPä»åºæ¯å¦å·²å卿 å° |
| | | ErpMesWarehouseMappingDO existing = mappingMapper.selectByErpWarehouseId(createReqVO.getErpWarehouseId()); |
| | | if (existing != null) { |
| | | throw exception(WAREHOUSE_MAPPING_EXISTS); |
| | | } |
| | | |
| | | ErpMesWarehouseMappingDO mapping = ErpMesWarehouseMappingConvert.INSTANCE.convert(createReqVO); |
| | | mapping.setStatus(1); // é»è®¤å¯ç¨ |
| | | mappingMapper.insert(mapping); |
| | | return mapping.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateMapping(ErpMesWarehouseMappingUpdateReqVO updateReqVO) { |
| | | // æ ¡éªåå¨ |
| | | validateMappingExists(updateReqVO.getId()); |
| | | |
| | | ErpMesWarehouseMappingDO mapping = ErpMesWarehouseMappingConvert.INSTANCE.convert(updateReqVO); |
| | | mappingMapper.updateById(mapping); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteMapping(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateMappingExists(id); |
| | | mappingMapper.deleteById(id); |
| | | } |
| | | |
| | | private void validateMappingExists(Long id) { |
| | | if (mappingMapper.selectById(id) == null) { |
| | | throw exception(WAREHOUSE_MAPPING_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public ErpMesWarehouseMappingDO getMapping(Long id) { |
| | | return mappingMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<ErpMesWarehouseMappingDO> getMappingPage(ErpMesWarehouseMappingPageReqVO pageReqVO) { |
| | | return mappingMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | |
| | | import cn.iocoder.yudao.module.erp.enums.stock.ErpStockRecordBizTypeEnum; |
| | | import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import cn.iocoder.yudao.module.erp.service.product.mapping.ErpMdmMappingService; |
| | | import cn.iocoder.yudao.module.erp.service.stock.ErpStockRecordService; |
| | | import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO; |
| | | import cn.iocoder.yudao.module.wms.api.dto.WmsPurchaseInboundReqDTO; |
| | | import cn.iocoder.yudao.module.wms.api.stock.WmsStockApi; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { |
| | | |
| | | @Resource |
| | |
| | | private ErpAccountService accountService; |
| | | @Resource |
| | | private ErpStockRecordService stockRecordService; |
| | | |
| | | @Resource |
| | | private WmsStockApi wmsStockApi; |
| | | |
| | | @Resource |
| | | private ErpMdmMappingService mdmMappingService; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | |
| | | purchaseInItem.getProductId(), purchaseInItem.getWarehouseId(), count, |
| | | bizType, purchaseInItem.getInId(), purchaseInItem.getId(), purchaseIn.getNo())); |
| | | }); |
| | | |
| | | // 4. 忥 WMS åºåï¼MES åºåï¼ |
| | | if (approve) { |
| | | syncToWmsPurchaseInbound(purchaseIn, purchaseInItems); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 忥éè´å
¥åºå° WMS åºå |
| | | */ |
| | | private void syncToWmsPurchaseInbound(ErpPurchaseInDO purchaseIn, List<ErpPurchaseInItemDO> purchaseInItems) { |
| | | if (CollUtil.isEmpty(purchaseInItems)) { |
| | | return; |
| | | } |
| | | |
| | | log.info("[syncToWmsPurchaseInbound] å¼å§åæ¥éè´å
¥åºå°WMSï¼purchaseInId={}", purchaseIn.getId()); |
| | | |
| | | // æå»ºå
¥åºè¯·æ± |
| | | WmsPurchaseInboundReqDTO reqDTO = new WmsPurchaseInboundReqDTO() |
| | | .setBizId(purchaseIn.getId()) |
| | | .setBizCode(purchaseIn.getNo()) |
| | | .setReceiptTime(LocalDateTime.now()); |
| | | |
| | | // è½¬æ¢æç»é¡¹ |
| | | List<WmsPurchaseInboundReqDTO.Item> items = convertList(purchaseInItems, item -> { |
| | | // ERP 产å ID -> MDM ç©æ ID |
| | | Long mdmItemId = mdmMappingService.getMdmItemId(item.getProductId()); |
| | | // ERP ä»åº ID -> MES ä»åº ID |
| | | Long mesWarehouseId = mdmMappingService.getMesWarehouseId(item.getWarehouseId()); |
| | | |
| | | if (mdmItemId == null) { |
| | | log.warn("[syncToWmsPurchaseInbound] æªæ¾å°MDMç©ææ å°ï¼erpProductId={}", item.getProductId()); |
| | | return null; |
| | | } |
| | | if (mesWarehouseId == null) { |
| | | log.warn("[syncToWmsPurchaseInbound] æªæ¾å°MESä»åºæ å°ï¼erpWarehouseId={}", item.getWarehouseId()); |
| | | return null; |
| | | } |
| | | |
| | | return new WmsPurchaseInboundReqDTO.Item() |
| | | .setItemId(mdmItemId) |
| | | .setWarehouseId(mesWarehouseId) |
| | | .setQuantity(item.getCount()) |
| | | .setBizLineId(item.getId()); |
| | | }); |
| | | |
| | | // è¿æ»¤ææ å°å¤±è´¥ç项 |
| | | items = items.stream().filter(java.util.Objects::nonNull).toList(); |
| | | if (CollUtil.isEmpty(items)) { |
| | | log.warn("[syncToWmsPurchaseInbound] æ ææçå
¥åºæç»ï¼è·³è¿WMS忥"); |
| | | return; |
| | | } |
| | | |
| | | reqDTO.setItems(items); |
| | | |
| | | try { |
| | | Long transactionId = wmsStockApi.purchaseInbound(reqDTO); |
| | | log.info("[syncToWmsPurchaseInbound] 忥æåï¼transactionId={}", transactionId); |
| | | } catch (Exception e) { |
| | | log.error("[syncToWmsPurchaseInbound] åæ¥å¤±è´¥", e); |
| | | // 注æï¼è¿éå¯ä»¥éæ©æåºå¼å¸¸åæ»ï¼æä»
è®°å½æ¥å¿ |
| | | // throw exception(PURCHASE_IN_SYNC_WMS_FAIL); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | */ |
| | | List<ErpPurchaseOrderItemDO> getPurchaseOrderItemListByOrderIds(Collection<Long> orderIds); |
| | | |
| | | /** |
| | | * æ ¹æ®ä¾åºåç¼å·åç¶æè·åéè´è®¢åå表 |
| | | * |
| | | * @param supplierId ä¾åºåç¼å· |
| | | * @param status ç¶æ |
| | | * @return éè´è®¢åå表 |
| | | */ |
| | | List<ErpPurchaseOrderDO> getPurchaseOrderListBySupplierIdAndStatus(Long supplierId, Integer status); |
| | | |
| | | /** |
| | | * æ ¹æ®ç¼å·å表è·åéè´è®¢åå表 |
| | | * |
| | | * @param ids ç¼å·å表 |
| | | * @return éè´è®¢åå表 |
| | | */ |
| | | List<ErpPurchaseOrderDO> getPurchaseOrderList(List<Long> ids); |
| | | |
| | | } |
| | |
| | | return purchaseOrderItemMapper.selectListByOrderIds(orderIds); |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpPurchaseOrderDO> getPurchaseOrderListBySupplierIdAndStatus(Long supplierId, Integer status) { |
| | | if (supplierId == null) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return purchaseOrderMapper.selectList(supplierId, status); |
| | | } |
| | | |
| | | @Override |
| | | public List<ErpPurchaseOrderDO> getPurchaseOrderList(List<Long> ids) { |
| | | if (CollUtil.isEmpty(ids)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | return purchaseOrderMapper.selectByIds(ids); |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.erp.enums.stock.ErpStockRecordBizTypeEnum; |
| | | import cn.iocoder.yudao.module.erp.service.finance.ErpAccountService; |
| | | import cn.iocoder.yudao.module.erp.service.product.ErpProductService; |
| | | import cn.iocoder.yudao.module.erp.service.product.mapping.ErpMdmMappingService; |
| | | import cn.iocoder.yudao.module.erp.service.stock.ErpStockRecordService; |
| | | import cn.iocoder.yudao.module.erp.service.stock.bo.ErpStockRecordCreateReqBO; |
| | | import cn.iocoder.yudao.module.wms.api.dto.WmsSalesOutboundReqDTO; |
| | | import cn.iocoder.yudao.module.wms.api.stock.WmsStockApi; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class ErpSaleOutServiceImpl implements ErpSaleOutService { |
| | | |
| | | @Resource |
| | |
| | | private ErpAccountService accountService; |
| | | @Resource |
| | | private ErpStockRecordService stockRecordService; |
| | | |
| | | @Resource |
| | | private WmsStockApi wmsStockApi; |
| | | |
| | | @Resource |
| | | private ErpMdmMappingService mdmMappingService; |
| | | |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | |
| | | saleOutItem.getProductId(), saleOutItem.getWarehouseId(), count, |
| | | bizType, saleOutItem.getOutId(), saleOutItem.getId(), saleOut.getNo())); |
| | | }); |
| | | |
| | | // 4. 忥 WMS åºåï¼MES åºåï¼ |
| | | if (approve) { |
| | | syncToWmsSalesOutbound(saleOut, saleOutItems); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 忥éå®åºåºå° WMS åºå |
| | | */ |
| | | private void syncToWmsSalesOutbound(ErpSaleOutDO saleOut, List<ErpSaleOutItemDO> saleOutItems) { |
| | | if (CollUtil.isEmpty(saleOutItems)) { |
| | | return; |
| | | } |
| | | |
| | | log.info("[syncToWmsSalesOutbound] å¼å§åæ¥éå®åºåºå°WMSï¼saleOutId={}", saleOut.getId()); |
| | | |
| | | // æå»ºåºåºè¯·æ± |
| | | WmsSalesOutboundReqDTO reqDTO = new WmsSalesOutboundReqDTO() |
| | | .setBizId(saleOut.getId()) |
| | | .setBizCode(saleOut.getNo()) |
| | | .setOutboundTime(LocalDateTime.now()); |
| | | |
| | | // è½¬æ¢æç»é¡¹ |
| | | List<WmsSalesOutboundReqDTO.Item> items = convertList(saleOutItems, item -> { |
| | | // ERP 产å ID -> MDM ç©æ ID |
| | | Long mdmItemId = mdmMappingService.getMdmItemId(item.getProductId()); |
| | | // ERP ä»åº ID -> MES ä»åº ID |
| | | Long mesWarehouseId = mdmMappingService.getMesWarehouseId(item.getWarehouseId()); |
| | | |
| | | if (mdmItemId == null) { |
| | | log.warn("[syncToWmsSalesOutbound] æªæ¾å°MDMç©ææ å°ï¼erpProductId={}", item.getProductId()); |
| | | return null; |
| | | } |
| | | if (mesWarehouseId == null) { |
| | | log.warn("[syncToWmsSalesOutbound] æªæ¾å°MESä»åºæ å°ï¼erpWarehouseId={}", item.getWarehouseId()); |
| | | return null; |
| | | } |
| | | |
| | | return new WmsSalesOutboundReqDTO.Item() |
| | | .setItemId(mdmItemId) |
| | | .setWarehouseId(mesWarehouseId) |
| | | .setQuantity(item.getCount()) |
| | | .setBizLineId(item.getId()); |
| | | }); |
| | | |
| | | // è¿æ»¤ææ å°å¤±è´¥ç项 |
| | | items = items.stream().filter(java.util.Objects::nonNull).toList(); |
| | | if (CollUtil.isEmpty(items)) { |
| | | log.warn("[syncToWmsSalesOutbound] æ ææçåºåºæç»ï¼è·³è¿WMS忥"); |
| | | return; |
| | | } |
| | | |
| | | reqDTO.setItems(items); |
| | | |
| | | try { |
| | | Long transactionId = wmsStockApi.salesOutbound(reqDTO); |
| | | log.info("[syncToWmsSalesOutbound] 忥æåï¼transactionId={}", transactionId); |
| | | } catch (Exception e) { |
| | | log.error("[syncToWmsSalesOutbound] åæ¥å¤±è´¥", e); |
| | | } |
| | | } |
| | | |
| | | @Override |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao</artifactId> |
| | | <version>${revision}</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <artifactId>yudao-module-hrm-api</artifactId> |
| | | <packaging>jar</packaging> |
| | | |
| | | <name>${project.artifactId}</name> |
| | | <description> |
| | | hrm 模åä¸ï¼äººåèµæºç®¡çç API æ¥å£å®ä¹ï¼ä¾å
¶ä»æ¨¡åå¼ç¨ |
| | | </description> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-common</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Swagger 注解 --> |
| | | <dependency> |
| | | <groupId>org.springdoc</groupId> |
| | | <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> |
| | | <scope>provided</scope> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.exception.ErrorCode; |
| | | |
| | | /** |
| | | * HRM éè¯¯ç æä¸¾ç±» |
| | | * <p> |
| | | * hrm ç³»ç»ï¼ä½¿ç¨ 1-030-000-000 段 |
| | | */ |
| | | public interface ErrorCodeConstants { |
| | | |
| | | // ========== åå·¥ä¿¡æ¯ 1-030-000-000 ========== |
| | | ErrorCode EMPLOYEE_NOT_EXISTS = new ErrorCode(1_030_000_000, "åå·¥ä¸åå¨"); |
| | | ErrorCode EMPLOYEE_NO_EXISTS = new ErrorCode(1_030_000_001, "åå·¥ç¼å·å·²åå¨"); |
| | | ErrorCode EMPLOYEE_PHONE_EXISTS = new ErrorCode(1_030_000_002, "ææºå·å·²åå¨ï¼è¯·æ´æ¢ææºå·"); |
| | | ErrorCode EMPLOYEE_EDUCATION_NOT_EXISTS = new ErrorCode(1_030_000_003, "æè²ç»åä¸åå¨"); |
| | | ErrorCode EMPLOYEE_WORK_HISTORY_NOT_EXISTS = new ErrorCode(1_030_000_004, "å·¥ä½ç»åä¸åå¨"); |
| | | ErrorCode EMPLOYEE_EMERGENCY_CONTACT_NOT_EXISTS = new ErrorCode(1_030_000_005, "ç´§æ¥è系人ä¸åå¨"); |
| | | |
| | | // ========== 请åç³è¯· 1-030-001-000 ========== |
| | | ErrorCode LEAVE_APPLICATION_NOT_EXISTS = new ErrorCode(1_030_001_000, "请åç³è¯·ä¸åå¨"); |
| | | ErrorCode LEAVE_APPLICATION_UPDATE_FAIL_NOT_DRAFT = new ErrorCode(1_030_001_001, "请åç³è¯·æ´æ°å¤±è´¥ï¼åå ï¼ä¸æ¯èç¨¿ç¶æ"); |
| | | ErrorCode LEAVE_APPLICATION_SUBMIT_FAIL_NOT_DRAFT = new ErrorCode(1_030_001_002, "请åç³è¯·æäº¤å¤±è´¥ï¼åå ï¼ä¸æ¯èç¨¿ç¶æ"); |
| | | ErrorCode LEAVE_APPLICATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_030_001_003, "æ´æ°è¯·åç³è¯·å®¡æ¹ç¶æå¤±è´¥ï¼åå ï¼ä¸æ¯å®¡æ¹ä¸ç¶æ"); |
| | | ErrorCode LEAVE_APPLICATION_NO_EXISTS = new ErrorCode(1_030_001_004, "çæè¯·åç³è¯·åå·éå¤ï¼è¯·éè¯"); |
| | | ErrorCode LEAVE_APPLICATION_DURATION_EXCEED = new ErrorCode(1_030_001_005, "è¯·åæ¶é¿è¶
åºå¹´åä½é¢"); |
| | | ErrorCode LEAVE_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_030_001_006, "请åå®¡æ¹æµç¨ä¸åå¨"); |
| | | |
| | | // ========== è°å²ç³è¯· 1-030-002-000 ========== |
| | | ErrorCode TRANSFER_APPLICATION_NOT_EXISTS = new ErrorCode(1_030_002_000, "è°å²ç³è¯·ä¸åå¨"); |
| | | ErrorCode TRANSFER_APPLICATION_UPDATE_FAIL_NOT_DRAFT = new ErrorCode(1_030_002_001, "è°å²ç³è¯·æ´æ°å¤±è´¥ï¼åå ï¼ä¸æ¯èç¨¿ç¶æ"); |
| | | ErrorCode TRANSFER_APPLICATION_SUBMIT_FAIL_NOT_DRAFT = new ErrorCode(1_030_002_002, "è°å²ç³è¯·æäº¤å¤±è´¥ï¼åå ï¼ä¸æ¯èç¨¿ç¶æ"); |
| | | ErrorCode TRANSFER_APPLICATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_030_002_003, "æ´æ°è°å²ç³è¯·å®¡æ¹ç¶æå¤±è´¥ï¼åå ï¼ä¸æ¯å®¡æ¹ä¸ç¶æ"); |
| | | ErrorCode TRANSFER_APPLICATION_NO_EXISTS = new ErrorCode(1_030_002_004, "çæè°å²ç³è¯·åå·éå¤ï¼è¯·éè¯"); |
| | | ErrorCode TRANSFER_APPLICATION_SAME_DEPT = new ErrorCode(1_030_002_005, "è°å²å¤±è´¥ï¼åå ï¼ç®æ é¨é¨ä¸åé¨é¨ç¸å"); |
| | | ErrorCode TRANSFER_APPLICATION_SAME_POST = new ErrorCode(1_030_002_006, "è°å²å¤±è´¥ï¼åå ï¼ç®æ å²ä½ä¸åå²ä½ç¸å"); |
| | | ErrorCode TRANSFER_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_030_002_007, "è°å²å®¡æ¹æµç¨ä¸åå¨"); |
| | | |
| | | // ========== 离èç³è¯· 1-030-003-000 ========== |
| | | ErrorCode RESIGNATION_APPLICATION_NOT_EXISTS = new ErrorCode(1_030_003_000, "离èç³è¯·ä¸åå¨"); |
| | | ErrorCode RESIGNATION_APPLICATION_UPDATE_FAIL_NOT_DRAFT = new ErrorCode(1_030_003_001, "离èç³è¯·æ´æ°å¤±è´¥ï¼åå ï¼ä¸æ¯èç¨¿ç¶æ"); |
| | | ErrorCode RESIGNATION_APPLICATION_SUBMIT_FAIL_NOT_DRAFT = new ErrorCode(1_030_003_002, "离èç³è¯·æäº¤å¤±è´¥ï¼åå ï¼ä¸æ¯èç¨¿ç¶æ"); |
| | | ErrorCode RESIGNATION_APPLICATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1_030_003_003, "æ´æ°ç¦»èç³è¯·å®¡æ¹ç¶æå¤±è´¥ï¼åå ï¼ä¸æ¯å®¡æ¹ä¸ç¶æ"); |
| | | ErrorCode RESIGNATION_APPLICATION_NO_EXISTS = new ErrorCode(1_030_003_004, "çæç¦»èç³è¯·åå·éå¤ï¼è¯·éè¯"); |
| | | ErrorCode RESIGNATION_APPLICATION_EXISTS = new ErrorCode(1_030_003_005, "该å工已åå¨ç¦»èç³è¯·ï¼è¯·å¿éå¤æäº¤"); |
| | | ErrorCode RESIGNATION_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_030_003_006, "离èå®¡æ¹æµç¨ä¸åå¨"); |
| | | |
| | | // ========== èå¤ç®¡ç 1-030-004-000 ========== |
| | | ErrorCode ATTENDANCE_RECORD_NOT_EXISTS = new ErrorCode(1_030_004_000, "èå¤è®°å½ä¸åå¨"); |
| | | ErrorCode ATTENDANCE_RECORD_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_030_004_001, "导å
¥è夿°æ®ä¸è½ä¸ºç©º"); |
| | | ErrorCode ATTENDANCE_RECORD_EXISTS = new ErrorCode(1_030_004_002, "该å工彿¥èå¤è®°å½å·²åå¨"); |
| | | ErrorCode ATTENDANCE_EXCEPTION_NOT_EXISTS = new ErrorCode(1_030_004_003, "èå¤å¼å¸¸ç³è¯·ä¸åå¨"); |
| | | ErrorCode ATTENDANCE_EXCEPTION_SUBMIT_FAIL_NOT_DRAFT = new ErrorCode(1_030_004_004, "èå¤å¼å¸¸ç³è¯·æäº¤å¤±è´¥ï¼åå ï¼ä¸æ¯èç¨¿ç¶æ"); |
| | | ErrorCode ATTENDANCE_RULE_NOT_EXISTS = new ErrorCode(1_030_004_005, "èå¤è§åä¸åå¨"); |
| | | ErrorCode ATTENDANCE_RULE_NAME_EXISTS = new ErrorCode(1_030_004_006, "èå¤è§ååç§°å·²åå¨"); |
| | | ErrorCode ATTENDANCE_RULE_DEPT_EXISTS = new ErrorCode(1_030_004_007, "该é¨é¨å·²é
ç½®èå¤è§å"); |
| | | ErrorCode ATTENDANCE_HOLIDAY_NOT_EXISTS = new ErrorCode(1_030_004_008, "è忥é
ç½®ä¸åå¨"); |
| | | ErrorCode ATTENDANCE_HOLIDAY_DATE_EXISTS = new ErrorCode(1_030_004_009, "è¯¥æ¥æè忥é
置已åå¨"); |
| | | ErrorCode ATTENDANCE_CLOCK_FAIL_NO_RULE = new ErrorCode(1_030_004_010, "æå¡å¤±è´¥ï¼æªæ¾å°èå¤è§å"); |
| | | ErrorCode ATTENDANCE_CLOCK_FAIL_HOLIDAY = new ErrorCode(1_030_004_011, "æå¡å¤±è´¥ï¼å½æ¥ä¸ºä¼æ¯æ¥"); |
| | | ErrorCode ATTENDANCE_CLOCK_FAIL_NOT_WORKDAY = new ErrorCode(1_030_004_012, "æå¡å¤±è´¥ï¼å½æ¥ä¸æ¯å·¥ä½æ¥"); |
| | | ErrorCode ATTENDANCE_SUMMARY_NOT_EXISTS = new ErrorCode(1_030_004_013, "è夿±æ»è®°å½ä¸åå¨"); |
| | | ErrorCode ATTENDANCE_EXCEPTION_UPDATE_AUDIT_STATUS_FAIL = new ErrorCode(1_030_004_014, "æ´æ°èå¤å¼å¸¸å®¡æ¹ç¶æå¤±è´¥ï¼åå ï¼ä¸æ¯å®¡æ¹ä¸ç¶æ"); |
| | | ErrorCode ATTENDANCE_EXCEPTION_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_030_004_015, "èå¤å¼å¸¸å®¡æ¹æµç¨ä¸åå¨"); |
| | | ErrorCode ATTENDANCE_CLOCK_ALREADY_CLOCKED = new ErrorCode(1_030_004_016, "å·²æè¿å¡ï¼è¯·å¿é夿å¡"); |
| | | |
| | | // ========== èªé
¬ç®¡ç 1-030-005-000 ========== |
| | | ErrorCode SALARY_STRUCTURE_NOT_EXISTS = new ErrorCode(1_030_005_000, "èªé
¬ç»æä¸åå¨"); |
| | | ErrorCode EMPLOYEE_SALARY_NOT_EXISTS = new ErrorCode(1_030_005_001, "åå·¥èªé
¬æ¡£æ¡ä¸åå¨"); |
| | | ErrorCode EMPLOYEE_SALARY_EXISTS = new ErrorCode(1_030_005_002, "该åå·¥èªé
¬æ¡£æ¡å·²åå¨"); |
| | | ErrorCode SALARY_CALCULATION_NOT_EXISTS = new ErrorCode(1_030_005_003, "èªé
¬æ ¸ç®è®°å½ä¸åå¨"); |
| | | ErrorCode SALARY_CALCULATION_EXISTS = new ErrorCode(1_030_005_004, "该å工彿èªé
¬æ ¸ç®è®°å½å·²åå¨"); |
| | | ErrorCode SALARY_CALCULATION_CONFIRM_FAIL = new ErrorCode(1_030_005_005, "èªé
¬æ ¸ç®ç¡®è®¤å¤±è´¥ï¼åå ï¼ä¸æ¯å¾
ç¡®è®¤ç¶æ"); |
| | | ErrorCode SALARY_PAYMENT_NOT_EXISTS = new ErrorCode(1_030_005_006, "èªèµåæ¾è®°å½ä¸åå¨"); |
| | | ErrorCode SOCIAL_SECURITY_CONFIG_NOT_EXISTS = new ErrorCode(1_030_005_007, "社ä¿å
¬ç§¯éé
ç½®ä¸åå¨"); |
| | | ErrorCode TAX_RATE_CONFIG_NOT_EXISTS = new ErrorCode(1_030_005_008, "个ç¨ç¨çé
ç½®ä¸åå¨"); |
| | | ErrorCode EMPLOYEE_SOCIAL_SECURITY_NOT_EXISTS = new ErrorCode(1_030_005_009, "å工社ä¿å
¬ç§¯éæ¡£æ¡ä¸åå¨"); |
| | | ErrorCode SOCIAL_SECURITY_SCHEME_NOT_EXISTS = new ErrorCode(1_030_005_010, "社ä¿å
¬ç§¯éæ¹æ¡ä¸åå¨"); |
| | | ErrorCode LEAVE_TYPE_CONFIG_NOT_EXISTS = new ErrorCode(1_030_005_011, "请åç±»åæ£æ¬¾é
ç½®ä¸åå¨"); |
| | | ErrorCode SALARY_PAYMENT_EXISTS = new ErrorCode(1_030_005_012, "è¯¥å¨æèªèµåæ¾å°è´¦å·²åå¨"); |
| | | ErrorCode SALARY_CALCULATION_NO_CONFIRMED = new ErrorCode(1_030_005_013, "è¯¥å¨ææ²¡æå·²ç¡®è®¤çèªé
¬æ ¸ç®è®°å½"); |
| | | ErrorCode SALARY_PAYMENT_ALREADY_PAY = new ErrorCode(1_030_005_014, "èªèµåæ¾å°è´¦å·²åæ¾ï¼è¯·å¿é夿ä½"); |
| | | ErrorCode SALARY_PAYMENT_DETAIL_NO_EXISTS = new ErrorCode(1_030_005_015, "没æå¾
åæ¾çæç»è®°å½"); |
| | | ErrorCode SALARY_PAYMENT_DETAIL_NOT_EXISTS = new ErrorCode(1_030_005_016, "èªèµåæ¾æç»ä¸åå¨"); |
| | | ErrorCode SALARY_PAYMENT_DETAIL_ALREADY_PAY = new ErrorCode(1_030_005_017, "该æç»å·²åæ¾ï¼è¯·å¿é夿ä½"); |
| | | ErrorCode SALARY_CALCULATION_DUPLICATE = new ErrorCode(1_030_005_018, "åå·¥ã{}ãå¨å¨æã{}ãåå¨éå¤çèªé
¬æ ¸ç®è®°å½ï¼è¯·è系管çåå¤ç"); |
| | | ErrorCode SALARY_CALCULATION_REVOKE_FAIL = new ErrorCode(1_030_005_019, "æ¤é确认失败ï¼åå ï¼ä¸æ¯å·²ç¡®è®¤ç¶æ"); |
| | | ErrorCode SALARY_CALCULATION_DELETE_FAIL = new ErrorCode(1_030_005_020, "å é¤å¤±è´¥ï¼åå ï¼ä»
å¾
ç¡®è®¤ç¶æå¯å é¤"); |
| | | ErrorCode SALARY_CALCULATION_ALREADY_PAY = new ErrorCode(1_030_005_021, "è¯¥æ ¸ç®è®°å½å·²åæ¾ï¼æ æ³æ¤é"); |
| | | ErrorCode SALARY_PAYMENT_REVOKE_FAIL = new ErrorCode(1_030_005_022, "æ¤éåæ¾å¤±è´¥ï¼åå ï¼è¯¥æç»æªåæ¾"); |
| | | ErrorCode SALARY_PAYMENT_DELETE_FAIL = new ErrorCode(1_030_005_023, "å é¤å¤±è´¥ï¼åå ï¼ä»
å¾
åæ¾ç¶æå¯å é¤ï¼è¯·å
æ¤é已忾æç»"); |
| | | ErrorCode SALARY_PAYMENT_HAS_PAID_DETAIL = new ErrorCode(1_030_005_024, "å é¤å¤±è´¥ï¼åå ï¼åå¨å·²åæ¾æç»ï¼è¯·å
æ¤é"); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * è夿å¡ç±»åæä¸¾ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum HrmAttendanceClockTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | NORMAL(1, "æ£å¸¸"), |
| | | LATE(2, "è¿å°"), |
| | | EARLY(3, "æ©é"), |
| | | MISSING(4, "缺å¡"); |
| | | |
| | | private final Integer type; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(HrmAttendanceClockTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * è夿°æ®æ¥æºæä¸¾ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum HrmAttendanceDataSourceEnum implements ArrayValuable<Integer> { |
| | | |
| | | CLOCK(1, "æå¡"), |
| | | IMPORT(2, "导å
¥"), |
| | | SUPPLEMENT(3, "è¡¥å¡å®¡æ¹"); |
| | | |
| | | private final Integer type; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(HrmAttendanceDataSourceEnum::getType).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * èå¤å¼å¸¸ç±»åæä¸¾ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum HrmAttendanceExceptionTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | SUPPLEMENT(1, "è¡¥å¡"), |
| | | OVERTIME(2, "å ç"), |
| | | BUSINESS_TRIP(3, "åºå·®"); |
| | | |
| | | private final Integer type; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(HrmAttendanceExceptionTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * èå¤èåæ¥ç±»åæä¸¾ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum HrmAttendanceHolidayTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | REST_DAY(1, "伿¯æ¥"), |
| | | WORK_DAY(2, "工使¥"); |
| | | |
| | | private final Integer type; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(HrmAttendanceHolidayTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * HRM ç审æ¹ç¶æ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum HrmAuditStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | DRAFT(0, "è稿"), |
| | | PROCESS(10, "审æ¹ä¸"), |
| | | APPROVE(20, "审æ¹éè¿"), |
| | | REJECT(30, "审æ¹é©³å"), |
| | | CANCEL(40, "å·²æ¤é"); |
| | | |
| | | private final Integer status; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(HrmAuditStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | public static String getNameByStatus(Integer status) { |
| | | return Arrays.stream(values()) |
| | | .filter(e -> e.getStatus().equals(status)) |
| | | .findFirst() |
| | | .map(HrmAuditStatusEnum::getName) |
| | | .orElse(""); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * å¦åæä¸¾ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum HrmDegreeEnum implements ArrayValuable<Integer> { |
| | | |
| | | HIGH_SCHOOL(1, "é«ä¸"), |
| | | COLLEGE(2, "大ä¸"), |
| | | BACHELOR(3, "æ¬ç§"), |
| | | MASTER(4, "ç¡å£«"), |
| | | DOCTOR(5, "å士"); |
| | | |
| | | private final Integer degree; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(HrmDegreeEnum::getDegree).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * åå·¥ç¶ææä¸¾ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum HrmEmployeeStatusEnum implements ArrayValuable<Integer> { |
| | | |
| | | ON_JOB(1, "å¨è"), |
| | | TRIAL(2, "è¯ç¨"), |
| | | LEAVE(3, "离è"); |
| | | |
| | | private final Integer status; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(HrmEmployeeStatusEnum::getStatus).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * 请åç±»åæä¸¾ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum HrmLeaveTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | PERSONAL(1, "äºå"), |
| | | SICK(2, "ç
å"), |
| | | ANNUAL(3, "å¹´å"), |
| | | MARRIAGE(4, "å©å"), |
| | | MATERNITY(5, "产å"), |
| | | BEREAVEMENT(6, "丧å"); |
| | | |
| | | private final Integer type; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(HrmLeaveTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | public static String getNameByStatus(Integer type) { |
| | | return Arrays.stream(values()) |
| | | .filter(e -> e.getType().equals(type)) |
| | | .findFirst() |
| | | .map(HrmLeaveTypeEnum::getName) |
| | | .orElse(""); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * 离èç±»åæä¸¾ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum HrmResignationTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | VOLUNTARY(1, "主å¨ç¦»è"), |
| | | INVOLUNTARY(2, "被å¨ç¦»è"), |
| | | CONTRACT_EXPIRED(3, "ååå°æ"); |
| | | |
| | | private final Integer type; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(HrmResignationTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | public static String getNameByStatus(Integer type) { |
| | | return Arrays.stream(values()) |
| | | .filter(e -> e.getType().equals(type)) |
| | | .findFirst() |
| | | .map(HrmResignationTypeEnum::getName) |
| | | .orElse(""); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.enums; |
| | | |
| | | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| | | import lombok.Getter; |
| | | import lombok.RequiredArgsConstructor; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * è°å²ç±»åæä¸¾ |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Getter |
| | | public enum HrmTransferTypeEnum implements ArrayValuable<Integer> { |
| | | |
| | | LATERAL(1, "å¹³è°"), |
| | | PROMOTION(2, "åè"), |
| | | DEMOTION(3, "éè"); |
| | | |
| | | private final Integer type; |
| | | private final String name; |
| | | |
| | | public static final Integer[] ARRAYS = Arrays.stream(values()).map(HrmTransferTypeEnum::getType).toArray(Integer[]::new); |
| | | |
| | | @Override |
| | | public Integer[] array() { |
| | | return ARRAYS; |
| | | } |
| | | |
| | | public static String getNameByStatus(Integer type) { |
| | | return Arrays.stream(values()) |
| | | .filter(e -> e.getType().equals(type)) |
| | | .findFirst() |
| | | .map(HrmTransferTypeEnum::getName) |
| | | .orElse(""); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <project xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| | | xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <parent> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao</artifactId> |
| | | <version>${revision}</version> |
| | | </parent> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <artifactId>yudao-module-hrm</artifactId> |
| | | <packaging>jar</packaging> |
| | | |
| | | <name>${project.artifactId}</name> |
| | | <description> |
| | | hrm 模åä¸ï¼äººåèµæºç®¡çï¼Human Resource Managementï¼ã |
| | | ä¾å¦è¯´ï¼èå¤ç®¡çãèªé
¬ç®¡çã人äºå®¡æ¹ï¼è¯·åãè°å²ã离èï¼ç |
| | | </description> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-hrm-api</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-system</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-module-bpm</artifactId> |
| | | <version>${revision}</version> |
| | | </dependency> |
| | | |
| | | <!-- ä¸å¡ç»ä»¶ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-biz-data-permission</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Web ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-web</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-security</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- DB ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-mybatis</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-redis</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- å·¥å
·ç±»ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-excel</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- Test æµè¯ç¸å
³ --> |
| | | <dependency> |
| | | <groupId>cn.iocoder.boot</groupId> |
| | | <artifactId>yudao-spring-boot-starter-test</artifactId> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | | </project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.service.approval.HrmLeaveApplicationService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM 请åç³è¯·") |
| | | @RestController |
| | | @RequestMapping("/hrm/leave") |
| | | @Validated |
| | | public class HrmLeaveApplicationController { |
| | | |
| | | @Resource |
| | | private HrmLeaveApplicationService leaveApplicationService; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建请åç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('hrm:leave:create')") |
| | | public CommonResult<Long> createLeaveApplication(@Valid @RequestBody HrmLeaveApplicationSaveReqVO createReqVO) { |
| | | return success(leaveApplicationService.createLeaveApplication(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°è¯·åç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('hrm:leave:update')") |
| | | public CommonResult<Boolean> updateLeaveApplication(@Valid @RequestBody HrmLeaveApplicationSaveReqVO updateReqVO) { |
| | | leaveApplicationService.updateLeaveApplication(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤è¯·åç³è¯·") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:leave:delete')") |
| | | public CommonResult<Boolean> deleteLeaveApplication(@RequestParam("id") Long id) { |
| | | leaveApplicationService.deleteLeaveApplication(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾è¯·åç³è¯·è¯¦æ
") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:leave:query')") |
| | | public CommonResult<HrmLeaveApplicationRespVO> getLeaveApplication(@RequestParam("id") Long id) { |
| | | return success(leaveApplicationService.getLeaveApplicationDetail(id)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾è¯·åç³è¯·å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:leave:query')") |
| | | public CommonResult<PageResult<HrmLeaveApplicationRespVO>> getLeaveApplicationPage(@Valid HrmLeaveApplicationPageReqVO pageReqVO) { |
| | | return success(leaveApplicationService.getLeaveApplicationPage(pageReqVO)); |
| | | } |
| | | |
| | | @PostMapping("/submit") |
| | | @Operation(summary = "æäº¤è¯·åç³è¯·å®¡æ¹") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @Parameter(name = "processDefinitionKey", description = "æµç¨å®ä¹Key", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:leave:submit')") |
| | | public CommonResult<Boolean> submitLeaveApplication(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | // è·åå½åç¨æ·ID |
| | | AdminUserRespDTO user = adminUserApi.getUser(1L); // TODO: è·åå½åç»å½ç¨æ· |
| | | leaveApplicationService.submitLeaveApplication(id, processDefinitionKey, user.getId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/approve-process-definition-list") |
| | | @Operation(summary = "è·åå¯ç¨çå®¡æ¹æµç¨å®ä¹å表") |
| | | @PreAuthorize("@ss.hasPermission('hrm:leave:query')") |
| | | public CommonResult<List<Map<String, Object>>> getApproveProcessDefinitionList() { |
| | | return success(leaveApplicationService.getApproveProcessDefinitionList()); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºè¯·åç³è¯· Excel") |
| | | @PreAuthorize("@ss.hasPermission('hrm:leave:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportLeaveApplicationExcel(@Valid HrmLeaveApplicationPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | List<HrmLeaveApplicationRespVO> list = leaveApplicationService.getLeaveApplicationPage(pageReqVO).getList(); |
| | | ExcelUtils.write(response, "请åç³è¯·.xls", "æ°æ®", |
| | | HrmLeaveApplicationRespVO.class, list); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.service.approval.HrmResignationApplicationService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM 离èç³è¯·") |
| | | @RestController |
| | | @RequestMapping("/hrm/resignation") |
| | | @Validated |
| | | public class HrmResignationApplicationController { |
| | | |
| | | @Resource |
| | | private HrmResignationApplicationService resignationApplicationService; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建离èç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('hrm:resignation:create')") |
| | | public CommonResult<Long> createResignationApplication(@Valid @RequestBody HrmResignationApplicationSaveReqVO createReqVO) { |
| | | return success(resignationApplicationService.createResignationApplication(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°ç¦»èç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('hrm:resignation:update')") |
| | | public CommonResult<Boolean> updateResignationApplication(@Valid @RequestBody HrmResignationApplicationSaveReqVO updateReqVO) { |
| | | resignationApplicationService.updateResignationApplication(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ç¦»èç³è¯·") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:resignation:delete')") |
| | | public CommonResult<Boolean> deleteResignationApplication(@RequestParam("id") Long id) { |
| | | resignationApplicationService.deleteResignationApplication(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾ç¦»èç³è¯·è¯¦æ
") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:resignation:query')") |
| | | public CommonResult<HrmResignationApplicationRespVO> getResignationApplication(@RequestParam("id") Long id) { |
| | | return success(resignationApplicationService.getResignationApplicationDetail(id)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾ç¦»èç³è¯·å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:resignation:query')") |
| | | public CommonResult<PageResult<HrmResignationApplicationRespVO>> getResignationApplicationPage(@Valid HrmResignationApplicationPageReqVO pageReqVO) { |
| | | return success(resignationApplicationService.getResignationApplicationPage(pageReqVO)); |
| | | } |
| | | |
| | | @PostMapping("/submit") |
| | | @Operation(summary = "æäº¤ç¦»èç³è¯·å®¡æ¹") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @Parameter(name = "processDefinitionKey", description = "æµç¨å®ä¹Key", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:resignation:submit')") |
| | | public CommonResult<Boolean> submitResignationApplication(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | AdminUserRespDTO user = adminUserApi.getUser(1L); // TODO: è·åå½åç»å½ç¨æ· |
| | | resignationApplicationService.submitResignationApplication(id, processDefinitionKey, user.getId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/approve-process-definition-list") |
| | | @Operation(summary = "è·åå¯ç¨çå®¡æ¹æµç¨å®ä¹å表") |
| | | @PreAuthorize("@ss.hasPermission('hrm:resignation:query')") |
| | | public CommonResult<List<Map<String, Object>>> getApproveProcessDefinitionList() { |
| | | return success(resignationApplicationService.getApproveProcessDefinitionList()); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºç¦»èç³è¯· Excel") |
| | | @PreAuthorize("@ss.hasPermission('hrm:resignation:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportResignationApplicationExcel(@Valid HrmResignationApplicationPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | List<HrmResignationApplicationRespVO> list = resignationApplicationService.getResignationApplicationPage(pageReqVO).getList(); |
| | | ExcelUtils.write(response, "离èç³è¯·.xls", "æ°æ®", |
| | | HrmResignationApplicationRespVO.class, list); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.service.approval.HrmTransferApplicationService; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM è°å²ç³è¯·") |
| | | @RestController |
| | | @RequestMapping("/hrm/transfer") |
| | | @Validated |
| | | public class HrmTransferApplicationController { |
| | | |
| | | @Resource |
| | | private HrmTransferApplicationService transferApplicationService; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建è°å²ç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('hrm:transfer:create')") |
| | | public CommonResult<Long> createTransferApplication(@Valid @RequestBody HrmTransferApplicationSaveReqVO createReqVO) { |
| | | return success(transferApplicationService.createTransferApplication(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°è°å²ç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('hrm:transfer:update')") |
| | | public CommonResult<Boolean> updateTransferApplication(@Valid @RequestBody HrmTransferApplicationSaveReqVO updateReqVO) { |
| | | transferApplicationService.updateTransferApplication(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤è°å²ç³è¯·") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:transfer:delete')") |
| | | public CommonResult<Boolean> deleteTransferApplication(@RequestParam("id") Long id) { |
| | | transferApplicationService.deleteTransferApplication(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾è°å²ç³è¯·è¯¦æ
") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:transfer:query')") |
| | | public CommonResult<HrmTransferApplicationRespVO> getTransferApplication(@RequestParam("id") Long id) { |
| | | return success(transferApplicationService.getTransferApplicationDetail(id)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾è°å²ç³è¯·å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:transfer:query')") |
| | | public CommonResult<PageResult<HrmTransferApplicationRespVO>> getTransferApplicationPage(@Valid HrmTransferApplicationPageReqVO pageReqVO) { |
| | | return success(transferApplicationService.getTransferApplicationPage(pageReqVO)); |
| | | } |
| | | |
| | | @PostMapping("/submit") |
| | | @Operation(summary = "æäº¤è°å²ç³è¯·å®¡æ¹") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @Parameter(name = "processDefinitionKey", description = "æµç¨å®ä¹Key", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:transfer:submit')") |
| | | public CommonResult<Boolean> submitTransferApplication(@RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | AdminUserRespDTO user = adminUserApi.getUser(1L); // TODO: è·åå½åç»å½ç¨æ· |
| | | transferApplicationService.submitTransferApplication(id, processDefinitionKey, user.getId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/approve-process-definition-list") |
| | | @Operation(summary = "è·åå¯ç¨çå®¡æ¹æµç¨å®ä¹å表") |
| | | @PreAuthorize("@ss.hasPermission('hrm:transfer:query')") |
| | | public CommonResult<List<Map<String, Object>>> getApproveProcessDefinitionList() { |
| | | return success(transferApplicationService.getApproveProcessDefinitionList()); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºè°å²ç³è¯· Excel") |
| | | @PreAuthorize("@ss.hasPermission('hrm:transfer:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportTransferApplicationExcel(@Valid HrmTransferApplicationPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | List<HrmTransferApplicationRespVO> list = transferApplicationService.getTransferApplicationPage(pageReqVO).getList(); |
| | | ExcelUtils.write(response, "è°å²ç³è¯·.xls", "æ°æ®", |
| | | HrmTransferApplicationRespVO.class, list); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - 请åç³è¯·å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmLeaveApplicationPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "ç³è¯·åå·", example = "LA202401001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç³è¯·äººID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "请åç±»å", example = "1") |
| | | private Integer leaveType; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private String[] createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - 请åç³è¯· Response VO") |
| | | @Data |
| | | public class HrmLeaveApplicationRespVO { |
| | | |
| | | @Schema(description = "ç³è¯·ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³è¯·åå·", example = "LA202401001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç³è¯·äººID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "ç³è¯·äººå§å", example = "å¼ ä¸") |
| | | private String userName; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "é¨é¨åç§°", example = "ç åé¨") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "请åç±»å", example = "1") |
| | | private Integer leaveType; |
| | | |
| | | @Schema(description = "请åç±»ååç§°", example = "å¹´å") |
| | | private String leaveTypeName; |
| | | |
| | | @Schema(description = "å¼å§æ¶é´", example = "2024-01-01 09:00:00") |
| | | private LocalDateTime startTime; |
| | | |
| | | @Schema(description = "ç»ææ¶é´", example = "2024-01-02 18:00:00") |
| | | private LocalDateTime endTime; |
| | | |
| | | @Schema(description = "è¯·åæ¶é¿ï¼å¤©ï¼", example = "1.5") |
| | | private BigDecimal duration; |
| | | |
| | | @Schema(description = "请ååå ", example = "个人äºå¡") |
| | | private String reason; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "审æ¹ç¶æåç§°", example = "è稿") |
| | | private String statusName; |
| | | |
| | | @Schema(description = "BPM æµç¨å®ä¾ID", example = "xxx") |
| | | private String processInstanceId; |
| | | |
| | | @Schema(description = "审æ¹å®ææ¶é´", example = "2024-01-01 10:00:00") |
| | | private LocalDateTime approveTime; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://xxx.com/xxx.pdf") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", example = "2024-01-01 09:00:00") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - 请åç³è¯·æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmLeaveApplicationSaveReqVO { |
| | | |
| | | @Schema(description = "ç³è¯·ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³è¯·äººID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "请åç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "请åç±»åä¸è½ä¸ºç©º") |
| | | private Integer leaveType; |
| | | |
| | | @Schema(description = "å¼å§æ¶é´", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-01-01 09:00:00") |
| | | @NotNull(message = "å¼å§æ¶é´ä¸è½ä¸ºç©º") |
| | | private LocalDateTime startTime; |
| | | |
| | | @Schema(description = "ç»ææ¶é´", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-01-02 18:00:00") |
| | | @NotNull(message = "ç»ææ¶é´ä¸è½ä¸ºç©º") |
| | | private LocalDateTime endTime; |
| | | |
| | | @Schema(description = "è¯·åæ¶é¿ï¼å¤©ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "1.5") |
| | | @NotNull(message = "è¯·åæ¶é¿ä¸è½ä¸ºç©º") |
| | | private BigDecimal duration; |
| | | |
| | | @Schema(description = "请ååå ", requiredMode = Schema.RequiredMode.REQUIRED, example = "个人äºå¡") |
| | | @NotEmpty(message = "请ååå ä¸è½ä¸ºç©º") |
| | | private String reason; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://xxx.com/xxx.pdf") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - 离èç³è¯·å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmResignationApplicationPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "ç³è¯·åå·", example = "RA202401001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç³è¯·äººID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "离èç±»å", example = "1") |
| | | private Integer resignationType; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private String[] createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - 离èç³è¯· Response VO") |
| | | @Data |
| | | public class HrmResignationApplicationRespVO { |
| | | |
| | | @Schema(description = "ç³è¯·ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³è¯·åå·", example = "RA202401001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç³è¯·äººID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "ç³è¯·äººå§å", example = "å¼ ä¸") |
| | | private String userName; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "é¨é¨åç§°", example = "ç åé¨") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "离èç±»å", example = "1") |
| | | private Integer resignationType; |
| | | |
| | | @Schema(description = "离èç±»ååç§°", example = "主å¨ç¦»è") |
| | | private String resignationTypeName; |
| | | |
| | | @Schema(description = "é¢è®¡ç¦»èæ¥æ", example = "2024-02-01") |
| | | private LocalDate expectedDate; |
| | | |
| | | @Schema(description = "å®é
ç¦»èæ¥æ", example = "2024-02-01") |
| | | private LocalDate actualDate; |
| | | |
| | | @Schema(description = "离èåå ", example = "个人åå±") |
| | | private String reason; |
| | | |
| | | @Schema(description = "交æ¥äººID", example = "1") |
| | | private Long handoverUserId; |
| | | |
| | | @Schema(description = "交æ¥äººå§å", example = "æå") |
| | | private String handoverUserName; |
| | | |
| | | @Schema(description = "交æ¥ç¶æ", example = "0") |
| | | private Integer handoverStatus; |
| | | |
| | | @Schema(description = "交æ¥ç¶æåç§°", example = "æªå¼å§") |
| | | private String handoverStatusName; |
| | | |
| | | @Schema(description = "交æ¥è¯´æ", example = "交æ¥è¯´æ") |
| | | private String handoverRemark; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "审æ¹ç¶æåç§°", example = "è稿") |
| | | private String statusName; |
| | | |
| | | @Schema(description = "BPM æµç¨å®ä¾ID", example = "xxx") |
| | | private String processInstanceId; |
| | | |
| | | @Schema(description = "审æ¹å®ææ¶é´", example = "2024-01-01 10:00:00") |
| | | private LocalDateTime approveTime; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://xxx.com/xxx.pdf") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", example = "2024-01-01 09:00:00") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - 离èç³è¯·æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmResignationApplicationSaveReqVO { |
| | | |
| | | @Schema(description = "ç³è¯·ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³è¯·äººID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "离èç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "离èç±»åä¸è½ä¸ºç©º") |
| | | private Integer resignationType; |
| | | |
| | | @Schema(description = "é¢è®¡ç¦»èæ¥æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-02-01") |
| | | @NotNull(message = "é¢è®¡ç¦»èæ¥æä¸è½ä¸ºç©º") |
| | | private LocalDate expectedDate; |
| | | |
| | | @Schema(description = "离èåå ", requiredMode = Schema.RequiredMode.REQUIRED, example = "个人åå±") |
| | | @NotEmpty(message = "离èåå ä¸è½ä¸ºç©º") |
| | | private String reason; |
| | | |
| | | @Schema(description = "交æ¥äººID", example = "1") |
| | | private Long handoverUserId; |
| | | |
| | | @Schema(description = "交æ¥è¯´æ", example = "交æ¥è¯´æ") |
| | | private String handoverRemark; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://xxx.com/xxx.pdf") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - è°å²ç³è¯·å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmTransferApplicationPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "ç³è¯·åå·", example = "TA202401001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç³è¯·äººID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "åé¨é¨ID", example = "1") |
| | | private Long currentDeptId; |
| | | |
| | | @Schema(description = "ç®æ é¨é¨ID", example = "2") |
| | | private Long targetDeptId; |
| | | |
| | | @Schema(description = "è°å²ç±»å", example = "1") |
| | | private Integer transferType; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private String[] createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - è°å²ç³è¯· Response VO") |
| | | @Data |
| | | public class HrmTransferApplicationRespVO { |
| | | |
| | | @Schema(description = "ç³è¯·ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³è¯·åå·", example = "TA202401001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç³è¯·äººID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "ç³è¯·äººå§å", example = "å¼ ä¸") |
| | | private String userName; |
| | | |
| | | @Schema(description = "åé¨é¨ID", example = "1") |
| | | private Long currentDeptId; |
| | | |
| | | @Schema(description = "åé¨é¨åç§°", example = "ç åé¨") |
| | | private String currentDeptName; |
| | | |
| | | @Schema(description = "åå²ä½ID", example = "1") |
| | | private Long currentPostId; |
| | | |
| | | @Schema(description = "åå²ä½åç§°", example = "Javaå¼åå·¥ç¨å¸") |
| | | private String currentPostName; |
| | | |
| | | @Schema(description = "ç®æ é¨é¨ID", example = "2") |
| | | private Long targetDeptId; |
| | | |
| | | @Schema(description = "ç®æ é¨é¨åç§°", example = "产åé¨") |
| | | private String targetDeptName; |
| | | |
| | | @Schema(description = "ç®æ å²ä½ID", example = "2") |
| | | private Long targetPostId; |
| | | |
| | | @Schema(description = "ç®æ å²ä½åç§°", example = "产åç»ç") |
| | | private String targetPostName; |
| | | |
| | | @Schema(description = "è°å²ç±»å", example = "1") |
| | | private Integer transferType; |
| | | |
| | | @Schema(description = "è°å²ç±»ååç§°", example = "å¹³è°") |
| | | private String transferTypeName; |
| | | |
| | | @Schema(description = "çææ¥æ", example = "2024-02-01") |
| | | private LocalDate effectiveDate; |
| | | |
| | | @Schema(description = "è°å²åå ", example = "ä¸å¡éè¦") |
| | | private String reason; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "审æ¹ç¶æåç§°", example = "è稿") |
| | | private String statusName; |
| | | |
| | | @Schema(description = "BPM æµç¨å®ä¾ID", example = "xxx") |
| | | private String processInstanceId; |
| | | |
| | | @Schema(description = "审æ¹å®ææ¶é´", example = "2024-01-01 10:00:00") |
| | | private LocalDateTime approveTime; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://xxx.com/xxx.pdf") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´", example = "2024-01-01 09:00:00") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.approval.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - è°å²ç³è¯·æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmTransferApplicationSaveReqVO { |
| | | |
| | | @Schema(description = "ç³è¯·ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³è¯·äººID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "åé¨é¨ID", example = "1") |
| | | private Long currentDeptId; |
| | | |
| | | @Schema(description = "åå²ä½ID", example = "1") |
| | | private Long currentPostId; |
| | | |
| | | @Schema(description = "ç®æ é¨é¨ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") |
| | | @NotNull(message = "ç®æ é¨é¨ä¸è½ä¸ºç©º") |
| | | private Long targetDeptId; |
| | | |
| | | @Schema(description = "ç®æ å²ä½ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") |
| | | @NotNull(message = "ç®æ å²ä½ä¸è½ä¸ºç©º") |
| | | private Long targetPostId; |
| | | |
| | | @Schema(description = "è°å²ç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "è°å²ç±»åä¸è½ä¸ºç©º") |
| | | private Integer transferType; |
| | | |
| | | @Schema(description = "çææ¥æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-02-01") |
| | | @NotNull(message = "çææ¥æä¸è½ä¸ºç©º") |
| | | private LocalDate effectiveDate; |
| | | |
| | | @Schema(description = "è°å²åå ", requiredMode = Schema.RequiredMode.REQUIRED, example = "ä¸å¡éè¦") |
| | | @NotEmpty(message = "è°å²åå ä¸è½ä¸ºç©º") |
| | | private String reason; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://xxx.com/xxx.pdf") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceExceptionService; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM èå¤å¼å¸¸ç³è¯·") |
| | | @RestController |
| | | @RequestMapping("/hrm/attendance/exception") |
| | | @Validated |
| | | public class HrmAttendanceExceptionController { |
| | | |
| | | @Resource |
| | | private HrmAttendanceExceptionService attendanceExceptionService; |
| | | @Resource |
| | | private HrmEmployeeService employeeService; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "æ°å¢èå¤å¼å¸¸ç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:create')") |
| | | public CommonResult<Long> createAttendanceException(@Valid @RequestBody HrmAttendanceExceptionSaveReqVO createReqVO) { |
| | | return success(attendanceExceptionService.createAttendanceException(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°èå¤å¼å¸¸ç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:update')") |
| | | public CommonResult<Boolean> updateAttendanceException(@Valid @RequestBody HrmAttendanceExceptionSaveReqVO updateReqVO) { |
| | | attendanceExceptionService.updateAttendanceException(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤èå¤å¼å¸¸ç³è¯·") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:delete')") |
| | | public CommonResult<Boolean> deleteAttendanceException(@RequestParam("id") Long id) { |
| | | attendanceExceptionService.deleteAttendanceException(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾èå¤å¼å¸¸ç³è¯·") |
| | | @Parameter(name = "id", description = "ç³è¯·ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<HrmAttendanceExceptionRespVO> getAttendanceException(@RequestParam("id") Long id) { |
| | | HrmAttendanceExceptionDO attendanceException = attendanceExceptionService.getAttendanceException(id); |
| | | if (attendanceException == null) { |
| | | return success(null); |
| | | } |
| | | HrmAttendanceExceptionRespVO respVO = BeanUtils.toBean(attendanceException, HrmAttendanceExceptionRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ï¼userId æ¯åå·¥IDï¼ |
| | | if (attendanceException.getUserId() != null) { |
| | | HrmEmployeeDO employee = employeeService.getEmployee(attendanceException.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | } |
| | | } |
| | | if (attendanceException.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(attendanceException.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | return success(respVO); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾èå¤å¼å¸¸ç³è¯·å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<PageResult<HrmAttendanceExceptionRespVO>> getAttendanceExceptionPage(@Valid HrmAttendanceExceptionPageReqVO pageReqVO) { |
| | | PageResult<HrmAttendanceExceptionDO> pageResult = attendanceExceptionService.getAttendanceExceptionPage(pageReqVO); |
| | | List<HrmAttendanceExceptionRespVO> list = BeanUtils.toBean(pageResult.getList(), HrmAttendanceExceptionRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | fillUserInfo(list, pageResult.getList()); |
| | | } |
| | | return success(new PageResult<>(list, pageResult.getTotal())); |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
åå·¥åé¨é¨ä¿¡æ¯ï¼userId æ¯åå·¥IDï¼ |
| | | */ |
| | | private void fillUserInfo(List<HrmAttendanceExceptionRespVO> respList, List<HrmAttendanceExceptionDO> exceptionList) { |
| | | // æ¹éè·ååå·¥ä¿¡æ¯ |
| | | Set<Long> employeeIds = exceptionList.stream() |
| | | .map(HrmAttendanceExceptionDO::getUserId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, HrmEmployeeDO> employeeMap = new HashMap<>(); |
| | | for (Long employeeId : employeeIds) { |
| | | HrmEmployeeDO employee = employeeService.getEmployee(employeeId); |
| | | if (employee != null) { |
| | | employeeMap.put(employeeId, employee); |
| | | } |
| | | } |
| | | // æ¹éè·åé¨é¨ä¿¡æ¯ |
| | | Set<Long> deptIds = exceptionList.stream() |
| | | .map(HrmAttendanceExceptionDO::getDeptId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); |
| | | |
| | | // å¡«å
ä¿¡æ¯ |
| | | for (HrmAttendanceExceptionRespVO respVO : respList) { |
| | | HrmEmployeeDO employee = employeeMap.get(respVO.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | } |
| | | DeptRespDTO dept = deptMap.get(respVO.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @PostMapping("/submit") |
| | | @Operation(summary = "æäº¤èå¤å¼å¸¸ç³è¯·") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:submit')") |
| | | public CommonResult<Boolean> submitAttendanceException( |
| | | @RequestParam("id") Long id, |
| | | @RequestParam("processDefinitionKey") String processDefinitionKey) { |
| | | // è·åå½åç»å½ç¨æ·ID |
| | | Long userId = cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId(); |
| | | attendanceExceptionService.submitAttendanceException(id, processDefinitionKey, userId); |
| | | return success(true); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidayPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidayRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidaySaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceHolidayDO; |
| | | import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceHolidayService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM èå¤è忥é
ç½®") |
| | | @RestController |
| | | @RequestMapping("/hrm/attendance/holiday") |
| | | @Validated |
| | | public class HrmAttendanceHolidayController { |
| | | |
| | | @Resource |
| | | private HrmAttendanceHolidayService attendanceHolidayService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "æ°å¢è忥é
ç½®") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:create')") |
| | | public CommonResult<Long> createAttendanceHoliday(@Valid @RequestBody HrmAttendanceHolidaySaveReqVO createReqVO) { |
| | | return success(attendanceHolidayService.createAttendanceHoliday(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°è忥é
ç½®") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:update')") |
| | | public CommonResult<Boolean> updateAttendanceHoliday(@Valid @RequestBody HrmAttendanceHolidaySaveReqVO updateReqVO) { |
| | | attendanceHolidayService.updateAttendanceHoliday(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤è忥é
ç½®") |
| | | @Parameter(name = "id", description = "è忥ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:delete')") |
| | | public CommonResult<Boolean> deleteAttendanceHoliday(@RequestParam("id") Long id) { |
| | | attendanceHolidayService.deleteAttendanceHoliday(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾è忥é
ç½®") |
| | | @Parameter(name = "id", description = "è忥ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<HrmAttendanceHolidayRespVO> getAttendanceHoliday(@RequestParam("id") Long id) { |
| | | HrmAttendanceHolidayDO attendanceHoliday = attendanceHolidayService.getAttendanceHoliday(id); |
| | | return success(BeanUtils.toBean(attendanceHoliday, HrmAttendanceHolidayRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾è忥é
ç½®å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<PageResult<HrmAttendanceHolidayRespVO>> getAttendanceHolidayPage(@Valid HrmAttendanceHolidayPageReqVO pageReqVO) { |
| | | PageResult<HrmAttendanceHolidayDO> pageResult = attendanceHolidayService.getAttendanceHolidayPage(pageReqVO); |
| | | return success(BeanUtils.toBean(pageResult, HrmAttendanceHolidayRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºè忥é
ç½® Excel") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportAttendanceHolidayExcel(@Valid HrmAttendanceHolidayPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | List<HrmAttendanceHolidayDO> list = attendanceHolidayService.getAttendanceHolidayPage(pageReqVO).getList(); |
| | | List<HrmAttendanceHolidayRespVO> data = BeanUtils.toBean(list, HrmAttendanceHolidayRespVO.class); |
| | | ExcelUtils.write(response, "è忥é
ç½®.xls", "æ°æ®", HrmAttendanceHolidayRespVO.class, data); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordRespVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRecordDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceRecordService; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.time.LocalDateTime; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_NOT_EXISTS; |
| | | |
| | | @Tag(name = "管çåå° - HRM èå¤è®°å½") |
| | | @RestController |
| | | @RequestMapping("/hrm/attendance/record") |
| | | @Validated |
| | | public class HrmAttendanceRecordController { |
| | | |
| | | @Resource |
| | | private HrmAttendanceRecordService attendanceRecordService; |
| | | @Resource |
| | | private HrmEmployeeService employeeService; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | |
| | | @PostMapping("/clock-in") |
| | | @Operation(summary = "ä¸çæå¡") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:clock')") |
| | | public CommonResult<HrmAttendanceRecordRespVO> clockIn(@RequestParam("location") String location) { |
| | | Long loginUserId = getLoginUserId(); |
| | | HrmEmployeeDO employee = employeeService.getEmployeeByUserId(loginUserId); |
| | | if (employee == null) { |
| | | throw exception(EMPLOYEE_NOT_EXISTS, "å½åç¨æ·æªå
³èå工信æ¯ï¼æ æ³æå¡"); |
| | | } |
| | | HrmAttendanceRecordDO record = attendanceRecordService.clockIn(employee.getId(), LocalDateTime.now(), location); |
| | | HrmAttendanceRecordRespVO respVO = BeanUtils.toBean(record, HrmAttendanceRecordRespVO.class); |
| | | respVO.setUserName(employee.getName()); |
| | | if (record.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(record.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | return success(respVO); |
| | | } |
| | | |
| | | @PostMapping("/clock-out") |
| | | @Operation(summary = "ä¸çæå¡") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:clock')") |
| | | public CommonResult<HrmAttendanceRecordRespVO> clockOut(@RequestParam("location") String location) { |
| | | Long loginUserId = getLoginUserId(); |
| | | HrmEmployeeDO employee = employeeService.getEmployeeByUserId(loginUserId); |
| | | if (employee == null) { |
| | | throw exception(EMPLOYEE_NOT_EXISTS, "å½åç¨æ·æªå
³èå工信æ¯ï¼æ æ³æå¡"); |
| | | } |
| | | HrmAttendanceRecordDO record = attendanceRecordService.clockOut(employee.getId(), LocalDateTime.now(), location); |
| | | HrmAttendanceRecordRespVO respVO = BeanUtils.toBean(record, HrmAttendanceRecordRespVO.class); |
| | | respVO.setUserName(employee.getName()); |
| | | if (record.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(record.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | return success(respVO); |
| | | } |
| | | |
| | | private Long getLoginUserId() { |
| | | return cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId(); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾èå¤è®°å½å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<PageResult<HrmAttendanceRecordRespVO>> getAttendanceRecordPage(@Valid HrmAttendanceRecordPageReqVO pageReqVO) { |
| | | PageResult<HrmAttendanceRecordDO> pageResult = attendanceRecordService.getAttendanceRecordPage(pageReqVO); |
| | | // 转æ¢ä¸º VO |
| | | List<HrmAttendanceRecordRespVO> list = BeanUtils.toBean(pageResult.getList(), HrmAttendanceRecordRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | fillUserInfo(list, pageResult.getList()); |
| | | } |
| | | return success(new PageResult<>(list, pageResult.getTotal())); |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | * 注æï¼èå¤è®°å½ç userId æ¯åå·¥IDï¼ä¸æ¯ç³»ç»ç¨æ·ID |
| | | */ |
| | | private void fillUserInfo(List<HrmAttendanceRecordRespVO> respList, List<HrmAttendanceRecordDO> recordList) { |
| | | // æ¹éè·åå工信æ¯ï¼userId æ¯åå·¥IDï¼ |
| | | Set<Long> employeeIds = recordList.stream() |
| | | .map(HrmAttendanceRecordDO::getUserId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, HrmEmployeeDO> employeeMap = new HashMap<>(); |
| | | for (Long employeeId : employeeIds) { |
| | | HrmEmployeeDO employee = employeeService.getEmployee(employeeId); |
| | | if (employee != null) { |
| | | employeeMap.put(employeeId, employee); |
| | | } |
| | | } |
| | | // æ¹éè·åé¨é¨ä¿¡æ¯ |
| | | Set<Long> deptIds = recordList.stream() |
| | | .map(HrmAttendanceRecordDO::getDeptId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); |
| | | |
| | | // å¡«å
ä¿¡æ¯ |
| | | for (HrmAttendanceRecordRespVO respVO : respList) { |
| | | // éè¿åå·¥IDè·åå工信æ¯ï¼åè·ååå·¥å§å |
| | | HrmEmployeeDO employee = employeeMap.get(respVO.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | } |
| | | // é¨é¨åç§° |
| | | DeptRespDTO dept = deptMap.get(respVO.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾èå¤è®°å½") |
| | | @Parameter(name = "id", description = "è®°å½ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<HrmAttendanceRecordRespVO> getAttendanceRecord(@RequestParam("id") Long id) { |
| | | HrmAttendanceRecordDO attendanceRecord = attendanceRecordService.getAttendanceRecord(id); |
| | | if (attendanceRecord == null) { |
| | | return success(null); |
| | | } |
| | | HrmAttendanceRecordRespVO respVO = BeanUtils.toBean(attendanceRecord, HrmAttendanceRecordRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ï¼userId æ¯åå·¥IDï¼ |
| | | if (attendanceRecord.getUserId() != null) { |
| | | HrmEmployeeDO employee = employeeService.getEmployee(attendanceRecord.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | } |
| | | } |
| | | if (attendanceRecord.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(attendanceRecord.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | return success(respVO); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºèå¤è®°å½ Excel") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportAttendanceRecordExcel(@Valid HrmAttendanceRecordPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | PageResult<HrmAttendanceRecordDO> pageResult = attendanceRecordService.getAttendanceRecordPage(pageReqVO); |
| | | List<HrmAttendanceRecordDO> recordList = pageResult.getList(); |
| | | // 转æ¢ä¸º VO |
| | | List<HrmAttendanceRecordRespVO> list = BeanUtils.toBean(recordList, HrmAttendanceRecordRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | fillUserInfo(list, recordList); |
| | | } |
| | | ExcelUtils.write(response, "èå¤è®°å½.xls", "æ°æ®", HrmAttendanceRecordRespVO.class, list); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRulePageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRuleRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRuleSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRuleDO; |
| | | import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceRuleService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM èå¤è§åé
ç½®") |
| | | @RestController |
| | | @RequestMapping("/hrm/attendance/rule") |
| | | @Validated |
| | | public class HrmAttendanceRuleController { |
| | | |
| | | @Resource |
| | | private HrmAttendanceRuleService attendanceRuleService; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "æ°å¢èå¤è§å") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:create')") |
| | | public CommonResult<Long> createAttendanceRule(@Valid @RequestBody HrmAttendanceRuleSaveReqVO createReqVO) { |
| | | return success(attendanceRuleService.createAttendanceRule(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°èå¤è§å") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:update')") |
| | | public CommonResult<Boolean> updateAttendanceRule(@Valid @RequestBody HrmAttendanceRuleSaveReqVO updateReqVO) { |
| | | attendanceRuleService.updateAttendanceRule(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤èå¤è§å") |
| | | @Parameter(name = "id", description = "è§åID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:delete')") |
| | | public CommonResult<Boolean> deleteAttendanceRule(@RequestParam("id") Long id) { |
| | | attendanceRuleService.deleteAttendanceRule(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾èå¤è§å") |
| | | @Parameter(name = "id", description = "è§åID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<HrmAttendanceRuleRespVO> getAttendanceRule(@RequestParam("id") Long id) { |
| | | HrmAttendanceRuleDO attendanceRule = attendanceRuleService.getAttendanceRule(id); |
| | | if (attendanceRule == null) { |
| | | return success(null); |
| | | } |
| | | HrmAttendanceRuleRespVO respVO = BeanUtils.toBean(attendanceRule, HrmAttendanceRuleRespVO.class); |
| | | // å¡«å
é¨é¨åç§° |
| | | if (attendanceRule.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(attendanceRule.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | return success(respVO); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾èå¤è§åå页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<PageResult<HrmAttendanceRuleRespVO>> getAttendanceRulePage(@Valid HrmAttendanceRulePageReqVO pageReqVO) { |
| | | PageResult<HrmAttendanceRuleDO> pageResult = attendanceRuleService.getAttendanceRulePage(pageReqVO); |
| | | List<HrmAttendanceRuleRespVO> list = BeanUtils.toBean(pageResult.getList(), HrmAttendanceRuleRespVO.class); |
| | | // å¡«å
é¨é¨åç§° |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | Set<Long> deptIds = pageResult.getList().stream() |
| | | .map(HrmAttendanceRuleDO::getDeptId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); |
| | | for (HrmAttendanceRuleRespVO respVO : list) { |
| | | DeptRespDTO dept = deptMap.get(respVO.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | } |
| | | return success(new PageResult<>(list, pageResult.getTotal())); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·å¾èå¤è§åå表") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<List<HrmAttendanceRuleRespVO>> getAttendanceRuleList() { |
| | | List<HrmAttendanceRuleDO> list = attendanceRuleService.getAttendanceRuleList(); |
| | | return success(BeanUtils.toBean(list, HrmAttendanceRuleRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºèå¤è§å Excel") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportAttendanceRuleExcel(@Valid HrmAttendanceRulePageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | PageResult<HrmAttendanceRuleDO> pageResult = attendanceRuleService.getAttendanceRulePage(pageReqVO); |
| | | List<HrmAttendanceRuleRespVO> data = BeanUtils.toBean(pageResult.getList(), HrmAttendanceRuleRespVO.class); |
| | | ExcelUtils.write(response, "èå¤è§å.xls", "æ°æ®", HrmAttendanceRuleRespVO.class, data); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceSummaryPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceSummaryRespVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceSummaryDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceSummaryService; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM èå¤ç»è®¡æ±æ»") |
| | | @RestController |
| | | @RequestMapping("/hrm/attendance/summary") |
| | | @Validated |
| | | public class HrmAttendanceSummaryController { |
| | | |
| | | @Resource |
| | | private HrmAttendanceSummaryService attendanceSummaryService; |
| | | @Resource |
| | | private HrmEmployeeService employeeService; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾èå¤ç»è®¡æ±æ»å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<PageResult<HrmAttendanceSummaryRespVO>> getAttendanceSummaryPage(@Valid HrmAttendanceSummaryPageReqVO pageReqVO) { |
| | | PageResult<HrmAttendanceSummaryDO> pageResult = attendanceSummaryService.getAttendanceSummaryPage(pageReqVO); |
| | | List<HrmAttendanceSummaryRespVO> list = BeanUtils.toBean(pageResult.getList(), HrmAttendanceSummaryRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | fillUserInfo(list, pageResult.getList()); |
| | | } |
| | | return success(new PageResult<>(list, pageResult.getTotal())); |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | */ |
| | | private void fillUserInfo(List<HrmAttendanceSummaryRespVO> respList, List<HrmAttendanceSummaryDO> summaryList) { |
| | | // æ¹éè·ååå·¥ä¿¡æ¯ |
| | | Set<Long> employeeIds = summaryList.stream() |
| | | .map(HrmAttendanceSummaryDO::getUserId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, HrmEmployeeDO> employeeMap = new HashMap<>(); |
| | | for (Long employeeId : employeeIds) { |
| | | HrmEmployeeDO employee = employeeService.getEmployee(employeeId); |
| | | if (employee != null) { |
| | | employeeMap.put(employeeId, employee); |
| | | } |
| | | } |
| | | // æ¹éè·åé¨é¨ä¿¡æ¯ |
| | | Set<Long> deptIds = summaryList.stream() |
| | | .map(HrmAttendanceSummaryDO::getDeptId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); |
| | | |
| | | // å¡«å
ä¿¡æ¯ |
| | | for (HrmAttendanceSummaryRespVO respVO : respList) { |
| | | HrmEmployeeDO employee = employeeMap.get(respVO.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | } |
| | | DeptRespDTO dept = deptMap.get(respVO.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾åå·¥æåº¦è夿±æ»") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:query')") |
| | | public CommonResult<HrmAttendanceSummaryRespVO> getMonthlySummary( |
| | | @RequestParam("userId") Long userId, |
| | | @RequestParam("yearMonth") String yearMonth) { |
| | | HrmAttendanceSummaryDO summary = attendanceSummaryService.getMonthlySummary(userId, yearMonth); |
| | | if (summary == null) { |
| | | return success(null); |
| | | } |
| | | HrmAttendanceSummaryRespVO respVO = BeanUtils.toBean(summary, HrmAttendanceSummaryRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | HrmEmployeeDO employee = employeeService.getEmployee(userId); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | } |
| | | if (summary.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(summary.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | return success(respVO); |
| | | } |
| | | |
| | | @PostMapping("/generate") |
| | | @Operation(summary = "çææåº¦è夿±æ»") |
| | | @Parameter(name = "yearMonth", description = "å¹´æï¼æ ¼å¼ï¼yyyy-MM", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:calculate')") |
| | | public CommonResult<Boolean> generateMonthlySummary(@RequestParam("yearMonth") String yearMonth, |
| | | @RequestParam(value = "deptId", required = false) Long deptId, |
| | | @RequestParam(value = "userId", required = false) Long userId) { |
| | | if (userId != null) { |
| | | attendanceSummaryService.generateMonthlySummary(userId, yearMonth); |
| | | } else if (deptId != null) { |
| | | attendanceSummaryService.generateDeptMonthlySummary(deptId, yearMonth); |
| | | } else { |
| | | attendanceSummaryService.generateAllMonthlySummary(yearMonth); |
| | | } |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºèå¤ç»è®¡æ±æ» Excel") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportAttendanceSummaryExcel(@Valid HrmAttendanceSummaryPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | PageResult<HrmAttendanceSummaryDO> pageResult = attendanceSummaryService.getAttendanceSummaryPage(pageReqVO); |
| | | List<HrmAttendanceSummaryRespVO> data = BeanUtils.toBean(pageResult.getList(), HrmAttendanceSummaryRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | if (CollUtil.isNotEmpty(data)) { |
| | | fillUserInfo(data, pageResult.getList()); |
| | | } |
| | | ExcelUtils.write(response, "èå¤ç»è®¡æ±æ».xls", "æ°æ®", HrmAttendanceSummaryRespVO.class, data); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - èå¤å¼å¸¸ç³è¯·å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmAttendanceExceptionPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "ç³è¯·åå·", example = "KQ202401010001") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç³è¯·äººID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "å¼å¸¸ç±»å", example = "1") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - èå¤å¼å¸¸ç³è¯· Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmAttendanceExceptionRespVO { |
| | | |
| | | @Schema(description = "ç³è¯·ID") |
| | | @ExcelProperty("ç³è¯·ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³è¯·åå·") |
| | | @ExcelProperty("ç³è¯·åå·") |
| | | private String no; |
| | | |
| | | @Schema(description = "ç³è¯·äººID") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "ç³è¯·äººå§å") |
| | | @ExcelProperty("ç³è¯·äººå§å") |
| | | private String userName; |
| | | |
| | | @Schema(description = "é¨é¨ID") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "é¨é¨åç§°") |
| | | @ExcelProperty("é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "å¼å¸¸ç±»å") |
| | | @ExcelProperty(value = "å¼å¸¸ç±»å", converter = DictConvert.class) |
| | | @DictFormat("hrm_attendance_exception_type") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "å¼å¸¸æ¥æ") |
| | | @ExcelProperty("å¼å¸¸æ¥æ") |
| | | private LocalDate exceptionDate; |
| | | |
| | | @Schema(description = "å¼å¸¸æ¶é´ç¹") |
| | | @ExcelProperty("å¼å¸¸æ¶é´ç¹") |
| | | private LocalDateTime exceptionTime; |
| | | |
| | | @Schema(description = "ç³è¯·åå ") |
| | | @ExcelProperty("ç³è¯·åå ") |
| | | private String reason; |
| | | |
| | | @Schema(description = "ç¶æ") |
| | | @ExcelProperty(value = "ç¶æ", converter = DictConvert.class) |
| | | @DictFormat("hrm_audit_status") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "BPMæµç¨å®ä¾ID") |
| | | private String processInstanceId; |
| | | |
| | | @Schema(description = "审æ¹å®ææ¶é´") |
| | | @ExcelProperty("审æ¹å®ææ¶é´") |
| | | private LocalDateTime approveTime; |
| | | |
| | | @Schema(description = "éä»¶å°å") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - èå¤å¼å¸¸ç³è¯·æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmAttendanceExceptionSaveReqVO { |
| | | |
| | | @Schema(description = "ç³è¯·ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "å¼å¸¸ç±»å", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "å¼å¸¸ç±»åä¸è½ä¸ºç©º") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "å¼å¸¸æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-01-15") |
| | | @NotNull(message = "å¼å¸¸æ¥æä¸è½ä¸ºç©º") |
| | | private LocalDate exceptionDate; |
| | | |
| | | @Schema(description = "å¼å¸¸æ¶é´ç¹", example = "2024-01-15 09:00:00") |
| | | private LocalDateTime exceptionTime; |
| | | |
| | | @Schema(description = "ç³è¯·åå ", requiredMode = Schema.RequiredMode.REQUIRED, example = "å¿è®°æå¡") |
| | | @NotEmpty(message = "ç³è¯·åå ä¸è½ä¸ºç©º") |
| | | private String reason; |
| | | |
| | | @Schema(description = "éä»¶å°å", example = "https://xxx.com/xxx.jpg") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - èå¤è忥å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmAttendanceHolidayPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "è忥åç§°", example = "æ¥è") |
| | | private String name; |
| | | |
| | | @Schema(description = "ç±»åï¼1-伿¯æ¥ï¼2-工使¥", example = "1") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "å¼å§æ¥æ", example = "2024-01-01") |
| | | private LocalDate startDate; |
| | | |
| | | @Schema(description = "ç»ææ¥æ", example = "2024-12-31") |
| | | private LocalDate endDate; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - èå¤è忥 Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmAttendanceHolidayRespVO { |
| | | |
| | | @Schema(description = "è忥ID") |
| | | @ExcelProperty("è忥ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "è忥åç§°") |
| | | @ExcelProperty("è忥åç§°") |
| | | private String name; |
| | | |
| | | @Schema(description = "æ¥æ") |
| | | @ExcelProperty("æ¥æ") |
| | | private LocalDate date; |
| | | |
| | | @Schema(description = "ç±»åï¼1-伿¯æ¥ï¼2-工使¥") |
| | | @ExcelProperty(value = "ç±»å", converter = DictConvert.class) |
| | | @DictFormat("hrm_holiday_type") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "æ¯å¦æ³å®è忥ï¼0-å¦ï¼1-æ¯") |
| | | @ExcelProperty(value = "æ¯å¦æ³å®è忥", converter = DictConvert.class) |
| | | @DictFormat("hrm_is_legal_holiday") |
| | | private Integer isLegal; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - èå¤è忥æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmAttendanceHolidaySaveReqVO { |
| | | |
| | | @Schema(description = "è忥IDï¼ä¿®æ¹æ¶å¿
å¡«ï¼", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "è忥åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "æ¥è") |
| | | @NotBlank(message = "è忥åç§°ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "æ¥æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-02-10") |
| | | @NotNull(message = "æ¥æä¸è½ä¸ºç©º") |
| | | private LocalDate date; |
| | | |
| | | @Schema(description = "ç±»åï¼1-伿¯æ¥ï¼2-工使¥", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç±»åä¸è½ä¸ºç©º") |
| | | private Integer type; |
| | | |
| | | @Schema(description = "æ¯å¦æ³å®è忥ï¼0-å¦ï¼1-æ¯", example = "1") |
| | | private Integer isLegal; |
| | | |
| | | @Schema(description = "夿³¨", example = "æ¥èåæ") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - èå¤è®°å½å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmAttendanceRecordPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åå·¥ID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "å¼å§æ¥æ", example = "2024-01-01") |
| | | private LocalDate startDate; |
| | | |
| | | @Schema(description = "ç»ææ¥æ", example = "2024-01-31") |
| | | private LocalDate endDate; |
| | | |
| | | @Schema(description = "ä¸çæå¡ç±»å", example = "1") |
| | | private Integer clockInType; |
| | | |
| | | @Schema(description = "ä¸çæå¡ç±»å", example = "1") |
| | | private Integer clockOutType; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - èå¤è®°å½ Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmAttendanceRecordRespVO { |
| | | |
| | | @Schema(description = "è®°å½ID") |
| | | @ExcelProperty("è®°å½ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åå·¥ID") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "åå·¥å§å") |
| | | @ExcelProperty("åå·¥å§å") |
| | | private String userName; |
| | | |
| | | @Schema(description = "é¨é¨ID") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "é¨é¨åç§°") |
| | | @ExcelProperty("é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "è夿¥æ") |
| | | @ExcelProperty("è夿¥æ") |
| | | private LocalDate date; |
| | | |
| | | @Schema(description = "ä¸çæå¡æ¶é´") |
| | | @ExcelProperty("ä¸çæå¡æ¶é´") |
| | | private LocalDateTime clockInTime; |
| | | |
| | | @Schema(description = "ä¸çæå¡æ¶é´") |
| | | @ExcelProperty("ä¸çæå¡æ¶é´") |
| | | private LocalDateTime clockOutTime; |
| | | |
| | | @Schema(description = "ä¸çæå¡ç±»å") |
| | | @ExcelProperty(value = "ä¸çæå¡ç±»å", converter = DictConvert.class) |
| | | @DictFormat("hrm_clock_type") |
| | | private Integer clockInType; |
| | | |
| | | @Schema(description = "ä¸çæå¡ç±»å") |
| | | @ExcelProperty(value = "ä¸çæå¡ç±»å", converter = DictConvert.class) |
| | | @DictFormat("hrm_clock_type") |
| | | private Integer clockOutType; |
| | | |
| | | @Schema(description = "工使¶é¿ï¼å°æ¶ï¼") |
| | | @ExcelProperty("工使¶é¿") |
| | | private BigDecimal workHours; |
| | | |
| | | @Schema(description = "å çæ¶é¿ï¼å°æ¶ï¼") |
| | | @ExcelProperty("å çæ¶é¿") |
| | | private BigDecimal overtimeHours; |
| | | |
| | | @Schema(description = "æå¡å°ç¹") |
| | | @ExcelProperty("æå¡å°ç¹") |
| | | private String location; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "æ°æ®æ¥æº") |
| | | @ExcelProperty(value = "æ°æ®æ¥æº", converter = DictConvert.class) |
| | | @DictFormat("hrm_data_source") |
| | | private Integer dataSource; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | import java.time.LocalTime; |
| | | |
| | | @Schema(description = "管çåå° - èå¤è§åå页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmAttendanceRulePageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "è§ååç§°", example = "æ åèå¤è§å") |
| | | private String name; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | |
| | | @Schema(description = "管çåå° - èå¤è§å Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmAttendanceRuleRespVO { |
| | | |
| | | @Schema(description = "è§åID") |
| | | @ExcelProperty("è§åID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "è§ååç§°") |
| | | @ExcelProperty("è§ååç§°") |
| | | private String name; |
| | | |
| | | @Schema(description = "éç¨é¨é¨ID") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "é¨é¨åç§°") |
| | | @ExcelProperty("é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "ä¸çæ¶é´") |
| | | @ExcelProperty("ä¸çæ¶é´") |
| | | private LocalTime workStartTime; |
| | | |
| | | @Schema(description = "ä¸çæ¶é´") |
| | | @ExcelProperty("ä¸çæ¶é´") |
| | | private LocalTime workEndTime; |
| | | |
| | | @Schema(description = "è¿å°å
许åéæ°") |
| | | @ExcelProperty("è¿å°å
许åéæ°") |
| | | private Integer lateAllowMinutes; |
| | | |
| | | @Schema(description = "æ©éå
许åéæ°") |
| | | @ExcelProperty("æ©éå
许åéæ°") |
| | | private Integer earlyAllowMinutes; |
| | | |
| | | @Schema(description = "å çèµ·ç®æ¶é¿ï¼å°æ¶ï¼") |
| | | @ExcelProperty("å çèµ·ç®æ¶é¿") |
| | | private BigDecimal overtimeThreshold; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨") |
| | | @ExcelProperty(value = "ç¶æ", converter = DictConvert.class) |
| | | @DictFormat("hrm_rule_status") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalTime; |
| | | |
| | | @Schema(description = "管çåå° - èå¤è§åæ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmAttendanceRuleSaveReqVO { |
| | | |
| | | @Schema(description = "è§åIDï¼ä¿®æ¹æ¶å¿
å¡«ï¼", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "è§ååç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "æ åèå¤è§å") |
| | | @NotBlank(message = "è§ååç§°ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "éç¨é¨é¨IDï¼ç©ºè¡¨ç¤ºå
¨å±ï¼", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "ä¸çæ¶é´", requiredMode = Schema.RequiredMode.REQUIRED, example = "09:00:00") |
| | | @NotNull(message = "ä¸çæ¶é´ä¸è½ä¸ºç©º") |
| | | private LocalTime workStartTime; |
| | | |
| | | @Schema(description = "ä¸çæ¶é´", requiredMode = Schema.RequiredMode.REQUIRED, example = "18:00:00") |
| | | @NotNull(message = "ä¸çæ¶é´ä¸è½ä¸ºç©º") |
| | | private LocalTime workEndTime; |
| | | |
| | | @Schema(description = "è¿å°å
许åéæ°", example = "10") |
| | | private Integer lateAllowMinutes; |
| | | |
| | | @Schema(description = "æ©éå
许åéæ°", example = "10") |
| | | private Integer earlyAllowMinutes; |
| | | |
| | | @Schema(description = "å çèµ·ç®æ¶é¿ï¼å°æ¶ï¼", example = "1") |
| | | private BigDecimal overtimeThreshold; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "éç¨äºç åé¨é¨") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - èå¤ç»è®¡æ±æ»å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmAttendanceSummaryPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åå·¥ID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "å¹´æï¼æ ¼å¼ï¼yyyy-MM", example = "2024-01") |
| | | private String yearMonth; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - èå¤ç»è®¡æ±æ» Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmAttendanceSummaryRespVO { |
| | | |
| | | @Schema(description = "æ±æ»ID") |
| | | @ExcelProperty("æ±æ»ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åå·¥ID") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "åå·¥å§å") |
| | | @ExcelProperty("åå·¥å§å") |
| | | private String userName; |
| | | |
| | | @Schema(description = "é¨é¨ID") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "é¨é¨åç§°") |
| | | @ExcelProperty("é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "å¹´æ") |
| | | @ExcelProperty("å¹´æ") |
| | | private String yearMonth; |
| | | |
| | | @Schema(description = "åºåºå¤å¤©æ°") |
| | | @ExcelProperty("åºåºå¤å¤©æ°") |
| | | private Integer workDays; |
| | | |
| | | @Schema(description = "å®é
åºå¤å¤©æ°") |
| | | @ExcelProperty("å®é
åºå¤å¤©æ°") |
| | | private Integer actualDays; |
| | | |
| | | @Schema(description = "è¿å°æ¬¡æ°") |
| | | @ExcelProperty("è¿å°æ¬¡æ°") |
| | | private Integer lateCount; |
| | | |
| | | @Schema(description = "æ©é次æ°") |
| | | @ExcelProperty("æ©é次æ°") |
| | | private Integer earlyCount; |
| | | |
| | | @Schema(description = "ç¼ºå¡æ¬¡æ°") |
| | | @ExcelProperty("ç¼ºå¡æ¬¡æ°") |
| | | private Integer absentCount; |
| | | |
| | | @Schema(description = "å çæ¶é¿ï¼å°æ¶ï¼") |
| | | @ExcelProperty("å çæ¶é¿") |
| | | private BigDecimal overtimeHours; |
| | | |
| | | @Schema(description = "è¯·åæ¶é¿ï¼å°æ¶ï¼") |
| | | @ExcelProperty("è¯·åæ¶é¿") |
| | | private BigDecimal leaveHours; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeePageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeSimpleRespVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.PostApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.permission.RoleApi; |
| | | import cn.iocoder.yudao.module.system.api.permission.dto.RoleRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM åå·¥") |
| | | @RestController |
| | | @RequestMapping("/hrm/employee") |
| | | @Validated |
| | | public class HrmEmployeeController { |
| | | |
| | | @Resource |
| | | private HrmEmployeeService employeeService; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | @Resource |
| | | private PostApi postApi; |
| | | @Resource |
| | | private RoleApi roleApi; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建åå·¥") |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:create')") |
| | | public CommonResult<Long> createEmployee(@Valid @RequestBody HrmEmployeeSaveReqVO createReqVO) { |
| | | return success(employeeService.createEmployee(createReqVO)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°åå·¥") |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:update')") |
| | | public CommonResult<Boolean> updateEmployee(@Valid @RequestBody HrmEmployeeSaveReqVO updateReqVO) { |
| | | employeeService.updateEmployee(updateReqVO); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤åå·¥") |
| | | @Parameter(name = "id", description = "åå·¥ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:delete')") |
| | | public CommonResult<Boolean> deleteEmployee(@RequestParam("id") Long id) { |
| | | employeeService.deleteEmployee(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾å工详æ
") |
| | | @Parameter(name = "id", description = "åå·¥ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:query')") |
| | | public CommonResult<HrmEmployeeRespVO> getEmployee(@RequestParam("id") Long id) { |
| | | return success(employeeService.getEmployeeDetail(id)); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾åå·¥å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:query')") |
| | | public CommonResult<PageResult<HrmEmployeeRespVO>> getEmployeePage(@Valid HrmEmployeePageReqVO pageReqVO) { |
| | | PageResult<HrmEmployeeDO> pageResult = employeeService.getEmployeePage(pageReqVO); |
| | | // 转æ¢ä¸º VO |
| | | List<HrmEmployeeRespVO> list = BeanUtils.toBean(pageResult.getList(), HrmEmployeeRespVO.class); |
| | | // å¡«å
é¨é¨ãå²ä½ãè§è²åç§° |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | fillEmployeeInfo(list, pageResult.getList()); |
| | | } |
| | | return success(new PageResult<>(list, pageResult.getTotal())); |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
å工信æ¯ï¼é¨é¨ãå²ä½ãè§è²åç§°ï¼ |
| | | */ |
| | | private void fillEmployeeInfo(List<HrmEmployeeRespVO> respList, List<HrmEmployeeDO> employeeList) { |
| | | // 1. æ¹éè·åé¨é¨ä¿¡æ¯ |
| | | Set<Long> deptIds = employeeList.stream() |
| | | .map(HrmEmployeeDO::getDeptId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); |
| | | |
| | | // 2. æ¹éè·åå²ä½ä¿¡æ¯ |
| | | Set<Long> postIds = employeeList.stream() |
| | | .map(HrmEmployeeDO::getPostId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, PostRespDTO> postMap = CollUtil.isEmpty(postIds) ? Collections.emptyMap() : postApi.getPostMap(postIds); |
| | | |
| | | // 3. æ¶éææè§è²ID |
| | | Set<Long> allRoleIds = new HashSet<>(); |
| | | for (HrmEmployeeDO employee : employeeList) { |
| | | if (StrUtil.isNotBlank(employee.getRoleIds())) { |
| | | List<Long> roleIds = JSONUtil.toList(employee.getRoleIds(), Long.class); |
| | | allRoleIds.addAll(roleIds); |
| | | } |
| | | } |
| | | Map<Long, RoleRespDTO> roleMap = CollUtil.isEmpty(allRoleIds) ? Collections.emptyMap() : |
| | | roleApi.getRoleList(allRoleIds).stream() |
| | | .collect(Collectors.toMap(RoleRespDTO::getId, r -> r)); |
| | | |
| | | // 4. å¡«å
ä¿¡æ¯ |
| | | for (int i = 0; i < respList.size(); i++) { |
| | | HrmEmployeeRespVO respVO = respList.get(i); |
| | | HrmEmployeeDO employee = employeeList.get(i); |
| | | |
| | | // å¡«å
é¨é¨åç§° |
| | | if (employee.getDeptId() != null && deptMap.containsKey(employee.getDeptId())) { |
| | | respVO.setDeptName(deptMap.get(employee.getDeptId()).getName()); |
| | | } |
| | | |
| | | // å¡«å
å²ä½åç§° |
| | | if (employee.getPostId() != null && postMap.containsKey(employee.getPostId())) { |
| | | respVO.setPostName(postMap.get(employee.getPostId()).getName()); |
| | | } |
| | | |
| | | // è§£æ roleIds å¹¶å¡«å
è§è²åç§° |
| | | if (StrUtil.isNotBlank(employee.getRoleIds())) { |
| | | List<Long> roleIds = JSONUtil.toList(employee.getRoleIds(), Long.class); |
| | | respVO.setRoleIds(roleIds); |
| | | if (CollUtil.isNotEmpty(roleIds)) { |
| | | List<String> roleNames = roleIds.stream() |
| | | .filter(roleMap::containsKey) |
| | | .map(id -> roleMap.get(id).getName()) |
| | | .collect(Collectors.toList()); |
| | | respVO.setRoleNames(String.join(",", roleNames)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @GetMapping("/simple-list") |
| | | @Operation(summary = "è·å¾å工精ç®å表", description = "ç¨äºä¸æéæ©") |
| | | public CommonResult<List<HrmEmployeeSimpleRespVO>> getEmployeeSimpleList( |
| | | @RequestParam(value = "employeeStatus", required = false) Integer employeeStatus) { |
| | | return success(employeeService.getEmployeeSimpleList(employeeStatus)); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºåå·¥ Excel") |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportEmployeeExcel(@Valid HrmEmployeePageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | PageResult<HrmEmployeeDO> pageResult = employeeService.getEmployeePage(pageReqVO); |
| | | List<HrmEmployeeDO> employeeList = pageResult.getList(); |
| | | // 转æ¢ä¸º VO |
| | | List<HrmEmployeeRespVO> list = BeanUtils.toBean(employeeList, HrmEmployeeRespVO.class); |
| | | // å¡«å
é¨é¨ãå²ä½ãè§è²åç§° |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | fillEmployeeInfo(list, employeeList); |
| | | } |
| | | ExcelUtils.write(response, "å工信æ¯.xls", "æ°æ®", HrmEmployeeRespVO.class, list); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEducationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEducationDO; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeEducationService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM åå·¥æè²ç»å") |
| | | @RestController |
| | | @RequestMapping("/hrm/employee/education") |
| | | @Validated |
| | | public class HrmEmployeeEducationController { |
| | | |
| | | @Resource |
| | | private HrmEmployeeEducationService educationService; |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·åæè²ç»åå表") |
| | | @Parameter(name = "employeeId", description = "åå·¥ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:query')") |
| | | public CommonResult<List<HrmEmployeeEducationRespVO>> getEducationList( |
| | | @RequestParam("employeeId") Long employeeId) { |
| | | List<HrmEmployeeEducationDO> list = educationService.getEducationListByEmployeeId(employeeId); |
| | | return success(BeanUtils.toBean(list, HrmEmployeeEducationRespVO.class)); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å 餿è²ç»å") |
| | | @Parameter(name = "id", description = "æè²ç»åID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:delete')") |
| | | public CommonResult<Boolean> deleteEducation(@RequestParam("id") Long id) { |
| | | educationService.deleteEducation(id); |
| | | return success(true); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEmergencyContactRespVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEmergencyContactDO; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeEmergencyContactService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM å工紧æ¥è系人") |
| | | @RestController |
| | | @RequestMapping("/hrm/employee/emergency-contact") |
| | | @Validated |
| | | public class HrmEmployeeEmergencyContactController { |
| | | |
| | | @Resource |
| | | private HrmEmployeeEmergencyContactService emergencyContactService; |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·åç´§æ¥è系人å表") |
| | | @Parameter(name = "employeeId", description = "åå·¥ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:query')") |
| | | public CommonResult<List<HrmEmployeeEmergencyContactRespVO>> getEmergencyContactList( |
| | | @RequestParam("employeeId") Long employeeId) { |
| | | List<HrmEmployeeEmergencyContactDO> list = emergencyContactService.getEmergencyContactListByEmployeeId(employeeId); |
| | | return success(BeanUtils.toBean(list, HrmEmployeeEmergencyContactRespVO.class)); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ç´§æ¥è系人") |
| | | @Parameter(name = "id", description = "ç´§æ¥è系人ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:delete')") |
| | | public CommonResult<Boolean> deleteEmergencyContact(@RequestParam("id") Long id) { |
| | | emergencyContactService.deleteEmergencyContact(id); |
| | | return success(true); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeWorkHistoryRespVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeWorkHistoryDO; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeWorkHistoryService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM å工工ä½ç»å") |
| | | @RestController |
| | | @RequestMapping("/hrm/employee/work-history") |
| | | @Validated |
| | | public class HrmEmployeeWorkHistoryController { |
| | | |
| | | @Resource |
| | | private HrmEmployeeWorkHistoryService workHistoryService; |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·åå·¥ä½ç»åå表") |
| | | @Parameter(name = "employeeId", description = "åå·¥ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:query')") |
| | | public CommonResult<List<HrmEmployeeWorkHistoryRespVO>> getWorkHistoryList( |
| | | @RequestParam("employeeId") Long employeeId) { |
| | | List<HrmEmployeeWorkHistoryDO> list = workHistoryService.getWorkHistoryListByEmployeeId(employeeId); |
| | | return success(BeanUtils.toBean(list, HrmEmployeeWorkHistoryRespVO.class)); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤å·¥ä½ç»å") |
| | | @Parameter(name = "id", description = "å·¥ä½ç»åID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:employee:delete')") |
| | | public CommonResult<Boolean> deleteWorkHistory(@RequestParam("id") Long id) { |
| | | workHistoryService.deleteWorkHistory(id); |
| | | return success(true); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - åå·¥æè²ç»å Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmEmployeeEducationRespVO { |
| | | |
| | | @Schema(description = "è®°å½ID") |
| | | @ExcelProperty("è®°å½ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åå·¥ID") |
| | | private Long employeeId; |
| | | |
| | | @Schema(description = "妿 ¡åç§°") |
| | | @ExcelProperty("妿 ¡åç§°") |
| | | private String schoolName; |
| | | |
| | | @Schema(description = "ä¸ä¸") |
| | | @ExcelProperty("ä¸ä¸") |
| | | private String major; |
| | | |
| | | @Schema(description = "å¦å") |
| | | @ExcelProperty(value = "å¦å", converter = DictConvert.class) |
| | | @DictFormat("hrm_degree") |
| | | private Integer degree; |
| | | |
| | | @Schema(description = "å
¥å¦æ¶é´") |
| | | @ExcelProperty("å
¥å¦æ¶é´") |
| | | private LocalDate startDate; |
| | | |
| | | @Schema(description = "æ¯ä¸æ¶é´") |
| | | @ExcelProperty("æ¯ä¸æ¶é´") |
| | | private LocalDate endDate; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç¼å·") |
| | | @ExcelProperty("è¯ä¹¦ç¼å·") |
| | | private String certificateNo; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - åå·¥æè²ç»åæ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmEmployeeEducationSaveReqVO { |
| | | |
| | | @Schema(description = "è®°å½ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åå·¥ID", example = "1") |
| | | private Long employeeId; |
| | | |
| | | @Schema(description = "妿 ¡åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "å京大å¦") |
| | | @NotEmpty(message = "妿 ¡åç§°ä¸è½ä¸ºç©º") |
| | | private String schoolName; |
| | | |
| | | @Schema(description = "ä¸ä¸", example = "è®¡ç®æºç§å¦ä¸ææ¯") |
| | | private String major; |
| | | |
| | | @Schema(description = "å¦å", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") |
| | | @NotNull(message = "å¦åä¸è½ä¸ºç©º") |
| | | private Integer degree; |
| | | |
| | | @Schema(description = "å
¥å¦æ¶é´", example = "2010-09-01") |
| | | private LocalDate startDate; |
| | | |
| | | @Schema(description = "æ¯ä¸æ¶é´", example = "2014-06-30") |
| | | private LocalDate endDate; |
| | | |
| | | @Schema(description = "è¯ä¹¦ç¼å·", example = "10284201412345678") |
| | | private String certificateNo; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - å工紧æ¥è系人 Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmEmployeeEmergencyContactRespVO { |
| | | |
| | | @Schema(description = "è®°å½ID") |
| | | @ExcelProperty("è®°å½ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åå·¥ID") |
| | | private Long employeeId; |
| | | |
| | | @Schema(description = "è系人å§å") |
| | | @ExcelProperty("è系人å§å") |
| | | private String name; |
| | | |
| | | @Schema(description = "ä¸åå·¥å
³ç³»") |
| | | @ExcelProperty("ä¸åå·¥å
³ç³»") |
| | | private String relationship; |
| | | |
| | | @Schema(description = "èç³»çµè¯") |
| | | @ExcelProperty("èç³»çµè¯") |
| | | private String phone; |
| | | |
| | | @Schema(description = "èç³»å°å") |
| | | @ExcelProperty("èç³»å°å") |
| | | private String address; |
| | | |
| | | @Schema(description = "æåº") |
| | | @ExcelProperty("æåº") |
| | | private Integer sort; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | @Schema(description = "管çåå° - å工紧æ¥è系人æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmEmployeeEmergencyContactSaveReqVO { |
| | | |
| | | @Schema(description = "è®°å½ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åå·¥ID", example = "1") |
| | | private Long employeeId; |
| | | |
| | | @Schema(description = "è系人å§å", requiredMode = Schema.RequiredMode.REQUIRED, example = "çäº") |
| | | @NotEmpty(message = "è系人å§åä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "ä¸åå·¥å
³ç³»", requiredMode = Schema.RequiredMode.REQUIRED, example = "ç¶äº²") |
| | | @NotEmpty(message = "ä¸åå·¥å
³ç³»ä¸è½ä¸ºç©º") |
| | | private String relationship; |
| | | |
| | | @Schema(description = "èç³»çµè¯", requiredMode = Schema.RequiredMode.REQUIRED, example = "13700137000") |
| | | @NotEmpty(message = "èç³»çµè¯ä¸è½ä¸ºç©º") |
| | | private String phone; |
| | | |
| | | @Schema(description = "èç³»å°å", example = "æ±èçå京å¸") |
| | | private String address; |
| | | |
| | | @Schema(description = "æåº", example = "1") |
| | | private Integer sort; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - åå·¥å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmEmployeePageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åå·¥ç¼å·", example = "EMP001") |
| | | private String employeeNo; |
| | | |
| | | @Schema(description = "åå·¥å§å", example = "å¼ ä¸") |
| | | private String name; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "åå·¥ç¶æ", example = "1") |
| | | private Integer employeeStatus; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - åå·¥ Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmEmployeeRespVO { |
| | | |
| | | @Schema(description = "åå·¥ID", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @ExcelProperty("åå·¥ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åå·¥ç¼å·") |
| | | @ExcelProperty("åå·¥ç¼å·") |
| | | private String employeeNo; |
| | | |
| | | @Schema(description = "é¨é¨ID") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "é¨é¨åç§°") |
| | | @ExcelProperty("é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "å²ä½ID") |
| | | private Long postId; |
| | | |
| | | @Schema(description = "å²ä½åç§°") |
| | | @ExcelProperty("å²ä½åç§°") |
| | | private String postName; |
| | | |
| | | @Schema(description = "åå·¥å§å") |
| | | @ExcelProperty("åå·¥å§å") |
| | | private String name; |
| | | |
| | | @Schema(description = "æ§å«") |
| | | @ExcelProperty(value = "æ§å«", converter = DictConvert.class) |
| | | @DictFormat("system_user_sex") |
| | | private Integer gender; |
| | | |
| | | @Schema(description = "åºçæ¥æ") |
| | | @ExcelProperty("åºçæ¥æ") |
| | | private LocalDate birthday; |
| | | |
| | | @Schema(description = "ææºå·ç ") |
| | | @ExcelProperty("ææºå·ç ") |
| | | private String phone; |
| | | |
| | | @Schema(description = "é®ç®±") |
| | | @ExcelProperty("é®ç®±") |
| | | private String email; |
| | | |
| | | @Schema(description = "身份è¯å·") |
| | | @ExcelProperty("身份è¯å·") |
| | | private String idCard; |
| | | |
| | | @Schema(description = "å
¥èæ¥æ") |
| | | @ExcelProperty("å
¥èæ¥æ") |
| | | private LocalDate hireDate; |
| | | |
| | | @Schema(description = "è½¬æ£æ¥æ") |
| | | @ExcelProperty("è½¬æ£æ¥æ") |
| | | private LocalDate regularDate; |
| | | |
| | | @Schema(description = "ç¦»èæ¥æ") |
| | | @ExcelProperty("ç¦»èæ¥æ") |
| | | private LocalDate leaveDate; |
| | | |
| | | @Schema(description = "åå·¥ç¶æ") |
| | | @ExcelProperty(value = "åå·¥ç¶æ", converter = DictConvert.class) |
| | | @DictFormat("hrm_employee_status") |
| | | private Integer employeeStatus; |
| | | |
| | | @Schema(description = "å¹´åä½é¢ï¼å¤©ï¼") |
| | | @ExcelProperty("å¹´åä½é¢") |
| | | private BigDecimal annualLeaveBalance; |
| | | |
| | | @Schema(description = "ç
åä½é¢ï¼å¤©ï¼") |
| | | @ExcelProperty("ç
åä½é¢") |
| | | private BigDecimal sickLeaveBalance; |
| | | |
| | | @Schema(description = "èªé
ȾID") |
| | | private Long salaryStructureId; |
| | | |
| | | @Schema(description = "åºæ¬å·¥èµ") |
| | | @ExcelProperty("åºæ¬å·¥èµ") |
| | | private BigDecimal baseSalary; |
| | | |
| | | @Schema(description = "è§è²IDå表") |
| | | private List<Long> roleIds; |
| | | |
| | | @Schema(description = "è§è²åç§°å表") |
| | | @ExcelProperty("è§è²") |
| | | private String roleNames; |
| | | |
| | | @Schema(description = "弿·é¶è¡") |
| | | @ExcelProperty("弿·é¶è¡") |
| | | private String bankName; |
| | | |
| | | @Schema(description = "é¶è¡è´¦å·") |
| | | @ExcelProperty("é¶è¡è´¦å·") |
| | | private String bankAccount; |
| | | |
| | | @Schema(description = "å±
ä½å°å") |
| | | @ExcelProperty("å±
ä½å°å") |
| | | private String address; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.Valid; |
| | | import jakarta.validation.constraints.Email; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import jakarta.validation.constraints.Pattern; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - åå·¥æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmEmployeeSaveReqVO { |
| | | |
| | | @Schema(description = "åå·¥ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "é¨é¨ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "é¨é¨ä¸è½ä¸ºç©º") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "å²ä½ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "å²ä½ä¸è½ä¸ºç©º") |
| | | private Long postId; |
| | | |
| | | @Schema(description = "åå·¥å§å", requiredMode = Schema.RequiredMode.REQUIRED, example = "å¼ ä¸") |
| | | @NotEmpty(message = "åå·¥å§åä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "æ§å«", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "æ§å«ä¸è½ä¸ºç©º") |
| | | private Integer gender; |
| | | |
| | | @Schema(description = "åºçæ¥æ", example = "1990-01-15") |
| | | private LocalDate birthday; |
| | | |
| | | @Schema(description = "ææºå·ç ", requiredMode = Schema.RequiredMode.REQUIRED, example = "13800138000") |
| | | @NotEmpty(message = "ææºå·ç ä¸è½ä¸ºç©º") |
| | | @Pattern(regexp = "^1[3-9]\\d{9}$", message = "ææºå·ç æ ¼å¼ä¸æ£ç¡®") |
| | | private String phone; |
| | | |
| | | @Schema(description = "é®ç®±", example = "zhangsan@example.com") |
| | | @Email(message = "é®ç®±æ ¼å¼ä¸æ£ç¡®") |
| | | private String email; |
| | | |
| | | @Schema(description = "身份è¯å·", example = "320102199001150011") |
| | | @Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$", |
| | | message = "身份è¯å·æ ¼å¼ä¸æ£ç¡®") |
| | | private String idCard; |
| | | |
| | | @Schema(description = "å
¥èæ¥æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "2020-03-01") |
| | | @NotNull(message = "å
¥èæ¥æä¸è½ä¸ºç©º") |
| | | private LocalDate hireDate; |
| | | |
| | | @Schema(description = "è½¬æ£æ¥æ", example = "2020-06-01") |
| | | private LocalDate regularDate; |
| | | |
| | | @Schema(description = "åå·¥ç¶æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "åå·¥ç¶æä¸è½ä¸ºç©º") |
| | | private Integer employeeStatus; |
| | | |
| | | @Schema(description = "å¹´åä½é¢ï¼å¤©ï¼", example = "5") |
| | | private BigDecimal annualLeaveBalance; |
| | | |
| | | @Schema(description = "ç
åä½é¢ï¼å¤©ï¼", example = "10") |
| | | private BigDecimal sickLeaveBalance; |
| | | |
| | | @Schema(description = "èªé
ȾID", example = "1") |
| | | private Long salaryStructureId; |
| | | |
| | | @Schema(description = "åºæ¬å·¥èµ", example = "10000.00") |
| | | private BigDecimal baseSalary; |
| | | |
| | | @Schema(description = "è§è²IDå表", example = "[1, 2]") |
| | | private List<Long> roleIds; |
| | | |
| | | @Schema(description = "弿·é¶è¡", example = "ä¸å½å·¥åé¶è¡") |
| | | private String bankName; |
| | | |
| | | @Schema(description = "é¶è¡è´¦å·", example = "6222021234567890123") |
| | | private String bankAccount; |
| | | |
| | | @Schema(description = "å±
ä½å°å", example = "æ±èçå京å¸") |
| | | private String address; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | // ========== åè¡¨æ°æ® ========== |
| | | |
| | | @Schema(description = "æè²ç»åå表") |
| | | @Valid |
| | | private List<HrmEmployeeEducationSaveReqVO> educationList; |
| | | |
| | | @Schema(description = "å·¥ä½ç»åå表") |
| | | @Valid |
| | | private List<HrmEmployeeWorkHistorySaveReqVO> workHistoryList; |
| | | |
| | | @Schema(description = "ç´§æ¥è系人å表") |
| | | @Valid |
| | | private List<HrmEmployeeEmergencyContactSaveReqVO> emergencyContactList; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | @Schema(description = "管çåå° - åå·¥ç®åä¿¡æ¯ Response VO") |
| | | @Data |
| | | public class HrmEmployeeSimpleRespVO { |
| | | |
| | | @Schema(description = "åå·¥ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åå·¥ç¼å·") |
| | | private String employeeNo; |
| | | |
| | | @Schema(description = "åå·¥å§å") |
| | | private String name; |
| | | |
| | | @Schema(description = "é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "åå·¥ç¶æ") |
| | | private Integer employeeStatus; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - å工工ä½ç»å Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmEmployeeWorkHistoryRespVO { |
| | | |
| | | @Schema(description = "è®°å½ID") |
| | | @ExcelProperty("è®°å½ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åå·¥ID") |
| | | private Long employeeId; |
| | | |
| | | @Schema(description = "å
¬å¸åç§°") |
| | | @ExcelProperty("å
¬å¸åç§°") |
| | | private String companyName; |
| | | |
| | | @Schema(description = "èä½") |
| | | @ExcelProperty("èä½") |
| | | private String position; |
| | | |
| | | @Schema(description = "å
¥èæ¶é´") |
| | | @ExcelProperty("å
¥èæ¶é´") |
| | | private LocalDate startDate; |
| | | |
| | | @Schema(description = "ç¦»èæ¶é´") |
| | | @ExcelProperty("ç¦»èæ¶é´") |
| | | private LocalDate endDate; |
| | | |
| | | @Schema(description = "å·¥ä½å
容") |
| | | @ExcelProperty("å·¥ä½å
容") |
| | | private String workContent; |
| | | |
| | | @Schema(description = "离èåå ") |
| | | @ExcelProperty("离èåå ") |
| | | private String leaveReason; |
| | | |
| | | @Schema(description = "è¯æäººå§å") |
| | | @ExcelProperty("è¯æäººå§å") |
| | | private String referenceName; |
| | | |
| | | @Schema(description = "è¯æäººçµè¯") |
| | | @ExcelProperty("è¯æäººçµè¯") |
| | | private String referencePhone; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.employee.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - å工工ä½ç»åæ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmEmployeeWorkHistorySaveReqVO { |
| | | |
| | | @Schema(description = "è®°å½ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åå·¥ID", example = "1") |
| | | private Long employeeId; |
| | | |
| | | @Schema(description = "å
¬å¸åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "XXç§ææéå
¬å¸") |
| | | @NotEmpty(message = "å
¬å¸åç§°ä¸è½ä¸ºç©º") |
| | | private String companyName; |
| | | |
| | | @Schema(description = "èä½", requiredMode = Schema.RequiredMode.REQUIRED, example = "Javaå¼åå·¥ç¨å¸") |
| | | @NotEmpty(message = "èä½ä¸è½ä¸ºç©º") |
| | | private String position; |
| | | |
| | | @Schema(description = "å
¥èæ¶é´", example = "2015-03-01") |
| | | private LocalDate startDate; |
| | | |
| | | @Schema(description = "ç¦»èæ¶é´", example = "2020-02-28") |
| | | private LocalDate endDate; |
| | | |
| | | @Schema(description = "å·¥ä½å
容", example = "è´è´£å端系ç»å¼å") |
| | | private String workContent; |
| | | |
| | | @Schema(description = "离èåå ", example = "个人åå±") |
| | | private String leaveReason; |
| | | |
| | | @Schema(description = "è¯æäººå§å", example = "æå") |
| | | private String referenceName; |
| | | |
| | | @Schema(description = "è¯æäººçµè¯", example = "13900139000") |
| | | private String referencePhone; |
| | | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmEmployeeSocialSecurityPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmEmployeeSocialSecurityRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmEmployeeSocialSecuritySaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmEmployeeSocialSecurityDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSocialSecuritySchemeDO; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; |
| | | import cn.iocoder.yudao.module.hrm.service.salary.HrmEmployeeSocialSecurityService; |
| | | import cn.iocoder.yudao.module.hrm.service.salary.HrmSocialSecuritySchemeService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM å工社ä¿å
¬ç§¯éæ¡£æ¡") |
| | | @RestController |
| | | @RequestMapping("/hrm/salary/employee-social-security") |
| | | @Validated |
| | | public class HrmEmployeeSocialSecurityController { |
| | | |
| | | @Resource |
| | | private HrmEmployeeSocialSecurityService employeeSocialSecurityService; |
| | | @Resource |
| | | private HrmEmployeeService employeeService; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | @Resource |
| | | private HrmSocialSecuritySchemeService schemeService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建å工社ä¿å
¬ç§¯éæ¡£æ¡") |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:create')") |
| | | public CommonResult<Long> createEmployeeSocialSecurity(@Valid @RequestBody HrmEmployeeSocialSecuritySaveReqVO createReqVO) { |
| | | HrmEmployeeSocialSecurityDO socialSecurity = BeanUtils.toBean(createReqVO, HrmEmployeeSocialSecurityDO.class); |
| | | return success(employeeSocialSecurityService.createEmployeeSocialSecurity(socialSecurity)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°å工社ä¿å
¬ç§¯éæ¡£æ¡") |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:update')") |
| | | public CommonResult<Boolean> updateEmployeeSocialSecurity(@Valid @RequestBody HrmEmployeeSocialSecuritySaveReqVO updateReqVO) { |
| | | HrmEmployeeSocialSecurityDO socialSecurity = BeanUtils.toBean(updateReqVO, HrmEmployeeSocialSecurityDO.class); |
| | | employeeSocialSecurityService.updateEmployeeSocialSecurity(socialSecurity); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤å工社ä¿å
¬ç§¯éæ¡£æ¡") |
| | | @Parameter(name = "id", description = "æ¡£æ¡ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:delete')") |
| | | public CommonResult<Boolean> deleteEmployeeSocialSecurity(@RequestParam("id") Long id) { |
| | | employeeSocialSecurityService.deleteEmployeeSocialSecurity(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·åå工社ä¿å
¬ç§¯éæ¡£æ¡") |
| | | @Parameter(name = "id", description = "æ¡£æ¡ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:query')") |
| | | public CommonResult<HrmEmployeeSocialSecurityRespVO> getEmployeeSocialSecurity(@RequestParam("id") Long id) { |
| | | HrmEmployeeSocialSecurityDO socialSecurity = employeeSocialSecurityService.getEmployeeSocialSecurity(id); |
| | | if (socialSecurity == null) { |
| | | return success(null); |
| | | } |
| | | HrmEmployeeSocialSecurityRespVO respVO = BeanUtils.toBean(socialSecurity, HrmEmployeeSocialSecurityRespVO.class); |
| | | // å¡«å
å工忹æ¡ä¿¡æ¯ |
| | | fillEmployeeInfo(respVO, socialSecurity.getUserId()); |
| | | fillSchemeInfo(respVO, socialSecurity.getSocialSecuritySchemeId()); |
| | | return success(respVO); |
| | | } |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·åå工社ä¿å
¬ç§¯éæ¡£æ¡å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:query')") |
| | | public CommonResult<PageResult<HrmEmployeeSocialSecurityRespVO>> getEmployeeSocialSecurityPage( |
| | | @Valid HrmEmployeeSocialSecurityPageReqVO pageReqVO) { |
| | | PageResult<HrmEmployeeSocialSecurityDO> pageResult = employeeSocialSecurityService.getEmployeeSocialSecurityPage(pageReqVO); |
| | | List<HrmEmployeeSocialSecurityDO> recordList = pageResult.getList(); |
| | | if (CollUtil.isEmpty(recordList)) { |
| | | return success(new PageResult<>(Collections.emptyList(), pageResult.getTotal())); |
| | | } |
| | | // userId æ¯åå·¥IDï¼æ¹éè·ååå·¥ä¿¡æ¯ |
| | | Set<Long> employeeIds = recordList.stream() |
| | | .map(HrmEmployeeSocialSecurityDO::getUserId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, HrmEmployeeDO> employeeMap = new HashMap<>(); |
| | | Set<Long> deptIds = new HashSet<>(); |
| | | for (Long employeeId : employeeIds) { |
| | | HrmEmployeeDO employee = employeeService.getEmployee(employeeId); |
| | | if (employee != null) { |
| | | employeeMap.put(employeeId, employee); |
| | | if (employee.getDeptId() != null) { |
| | | deptIds.add(employee.getDeptId()); |
| | | } |
| | | } |
| | | } |
| | | // æ¹éè·åé¨é¨ä¿¡æ¯ |
| | | Map<Long, DeptRespDTO> deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); |
| | | // æ¹éè·åæ¹æ¡ä¿¡æ¯ |
| | | Set<Long> schemeIds = recordList.stream() |
| | | .map(HrmEmployeeSocialSecurityDO::getSocialSecuritySchemeId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, HrmSocialSecuritySchemeDO> schemeMap = new HashMap<>(); |
| | | for (Long schemeId : schemeIds) { |
| | | HrmSocialSecuritySchemeDO scheme = schemeService.getScheme(schemeId); |
| | | if (scheme != null) { |
| | | schemeMap.put(schemeId, scheme); |
| | | } |
| | | } |
| | | // 转æ¢å¹¶å¡«å
ä¿¡æ¯ |
| | | List<HrmEmployeeSocialSecurityRespVO> list = recordList.stream() |
| | | .map(socialSecurity -> { |
| | | HrmEmployeeSocialSecurityRespVO respVO = BeanUtils.toBean(socialSecurity, HrmEmployeeSocialSecurityRespVO.class); |
| | | // å¡«å
åå·¥å§ååé¨é¨åç§°ï¼userId æ¯åå·¥IDï¼ |
| | | HrmEmployeeDO employee = employeeMap.get(socialSecurity.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | if (employee.getDeptId() != null) { |
| | | DeptRespDTO dept = deptMap.get(employee.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | } |
| | | // å¡«å
æ¹æ¡åç§° |
| | | if (socialSecurity.getSocialSecuritySchemeId() != null) { |
| | | HrmSocialSecuritySchemeDO scheme = schemeMap.get(socialSecurity.getSocialSecuritySchemeId()); |
| | | if (scheme != null) { |
| | | respVO.setSchemeName(scheme.getName()); |
| | | } |
| | | } |
| | | return respVO; |
| | | }) |
| | | .toList(); |
| | | return success(new PageResult<>(list, pageResult.getTotal())); |
| | | } |
| | | |
| | | @GetMapping("/list-by-user") |
| | | @Operation(summary = "è·åå工社ä¿å
¬ç§¯éæ¡£æ¡åå²å表") |
| | | @Parameter(name = "userId", description = "ç³»ç»ç¨æ·ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:query')") |
| | | public CommonResult<List<HrmEmployeeSocialSecurityRespVO>> getEmployeeSocialSecurityList( |
| | | @RequestParam("userId") Long userId) { |
| | | List<HrmEmployeeSocialSecurityDO> list = employeeSocialSecurityService.getEmployeeSocialSecurityList(userId); |
| | | List<HrmEmployeeSocialSecurityRespVO> result = list.stream() |
| | | .map(socialSecurity -> { |
| | | HrmEmployeeSocialSecurityRespVO respVO = BeanUtils.toBean(socialSecurity, HrmEmployeeSocialSecurityRespVO.class); |
| | | fillSchemeInfo(respVO, socialSecurity.getSocialSecuritySchemeId()); |
| | | return respVO; |
| | | }) |
| | | .toList(); |
| | | return success(result); |
| | | } |
| | | |
| | | @GetMapping("/get-latest") |
| | | @Operation(summary = "è·ååå·¥ææ°çæç社ä¿å
¬ç§¯éæ¡£æ¡") |
| | | @Parameter(name = "userId", description = "ç³»ç»ç¨æ·ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:query')") |
| | | public CommonResult<HrmEmployeeSocialSecurityRespVO> getLatestEmployeeSocialSecurity( |
| | | @RequestParam("userId") Long userId) { |
| | | HrmEmployeeSocialSecurityDO socialSecurity = employeeSocialSecurityService.getLatestEmployeeSocialSecurity(userId); |
| | | if (socialSecurity == null) { |
| | | return success(null); |
| | | } |
| | | HrmEmployeeSocialSecurityRespVO respVO = BeanUtils.toBean(socialSecurity, HrmEmployeeSocialSecurityRespVO.class); |
| | | // å¡«å
å工忹æ¡ä¿¡æ¯ |
| | | fillEmployeeInfo(respVO, socialSecurity.getUserId()); |
| | | fillSchemeInfo(respVO, socialSecurity.getSocialSecuritySchemeId()); |
| | | return success(respVO); |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
å工信æ¯ï¼éè¿åå·¥IDï¼ |
| | | */ |
| | | private void fillEmployeeInfo(HrmEmployeeSocialSecurityRespVO respVO, Long userId) { |
| | | // userId æ¯åå·¥IDï¼éè¿å工表è·åå§ååé¨é¨ |
| | | HrmEmployeeDO employee = employeeService.getEmployee(userId); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | if (employee.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(employee.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
æ¹æ¡ä¿¡æ¯ |
| | | */ |
| | | private void fillSchemeInfo(HrmEmployeeSocialSecurityRespVO respVO, Long schemeId) { |
| | | if (schemeId != null) { |
| | | HrmSocialSecuritySchemeDO scheme = schemeService.getScheme(schemeId); |
| | | if (scheme != null) { |
| | | respVO.setSchemeName(scheme.getName()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmLeaveTypeConfigRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmLeaveTypeConfigSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmLeaveTypeConfigDO; |
| | | import cn.iocoder.yudao.module.hrm.service.salary.HrmLeaveTypeConfigService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM 请åç±»åæ£æ¬¾é
ç½®") |
| | | @RestController |
| | | @RequestMapping("/hrm/leave-type-config") |
| | | @Validated |
| | | public class HrmLeaveTypeConfigController { |
| | | |
| | | @Resource |
| | | private HrmLeaveTypeConfigService leaveTypeConfigService; |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·åææè¯·åç±»åé
ç½®å表") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:query')") |
| | | public CommonResult<List<HrmLeaveTypeConfigRespVO>> getLeaveTypeConfigList() { |
| | | List<HrmLeaveTypeConfigDO> list = leaveTypeConfigService.getLeaveTypeConfigList(); |
| | | return success(BeanUtils.toBean(list, HrmLeaveTypeConfigRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å请åç±»åé
ç½®") |
| | | @Parameter(name = "leaveType", description = "请åç±»å", required = true, example = "1") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:query')") |
| | | public CommonResult<HrmLeaveTypeConfigRespVO> getLeaveTypeConfig(@RequestParam("leaveType") Integer leaveType) { |
| | | HrmLeaveTypeConfigDO config = leaveTypeConfigService.getLeaveTypeConfig(leaveType); |
| | | return success(BeanUtils.toBean(config, HrmLeaveTypeConfigRespVO.class)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°è¯·åç±»åé
ç½®") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:update')") |
| | | public CommonResult<Boolean> updateLeaveTypeConfig(@Valid @RequestBody HrmLeaveTypeConfigSaveReqVO updateReqVO) { |
| | | HrmLeaveTypeConfigDO config = BeanUtils.toBean(updateReqVO, HrmLeaveTypeConfigDO.class); |
| | | leaveTypeConfigService.updateLeaveTypeConfig(config); |
| | | return success(true); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryCalculationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryCalculationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryCalculationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryCalculationDO; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; |
| | | import cn.iocoder.yudao.module.hrm.service.salary.HrmSalaryCalculationService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM èªé
¬æ ¸ç®") |
| | | @RestController |
| | | @RequestMapping("/hrm/salary/calculation") |
| | | @Validated |
| | | public class HrmSalaryCalculationController { |
| | | |
| | | @Resource |
| | | private HrmSalaryCalculationService salaryCalculationService; |
| | | @Resource |
| | | private HrmEmployeeService employeeService; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾èªé
¬æ ¸ç®å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:query')") |
| | | public CommonResult<PageResult<HrmSalaryCalculationRespVO>> getSalaryCalculationPage(@Valid HrmSalaryCalculationPageReqVO pageReqVO) { |
| | | PageResult<HrmSalaryCalculationDO> pageResult = salaryCalculationService.getSalaryCalculationPage(pageReqVO); |
| | | // 转æ¢ä¸º VO |
| | | List<HrmSalaryCalculationRespVO> list = BeanUtils.toBean(pageResult.getList(), HrmSalaryCalculationRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | fillUserInfo(list, pageResult.getList()); |
| | | } |
| | | return success(new PageResult<>(list, pageResult.getTotal())); |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
åå·¥åé¨é¨ä¿¡æ¯ï¼userId æ¯åå·¥IDï¼ |
| | | */ |
| | | private void fillUserInfo(List<HrmSalaryCalculationRespVO> respList, List<HrmSalaryCalculationDO> calculationList) { |
| | | // userId æ¯åå·¥IDï¼æ¹éè·ååå·¥ä¿¡æ¯ |
| | | Set<Long> employeeIds = calculationList.stream() |
| | | .map(HrmSalaryCalculationDO::getUserId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, HrmEmployeeDO> employeeMap = new HashMap<>(); |
| | | for (Long employeeId : employeeIds) { |
| | | HrmEmployeeDO employee = employeeService.getEmployee(employeeId); |
| | | if (employee != null) { |
| | | employeeMap.put(employeeId, employee); |
| | | } |
| | | } |
| | | |
| | | // æ¹éè·åé¨é¨ä¿¡æ¯ |
| | | Set<Long> deptIds = calculationList.stream() |
| | | .map(HrmSalaryCalculationDO::getDeptId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); |
| | | |
| | | // å¡«å
ä¿¡æ¯ |
| | | for (HrmSalaryCalculationRespVO respVO : respList) { |
| | | HrmEmployeeDO employee = employeeMap.get(respVO.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | } |
| | | DeptRespDTO dept = deptMap.get(respVO.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾èªé
¬æ ¸ç®") |
| | | @Parameter(name = "id", description = "æ ¸ç®ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:query')") |
| | | public CommonResult<HrmSalaryCalculationRespVO> getSalaryCalculation(@RequestParam("id") Long id) { |
| | | HrmSalaryCalculationDO salaryCalculation = salaryCalculationService.getSalaryCalculation(id); |
| | | if (salaryCalculation == null) { |
| | | return success(null); |
| | | } |
| | | HrmSalaryCalculationRespVO respVO = BeanUtils.toBean(salaryCalculation, HrmSalaryCalculationRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ï¼userId æ¯åå·¥IDï¼ |
| | | if (salaryCalculation.getUserId() != null) { |
| | | HrmEmployeeDO employee = employeeService.getEmployee(salaryCalculation.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | } |
| | | } |
| | | if (salaryCalculation.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(salaryCalculation.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | return success(respVO); |
| | | } |
| | | |
| | | @PostMapping("/calculate") |
| | | @Operation(summary = "æ§è¡èªé
¬æ ¸ç®") |
| | | @Parameter(name = "period", description = "æ ¸ç®å¨æ", required = true, example = "2024-01") |
| | | @Parameter(name = "deptId", description = "é¨é¨IDï¼ä¸ºç©ºåæ ¸ç®ææé¨é¨", example = "1") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:calculate')") |
| | | public CommonResult<Boolean> calculateSalary(@RequestParam("period") String period, |
| | | @RequestParam(value = "deptId", required = false) Long deptId) { |
| | | salaryCalculationService.calculateSalary(period, deptId); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/confirm") |
| | | @Operation(summary = "æ¹é确认èªé
¬æ ¸ç®") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:confirm')") |
| | | public CommonResult<Boolean> confirmSalaryCalculation(@RequestBody Map<String, List<Long>> request) { |
| | | List<Long> ids = request.get("ids"); |
| | | salaryCalculationService.confirmSalaryCalculation(ids); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/revoke") |
| | | @Operation(summary = "æ¹éæ¤éèªé
¬æ ¸ç®ç¡®è®¤") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:confirm')") |
| | | public CommonResult<Boolean> revokeSalaryCalculation(@RequestBody Map<String, List<Long>> request) { |
| | | List<Long> ids = request.get("ids"); |
| | | salaryCalculationService.revokeSalaryCalculation(ids); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤èªé
¬æ ¸ç®è®°å½") |
| | | @Parameter(name = "id", description = "æ ¸ç®ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:delete')") |
| | | public CommonResult<Boolean> deleteSalaryCalculation(@RequestParam("id") Long id) { |
| | | salaryCalculationService.deleteSalaryCalculation(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºèªé
¬æ ¸ç® Excel") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:export')") |
| | | @ApiAccessLog(operateType = EXPORT) |
| | | public void exportSalaryCalculationExcel(@Valid HrmSalaryCalculationPageReqVO pageReqVO, |
| | | HttpServletResponse response) throws IOException { |
| | | pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); |
| | | PageResult<HrmSalaryCalculationDO> pageResult = salaryCalculationService.getSalaryCalculationPage(pageReqVO); |
| | | List<HrmSalaryCalculationDO> calculationList = pageResult.getList(); |
| | | // 转æ¢ä¸º VO |
| | | List<HrmSalaryCalculationRespVO> list = BeanUtils.toBean(calculationList, HrmSalaryCalculationRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | fillUserInfo(list, calculationList); |
| | | } |
| | | ExcelUtils.write(response, "èªé
¬æ ¸ç®.xls", "æ°æ®", HrmSalaryCalculationRespVO.class, list); |
| | | } |
| | | |
| | | @GetMapping("/preview") |
| | | @Operation(summary = "é¢è§é¨é¨ä¸ææåå·¥çèªèµæ ¸ç®ä¿¡æ¯") |
| | | @Parameter(name = "period", description = "æ ¸ç®å¨æ", required = true, example = "2024-01") |
| | | @Parameter(name = "deptId", description = "é¨é¨IDï¼ä¸ºç©ºåæ¥è¯¢å
¨é¨", example = "1") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:query')") |
| | | public CommonResult<List<HrmSalaryCalculationRespVO>> previewSalaryCalculation( |
| | | @RequestParam("period") String period, |
| | | @RequestParam(value = "deptId", required = false) Long deptId) { |
| | | // æ¥è¯¢å·²è®¡ç®å¥½çèªé
¬æ ¸ç®è®°å½ |
| | | List<HrmSalaryCalculationDO> list = salaryCalculationService.previewSalaryCalculation(period, deptId); |
| | | // 转æ¢ä¸º VO |
| | | List<HrmSalaryCalculationRespVO> respList = BeanUtils.toBean(list, HrmSalaryCalculationRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | if (CollUtil.isNotEmpty(respList)) { |
| | | fillUserInfo(respList, list); |
| | | } |
| | | return success(respList); |
| | | } |
| | | |
| | | @PostMapping("/save") |
| | | @Operation(summary = "æ¹éä¿åèªé
¬æ ¸ç®è®°å½") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:calculate')") |
| | | public CommonResult<Boolean> saveSalaryCalculation(@Valid @RequestBody HrmSalaryCalculationSaveReqVO saveReqVO) { |
| | | // 转æ¢ä¸º DO å表 |
| | | List<HrmSalaryCalculationDO> calculationList = saveReqVO.getList().stream() |
| | | .map(item -> { |
| | | HrmSalaryCalculationDO calculation = BeanUtils.toBean(item, HrmSalaryCalculationDO.class); |
| | | calculation.setPeriod(saveReqVO.getPeriod()); |
| | | return calculation; |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | // æ¹éä¿å |
| | | salaryCalculationService.saveSalaryCalculationList(calculationList); |
| | | return success(true); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryPaymentDetailPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryPaymentDetailRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryPaymentPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryPaymentRespVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryPaymentDetailDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryPaymentDO; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; |
| | | import cn.iocoder.yudao.module.hrm.service.salary.HrmSalaryPaymentService; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM èªèµåæ¾") |
| | | @RestController |
| | | @RequestMapping("/hrm/salary/payment") |
| | | @Validated |
| | | public class HrmSalaryPaymentController { |
| | | |
| | | @Resource |
| | | private HrmSalaryPaymentService salaryPaymentService; |
| | | @Resource |
| | | private HrmEmployeeService employeeService; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | |
| | | @GetMapping("/page") |
| | | @Operation(summary = "è·å¾èªèµåæ¾å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:query')") |
| | | public CommonResult<PageResult<HrmSalaryPaymentRespVO>> getSalaryPaymentPage(@Valid HrmSalaryPaymentPageReqVO pageReqVO) { |
| | | PageResult<HrmSalaryPaymentDO> pageResult = salaryPaymentService.getSalaryPaymentPage(pageReqVO); |
| | | return success(BeanUtils.toBean(pageResult, HrmSalaryPaymentRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å¾èªèµåæ¾") |
| | | @Parameter(name = "id", description = "åæ¾ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:query')") |
| | | public CommonResult<HrmSalaryPaymentRespVO> getSalaryPayment(@RequestParam("id") Long id) { |
| | | HrmSalaryPaymentDO salaryPayment = salaryPaymentService.getSalaryPayment(id); |
| | | return success(BeanUtils.toBean(salaryPayment, HrmSalaryPaymentRespVO.class)); |
| | | } |
| | | |
| | | @PostMapping("/generate") |
| | | @Operation(summary = "çæèªèµåæ¾å°è´¦") |
| | | @Parameter(name = "period", description = "æ ¸ç®å¨æ", required = true, example = "2024-01") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:generate')") |
| | | public CommonResult<Long> generatePayment(@RequestParam("period") String period) { |
| | | return success(salaryPaymentService.generatePayment(period)); |
| | | } |
| | | |
| | | @PostMapping("/pay") |
| | | @Operation(summary = "åæ¾èªèµï¼æ´ä¸ªå°è´¦ï¼") |
| | | @Parameter(name = "id", description = "åæ¾å°è´¦ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:pay')") |
| | | public CommonResult<Boolean> paySalary(@RequestParam("id") Long id) { |
| | | salaryPaymentService.paySalary(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/pay-detail") |
| | | @Operation(summary = "æ¹éåæ¾èªèµæç»") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:pay')") |
| | | public CommonResult<Boolean> paySalaryDetail(@RequestBody Map<String, List<Long>> request) { |
| | | List<Long> detailIds = request.get("detailIds"); |
| | | salaryPaymentService.paySalaryDetail(detailIds); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/revoke-detail") |
| | | @Operation(summary = "æ¹éæ¤éèªèµåæ¾æç»") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:pay')") |
| | | public CommonResult<Boolean> revokeSalaryPaymentDetail(@RequestBody Map<String, List<Long>> request) { |
| | | List<Long> detailIds = request.get("detailIds"); |
| | | salaryPaymentService.revokeSalaryPaymentDetail(detailIds); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤èªèµåæ¾å°è´¦") |
| | | @Parameter(name = "id", description = "åæ¾å°è´¦ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:delete')") |
| | | public CommonResult<Boolean> deleteSalaryPayment(@RequestParam("id") Long id) { |
| | | salaryPaymentService.deleteSalaryPayment(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/detail/page") |
| | | @Operation(summary = "è·å¾èªèµåæ¾æç»å页") |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:query')") |
| | | public CommonResult<PageResult<HrmSalaryPaymentDetailRespVO>> getSalaryPaymentDetailPage(@Valid HrmSalaryPaymentDetailPageReqVO pageReqVO) { |
| | | PageResult<HrmSalaryPaymentDetailDO> pageResult = salaryPaymentService.getSalaryPaymentDetailPage(pageReqVO); |
| | | List<HrmSalaryPaymentDetailRespVO> list = BeanUtils.toBean(pageResult.getList(), HrmSalaryPaymentDetailRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | fillUserInfo(list, pageResult.getList()); |
| | | } |
| | | return success(new PageResult<>(list, pageResult.getTotal())); |
| | | } |
| | | |
| | | @GetMapping("/detail/list") |
| | | @Operation(summary = "è·å¾èªèµåæ¾æç»å表") |
| | | @Parameter(name = "paymentId", description = "åæ¾å°è´¦ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:salary:query')") |
| | | public CommonResult<List<HrmSalaryPaymentDetailRespVO>> getSalaryPaymentDetailList(@RequestParam("paymentId") Long paymentId) { |
| | | List<HrmSalaryPaymentDetailDO> detailList = salaryPaymentService.getSalaryPaymentDetailListByPaymentId(paymentId); |
| | | List<HrmSalaryPaymentDetailRespVO> list = BeanUtils.toBean(detailList, HrmSalaryPaymentDetailRespVO.class); |
| | | // å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | if (CollUtil.isNotEmpty(list)) { |
| | | fillUserInfo(list, detailList); |
| | | } |
| | | return success(list); |
| | | } |
| | | |
| | | /** |
| | | * å¡«å
åå·¥åé¨é¨ä¿¡æ¯ |
| | | */ |
| | | private void fillUserInfo(List<HrmSalaryPaymentDetailRespVO> respList, List<HrmSalaryPaymentDetailDO> detailList) { |
| | | // æ¹éè·ååå·¥ä¿¡æ¯ |
| | | Set<Long> employeeIds = detailList.stream() |
| | | .map(HrmSalaryPaymentDetailDO::getUserId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, HrmEmployeeDO> employeeMap = new HashMap<>(); |
| | | for (Long employeeId : employeeIds) { |
| | | HrmEmployeeDO employee = employeeService.getEmployee(employeeId); |
| | | if (employee != null) { |
| | | employeeMap.put(employeeId, employee); |
| | | } |
| | | } |
| | | // æ¹éè·åé¨é¨ä¿¡æ¯ |
| | | Set<Long> deptIds = detailList.stream() |
| | | .map(HrmSalaryPaymentDetailDO::getDeptId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = CollUtil.isEmpty(deptIds) ? Collections.emptyMap() : deptApi.getDeptMap(deptIds); |
| | | |
| | | // å¡«å
ä¿¡æ¯ |
| | | for (HrmSalaryPaymentDetailRespVO respVO : respList) { |
| | | HrmEmployeeDO employee = employeeMap.get(respVO.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | } |
| | | DeptRespDTO dept = deptMap.get(respVO.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSocialSecurityConfigRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSocialSecurityConfigSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSocialSecurityConfigDO; |
| | | import cn.iocoder.yudao.module.hrm.service.salary.HrmSocialSecurityConfigService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM 社ä¿å
¬ç§¯éé
ç½®") |
| | | @RestController |
| | | @RequestMapping("/hrm/salary/social-security-config") |
| | | @Validated |
| | | public class HrmSocialSecurityConfigController { |
| | | |
| | | @Resource |
| | | private HrmSocialSecurityConfigService socialSecurityConfigService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建社ä¿å
¬ç§¯éé
ç½®") |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:create')") |
| | | public CommonResult<Long> createSocialSecurityConfig(@Valid @RequestBody HrmSocialSecurityConfigSaveReqVO createReqVO) { |
| | | HrmSocialSecurityConfigDO config = BeanUtils.toBean(createReqVO, HrmSocialSecurityConfigDO.class); |
| | | return success(socialSecurityConfigService.createSocialSecurityConfig(config)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°ç¤¾ä¿å
¬ç§¯éé
ç½®") |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:update')") |
| | | public CommonResult<Boolean> updateSocialSecurityConfig(@Valid @RequestBody HrmSocialSecurityConfigSaveReqVO updateReqVO) { |
| | | HrmSocialSecurityConfigDO config = BeanUtils.toBean(updateReqVO, HrmSocialSecurityConfigDO.class); |
| | | socialSecurityConfigService.updateSocialSecurityConfig(config); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ç¤¾ä¿å
¬ç§¯éé
ç½®") |
| | | @Parameter(name = "id", description = "é
ç½®ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:delete')") |
| | | public CommonResult<Boolean> deleteSocialSecurityConfig(@RequestParam("id") Long id) { |
| | | socialSecurityConfigService.deleteSocialSecurityConfig(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å社ä¿å
¬ç§¯éé
ç½®") |
| | | @Parameter(name = "id", description = "é
ç½®ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:query')") |
| | | public CommonResult<HrmSocialSecurityConfigRespVO> getSocialSecurityConfig(@RequestParam("id") Long id) { |
| | | HrmSocialSecurityConfigDO config = socialSecurityConfigService.getSocialSecurityConfig(id); |
| | | return success(BeanUtils.toBean(config, HrmSocialSecurityConfigRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·å社ä¿å
¬ç§¯éé
ç½®å表") |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:query')") |
| | | public CommonResult<List<HrmSocialSecurityConfigRespVO>> getSocialSecurityConfigList() { |
| | | List<HrmSocialSecurityConfigDO> list = socialSecurityConfigService.getSocialSecurityConfigList(); |
| | | return success(BeanUtils.toBean(list, HrmSocialSecurityConfigRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/get-effective") |
| | | @Operation(summary = "è·åçæç社ä¿å
¬ç§¯éé
ç½®") |
| | | @Parameter(name = "effectiveDate", description = "çææ¥æ", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:query')") |
| | | public CommonResult<HrmSocialSecurityConfigRespVO> getEffectiveSocialSecurityConfig( |
| | | @RequestParam("effectiveDate") LocalDate effectiveDate) { |
| | | HrmSocialSecurityConfigDO config = socialSecurityConfigService.getEffectiveSocialSecurityConfig(effectiveDate); |
| | | return success(BeanUtils.toBean(config, HrmSocialSecurityConfigRespVO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSocialSecuritySchemeRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSocialSecuritySchemeSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSocialSecuritySchemeDO; |
| | | import cn.iocoder.yudao.module.hrm.service.salary.HrmSocialSecuritySchemeService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM 社ä¿å
¬ç§¯éæ¹æ¡") |
| | | @RestController |
| | | @RequestMapping("/hrm/salary/social-security-scheme") |
| | | @Validated |
| | | public class HrmSocialSecuritySchemeController { |
| | | |
| | | @Resource |
| | | private HrmSocialSecuritySchemeService schemeService; |
| | | |
| | | @PostMapping("/create") |
| | | @Operation(summary = "å建社ä¿å
¬ç§¯éæ¹æ¡") |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:create')") |
| | | public CommonResult<Long> createScheme(@Valid @RequestBody HrmSocialSecuritySchemeSaveReqVO createReqVO) { |
| | | HrmSocialSecuritySchemeDO scheme = BeanUtils.toBean(createReqVO, HrmSocialSecuritySchemeDO.class); |
| | | return success(schemeService.createScheme(scheme)); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°ç¤¾ä¿å
¬ç§¯éæ¹æ¡") |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:update')") |
| | | public CommonResult<Boolean> updateScheme(@Valid @RequestBody HrmSocialSecuritySchemeSaveReqVO updateReqVO) { |
| | | HrmSocialSecuritySchemeDO scheme = BeanUtils.toBean(updateReqVO, HrmSocialSecuritySchemeDO.class); |
| | | schemeService.updateScheme(scheme); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ç¤¾ä¿å
¬ç§¯éæ¹æ¡") |
| | | @Parameter(name = "id", description = "æ¹æ¡ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:delete')") |
| | | public CommonResult<Boolean> deleteScheme(@RequestParam("id") Long id) { |
| | | schemeService.deleteScheme(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å社ä¿å
¬ç§¯éæ¹æ¡") |
| | | @Parameter(name = "id", description = "æ¹æ¡ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:query')") |
| | | public CommonResult<HrmSocialSecuritySchemeRespVO> getScheme(@RequestParam("id") Long id) { |
| | | HrmSocialSecuritySchemeDO scheme = schemeService.getScheme(id); |
| | | return success(BeanUtils.toBean(scheme, HrmSocialSecuritySchemeRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·å社ä¿å
¬ç§¯éæ¹æ¡å表") |
| | | @Parameter(name = "status", description = "ç¶æ") |
| | | @PreAuthorize("@ss.hasPermission('hrm:social-security:query')") |
| | | public CommonResult<List<HrmSocialSecuritySchemeRespVO>> getSchemeList( |
| | | @RequestParam(value = "status", required = false) Integer status) { |
| | | List<HrmSocialSecuritySchemeDO> list = schemeService.getSchemeList(status); |
| | | return success(BeanUtils.toBean(list, HrmSocialSecuritySchemeRespVO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmTaxRateConfigRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmTaxRateConfigSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmTaxRateConfigDO; |
| | | import cn.iocoder.yudao.module.hrm.service.salary.HrmTaxRateConfigService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | |
| | | @Tag(name = "管çåå° - HRM 个ç¨ç¨çé
ç½®") |
| | | @RestController |
| | | @RequestMapping("/hrm/salary/tax-rate-config") |
| | | @Validated |
| | | public class HrmTaxRateConfigController { |
| | | |
| | | @Resource |
| | | private HrmTaxRateConfigService taxRateConfigService; |
| | | |
| | | @PostMapping("/create-list") |
| | | @Operation(summary = "æ¹éå建个ç¨ç¨çé
ç½®ï¼ä¸ä¸ªç¨ç表å
å«7个档ä½ï¼") |
| | | @PreAuthorize("@ss.hasPermission('hrm:tax-rate:create')") |
| | | public CommonResult<Boolean> createTaxRateConfigList(@Valid @RequestBody List<HrmTaxRateConfigSaveReqVO> createReqVOList) { |
| | | List<HrmTaxRateConfigDO> configList = BeanUtils.toBean(createReqVOList, HrmTaxRateConfigDO.class); |
| | | taxRateConfigService.createTaxRateConfigList(configList); |
| | | return success(true); |
| | | } |
| | | |
| | | @PutMapping("/update") |
| | | @Operation(summary = "æ´æ°ä¸ªç¨ç¨çé
ç½®") |
| | | @PreAuthorize("@ss.hasPermission('hrm:tax-rate:update')") |
| | | public CommonResult<Boolean> updateTaxRateConfig(@Valid @RequestBody HrmTaxRateConfigSaveReqVO updateReqVO) { |
| | | HrmTaxRateConfigDO config = BeanUtils.toBean(updateReqVO, HrmTaxRateConfigDO.class); |
| | | taxRateConfigService.updateTaxRateConfig(config); |
| | | return success(true); |
| | | } |
| | | |
| | | @DeleteMapping("/delete") |
| | | @Operation(summary = "å é¤ä¸ªç¨ç¨çé
ç½®") |
| | | @Parameter(name = "id", description = "é
ç½®ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:tax-rate:delete')") |
| | | public CommonResult<Boolean> deleteTaxRateConfig(@RequestParam("id") Long id) { |
| | | taxRateConfigService.deleteTaxRateConfig(id); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/get") |
| | | @Operation(summary = "è·å个ç¨ç¨çé
ç½®") |
| | | @Parameter(name = "id", description = "é
ç½®ID", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:tax-rate:query')") |
| | | public CommonResult<HrmTaxRateConfigRespVO> getTaxRateConfig(@RequestParam("id") Long id) { |
| | | HrmTaxRateConfigDO config = taxRateConfigService.getTaxRateConfig(id); |
| | | return success(BeanUtils.toBean(config, HrmTaxRateConfigRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "è·å个ç¨ç¨çé
ç½®å表") |
| | | @PreAuthorize("@ss.hasPermission('hrm:tax-rate:query')") |
| | | public CommonResult<List<HrmTaxRateConfigRespVO>> getTaxRateConfigList() { |
| | | List<HrmTaxRateConfigDO> list = taxRateConfigService.getTaxRateConfigList(); |
| | | return success(BeanUtils.toBean(list, HrmTaxRateConfigRespVO.class)); |
| | | } |
| | | |
| | | @GetMapping("/get-effective") |
| | | @Operation(summary = "è·åçæç个ç¨ç¨çé
ç½®åè¡¨ï¼æçº§æ°æåºï¼") |
| | | @Parameter(name = "effectiveDate", description = "çææ¥æ", required = true) |
| | | @PreAuthorize("@ss.hasPermission('hrm:tax-rate:query')") |
| | | public CommonResult<List<HrmTaxRateConfigRespVO>> getEffectiveTaxRateConfigList( |
| | | @RequestParam("effectiveDate") LocalDate effectiveDate) { |
| | | List<HrmTaxRateConfigDO> list = taxRateConfigService.getEffectiveTaxRateConfigList(effectiveDate); |
| | | return success(BeanUtils.toBean(list, HrmTaxRateConfigRespVO.class)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - å工社ä¿å
¬ç§¯éæ¡£æ¡å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class HrmEmployeeSocialSecurityPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åå·¥ID", example = "100") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "åå·¥å§å", example = "å¼ ä¸") |
| | | private String userName; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "104") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "çææ¥æ") |
| | | private LocalDate effectiveDate; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - å工社ä¿å
¬ç§¯éæ¡£æ¡ Response VO") |
| | | @Data |
| | | public class HrmEmployeeSocialSecurityRespVO { |
| | | |
| | | @Schema(description = "æ¡£æ¡ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³»ç»ç¨æ·IDï¼å
³è system_users.idï¼", example = "100") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "åå·¥å§å", example = "å¼ ä¸") |
| | | private String userName; |
| | | |
| | | @Schema(description = "é¨é¨åç§°", example = "ç åé¨") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "社ä¿å
¬ç§¯éæ¹æ¡ID", example = "1") |
| | | private Long socialSecuritySchemeId; |
| | | |
| | | @Schema(description = "社ä¿å
¬ç§¯éæ¹æ¡åç§°", example = "2024å¹´åé叿 å") |
| | | private String schemeName; |
| | | |
| | | // ========== ç¼´çº³åºæ°ï¼å工个æ§åè®¾ç½®ï¼ ========== |
| | | @Schema(description = "社ä¿ç¼´çº³åºæ°", example = "10000") |
| | | private BigDecimal socialSecurityBase; |
| | | |
| | | @Schema(description = "å
¬ç§¯éç¼´çº³åºæ°", example = "10000") |
| | | private BigDecimal housingFundBase; |
| | | |
| | | // ========== çæä¿¡æ¯ ========== |
| | | @Schema(description = "çææ¥æ") |
| | | private LocalDate effectiveDate; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "2026å¹´è°æ´ç¤¾ä¿åºæ°") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - å工社ä¿å
¬ç§¯éæ¡£æ¡æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmEmployeeSocialSecuritySaveReqVO { |
| | | |
| | | @Schema(description = "æ¡£æ¡ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³»ç»ç¨æ·IDï¼å
³è system_users.idï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") |
| | | @NotNull(message = "ç³»ç»ç¨æ·IDä¸è½ä¸ºç©º") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "社ä¿å
¬ç§¯éæ¹æ¡ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "社ä¿å
¬ç§¯éæ¹æ¡ä¸è½ä¸ºç©º") |
| | | private Long socialSecuritySchemeId; |
| | | |
| | | // ========== ç¼´çº³åºæ°ï¼å工个æ§åè®¾ç½®ï¼ ========== |
| | | @Schema(description = "社ä¿ç¼´çº³åºæ°", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000") |
| | | @NotNull(message = "社ä¿ç¼´çº³åºæ°ä¸è½ä¸ºç©º") |
| | | private BigDecimal socialSecurityBase; |
| | | |
| | | @Schema(description = "å
¬ç§¯éç¼´çº³åºæ°", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000") |
| | | @NotNull(message = "å
¬ç§¯éç¼´çº³åºæ°ä¸è½ä¸ºç©º") |
| | | private BigDecimal housingFundBase; |
| | | |
| | | // ========== çæä¿¡æ¯ ========== |
| | | @Schema(description = "çææ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "çææ¥æä¸è½ä¸ºç©º") |
| | | private LocalDate effectiveDate; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "2026å¹´è°æ´ç¤¾ä¿åºæ°") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "管çåå° - 请åç±»åæ£æ¬¾é
ç½® Response VO") |
| | | @Data |
| | | public class HrmLeaveTypeConfigRespVO { |
| | | |
| | | @Schema(description = "主é®") |
| | | private Long id; |
| | | |
| | | @Schema(description = "请åç±»åï¼1-äºå, 2-ç
å, 3-å¹´å, 4-å©å, 5-产å, 6-丧å") |
| | | private Integer leaveType; |
| | | |
| | | @Schema(description = "ç±»ååç§°") |
| | | private String name; |
| | | |
| | | @Schema(description = "æ£æ¬¾æ¯ä¾ï¼0-1ä¹é´ï¼") |
| | | private BigDecimal deductionRatio; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨, 1-ç¦ç¨") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Schema(description = "管çåå° - 请åç±»åæ£æ¬¾é
ç½®æ´æ° Request VO") |
| | | @Data |
| | | public class HrmLeaveTypeConfigSaveReqVO { |
| | | |
| | | @Schema(description = "主é®", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "主é®ä¸è½ä¸ºç©º") |
| | | private Long id; |
| | | |
| | | @Schema(description = "æ£æ¬¾æ¯ä¾ï¼0-1ä¹é´ï¼", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "æ£æ¬¾æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal deductionRatio; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨, 1-ç¦ç¨") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - èªé
¬æ ¸ç®å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmSalaryCalculationPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "æ ¸ç®åå·", example = "SC202401001") |
| | | private String no; |
| | | |
| | | @Schema(description = "æ ¸ç®å¨æ", example = "2024-01") |
| | | private String period; |
| | | |
| | | @Schema(description = "åå·¥ID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "1") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - èªé
¬æ ¸ç® Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmSalaryCalculationRespVO { |
| | | |
| | | @Schema(description = "æ ¸ç®ID") |
| | | @ExcelProperty("æ ¸ç®ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "æ ¸ç®åå·") |
| | | @ExcelProperty("æ ¸ç®åå·") |
| | | private String no; |
| | | |
| | | @Schema(description = "æ ¸ç®å¨æ") |
| | | @ExcelProperty("æ ¸ç®å¨æ") |
| | | private String period; |
| | | |
| | | @Schema(description = "åå·¥ID") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "åå·¥å§å") |
| | | @ExcelProperty("åå·¥å§å") |
| | | private String userName; |
| | | |
| | | @Schema(description = "é¨é¨ID") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "é¨é¨åç§°") |
| | | @ExcelProperty("é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "åºæ¬å·¥èµ") |
| | | @ExcelProperty("åºæ¬å·¥èµ") |
| | | private BigDecimal baseSalary; |
| | | |
| | | @Schema(description = "绩æå·¥èµ") |
| | | @ExcelProperty("绩æå·¥èµ") |
| | | private BigDecimal performanceSalary; |
| | | |
| | | @Schema(description = "å çå·¥èµ") |
| | | @ExcelProperty("å çå·¥èµ") |
| | | private BigDecimal overtimePay; |
| | | |
| | | @Schema(description = "é¤è¡¥") |
| | | @ExcelProperty("é¤è¡¥") |
| | | private BigDecimal mealAllowance; |
| | | |
| | | @Schema(description = "交é补贴") |
| | | @ExcelProperty("交é补贴") |
| | | private BigDecimal transportAllowance; |
| | | |
| | | @Schema(description = "å
¶ä»è¡¥è´´") |
| | | @ExcelProperty("å
¶ä»è¡¥è´´") |
| | | private BigDecimal otherAllowance; |
| | | |
| | | @Schema(description = "ç¤¾ä¿æ£é¤") |
| | | @ExcelProperty("ç¤¾ä¿æ£é¤") |
| | | private BigDecimal socialSecurityDeduction; |
| | | |
| | | @Schema(description = "å
¬ç§¯éæ£é¤") |
| | | @ExcelProperty("å
¬ç§¯éæ£é¤") |
| | | private BigDecimal housingFundDeduction; |
| | | |
| | | @Schema(description = "ä¸ªç¨æ£é¤") |
| | | @ExcelProperty("ä¸ªç¨æ£é¤") |
| | | private BigDecimal taxDeduction; |
| | | |
| | | @Schema(description = "å
¶ä»æ£é¤") |
| | | @ExcelProperty("å
¶ä»æ£é¤") |
| | | private BigDecimal otherDeduction; |
| | | |
| | | @Schema(description = "è¯·åæ£æ¬¾") |
| | | @ExcelProperty("è¯·åæ£æ¬¾") |
| | | private BigDecimal leaveDeduction; |
| | | |
| | | @Schema(description = "å®åå·¥èµ") |
| | | @ExcelProperty("å®åå·¥èµ") |
| | | private BigDecimal actualSalary; |
| | | |
| | | @Schema(description = "åºå¤å¤©æ°") |
| | | @ExcelProperty("åºå¤å¤©æ°") |
| | | private Integer workDays; |
| | | |
| | | @Schema(description = "å çæ¶é¿") |
| | | @ExcelProperty("å çæ¶é¿") |
| | | private BigDecimal overtimeHours; |
| | | |
| | | @Schema(description = "ç¶æ") |
| | | @ExcelProperty(value = "ç¶æ", converter = DictConvert.class) |
| | | @DictFormat("hrm_salary_calculation_status") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "确认æ¶é´") |
| | | @ExcelProperty("确认æ¶é´") |
| | | private LocalDateTime confirmTime; |
| | | |
| | | @Schema(description = "åæ¾æ¶é´") |
| | | @ExcelProperty("åæ¾æ¶é´") |
| | | private LocalDateTime paymentTime; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.Valid; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | @Schema(description = "管çåå° - èªé
¬æ ¸ç®ä¿å Request VO") |
| | | @Data |
| | | public class HrmSalaryCalculationSaveReqVO { |
| | | |
| | | @Schema(description = "æ ¸ç®å¨æ", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-01") |
| | | @NotNull(message = "æ ¸ç®å¨æä¸è½ä¸ºç©º") |
| | | private String period; |
| | | |
| | | @Schema(description = "èªé
¬æ ¸ç®å表", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotEmpty(message = "èªé
¬æ ¸ç®å表ä¸è½ä¸ºç©º") |
| | | @Valid |
| | | private List<CalculationItem> list; |
| | | |
| | | @Schema(description = "èªé
¬æ ¸ç®é¡¹") |
| | | @Data |
| | | public static class CalculationItem { |
| | | |
| | | @Schema(description = "æ ¸ç®IDï¼æ°å¢æ¶ä¸ä¼ ï¼ä¿®æ¹æ¶å¿
ä¼ ï¼") |
| | | private Long id; |
| | | |
| | | @Schema(description = "ç³»ç»ç¨æ·ID", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "åå·¥ä¸è½ä¸ºç©º") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "é¨é¨ID", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "é¨é¨ä¸è½ä¸ºç©º") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "åºæ¬å·¥èµ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "åºæ¬å·¥èµä¸è½ä¸ºç©º") |
| | | private BigDecimal baseSalary; |
| | | |
| | | @Schema(description = "绩æå·¥èµ") |
| | | private BigDecimal performanceSalary; |
| | | |
| | | @Schema(description = "å çå·¥èµ") |
| | | private BigDecimal overtimePay; |
| | | |
| | | @Schema(description = "é¤è¡¥") |
| | | private BigDecimal mealAllowance; |
| | | |
| | | @Schema(description = "交é补贴") |
| | | private BigDecimal transportAllowance; |
| | | |
| | | @Schema(description = "å
¶ä»è¡¥è´´") |
| | | private BigDecimal otherAllowance; |
| | | |
| | | @Schema(description = "ç¤¾ä¿æ£é¤") |
| | | private BigDecimal socialSecurityDeduction; |
| | | |
| | | @Schema(description = "å
¬ç§¯éæ£é¤") |
| | | private BigDecimal housingFundDeduction; |
| | | |
| | | @Schema(description = "ä¸ªç¨æ£é¤") |
| | | private BigDecimal taxDeduction; |
| | | |
| | | @Schema(description = "å
¶ä»æ£é¤") |
| | | private BigDecimal otherDeduction; |
| | | |
| | | @Schema(description = "å®åå·¥èµ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "å®åå·¥èµä¸è½ä¸ºç©º") |
| | | private BigDecimal actualSalary; |
| | | |
| | | @Schema(description = "åºå¤å¤©æ°") |
| | | private Integer workDays; |
| | | |
| | | @Schema(description = "å çæ¶é¿") |
| | | private BigDecimal overtimeHours; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - èªèµåæ¾æç»å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmSalaryPaymentDetailPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åæ¾å°è´¦ID", example = "1") |
| | | private Long paymentId; |
| | | |
| | | @Schema(description = "åå·¥ID", example = "1") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "é¨é¨ID", example = "103") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "åæ¾ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - èªèµåæ¾æç» Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmSalaryPaymentDetailRespVO { |
| | | |
| | | @Schema(description = "主é®") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åæ¾å°è´¦ID") |
| | | private Long paymentId; |
| | | |
| | | @Schema(description = "èªé
¬æ ¸ç®ID") |
| | | private Long calculationId; |
| | | |
| | | @Schema(description = "åå·¥ID") |
| | | private Long userId; |
| | | |
| | | @Schema(description = "åå·¥å§å") |
| | | @ExcelProperty("åå·¥å§å") |
| | | private String userName; |
| | | |
| | | @Schema(description = "é¨é¨ID") |
| | | private Long deptId; |
| | | |
| | | @Schema(description = "é¨é¨åç§°") |
| | | @ExcelProperty("é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "å®åå·¥èµ") |
| | | @ExcelProperty("å®åå·¥èµ") |
| | | private BigDecimal actualSalary; |
| | | |
| | | @Schema(description = "åæ¾ç¶æ") |
| | | @ExcelProperty(value = "åæ¾ç¶æ", converter = DictConvert.class) |
| | | @DictFormat("hrm_payment_detail_status") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "åæ¾æ¶é´") |
| | | @ExcelProperty("åæ¾æ¶é´") |
| | | private LocalDateTime paymentTime; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import lombok.ToString; |
| | | |
| | | @Schema(description = "管çåå° - èªèµåæ¾å页 Request VO") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | public class HrmSalaryPaymentPageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "åæ¾åå·", example = "SF202401001") |
| | | private String no; |
| | | |
| | | @Schema(description = "忾卿", example = "2024-01") |
| | | private String period; |
| | | |
| | | @Schema(description = "ç¶æ", example = "0") |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelIgnoreUnannotated; |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - èªèµåæ¾ Response VO") |
| | | @Data |
| | | @ExcelIgnoreUnannotated |
| | | public class HrmSalaryPaymentRespVO { |
| | | |
| | | @Schema(description = "åæ¾ID") |
| | | @ExcelProperty("åæ¾ID") |
| | | private Long id; |
| | | |
| | | @Schema(description = "åæ¾åå·") |
| | | @ExcelProperty("åæ¾åå·") |
| | | private String no; |
| | | |
| | | @Schema(description = "忾卿") |
| | | @ExcelProperty("忾卿") |
| | | private String period; |
| | | |
| | | @Schema(description = "åæ¾æ»éé¢") |
| | | @ExcelProperty("åæ¾æ»éé¢") |
| | | private BigDecimal totalAmount; |
| | | |
| | | @Schema(description = "åæ¾äººæ°") |
| | | @ExcelProperty("åæ¾äººæ°") |
| | | private Integer totalCount; |
| | | |
| | | @Schema(description = "åæ¾æ¹å¼") |
| | | @ExcelProperty(value = "åæ¾æ¹å¼", converter = DictConvert.class) |
| | | @DictFormat("hrm_payment_method") |
| | | private Integer paymentMethod; |
| | | |
| | | @Schema(description = "åæ¾æ¶é´") |
| | | @ExcelProperty("åæ¾æ¶é´") |
| | | private LocalDateTime paymentTime; |
| | | |
| | | @Schema(description = "ç¶æ") |
| | | @ExcelProperty(value = "ç¶æ", converter = DictConvert.class) |
| | | @DictFormat("hrm_payment_status") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "é¶è¡ååéä»¶") |
| | | private String fileUrl; |
| | | |
| | | @Schema(description = "夿³¨") |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @ExcelProperty("å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - 社ä¿å
¬ç§¯éé
ç½® Response VO") |
| | | @Data |
| | | public class HrmSocialSecurityConfigRespVO { |
| | | |
| | | @Schema(description = "é
ç½®ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "é
ç½®åç§°", example = "2024年社ä¿å
¬ç§¯éæ å") |
| | | private String name; |
| | | |
| | | @Schema(description = "çææ¥æ") |
| | | private LocalDate effectiveDate; |
| | | |
| | | // ========== å
»èä¿é© ========== |
| | | @Schema(description = "å
»èä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.16") |
| | | private BigDecimal pensionCompanyRatio; |
| | | |
| | | @Schema(description = "å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾", example = "0.08") |
| | | private BigDecimal pensionPersonalRatio; |
| | | |
| | | // ========== å»çä¿é© ========== |
| | | @Schema(description = "å»çä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.095") |
| | | private BigDecimal medicalCompanyRatio; |
| | | |
| | | @Schema(description = "å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾", example = "0.02") |
| | | private BigDecimal medicalPersonalRatio; |
| | | |
| | | // ========== 失ä¸ä¿é© ========== |
| | | @Schema(description = "失ä¸ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal unemploymentCompanyRatio; |
| | | |
| | | @Schema(description = "失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal unemploymentPersonalRatio; |
| | | |
| | | // ========== 工伤ä¿é© ========== |
| | | @Schema(description = "工伤ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal workInjuryRatio; |
| | | |
| | | // ========== çè²ä¿é© ========== |
| | | @Schema(description = "çè²ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal maternityRatio; |
| | | |
| | | // ========== å
¬ç§¯é ========== |
| | | @Schema(description = "å
¬ç§¯éä¼ä¸ç¼´çº³æ¯ä¾", example = "0.12") |
| | | private BigDecimal housingFundCompanyRatio; |
| | | |
| | | @Schema(description = "å
¬ç§¯é个人缴纳æ¯ä¾", example = "0.12") |
| | | private BigDecimal housingFundPersonalRatio; |
| | | |
| | | // ========== åºæ°ä¸ä¸é ========== |
| | | @Schema(description = "社ä¿åºæ°ä¸é", example = "4494") |
| | | private BigDecimal socialSecurityBaseMin; |
| | | |
| | | @Schema(description = "社ä¿åºæ°ä¸é", example = "28017") |
| | | private BigDecimal socialSecurityBaseMax; |
| | | |
| | | @Schema(description = "å
¬ç§¯éåºæ°ä¸é", example = "2420") |
| | | private BigDecimal housingFundBaseMin; |
| | | |
| | | @Schema(description = "å
¬ç§¯éåºæ°ä¸é", example = "35091") |
| | | private BigDecimal housingFundBaseMax; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "2024å¹´åéå¸ç¤¾ä¿å
¬ç§¯é缴纳æ å") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - 社ä¿å
¬ç§¯éé
ç½®æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmSocialSecurityConfigSaveReqVO { |
| | | |
| | | @Schema(description = "é
ç½®ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "é
ç½®åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024年社ä¿å
¬ç§¯éæ å") |
| | | @NotBlank(message = "é
ç½®åç§°ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "çææ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "çææ¥æä¸è½ä¸ºç©º") |
| | | private LocalDate effectiveDate; |
| | | |
| | | // ========== å
»èä¿é© ========== |
| | | @Schema(description = "å
»èä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.16") |
| | | @NotNull(message = "å
»èä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal pensionCompanyRatio; |
| | | |
| | | @Schema(description = "å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.08") |
| | | @NotNull(message = "å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal pensionPersonalRatio; |
| | | |
| | | // ========== å»çä¿é© ========== |
| | | @Schema(description = "å»çä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.095") |
| | | @NotNull(message = "å»çä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal medicalCompanyRatio; |
| | | |
| | | @Schema(description = "å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.02") |
| | | @NotNull(message = "å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal medicalPersonalRatio; |
| | | |
| | | // ========== 失ä¸ä¿é© ========== |
| | | @Schema(description = "失ä¸ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.005") |
| | | @NotNull(message = "失ä¸ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal unemploymentCompanyRatio; |
| | | |
| | | @Schema(description = "失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.005") |
| | | @NotNull(message = "失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal unemploymentPersonalRatio; |
| | | |
| | | // ========== 工伤ä¿é© ========== |
| | | @Schema(description = "工伤ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.005") |
| | | @NotNull(message = "工伤ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal workInjuryRatio; |
| | | |
| | | // ========== çè²ä¿é© ========== |
| | | @Schema(description = "çè²ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.005") |
| | | @NotNull(message = "çè²ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal maternityRatio; |
| | | |
| | | // ========== å
¬ç§¯é ========== |
| | | @Schema(description = "å
¬ç§¯éä¼ä¸ç¼´çº³æ¯ä¾", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.12") |
| | | @NotNull(message = "å
¬ç§¯éä¼ä¸ç¼´çº³æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal housingFundCompanyRatio; |
| | | |
| | | @Schema(description = "å
¬ç§¯é个人缴纳æ¯ä¾", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.12") |
| | | @NotNull(message = "å
¬ç§¯é个人缴纳æ¯ä¾ä¸è½ä¸ºç©º") |
| | | private BigDecimal housingFundPersonalRatio; |
| | | |
| | | // ========== åºæ°ä¸ä¸é ========== |
| | | @Schema(description = "社ä¿åºæ°ä¸é", requiredMode = Schema.RequiredMode.REQUIRED, example = "4494") |
| | | @NotNull(message = "社ä¿åºæ°ä¸éä¸è½ä¸ºç©º") |
| | | private BigDecimal socialSecurityBaseMin; |
| | | |
| | | @Schema(description = "社ä¿åºæ°ä¸é", requiredMode = Schema.RequiredMode.REQUIRED, example = "28017") |
| | | @NotNull(message = "社ä¿åºæ°ä¸éä¸è½ä¸ºç©º") |
| | | private BigDecimal socialSecurityBaseMax; |
| | | |
| | | @Schema(description = "å
¬ç§¯éåºæ°ä¸é", requiredMode = Schema.RequiredMode.REQUIRED, example = "2420") |
| | | @NotNull(message = "å
¬ç§¯éåºæ°ä¸éä¸è½ä¸ºç©º") |
| | | private BigDecimal housingFundBaseMin; |
| | | |
| | | @Schema(description = "å
¬ç§¯éåºæ°ä¸é", requiredMode = Schema.RequiredMode.REQUIRED, example = "35091") |
| | | @NotNull(message = "å
¬ç§¯éåºæ°ä¸éä¸è½ä¸ºç©º") |
| | | private BigDecimal housingFundBaseMax; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "2024å¹´åéå¸ç¤¾ä¿å
¬ç§¯é缴纳æ å") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - 社ä¿å
¬ç§¯éæ¹æ¡ Response VO") |
| | | @Data |
| | | public class HrmSocialSecuritySchemeRespVO { |
| | | |
| | | @Schema(description = "æ¹æ¡ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "æ¹æ¡åç§°", example = "2024å¹´åé叿 å") |
| | | private String name; |
| | | |
| | | @Schema(description = "çææ¥æ") |
| | | private LocalDate effectiveDate; |
| | | |
| | | // ========== å
»èä¿é©æ¯ä¾ ========== |
| | | @Schema(description = "å
»èä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.16") |
| | | private BigDecimal pensionCompanyRatio; |
| | | |
| | | @Schema(description = "å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾", example = "0.08") |
| | | private BigDecimal pensionPersonalRatio; |
| | | |
| | | // ========== å»çä¿é©æ¯ä¾ ========== |
| | | @Schema(description = "å»çä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.095") |
| | | private BigDecimal medicalCompanyRatio; |
| | | |
| | | @Schema(description = "å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾", example = "0.02") |
| | | private BigDecimal medicalPersonalRatio; |
| | | |
| | | // ========== 失ä¸ä¿é©æ¯ä¾ ========== |
| | | @Schema(description = "失ä¸ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal unemploymentCompanyRatio; |
| | | |
| | | @Schema(description = "失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal unemploymentPersonalRatio; |
| | | |
| | | // ========== 工伤ä¿é©æ¯ä¾ ========== |
| | | @Schema(description = "工伤ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal workInjuryRatio; |
| | | |
| | | // ========== çè²ä¿é©æ¯ä¾ ========== |
| | | @Schema(description = "çè²ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal maternityRatio; |
| | | |
| | | // ========== å
¬ç§¯éæ¯ä¾ ========== |
| | | @Schema(description = "å
¬ç§¯éä¼ä¸ç¼´çº³æ¯ä¾", example = "0.12") |
| | | private BigDecimal housingFundCompanyRatio; |
| | | |
| | | @Schema(description = "å
¬ç§¯é个人缴纳æ¯ä¾", example = "0.12") |
| | | private BigDecimal housingFundPersonalRatio; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "2024å¹´åéå¸ç¤¾ä¿å
¬ç§¯é缴纳æ å") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - 社ä¿å
¬ç§¯éæ¹æ¡æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmSocialSecuritySchemeSaveReqVO { |
| | | |
| | | @Schema(description = "æ¹æ¡ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "æ¹æ¡åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024å¹´åé叿 å") |
| | | @NotBlank(message = "æ¹æ¡åç§°ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "çææ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "çææ¥æä¸è½ä¸ºç©º") |
| | | private LocalDate effectiveDate; |
| | | |
| | | // ========== å
»èä¿é©æ¯ä¾ ========== |
| | | @Schema(description = "å
»èä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.16") |
| | | private BigDecimal pensionCompanyRatio; |
| | | |
| | | @Schema(description = "å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾", example = "0.08") |
| | | private BigDecimal pensionPersonalRatio; |
| | | |
| | | // ========== å»çä¿é©æ¯ä¾ ========== |
| | | @Schema(description = "å»çä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.095") |
| | | private BigDecimal medicalCompanyRatio; |
| | | |
| | | @Schema(description = "å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾", example = "0.02") |
| | | private BigDecimal medicalPersonalRatio; |
| | | |
| | | // ========== 失ä¸ä¿é©æ¯ä¾ ========== |
| | | @Schema(description = "失ä¸ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal unemploymentCompanyRatio; |
| | | |
| | | @Schema(description = "失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal unemploymentPersonalRatio; |
| | | |
| | | // ========== 工伤ä¿é©æ¯ä¾ ========== |
| | | @Schema(description = "工伤ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal workInjuryRatio; |
| | | |
| | | // ========== çè²ä¿é©æ¯ä¾ ========== |
| | | @Schema(description = "çè²ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾", example = "0.005") |
| | | private BigDecimal maternityRatio; |
| | | |
| | | // ========== å
¬ç§¯éæ¯ä¾ ========== |
| | | @Schema(description = "å
¬ç§¯éä¼ä¸ç¼´çº³æ¯ä¾", example = "0.12") |
| | | private BigDecimal housingFundCompanyRatio; |
| | | |
| | | @Schema(description = "å
¬ç§¯é个人缴纳æ¯ä¾", example = "0.12") |
| | | private BigDecimal housingFundPersonalRatio; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "2024å¹´åéå¸ç¤¾ä¿å
¬ç§¯é缴纳æ å") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | @Schema(description = "管çåå° - 个ç¨ç¨çé
ç½® Response VO") |
| | | @Data |
| | | public class HrmTaxRateConfigRespVO { |
| | | |
| | | @Schema(description = "é
ç½®ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "é
ç½®åç§°", example = "2024年个ç¨ç¨ç表") |
| | | private String name; |
| | | |
| | | @Schema(description = "çææ¥æ") |
| | | private LocalDate effectiveDate; |
| | | |
| | | @Schema(description = "ç¨ç级æ°ï¼1-7", example = "1") |
| | | private Integer level; |
| | | |
| | | @Schema(description = "åºçº³ç¨æå¾é¢ä¸éï¼å«ï¼", example = "0") |
| | | private BigDecimal minAmount; |
| | | |
| | | @Schema(description = "åºçº³ç¨æå¾é¢ä¸éï¼ä¸å«ï¼ï¼0表示æ ä¸é", example = "36000") |
| | | private BigDecimal maxAmount; |
| | | |
| | | @Schema(description = "ç¨ç", example = "0.03") |
| | | private BigDecimal taxRate; |
| | | |
| | | @Schema(description = "éç®æ£é¤æ°", example = "0") |
| | | private BigDecimal quickDeduction; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "ä¸è¶
è¿36000å
") |
| | | private String remark; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | private LocalDateTime createTime; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.salary.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | @Schema(description = "管çåå° - 个ç¨ç¨çé
ç½®æ°å¢/ä¿®æ¹ Request VO") |
| | | @Data |
| | | public class HrmTaxRateConfigSaveReqVO { |
| | | |
| | | @Schema(description = "é
ç½®ID", example = "1") |
| | | private Long id; |
| | | |
| | | @Schema(description = "é
ç½®åç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024年个ç¨ç¨ç表") |
| | | @NotBlank(message = "é
ç½®åç§°ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "çææ¥æ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "çææ¥æä¸è½ä¸ºç©º") |
| | | private LocalDate effectiveDate; |
| | | |
| | | @Schema(description = "ç¨ç级æ°ï¼1-7", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| | | @NotNull(message = "ç¨ç级æ°ä¸è½ä¸ºç©º") |
| | | private Integer level; |
| | | |
| | | @Schema(description = "åºçº³ç¨æå¾é¢ä¸éï¼å«ï¼", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | @NotNull(message = "åºçº³ç¨æå¾é¢ä¸éä¸è½ä¸ºç©º") |
| | | private BigDecimal minAmount; |
| | | |
| | | @Schema(description = "åºçº³ç¨æå¾é¢ä¸éï¼ä¸å«ï¼ï¼0表示æ ä¸é", requiredMode = Schema.RequiredMode.REQUIRED, example = "36000") |
| | | @NotNull(message = "åºçº³ç¨æå¾é¢ä¸éä¸è½ä¸ºç©º") |
| | | private BigDecimal maxAmount; |
| | | |
| | | @Schema(description = "ç¨ç", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.03") |
| | | @NotNull(message = "ç¨çä¸è½ä¸ºç©º") |
| | | private BigDecimal taxRate; |
| | | |
| | | @Schema(description = "éç®æ£é¤æ°", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") |
| | | @NotNull(message = "éç®æ£é¤æ°ä¸è½ä¸ºç©º") |
| | | private BigDecimal quickDeduction; |
| | | |
| | | @Schema(description = "ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨", example = "0") |
| | | private Integer status; |
| | | |
| | | @Schema(description = "夿³¨", example = "ä¸è¶
è¿36000å
") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmLeaveTypeEnum; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * 请åç³è¯· DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_leave_application") |
| | | @KeySequence("hrm_leave_application_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmLeaveApplicationDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç³è¯·ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç³è¯·åå· |
| | | */ |
| | | private String no; |
| | | |
| | | /** |
| | | * ç³è¯·äººID |
| | | * |
| | | * å
³è AdminUserDO#getId() |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | * |
| | | * å
³è DeptDO#getId() |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * 请åç±»å |
| | | * |
| | | * æä¸¾ {@link HrmLeaveTypeEnum} |
| | | */ |
| | | private Integer leaveType; |
| | | |
| | | /** |
| | | * å¼å§æ¶é´ |
| | | */ |
| | | private LocalDateTime startTime; |
| | | |
| | | /** |
| | | * ç»ææ¶é´ |
| | | */ |
| | | private LocalDateTime endTime; |
| | | |
| | | /** |
| | | * è¯·åæ¶é¿ï¼å¤©ï¼ |
| | | */ |
| | | private BigDecimal duration; |
| | | |
| | | /** |
| | | * 请ååå |
| | | */ |
| | | private String reason; |
| | | |
| | | /** |
| | | * 审æ¹ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * BPM æµç¨å®ä¾ID |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | /** |
| | | * 审æ¹å®ææ¶é´ |
| | | */ |
| | | private LocalDateTime approveTime; |
| | | |
| | | /** |
| | | * éä»¶å°å |
| | | */ |
| | | private String fileUrl; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmResignationTypeEnum; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * 离èç³è¯· DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_resignation_application") |
| | | @KeySequence("hrm_resignation_application_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmResignationApplicationDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç³è¯·ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç³è¯·åå· |
| | | */ |
| | | private String no; |
| | | |
| | | /** |
| | | * ç³è¯·äººID |
| | | * |
| | | * å
³è AdminUserDO#getId() |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | * |
| | | * å
³è DeptDO#getId() |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * 离èç±»å |
| | | * |
| | | * æä¸¾ {@link HrmResignationTypeEnum} |
| | | */ |
| | | private Integer resignationType; |
| | | |
| | | /** |
| | | * é¢è®¡ç¦»èæ¥æ |
| | | */ |
| | | private LocalDate expectedDate; |
| | | |
| | | /** |
| | | * å®é
ç¦»èæ¥æ |
| | | */ |
| | | private LocalDate actualDate; |
| | | |
| | | /** |
| | | * 离èåå |
| | | */ |
| | | private String reason; |
| | | |
| | | /** |
| | | * 交æ¥äººID |
| | | * |
| | | * å
³è AdminUserDO#getId() |
| | | */ |
| | | private Long handoverUserId; |
| | | |
| | | /** |
| | | * 交æ¥ç¶æ |
| | | * |
| | | * 0-æªå¼å§ï¼10-è¿è¡ä¸ï¼20-已宿 |
| | | */ |
| | | private Integer handoverStatus; |
| | | |
| | | /** |
| | | * 交æ¥è¯´æ |
| | | */ |
| | | private String handoverRemark; |
| | | |
| | | /** |
| | | * 审æ¹ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * BPM æµç¨å®ä¾ID |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | /** |
| | | * 审æ¹å®ææ¶é´ |
| | | */ |
| | | private java.time.LocalDateTime approveTime; |
| | | |
| | | /** |
| | | * éä»¶å°å |
| | | */ |
| | | private String fileUrl; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmTransferTypeEnum; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * è°å²ç³è¯· DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_transfer_application") |
| | | @KeySequence("hrm_transfer_application_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmTransferApplicationDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç³è¯·ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç³è¯·åå· |
| | | */ |
| | | private String no; |
| | | |
| | | /** |
| | | * ç³è¯·äººID |
| | | * |
| | | * å
³è AdminUserDO#getId() |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * åé¨é¨ID |
| | | * |
| | | * å
³è DeptDO#getId() |
| | | */ |
| | | private Long currentDeptId; |
| | | |
| | | /** |
| | | * åå²ä½ID |
| | | * |
| | | * å
³è PostDO#getId() |
| | | */ |
| | | private Long currentPostId; |
| | | |
| | | /** |
| | | * ç®æ é¨é¨ID |
| | | * |
| | | * å
³è DeptDO#getId() |
| | | */ |
| | | private Long targetDeptId; |
| | | |
| | | /** |
| | | * ç®æ å²ä½ID |
| | | * |
| | | * å
³è PostDO#getId() |
| | | */ |
| | | private Long targetPostId; |
| | | |
| | | /** |
| | | * è°å²ç±»å |
| | | * |
| | | * æä¸¾ {@link HrmTransferTypeEnum} |
| | | */ |
| | | private Integer transferType; |
| | | |
| | | /** |
| | | * çææ¥æ |
| | | */ |
| | | private LocalDate effectiveDate; |
| | | |
| | | /** |
| | | * è°å²åå |
| | | */ |
| | | private String reason; |
| | | |
| | | /** |
| | | * 审æ¹ç¶æ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum} |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * BPM æµç¨å®ä¾ID |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | /** |
| | | * 审æ¹å®ææ¶é´ |
| | | */ |
| | | private java.time.LocalDateTime approveTime; |
| | | |
| | | /** |
| | | * éä»¶å°å |
| | | */ |
| | | private String fileUrl; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * èå¤å¼å¸¸ç³è¯· DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_attendance_exception") |
| | | @KeySequence("hrm_attendance_exception_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmAttendanceExceptionDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç³è¯·ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç³è¯·åå· |
| | | */ |
| | | private String no; |
| | | |
| | | /** |
| | | * ç³è¯·äººIDï¼åå·¥IDï¼ |
| | | * |
| | | * å
³è HrmEmployeeDO#getId() |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * å¼å¸¸ç±»åï¼1-è¡¥å¡ï¼2-å çï¼3-åºå·® |
| | | */ |
| | | private Integer type; |
| | | |
| | | /** |
| | | * å¼å¸¸æ¥æ |
| | | */ |
| | | private LocalDate exceptionDate; |
| | | |
| | | /** |
| | | * å¼å¸¸æ¶é´ç¹ |
| | | */ |
| | | private LocalDateTime exceptionTime; |
| | | |
| | | /** |
| | | * ç³è¯·åå |
| | | */ |
| | | private String reason; |
| | | |
| | | /** |
| | | * ç¶æï¼0-è稿ï¼10-审æ¹ä¸ï¼20-éè¿ï¼30-驳åï¼40-æ¤é |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * BPMæµç¨å®ä¾ID |
| | | */ |
| | | private String processInstanceId; |
| | | |
| | | /** |
| | | * 审æ¹å®ææ¶é´ |
| | | */ |
| | | private LocalDateTime approveTime; |
| | | |
| | | /** |
| | | * éä»¶å°å |
| | | */ |
| | | private String fileUrl; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * èå¤è忥é
ç½® DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_attendance_holiday") |
| | | @KeySequence("hrm_attendance_holiday_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmAttendanceHolidayDO extends BaseDO { |
| | | |
| | | /** |
| | | * è忥ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * è忥åç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * æ¥æ |
| | | */ |
| | | private LocalDate date; |
| | | |
| | | /** |
| | | * ç±»åï¼1-伿¯æ¥ï¼2-工使¥ |
| | | * |
| | | * æä¸¾ {@link cn.iocoder.yudao.module.hrm.enums.HrmAttendanceHolidayTypeEnum} |
| | | */ |
| | | private Integer type; |
| | | |
| | | /** |
| | | * æ¯å¦æ³å®è忥ï¼0-å¦ï¼1-æ¯ |
| | | */ |
| | | private Integer isLegal; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * è夿å¡è®°å½ DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_attendance_record") |
| | | @KeySequence("hrm_attendance_record_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmAttendanceRecordDO extends BaseDO { |
| | | |
| | | /** |
| | | * è®°å½ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åå·¥ID |
| | | * |
| | | * å
³è HrmEmployeeDO#getId() |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * è夿¥æ |
| | | */ |
| | | private LocalDate date; |
| | | |
| | | /** |
| | | * ä¸çæå¡æ¶é´ |
| | | */ |
| | | private LocalDateTime clockInTime; |
| | | |
| | | /** |
| | | * ä¸çæå¡æ¶é´ |
| | | */ |
| | | private LocalDateTime clockOutTime; |
| | | |
| | | /** |
| | | * ä¸çæå¡ç±»åï¼1-æ£å¸¸ï¼2-è¿å°ï¼3-ç¼ºå¡ |
| | | */ |
| | | private Integer clockInType; |
| | | |
| | | /** |
| | | * ä¸çæå¡ç±»åï¼1-æ£å¸¸ï¼2-æ©éï¼3-ç¼ºå¡ |
| | | */ |
| | | private Integer clockOutType; |
| | | |
| | | /** |
| | | * 工使¶é¿ï¼å°æ¶ï¼ |
| | | */ |
| | | private BigDecimal workHours; |
| | | |
| | | /** |
| | | * å çæ¶é¿ï¼å°æ¶ï¼ |
| | | */ |
| | | private BigDecimal overtimeHours; |
| | | |
| | | /** |
| | | * æå¡å°ç¹ |
| | | */ |
| | | private String location; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | /** |
| | | * æ°æ®æ¥æºï¼1-æå¡ï¼2-导å
¥ |
| | | */ |
| | | private Integer dataSource; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | |
| | | /** |
| | | * èå¤è§åé
ç½® DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_attendance_rule") |
| | | @KeySequence("hrm_attendance_rule_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmAttendanceRuleDO extends BaseDO { |
| | | |
| | | /** |
| | | * è§åID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * è§ååç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * éç¨é¨é¨IDï¼ç©ºè¡¨ç¤ºå
¨å±ï¼ |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * ä¸çæ¶é´ |
| | | */ |
| | | private LocalTime workStartTime; |
| | | |
| | | /** |
| | | * ä¸çæ¶é´ |
| | | */ |
| | | private LocalTime workEndTime; |
| | | |
| | | /** |
| | | * è¿å°å
许åéæ° |
| | | */ |
| | | private Integer lateAllowMinutes; |
| | | |
| | | /** |
| | | * æ©éå
许åéæ° |
| | | */ |
| | | private Integer earlyAllowMinutes; |
| | | |
| | | /** |
| | | * å çèµ·ç®æ¶é¿ï¼å°æ¶ï¼ |
| | | */ |
| | | private BigDecimal overtimeThreshold; |
| | | |
| | | /** |
| | | * ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨ |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * èå¤ç»è®¡æ±æ» DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_attendance_summary") |
| | | @KeySequence("hrm_attendance_summary_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmAttendanceSummaryDO extends BaseDO { |
| | | |
| | | /** |
| | | * æ±æ»ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åå·¥ID |
| | | * |
| | | * å
³è HrmEmployeeDO#getId() |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * å¹´æï¼æ ¼å¼ï¼yyyy-MM |
| | | */ |
| | | private String yearMonth; |
| | | |
| | | /** |
| | | * åºåºå¤å¤©æ° |
| | | */ |
| | | private Integer workDays; |
| | | |
| | | /** |
| | | * å®é
åºå¤å¤©æ° |
| | | */ |
| | | private Integer actualDays; |
| | | |
| | | /** |
| | | * è¿å°æ¬¡æ° |
| | | */ |
| | | private Integer lateCount; |
| | | |
| | | /** |
| | | * æ©éæ¬¡æ° |
| | | */ |
| | | private Integer earlyCount; |
| | | |
| | | /** |
| | | * ç¼ºå¡æ¬¡æ° |
| | | */ |
| | | private Integer absentCount; |
| | | |
| | | /** |
| | | * å çæ¶é¿ï¼å°æ¶ï¼ |
| | | */ |
| | | private BigDecimal overtimeHours; |
| | | |
| | | /** |
| | | * è¯·åæ¶é¿ï¼å°æ¶ï¼ |
| | | */ |
| | | private BigDecimal leaveHours; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * åå·¥ä¿¡æ¯ DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_employee") |
| | | @KeySequence("hrm_employee_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmEmployeeDO extends BaseDO { |
| | | |
| | | /** |
| | | * åå·¥ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * å
³èç³»ç»ç¨æ·ID |
| | | * |
| | | * å
³è AdminUserDO#getId() |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | * |
| | | * å
³è DeptDO#getId() |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * å²ä½ID |
| | | * |
| | | * å
³è PostDO#getId() |
| | | */ |
| | | private Long postId; |
| | | |
| | | /** |
| | | * åå·¥ç¼å· |
| | | */ |
| | | private String employeeNo; |
| | | |
| | | /** |
| | | * åå·¥å§å |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * æ§å« |
| | | * |
| | | * 1-ç·ï¼2-女 |
| | | */ |
| | | private Integer gender; |
| | | |
| | | /** |
| | | * åºçæ¥æ |
| | | */ |
| | | private LocalDate birthday; |
| | | |
| | | /** |
| | | * ææºå·ç |
| | | */ |
| | | private String phone; |
| | | |
| | | /** |
| | | * é®ç®± |
| | | */ |
| | | private String email; |
| | | |
| | | /** |
| | | * 身份è¯å· |
| | | */ |
| | | private String idCard; |
| | | |
| | | /** |
| | | * å
¥èæ¥æ |
| | | */ |
| | | private LocalDate hireDate; |
| | | |
| | | /** |
| | | * è½¬æ£æ¥æ |
| | | */ |
| | | private LocalDate regularDate; |
| | | |
| | | /** |
| | | * ç¦»èæ¥æ |
| | | */ |
| | | private LocalDate leaveDate; |
| | | |
| | | /** |
| | | * åå·¥ç¶æ |
| | | * |
| | | * 1-å¨èï¼2-è¯ç¨ï¼3-离è |
| | | */ |
| | | private Integer employeeStatus; |
| | | |
| | | /** |
| | | * å¹´åä½é¢ï¼å¤©ï¼ |
| | | */ |
| | | private BigDecimal annualLeaveBalance; |
| | | |
| | | /** |
| | | * ç
åä½é¢ï¼å¤©ï¼ |
| | | */ |
| | | private BigDecimal sickLeaveBalance; |
| | | |
| | | /** |
| | | * èªé
ȾID |
| | | * |
| | | * å
³è HrmSalaryStructureDO#getId() |
| | | */ |
| | | private Long salaryStructureId; |
| | | |
| | | /** |
| | | * åºæ¬å·¥èµ |
| | | * |
| | | * ç¨äºèªé
¬æ ¸ç® |
| | | */ |
| | | private BigDecimal baseSalary; |
| | | |
| | | /** |
| | | * è§è²IDå表 |
| | | * |
| | | * ç¨äºåé
ç³»ç»ç¨æ·è§è²ï¼JSON æ ¼å¼åå¨ |
| | | */ |
| | | private String roleIds; |
| | | |
| | | /** |
| | | * 弿·é¶è¡ |
| | | */ |
| | | private String bankName; |
| | | |
| | | /** |
| | | * é¶è¡è´¦å· |
| | | */ |
| | | private String bankAccount; |
| | | |
| | | /** |
| | | * å±
ä½å°å |
| | | */ |
| | | private String address; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * åå·¥æè²ç»å DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_employee_education") |
| | | @KeySequence("hrm_employee_education_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmEmployeeEducationDO extends BaseDO { |
| | | |
| | | /** |
| | | * è®°å½ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åå·¥ID |
| | | * |
| | | * å
³è HrmEmployeeDO#getId() |
| | | */ |
| | | private Long employeeId; |
| | | |
| | | /** |
| | | * 妿 ¡åç§° |
| | | */ |
| | | private String schoolName; |
| | | |
| | | /** |
| | | * ä¸ä¸ |
| | | */ |
| | | private String major; |
| | | |
| | | /** |
| | | * å¦å |
| | | * |
| | | * 1-é«ä¸ï¼2-大ä¸ï¼3-æ¬ç§ï¼4-ç¡å£«ï¼5-å士 |
| | | */ |
| | | private Integer degree; |
| | | |
| | | /** |
| | | * å
¥å¦æ¶é´ |
| | | */ |
| | | private LocalDate startDate; |
| | | |
| | | /** |
| | | * æ¯ä¸æ¶é´ |
| | | */ |
| | | private LocalDate endDate; |
| | | |
| | | /** |
| | | * è¯ä¹¦ç¼å· |
| | | */ |
| | | private String certificateNo; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | /** |
| | | * å工紧æ¥è系人 DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_employee_emergency_contact") |
| | | @KeySequence("hrm_employee_emergency_contact_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmEmployeeEmergencyContactDO extends BaseDO { |
| | | |
| | | /** |
| | | * è®°å½ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åå·¥ID |
| | | * |
| | | * å
³è HrmEmployeeDO#getId() |
| | | */ |
| | | private Long employeeId; |
| | | |
| | | /** |
| | | * è系人å§å |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * ä¸åå·¥å
³ç³» |
| | | */ |
| | | private String relationship; |
| | | |
| | | /** |
| | | * èç³»çµè¯ |
| | | */ |
| | | private String phone; |
| | | |
| | | /** |
| | | * èç³»å°å |
| | | */ |
| | | private String address; |
| | | |
| | | /** |
| | | * æåºï¼å¯è®¾ç½®å¤ä¸ªç´§æ¥èç³»äººï¼ |
| | | */ |
| | | private Integer sort; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * å工工ä½ç»å DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_employee_work_history") |
| | | @KeySequence("hrm_employee_work_history_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmEmployeeWorkHistoryDO extends BaseDO { |
| | | |
| | | /** |
| | | * è®°å½ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åå·¥ID |
| | | * |
| | | * å
³è HrmEmployeeDO#getId() |
| | | */ |
| | | private Long employeeId; |
| | | |
| | | /** |
| | | * å
¬å¸åç§° |
| | | */ |
| | | private String companyName; |
| | | |
| | | /** |
| | | * èä½ |
| | | */ |
| | | private String position; |
| | | |
| | | /** |
| | | * å
¥èæ¶é´ |
| | | */ |
| | | private LocalDate startDate; |
| | | |
| | | /** |
| | | * ç¦»èæ¶é´ |
| | | */ |
| | | private LocalDate endDate; |
| | | |
| | | /** |
| | | * å·¥ä½å
容 |
| | | */ |
| | | private String workContent; |
| | | |
| | | /** |
| | | * 离èåå |
| | | */ |
| | | private String leaveReason; |
| | | |
| | | /** |
| | | * è¯æäººå§å |
| | | */ |
| | | private String referenceName; |
| | | |
| | | /** |
| | | * è¯æäººçµè¯ |
| | | */ |
| | | private String referencePhone; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * åå·¥èªé
¬æ¡£æ¡ DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_employee_salary") |
| | | @KeySequence("hrm_employee_salary_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmEmployeeSalaryDO extends BaseDO { |
| | | |
| | | /** |
| | | * æ¡£æ¡ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åå·¥ID |
| | | * |
| | | * å
³è HrmEmployeeDO#getId() |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * èªé
ȾID |
| | | */ |
| | | private Long salaryStructureId; |
| | | |
| | | /** |
| | | * åºæ¬å·¥èµ |
| | | */ |
| | | private BigDecimal baseSalary; |
| | | |
| | | /** |
| | | * 绩æå·¥èµ |
| | | */ |
| | | private BigDecimal performanceSalary; |
| | | |
| | | /** |
| | | * é¤è¡¥ |
| | | */ |
| | | private BigDecimal mealAllowance; |
| | | |
| | | /** |
| | | * 交é补贴 |
| | | */ |
| | | private BigDecimal transportAllowance; |
| | | |
| | | /** |
| | | * å
¶ä»è¡¥è´´ |
| | | */ |
| | | private BigDecimal otherAllowance; |
| | | |
| | | /** |
| | | * çææ¥æ |
| | | */ |
| | | private LocalDate effectiveDate; |
| | | |
| | | /** |
| | | * ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨ |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * å工社ä¿å
¬ç§¯éæ¡£æ¡ DO |
| | | * |
| | | * åå·¥ç»å®ç¤¾ä¿å
¬ç§¯éæ¹æ¡ï¼å¹¶è®¾ç½®ä¸ªäººåçç¼´çº³åºæ° |
| | | * ä¸ä¸ªç¤¾ä¿æ¹æ¡å¯ä»¥ç»å®å¤ä¸ªåå·¥ï¼ä¸ä¸ªåå·¥å¯ä»¥æå¤ä¸ªç¤¾ä¿æ¡£æ¡ï¼æçææ¥æï¼åææ°çæçï¼ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_employee_social_security") |
| | | @KeySequence("hrm_employee_social_security_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmEmployeeSocialSecurityDO extends BaseDO { |
| | | |
| | | /** |
| | | * æ¡£æ¡ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åå·¥ID |
| | | * |
| | | * å
³è HrmEmployeeDO#getId() |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * 社ä¿å
¬ç§¯éæ¹æ¡ID |
| | | * |
| | | * å
³è HrmSocialSecuritySchemeDO#getId() |
| | | */ |
| | | private Long socialSecuritySchemeId; |
| | | |
| | | // ========== ç¼´çº³åºæ°ï¼å工个æ§åè®¾ç½®ï¼ ========== |
| | | /** |
| | | * 社ä¿ç¼´çº³åºæ° |
| | | */ |
| | | private BigDecimal socialSecurityBase; |
| | | |
| | | /** |
| | | * å
¬ç§¯éç¼´çº³åºæ° |
| | | */ |
| | | private BigDecimal housingFundBase; |
| | | |
| | | // ========== çæä¿¡æ¯ ========== |
| | | /** |
| | | * çææ¥æ |
| | | */ |
| | | private LocalDate effectiveDate; |
| | | |
| | | /** |
| | | * ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨ |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * 请åç±»åæ£æ¬¾é
ç½® DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_leave_type_config") |
| | | @KeySequence("hrm_leave_type_config_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmLeaveTypeConfigDO extends BaseDO { |
| | | |
| | | /** |
| | | * ä¸»é® |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * 请åç±»åï¼1-äºå, 2-ç
å, 3-å¹´å, 4-å©å, 5-产å, 6-丧å |
| | | */ |
| | | private Integer leaveType; |
| | | |
| | | /** |
| | | * ç±»ååç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * æ£æ¬¾æ¯ä¾ï¼0-1ä¹é´ï¼å¦0.5表示æ£50%ï¼ |
| | | */ |
| | | private BigDecimal deductionRatio; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | /** |
| | | * ç¶æï¼0-å¯ç¨, 1-ç¦ç¨ |
| | | */ |
| | | private Integer status; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * èªé
¬æ ¸ç®è®°å½ DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_salary_calculation") |
| | | @KeySequence("hrm_salary_calculation_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmSalaryCalculationDO extends BaseDO { |
| | | |
| | | /** |
| | | * æ ¸ç®ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * æ ¸ç®åå· |
| | | */ |
| | | private String no; |
| | | |
| | | /** |
| | | * æ ¸ç®å¨æï¼å¦2024-01ï¼ |
| | | */ |
| | | private String period; |
| | | |
| | | /** |
| | | * åå·¥ID |
| | | * |
| | | * å
³è HrmEmployeeDO#getId() |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * åºæ¬å·¥èµ |
| | | */ |
| | | private BigDecimal baseSalary; |
| | | |
| | | /** |
| | | * 绩æå·¥èµ |
| | | */ |
| | | private BigDecimal performanceSalary; |
| | | |
| | | /** |
| | | * å çå·¥èµ |
| | | */ |
| | | private BigDecimal overtimePay; |
| | | |
| | | /** |
| | | * é¤è¡¥ |
| | | */ |
| | | private BigDecimal mealAllowance; |
| | | |
| | | /** |
| | | * 交é补贴 |
| | | */ |
| | | private BigDecimal transportAllowance; |
| | | |
| | | /** |
| | | * å
¶ä»è¡¥è´´ |
| | | */ |
| | | private BigDecimal otherAllowance; |
| | | |
| | | /** |
| | | * ç¤¾ä¿æ£é¤ |
| | | */ |
| | | private BigDecimal socialSecurityDeduction; |
| | | |
| | | /** |
| | | * å
¬ç§¯éæ£é¤ |
| | | */ |
| | | private BigDecimal housingFundDeduction; |
| | | |
| | | /** |
| | | * ä¸ªç¨æ£é¤ |
| | | */ |
| | | private BigDecimal taxDeduction; |
| | | |
| | | /** |
| | | * å
¶ä»æ£é¤ |
| | | */ |
| | | private BigDecimal otherDeduction; |
| | | |
| | | /** |
| | | * è¯·åæ£æ¬¾ |
| | | */ |
| | | private BigDecimal leaveDeduction; |
| | | |
| | | /** |
| | | * å®åå·¥èµ |
| | | */ |
| | | private BigDecimal actualSalary; |
| | | |
| | | /** |
| | | * åºå¤å¤©æ° |
| | | */ |
| | | private Integer workDays; |
| | | |
| | | /** |
| | | * å çæ¶é¿ |
| | | */ |
| | | private BigDecimal overtimeHours; |
| | | |
| | | /** |
| | | * ç¶æï¼0-å¾
确认ï¼10-已确认ï¼20-已忾 |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 确认æ¶é´ |
| | | */ |
| | | private LocalDateTime confirmTime; |
| | | |
| | | /** |
| | | * 确认人ID |
| | | */ |
| | | private Long confirmUserId; |
| | | |
| | | /** |
| | | * åæ¾æ¶é´ |
| | | */ |
| | | private LocalDateTime paymentTime; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * èªèµåæ¾å°è´¦ DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_salary_payment") |
| | | @KeySequence("hrm_salary_payment_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmSalaryPaymentDO extends BaseDO { |
| | | |
| | | /** |
| | | * åæ¾ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åæ¾åå· |
| | | */ |
| | | private String no; |
| | | |
| | | /** |
| | | * 忾卿 |
| | | */ |
| | | private String period; |
| | | |
| | | /** |
| | | * åæ¾æ»éé¢ |
| | | */ |
| | | private BigDecimal totalAmount; |
| | | |
| | | /** |
| | | * åæ¾äººæ° |
| | | */ |
| | | private Integer totalCount; |
| | | |
| | | /** |
| | | * åæ¾æ¹å¼ï¼1-é¶è¡è½¬è´¦ï¼2-ç°é |
| | | */ |
| | | private Integer paymentMethod; |
| | | |
| | | /** |
| | | * åæ¾æ¶é´ |
| | | */ |
| | | private LocalDateTime paymentTime; |
| | | |
| | | /** |
| | | * ç¶æï¼0-å¾
åæ¾ï¼10-已忾 |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * é¶è¡ååéä»¶ |
| | | */ |
| | | private String fileUrl; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * èªèµåæ¾æç» DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_salary_payment_detail") |
| | | @KeySequence("hrm_salary_payment_detail_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmSalaryPaymentDetailDO extends BaseDO { |
| | | |
| | | /** |
| | | * ä¸»é® |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * åæ¾å°è´¦ID |
| | | */ |
| | | private Long paymentId; |
| | | |
| | | /** |
| | | * èªé
¬æ ¸ç®ID |
| | | */ |
| | | private Long calculationId; |
| | | |
| | | /** |
| | | * åå·¥ID |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | */ |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * å®åå·¥èµ |
| | | */ |
| | | private BigDecimal actualSalary; |
| | | |
| | | /** |
| | | * åæ¾ç¶æï¼0-å¾
åæ¾ï¼10-已忾 |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * åæ¾æ¶é´ |
| | | */ |
| | | private LocalDateTime paymentTime; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * èªé
Ⱦ DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_salary_structure") |
| | | @KeySequence("hrm_salary_structure_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmSalaryStructureDO extends BaseDO { |
| | | |
| | | /** |
| | | * ç»æID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç»æåç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * åºæ¬å·¥èµ |
| | | */ |
| | | private BigDecimal baseSalary; |
| | | |
| | | /** |
| | | * 绩æå·¥èµå æ¯ï¼%ï¼ |
| | | */ |
| | | private BigDecimal performanceRatio; |
| | | |
| | | /** |
| | | * å çå·¥èµåç |
| | | */ |
| | | private BigDecimal overtimePayRatio; |
| | | |
| | | /** |
| | | * 社ä¿åºæ° |
| | | */ |
| | | private BigDecimal socialSecurityBase; |
| | | |
| | | /** |
| | | * å
¬ç§¯éåºæ° |
| | | */ |
| | | private BigDecimal housingFundBase; |
| | | |
| | | /** |
| | | * ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨ |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * 社ä¿å
¬ç§¯éé
ç½® DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_social_security_config") |
| | | @KeySequence("hrm_social_security_config_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmSocialSecurityConfigDO extends BaseDO { |
| | | |
| | | /** |
| | | * é
ç½®ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * é
ç½®åç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * çææ¥æ |
| | | */ |
| | | private LocalDate effectiveDate; |
| | | |
| | | // ========== å
»èä¿é© ========== |
| | | /** |
| | | * å
»èä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal pensionCompanyRatio; |
| | | /** |
| | | * å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal pensionPersonalRatio; |
| | | |
| | | // ========== å»çä¿é© ========== |
| | | /** |
| | | * å»çä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal medicalCompanyRatio; |
| | | /** |
| | | * å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal medicalPersonalRatio; |
| | | |
| | | // ========== 失ä¸ä¿é© ========== |
| | | /** |
| | | * 失ä¸ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal unemploymentCompanyRatio; |
| | | /** |
| | | * 失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal unemploymentPersonalRatio; |
| | | |
| | | // ========== 工伤ä¿é© ========== |
| | | /** |
| | | * 工伤ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal workInjuryRatio; |
| | | |
| | | // ========== çè²ä¿é© ========== |
| | | /** |
| | | * çè²ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal maternityRatio; |
| | | |
| | | // ========== å
¬ç§¯é ========== |
| | | /** |
| | | * å
¬ç§¯éä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal housingFundCompanyRatio; |
| | | /** |
| | | * å
¬ç§¯é个人缴纳æ¯ä¾ |
| | | */ |
| | | private BigDecimal housingFundPersonalRatio; |
| | | |
| | | // ========== åºæ°ä¸ä¸é ========== |
| | | /** |
| | | * 社ä¿åºæ°ä¸é |
| | | */ |
| | | private BigDecimal socialSecurityBaseMin; |
| | | /** |
| | | * 社ä¿åºæ°ä¸é |
| | | */ |
| | | private BigDecimal socialSecurityBaseMax; |
| | | /** |
| | | * å
¬ç§¯éåºæ°ä¸é |
| | | */ |
| | | private BigDecimal housingFundBaseMin; |
| | | /** |
| | | * å
¬ç§¯éåºæ°ä¸é |
| | | */ |
| | | private BigDecimal housingFundBaseMax; |
| | | |
| | | /** |
| | | * ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨ |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * 社ä¿å
¬ç§¯éæ¹æ¡ DO |
| | | * |
| | | * ä¸ä¸ªæ¹æ¡å¯ä»¥è¢«å¤ä¸ªåå·¥ç»å® |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_social_security_scheme") |
| | | @KeySequence("hrm_social_security_scheme_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmSocialSecuritySchemeDO extends BaseDO { |
| | | |
| | | /** |
| | | * æ¹æ¡ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * æ¹æ¡åç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * çææ¥æ |
| | | */ |
| | | private LocalDate effectiveDate; |
| | | |
| | | // ========== å
»èä¿é©æ¯ä¾ ========== |
| | | /** |
| | | * å
»èä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal pensionCompanyRatio; |
| | | /** |
| | | * å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal pensionPersonalRatio; |
| | | |
| | | // ========== å»çä¿é©æ¯ä¾ ========== |
| | | /** |
| | | * å»çä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal medicalCompanyRatio; |
| | | /** |
| | | * å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal medicalPersonalRatio; |
| | | |
| | | // ========== 失ä¸ä¿é©æ¯ä¾ ========== |
| | | /** |
| | | * 失ä¸ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal unemploymentCompanyRatio; |
| | | /** |
| | | * 失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal unemploymentPersonalRatio; |
| | | |
| | | // ========== 工伤ä¿é©æ¯ä¾ï¼ä»
ä¼ä¸ç¼´çº³ï¼ ========== |
| | | /** |
| | | * 工伤ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal workInjuryRatio; |
| | | |
| | | // ========== çè²ä¿é©æ¯ä¾ï¼ä»
ä¼ä¸ç¼´çº³ï¼ ========== |
| | | /** |
| | | * çè²ä¿é©ä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal maternityRatio; |
| | | |
| | | // ========== å
¬ç§¯éæ¯ä¾ ========== |
| | | /** |
| | | * å
¬ç§¯éä¼ä¸ç¼´çº³æ¯ä¾ |
| | | */ |
| | | private BigDecimal housingFundCompanyRatio; |
| | | /** |
| | | * å
¬ç§¯é个人缴纳æ¯ä¾ |
| | | */ |
| | | private BigDecimal housingFundPersonalRatio; |
| | | |
| | | /** |
| | | * ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨ |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.dataobject.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * 个ç¨ç¨çé
ç½® DO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @TableName("hrm_tax_rate_config") |
| | | @KeySequence("hrm_tax_rate_config_seq") |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @ToString(callSuper = true) |
| | | @Builder |
| | | @NoArgsConstructor |
| | | @AllArgsConstructor |
| | | public class HrmTaxRateConfigDO extends BaseDO { |
| | | |
| | | /** |
| | | * é
ç½®ID |
| | | */ |
| | | @TableId |
| | | private Long id; |
| | | |
| | | /** |
| | | * é
ç½®åç§° |
| | | */ |
| | | private String name; |
| | | |
| | | /** |
| | | * çææ¥æ |
| | | */ |
| | | private LocalDate effectiveDate; |
| | | |
| | | /** |
| | | * ç¨ç级æ°ï¼1-7 |
| | | */ |
| | | private Integer level; |
| | | |
| | | /** |
| | | * åºçº³ç¨æå¾é¢ä¸éï¼å«ï¼ |
| | | */ |
| | | private BigDecimal minAmount; |
| | | |
| | | /** |
| | | * åºçº³ç¨æå¾é¢ä¸éï¼ä¸å«ï¼ï¼0表示æ ä¸é |
| | | */ |
| | | private BigDecimal maxAmount; |
| | | |
| | | /** |
| | | * ç¨ç |
| | | */ |
| | | private BigDecimal taxRate; |
| | | |
| | | /** |
| | | * éç®æ£é¤æ° |
| | | */ |
| | | private BigDecimal quickDeduction; |
| | | |
| | | /** |
| | | * ç¶æï¼0-å¯ç¨ï¼1-ç¦ç¨ |
| | | */ |
| | | private Integer status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmLeaveApplicationDO; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 请åç³è¯· Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmLeaveApplicationMapper extends BaseMapperX<HrmLeaveApplicationDO> { |
| | | |
| | | default PageResult<HrmLeaveApplicationDO> selectPage(HrmLeaveApplicationPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmLeaveApplicationDO>() |
| | | .likeIfPresent(HrmLeaveApplicationDO::getNo, reqVO.getNo()) |
| | | .eqIfPresent(HrmLeaveApplicationDO::getUserId, reqVO.getUserId()) |
| | | .eqIfPresent(HrmLeaveApplicationDO::getDeptId, reqVO.getDeptId()) |
| | | .eqIfPresent(HrmLeaveApplicationDO::getLeaveType, reqVO.getLeaveType()) |
| | | .eqIfPresent(HrmLeaveApplicationDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(HrmLeaveApplicationDO::getCreateTime, reqVO.getCreateTime()) |
| | | .orderByDesc(HrmLeaveApplicationDO::getId)); |
| | | } |
| | | |
| | | default HrmLeaveApplicationDO selectByNo(String no) { |
| | | return selectOne(HrmLeaveApplicationDO::getNo, no); |
| | | } |
| | | |
| | | default HrmLeaveApplicationDO selectByProcessInstanceId(String processInstanceId) { |
| | | return selectOne(HrmLeaveApplicationDO::getProcessInstanceId, processInstanceId); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢å工卿宿¶é´èå´å
已审æ¹éè¿ç请åè®°å½ |
| | | * |
| | | * @param userId åå·¥IDï¼ç³»ç»ç¨æ·IDï¼ |
| | | * @param startTime å¼å§æ¶é´ |
| | | * @param endTime ç»ææ¶é´ |
| | | * @return 请åè®°å½å表 |
| | | */ |
| | | default List<HrmLeaveApplicationDO> selectApprovedListByUserIdAndTimeRange(Long userId, LocalDateTime startTime, LocalDateTime endTime) { |
| | | return selectList(new LambdaQueryWrapperX<HrmLeaveApplicationDO>() |
| | | .eq(HrmLeaveApplicationDO::getUserId, userId) |
| | | .eq(HrmLeaveApplicationDO::getStatus, HrmAuditStatusEnum.APPROVE.getStatus()) |
| | | .ge(HrmLeaveApplicationDO::getStartTime, startTime) |
| | | .le(HrmLeaveApplicationDO::getEndTime, endTime)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmResignationApplicationDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * 离èç³è¯· Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmResignationApplicationMapper extends BaseMapperX<HrmResignationApplicationDO> { |
| | | |
| | | default PageResult<HrmResignationApplicationDO> selectPage(HrmResignationApplicationPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmResignationApplicationDO>() |
| | | .likeIfPresent(HrmResignationApplicationDO::getNo, reqVO.getNo()) |
| | | .eqIfPresent(HrmResignationApplicationDO::getUserId, reqVO.getUserId()) |
| | | .eqIfPresent(HrmResignationApplicationDO::getDeptId, reqVO.getDeptId()) |
| | | .eqIfPresent(HrmResignationApplicationDO::getResignationType, reqVO.getResignationType()) |
| | | .eqIfPresent(HrmResignationApplicationDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(HrmResignationApplicationDO::getCreateTime, reqVO.getCreateTime()) |
| | | .orderByDesc(HrmResignationApplicationDO::getId)); |
| | | } |
| | | |
| | | default HrmResignationApplicationDO selectByNo(String no) { |
| | | return selectOne(HrmResignationApplicationDO::getNo, no); |
| | | } |
| | | |
| | | default HrmResignationApplicationDO selectByProcessInstanceId(String processInstanceId) { |
| | | return selectOne(HrmResignationApplicationDO::getProcessInstanceId, processInstanceId); |
| | | } |
| | | |
| | | default HrmResignationApplicationDO selectByUserIdAndStatusNot(Long userId, Integer status) { |
| | | return selectOne(new LambdaQueryWrapperX<HrmResignationApplicationDO>() |
| | | .eq(HrmResignationApplicationDO::getUserId, userId) |
| | | .ne(HrmResignationApplicationDO::getStatus, status)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmTransferApplicationDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * è°å²ç³è¯· Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmTransferApplicationMapper extends BaseMapperX<HrmTransferApplicationDO> { |
| | | |
| | | default PageResult<HrmTransferApplicationDO> selectPage(HrmTransferApplicationPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmTransferApplicationDO>() |
| | | .likeIfPresent(HrmTransferApplicationDO::getNo, reqVO.getNo()) |
| | | .eqIfPresent(HrmTransferApplicationDO::getUserId, reqVO.getUserId()) |
| | | .eqIfPresent(HrmTransferApplicationDO::getCurrentDeptId, reqVO.getCurrentDeptId()) |
| | | .eqIfPresent(HrmTransferApplicationDO::getTargetDeptId, reqVO.getTargetDeptId()) |
| | | .eqIfPresent(HrmTransferApplicationDO::getTransferType, reqVO.getTransferType()) |
| | | .eqIfPresent(HrmTransferApplicationDO::getStatus, reqVO.getStatus()) |
| | | .betweenIfPresent(HrmTransferApplicationDO::getCreateTime, reqVO.getCreateTime()) |
| | | .orderByDesc(HrmTransferApplicationDO::getId)); |
| | | } |
| | | |
| | | default HrmTransferApplicationDO selectByNo(String no) { |
| | | return selectOne(HrmTransferApplicationDO::getNo, no); |
| | | } |
| | | |
| | | default HrmTransferApplicationDO selectByProcessInstanceId(String processInstanceId) { |
| | | return selectOne(HrmTransferApplicationDO::getProcessInstanceId, processInstanceId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * èå¤å¼å¸¸ç³è¯· Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmAttendanceExceptionMapper extends BaseMapperX<HrmAttendanceExceptionDO> { |
| | | |
| | | default PageResult<HrmAttendanceExceptionDO> selectPage(HrmAttendanceExceptionPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmAttendanceExceptionDO>() |
| | | .likeIfPresent(HrmAttendanceExceptionDO::getNo, reqVO.getNo()) |
| | | .eqIfPresent(HrmAttendanceExceptionDO::getUserId, reqVO.getUserId()) |
| | | .eqIfPresent(HrmAttendanceExceptionDO::getDeptId, reqVO.getDeptId()) |
| | | .eqIfPresent(HrmAttendanceExceptionDO::getType, reqVO.getType()) |
| | | .eqIfPresent(HrmAttendanceExceptionDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(HrmAttendanceExceptionDO::getId)); |
| | | } |
| | | |
| | | default HrmAttendanceExceptionDO selectByNo(String no) { |
| | | return selectOne(HrmAttendanceExceptionDO::getNo, no); |
| | | } |
| | | |
| | | default HrmAttendanceExceptionDO selectByProcessInstanceId(String processInstanceId) { |
| | | return selectOne(HrmAttendanceExceptionDO::getProcessInstanceId, processInstanceId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceHolidayDO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidayPageReqVO; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èå¤è忥é
ç½® Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmAttendanceHolidayMapper extends BaseMapperX<HrmAttendanceHolidayDO> { |
| | | |
| | | default PageResult<HrmAttendanceHolidayDO> selectPage(HrmAttendanceHolidayPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmAttendanceHolidayDO>() |
| | | .likeIfPresent(HrmAttendanceHolidayDO::getName, reqVO.getName()) |
| | | .eqIfPresent(HrmAttendanceHolidayDO::getType, reqVO.getType()) |
| | | .betweenIfPresent(HrmAttendanceHolidayDO::getDate, reqVO.getStartDate(), reqVO.getEndDate()) |
| | | .orderByDesc(HrmAttendanceHolidayDO::getDate)); |
| | | } |
| | | |
| | | default HrmAttendanceHolidayDO selectByDate(LocalDate date) { |
| | | return selectOne(HrmAttendanceHolidayDO::getDate, date); |
| | | } |
| | | |
| | | default List<HrmAttendanceHolidayDO> selectListByDateBetween(LocalDate startDate, LocalDate endDate) { |
| | | return selectList(new LambdaQueryWrapperX<HrmAttendanceHolidayDO>() |
| | | .ge(HrmAttendanceHolidayDO::getDate, startDate) |
| | | .le(HrmAttendanceHolidayDO::getDate, endDate) |
| | | .orderByAsc(HrmAttendanceHolidayDO::getDate)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRecordDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * è夿å¡è®°å½ Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmAttendanceRecordMapper extends BaseMapperX<HrmAttendanceRecordDO> { |
| | | |
| | | default PageResult<HrmAttendanceRecordDO> selectPage(HrmAttendanceRecordPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmAttendanceRecordDO>() |
| | | .eqIfPresent(HrmAttendanceRecordDO::getUserId, reqVO.getUserId()) |
| | | .eqIfPresent(HrmAttendanceRecordDO::getDeptId, reqVO.getDeptId()) |
| | | .geIfPresent(HrmAttendanceRecordDO::getDate, reqVO.getStartDate()) |
| | | .leIfPresent(HrmAttendanceRecordDO::getDate, reqVO.getEndDate()) |
| | | .eqIfPresent(HrmAttendanceRecordDO::getClockInType, reqVO.getClockInType()) |
| | | .eqIfPresent(HrmAttendanceRecordDO::getClockOutType, reqVO.getClockOutType()) |
| | | .orderByDesc(HrmAttendanceRecordDO::getDate)); |
| | | } |
| | | |
| | | default HrmAttendanceRecordDO selectByUserIdAndDate(Long userId, LocalDate date) { |
| | | return selectOne(new LambdaQueryWrapperX<HrmAttendanceRecordDO>() |
| | | .eq(HrmAttendanceRecordDO::getUserId, userId) |
| | | .eq(HrmAttendanceRecordDO::getDate, date)); |
| | | } |
| | | |
| | | default List<HrmAttendanceRecordDO> selectListByUserIdAndDateBetween(Long userId, LocalDate startDate, LocalDate endDate) { |
| | | return selectList(new LambdaQueryWrapperX<HrmAttendanceRecordDO>() |
| | | .eq(HrmAttendanceRecordDO::getUserId, userId) |
| | | .ge(HrmAttendanceRecordDO::getDate, startDate) |
| | | .le(HrmAttendanceRecordDO::getDate, endDate) |
| | | .orderByAsc(HrmAttendanceRecordDO::getDate)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRulePageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRuleDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èå¤è§åé
ç½® Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmAttendanceRuleMapper extends BaseMapperX<HrmAttendanceRuleDO> { |
| | | |
| | | default PageResult<HrmAttendanceRuleDO> selectPage(HrmAttendanceRulePageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmAttendanceRuleDO>() |
| | | .likeIfPresent(HrmAttendanceRuleDO::getName, reqVO.getName()) |
| | | .eqIfPresent(HrmAttendanceRuleDO::getDeptId, reqVO.getDeptId()) |
| | | .eqIfPresent(HrmAttendanceRuleDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(HrmAttendanceRuleDO::getId)); |
| | | } |
| | | |
| | | default List<HrmAttendanceRuleDO> selectListByStatus(Integer status) { |
| | | return selectList(new LambdaQueryWrapperX<HrmAttendanceRuleDO>() |
| | | .eqIfPresent(HrmAttendanceRuleDO::getStatus, status) |
| | | .orderByAsc(HrmAttendanceRuleDO::getName)); |
| | | } |
| | | |
| | | default List<HrmAttendanceRuleDO> selectListByDeptId(Long deptId) { |
| | | return selectList(new LambdaQueryWrapperX<HrmAttendanceRuleDO>() |
| | | .eq(HrmAttendanceRuleDO::getDeptId, deptId) |
| | | .orderByAsc(HrmAttendanceRuleDO::getName)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceSummaryDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èå¤ç»è®¡æ±æ» Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmAttendanceSummaryMapper extends BaseMapperX<HrmAttendanceSummaryDO> { |
| | | |
| | | default HrmAttendanceSummaryDO selectByUserIdAndYearMonth(Long userId, String yearMonth) { |
| | | return selectOne(new LambdaQueryWrapperX<HrmAttendanceSummaryDO>() |
| | | .eq(HrmAttendanceSummaryDO::getUserId, userId) |
| | | .eq(HrmAttendanceSummaryDO::getYearMonth, yearMonth)); |
| | | } |
| | | |
| | | default List<HrmAttendanceSummaryDO> selectListByDeptIdAndYearMonth(Long deptId, String yearMonth) { |
| | | return selectList(new LambdaQueryWrapperX<HrmAttendanceSummaryDO>() |
| | | .eq(HrmAttendanceSummaryDO::getDeptId, deptId) |
| | | .eq(HrmAttendanceSummaryDO::getYearMonth, yearMonth) |
| | | .orderByAsc(HrmAttendanceSummaryDO::getUserId)); |
| | | } |
| | | |
| | | default List<HrmAttendanceSummaryDO> selectListByYearMonth(String yearMonth) { |
| | | return selectList(new LambdaQueryWrapperX<HrmAttendanceSummaryDO>() |
| | | .eq(HrmAttendanceSummaryDO::getYearMonth, yearMonth) |
| | | .orderByAsc(HrmAttendanceSummaryDO::getDeptId) |
| | | .orderByAsc(HrmAttendanceSummaryDO::getUserId)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEducationDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * åå·¥æè²ç»å Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmEmployeeEducationMapper extends BaseMapperX<HrmEmployeeEducationDO> { |
| | | |
| | | default List<HrmEmployeeEducationDO> selectByEmployeeId(Long employeeId) { |
| | | return selectList(HrmEmployeeEducationDO::getEmployeeId, employeeId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEmergencyContactDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å工紧æ¥è系人 Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmEmployeeEmergencyContactMapper extends BaseMapperX<HrmEmployeeEmergencyContactDO> { |
| | | |
| | | default List<HrmEmployeeEmergencyContactDO> selectByEmployeeId(Long employeeId) { |
| | | return selectList(new LambdaQueryWrapperX<HrmEmployeeEmergencyContactDO>() |
| | | .eq(HrmEmployeeEmergencyContactDO::getEmployeeId, employeeId) |
| | | .orderByAsc(HrmEmployeeEmergencyContactDO::getSort)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeePageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * åå·¥ä¿¡æ¯ Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmEmployeeMapper extends BaseMapperX<HrmEmployeeDO> { |
| | | |
| | | default HrmEmployeeDO selectByPhone(String phone) { |
| | | return selectOne(HrmEmployeeDO::getPhone, phone); |
| | | } |
| | | |
| | | default HrmEmployeeDO selectByEmployeeNo(String employeeNo) { |
| | | return selectOne(HrmEmployeeDO::getEmployeeNo, employeeNo); |
| | | } |
| | | |
| | | default HrmEmployeeDO selectByUserId(Long userId) { |
| | | return selectOne(HrmEmployeeDO::getUserId, userId); |
| | | } |
| | | |
| | | default List<HrmEmployeeDO> selectByDeptId(Long deptId) { |
| | | return selectList(HrmEmployeeDO::getDeptId, deptId); |
| | | } |
| | | |
| | | default List<HrmEmployeeDO> selectByEmployeeStatus(Integer employeeStatus) { |
| | | return selectList(HrmEmployeeDO::getEmployeeStatus, employeeStatus); |
| | | } |
| | | |
| | | default PageResult<HrmEmployeeDO> selectPage(HrmEmployeePageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmEmployeeDO>() |
| | | .likeIfPresent(HrmEmployeeDO::getEmployeeNo, reqVO.getEmployeeNo()) |
| | | .likeIfPresent(HrmEmployeeDO::getName, reqVO.getName()) |
| | | .eqIfPresent(HrmEmployeeDO::getDeptId, reqVO.getDeptId()) |
| | | .eqIfPresent(HrmEmployeeDO::getEmployeeStatus, reqVO.getEmployeeStatus()) |
| | | .orderByDesc(HrmEmployeeDO::getId)); |
| | | } |
| | | |
| | | default List<HrmEmployeeDO> selectListByStatus(Integer employeeStatus) { |
| | | return selectList(new LambdaQueryWrapperX<HrmEmployeeDO>() |
| | | .eqIfPresent(HrmEmployeeDO::getEmployeeStatus, employeeStatus) |
| | | .orderByAsc(HrmEmployeeDO::getName)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeWorkHistoryDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å工工ä½ç»å Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmEmployeeWorkHistoryMapper extends BaseMapperX<HrmEmployeeWorkHistoryDO> { |
| | | |
| | | default List<HrmEmployeeWorkHistoryDO> selectByEmployeeId(Long employeeId) { |
| | | return selectList(HrmEmployeeWorkHistoryDO::getEmployeeId, employeeId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmEmployeeSalaryDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * åå·¥èªé
¬æ¡£æ¡ Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmEmployeeSalaryMapper extends BaseMapperX<HrmEmployeeSalaryDO> { |
| | | |
| | | default HrmEmployeeSalaryDO selectByUserIdAndEffectiveDate(Long userId, LocalDate effectiveDate) { |
| | | return selectOne(new LambdaQueryWrapperX<HrmEmployeeSalaryDO>() |
| | | .eq(HrmEmployeeSalaryDO::getUserId, userId) |
| | | .eq(HrmEmployeeSalaryDO::getEffectiveDate, effectiveDate)); |
| | | } |
| | | |
| | | default HrmEmployeeSalaryDO selectLatestByUserId(Long userId) { |
| | | return selectOne(new LambdaQueryWrapperX<HrmEmployeeSalaryDO>() |
| | | .eq(HrmEmployeeSalaryDO::getUserId, userId) |
| | | .eq(HrmEmployeeSalaryDO::getStatus, 0) |
| | | .orderByDesc(HrmEmployeeSalaryDO::getEffectiveDate) |
| | | .last("LIMIT 1")); |
| | | } |
| | | |
| | | default List<HrmEmployeeSalaryDO> selectListByUserId(Long userId) { |
| | | return selectList(new LambdaQueryWrapperX<HrmEmployeeSalaryDO>() |
| | | .eq(HrmEmployeeSalaryDO::getUserId, userId) |
| | | .orderByDesc(HrmEmployeeSalaryDO::getEffectiveDate)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmEmployeeSocialSecurityPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmEmployeeSocialSecurityDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å工社ä¿å
¬ç§¯éæ¡£æ¡ Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmEmployeeSocialSecurityMapper extends BaseMapperX<HrmEmployeeSocialSecurityDO> { |
| | | |
| | | default HrmEmployeeSocialSecurityDO selectLatestByUserId(Long userId) { |
| | | return selectOne(new LambdaQueryWrapperX<HrmEmployeeSocialSecurityDO>() |
| | | .eq(HrmEmployeeSocialSecurityDO::getUserId, userId) |
| | | .eq(HrmEmployeeSocialSecurityDO::getStatus, 0) |
| | | .orderByDesc(HrmEmployeeSocialSecurityDO::getEffectiveDate) |
| | | .last("LIMIT 1")); |
| | | } |
| | | |
| | | default List<HrmEmployeeSocialSecurityDO> selectListByUserId(Long userId) { |
| | | return selectList(new LambdaQueryWrapperX<HrmEmployeeSocialSecurityDO>() |
| | | .eq(HrmEmployeeSocialSecurityDO::getUserId, userId) |
| | | .orderByDesc(HrmEmployeeSocialSecurityDO::getEffectiveDate)); |
| | | } |
| | | |
| | | default PageResult<HrmEmployeeSocialSecurityDO> selectPage(HrmEmployeeSocialSecurityPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmEmployeeSocialSecurityDO>() |
| | | .eqIfPresent(HrmEmployeeSocialSecurityDO::getUserId, reqVO.getUserId()) |
| | | .eqIfPresent(HrmEmployeeSocialSecurityDO::getStatus, reqVO.getStatus()) |
| | | .eqIfPresent(HrmEmployeeSocialSecurityDO::getEffectiveDate, reqVO.getEffectiveDate()) |
| | | .orderByDesc(HrmEmployeeSocialSecurityDO::getId)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmLeaveTypeConfigDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 请åç±»åæ£æ¬¾é
ç½® Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmLeaveTypeConfigMapper extends BaseMapperX<HrmLeaveTypeConfigDO> { |
| | | |
| | | default List<HrmLeaveTypeConfigDO> selectList() { |
| | | return selectList(new LambdaQueryWrapperX<HrmLeaveTypeConfigDO>() |
| | | .orderByAsc(HrmLeaveTypeConfigDO::getLeaveType)); |
| | | } |
| | | |
| | | default HrmLeaveTypeConfigDO selectByLeaveType(Integer leaveType) { |
| | | return selectOne(HrmLeaveTypeConfigDO::getLeaveType, leaveType); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryCalculationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryCalculationDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èªé
¬æ ¸ç®è®°å½ Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmSalaryCalculationMapper extends BaseMapperX<HrmSalaryCalculationDO> { |
| | | |
| | | default PageResult<HrmSalaryCalculationDO> selectPage(HrmSalaryCalculationPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmSalaryCalculationDO>() |
| | | .likeIfPresent(HrmSalaryCalculationDO::getNo, reqVO.getNo()) |
| | | .eqIfPresent(HrmSalaryCalculationDO::getPeriod, reqVO.getPeriod()) |
| | | .eqIfPresent(HrmSalaryCalculationDO::getUserId, reqVO.getUserId()) |
| | | .eqIfPresent(HrmSalaryCalculationDO::getDeptId, reqVO.getDeptId()) |
| | | .eqIfPresent(HrmSalaryCalculationDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(HrmSalaryCalculationDO::getId)); |
| | | } |
| | | |
| | | default HrmSalaryCalculationDO selectByNo(String no) { |
| | | return selectOne(HrmSalaryCalculationDO::getNo, no); |
| | | } |
| | | |
| | | default List<HrmSalaryCalculationDO> selectListByUserIdAndPeriod(Long userId, String period) { |
| | | return selectList(new LambdaQueryWrapperX<HrmSalaryCalculationDO>() |
| | | .eq(HrmSalaryCalculationDO::getUserId, userId) |
| | | .eq(HrmSalaryCalculationDO::getPeriod, period)); |
| | | } |
| | | |
| | | default List<HrmSalaryCalculationDO> selectListByPeriod(String period) { |
| | | return selectList(new LambdaQueryWrapperX<HrmSalaryCalculationDO>() |
| | | .eq(HrmSalaryCalculationDO::getPeriod, period) |
| | | .orderByAsc(HrmSalaryCalculationDO::getUserId)); |
| | | } |
| | | |
| | | default List<HrmSalaryCalculationDO> selectListByPeriodAndDept(String period, Long deptId) { |
| | | return selectList(new LambdaQueryWrapperX<HrmSalaryCalculationDO>() |
| | | .eq(HrmSalaryCalculationDO::getPeriod, period) |
| | | .eqIfPresent(HrmSalaryCalculationDO::getDeptId, deptId) |
| | | .orderByAsc(HrmSalaryCalculationDO::getUserId)); |
| | | } |
| | | |
| | | default List<HrmSalaryCalculationDO> selectListByPeriodAndStatus(String period, Integer status) { |
| | | return selectList(new LambdaQueryWrapperX<HrmSalaryCalculationDO>() |
| | | .eq(HrmSalaryCalculationDO::getPeriod, period) |
| | | .eq(HrmSalaryCalculationDO::getStatus, status) |
| | | .orderByAsc(HrmSalaryCalculationDO::getUserId)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryPaymentDetailPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryPaymentDetailDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èªèµåæ¾æç» Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmSalaryPaymentDetailMapper extends BaseMapperX<HrmSalaryPaymentDetailDO> { |
| | | |
| | | default PageResult<HrmSalaryPaymentDetailDO> selectPage(HrmSalaryPaymentDetailPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmSalaryPaymentDetailDO>() |
| | | .eqIfPresent(HrmSalaryPaymentDetailDO::getPaymentId, reqVO.getPaymentId()) |
| | | .eqIfPresent(HrmSalaryPaymentDetailDO::getUserId, reqVO.getUserId()) |
| | | .eqIfPresent(HrmSalaryPaymentDetailDO::getDeptId, reqVO.getDeptId()) |
| | | .eqIfPresent(HrmSalaryPaymentDetailDO::getStatus, reqVO.getStatus()) |
| | | .orderByAsc(HrmSalaryPaymentDetailDO::getUserId)); |
| | | } |
| | | |
| | | default List<HrmSalaryPaymentDetailDO> selectListByPaymentId(Long paymentId) { |
| | | return selectList(HrmSalaryPaymentDetailDO::getPaymentId, paymentId); |
| | | } |
| | | |
| | | default List<HrmSalaryPaymentDetailDO> selectListByPaymentIdAndStatus(Long paymentId, Integer status) { |
| | | return selectList(new LambdaQueryWrapperX<HrmSalaryPaymentDetailDO>() |
| | | .eq(HrmSalaryPaymentDetailDO::getPaymentId, paymentId) |
| | | .eq(HrmSalaryPaymentDetailDO::getStatus, status)); |
| | | } |
| | | |
| | | default HrmSalaryPaymentDetailDO selectByCalculationId(Long calculationId) { |
| | | return selectOne(HrmSalaryPaymentDetailDO::getCalculationId, calculationId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryPaymentPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryPaymentDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * èªèµåæ¾å°è´¦ Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmSalaryPaymentMapper extends BaseMapperX<HrmSalaryPaymentDO> { |
| | | |
| | | default PageResult<HrmSalaryPaymentDO> selectPage(HrmSalaryPaymentPageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<HrmSalaryPaymentDO>() |
| | | .likeIfPresent(HrmSalaryPaymentDO::getNo, reqVO.getNo()) |
| | | .eqIfPresent(HrmSalaryPaymentDO::getPeriod, reqVO.getPeriod()) |
| | | .eqIfPresent(HrmSalaryPaymentDO::getStatus, reqVO.getStatus()) |
| | | .orderByDesc(HrmSalaryPaymentDO::getId)); |
| | | } |
| | | |
| | | default HrmSalaryPaymentDO selectByNo(String no) { |
| | | return selectOne(HrmSalaryPaymentDO::getNo, no); |
| | | } |
| | | |
| | | default HrmSalaryPaymentDO selectByPeriod(String period) { |
| | | return selectOne(new LambdaQueryWrapperX<HrmSalaryPaymentDO>() |
| | | .eq(HrmSalaryPaymentDO::getPeriod, period) |
| | | .orderByDesc(HrmSalaryPaymentDO::getId) |
| | | .last("LIMIT 1")); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryStructureDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èªé
Ⱦ Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmSalaryStructureMapper extends BaseMapperX<HrmSalaryStructureDO> { |
| | | |
| | | default List<HrmSalaryStructureDO> selectListByStatus(Integer status) { |
| | | return selectList(new LambdaQueryWrapperX<HrmSalaryStructureDO>() |
| | | .eqIfPresent(HrmSalaryStructureDO::getStatus, status) |
| | | .orderByAsc(HrmSalaryStructureDO::getName)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSocialSecurityConfigDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 社ä¿å
¬ç§¯éé
ç½® Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmSocialSecurityConfigMapper extends BaseMapperX<HrmSocialSecurityConfigDO> { |
| | | |
| | | default List<HrmSocialSecurityConfigDO> selectListByStatus(Integer status) { |
| | | return selectList(new LambdaQueryWrapperX<HrmSocialSecurityConfigDO>() |
| | | .eqIfPresent(HrmSocialSecurityConfigDO::getStatus, status) |
| | | .orderByDesc(HrmSocialSecurityConfigDO::getEffectiveDate)); |
| | | } |
| | | |
| | | default HrmSocialSecurityConfigDO selectLatestByEffectiveDate(LocalDate effectiveDate) { |
| | | return selectOne(new LambdaQueryWrapperX<HrmSocialSecurityConfigDO>() |
| | | .eq(HrmSocialSecurityConfigDO::getStatus, 0) |
| | | .le(HrmSocialSecurityConfigDO::getEffectiveDate, effectiveDate) |
| | | .orderByDesc(HrmSocialSecurityConfigDO::getEffectiveDate) |
| | | .last("LIMIT 1")); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSocialSecuritySchemeDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 社ä¿å
¬ç§¯éæ¹æ¡ Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmSocialSecuritySchemeMapper extends BaseMapperX<HrmSocialSecuritySchemeDO> { |
| | | |
| | | default List<HrmSocialSecuritySchemeDO> selectListByStatus(Integer status) { |
| | | return selectList(new LambdaQueryWrapperX<HrmSocialSecuritySchemeDO>() |
| | | .eqIfPresent(HrmSocialSecuritySchemeDO::getStatus, status) |
| | | .orderByDesc(HrmSocialSecuritySchemeDO::getEffectiveDate)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.mysql.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmTaxRateConfigDO; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 个ç¨ç¨çé
ç½® Mapper |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Mapper |
| | | public interface HrmTaxRateConfigMapper extends BaseMapperX<HrmTaxRateConfigDO> { |
| | | |
| | | default List<HrmTaxRateConfigDO> selectListByStatus(Integer status) { |
| | | return selectList(new LambdaQueryWrapperX<HrmTaxRateConfigDO>() |
| | | .eqIfPresent(HrmTaxRateConfigDO::getStatus, status) |
| | | .orderByAsc(HrmTaxRateConfigDO::getLevel)); |
| | | } |
| | | |
| | | default List<HrmTaxRateConfigDO> selectListByEffectiveDate(LocalDate effectiveDate) { |
| | | return selectList(new LambdaQueryWrapperX<HrmTaxRateConfigDO>() |
| | | .eq(HrmTaxRateConfigDO::getStatus, 0) |
| | | .le(HrmTaxRateConfigDO::getEffectiveDate, effectiveDate) |
| | | .orderByAsc(HrmTaxRateConfigDO::getLevel)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.redis; |
| | | |
| | | import cn.hutool.core.date.DatePattern; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.data.redis.core.StringRedisTemplate; |
| | | import org.springframework.stereotype.Repository; |
| | | |
| | | import java.time.Duration; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * HRM ç¼å·çæç Redis DAO |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Repository |
| | | public class HrmNoRedisDAO { |
| | | |
| | | /** |
| | | * åå·¥ç¼å·åç¼ |
| | | */ |
| | | public static final String EMPLOYEE_NO_PREFIX = "EMP"; |
| | | |
| | | /** |
| | | * èå¤å¼å¸¸ç³è¯·ç¼å·åç¼ |
| | | */ |
| | | public static final String ATTENDANCE_EXCEPTION_NO_PREFIX = "KQ"; |
| | | |
| | | /** |
| | | * èªé
¬æ ¸ç®ç¼å·åç¼ |
| | | */ |
| | | public static final String SALARY_CALCULATION_NO_PREFIX = "SC"; |
| | | |
| | | /** |
| | | * èªèµåæ¾ç¼å·åç¼ |
| | | */ |
| | | public static final String SALARY_PAYMENT_NO_PREFIX = "SF"; |
| | | |
| | | /** |
| | | * 请åç³è¯·ç¼å·åç¼ |
| | | */ |
| | | public static final String LEAVE_APPLICATION_NO_PREFIX = "LA"; |
| | | |
| | | /** |
| | | * è°å²ç³è¯·ç¼å·åç¼ |
| | | */ |
| | | public static final String TRANSFER_APPLICATION_NO_PREFIX = "TA"; |
| | | |
| | | /** |
| | | * 离èç³è¯·ç¼å·åç¼ |
| | | */ |
| | | public static final String RESIGNATION_APPLICATION_NO_PREFIX = "RA"; |
| | | |
| | | @Resource |
| | | private StringRedisTemplate stringRedisTemplate; |
| | | |
| | | /** |
| | | * çæåå·¥ç¼å·ï¼æ ¼å¼ï¼EMP + yyyyMMdd + 4ä½èªå¢ |
| | | * ä¾å¦ï¼EMP202401010001 |
| | | * |
| | | * @return åå·¥ç¼å· |
| | | */ |
| | | public String generateEmployeeNo() { |
| | | return generate(EMPLOYEE_NO_PREFIX, 4); |
| | | } |
| | | |
| | | /** |
| | | * çæè¯·åç³è¯·ç¼å·ï¼æ ¼å¼ï¼LA + yyyyMMdd + 4ä½èªå¢ |
| | | * ä¾å¦ï¼LA202401010001 |
| | | * |
| | | * @return 请åç³è¯·ç¼å· |
| | | */ |
| | | public String generateLeaveApplicationNo() { |
| | | return generate(LEAVE_APPLICATION_NO_PREFIX, 4); |
| | | } |
| | | |
| | | /** |
| | | * çæè°å²ç³è¯·ç¼å·ï¼æ ¼å¼ï¼TA + yyyyMMdd + 4ä½èªå¢ |
| | | * ä¾å¦ï¼TA202401010001 |
| | | * |
| | | * @return è°å²ç³è¯·ç¼å· |
| | | */ |
| | | public String generateTransferApplicationNo() { |
| | | return generate(TRANSFER_APPLICATION_NO_PREFIX, 4); |
| | | } |
| | | |
| | | /** |
| | | * çæç¦»èç³è¯·ç¼å·ï¼æ ¼å¼ï¼RA + yyyyMMdd + 4ä½èªå¢ |
| | | * ä¾å¦ï¼RA202401010001 |
| | | * |
| | | * @return 离èç³è¯·ç¼å· |
| | | */ |
| | | public String generateResignationApplicationNo() { |
| | | return generate(RESIGNATION_APPLICATION_NO_PREFIX, 4); |
| | | } |
| | | |
| | | /** |
| | | * çæèªé
¬æ ¸ç®ç¼å·ï¼æ ¼å¼ï¼SC + yyyyMMdd + 4ä½èªå¢ |
| | | * ä¾å¦ï¼SC202401010001 |
| | | * |
| | | * @return èªé
¬æ ¸ç®ç¼å· |
| | | */ |
| | | public String generateSalaryCalculationNo() { |
| | | return generate(SALARY_CALCULATION_NO_PREFIX, 4); |
| | | } |
| | | |
| | | /** |
| | | * çæèªèµåæ¾ç¼å·ï¼æ ¼å¼ï¼SF + yyyyMMdd + 4ä½èªå¢ |
| | | * ä¾å¦ï¼SF202401010001 |
| | | * |
| | | * @return èªèµåæ¾ç¼å· |
| | | */ |
| | | public String generateSalaryPaymentNo() { |
| | | return generate(SALARY_PAYMENT_NO_PREFIX, 4); |
| | | } |
| | | |
| | | /** |
| | | * çæç¼å· |
| | | * |
| | | * @param prefix åç¼ |
| | | * @param digits 使° |
| | | * @return ç¼å· |
| | | */ |
| | | public String generate(String prefix, int digits) { |
| | | String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATE_PATTERN); |
| | | String key = HrmRedisKeyConstants.NO + noPrefix; |
| | | Long no = stringRedisTemplate.opsForValue().increment(key); |
| | | // è®¾ç½®è¿ææ¶é´ 1 天 |
| | | stringRedisTemplate.expire(key, Duration.ofDays(1L)); |
| | | return noPrefix + String.format("%0" + digits + "d", no); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.dal.redis; |
| | | |
| | | /** |
| | | * HRM Redis Key 常é |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmRedisKeyConstants { |
| | | |
| | | /** |
| | | * ç¼å·çæç Key åç¼ |
| | | */ |
| | | String NO = "hrm:no:"; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmLeaveApplicationDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 请åç³è¯· Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmLeaveApplicationService { |
| | | |
| | | /** |
| | | * BPM 请åå®¡æ¹æµç¨æ è¯ |
| | | */ |
| | | String BPM_PROCESS_DEFINITION_KEY = "hrm_leave"; |
| | | |
| | | /** |
| | | * BPM 请å审æ¹åç±»ç¼ç |
| | | */ |
| | | String APPROVE_CATEGORY_CODE = "hrm_leave_approve"; |
| | | |
| | | /** |
| | | * å建请åç³è¯· |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç³è¯·ID |
| | | */ |
| | | Long createLeaveApplication(@Valid HrmLeaveApplicationSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°è¯·åç³è¯· |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateLeaveApplication(@Valid HrmLeaveApplicationSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤è¯·åç³è¯· |
| | | * |
| | | * @param id ç³è¯·ID |
| | | */ |
| | | void deleteLeaveApplication(Long id); |
| | | |
| | | /** |
| | | * è·å¾è¯·åç³è¯· |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @return 请åç³è¯· |
| | | */ |
| | | HrmLeaveApplicationDO getLeaveApplication(Long id); |
| | | |
| | | /** |
| | | * è·å¾è¯·åç³è¯·è¯¦æ
ï¼å«å
³èä¿¡æ¯ï¼ |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @return 请åç³è¯·è¯¦æ
|
| | | */ |
| | | HrmLeaveApplicationRespVO getLeaveApplicationDetail(Long id); |
| | | |
| | | /** |
| | | * è·å¾è¯·åç³è¯·å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return 请åç³è¯·å页 |
| | | */ |
| | | PageResult<HrmLeaveApplicationRespVO> getLeaveApplicationPage(HrmLeaveApplicationPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * æäº¤è¯·åç³è¯·å®¡æ¹ |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @param processDefinitionKey æµç¨å®ä¹Key |
| | | * @param userId æäº¤äººID |
| | | */ |
| | | void submitLeaveApplication(Long id, String processDefinitionKey, Long userId); |
| | | |
| | | /** |
| | | * è·åå¯ç¨çå®¡æ¹æµç¨å®ä¹å表 |
| | | * |
| | | * @return æµç¨å®ä¹å表 |
| | | */ |
| | | List<Map<String, Object>> getApproveProcessDefinitionList(); |
| | | |
| | | /** |
| | | * æ´æ°è¯·åç³è¯·å®¡æ¹ç¶æï¼BPM åè°ï¼ |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @param status 审æ¹ç¶æ |
| | | */ |
| | | void updateLeaveApplicationAuditStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * æ ¹æ®æµç¨å®ä¾IDè·å请åç³è¯· |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾ID |
| | | * @return 请åç³è¯· |
| | | */ |
| | | HrmLeaveApplicationDO getLeaveApplicationByProcessInstanceId(String processInstanceId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.approval; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmLeaveApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmLeaveApplicationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmLeaveApplicationMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmLeaveTypeEnum; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * 请åç³è¯· Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class HrmLeaveApplicationServiceImpl implements HrmLeaveApplicationService { |
| | | |
| | | @Resource |
| | | private HrmLeaveApplicationMapper leaveApplicationMapper; |
| | | @Resource |
| | | private HrmNoRedisDAO noRedisDAO; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | @Resource |
| | | private BpmCategoryService bpmCategoryService; |
| | | @Resource |
| | | private BpmProcessDefinitionService bpmProcessDefinitionService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createLeaveApplication(HrmLeaveApplicationSaveReqVO createReqVO) { |
| | | // 1. çæç³è¯·åå· |
| | | String no = generateUniqueNo(); |
| | | // 2. 设置ç³è¯·äººä¿¡æ¯ |
| | | Long userId = createReqVO.getUserId(); |
| | | if (userId == null) { |
| | | userId = getCurrentUserId(); |
| | | } |
| | | AdminUserRespDTO user = adminUserApi.getUser(userId); |
| | | if (user == null) { |
| | | userId = getCurrentUserId(); |
| | | } |
| | | // 3. æå
¥ |
| | | HrmLeaveApplicationDO application = BeanUtils.toBean(createReqVO, HrmLeaveApplicationDO.class); |
| | | application.setNo(no); |
| | | application.setUserId(userId); |
| | | application.setDeptId(createReqVO.getDeptId() != null ? createReqVO.getDeptId() : user.getDeptId()); |
| | | application.setStatus(HrmAuditStatusEnum.DRAFT.getStatus()); |
| | | leaveApplicationMapper.insert(application); |
| | | return application.getId(); |
| | | } |
| | | |
| | | private Long getCurrentUserId() { |
| | | // TODO: è·åå½åç»å½ç¨æ·ID |
| | | return 1L; |
| | | } |
| | | |
| | | private String generateUniqueNo() { |
| | | String no = noRedisDAO.generateLeaveApplicationNo(); |
| | | if (leaveApplicationMapper.selectByNo(no) != null) { |
| | | return generateUniqueNo(); |
| | | } |
| | | return no; |
| | | } |
| | | |
| | | @Override |
| | | public void updateLeaveApplication(HrmLeaveApplicationSaveReqVO updateReqVO) { |
| | | // æ ¡éªåå¨ |
| | | HrmLeaveApplicationDO application = validateLeaveApplicationExists(updateReqVO.getId()); |
| | | // æ ¡éªç¶æä¸ºè稿æå®¡æ¹ä¸ |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus()) |
| | | && !Objects.equals(application.getStatus(), HrmAuditStatusEnum.PROCESS.getStatus())) { |
| | | throw exception(LEAVE_APPLICATION_UPDATE_FAIL_NOT_DRAFT); |
| | | } |
| | | // æ´æ° |
| | | HrmLeaveApplicationDO updateObj = BeanUtils.toBean(updateReqVO, HrmLeaveApplicationDO.class); |
| | | leaveApplicationMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteLeaveApplication(Long id) { |
| | | // æ ¡éªåå¨ |
| | | HrmLeaveApplicationDO application = validateLeaveApplicationExists(id); |
| | | // æ ¡éªç¶æä¸ºè稿 |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) { |
| | | throw exception(LEAVE_APPLICATION_UPDATE_FAIL_NOT_DRAFT); |
| | | } |
| | | // å é¤ |
| | | leaveApplicationMapper.deleteById(id); |
| | | } |
| | | |
| | | private HrmLeaveApplicationDO validateLeaveApplicationExists(Long id) { |
| | | HrmLeaveApplicationDO application = leaveApplicationMapper.selectById(id); |
| | | if (application == null) { |
| | | throw exception(LEAVE_APPLICATION_NOT_EXISTS); |
| | | } |
| | | return application; |
| | | } |
| | | |
| | | @Override |
| | | public HrmLeaveApplicationDO getLeaveApplication(Long id) { |
| | | return leaveApplicationMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public HrmLeaveApplicationRespVO getLeaveApplicationDetail(Long id) { |
| | | HrmLeaveApplicationDO application = getLeaveApplication(id); |
| | | if (application == null) { |
| | | return null; |
| | | } |
| | | HrmLeaveApplicationRespVO respVO = BeanUtils.toBean(application, HrmLeaveApplicationRespVO.class); |
| | | // å¡«å
ç¨æ·åç§° |
| | | if (application.getUserId() != null) { |
| | | AdminUserRespDTO user = adminUserApi.getUser(application.getUserId()); |
| | | if (user != null) { |
| | | respVO.setUserName(user.getNickname()); |
| | | } |
| | | } |
| | | // å¡«å
é¨é¨åç§° |
| | | if (application.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(application.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | // å¡«å
请åç±»ååç§° |
| | | respVO.setLeaveTypeName(HrmLeaveTypeEnum.getNameByStatus(application.getLeaveType())); |
| | | // å¡«å
审æ¹ç¶æåç§° |
| | | respVO.setStatusName(HrmAuditStatusEnum.getNameByStatus(application.getStatus())); |
| | | return respVO; |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<HrmLeaveApplicationRespVO> getLeaveApplicationPage(HrmLeaveApplicationPageReqVO pageReqVO) { |
| | | PageResult<HrmLeaveApplicationDO> pageResult = leaveApplicationMapper.selectPage(pageReqVO); |
| | | if (pageResult.getList().isEmpty()) { |
| | | return new PageResult<>(Collections.emptyList(), pageResult.getTotal()); |
| | | } |
| | | // å¡«å
å
³èä¿¡æ¯ |
| | | Set<Long> userIds = pageResult.getList().stream() |
| | | .map(HrmLeaveApplicationDO::getUserId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Set<Long> deptIds = pageResult.getList().stream() |
| | | .map(HrmLeaveApplicationDO::getDeptId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| | | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(deptIds); |
| | | List<HrmLeaveApplicationRespVO> list = pageResult.getList().stream().map(app -> { |
| | | HrmLeaveApplicationRespVO vo = BeanUtils.toBean(app, HrmLeaveApplicationRespVO.class); |
| | | if (app.getUserId() != null && userMap.containsKey(app.getUserId())) { |
| | | vo.setUserName(userMap.get(app.getUserId()).getNickname()); |
| | | } |
| | | if (app.getDeptId() != null && deptMap.containsKey(app.getDeptId())) { |
| | | vo.setDeptName(deptMap.get(app.getDeptId()).getName()); |
| | | } |
| | | vo.setLeaveTypeName(HrmLeaveTypeEnum.getNameByStatus(app.getLeaveType())); |
| | | vo.setStatusName(HrmAuditStatusEnum.getNameByStatus(app.getStatus())); |
| | | return vo; |
| | | }).collect(Collectors.toList()); |
| | | return new PageResult<>(list, pageResult.getTotal()); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitLeaveApplication(Long id, String processDefinitionKey, Long userId) { |
| | | // 1. æ ¡éªè¯·åç³è¯·æ¯å¦åå¨ |
| | | HrmLeaveApplicationDO application = validateLeaveApplicationExists(id); |
| | | if (ObjUtil.notEqual(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) { |
| | | throw exception(LEAVE_APPLICATION_SUBMIT_FAIL_NOT_DRAFT); |
| | | } |
| | | |
| | | // 2. æ ¡éªåç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | validateApproveCategoryAndProcessDefinition(); |
| | | |
| | | // 3. æ ¡éªä¼ å
¥çæµç¨å®ä¹ Key æ¯å¦å±äºè¯¥åç±»ä¸å¤äºæ¿æ´»ç¶æ |
| | | ProcessDefinition processDefinition = bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey); |
| | | if (processDefinition == null) { |
| | | throw exception(LEAVE_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | |
| | | // 4. åå»ºå®¡æ¹æµç¨å®ä¾ |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey).setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 5. æ´æ°è¯·åç³è¯·å·¥ä½æµç¼å· |
| | | leaveApplicationMapper.updateById(HrmLeaveApplicationDO.builder() |
| | | .id(id) |
| | | .processInstanceId(processInstanceId) |
| | | .status(HrmAuditStatusEnum.PROCESS.getStatus()) |
| | | .build()); |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éª BPM 请å审æ¹åç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | */ |
| | | private void validateApproveCategoryAndProcessDefinition() { |
| | | // 1. æ ¡éªåç±»æ¯å¦åå¨ |
| | | List<String> codes = Collections.singletonList(APPROVE_CATEGORY_CODE); |
| | | Map<String, ?> categoryMap = bpmCategoryService.getCategoryMap(codes); |
| | | if (!categoryMap.containsKey(APPROVE_CATEGORY_CODE)) { |
| | | throw exception(LEAVE_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | |
| | | // 2. æ ¡éªåç±»ä¸æ¯å¦æå¯ç¨çæµç¨å®ä¹ |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(APPROVE_CATEGORY_CODE); |
| | | if (CollUtil.isEmpty(definitionInfoList)) { |
| | | throw exception(LEAVE_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | |
| | | // 3. æ ¡éªæ¯å¦ææ¿æ´»ç¶æçæµç¨å®ä¹ |
| | | Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId); |
| | | List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds); |
| | | boolean hasActiveDefinition = processDefinitions.stream() |
| | | .anyMatch(pd -> !pd.isSuspended()); |
| | | if (!hasActiveDefinition) { |
| | | throw exception(LEAVE_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> getApproveProcessDefinitionList() { |
| | | // 1. æ ¡éªåç±»åæµç¨å®ä¹æ¯å¦åå¨ |
| | | validateApproveCategoryAndProcessDefinition(); |
| | | |
| | | // 2. è·ååç±»ä¸çæµç¨å®ä¹ä¿¡æ¯ |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(APPROVE_CATEGORY_CODE); |
| | | |
| | | // 3. è·åæµç¨å®ä¹è¯¦æ
|
| | | Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId); |
| | | List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds); |
| | | |
| | | // 4. è¿æ»¤ï¼åªä¿çæ¿æ´»ç¶æï¼ä¸ç¸å key åªä¿çææ°çæ¬ |
| | | Map<String, ProcessDefinition> latestVersionMap = new HashMap<>(); |
| | | for (ProcessDefinition pd : processDefinitions) { |
| | | if (pd.isSuspended()) { |
| | | continue; |
| | | } |
| | | ProcessDefinition existing = latestVersionMap.get(pd.getKey()); |
| | | if (existing == null || pd.getVersion() > existing.getVersion()) { |
| | | latestVersionMap.put(pd.getKey(), pd); |
| | | } |
| | | } |
| | | |
| | | // 5. è¿åæµç¨å®ä¹å表 |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | for (ProcessDefinition pd : latestVersionMap.values()) { |
| | | Map<String, Object> item = new HashMap<>(); |
| | | item.put("id", pd.getId()); |
| | | item.put("key", pd.getKey()); |
| | | item.put("name", pd.getName()); |
| | | item.put("version", pd.getVersion()); |
| | | result.add(item); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | public void updateLeaveApplicationAuditStatus(Long id, Integer status) { |
| | | // æ ¡éªåå¨ |
| | | HrmLeaveApplicationDO application = validateLeaveApplicationExists(id); |
| | | // æ ¡éªç¶æä¸ºå®¡æ¹ä¸ |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.PROCESS.getStatus())) { |
| | | log.error("[updateLeaveApplicationAuditStatus][application({}) ä¸å¤äºå®¡æ¹ä¸ï¼æ æ³æ´æ°å®¡æ¹ç»æ({})]", |
| | | id, status); |
| | | throw exception(LEAVE_APPLICATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS); |
| | | } |
| | | // æ´æ°ç¶æ |
| | | leaveApplicationMapper.updateById(HrmLeaveApplicationDO.builder() |
| | | .id(id) |
| | | .status(status) |
| | | .approveTime(java.time.LocalDateTime.now()) |
| | | .build()); |
| | | } |
| | | |
| | | @Override |
| | | public HrmLeaveApplicationDO getLeaveApplicationByProcessInstanceId(String processInstanceId) { |
| | | return leaveApplicationMapper.selectByProcessInstanceId(processInstanceId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmResignationApplicationDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 离èç³è¯· Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmResignationApplicationService { |
| | | |
| | | /** |
| | | * BPM 离èå®¡æ¹æµç¨æ è¯ |
| | | */ |
| | | String BPM_PROCESS_DEFINITION_KEY = "hrm_resignation"; |
| | | |
| | | /** |
| | | * BPM 离è审æ¹åç±»ç¼ç |
| | | */ |
| | | String APPROVE_CATEGORY_CODE = "hrm_resignation_approve"; |
| | | |
| | | /** |
| | | * å建离èç³è¯· |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç³è¯·ID |
| | | */ |
| | | Long createResignationApplication(@Valid HrmResignationApplicationSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°ç¦»èç³è¯· |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateResignationApplication(@Valid HrmResignationApplicationSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤ç¦»èç³è¯· |
| | | * |
| | | * @param id ç³è¯·ID |
| | | */ |
| | | void deleteResignationApplication(Long id); |
| | | |
| | | /** |
| | | * è·å¾ç¦»èç³è¯· |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @return 离èç³è¯· |
| | | */ |
| | | HrmResignationApplicationDO getResignationApplication(Long id); |
| | | |
| | | /** |
| | | * è·å¾ç¦»èç³è¯·è¯¦æ
ï¼å«å
³èä¿¡æ¯ï¼ |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @return 离èç³è¯·è¯¦æ
|
| | | */ |
| | | HrmResignationApplicationRespVO getResignationApplicationDetail(Long id); |
| | | |
| | | /** |
| | | * è·å¾ç¦»èç³è¯·å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return 离èç³è¯·å页 |
| | | */ |
| | | PageResult<HrmResignationApplicationRespVO> getResignationApplicationPage(HrmResignationApplicationPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * æäº¤ç¦»èç³è¯·å®¡æ¹ |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @param processDefinitionKey æµç¨å®ä¹Key |
| | | * @param userId æäº¤äººID |
| | | */ |
| | | void submitResignationApplication(Long id, String processDefinitionKey, Long userId); |
| | | |
| | | /** |
| | | * è·åå¯ç¨çå®¡æ¹æµç¨å®ä¹å表 |
| | | * |
| | | * @return æµç¨å®ä¹å表 |
| | | */ |
| | | List<Map<String, Object>> getApproveProcessDefinitionList(); |
| | | |
| | | /** |
| | | * æ´æ°ç¦»èç³è¯·å®¡æ¹ç¶æï¼BPM åè°ï¼ |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @param status 审æ¹ç¶æ |
| | | */ |
| | | void updateResignationApplicationAuditStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * æ ¹æ®æµç¨å®ä¾IDè·å离èç³è¯· |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾ID |
| | | * @return 离èç³è¯· |
| | | */ |
| | | HrmResignationApplicationDO getResignationApplicationByProcessInstanceId(String processInstanceId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.approval; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmResignationApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmResignationApplicationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmResignationApplicationMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmResignationTypeEnum; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | import java.util.stream.Stream; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * 离èç³è¯· Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class HrmResignationApplicationServiceImpl implements HrmResignationApplicationService { |
| | | |
| | | private static final Integer HANDOVER_STATUS_NOT_STARTED = 0; |
| | | private static final Integer HANDOVER_STATUS_IN_PROGRESS = 10; |
| | | private static final Integer HANDOVER_STATUS_COMPLETED = 20; |
| | | |
| | | @Resource |
| | | private HrmResignationApplicationMapper resignationApplicationMapper; |
| | | @Resource |
| | | private HrmNoRedisDAO noRedisDAO; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | @Resource |
| | | private BpmCategoryService bpmCategoryService; |
| | | @Resource |
| | | private BpmProcessDefinitionService bpmProcessDefinitionService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createResignationApplication(HrmResignationApplicationSaveReqVO createReqVO) { |
| | | Long userId = createReqVO.getUserId(); |
| | | if (userId == null) { |
| | | userId = getCurrentUserId(); |
| | | } |
| | | HrmResignationApplicationDO existing = resignationApplicationMapper.selectByUserIdAndStatusNot(userId, |
| | | HrmAuditStatusEnum.CANCEL.getStatus()); |
| | | if (existing != null) { |
| | | throw exception(RESIGNATION_APPLICATION_EXISTS); |
| | | } |
| | | String no = generateUniqueNo(); |
| | | AdminUserRespDTO user = adminUserApi.getUser(userId); |
| | | if (user == null) { |
| | | userId = getCurrentUserId(); |
| | | } |
| | | HrmResignationApplicationDO application = BeanUtils.toBean(createReqVO, HrmResignationApplicationDO.class); |
| | | application.setNo(no); |
| | | application.setUserId(userId); |
| | | application.setDeptId(createReqVO.getDeptId() != null ? createReqVO.getDeptId() : user.getDeptId()); |
| | | application.setStatus(HrmAuditStatusEnum.DRAFT.getStatus()); |
| | | application.setHandoverStatus(HANDOVER_STATUS_NOT_STARTED); |
| | | resignationApplicationMapper.insert(application); |
| | | return application.getId(); |
| | | } |
| | | |
| | | private Long getCurrentUserId() { |
| | | return 1L; |
| | | } |
| | | |
| | | private String generateUniqueNo() { |
| | | String no = noRedisDAO.generateResignationApplicationNo(); |
| | | if (resignationApplicationMapper.selectByNo(no) != null) { |
| | | return generateUniqueNo(); |
| | | } |
| | | return no; |
| | | } |
| | | |
| | | @Override |
| | | public void updateResignationApplication(HrmResignationApplicationSaveReqVO updateReqVO) { |
| | | HrmResignationApplicationDO application = validateResignationApplicationExists(updateReqVO.getId()); |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) { |
| | | throw exception(RESIGNATION_APPLICATION_UPDATE_FAIL_NOT_DRAFT); |
| | | } |
| | | HrmResignationApplicationDO updateObj = BeanUtils.toBean(updateReqVO, HrmResignationApplicationDO.class); |
| | | resignationApplicationMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteResignationApplication(Long id) { |
| | | HrmResignationApplicationDO application = validateResignationApplicationExists(id); |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) { |
| | | throw exception(RESIGNATION_APPLICATION_UPDATE_FAIL_NOT_DRAFT); |
| | | } |
| | | resignationApplicationMapper.deleteById(id); |
| | | } |
| | | |
| | | private HrmResignationApplicationDO validateResignationApplicationExists(Long id) { |
| | | HrmResignationApplicationDO application = resignationApplicationMapper.selectById(id); |
| | | if (application == null) { |
| | | throw exception(RESIGNATION_APPLICATION_NOT_EXISTS); |
| | | } |
| | | return application; |
| | | } |
| | | |
| | | @Override |
| | | public HrmResignationApplicationDO getResignationApplication(Long id) { |
| | | return resignationApplicationMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public HrmResignationApplicationRespVO getResignationApplicationDetail(Long id) { |
| | | HrmResignationApplicationDO application = getResignationApplication(id); |
| | | if (application == null) { |
| | | return null; |
| | | } |
| | | HrmResignationApplicationRespVO respVO = BeanUtils.toBean(application, HrmResignationApplicationRespVO.class); |
| | | fillUserNames(respVO, application); |
| | | if (application.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(application.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | respVO.setResignationTypeName(HrmResignationTypeEnum.getNameByStatus(application.getResignationType())); |
| | | respVO.setHandoverStatusName(getHandoverStatusName(application.getHandoverStatus())); |
| | | respVO.setStatusName(HrmAuditStatusEnum.getNameByStatus(application.getStatus())); |
| | | return respVO; |
| | | } |
| | | |
| | | private void fillUserNames(HrmResignationApplicationRespVO respVO, HrmResignationApplicationDO application) { |
| | | Set<Long> userIds = Set.of(application.getUserId(), application.getHandoverUserId()) |
| | | .stream().filter(Objects::nonNull).collect(Collectors.toSet()); |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| | | if (application.getUserId() != null && userMap.containsKey(application.getUserId())) { |
| | | respVO.setUserName(userMap.get(application.getUserId()).getNickname()); |
| | | } |
| | | if (application.getHandoverUserId() != null && userMap.containsKey(application.getHandoverUserId())) { |
| | | respVO.setHandoverUserName(userMap.get(application.getHandoverUserId()).getNickname()); |
| | | } |
| | | } |
| | | |
| | | private String getHandoverStatusName(Integer handoverStatus) { |
| | | if (handoverStatus == null) { |
| | | return ""; |
| | | } |
| | | if (Objects.equals(handoverStatus, HANDOVER_STATUS_NOT_STARTED)) { |
| | | return "æªå¼å§"; |
| | | } |
| | | if (Objects.equals(handoverStatus, HANDOVER_STATUS_IN_PROGRESS)) { |
| | | return "è¿è¡ä¸"; |
| | | } |
| | | if (Objects.equals(handoverStatus, HANDOVER_STATUS_COMPLETED)) { |
| | | return "已宿"; |
| | | } |
| | | return ""; |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<HrmResignationApplicationRespVO> getResignationApplicationPage(HrmResignationApplicationPageReqVO pageReqVO) { |
| | | PageResult<HrmResignationApplicationDO> pageResult = resignationApplicationMapper.selectPage(pageReqVO); |
| | | if (pageResult.getList().isEmpty()) { |
| | | return new PageResult<>(Collections.emptyList(), pageResult.getTotal()); |
| | | } |
| | | Set<Long> userIds = pageResult.getList().stream() |
| | | .flatMap(app -> Stream.of(app.getUserId(), app.getHandoverUserId())) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| | | Set<Long> deptIds = pageResult.getList().stream() |
| | | .map(HrmResignationApplicationDO::getDeptId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(deptIds); |
| | | List<HrmResignationApplicationRespVO> list = pageResult.getList().stream().map(app -> { |
| | | HrmResignationApplicationRespVO vo = BeanUtils.toBean(app, HrmResignationApplicationRespVO.class); |
| | | if (app.getUserId() != null && userMap.containsKey(app.getUserId())) { |
| | | vo.setUserName(userMap.get(app.getUserId()).getNickname()); |
| | | } |
| | | if (app.getHandoverUserId() != null && userMap.containsKey(app.getHandoverUserId())) { |
| | | vo.setHandoverUserName(userMap.get(app.getHandoverUserId()).getNickname()); |
| | | } |
| | | if (app.getDeptId() != null && deptMap.containsKey(app.getDeptId())) { |
| | | vo.setDeptName(deptMap.get(app.getDeptId()).getName()); |
| | | } |
| | | vo.setResignationTypeName(HrmResignationTypeEnum.getNameByStatus(app.getResignationType())); |
| | | vo.setHandoverStatusName(getHandoverStatusName(app.getHandoverStatus())); |
| | | vo.setStatusName(HrmAuditStatusEnum.getNameByStatus(app.getStatus())); |
| | | return vo; |
| | | }).collect(Collectors.toList()); |
| | | return new PageResult<>(list, pageResult.getTotal()); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitResignationApplication(Long id, String processDefinitionKey, Long userId) { |
| | | HrmResignationApplicationDO application = validateResignationApplicationExists(id); |
| | | if (ObjUtil.notEqual(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) { |
| | | throw exception(RESIGNATION_APPLICATION_SUBMIT_FAIL_NOT_DRAFT); |
| | | } |
| | | validateApproveCategoryAndProcessDefinition(); |
| | | ProcessDefinition processDefinition = bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey); |
| | | if (processDefinition == null) { |
| | | throw exception(RESIGNATION_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey).setBusinessKey(String.valueOf(id))); |
| | | resignationApplicationMapper.updateById(HrmResignationApplicationDO.builder() |
| | | .id(id) |
| | | .processInstanceId(processInstanceId) |
| | | .status(HrmAuditStatusEnum.PROCESS.getStatus()) |
| | | .build()); |
| | | } |
| | | |
| | | private void validateApproveCategoryAndProcessDefinition() { |
| | | List<String> codes = Collections.singletonList(APPROVE_CATEGORY_CODE); |
| | | Map<String, ?> categoryMap = bpmCategoryService.getCategoryMap(codes); |
| | | if (!categoryMap.containsKey(APPROVE_CATEGORY_CODE)) { |
| | | throw exception(RESIGNATION_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(APPROVE_CATEGORY_CODE); |
| | | if (CollUtil.isEmpty(definitionInfoList)) { |
| | | throw exception(RESIGNATION_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId); |
| | | List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds); |
| | | boolean hasActiveDefinition = processDefinitions.stream().anyMatch(pd -> !pd.isSuspended()); |
| | | if (!hasActiveDefinition) { |
| | | throw exception(RESIGNATION_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> getApproveProcessDefinitionList() { |
| | | validateApproveCategoryAndProcessDefinition(); |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(APPROVE_CATEGORY_CODE); |
| | | Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId); |
| | | List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds); |
| | | Map<String, ProcessDefinition> latestVersionMap = new HashMap<>(); |
| | | for (ProcessDefinition pd : processDefinitions) { |
| | | if (pd.isSuspended()) continue; |
| | | ProcessDefinition existing = latestVersionMap.get(pd.getKey()); |
| | | if (existing == null || pd.getVersion() > existing.getVersion()) { |
| | | latestVersionMap.put(pd.getKey(), pd); |
| | | } |
| | | } |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | for (ProcessDefinition pd : latestVersionMap.values()) { |
| | | Map<String, Object> item = new HashMap<>(); |
| | | item.put("id", pd.getId()); |
| | | item.put("key", pd.getKey()); |
| | | item.put("name", pd.getName()); |
| | | item.put("version", pd.getVersion()); |
| | | result.add(item); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | public void updateResignationApplicationAuditStatus(Long id, Integer status) { |
| | | HrmResignationApplicationDO application = validateResignationApplicationExists(id); |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.PROCESS.getStatus())) { |
| | | log.error("[updateResignationApplicationAuditStatus][application({}) ä¸å¤äºå®¡æ¹ä¸ï¼æ æ³æ´æ°å®¡æ¹ç»æ({})]", id, status); |
| | | throw exception(RESIGNATION_APPLICATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS); |
| | | } |
| | | resignationApplicationMapper.updateById(HrmResignationApplicationDO.builder() |
| | | .id(id) |
| | | .status(status) |
| | | .approveTime(java.time.LocalDateTime.now()) |
| | | .build()); |
| | | } |
| | | |
| | | @Override |
| | | public HrmResignationApplicationDO getResignationApplicationByProcessInstanceId(String processInstanceId) { |
| | | return resignationApplicationMapper.selectByProcessInstanceId(processInstanceId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.approval; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmTransferApplicationDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * è°å²ç³è¯· Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmTransferApplicationService { |
| | | |
| | | /** |
| | | * BPM è°å²å®¡æ¹æµç¨æ è¯ |
| | | */ |
| | | String BPM_PROCESS_DEFINITION_KEY = "hrm_transfer"; |
| | | |
| | | /** |
| | | * BPM è°å²å®¡æ¹åç±»ç¼ç |
| | | */ |
| | | String APPROVE_CATEGORY_CODE = "hrm_transfer_approve"; |
| | | |
| | | /** |
| | | * å建è°å²ç³è¯· |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return ç³è¯·ID |
| | | */ |
| | | Long createTransferApplication(@Valid HrmTransferApplicationSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°è°å²ç³è¯· |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateTransferApplication(@Valid HrmTransferApplicationSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤è°å²ç³è¯· |
| | | * |
| | | * @param id ç³è¯·ID |
| | | */ |
| | | void deleteTransferApplication(Long id); |
| | | |
| | | /** |
| | | * è·å¾è°å²ç³è¯· |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @return è°å²ç³è¯· |
| | | */ |
| | | HrmTransferApplicationDO getTransferApplication(Long id); |
| | | |
| | | /** |
| | | * è·å¾è°å²ç³è¯·è¯¦æ
ï¼å«å
³èä¿¡æ¯ï¼ |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @return è°å²ç³è¯·è¯¦æ
|
| | | */ |
| | | HrmTransferApplicationRespVO getTransferApplicationDetail(Long id); |
| | | |
| | | /** |
| | | * è·å¾è°å²ç³è¯·å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return è°å²ç³è¯·å页 |
| | | */ |
| | | PageResult<HrmTransferApplicationRespVO> getTransferApplicationPage(HrmTransferApplicationPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * æäº¤è°å²ç³è¯·å®¡æ¹ |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @param processDefinitionKey æµç¨å®ä¹Key |
| | | * @param userId æäº¤äººID |
| | | */ |
| | | void submitTransferApplication(Long id, String processDefinitionKey, Long userId); |
| | | |
| | | /** |
| | | * è·åå¯ç¨çå®¡æ¹æµç¨å®ä¹å表 |
| | | * |
| | | * @return æµç¨å®ä¹å表 |
| | | */ |
| | | List<Map<String, Object>> getApproveProcessDefinitionList(); |
| | | |
| | | /** |
| | | * æ´æ°è°å²ç³è¯·å®¡æ¹ç¶æï¼BPM åè°ï¼ |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @param status 审æ¹ç¶æ |
| | | */ |
| | | void updateTransferApplicationAuditStatus(Long id, Integer status); |
| | | |
| | | /** |
| | | * æ ¹æ®æµç¨å®ä¾IDè·åè°å²ç³è¯· |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾ID |
| | | * @return è°å²ç³è¯· |
| | | */ |
| | | HrmTransferApplicationDO getTransferApplicationByProcessInstanceId(String processInstanceId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.approval; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmTransferApplicationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmTransferApplicationMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmTransferTypeEnum; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.PostApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | import java.util.stream.Stream; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * è°å²ç³è¯· Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class HrmTransferApplicationServiceImpl implements HrmTransferApplicationService { |
| | | |
| | | @Resource |
| | | private HrmTransferApplicationMapper transferApplicationMapper; |
| | | @Resource |
| | | private HrmNoRedisDAO noRedisDAO; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | @Resource |
| | | private PostApi postApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | @Resource |
| | | private BpmCategoryService bpmCategoryService; |
| | | @Resource |
| | | private BpmProcessDefinitionService bpmProcessDefinitionService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createTransferApplication(HrmTransferApplicationSaveReqVO createReqVO) { |
| | | // 1. æ ¡éªç®æ é¨é¨ä¸åé¨é¨ä¸è½ç¸å |
| | | if (Objects.equals(createReqVO.getTargetDeptId(), createReqVO.getCurrentDeptId())) { |
| | | throw exception(TRANSFER_APPLICATION_SAME_DEPT); |
| | | } |
| | | // 2. æ ¡éªç®æ å²ä½ä¸åå²ä½ä¸è½ç¸å |
| | | if (Objects.equals(createReqVO.getTargetPostId(), createReqVO.getCurrentPostId())) { |
| | | throw exception(TRANSFER_APPLICATION_SAME_POST); |
| | | } |
| | | // 3. çæç³è¯·åå· |
| | | String no = generateUniqueNo(); |
| | | // 4. 设置ç³è¯·äººä¿¡æ¯ |
| | | Long userId = createReqVO.getUserId(); |
| | | if (userId == null) { |
| | | userId = getCurrentUserId(); |
| | | } |
| | | AdminUserRespDTO user = adminUserApi.getUser(userId); |
| | | if (user == null) { |
| | | userId = getCurrentUserId(); |
| | | } |
| | | // 5. æå
¥ |
| | | HrmTransferApplicationDO application = BeanUtils.toBean(createReqVO, HrmTransferApplicationDO.class); |
| | | application.setNo(no); |
| | | application.setUserId(userId); |
| | | application.setStatus(HrmAuditStatusEnum.DRAFT.getStatus()); |
| | | transferApplicationMapper.insert(application); |
| | | return application.getId(); |
| | | } |
| | | |
| | | private Long getCurrentUserId() { |
| | | return 1L; |
| | | } |
| | | |
| | | private String generateUniqueNo() { |
| | | String no = noRedisDAO.generateTransferApplicationNo(); |
| | | if (transferApplicationMapper.selectByNo(no) != null) { |
| | | return generateUniqueNo(); |
| | | } |
| | | return no; |
| | | } |
| | | |
| | | @Override |
| | | public void updateTransferApplication(HrmTransferApplicationSaveReqVO updateReqVO) { |
| | | HrmTransferApplicationDO application = validateTransferApplicationExists(updateReqVO.getId()); |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus()) |
| | | && !Objects.equals(application.getStatus(), HrmAuditStatusEnum.PROCESS.getStatus())) { |
| | | throw exception(TRANSFER_APPLICATION_UPDATE_FAIL_NOT_DRAFT); |
| | | } |
| | | if (Objects.equals(updateReqVO.getTargetDeptId(), updateReqVO.getCurrentDeptId())) { |
| | | throw exception(TRANSFER_APPLICATION_SAME_DEPT); |
| | | } |
| | | if (Objects.equals(updateReqVO.getTargetPostId(), updateReqVO.getCurrentPostId())) { |
| | | throw exception(TRANSFER_APPLICATION_SAME_POST); |
| | | } |
| | | HrmTransferApplicationDO updateObj = BeanUtils.toBean(updateReqVO, HrmTransferApplicationDO.class); |
| | | transferApplicationMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteTransferApplication(Long id) { |
| | | HrmTransferApplicationDO application = validateTransferApplicationExists(id); |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) { |
| | | throw exception(TRANSFER_APPLICATION_UPDATE_FAIL_NOT_DRAFT); |
| | | } |
| | | transferApplicationMapper.deleteById(id); |
| | | } |
| | | |
| | | private HrmTransferApplicationDO validateTransferApplicationExists(Long id) { |
| | | HrmTransferApplicationDO application = transferApplicationMapper.selectById(id); |
| | | if (application == null) { |
| | | throw exception(TRANSFER_APPLICATION_NOT_EXISTS); |
| | | } |
| | | return application; |
| | | } |
| | | |
| | | @Override |
| | | public HrmTransferApplicationDO getTransferApplication(Long id) { |
| | | return transferApplicationMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public HrmTransferApplicationRespVO getTransferApplicationDetail(Long id) { |
| | | HrmTransferApplicationDO application = getTransferApplication(id); |
| | | if (application == null) { |
| | | return null; |
| | | } |
| | | HrmTransferApplicationRespVO respVO = BeanUtils.toBean(application, HrmTransferApplicationRespVO.class); |
| | | if (application.getUserId() != null) { |
| | | AdminUserRespDTO user = adminUserApi.getUser(application.getUserId()); |
| | | if (user != null) { |
| | | respVO.setUserName(user.getNickname()); |
| | | } |
| | | } |
| | | fillDeptNames(respVO, application); |
| | | fillPostNames(respVO, application); |
| | | respVO.setTransferTypeName(HrmTransferTypeEnum.getNameByStatus(application.getTransferType())); |
| | | respVO.setStatusName(HrmAuditStatusEnum.getNameByStatus(application.getStatus())); |
| | | return respVO; |
| | | } |
| | | |
| | | private void fillDeptNames(HrmTransferApplicationRespVO respVO, HrmTransferApplicationDO application) { |
| | | Set<Long> deptIds = Set.of(application.getCurrentDeptId(), application.getTargetDeptId()) |
| | | .stream().filter(Objects::nonNull).collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(deptIds); |
| | | if (application.getCurrentDeptId() != null && deptMap.containsKey(application.getCurrentDeptId())) { |
| | | respVO.setCurrentDeptName(deptMap.get(application.getCurrentDeptId()).getName()); |
| | | } |
| | | if (application.getTargetDeptId() != null && deptMap.containsKey(application.getTargetDeptId())) { |
| | | respVO.setTargetDeptName(deptMap.get(application.getTargetDeptId()).getName()); |
| | | } |
| | | } |
| | | |
| | | private void fillPostNames(HrmTransferApplicationRespVO respVO, HrmTransferApplicationDO application) { |
| | | Set<Long> postIds = Set.of(application.getCurrentPostId(), application.getTargetPostId()) |
| | | .stream().filter(Objects::nonNull).collect(Collectors.toSet()); |
| | | Map<Long, PostRespDTO> postMap = postApi.getPostMap(postIds); |
| | | if (application.getCurrentPostId() != null && postMap.containsKey(application.getCurrentPostId())) { |
| | | respVO.setCurrentPostName(postMap.get(application.getCurrentPostId()).getName()); |
| | | } |
| | | if (application.getTargetPostId() != null && postMap.containsKey(application.getTargetPostId())) { |
| | | respVO.setTargetPostName(postMap.get(application.getTargetPostId()).getName()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<HrmTransferApplicationRespVO> getTransferApplicationPage(HrmTransferApplicationPageReqVO pageReqVO) { |
| | | PageResult<HrmTransferApplicationDO> pageResult = transferApplicationMapper.selectPage(pageReqVO); |
| | | if (pageResult.getList().isEmpty()) { |
| | | return new PageResult<>(Collections.emptyList(), pageResult.getTotal()); |
| | | } |
| | | Set<Long> userIds = pageResult.getList().stream() |
| | | .map(HrmTransferApplicationDO::getUserId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| | | Set<Long> deptIds = pageResult.getList().stream() |
| | | .flatMap(app -> Stream.of(app.getCurrentDeptId(), app.getTargetDeptId())) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(deptIds); |
| | | Set<Long> postIds = pageResult.getList().stream() |
| | | .flatMap(app -> Stream.of(app.getCurrentPostId(), app.getTargetPostId())) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, PostRespDTO> postMap = postApi.getPostMap(postIds); |
| | | List<HrmTransferApplicationRespVO> list = pageResult.getList().stream().map(app -> { |
| | | HrmTransferApplicationRespVO vo = BeanUtils.toBean(app, HrmTransferApplicationRespVO.class); |
| | | if (app.getUserId() != null && userMap.containsKey(app.getUserId())) { |
| | | vo.setUserName(userMap.get(app.getUserId()).getNickname()); |
| | | } |
| | | if (app.getCurrentDeptId() != null && deptMap.containsKey(app.getCurrentDeptId())) { |
| | | vo.setCurrentDeptName(deptMap.get(app.getCurrentDeptId()).getName()); |
| | | } |
| | | if (app.getTargetDeptId() != null && deptMap.containsKey(app.getTargetDeptId())) { |
| | | vo.setTargetDeptName(deptMap.get(app.getTargetDeptId()).getName()); |
| | | } |
| | | if (app.getCurrentPostId() != null && postMap.containsKey(app.getCurrentPostId())) { |
| | | vo.setCurrentPostName(postMap.get(app.getCurrentPostId()).getName()); |
| | | } |
| | | if (app.getTargetPostId() != null && postMap.containsKey(app.getTargetPostId())) { |
| | | vo.setTargetPostName(postMap.get(app.getTargetPostId()).getName()); |
| | | } |
| | | vo.setTransferTypeName(HrmTransferTypeEnum.getNameByStatus(app.getTransferType())); |
| | | vo.setStatusName(HrmAuditStatusEnum.getNameByStatus(app.getStatus())); |
| | | return vo; |
| | | }).collect(Collectors.toList()); |
| | | return new PageResult<>(list, pageResult.getTotal()); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitTransferApplication(Long id, String processDefinitionKey, Long userId) { |
| | | HrmTransferApplicationDO application = validateTransferApplicationExists(id); |
| | | if (ObjUtil.notEqual(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) { |
| | | throw exception(TRANSFER_APPLICATION_SUBMIT_FAIL_NOT_DRAFT); |
| | | } |
| | | validateApproveCategoryAndProcessDefinition(); |
| | | ProcessDefinition processDefinition = bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey); |
| | | if (processDefinition == null) { |
| | | throw exception(TRANSFER_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey).setBusinessKey(String.valueOf(id))); |
| | | transferApplicationMapper.updateById(HrmTransferApplicationDO.builder() |
| | | .id(id) |
| | | .processInstanceId(processInstanceId) |
| | | .status(HrmAuditStatusEnum.PROCESS.getStatus()) |
| | | .build()); |
| | | } |
| | | |
| | | private void validateApproveCategoryAndProcessDefinition() { |
| | | List<String> codes = Collections.singletonList(APPROVE_CATEGORY_CODE); |
| | | Map<String, ?> categoryMap = bpmCategoryService.getCategoryMap(codes); |
| | | if (!categoryMap.containsKey(APPROVE_CATEGORY_CODE)) { |
| | | throw exception(TRANSFER_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(APPROVE_CATEGORY_CODE); |
| | | if (CollUtil.isEmpty(definitionInfoList)) { |
| | | throw exception(TRANSFER_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId); |
| | | List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds); |
| | | boolean hasActiveDefinition = processDefinitions.stream().anyMatch(pd -> !pd.isSuspended()); |
| | | if (!hasActiveDefinition) { |
| | | throw exception(TRANSFER_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> getApproveProcessDefinitionList() { |
| | | validateApproveCategoryAndProcessDefinition(); |
| | | List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(APPROVE_CATEGORY_CODE); |
| | | Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId); |
| | | List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds); |
| | | Map<String, ProcessDefinition> latestVersionMap = new HashMap<>(); |
| | | for (ProcessDefinition pd : processDefinitions) { |
| | | if (pd.isSuspended()) continue; |
| | | ProcessDefinition existing = latestVersionMap.get(pd.getKey()); |
| | | if (existing == null || pd.getVersion() > existing.getVersion()) { |
| | | latestVersionMap.put(pd.getKey(), pd); |
| | | } |
| | | } |
| | | List<Map<String, Object>> result = new ArrayList<>(); |
| | | for (ProcessDefinition pd : latestVersionMap.values()) { |
| | | Map<String, Object> item = new HashMap<>(); |
| | | item.put("id", pd.getId()); |
| | | item.put("key", pd.getKey()); |
| | | item.put("name", pd.getName()); |
| | | item.put("version", pd.getVersion()); |
| | | result.add(item); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | @Override |
| | | public void updateTransferApplicationAuditStatus(Long id, Integer status) { |
| | | HrmTransferApplicationDO application = validateTransferApplicationExists(id); |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.PROCESS.getStatus())) { |
| | | log.error("[updateTransferApplicationAuditStatus][application({}) ä¸å¤äºå®¡æ¹ä¸ï¼æ æ³æ´æ°å®¡æ¹ç»æ({})]", id, status); |
| | | throw exception(TRANSFER_APPLICATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS); |
| | | } |
| | | transferApplicationMapper.updateById(HrmTransferApplicationDO.builder() |
| | | .id(id) |
| | | .status(status) |
| | | .approveTime(java.time.LocalDateTime.now()) |
| | | .build()); |
| | | } |
| | | |
| | | @Override |
| | | public HrmTransferApplicationDO getTransferApplicationByProcessInstanceId(String processInstanceId) { |
| | | return transferApplicationMapper.selectByProcessInstanceId(processInstanceId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.approval.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmLeaveApplicationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmLeaveApplicationMapper; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.hrm.service.approval.HrmLeaveApplicationService; |
| | | import cn.iocoder.yudao.module.hrm.util.HrmAuditStatusUtils; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.ApplicationListener; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * 请åç³è¯·å®¡æ¹çç»æçå¬å¨å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class HrmLeaveApplicationStatusListener implements ApplicationListener<BpmProcessInstanceStatusEvent> { |
| | | |
| | | @Resource |
| | | private HrmLeaveApplicationService leaveApplicationService; |
| | | @Resource |
| | | private HrmLeaveApplicationMapper leaveApplicationMapper; |
| | | |
| | | @Override |
| | | public void onApplicationEvent(BpmProcessInstanceStatusEvent event) { |
| | | // éè¿ businessKey æ¥è¯¢è¯·åç³è¯· |
| | | Long applicationId; |
| | | try { |
| | | applicationId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | return; |
| | | } |
| | | |
| | | HrmLeaveApplicationDO application = leaveApplicationMapper.selectById(applicationId); |
| | | if (application == null) { |
| | | return; |
| | | } |
| | | |
| | | // åªæå®¡æ¹ä¸ç¶æç请åç³è¯·æå¤ç |
| | | if (!HrmAuditStatusEnum.PROCESS.getStatus().equals(application.getStatus())) { |
| | | log.warn("[onApplicationEvent] 请åç³è¯·({}) ä¸å¤äºå®¡æ¹ä¸ç¶æï¼å½åç¶æ: {}", applicationId, application.getStatus()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onApplicationEvent] 请åç³è¯·({}) 审æ¹ç¶ææ´æ°: {}", applicationId, event.getStatus()); |
| | | // æ´æ°å®¡æ¹ç¶æ |
| | | Integer auditStatus = HrmAuditStatusUtils.convertBpmResultToAuditStatus(event.getStatus()); |
| | | leaveApplicationService.updateLeaveApplicationAuditStatus(applicationId, auditStatus); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.approval.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmResignationApplicationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmResignationApplicationMapper; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.hrm.service.approval.HrmResignationApplicationService; |
| | | import cn.iocoder.yudao.module.hrm.util.HrmAuditStatusUtils; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.ApplicationListener; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * 离èç³è¯·å®¡æ¹çç»æçå¬å¨å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class HrmResignationApplicationStatusListener implements ApplicationListener<BpmProcessInstanceStatusEvent> { |
| | | |
| | | @Resource |
| | | private HrmResignationApplicationService resignationApplicationService; |
| | | @Resource |
| | | private HrmResignationApplicationMapper resignationApplicationMapper; |
| | | |
| | | @Override |
| | | public void onApplicationEvent(BpmProcessInstanceStatusEvent event) { |
| | | // éè¿ businessKey æ¥è¯¢ç¦»èç³è¯· |
| | | Long applicationId; |
| | | try { |
| | | applicationId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | return; |
| | | } |
| | | |
| | | HrmResignationApplicationDO application = resignationApplicationMapper.selectById(applicationId); |
| | | if (application == null) { |
| | | return; |
| | | } |
| | | |
| | | // åªæå®¡æ¹ä¸ç¶æç离èç³è¯·æå¤ç |
| | | if (!HrmAuditStatusEnum.PROCESS.getStatus().equals(application.getStatus())) { |
| | | log.warn("[onApplicationEvent] 离èç³è¯·({}) ä¸å¤äºå®¡æ¹ä¸ç¶æï¼å½åç¶æ: {}", applicationId, application.getStatus()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onApplicationEvent] 离èç³è¯·({}) 审æ¹ç¶ææ´æ°: {}", applicationId, event.getStatus()); |
| | | // æ´æ°å®¡æ¹ç¶æ |
| | | Integer auditStatus = HrmAuditStatusUtils.convertBpmResultToAuditStatus(event.getStatus()); |
| | | resignationApplicationService.updateResignationApplicationAuditStatus(applicationId, auditStatus); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.approval.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmTransferApplicationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmTransferApplicationMapper; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.hrm.service.approval.HrmTransferApplicationService; |
| | | import cn.iocoder.yudao.module.hrm.util.HrmAuditStatusUtils; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.ApplicationListener; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * è°å²ç³è¯·å®¡æ¹çç»æçå¬å¨å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class HrmTransferApplicationStatusListener implements ApplicationListener<BpmProcessInstanceStatusEvent> { |
| | | |
| | | @Resource |
| | | private HrmTransferApplicationService transferApplicationService; |
| | | @Resource |
| | | private HrmTransferApplicationMapper transferApplicationMapper; |
| | | |
| | | @Override |
| | | public void onApplicationEvent(BpmProcessInstanceStatusEvent event) { |
| | | // éè¿ businessKey æ¥è¯¢è°å²ç³è¯· |
| | | Long applicationId; |
| | | try { |
| | | applicationId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | return; |
| | | } |
| | | |
| | | HrmTransferApplicationDO application = transferApplicationMapper.selectById(applicationId); |
| | | if (application == null) { |
| | | return; |
| | | } |
| | | |
| | | // åªæå®¡æ¹ä¸ç¶æçè°å²ç³è¯·æå¤ç |
| | | if (!HrmAuditStatusEnum.PROCESS.getStatus().equals(application.getStatus())) { |
| | | log.warn("[onApplicationEvent] è°å²ç³è¯·({}) ä¸å¤äºå®¡æ¹ä¸ç¶æï¼å½åç¶æ: {}", applicationId, application.getStatus()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onApplicationEvent] è°å²ç³è¯·({}) 审æ¹ç¶ææ´æ°: {}", applicationId, event.getStatus()); |
| | | // æ´æ°å®¡æ¹ç¶æ |
| | | Integer auditStatus = HrmAuditStatusUtils.convertBpmResultToAuditStatus(event.getStatus()); |
| | | transferApplicationService.updateTransferApplicationAuditStatus(applicationId, auditStatus); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | /** |
| | | * èå¤å¼å¸¸ç³è¯· Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmAttendanceExceptionService { |
| | | |
| | | /** |
| | | * å建èå¤å¼å¸¸ç³è¯· |
| | | */ |
| | | Long createAttendanceException(@Valid HrmAttendanceExceptionSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°èå¤å¼å¸¸ç³è¯· |
| | | */ |
| | | void updateAttendanceException(@Valid HrmAttendanceExceptionSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤èå¤å¼å¸¸ç³è¯· |
| | | */ |
| | | void deleteAttendanceException(Long id); |
| | | |
| | | /** |
| | | * è·å¾èå¤å¼å¸¸ç³è¯·å页 |
| | | */ |
| | | PageResult<HrmAttendanceExceptionDO> getAttendanceExceptionPage(HrmAttendanceExceptionPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾èå¤å¼å¸¸ç³è¯· |
| | | */ |
| | | HrmAttendanceExceptionDO getAttendanceException(Long id); |
| | | |
| | | /** |
| | | * æäº¤èå¤å¼å¸¸ç³è¯· |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @param processDefinitionKey æµç¨å®ä¹Key |
| | | * @param userId æäº¤äººID |
| | | */ |
| | | void submitAttendanceException(Long id, String processDefinitionKey, Long userId); |
| | | |
| | | /** |
| | | * æ´æ°èå¤å¼å¸¸ç³è¯·å®¡æ¹ç¶æ |
| | | * |
| | | * @param id ç³è¯·ID |
| | | * @param auditStatus 审æ¹ç¶æ |
| | | */ |
| | | void updateAttendanceExceptionAuditStatus(Long id, Integer auditStatus); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceExceptionMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * èå¤å¼å¸¸ç³è¯· Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class HrmAttendanceExceptionServiceImpl implements HrmAttendanceExceptionService { |
| | | |
| | | @Resource |
| | | private HrmAttendanceExceptionMapper attendanceExceptionMapper; |
| | | @Resource |
| | | private HrmNoRedisDAO noRedisDAO; |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | @Resource |
| | | private BpmProcessDefinitionService bpmProcessDefinitionService; |
| | | |
| | | @Override |
| | | public Long createAttendanceException(HrmAttendanceExceptionSaveReqVO createReqVO) { |
| | | HrmAttendanceExceptionDO attendanceException = BeanUtils.toBean(createReqVO, HrmAttendanceExceptionDO.class); |
| | | attendanceException.setNo(generateNo()); |
| | | attendanceException.setStatus(HrmAuditStatusEnum.DRAFT.getStatus()); |
| | | attendanceExceptionMapper.insert(attendanceException); |
| | | return attendanceException.getId(); |
| | | } |
| | | |
| | | private String generateNo() { |
| | | return noRedisDAO.generate(HrmNoRedisDAO.ATTENDANCE_EXCEPTION_NO_PREFIX, 4); |
| | | } |
| | | |
| | | @Override |
| | | public void updateAttendanceException(HrmAttendanceExceptionSaveReqVO updateReqVO) { |
| | | validateAttendanceExceptionExists(updateReqVO.getId()); |
| | | HrmAttendanceExceptionDO updateObj = BeanUtils.toBean(updateReqVO, HrmAttendanceExceptionDO.class); |
| | | attendanceExceptionMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteAttendanceException(Long id) { |
| | | validateAttendanceExceptionExists(id); |
| | | attendanceExceptionMapper.deleteById(id); |
| | | } |
| | | |
| | | private HrmAttendanceExceptionDO validateAttendanceExceptionExists(Long id) { |
| | | HrmAttendanceExceptionDO attendanceException = attendanceExceptionMapper.selectById(id); |
| | | if (attendanceException == null) { |
| | | throw exception(ATTENDANCE_EXCEPTION_NOT_EXISTS); |
| | | } |
| | | return attendanceException; |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<HrmAttendanceExceptionDO> getAttendanceExceptionPage(HrmAttendanceExceptionPageReqVO pageReqVO) { |
| | | return attendanceExceptionMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public HrmAttendanceExceptionDO getAttendanceException(Long id) { |
| | | return attendanceExceptionMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitAttendanceException(Long id, String processDefinitionKey, Long userId) { |
| | | // 1. æ ¡éªå¼å¸¸ç³è¯·åå¨ä¸ä¸ºèç¨¿ç¶æ |
| | | HrmAttendanceExceptionDO exception = validateAttendanceExceptionExists(id); |
| | | if (!HrmAuditStatusEnum.DRAFT.getStatus().equals(exception.getStatus())) { |
| | | throw exception(ATTENDANCE_EXCEPTION_SUBMIT_FAIL_NOT_DRAFT); |
| | | } |
| | | |
| | | // 2. æ ¡éªæµç¨å®ä¹åå¨ä¸ä¸ºæ¿æ´»ç¶æ |
| | | if (processDefinitionKey != null) { |
| | | bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey); |
| | | } |
| | | |
| | | // 3. åå»ºå®¡æ¹æµç¨å®ä¾ |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, |
| | | new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | |
| | | // 4. æ´æ°å¼å¸¸ç³è¯·ç¶æ |
| | | attendanceExceptionMapper.updateById(HrmAttendanceExceptionDO.builder() |
| | | .id(id) |
| | | .processInstanceId(processInstanceId) |
| | | .status(HrmAuditStatusEnum.PROCESS.getStatus()) |
| | | .build()); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateAttendanceExceptionAuditStatus(Long id, Integer auditStatus) { |
| | | // 1. æ ¡éªå¼å¸¸ç³è¯·åå¨ |
| | | HrmAttendanceExceptionDO exception = validateAttendanceExceptionExists(id); |
| | | // 2. æ ¡éªå½åç¶æä¸ºå®¡æ¹ä¸ |
| | | if (!HrmAuditStatusEnum.PROCESS.getStatus().equals(exception.getStatus())) { |
| | | throw exception(ATTENDANCE_EXCEPTION_UPDATE_AUDIT_STATUS_FAIL); |
| | | } |
| | | // 3. æ´æ°ç¶æ |
| | | attendanceExceptionMapper.updateById(HrmAttendanceExceptionDO.builder() |
| | | .id(id) |
| | | .status(auditStatus) |
| | | .approveTime(LocalDateTime.now()) |
| | | .build()); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidayPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidaySaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceHolidayDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èå¤è忥é
ç½® Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmAttendanceHolidayService { |
| | | |
| | | /** |
| | | * æ°å¢è忥é
ç½® |
| | | * |
| | | * @param createReqVO æ°å¢ä¿¡æ¯ |
| | | * @return è忥ID |
| | | */ |
| | | Long createAttendanceHoliday(@Valid HrmAttendanceHolidaySaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°è忥é
ç½® |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateAttendanceHoliday(@Valid HrmAttendanceHolidaySaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤è忥é
ç½® |
| | | * |
| | | * @param id è忥ID |
| | | */ |
| | | void deleteAttendanceHoliday(Long id); |
| | | |
| | | /** |
| | | * è·å¾è忥é
ç½® |
| | | * |
| | | * @param id è忥ID |
| | | * @return è忥é
ç½® |
| | | */ |
| | | HrmAttendanceHolidayDO getAttendanceHoliday(Long id); |
| | | |
| | | /** |
| | | * è·å¾è忥é
ç½®å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢åæ° |
| | | * @return è忥é
ç½®å页 |
| | | */ |
| | | PageResult<HrmAttendanceHolidayDO> getAttendanceHolidayPage(HrmAttendanceHolidayPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾æå®æ¥æèå´çè忥å表 |
| | | * |
| | | * @param startDate å¼å§æ¥æ |
| | | * @param endDate ç»ææ¥æ |
| | | * @return è忥å表 |
| | | */ |
| | | List<HrmAttendanceHolidayDO> getAttendanceHolidayListByDateRange(LocalDate startDate, LocalDate endDate); |
| | | |
| | | /** |
| | | * 夿æ¯å¦å·¥ä½æ¥ |
| | | * |
| | | * @param date æ¥æ |
| | | * @return true-工使¥ï¼false-伿¯æ¥ |
| | | */ |
| | | boolean isWorkDay(LocalDate date); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidayPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceHolidaySaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceHolidayDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceHolidayMapper; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAttendanceHolidayTypeEnum; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.time.DayOfWeek; |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * èå¤è忥é
ç½® Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmAttendanceHolidayServiceImpl implements HrmAttendanceHolidayService { |
| | | |
| | | @Resource |
| | | private HrmAttendanceHolidayMapper attendanceHolidayMapper; |
| | | |
| | | @Override |
| | | public Long createAttendanceHoliday(HrmAttendanceHolidaySaveReqVO createReqVO) { |
| | | // æ ¡éªæ¥ææ¯å¦å·²åå¨é
ç½® |
| | | validateAttendanceHolidayDateExists(createReqVO.getDate()); |
| | | HrmAttendanceHolidayDO attendanceHoliday = BeanUtils.toBean(createReqVO, HrmAttendanceHolidayDO.class); |
| | | if (attendanceHoliday.getIsLegal() == null) { |
| | | attendanceHoliday.setIsLegal(0); |
| | | } |
| | | attendanceHolidayMapper.insert(attendanceHoliday); |
| | | return attendanceHoliday.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateAttendanceHoliday(HrmAttendanceHolidaySaveReqVO updateReqVO) { |
| | | validateAttendanceHolidayExists(updateReqVO.getId()); |
| | | // å¦ææ¥æåæ´ï¼æ ¡éªæ°æ¥ææ¯å¦å·²åå¨é
ç½® |
| | | HrmAttendanceHolidayDO oldHoliday = attendanceHolidayMapper.selectById(updateReqVO.getId()); |
| | | if (!oldHoliday.getDate().equals(updateReqVO.getDate())) { |
| | | validateAttendanceHolidayDateExists(updateReqVO.getDate()); |
| | | } |
| | | HrmAttendanceHolidayDO updateObj = BeanUtils.toBean(updateReqVO, HrmAttendanceHolidayDO.class); |
| | | attendanceHolidayMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteAttendanceHoliday(Long id) { |
| | | validateAttendanceHolidayExists(id); |
| | | attendanceHolidayMapper.deleteById(id); |
| | | } |
| | | |
| | | private void validateAttendanceHolidayExists(Long id) { |
| | | if (attendanceHolidayMapper.selectById(id) == null) { |
| | | throw exception(ATTENDANCE_HOLIDAY_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | private void validateAttendanceHolidayDateExists(LocalDate date) { |
| | | if (attendanceHolidayMapper.selectByDate(date) != null) { |
| | | throw exception(ATTENDANCE_HOLIDAY_DATE_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public HrmAttendanceHolidayDO getAttendanceHoliday(Long id) { |
| | | return attendanceHolidayMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<HrmAttendanceHolidayDO> getAttendanceHolidayPage(HrmAttendanceHolidayPageReqVO pageReqVO) { |
| | | return attendanceHolidayMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmAttendanceHolidayDO> getAttendanceHolidayListByDateRange(LocalDate startDate, LocalDate endDate) { |
| | | return attendanceHolidayMapper.selectListByDateBetween(startDate, endDate); |
| | | } |
| | | |
| | | @Override |
| | | public boolean isWorkDay(LocalDate date) { |
| | | // 1. æ¥è¯¢è忥é
ç½® |
| | | HrmAttendanceHolidayDO holiday = attendanceHolidayMapper.selectByDate(date); |
| | | if (holiday != null) { |
| | | // æé
ç½®æ¶ï¼æé
ç½®å¤æ |
| | | return HrmAttendanceHolidayTypeEnum.WORK_DAY.getType().equals(holiday.getType()); |
| | | } |
| | | // 2. æ é
ç½®æ¶ï¼æå¨æ«å¤æ |
| | | DayOfWeek dayOfWeek = date.getDayOfWeek(); |
| | | return dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRecordDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èå¤è®°å½ Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmAttendanceRecordService { |
| | | |
| | | /** |
| | | * è·å¾èå¤è®°å½å页 |
| | | */ |
| | | PageResult<HrmAttendanceRecordDO> getAttendanceRecordPage(HrmAttendanceRecordPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾èå¤è®°å½ |
| | | */ |
| | | HrmAttendanceRecordDO getAttendanceRecord(Long id); |
| | | |
| | | /** |
| | | * è·ååå·¥æå®æ¥æèå´çèå¤è®°å½ |
| | | */ |
| | | List<HrmAttendanceRecordDO> getAttendanceRecordListByUserIdAndDateBetween(Long userId, String startDate, String endDate); |
| | | |
| | | /** |
| | | * è·ååå·¥æå®æ¥æçèå¤è®°å½ |
| | | */ |
| | | HrmAttendanceRecordDO getAttendanceRecordByUserIdAndDate(Long userId, LocalDate date); |
| | | |
| | | /** |
| | | * æå¡ï¼ä¸çæå¡ï¼ |
| | | * |
| | | * @param userId åå·¥ID |
| | | * @param clockTime æå¡æ¶é´ |
| | | * @param location æå¡å°ç¹ |
| | | * @return èå¤è®°å½ |
| | | */ |
| | | HrmAttendanceRecordDO clockIn(Long userId, LocalDateTime clockTime, String location); |
| | | |
| | | /** |
| | | * æå¡ï¼ä¸çæå¡ï¼ |
| | | * |
| | | * @param userId åå·¥ID |
| | | * @param clockTime æå¡æ¶é´ |
| | | * @param location æå¡å°ç¹ |
| | | * @return èå¤è®°å½ |
| | | */ |
| | | HrmAttendanceRecordDO clockOut(Long userId, LocalDateTime clockTime, String location); |
| | | |
| | | /** |
| | | * è¡¥å¡å®¡æ¹éè¿åæ´æ°èå¤è®°å½ |
| | | * |
| | | * @param exception èå¤å¼å¸¸ç³è¯· |
| | | */ |
| | | void supplementClockIn(HrmAttendanceExceptionDO exception); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRecordDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRuleDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceRecordMapper; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAttendanceClockTypeEnum; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAttendanceDataSourceEnum; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAttendanceExceptionTypeEnum; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.Duration; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * èå¤è®°å½ Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmAttendanceRecordServiceImpl implements HrmAttendanceRecordService { |
| | | |
| | | @Resource |
| | | private HrmAttendanceRecordMapper attendanceRecordMapper; |
| | | @Resource |
| | | private HrmEmployeeService employeeService; |
| | | @Resource |
| | | private HrmAttendanceRuleService attendanceRuleService; |
| | | @Resource |
| | | private HrmAttendanceHolidayService attendanceHolidayService; |
| | | |
| | | @Override |
| | | public PageResult<HrmAttendanceRecordDO> getAttendanceRecordPage(HrmAttendanceRecordPageReqVO pageReqVO) { |
| | | return attendanceRecordMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public HrmAttendanceRecordDO getAttendanceRecord(Long id) { |
| | | return attendanceRecordMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmAttendanceRecordDO> getAttendanceRecordListByUserIdAndDateBetween(Long userId, String startDate, String endDate) { |
| | | return attendanceRecordMapper.selectListByUserIdAndDateBetween(userId, LocalDate.parse(startDate), LocalDate.parse(endDate)); |
| | | } |
| | | |
| | | @Override |
| | | public HrmAttendanceRecordDO getAttendanceRecordByUserIdAndDate(Long userId, LocalDate date) { |
| | | return attendanceRecordMapper.selectByUserIdAndDate(userId, date); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public HrmAttendanceRecordDO clockIn(Long userId, LocalDateTime clockTime, String location) { |
| | | LocalDate clockDate = clockTime.toLocalDate(); |
| | | // 1. æ ¡éªæ¯å¦å·¥ä½æ¥ |
| | | if (!attendanceHolidayService.isWorkDay(clockDate)) { |
| | | throw exception(ATTENDANCE_CLOCK_FAIL_NOT_WORKDAY); |
| | | } |
| | | // 2. è·åå工信æ¯åèå¤è§å |
| | | HrmEmployeeDO employee = employeeService.getEmployee(userId); |
| | | if (employee == null) { |
| | | throw exception(EMPLOYEE_NOT_EXISTS); |
| | | } |
| | | HrmAttendanceRuleDO rule = attendanceRuleService.getAttendanceRuleByDeptId(employee.getDeptId()); |
| | | if (rule == null) { |
| | | throw exception(ATTENDANCE_CLOCK_FAIL_NO_RULE); |
| | | } |
| | | // 3. æ¥è¯¢å½æ¥èå¤è®°å½ |
| | | HrmAttendanceRecordDO record = attendanceRecordMapper.selectByUserIdAndDate(userId, clockDate); |
| | | if (record != null && record.getClockInTime() != null) { |
| | | throw exception(ATTENDANCE_CLOCK_ALREADY_CLOCKED); |
| | | } |
| | | // 4. 夿æå¡ç±»å |
| | | LocalTime workStartTime = rule.getWorkStartTime(); |
| | | int lateAllowMinutes = rule.getLateAllowMinutes() != null ? rule.getLateAllowMinutes() : 0; |
| | | LocalTime lateThreshold = workStartTime.plusMinutes(lateAllowMinutes); |
| | | LocalTime clockTimeOnly = clockTime.toLocalTime(); |
| | | Integer clockInType = clockTimeOnly.isBefore(lateThreshold) || clockTimeOnly.equals(lateThreshold) |
| | | ? HrmAttendanceClockTypeEnum.NORMAL.getType() |
| | | : HrmAttendanceClockTypeEnum.LATE.getType(); |
| | | // 5. åå»ºææ´æ°èå¤è®°å½ |
| | | if (record == null) { |
| | | record = HrmAttendanceRecordDO.builder() |
| | | .userId(userId) |
| | | .deptId(employee.getDeptId()) |
| | | .date(clockDate) |
| | | .clockInTime(clockTime) |
| | | .clockInType(clockInType) |
| | | .location(location) |
| | | .dataSource(HrmAttendanceDataSourceEnum.CLOCK.getType()) |
| | | .build(); |
| | | attendanceRecordMapper.insert(record); |
| | | } else { |
| | | record.setClockInTime(clockTime); |
| | | record.setClockInType(clockInType); |
| | | if (location != null) { |
| | | record.setLocation(location); |
| | | } |
| | | attendanceRecordMapper.updateById(record); |
| | | } |
| | | return record; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public HrmAttendanceRecordDO clockOut(Long userId, LocalDateTime clockTime, String location) { |
| | | LocalDate clockDate = clockTime.toLocalDate(); |
| | | // 1. æ ¡éªæ¯å¦å·¥ä½æ¥ |
| | | if (!attendanceHolidayService.isWorkDay(clockDate)) { |
| | | throw exception(ATTENDANCE_CLOCK_FAIL_NOT_WORKDAY); |
| | | } |
| | | // 2. è·åå工信æ¯åèå¤è§å |
| | | HrmEmployeeDO employee = employeeService.getEmployee(userId); |
| | | if (employee == null) { |
| | | throw exception(EMPLOYEE_NOT_EXISTS); |
| | | } |
| | | HrmAttendanceRuleDO rule = attendanceRuleService.getAttendanceRuleByDeptId(employee.getDeptId()); |
| | | if (rule == null) { |
| | | throw exception(ATTENDANCE_CLOCK_FAIL_NO_RULE); |
| | | } |
| | | // 3. æ¥è¯¢å½æ¥èå¤è®°å½ |
| | | HrmAttendanceRecordDO record = attendanceRecordMapper.selectByUserIdAndDate(userId, clockDate); |
| | | if (record == null) { |
| | | // å¦ææ²¡æä¸çæå¡è®°å½ï¼åå»ºä¸æ¡ç¼ºå¡çè®°å½ |
| | | record = HrmAttendanceRecordDO.builder() |
| | | .userId(userId) |
| | | .deptId(employee.getDeptId()) |
| | | .date(clockDate) |
| | | .clockInType(HrmAttendanceClockTypeEnum.MISSING.getType()) |
| | | .dataSource(HrmAttendanceDataSourceEnum.CLOCK.getType()) |
| | | .build(); |
| | | attendanceRecordMapper.insert(record); |
| | | } |
| | | if (record.getClockOutTime() != null) { |
| | | throw exception(ATTENDANCE_CLOCK_ALREADY_CLOCKED); |
| | | } |
| | | // 4. 夿æå¡ç±»å |
| | | LocalTime workEndTime = rule.getWorkEndTime(); |
| | | int earlyAllowMinutes = rule.getEarlyAllowMinutes() != null ? rule.getEarlyAllowMinutes() : 0; |
| | | LocalTime earlyThreshold = workEndTime.minusMinutes(earlyAllowMinutes); |
| | | LocalTime clockTimeOnly = clockTime.toLocalTime(); |
| | | Integer clockOutType = clockTimeOnly.isAfter(earlyThreshold) || clockTimeOnly.equals(earlyThreshold) |
| | | ? HrmAttendanceClockTypeEnum.NORMAL.getType() |
| | | : HrmAttendanceClockTypeEnum.EARLY.getType(); |
| | | // 5. æ´æ°èå¤è®°å½ |
| | | record.setClockOutTime(clockTime); |
| | | record.setClockOutType(clockOutType); |
| | | if (location != null) { |
| | | record.setLocation(location); |
| | | } |
| | | // 6. 计ç®å·¥ä½æ¶é¿ |
| | | if (record.getClockInTime() != null) { |
| | | Duration duration = Duration.between(record.getClockInTime(), clockTime); |
| | | BigDecimal workHours = BigDecimal.valueOf(duration.toMinutes()) |
| | | .divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP); |
| | | record.setWorkHours(workHours); |
| | | } |
| | | attendanceRecordMapper.updateById(record); |
| | | return record; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void supplementClockIn(HrmAttendanceExceptionDO exception) { |
| | | // ä»
å¤çè¡¥å¡ç±»å |
| | | if (!HrmAttendanceExceptionTypeEnum.SUPPLEMENT.getType().equals(exception.getType())) { |
| | | return; |
| | | } |
| | | LocalDate exceptionDate = exception.getExceptionDate(); |
| | | LocalDateTime exceptionTime = exception.getExceptionTime(); |
| | | Long userId = exception.getUserId(); |
| | | // æ¥è¯¢èå¤è®°å½ |
| | | HrmAttendanceRecordDO record = attendanceRecordMapper.selectByUserIdAndDate(userId, exceptionDate); |
| | | if (record == null) { |
| | | // å¦ææ²¡æè®°å½ï¼åå»ºä¸æ¡ |
| | | HrmEmployeeDO employee = employeeService.getEmployee(userId); |
| | | record = HrmAttendanceRecordDO.builder() |
| | | .userId(userId) |
| | | .deptId(employee != null ? employee.getDeptId() : exception.getDeptId()) |
| | | .date(exceptionDate) |
| | | .dataSource(HrmAttendanceDataSourceEnum.SUPPLEMENT.getType()) |
| | | .build(); |
| | | attendanceRecordMapper.insert(record); |
| | | } |
| | | // æ ¹æ®å¼å¸¸æ¶é´å¤ææ¯ä¸çè¿æ¯ä¸çè¡¥å¡ |
| | | LocalTime time = exceptionTime.toLocalTime(); |
| | | if (time.isBefore(LocalTime.of(12, 0))) { |
| | | // ä¸çè¡¥å¡ |
| | | record.setClockInTime(exceptionTime); |
| | | record.setClockInType(HrmAttendanceClockTypeEnum.NORMAL.getType()); |
| | | } else { |
| | | // ä¸çè¡¥å¡ |
| | | record.setClockOutTime(exceptionTime); |
| | | record.setClockOutType(HrmAttendanceClockTypeEnum.NORMAL.getType()); |
| | | } |
| | | // æ´æ°æ°æ®æ¥æºä¸ºè¡¥å¡å®¡æ¹ |
| | | record.setDataSource(HrmAttendanceDataSourceEnum.SUPPLEMENT.getType()); |
| | | // 计ç®å·¥ä½æ¶é¿ |
| | | if (record.getClockInTime() != null && record.getClockOutTime() != null) { |
| | | Duration duration = Duration.between(record.getClockInTime(), record.getClockOutTime()); |
| | | BigDecimal workHours = BigDecimal.valueOf(duration.toMinutes()) |
| | | .divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP); |
| | | record.setWorkHours(workHours); |
| | | } |
| | | attendanceRecordMapper.updateById(record); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRulePageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRuleSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRuleDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èå¤è§åé
ç½® Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmAttendanceRuleService { |
| | | |
| | | /** |
| | | * æ°å¢èå¤è§å |
| | | * |
| | | * @param createReqVO æ°å¢ä¿¡æ¯ |
| | | * @return è§åID |
| | | */ |
| | | Long createAttendanceRule(@Valid HrmAttendanceRuleSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°èå¤è§å |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateAttendanceRule(@Valid HrmAttendanceRuleSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤èå¤è§å |
| | | * |
| | | * @param id è§åID |
| | | */ |
| | | void deleteAttendanceRule(Long id); |
| | | |
| | | /** |
| | | * è·å¾èå¤è§å |
| | | * |
| | | * @param id è§åID |
| | | * @return èå¤è§å |
| | | */ |
| | | HrmAttendanceRuleDO getAttendanceRule(Long id); |
| | | |
| | | /** |
| | | * è·å¾èå¤è§åå页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢åæ° |
| | | * @return èå¤è§åå页 |
| | | */ |
| | | PageResult<HrmAttendanceRuleDO> getAttendanceRulePage(HrmAttendanceRulePageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾å¯ç¨çèå¤è§åå表 |
| | | * |
| | | * @return èå¤è§åå表 |
| | | */ |
| | | List<HrmAttendanceRuleDO> getAttendanceRuleList(); |
| | | |
| | | /** |
| | | * æ ¹æ®é¨é¨IDè·åèå¤è§å |
| | | * ä¼å
å¹é
é¨é¨è§åï¼å
¶æ¬¡æ¥æ¾å
¨å±è§åï¼deptId=nullï¼ |
| | | * |
| | | * @param deptId é¨é¨ID |
| | | * @return èå¤è§å |
| | | */ |
| | | HrmAttendanceRuleDO getAttendanceRuleByDeptId(Long deptId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRulePageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRuleSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRuleDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceRuleMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * èå¤è§åé
ç½® Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmAttendanceRuleServiceImpl implements HrmAttendanceRuleService { |
| | | |
| | | @Resource |
| | | private HrmAttendanceRuleMapper attendanceRuleMapper; |
| | | |
| | | @Override |
| | | public Long createAttendanceRule(HrmAttendanceRuleSaveReqVO createReqVO) { |
| | | // æ ¡éªè§ååç§°æ¯å¦éå¤ |
| | | validateAttendanceRuleNameUnique(null, createReqVO.getName()); |
| | | // æ ¡éªé¨é¨æ¯å¦å·²é
ç½®è§åï¼å¦ææå®äºé¨é¨ï¼ |
| | | if (createReqVO.getDeptId() != null) { |
| | | validateAttendanceRuleDeptUnique(null, createReqVO.getDeptId()); |
| | | } |
| | | HrmAttendanceRuleDO attendanceRule = BeanUtils.toBean(createReqVO, HrmAttendanceRuleDO.class); |
| | | // 设置é»è®¤å¼ |
| | | if (attendanceRule.getLateAllowMinutes() == null) { |
| | | attendanceRule.setLateAllowMinutes(0); |
| | | } |
| | | if (attendanceRule.getEarlyAllowMinutes() == null) { |
| | | attendanceRule.setEarlyAllowMinutes(0); |
| | | } |
| | | if (attendanceRule.getOvertimeThreshold() == null) { |
| | | attendanceRule.setOvertimeThreshold(BigDecimal.ONE); |
| | | } |
| | | if (attendanceRule.getStatus() == null) { |
| | | attendanceRule.setStatus(0); |
| | | } |
| | | attendanceRuleMapper.insert(attendanceRule); |
| | | return attendanceRule.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateAttendanceRule(HrmAttendanceRuleSaveReqVO updateReqVO) { |
| | | validateAttendanceRuleExists(updateReqVO.getId()); |
| | | // æ ¡éªè§ååç§°æ¯å¦éå¤ |
| | | validateAttendanceRuleNameUnique(updateReqVO.getId(), updateReqVO.getName()); |
| | | // æ ¡éªé¨é¨æ¯å¦å·²é
ç½®è§åï¼å¦ææå®äºé¨é¨ï¼ |
| | | if (updateReqVO.getDeptId() != null) { |
| | | validateAttendanceRuleDeptUnique(updateReqVO.getId(), updateReqVO.getDeptId()); |
| | | } |
| | | HrmAttendanceRuleDO updateObj = BeanUtils.toBean(updateReqVO, HrmAttendanceRuleDO.class); |
| | | attendanceRuleMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteAttendanceRule(Long id) { |
| | | validateAttendanceRuleExists(id); |
| | | attendanceRuleMapper.deleteById(id); |
| | | } |
| | | |
| | | private void validateAttendanceRuleExists(Long id) { |
| | | if (attendanceRuleMapper.selectById(id) == null) { |
| | | throw exception(ATTENDANCE_RULE_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | private void validateAttendanceRuleNameUnique(Long id, String name) { |
| | | HrmAttendanceRuleDO rule = attendanceRuleMapper.selectOne(HrmAttendanceRuleDO::getName, name); |
| | | if (rule == null) { |
| | | return; |
| | | } |
| | | if (id == null) { |
| | | throw exception(ATTENDANCE_RULE_NAME_EXISTS); |
| | | } |
| | | if (!rule.getId().equals(id)) { |
| | | throw exception(ATTENDANCE_RULE_NAME_EXISTS); |
| | | } |
| | | } |
| | | |
| | | private void validateAttendanceRuleDeptUnique(Long id, Long deptId) { |
| | | List<HrmAttendanceRuleDO> rules = attendanceRuleMapper.selectListByDeptId(deptId); |
| | | if (rules.isEmpty()) { |
| | | return; |
| | | } |
| | | for (HrmAttendanceRuleDO rule : rules) { |
| | | if (id == null || !rule.getId().equals(id)) { |
| | | throw exception(ATTENDANCE_RULE_DEPT_EXISTS); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public HrmAttendanceRuleDO getAttendanceRule(Long id) { |
| | | return attendanceRuleMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<HrmAttendanceRuleDO> getAttendanceRulePage(HrmAttendanceRulePageReqVO pageReqVO) { |
| | | return attendanceRuleMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmAttendanceRuleDO> getAttendanceRuleList() { |
| | | return attendanceRuleMapper.selectListByStatus(0); |
| | | } |
| | | |
| | | @Override |
| | | public HrmAttendanceRuleDO getAttendanceRuleByDeptId(Long deptId) { |
| | | // 1. å
æ¥æ¾é¨é¨ä¸å±è§å |
| | | List<HrmAttendanceRuleDO> deptRules = attendanceRuleMapper.selectList(new cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX<HrmAttendanceRuleDO>() |
| | | .eq(HrmAttendanceRuleDO::getDeptId, deptId) |
| | | .eq(HrmAttendanceRuleDO::getStatus, 0)); |
| | | if (!deptRules.isEmpty()) { |
| | | return deptRules.get(0); |
| | | } |
| | | // 2. æ¥æ¾å
¨å±è§åï¼deptId 为 nullï¼ |
| | | List<HrmAttendanceRuleDO> globalRules = attendanceRuleMapper.selectList(new cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX<HrmAttendanceRuleDO>() |
| | | .isNull(HrmAttendanceRuleDO::getDeptId) |
| | | .eq(HrmAttendanceRuleDO::getStatus, 0)); |
| | | if (!globalRules.isEmpty()) { |
| | | return globalRules.get(0); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceSummaryPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceSummaryDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èå¤ç»è®¡æ±æ» Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmAttendanceSummaryService { |
| | | |
| | | /** |
| | | * çæåå·¥æåº¦è夿±æ» |
| | | * |
| | | * @param userId åå·¥ID |
| | | * @param yearMonth å¹´æï¼æ ¼å¼ï¼yyyy-MM |
| | | */ |
| | | void generateMonthlySummary(Long userId, String yearMonth); |
| | | |
| | | /** |
| | | * æ¹éçæé¨é¨æåº¦æ±æ» |
| | | * |
| | | * @param deptId é¨é¨ID |
| | | * @param yearMonth å¹´æ |
| | | */ |
| | | void generateDeptMonthlySummary(Long deptId, String yearMonth); |
| | | |
| | | /** |
| | | * æ¹éçæå
¨å
¬å¸æåº¦æ±æ» |
| | | * |
| | | * @param yearMonth å¹´æ |
| | | */ |
| | | void generateAllMonthlySummary(String yearMonth); |
| | | |
| | | /** |
| | | * è·å¾èå¤ç»è®¡æ±æ»å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢åæ° |
| | | * @return èå¤ç»è®¡æ±æ»å页 |
| | | */ |
| | | PageResult<HrmAttendanceSummaryDO> getAttendanceSummaryPage(HrmAttendanceSummaryPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾åå·¥æåº¦æ±æ» |
| | | * |
| | | * @param userId åå·¥ID |
| | | * @param yearMonth å¹´æ |
| | | * @return èå¤ç»è®¡æ±æ» |
| | | */ |
| | | HrmAttendanceSummaryDO getMonthlySummary(Long userId, String yearMonth); |
| | | |
| | | /** |
| | | * è·å¾é¨é¨æåº¦æ±æ»å表 |
| | | * |
| | | * @param deptId é¨é¨ID |
| | | * @param yearMonth å¹´æ |
| | | * @return èå¤ç»è®¡æ±æ»å表 |
| | | */ |
| | | List<HrmAttendanceSummaryDO> getDeptMonthlySummaryList(Long deptId, String yearMonth); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceSummaryPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRecordDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceSummaryDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceRecordMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceSummaryMapper; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAttendanceClockTypeEnum; |
| | | import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.YearMonth; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èå¤ç»è®¡æ±æ» Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class HrmAttendanceSummaryServiceImpl implements HrmAttendanceSummaryService { |
| | | |
| | | @Resource |
| | | private HrmAttendanceSummaryMapper attendanceSummaryMapper; |
| | | @Resource |
| | | private HrmAttendanceRecordMapper attendanceRecordMapper; |
| | | @Resource |
| | | private HrmEmployeeService employeeService; |
| | | @Resource |
| | | private HrmAttendanceHolidayService attendanceHolidayService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void generateMonthlySummary(Long userId, String yearMonth) { |
| | | // 1. è§£æå¹´æï¼è·å该æèµ·å§æ¥æ |
| | | YearMonth ym = YearMonth.parse(yearMonth); |
| | | LocalDate startDate = ym.atDay(1); |
| | | LocalDate endDate = ym.atEndOfMonth(); |
| | | |
| | | // 2. è·ååå·¥ä¿¡æ¯ |
| | | HrmEmployeeDO employee = employeeService.getEmployee(userId); |
| | | if (employee == null) { |
| | | log.warn("[generateMonthlySummary] åå·¥ä¸åå¨: {}", userId); |
| | | return; |
| | | } |
| | | |
| | | // 3. æ¥è¯¢è¯¥æææèå¤è®°å½ |
| | | List<HrmAttendanceRecordDO> records = attendanceRecordMapper.selectListByUserIdAndDateBetween(userId, startDate, endDate); |
| | | |
| | | // 4. 计ç®åºåºå¤å¤©æ°ï¼å·¥ä½æ¥æ°éï¼ |
| | | int workDays = calculateWorkDays(startDate, endDate); |
| | | |
| | | // 5. ç»è®¡åé¡¹æ°æ® |
| | | int lateCount = 0; |
| | | int earlyCount = 0; |
| | | int absentCount = 0; |
| | | BigDecimal overtimeHours = BigDecimal.ZERO; |
| | | int actualDays = 0; |
| | | |
| | | for (HrmAttendanceRecordDO record : records) { |
| | | // ç»è®¡è¿å° |
| | | if (HrmAttendanceClockTypeEnum.LATE.getType().equals(record.getClockInType())) { |
| | | lateCount++; |
| | | } |
| | | // ç»è®¡æ©é |
| | | if (HrmAttendanceClockTypeEnum.EARLY.getType().equals(record.getClockOutType())) { |
| | | earlyCount++; |
| | | } |
| | | // ç»è®¡ç¼ºå¡ |
| | | if (HrmAttendanceClockTypeEnum.MISSING.getType().equals(record.getClockInType())) { |
| | | absentCount++; |
| | | } |
| | | if (HrmAttendanceClockTypeEnum.MISSING.getType().equals(record.getClockOutType())) { |
| | | absentCount++; |
| | | } |
| | | // 累计å çæ¶é¿ |
| | | if (record.getOvertimeHours() != null) { |
| | | overtimeHours = overtimeHours.add(record.getOvertimeHours()); |
| | | } |
| | | // ç»è®¡å®é
åºå¤å¤©æ°ï¼ææ£å¸¸æå¡è®°å½ï¼ |
| | | if (record.getClockInTime() != null || record.getClockOutTime() != null) { |
| | | actualDays++; |
| | | } |
| | | } |
| | | |
| | | // 6. ä¿åææ´æ°æ±æ»è®°å½ |
| | | HrmAttendanceSummaryDO summary = attendanceSummaryMapper.selectByUserIdAndYearMonth(userId, yearMonth); |
| | | if (summary == null) { |
| | | summary = HrmAttendanceSummaryDO.builder() |
| | | .userId(userId) |
| | | .deptId(employee.getDeptId()) |
| | | .yearMonth(yearMonth) |
| | | .workDays(workDays) |
| | | .actualDays(actualDays) |
| | | .lateCount(lateCount) |
| | | .earlyCount(earlyCount) |
| | | .absentCount(absentCount) |
| | | .overtimeHours(overtimeHours) |
| | | .leaveHours(BigDecimal.ZERO) |
| | | .build(); |
| | | attendanceSummaryMapper.insert(summary); |
| | | } else { |
| | | summary.setWorkDays(workDays); |
| | | summary.setActualDays(actualDays); |
| | | summary.setLateCount(lateCount); |
| | | summary.setEarlyCount(earlyCount); |
| | | summary.setAbsentCount(absentCount); |
| | | summary.setOvertimeHours(overtimeHours); |
| | | attendanceSummaryMapper.updateById(summary); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void generateDeptMonthlySummary(Long deptId, String yearMonth) { |
| | | // è·åé¨é¨ææå¨èåå·¥ |
| | | List<HrmEmployeeDO> employees = employeeService.getEmployeeList(null); |
| | | if (CollUtil.isEmpty(employees)) { |
| | | return; |
| | | } |
| | | // çéé¨é¨åå·¥ |
| | | List<HrmEmployeeDO> deptEmployees = employees.stream() |
| | | .filter(e -> deptId.equals(e.getDeptId())) |
| | | .toList(); |
| | | for (HrmEmployeeDO employee : deptEmployees) { |
| | | generateMonthlySummary(employee.getId(), yearMonth); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void generateAllMonthlySummary(String yearMonth) { |
| | | // è·åææå¨èåå·¥ |
| | | List<HrmEmployeeDO> employees = employeeService.getEmployeeList(null); |
| | | if (CollUtil.isEmpty(employees)) { |
| | | return; |
| | | } |
| | | for (HrmEmployeeDO employee : employees) { |
| | | generateMonthlySummary(employee.getId(), yearMonth); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 计ç®åºåºå¤å¤©æ°ï¼å·¥ä½æ¥æ°éï¼ |
| | | */ |
| | | private int calculateWorkDays(LocalDate startDate, LocalDate endDate) { |
| | | int workDays = 0; |
| | | LocalDate current = startDate; |
| | | while (!current.isAfter(endDate)) { |
| | | if (attendanceHolidayService.isWorkDay(current)) { |
| | | workDays++; |
| | | } |
| | | current = current.plusDays(1); |
| | | } |
| | | return workDays; |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<HrmAttendanceSummaryDO> getAttendanceSummaryPage(HrmAttendanceSummaryPageReqVO pageReqVO) { |
| | | return attendanceSummaryMapper.selectPage(pageReqVO, new LambdaQueryWrapperX<HrmAttendanceSummaryDO>() |
| | | .eqIfPresent(HrmAttendanceSummaryDO::getUserId, pageReqVO.getUserId()) |
| | | .eqIfPresent(HrmAttendanceSummaryDO::getDeptId, pageReqVO.getDeptId()) |
| | | .eqIfPresent(HrmAttendanceSummaryDO::getYearMonth, pageReqVO.getYearMonth()) |
| | | .orderByDesc(HrmAttendanceSummaryDO::getYearMonth) |
| | | .orderByAsc(HrmAttendanceSummaryDO::getDeptId)); |
| | | } |
| | | |
| | | @Override |
| | | public HrmAttendanceSummaryDO getMonthlySummary(Long userId, String yearMonth) { |
| | | return attendanceSummaryMapper.selectByUserIdAndYearMonth(userId, yearMonth); |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmAttendanceSummaryDO> getDeptMonthlySummaryList(Long deptId, String yearMonth) { |
| | | return attendanceSummaryMapper.selectListByDeptIdAndYearMonth(deptId, yearMonth); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.attendance.listener; |
| | | |
| | | import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceExceptionMapper; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAttendanceExceptionTypeEnum; |
| | | import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceExceptionService; |
| | | import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceRecordService; |
| | | import cn.iocoder.yudao.module.hrm.util.HrmAuditStatusUtils; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.context.ApplicationListener; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * èå¤å¼å¸¸ç³è¯·å®¡æ¹çç»æçå¬å¨å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Component |
| | | @Slf4j |
| | | public class HrmAttendanceExceptionStatusListener implements ApplicationListener<BpmProcessInstanceStatusEvent> { |
| | | |
| | | @Resource |
| | | private HrmAttendanceExceptionService attendanceExceptionService; |
| | | @Resource |
| | | private HrmAttendanceExceptionMapper attendanceExceptionMapper; |
| | | @Resource |
| | | private HrmAttendanceRecordService attendanceRecordService; |
| | | |
| | | @Override |
| | | public void onApplicationEvent(BpmProcessInstanceStatusEvent event) { |
| | | // éè¿ businessKey æ¥è¯¢èå¤å¼å¸¸ç³è¯· |
| | | Long exceptionId; |
| | | try { |
| | | exceptionId = Long.parseLong(event.getBusinessKey()); |
| | | } catch (NumberFormatException e) { |
| | | return; |
| | | } |
| | | |
| | | HrmAttendanceExceptionDO exception = attendanceExceptionMapper.selectById(exceptionId); |
| | | if (exception == null) { |
| | | return; |
| | | } |
| | | |
| | | // åªæå®¡æ¹ä¸ç¶æçèå¤å¼å¸¸ç³è¯·æå¤ç |
| | | if (!HrmAuditStatusEnum.PROCESS.getStatus().equals(exception.getStatus())) { |
| | | log.warn("[onApplicationEvent] èå¤å¼å¸¸ç³è¯·({}) ä¸å¤äºå®¡æ¹ä¸ç¶æï¼å½åç¶æ: {}", exceptionId, exception.getStatus()); |
| | | return; |
| | | } |
| | | |
| | | log.info("[onApplicationEvent] èå¤å¼å¸¸ç³è¯·({}) 审æ¹ç¶ææ´æ°: {}", exceptionId, event.getStatus()); |
| | | // 转æ¢å®¡æ¹ç¶æ |
| | | Integer auditStatus = HrmAuditStatusUtils.convertBpmResultToAuditStatus(event.getStatus()); |
| | | // æ´æ°å®¡æ¹ç¶æ |
| | | attendanceExceptionService.updateAttendanceExceptionAuditStatus(exceptionId, auditStatus); |
| | | |
| | | // è¡¥å¡å®¡æ¹éè¿åï¼æ´æ°èå¤è®°å½ |
| | | if (HrmAttendanceExceptionTypeEnum.SUPPLEMENT.getType().equals(exception.getType()) |
| | | && HrmAuditStatusEnum.APPROVE.getStatus().equals(auditStatus)) { |
| | | log.info("[onApplicationEvent] è¡¥å¡ç³è¯·({}) 审æ¹éè¿ï¼å¼å§æ´æ°èå¤è®°å½", exceptionId); |
| | | attendanceRecordService.supplementClockIn(exception); |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.employee; |
| | | |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEducationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEducationDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * åå·¥æè²ç»å Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmEmployeeEducationService { |
| | | |
| | | /** |
| | | * å建æè²ç»å |
| | | */ |
| | | Long createEducation(@Valid HrmEmployeeEducationSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°æè²ç»å |
| | | */ |
| | | void updateEducation(@Valid HrmEmployeeEducationSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å 餿è²ç»å |
| | | */ |
| | | void deleteEducation(Long id); |
| | | |
| | | /** |
| | | * è·å¾æè²ç»åå表 |
| | | */ |
| | | List<HrmEmployeeEducationDO> getEducationListByEmployeeId(Long employeeId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEducationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEducationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeEducationMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_EDUCATION_NOT_EXISTS; |
| | | |
| | | /** |
| | | * åå·¥æè²ç»å Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmEmployeeEducationServiceImpl implements HrmEmployeeEducationService { |
| | | |
| | | @Resource |
| | | private HrmEmployeeEducationMapper educationMapper; |
| | | |
| | | @Override |
| | | public Long createEducation(HrmEmployeeEducationSaveReqVO createReqVO) { |
| | | HrmEmployeeEducationDO education = BeanUtils.toBean(createReqVO, HrmEmployeeEducationDO.class); |
| | | educationMapper.insert(education); |
| | | return education.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateEducation(HrmEmployeeEducationSaveReqVO updateReqVO) { |
| | | validateEducationExists(updateReqVO.getId()); |
| | | HrmEmployeeEducationDO updateObj = BeanUtils.toBean(updateReqVO, HrmEmployeeEducationDO.class); |
| | | educationMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteEducation(Long id) { |
| | | validateEducationExists(id); |
| | | educationMapper.deleteById(id); |
| | | } |
| | | |
| | | private void validateEducationExists(Long id) { |
| | | if (educationMapper.selectById(id) == null) { |
| | | throw exception(EMPLOYEE_EDUCATION_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmEmployeeEducationDO> getEducationListByEmployeeId(Long employeeId) { |
| | | return educationMapper.selectByEmployeeId(employeeId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.employee; |
| | | |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEmergencyContactSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEmergencyContactDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å工紧æ¥è系人 Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmEmployeeEmergencyContactService { |
| | | |
| | | /** |
| | | * å建紧æ¥è系人 |
| | | */ |
| | | Long createEmergencyContact(@Valid HrmEmployeeEmergencyContactSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°ç´§æ¥è系人 |
| | | */ |
| | | void updateEmergencyContact(@Valid HrmEmployeeEmergencyContactSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤ç´§æ¥è系人 |
| | | */ |
| | | void deleteEmergencyContact(Long id); |
| | | |
| | | /** |
| | | * è·å¾ç´§æ¥è系人å表 |
| | | */ |
| | | List<HrmEmployeeEmergencyContactDO> getEmergencyContactListByEmployeeId(Long employeeId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEmergencyContactSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEmergencyContactDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeEmergencyContactMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_EMERGENCY_CONTACT_NOT_EXISTS; |
| | | |
| | | /** |
| | | * å工紧æ¥è系人 Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmEmployeeEmergencyContactServiceImpl implements HrmEmployeeEmergencyContactService { |
| | | |
| | | @Resource |
| | | private HrmEmployeeEmergencyContactMapper emergencyContactMapper; |
| | | |
| | | @Override |
| | | public Long createEmergencyContact(HrmEmployeeEmergencyContactSaveReqVO createReqVO) { |
| | | HrmEmployeeEmergencyContactDO emergencyContact = BeanUtils.toBean(createReqVO, HrmEmployeeEmergencyContactDO.class); |
| | | emergencyContactMapper.insert(emergencyContact); |
| | | return emergencyContact.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateEmergencyContact(HrmEmployeeEmergencyContactSaveReqVO updateReqVO) { |
| | | validateEmergencyContactExists(updateReqVO.getId()); |
| | | HrmEmployeeEmergencyContactDO updateObj = BeanUtils.toBean(updateReqVO, HrmEmployeeEmergencyContactDO.class); |
| | | emergencyContactMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteEmergencyContact(Long id) { |
| | | validateEmergencyContactExists(id); |
| | | emergencyContactMapper.deleteById(id); |
| | | } |
| | | |
| | | private void validateEmergencyContactExists(Long id) { |
| | | if (emergencyContactMapper.selectById(id) == null) { |
| | | throw exception(EMPLOYEE_EMERGENCY_CONTACT_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmEmployeeEmergencyContactDO> getEmergencyContactListByEmployeeId(Long employeeId) { |
| | | return emergencyContactMapper.selectByEmployeeId(employeeId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeePageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeSimpleRespVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * åå·¥ä¿¡æ¯ Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmEmployeeService { |
| | | |
| | | /** |
| | | * å建åå·¥ |
| | | * |
| | | * @param createReqVO åå»ºä¿¡æ¯ |
| | | * @return åå·¥ID |
| | | */ |
| | | Long createEmployee(@Valid HrmEmployeeSaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°åå·¥ |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | | */ |
| | | void updateEmployee(@Valid HrmEmployeeSaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤åå·¥ |
| | | * |
| | | * @param id åå·¥ID |
| | | */ |
| | | void deleteEmployee(Long id); |
| | | |
| | | /** |
| | | * è·å¾åå·¥ |
| | | * |
| | | * @param id åå·¥ID |
| | | * @return åå·¥ |
| | | */ |
| | | HrmEmployeeDO getEmployee(Long id); |
| | | |
| | | /** |
| | | * è·å¾å工详æ
ï¼å«é¨é¨åç§°ãå²ä½åç§°ï¼ |
| | | * |
| | | * @param id åå·¥ID |
| | | * @return å工详æ
|
| | | */ |
| | | HrmEmployeeRespVO getEmployeeDetail(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªåå·¥æ¯å¦åå¨ |
| | | * |
| | | * @param id åå·¥ID |
| | | * @return åå·¥ |
| | | */ |
| | | HrmEmployeeDO validateEmployee(Long id); |
| | | |
| | | /** |
| | | * è·å¾åå·¥å页 |
| | | * |
| | | * @param pageReqVO å页æ¥è¯¢ |
| | | * @return åå·¥å页 |
| | | */ |
| | | PageResult<HrmEmployeeDO> getEmployeePage(HrmEmployeePageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾åå·¥å表 |
| | | * |
| | | * @param ids åå·¥IDå表 |
| | | * @return åå·¥å表 |
| | | */ |
| | | List<HrmEmployeeDO> getEmployeeList(Collection<Long> ids); |
| | | |
| | | /** |
| | | * è·å¾æå®ç¶æçåå·¥ç®åå表 |
| | | * |
| | | * @param employeeStatus åå·¥ç¶æï¼ä¸º null æ¶æ¥è¯¢å
¨é¨ |
| | | * @return åå·¥ç®åå表 |
| | | */ |
| | | List<HrmEmployeeSimpleRespVO> getEmployeeSimpleList(Integer employeeStatus); |
| | | |
| | | /** |
| | | * æ ¹æ®ç³»ç»ç¨æ·IDè·ååå·¥ |
| | | * |
| | | * @param userId ç³»ç»ç¨æ·ID |
| | | * @return åå·¥ |
| | | */ |
| | | HrmEmployeeDO getEmployeeByUserId(Long userId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.employee; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEducationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEmergencyContactSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeePageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeSimpleRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeWorkHistorySaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEducationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEmergencyContactDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeWorkHistoryDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeEducationMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeEmergencyContactMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeWorkHistoryMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.PostApi; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.permission.RoleApi; |
| | | import cn.iocoder.yudao.module.system.api.permission.dto.RoleRespDTO; |
| | | import cn.iocoder.yudao.module.system.api.user.AdminUserApi; |
| | | import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.Collection; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * åå·¥ä¿¡æ¯ Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmEmployeeServiceImpl implements HrmEmployeeService { |
| | | |
| | | @Resource |
| | | private HrmEmployeeMapper employeeMapper; |
| | | @Resource |
| | | private HrmEmployeeEducationMapper educationMapper; |
| | | @Resource |
| | | private HrmEmployeeWorkHistoryMapper workHistoryMapper; |
| | | @Resource |
| | | private HrmEmployeeEmergencyContactMapper emergencyContactMapper; |
| | | @Resource |
| | | private HrmNoRedisDAO noRedisDAO; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | @Resource |
| | | private PostApi postApi; |
| | | @Resource |
| | | private AdminUserApi adminUserApi; |
| | | @Resource |
| | | private RoleApi roleApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createEmployee(HrmEmployeeSaveReqVO createReqVO) { |
| | | // 1. æ ¡éªé¨é¨ |
| | | deptApi.validateDeptList(Collections.singleton(createReqVO.getDeptId())); |
| | | // 2. æ ¡éªå²ä½ |
| | | postApi.validPostList(Collections.singleton(createReqVO.getPostId())); |
| | | // 3. æ ¡éªææºå·æ¯å¦å·²åå¨ |
| | | if (employeeMapper.selectByPhone(createReqVO.getPhone()) != null) { |
| | | throw exception(EMPLOYEE_PHONE_EXISTS); |
| | | } |
| | | // 4. 忥å建系ç»ç¨æ· |
| | | AdminUserCreateReqDTO userCreateReqDTO = new AdminUserCreateReqDTO(); |
| | | userCreateReqDTO.setUsername(createReqVO.getPhone()); |
| | | userCreateReqDTO.setNickname(createReqVO.getName()); |
| | | userCreateReqDTO.setDeptId(createReqVO.getDeptId()); |
| | | userCreateReqDTO.setPostIds(Collections.singleton(createReqVO.getPostId())); |
| | | userCreateReqDTO.setMobile(createReqVO.getPhone()); |
| | | userCreateReqDTO.setPassword(createReqVO.getPhone()); |
| | | userCreateReqDTO.setSex(createReqVO.getGender()); |
| | | userCreateReqDTO.setEmail(createReqVO.getEmail()); |
| | | userCreateReqDTO.setRemark(createReqVO.getRemark()); |
| | | // 设置è§è² |
| | | if (CollUtil.isNotEmpty(createReqVO.getRoleIds())) { |
| | | userCreateReqDTO.setRoleIds(createReqVO.getRoleIds().stream().collect(Collectors.toSet())); |
| | | } |
| | | Long userId = adminUserApi.createUser(userCreateReqDTO); |
| | | // 5. çæåå·¥ç¼å· |
| | | String employeeNo = generateUniqueEmployeeNo(); |
| | | // 6. æå
¥åå·¥è®°å½ |
| | | HrmEmployeeDO employee = BeanUtils.toBean(createReqVO, HrmEmployeeDO.class); |
| | | employee.setEmployeeNo(employeeNo); |
| | | employee.setUserId(userId); // å
³èç³»ç»ç¨æ·ID |
| | | // roleIds åå¨ä¸º JSON |
| | | if (CollUtil.isNotEmpty(createReqVO.getRoleIds())) { |
| | | employee.setRoleIds(JSONUtil.toJsonStr(createReqVO.getRoleIds())); |
| | | } |
| | | employeeMapper.insert(employee); |
| | | Long employeeId = employee.getId(); |
| | | // 7. åæ¥æ·»å æè²ç»å |
| | | if (CollUtil.isNotEmpty(createReqVO.getEducationList())) { |
| | | createReqVO.getEducationList().forEach(educationVO -> { |
| | | HrmEmployeeEducationDO education = BeanUtils.toBean(educationVO, HrmEmployeeEducationDO.class); |
| | | education.setEmployeeId(employeeId); |
| | | educationMapper.insert(education); |
| | | }); |
| | | } |
| | | // 8. åæ¥æ·»å å·¥ä½ç»å |
| | | if (CollUtil.isNotEmpty(createReqVO.getWorkHistoryList())) { |
| | | createReqVO.getWorkHistoryList().forEach(workHistoryVO -> { |
| | | HrmEmployeeWorkHistoryDO workHistory = BeanUtils.toBean(workHistoryVO, HrmEmployeeWorkHistoryDO.class); |
| | | workHistory.setEmployeeId(employeeId); |
| | | workHistoryMapper.insert(workHistory); |
| | | }); |
| | | } |
| | | // 9. åæ¥æ·»å ç´§æ¥è系人 |
| | | if (CollUtil.isNotEmpty(createReqVO.getEmergencyContactList())) { |
| | | createReqVO.getEmergencyContactList().forEach(emergencyContactVO -> { |
| | | HrmEmployeeEmergencyContactDO emergencyContact = BeanUtils.toBean(emergencyContactVO, HrmEmployeeEmergencyContactDO.class); |
| | | emergencyContact.setEmployeeId(employeeId); |
| | | emergencyContactMapper.insert(emergencyContact); |
| | | }); |
| | | } |
| | | return employeeId; |
| | | } |
| | | |
| | | private String generateUniqueEmployeeNo() { |
| | | String employeeNo = noRedisDAO.generateEmployeeNo(); |
| | | if (employeeMapper.selectByEmployeeNo(employeeNo) != null) { |
| | | return generateUniqueEmployeeNo(); |
| | | } |
| | | return employeeNo; |
| | | } |
| | | |
| | | @Override |
| | | public void updateEmployee(HrmEmployeeSaveReqVO updateReqVO) { |
| | | // æ ¡éªåå¨ |
| | | HrmEmployeeDO employee = validateEmployeeExists(updateReqVO.getId()); |
| | | // æ ¡éªé¨é¨ |
| | | deptApi.validateDeptList(Collections.singleton(updateReqVO.getDeptId())); |
| | | // æ ¡éªå²ä½ |
| | | postApi.validPostList(Collections.singleton(updateReqVO.getPostId())); |
| | | // æ ¡éªææºå·æ¯å¦å·²åå¨ï¼å¦æææºå·æåæ´ï¼ |
| | | if (!Objects.equals(employee.getPhone(), updateReqVO.getPhone()) |
| | | && employeeMapper.selectByPhone(updateReqVO.getPhone()) != null) { |
| | | throw exception(EMPLOYEE_PHONE_EXISTS); |
| | | } |
| | | // æ´æ° |
| | | HrmEmployeeDO updateObj = BeanUtils.toBean(updateReqVO, HrmEmployeeDO.class); |
| | | // roleIds åå¨ä¸º JSON |
| | | if (CollUtil.isNotEmpty(updateReqVO.getRoleIds())) { |
| | | updateObj.setRoleIds(JSONUtil.toJsonStr(updateReqVO.getRoleIds())); |
| | | } |
| | | employeeMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteEmployee(Long id) { |
| | | // æ ¡éªåå¨ |
| | | validateEmployeeExists(id); |
| | | // å é¤ |
| | | employeeMapper.deleteById(id); |
| | | } |
| | | |
| | | private HrmEmployeeDO validateEmployeeExists(Long id) { |
| | | HrmEmployeeDO employee = employeeMapper.selectById(id); |
| | | if (employee == null) { |
| | | throw exception(EMPLOYEE_NOT_EXISTS); |
| | | } |
| | | return employee; |
| | | } |
| | | |
| | | @Override |
| | | public HrmEmployeeDO getEmployee(Long id) { |
| | | return employeeMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public HrmEmployeeRespVO getEmployeeDetail(Long id) { |
| | | HrmEmployeeDO employee = getEmployee(id); |
| | | if (employee == null) { |
| | | return null; |
| | | } |
| | | HrmEmployeeRespVO respVO = BeanUtils.toBean(employee, HrmEmployeeRespVO.class); |
| | | // è§£æ roleIds JSON |
| | | if (StrUtil.isNotBlank(employee.getRoleIds())) { |
| | | respVO.setRoleIds(JSONUtil.toList(employee.getRoleIds(), Long.class)); |
| | | } |
| | | // å¡«å
é¨é¨åç§° |
| | | if (employee.getDeptId() != null) { |
| | | DeptRespDTO dept = deptApi.getDept(employee.getDeptId()); |
| | | if (dept != null) { |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | // å¡«å
å²ä½åç§° |
| | | if (employee.getPostId() != null) { |
| | | Map<Long, PostRespDTO> postMap = postApi.getPostMap(Collections.singleton(employee.getPostId())); |
| | | PostRespDTO post = postMap.get(employee.getPostId()); |
| | | if (post != null) { |
| | | respVO.setPostName(post.getName()); |
| | | } |
| | | } |
| | | // å¡«å
è§è²åç§° |
| | | if (CollUtil.isNotEmpty(respVO.getRoleIds())) { |
| | | List<RoleRespDTO> roles = roleApi.getRoleList(respVO.getRoleIds()); |
| | | if (CollUtil.isNotEmpty(roles)) { |
| | | respVO.setRoleNames(roles.stream().map(RoleRespDTO::getName).collect(Collectors.joining(","))); |
| | | } |
| | | } |
| | | return respVO; |
| | | } |
| | | |
| | | @Override |
| | | public HrmEmployeeDO validateEmployee(Long id) { |
| | | HrmEmployeeDO employee = employeeMapper.selectById(id); |
| | | if (employee == null) { |
| | | throw exception(EMPLOYEE_NOT_EXISTS); |
| | | } |
| | | return employee; |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<HrmEmployeeDO> getEmployeePage(HrmEmployeePageReqVO pageReqVO) { |
| | | return employeeMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmEmployeeDO> getEmployeeList(Collection<Long> ids) { |
| | | return employeeMapper.selectByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmEmployeeSimpleRespVO> getEmployeeSimpleList(Integer employeeStatus) { |
| | | List<HrmEmployeeDO> list = employeeMapper.selectListByStatus(employeeStatus); |
| | | // å¡«å
é¨é¨åç§° |
| | | Set<Long> deptIds = list.stream() |
| | | .map(HrmEmployeeDO::getDeptId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(deptIds); |
| | | return list.stream().map(emp -> { |
| | | HrmEmployeeSimpleRespVO vo = new HrmEmployeeSimpleRespVO(); |
| | | vo.setId(emp.getId()); |
| | | vo.setEmployeeNo(emp.getEmployeeNo()); |
| | | vo.setName(emp.getName()); |
| | | vo.setEmployeeStatus(emp.getEmployeeStatus()); |
| | | if (emp.getDeptId() != null && deptMap.containsKey(emp.getDeptId())) { |
| | | vo.setDeptName(deptMap.get(emp.getDeptId()).getName()); |
| | | } |
| | | return vo; |
| | | }).collect(Collectors.toList()); |
| | | } |
| | | |
| | | @Override |
| | | public HrmEmployeeDO getEmployeeByUserId(Long userId) { |
| | | return employeeMapper.selectByUserId(userId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.employee; |
| | | |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeWorkHistorySaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeWorkHistoryDO; |
| | | import jakarta.validation.Valid; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å工工ä½ç»å Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmEmployeeWorkHistoryService { |
| | | |
| | | /** |
| | | * å建工ä½ç»å |
| | | */ |
| | | Long createWorkHistory(@Valid HrmEmployeeWorkHistorySaveReqVO createReqVO); |
| | | |
| | | /** |
| | | * æ´æ°å·¥ä½ç»å |
| | | */ |
| | | void updateWorkHistory(@Valid HrmEmployeeWorkHistorySaveReqVO updateReqVO); |
| | | |
| | | /** |
| | | * å é¤å·¥ä½ç»å |
| | | */ |
| | | void deleteWorkHistory(Long id); |
| | | |
| | | /** |
| | | * è·å¾å·¥ä½ç»åå表 |
| | | */ |
| | | List<HrmEmployeeWorkHistoryDO> getWorkHistoryListByEmployeeId(Long employeeId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.employee; |
| | | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeWorkHistorySaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeWorkHistoryDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeWorkHistoryMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_WORK_HISTORY_NOT_EXISTS; |
| | | |
| | | /** |
| | | * å工工ä½ç»å Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmEmployeeWorkHistoryServiceImpl implements HrmEmployeeWorkHistoryService { |
| | | |
| | | @Resource |
| | | private HrmEmployeeWorkHistoryMapper workHistoryMapper; |
| | | |
| | | @Override |
| | | public Long createWorkHistory(HrmEmployeeWorkHistorySaveReqVO createReqVO) { |
| | | HrmEmployeeWorkHistoryDO workHistory = BeanUtils.toBean(createReqVO, HrmEmployeeWorkHistoryDO.class); |
| | | workHistoryMapper.insert(workHistory); |
| | | return workHistory.getId(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateWorkHistory(HrmEmployeeWorkHistorySaveReqVO updateReqVO) { |
| | | validateWorkHistoryExists(updateReqVO.getId()); |
| | | HrmEmployeeWorkHistoryDO updateObj = BeanUtils.toBean(updateReqVO, HrmEmployeeWorkHistoryDO.class); |
| | | workHistoryMapper.updateById(updateObj); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteWorkHistory(Long id) { |
| | | validateWorkHistoryExists(id); |
| | | workHistoryMapper.deleteById(id); |
| | | } |
| | | |
| | | private void validateWorkHistoryExists(Long id) { |
| | | if (workHistoryMapper.selectById(id) == null) { |
| | | throw exception(EMPLOYEE_WORK_HISTORY_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmEmployeeWorkHistoryDO> getWorkHistoryListByEmployeeId(Long employeeId) { |
| | | return workHistoryMapper.selectByEmployeeId(employeeId); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.salary; |
| | | |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSocialSecurityConfigDO; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * èªé
¬æ£é¤è®¡ç® Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmDeductionService { |
| | | |
| | | /** |
| | | * 计ç®ç¤¾ä¿æ£é¤ï¼ä¸ªäººé¨åï¼ |
| | | * |
| | | * @param socialSecurityBase 社ä¿åºæ° |
| | | * @param effectiveDate çææ¥æ |
| | | * @return ç¤¾ä¿æ£é¤éé¢ |
| | | */ |
| | | BigDecimal calculateSocialSecurityDeduction(BigDecimal socialSecurityBase, LocalDate effectiveDate); |
| | | |
| | | /** |
| | | * 计ç®å
¬ç§¯éæ£é¤ï¼ä¸ªäººé¨åï¼ |
| | | * |
| | | * @param housingFundBase å
¬ç§¯éåºæ° |
| | | * @param effectiveDate çææ¥æ |
| | | * @return å
¬ç§¯éæ£é¤éé¢ |
| | | */ |
| | | BigDecimal calculateHousingFundDeduction(BigDecimal housingFundBase, LocalDate effectiveDate); |
| | | |
| | | /** |
| | | * 计ç®ä¸ªç¨æ£é¤ |
| | | * |
| | | * @param taxableIncome åºçº³ç¨æå¾é¢ï¼ææ¶å
¥ - 社ä¿å
¬ç§¯é - ä¸é¡¹æ£é¤ - 5000èµ·å¾ç¹ï¼ |
| | | * @param effectiveDate çææ¥æ |
| | | * @return ä¸ªç¨æ£é¤éé¢ |
| | | */ |
| | | BigDecimal calculateTaxDeduction(BigDecimal taxableIncome, LocalDate effectiveDate); |
| | | |
| | | /** |
| | | * è·åææ°ç社ä¿å
¬ç§¯éé
ç½® |
| | | * |
| | | * @param effectiveDate çææ¥æ |
| | | * @return 社ä¿å
¬ç§¯éé
ç½® |
| | | */ |
| | | HrmSocialSecurityConfigDO getLatestSocialSecurityConfig(LocalDate effectiveDate); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.salary; |
| | | |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSocialSecurityConfigDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmTaxRateConfigDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmSocialSecurityConfigMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmTaxRateConfigMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDate; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èªé
¬æ£é¤è®¡ç® Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmDeductionServiceImpl implements HrmDeductionService { |
| | | |
| | | /** |
| | | * 个ç¨èµ·å¾ç¹ï¼æ¯æ5000å
ï¼ |
| | | */ |
| | | private static final BigDecimal TAX_THRESHOLD = new BigDecimal("5000"); |
| | | |
| | | /** |
| | | * é»è®¤ç¼´çº³æ¯ä¾ï¼å½å工档æ¡ä¸æ²¡æé
ç½®æ¶ä½¿ç¨ï¼ |
| | | */ |
| | | private static final BigDecimal DEFAULT_PENSION_PERSONAL_RATIO = new BigDecimal("0.08"); |
| | | private static final BigDecimal DEFAULT_MEDICAL_PERSONAL_RATIO = new BigDecimal("0.02"); |
| | | private static final BigDecimal DEFAULT_UNEMPLOYMENT_PERSONAL_RATIO = new BigDecimal("0.005"); |
| | | private static final BigDecimal DEFAULT_HOUSING_FUND_PERSONAL_RATIO = new BigDecimal("0.12"); |
| | | |
| | | @Resource |
| | | private HrmSocialSecurityConfigMapper socialSecurityConfigMapper; |
| | | @Resource |
| | | private HrmTaxRateConfigMapper taxRateConfigMapper; |
| | | |
| | | @Override |
| | | public BigDecimal calculateSocialSecurityDeduction(BigDecimal socialSecurityBase, LocalDate effectiveDate) { |
| | | // æ¤æ¹æ³ä¿çä½ä¸ºå¤ç¨ï¼ä½ä¸æ¨èä½¿ç¨ |
| | | // æ¨èä½¿ç¨ calculateSocialSecurityDeductionByConfig æ¹æ³ |
| | | if (socialSecurityBase == null || socialSecurityBase.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | // 使ç¨é»è®¤æ¯ä¾è®¡ç® |
| | | BigDecimal pension = socialSecurityBase.multiply(DEFAULT_PENSION_PERSONAL_RATIO); |
| | | BigDecimal medical = socialSecurityBase.multiply(DEFAULT_MEDICAL_PERSONAL_RATIO); |
| | | BigDecimal unemployment = socialSecurityBase.multiply(DEFAULT_UNEMPLOYMENT_PERSONAL_RATIO); |
| | | return pension.add(medical).add(unemployment).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | @Override |
| | | public BigDecimal calculateHousingFundDeduction(BigDecimal housingFundBase, LocalDate effectiveDate) { |
| | | // æ¤æ¹æ³ä¿çä½ä¸ºå¤ç¨ï¼ä½ä¸æ¨èä½¿ç¨ |
| | | if (housingFundBase == null || housingFundBase.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | // 使ç¨é»è®¤æ¯ä¾è®¡ç® |
| | | return housingFundBase.multiply(DEFAULT_HOUSING_FUND_PERSONAL_RATIO).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®åå·¥ç¤¾ä¿æ¡£æ¡é
置计ç®ç¤¾ä¿æ£é¤ï¼ä¸ªäººé¨åï¼ |
| | | * |
| | | * @param socialSecurityBase 社ä¿åºæ° |
| | | * @param pensionPersonalRatio å
»èä¿é©ä¸ªäººç¼´çº³æ¯ä¾ |
| | | * @param medicalPersonalRatio å»çä¿é©ä¸ªäººç¼´çº³æ¯ä¾ |
| | | * @param unemploymentPersonalRatio 失ä¸ä¿é©ä¸ªäººç¼´çº³æ¯ä¾ |
| | | * @return ç¤¾ä¿æ£é¤éé¢ |
| | | */ |
| | | public BigDecimal calculateSocialSecurityDeductionByConfig( |
| | | BigDecimal socialSecurityBase, |
| | | BigDecimal pensionPersonalRatio, |
| | | BigDecimal medicalPersonalRatio, |
| | | BigDecimal unemploymentPersonalRatio) { |
| | | if (socialSecurityBase == null || socialSecurityBase.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | // 使ç¨ä¼ å
¥çæ¯ä¾ï¼å¦æä¸ºç©ºå使ç¨é»è®¤å¼ |
| | | BigDecimal pensionRatio = pensionPersonalRatio != null ? pensionPersonalRatio : DEFAULT_PENSION_PERSONAL_RATIO; |
| | | BigDecimal medicalRatio = medicalPersonalRatio != null ? medicalPersonalRatio : DEFAULT_MEDICAL_PERSONAL_RATIO; |
| | | BigDecimal unemploymentRatio = unemploymentPersonalRatio != null ? unemploymentPersonalRatio : DEFAULT_UNEMPLOYMENT_PERSONAL_RATIO; |
| | | |
| | | // 计ç®ä¸ªäººç¼´çº³é¨åï¼å
»è + å»ç + å¤±ä¸ |
| | | BigDecimal pension = socialSecurityBase.multiply(pensionRatio); |
| | | BigDecimal medical = socialSecurityBase.multiply(medicalRatio); |
| | | BigDecimal unemployment = socialSecurityBase.multiply(unemploymentRatio); |
| | | |
| | | return pension.add(medical).add(unemployment).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®åå·¥ç¤¾ä¿æ¡£æ¡é
置计ç®å
¬ç§¯éæ£é¤ï¼ä¸ªäººé¨åï¼ |
| | | * |
| | | * @param housingFundBase å
¬ç§¯éåºæ° |
| | | * @param housingFundPersonalRatio å
¬ç§¯é个人缴纳æ¯ä¾ |
| | | * @return å
¬ç§¯éæ£é¤éé¢ |
| | | */ |
| | | public BigDecimal calculateHousingFundDeductionByConfig( |
| | | BigDecimal housingFundBase, |
| | | BigDecimal housingFundPersonalRatio) { |
| | | if (housingFundBase == null || housingFundBase.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | // 使ç¨ä¼ å
¥çæ¯ä¾ï¼å¦æä¸ºç©ºå使ç¨é»è®¤å¼ |
| | | BigDecimal ratio = housingFundPersonalRatio != null ? housingFundPersonalRatio : DEFAULT_HOUSING_FUND_PERSONAL_RATIO; |
| | | |
| | | return housingFundBase.multiply(ratio).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | @Override |
| | | public BigDecimal calculateTaxDeduction(BigDecimal taxableIncome, LocalDate effectiveDate) { |
| | | if (taxableIncome == null || taxableIncome.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | List<HrmTaxRateConfigDO> taxRates = taxRateConfigMapper.selectListByEffectiveDate(effectiveDate); |
| | | if (taxRates == null || taxRates.isEmpty()) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | // æ¥æ¾å¯¹åºçç¨çæ¡£ä½ |
| | | for (HrmTaxRateConfigDO taxRate : taxRates) { |
| | | BigDecimal minAmount = taxRate.getMinAmount(); |
| | | BigDecimal maxAmount = taxRate.getMaxAmount(); |
| | | |
| | | // 夿æ¯å¦å¨è¯¥æ¡£ä½èå´å
ï¼maxAmount为0表示æ ä¸éï¼ |
| | | boolean inRange = taxableIncome.compareTo(minAmount) >= 0 |
| | | && (maxAmount.compareTo(BigDecimal.ZERO) == 0 || taxableIncome.compareTo(maxAmount) < 0); |
| | | |
| | | if (inRange) { |
| | | // 计ç®ä¸ªç¨ = åºçº³ç¨æå¾é¢ * ç¨ç - éç®æ£é¤æ° |
| | | return taxableIncome.multiply(taxRate.getTaxRate()) |
| | | .subtract(taxRate.getQuickDeduction()) |
| | | .setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | } |
| | | |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | @Override |
| | | public HrmSocialSecurityConfigDO getLatestSocialSecurityConfig(LocalDate effectiveDate) { |
| | | return socialSecurityConfigMapper.selectLatestByEffectiveDate(effectiveDate); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmEmployeeSocialSecurityPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmEmployeeSocialSecurityDO; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * å工社ä¿å
¬ç§¯éæ¡£æ¡ Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmEmployeeSocialSecurityService { |
| | | |
| | | /** |
| | | * å建å工社ä¿å
¬ç§¯éæ¡£æ¡ |
| | | */ |
| | | Long createEmployeeSocialSecurity(HrmEmployeeSocialSecurityDO socialSecurity); |
| | | |
| | | /** |
| | | * æ´æ°å工社ä¿å
¬ç§¯éæ¡£æ¡ |
| | | */ |
| | | void updateEmployeeSocialSecurity(HrmEmployeeSocialSecurityDO socialSecurity); |
| | | |
| | | /** |
| | | * å é¤å工社ä¿å
¬ç§¯éæ¡£æ¡ |
| | | */ |
| | | void deleteEmployeeSocialSecurity(Long id); |
| | | |
| | | /** |
| | | * è·åå工社ä¿å
¬ç§¯éæ¡£æ¡ |
| | | */ |
| | | HrmEmployeeSocialSecurityDO getEmployeeSocialSecurity(Long id); |
| | | |
| | | /** |
| | | * è·åå工社ä¿å
¬ç§¯éæ¡£æ¡å页 |
| | | */ |
| | | PageResult<HrmEmployeeSocialSecurityDO> getEmployeeSocialSecurityPage(HrmEmployeeSocialSecurityPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·ååå·¥ææ°çæç社ä¿å
¬ç§¯éæ¡£æ¡ |
| | | */ |
| | | HrmEmployeeSocialSecurityDO getLatestEmployeeSocialSecurity(Long userId); |
| | | |
| | | /** |
| | | * è·åå工社ä¿å
¬ç§¯éæ¡£æ¡åå²å表 |
| | | */ |
| | | List<HrmEmployeeSocialSecurityDO> getEmployeeSocialSecurityList(Long userId); |
| | | |
| | | /** |
| | | * æ¹éå建å工社ä¿å
¬ç§¯éæ¡£æ¡ï¼æ ¹æ®åå·¥åè¡¨ï¼ |
| | | */ |
| | | void batchCreateEmployeeSocialSecurity(List<HrmEmployeeSocialSecurityDO> socialSecurityList); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmEmployeeSocialSecurityPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmEmployeeSocialSecurityDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmEmployeeSocialSecurityMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_SOCIAL_SECURITY_NOT_EXISTS; |
| | | |
| | | /** |
| | | * å工社ä¿å
¬ç§¯éæ¡£æ¡ Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmEmployeeSocialSecurityServiceImpl implements HrmEmployeeSocialSecurityService { |
| | | |
| | | @Resource |
| | | private HrmEmployeeSocialSecurityMapper employeeSocialSecurityMapper; |
| | | |
| | | @Override |
| | | public Long createEmployeeSocialSecurity(HrmEmployeeSocialSecurityDO socialSecurity) { |
| | | employeeSocialSecurityMapper.insert(socialSecurity); |
| | | return socialSecurity.getId(); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void batchCreateEmployeeSocialSecurity(List<HrmEmployeeSocialSecurityDO> socialSecurityList) { |
| | | for (HrmEmployeeSocialSecurityDO socialSecurity : socialSecurityList) { |
| | | employeeSocialSecurityMapper.insert(socialSecurity); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void updateEmployeeSocialSecurity(HrmEmployeeSocialSecurityDO socialSecurity) { |
| | | validateEmployeeSocialSecurityExists(socialSecurity.getId()); |
| | | employeeSocialSecurityMapper.updateById(socialSecurity); |
| | | } |
| | | |
| | | @Override |
| | | public void deleteEmployeeSocialSecurity(Long id) { |
| | | validateEmployeeSocialSecurityExists(id); |
| | | employeeSocialSecurityMapper.deleteById(id); |
| | | } |
| | | |
| | | @Override |
| | | public HrmEmployeeSocialSecurityDO getEmployeeSocialSecurity(Long id) { |
| | | return employeeSocialSecurityMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | public PageResult<HrmEmployeeSocialSecurityDO> getEmployeeSocialSecurityPage(HrmEmployeeSocialSecurityPageReqVO pageReqVO) { |
| | | return employeeSocialSecurityMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public HrmEmployeeSocialSecurityDO getLatestEmployeeSocialSecurity(Long userId) { |
| | | return employeeSocialSecurityMapper.selectLatestByUserId(userId); |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmEmployeeSocialSecurityDO> getEmployeeSocialSecurityList(Long userId) { |
| | | return employeeSocialSecurityMapper.selectListByUserId(userId); |
| | | } |
| | | |
| | | private void validateEmployeeSocialSecurityExists(Long id) { |
| | | if (employeeSocialSecurityMapper.selectById(id) == null) { |
| | | throw exception(EMPLOYEE_SOCIAL_SECURITY_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.salary; |
| | | |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmLeaveTypeConfigDO; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 请åç±»åæ£æ¬¾é
ç½® Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmLeaveTypeConfigService { |
| | | |
| | | /** |
| | | * è·åææè¯·åç±»åé
ç½®å表 |
| | | */ |
| | | List<HrmLeaveTypeConfigDO> getLeaveTypeConfigList(); |
| | | |
| | | /** |
| | | * è·å请åç±»åé
ç½® |
| | | */ |
| | | HrmLeaveTypeConfigDO getLeaveTypeConfig(Integer leaveType); |
| | | |
| | | /** |
| | | * æ´æ°è¯·åç±»åé
ç½® |
| | | */ |
| | | void updateLeaveTypeConfig(HrmLeaveTypeConfigDO config); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.salary; |
| | | |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmLeaveTypeConfigDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmLeaveTypeConfigMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.LEAVE_TYPE_CONFIG_NOT_EXISTS; |
| | | |
| | | /** |
| | | * 请åç±»åæ£æ¬¾é
ç½® Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmLeaveTypeConfigServiceImpl implements HrmLeaveTypeConfigService { |
| | | |
| | | @Resource |
| | | private HrmLeaveTypeConfigMapper leaveTypeConfigMapper; |
| | | |
| | | @Override |
| | | public List<HrmLeaveTypeConfigDO> getLeaveTypeConfigList() { |
| | | return leaveTypeConfigMapper.selectList(); |
| | | } |
| | | |
| | | @Override |
| | | public HrmLeaveTypeConfigDO getLeaveTypeConfig(Integer leaveType) { |
| | | return leaveTypeConfigMapper.selectByLeaveType(leaveType); |
| | | } |
| | | |
| | | @Override |
| | | public void updateLeaveTypeConfig(HrmLeaveTypeConfigDO config) { |
| | | validateLeaveTypeConfigExists(config.getId()); |
| | | leaveTypeConfigMapper.updateById(config); |
| | | } |
| | | |
| | | private void validateLeaveTypeConfigExists(Long id) { |
| | | if (leaveTypeConfigMapper.selectById(id) == null) { |
| | | throw exception(LEAVE_TYPE_CONFIG_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.salary; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryCalculationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryCalculationDO; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * èªé
¬æ ¸ç® Service æ¥å£ |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | public interface HrmSalaryCalculationService { |
| | | |
| | | /** |
| | | * è·å¾èªé
¬æ ¸ç®å页 |
| | | */ |
| | | PageResult<HrmSalaryCalculationDO> getSalaryCalculationPage(HrmSalaryCalculationPageReqVO pageReqVO); |
| | | |
| | | /** |
| | | * è·å¾èªé
¬æ ¸ç® |
| | | */ |
| | | HrmSalaryCalculationDO getSalaryCalculation(Long id); |
| | | |
| | | /** |
| | | * æ§è¡èªé
¬æ ¸ç®ï¼æå¨æï¼ |
| | | * |
| | | * @param period æ ¸ç®å¨æï¼æ ¼å¼å¦ 2024-01 |
| | | */ |
| | | void calculateSalary(String period); |
| | | |
| | | /** |
| | | * æ§è¡èªé
¬æ ¸ç®ï¼æå¨æåé¨é¨ï¼ |
| | | * |
| | | * @param period æ ¸ç®å¨æï¼æ ¼å¼å¦ 2024-01 |
| | | * @param deptId é¨é¨IDï¼ä¸ºç©ºåæ ¸ç®ææé¨é¨ |
| | | */ |
| | | void calculateSalary(String period, Long deptId); |
| | | |
| | | /** |
| | | * æ¹é确认èªé
¬æ ¸ç® |
| | | * |
| | | * @param ids æ ¸ç®IDå表 |
| | | */ |
| | | void confirmSalaryCalculation(List<Long> ids); |
| | | |
| | | /** |
| | | * æ¤éèªé
¬æ ¸ç®ç¡®è®¤ |
| | | * å°å·²ç¡®è®¤çæ ¸ç®è®°å½ç¶ææ¢å¤ä¸ºå¾
确认ï¼åæ¶å é¤å
³èçåæ¾æç» |
| | | * |
| | | * @param ids æ ¸ç®IDå表 |
| | | */ |
| | | void revokeSalaryCalculation(List<Long> ids); |
| | | |
| | | /** |
| | | * å é¤èªé
¬æ ¸ç®è®°å½ï¼ä»
å¾
ç¡®è®¤ç¶æå¯å é¤ï¼ |
| | | * |
| | | * @param id æ ¸ç®ID |
| | | */ |
| | | void deleteSalaryCalculation(Long id); |
| | | |
| | | /** |
| | | * è·å¾æå®å¨æçèªé
¬æ ¸ç®å表 |
| | | */ |
| | | List<HrmSalaryCalculationDO> getSalaryCalculationListByPeriod(String period); |
| | | |
| | | /** |
| | | * é¢è§é¨é¨ä¸ææåå·¥çèªèµæ ¸ç®ä¿¡æ¯ï¼å·²è®¡ç®å¥½çï¼ |
| | | * |
| | | * @param period æ ¸ç®å¨æï¼æ ¼å¼å¦ 2024-01 |
| | | * @param deptId é¨é¨ID |
| | | * @return èªé
¬æ ¸ç®å表 |
| | | */ |
| | | List<HrmSalaryCalculationDO> previewSalaryCalculation(String period, Long deptId); |
| | | |
| | | /** |
| | | * æ¹éä¿åèªé
¬æ ¸ç®è®°å½ |
| | | * |
| | | * @param calculationList èªé
¬æ ¸ç®å表 |
| | | */ |
| | | void saveSalaryCalculationList(List<HrmSalaryCalculationDO> calculationList); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.service.salary; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryCalculationPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmLeaveApplicationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmEmployeeSalaryDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmEmployeeSocialSecurityDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmLeaveTypeConfigDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryCalculationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryPaymentDetailDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryPaymentDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSocialSecuritySchemeDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmLeaveApplicationMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmEmployeeSalaryMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmEmployeeSocialSecurityMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmLeaveTypeConfigMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmSalaryCalculationMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmSalaryPaymentDetailMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmSalaryPaymentMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmSocialSecuritySchemeMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO; |
| | | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.YearMonth; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*; |
| | | |
| | | /** |
| | | * é
¬æ ¸ç® Service å®ç°ç±» |
| | | * |
| | | * @author èéæºç |
| | | */ |
| | | @Service |
| | | @Validated |
| | | public class HrmSalaryCalculationServiceImpl implements HrmSalaryCalculationService { |
| | | |
| | | /** |
| | | * 个ç¨èµ·å¾ç¹ï¼æ¯æ5000å
ï¼ |
| | | */ |
| | | private static final BigDecimal TAX_THRESHOLD = new BigDecimal("5000"); |
| | | |
| | | /** |
| | | * é»è®¤ç¼´çº³æ¯ä¾ï¼å½åå·¥ç¤¾ä¿æ¡£æ¡ä¸æ²¡æé
ç½®ææ¹æ¡ä¸æ²¡æé
ç½®æ¶ä½¿ç¨ï¼ |
| | | */ |
| | | private static final BigDecimal DEFAULT_PENSION_PERSONAL_RATIO = new BigDecimal("0.08"); |
| | | private static final BigDecimal DEFAULT_MEDICAL_PERSONAL_RATIO = new BigDecimal("0.02"); |
| | | private static final BigDecimal DEFAULT_UNEMPLOYMENT_PERSONAL_RATIO = new BigDecimal("0.005"); |
| | | private static final BigDecimal DEFAULT_HOUSING_FUND_PERSONAL_RATIO = new BigDecimal("0.12"); |
| | | |
| | | @Resource |
| | | private HrmSalaryCalculationMapper salaryCalculationMapper; |
| | | @Resource |
| | | private HrmEmployeeSalaryMapper employeeSalaryMapper; |
| | | @Resource |
| | | private HrmEmployeeMapper employeeMapper; |
| | | @Resource |
| | | private HrmEmployeeSocialSecurityMapper employeeSocialSecurityMapper; |
| | | @Resource |
| | | private HrmSocialSecuritySchemeMapper socialSecuritySchemeMapper; |
| | | @Resource |
| | | private HrmNoRedisDAO noRedisDAO; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | | @Resource |
| | | private HrmDeductionService deductionService; |
| | | @Resource |
| | | private HrmLeaveApplicationMapper leaveApplicationMapper; |
| | | @Resource |
| | | private HrmLeaveTypeConfigMapper leaveTypeConfigMapper; |
| | | @Resource |
| | | private HrmSalaryPaymentMapper salaryPaymentMapper; |
| | | @Resource |
| | | private HrmSalaryPaymentDetailMapper salaryPaymentDetailMapper; |
| | | |
| | | @Override |
| | | public PageResult<HrmSalaryCalculationDO> getSalaryCalculationPage(HrmSalaryCalculationPageReqVO pageReqVO) { |
| | | return salaryCalculationMapper.selectPage(pageReqVO); |
| | | } |
| | | |
| | | @Override |
| | | public HrmSalaryCalculationDO getSalaryCalculation(Long id) { |
| | | return salaryCalculationMapper.selectById(id); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void calculateSalary(String period) { |
| | | calculateSalary(period, null); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void calculateSalary(String period, Long deptId) { |
| | | // è§£ææ ¸ç®å¨æçæ¥æ |
| | | LocalDate effectiveDate = parsePeriodToDate(period); |
| | | |
| | | // 1. è·åææå¨èåå·¥ï¼åå·¥ç¶æï¼1-å¨èï¼2-è¯ç¨ï¼ |
| | | List<HrmEmployeeDO> employees = employeeMapper.selectListByStatus(null); |
| | | // è¿æ»¤å¨èåè¯ç¨æåå·¥ |
| | | employees = employees.stream() |
| | | .filter(e -> e.getEmployeeStatus() != null |
| | | && (e.getEmployeeStatus() == 1 || e.getEmployeeStatus() == 2)) |
| | | .filter(e -> deptId == null || deptId.equals(e.getDeptId())) |
| | | .toList(); |
| | | |
| | | // 2. éååå·¥è¿è¡èªé
¬æ ¸ç® |
| | | for (HrmEmployeeDO employee : employees) { |
| | | // employeeId æ¯åå·¥IDï¼ç¨äºå
³èèªé
¬æ¡£æ¡ãç¤¾ä¿æ¡£æ¡ãæ ¸ç®è®°å½ |
| | | Long employeeId = employee.getId(); |
| | | // 2.1 æ£æ¥è¯¥å工彿æ¯å¦å·²å卿 ¸ç®è®°å½ï¼æåå·¥IDæ¥è¯¢ï¼ |
| | | List<HrmSalaryCalculationDO> existCalculations = salaryCalculationMapper.selectListByUserIdAndPeriod(employeeId, period); |
| | | if (CollUtil.isNotEmpty(existCalculations)) { |
| | | // 妿åå¨å¤æ¡è®°å½ï¼æç¤ºå¼å¸¸æ°æ® |
| | | if (existCalculations.size() > 1) { |
| | | throw exception(SALARY_CALCULATION_DUPLICATE, employee.getName(), period); |
| | | } |
| | | continue; // å·²åå¨åè·³è¿ |
| | | } |
| | | |
| | | // 2.2 è·ååå·¥èªé
¬æ¡£æ¡ï¼æåå·¥IDæ¥è¯¢ï¼ |
| | | HrmEmployeeSalaryDO employeeSalary = employeeSalaryMapper.selectLatestByUserId(employeeId); |
| | | if (employeeSalary == null) { |
| | | // å¦ææ²¡æèªé
¬æ¡£æ¡ï¼ä½¿ç¨å工表ä¸çåºæ¬å·¥èµå建é»è®¤æ°æ® |
| | | employeeSalary = buildDefaultEmployeeSalary(employeeId, employee); |
| | | } |
| | | |
| | | // 2.3 è·åå工社ä¿å
¬ç§¯éæ¡£æ¡ï¼æåå·¥IDæ¥è¯¢ï¼åææ°çæçï¼ |
| | | HrmEmployeeSocialSecurityDO socialSecurity = employeeSocialSecurityMapper.selectLatestByUserId(employeeId); |
| | | // 2.4 妿æç¤¾ä¿æ¡£æ¡ï¼è·åç»å®çæ¹æ¡ |
| | | HrmSocialSecuritySchemeDO scheme = null; |
| | | if (socialSecurity != null && socialSecurity.getSocialSecuritySchemeId() != null) { |
| | | scheme = socialSecuritySchemeMapper.selectById(socialSecurity.getSocialSecuritySchemeId()); |
| | | } |
| | | |
| | | // 2.5 æå»ºæ ¸ç®è®°å½ï¼å
嫿£é¤è®¡ç®ï¼éè¿æ¹æ¡è·åæ¯ä¾ï¼ |
| | | HrmSalaryCalculationDO calculation = buildSalaryCalculation(period, employeeId, employee, employeeSalary, socialSecurity, scheme, effectiveDate); |
| | | |
| | | // 2.6 çææ ¸ç®åå· |
| | | String no = noRedisDAO.generateSalaryCalculationNo(); |
| | | while (salaryCalculationMapper.selectByNo(no) != null) { |
| | | no = noRedisDAO.generateSalaryCalculationNo(); |
| | | } |
| | | calculation.setNo(no); |
| | | |
| | | // 2.7 ä¿åæ ¸ç®è®°å½ |
| | | salaryCalculationMapper.insert(calculation); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è§£ææ ¸ç®å¨æä¸ºæ¥æï¼å¦ 2024-01 -> 2024-01-01ï¼ |
| | | */ |
| | | private LocalDate parsePeriodToDate(String period) { |
| | | String[] parts = period.split("-"); |
| | | int year = Integer.parseInt(parts[0]); |
| | | int month = Integer.parseInt(parts[1]); |
| | | return LocalDate.of(year, month, 1); |
| | | } |
| | | |
| | | /** |
| | | * æå»ºé»è®¤çåå·¥èªé
¬æ¡£æ¡ï¼åºäºå工表çåºæ¬å·¥èµï¼ |
| | | */ |
| | | private HrmEmployeeSalaryDO buildDefaultEmployeeSalary(Long employeeId, HrmEmployeeDO employee) { |
| | | return HrmEmployeeSalaryDO.builder() |
| | | .userId(employeeId) // 使ç¨åå·¥ID |
| | | .salaryStructureId(employee.getSalaryStructureId()) |
| | | .baseSalary(employee.getBaseSalary() != null ? employee.getBaseSalary() : BigDecimal.ZERO) |
| | | .performanceSalary(BigDecimal.ZERO) |
| | | .mealAllowance(BigDecimal.ZERO) |
| | | .transportAllowance(BigDecimal.ZERO) |
| | | .otherAllowance(BigDecimal.ZERO) |
| | | .status(0) |
| | | .build(); |
| | | } |
| | | |
| | | /** |
| | | * æå»ºèªé
¬æ ¸ç®è®°å½ï¼å
å«ç¤¾ä¿ãå
¬ç§¯éã个ç¨ãè¯·åæ£é¤è®¡ç®ï¼ |
| | | * éè¿åå·¥ç¤¾ä¿æ¡£æ¡ç»å®çæ¹æ¡è·å缴纳æ¯ä¾ |
| | | */ |
| | | private HrmSalaryCalculationDO buildSalaryCalculation(String period, Long employeeId, HrmEmployeeDO employee, |
| | | HrmEmployeeSalaryDO employeeSalary, |
| | | HrmEmployeeSocialSecurityDO socialSecurity, |
| | | HrmSocialSecuritySchemeDO scheme, |
| | | LocalDate effectiveDate) { |
| | | // 计ç®åºåèªèµ |
| | | BigDecimal baseSalary = employeeSalary.getBaseSalary() != null ? employeeSalary.getBaseSalary() : BigDecimal.ZERO; |
| | | BigDecimal performanceSalary = employeeSalary.getPerformanceSalary() != null ? employeeSalary.getPerformanceSalary() : BigDecimal.ZERO; |
| | | BigDecimal mealAllowance = employeeSalary.getMealAllowance() != null ? employeeSalary.getMealAllowance() : BigDecimal.ZERO; |
| | | BigDecimal transportAllowance = employeeSalary.getTransportAllowance() != null ? employeeSalary.getTransportAllowance() : BigDecimal.ZERO; |
| | | BigDecimal otherAllowance = employeeSalary.getOtherAllowance() != null ? employeeSalary.getOtherAllowance() : BigDecimal.ZERO; |
| | | BigDecimal overtimePay = BigDecimal.ZERO; |
| | | |
| | | // åºåå·¥èµæ»é¢ |
| | | BigDecimal totalIncome = baseSalary.add(performanceSalary).add(mealAllowance) |
| | | .add(transportAllowance).add(otherAllowance).add(overtimePay); |
| | | |
| | | // è·å社ä¿åºæ°ï¼å工档æ¡ä¸ç个æ§ååºæ°ï¼ |
| | | BigDecimal socialSecurityBase = (socialSecurity != null && socialSecurity.getSocialSecurityBase() != null) |
| | | ? socialSecurity.getSocialSecurityBase() : baseSalary; |
| | | |
| | | // è·åå
¬ç§¯éåºæ°ï¼å工档æ¡ä¸ç个æ§ååºæ°ï¼ |
| | | BigDecimal housingFundBase = (socialSecurity != null && socialSecurity.getHousingFundBase() != null) |
| | | ? socialSecurity.getHousingFundBase() : baseSalary; |
| | | |
| | | // 仿¹æ¡ä¸è·å缴纳æ¯ä¾ï¼ä¼å
ä½¿ç¨æ¹æ¡ä¸çæ¯ä¾ï¼å¦å使ç¨é»è®¤æ¯ä¾ï¼ |
| | | BigDecimal pensionPersonalRatio = (scheme != null && scheme.getPensionPersonalRatio() != null) |
| | | ? scheme.getPensionPersonalRatio() : DEFAULT_PENSION_PERSONAL_RATIO; |
| | | BigDecimal medicalPersonalRatio = (scheme != null && scheme.getMedicalPersonalRatio() != null) |
| | | ? scheme.getMedicalPersonalRatio() : DEFAULT_MEDICAL_PERSONAL_RATIO; |
| | | BigDecimal unemploymentPersonalRatio = (scheme != null && scheme.getUnemploymentPersonalRatio() != null) |
| | | ? scheme.getUnemploymentPersonalRatio() : DEFAULT_UNEMPLOYMENT_PERSONAL_RATIO; |
| | | BigDecimal housingFundPersonalRatio = (scheme != null && scheme.getHousingFundPersonalRatio() != null) |
| | | ? scheme.getHousingFundPersonalRatio() : DEFAULT_HOUSING_FUND_PERSONAL_RATIO; |
| | | |
| | | // ç¤¾ä¿æ£é¤ = åºæ° à (å
»è个人æ¯ä¾ + å»ç个人æ¯ä¾ + 失ä¸ä¸ªäººæ¯ä¾) |
| | | BigDecimal socialSecurityDeduction = socialSecurityBase |
| | | .multiply(pensionPersonalRatio) |
| | | .add(socialSecurityBase.multiply(medicalPersonalRatio)) |
| | | .add(socialSecurityBase.multiply(unemploymentPersonalRatio)) |
| | | .setScale(2, RoundingMode.HALF_UP); |
| | | |
| | | // å
¬ç§¯éæ£é¤ = åºæ° à å
¬ç§¯é个人æ¯ä¾ |
| | | BigDecimal housingFundDeduction = housingFundBase.multiply(housingFundPersonalRatio).setScale(2, RoundingMode.HALF_UP); |
| | | |
| | | // 计ç®è¯·åæ£æ¬¾ |
| | | BigDecimal leaveDeduction = calculateLeaveDeduction(employee, period, baseSalary); |
| | | |
| | | // 计ç®ä¸ªç¨æ£é¤ |
| | | // åºçº³ç¨æå¾é¢ = åºåå·¥èµ - ç¤¾ä¿æ£é¤ - å
¬ç§¯éæ£é¤ - èµ·å¾ç¹(5000) |
| | | BigDecimal taxableIncome = totalIncome |
| | | .subtract(socialSecurityDeduction) |
| | | .subtract(housingFundDeduction) |
| | | .subtract(TAX_THRESHOLD); |
| | | // 妿åºçº³ç¨æå¾é¢å°äº0ï¼åä¸ç¼´çº³ä¸ªç¨ |
| | | if (taxableIncome.compareTo(BigDecimal.ZERO) < 0) { |
| | | taxableIncome = BigDecimal.ZERO; |
| | | } |
| | | BigDecimal taxDeduction = deductionService.calculateTaxDeduction(taxableIncome, effectiveDate); |
| | | |
| | | BigDecimal otherDeduction = BigDecimal.ZERO; |
| | | |
| | | // 计ç®å®åå·¥èµ = åºå - æ£é¤ |
| | | BigDecimal totalDeduction = socialSecurityDeduction.add(housingFundDeduction) |
| | | .add(taxDeduction).add(otherDeduction).add(leaveDeduction); |
| | | BigDecimal actualSalary = totalIncome.subtract(totalDeduction); |
| | | |
| | | return HrmSalaryCalculationDO.builder() |
| | | .period(period) |
| | | .userId(employeeId) // 使ç¨åå·¥ID |
| | | .deptId(employee.getDeptId()) |
| | | .baseSalary(baseSalary) |
| | | .performanceSalary(performanceSalary) |
| | | .overtimePay(overtimePay) |
| | | .mealAllowance(mealAllowance) |
| | | .transportAllowance(transportAllowance) |
| | | .otherAllowance(otherAllowance) |
| | | .socialSecurityDeduction(socialSecurityDeduction) |
| | | .housingFundDeduction(housingFundDeduction) |
| | | .taxDeduction(taxDeduction) |
| | | .otherDeduction(otherDeduction) |
| | | .leaveDeduction(leaveDeduction) |
| | | .actualSalary(actualSalary) |
| | | .workDays(22) // é»è®¤å·¥ä½æ¥ |
| | | .overtimeHours(BigDecimal.ZERO) |
| | | .status(0) // å¾
确认 |
| | | .build(); |
| | | } |
| | | |
| | | /** |
| | | * 计ç®è¯·åæ£æ¬¾ |
| | | * |
| | | * @param employee åå·¥ä¿¡æ¯ |
| | | * @param period æ ¸ç®å¨æï¼å¦2026-02ï¼ |
| | | * @param baseSalary åºæ¬å·¥èµ |
| | | * @return è¯·åæ£æ¬¾éé¢ |
| | | */ |
| | | private BigDecimal calculateLeaveDeduction(HrmEmployeeDO employee, String period, BigDecimal baseSalary) { |
| | | // è§£æå¨æè·åæä»½å¼å§åç»ææ¶é´ |
| | | YearMonth yearMonth = YearMonth.parse(period); |
| | | LocalDateTime monthStart = yearMonth.atDay(1).atStartOfDay(); |
| | | LocalDateTime monthEnd = yearMonth.atEndOfMonth().atTime(23, 59, 59); |
| | | |
| | | // æ¥è¯¢åå·¥å¨è¯¥æå·²å®¡æ¹éè¿ç请åè®°å½ |
| | | // 注æï¼è¯·åç³è¯·ç userId æ¯ç³»ç»ç¨æ·IDï¼éè¦éè¿å工表è·å |
| | | Long systemUserId = employee.getUserId(); |
| | | if (systemUserId == null) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | List<HrmLeaveApplicationDO> leaveApplications = leaveApplicationMapper |
| | | .selectApprovedListByUserIdAndTimeRange(systemUserId, monthStart, monthEnd); |
| | | |
| | | if (leaveApplications.isEmpty()) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | // è·åææè¯·åç±»åé
ç½® |
| | | List<HrmLeaveTypeConfigDO> configList = leaveTypeConfigMapper.selectList(); |
| | | Map<Integer, BigDecimal> configMap = configList.stream() |
| | | .filter(c -> c.getStatus() == 0) // åªåå¯ç¨çé
ç½® |
| | | .collect(Collectors.toMap(HrmLeaveTypeConfigDO::getLeaveType, HrmLeaveTypeConfigDO::getDeductionRatio)); |
| | | |
| | | // è®¡ç®æ¥å·¥èµï¼åºæ¬å·¥èµ / 21.75ï¼æå½å®¶è§å®ç工使¥è®¡ç®ï¼ |
| | | BigDecimal dailySalary = baseSalary.divide(new BigDecimal("21.75"), 2, RoundingMode.HALF_UP); |
| | | |
| | | // ç´¯è®¡è¯·åæ£æ¬¾ |
| | | BigDecimal totalLeaveDeduction = BigDecimal.ZERO; |
| | | for (HrmLeaveApplicationDO application : leaveApplications) { |
| | | Integer leaveType = application.getLeaveType(); |
| | | BigDecimal duration = application.getDuration() != null ? application.getDuration() : BigDecimal.ZERO; |
| | | BigDecimal deductionRatio = configMap.getOrDefault(leaveType, BigDecimal.ZERO); |
| | | |
| | | // è¯·åæ£æ¬¾ = æ¥å·¥èµ à 请åå¤©æ° Ã æ£æ¬¾æ¯ä¾ |
| | | BigDecimal deduction = dailySalary.multiply(duration).multiply(deductionRatio) |
| | | .setScale(2, RoundingMode.HALF_UP); |
| | | totalLeaveDeduction = totalLeaveDeduction.add(deduction); |
| | | } |
| | | |
| | | return totalLeaveDeduction; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void confirmSalaryCalculation(List<Long> ids) { |
| | | if (ids == null || ids.isEmpty()) { |
| | | return; |
| | | } |
| | | LocalDateTime confirmTime = LocalDateTime.now(); |
| | | String period = null; |
| | | for (Long id : ids) { |
| | | HrmSalaryCalculationDO salaryCalculation = salaryCalculationMapper.selectById(id); |
| | | if (salaryCalculation == null) { |
| | | throw exception(SALARY_CALCULATION_NOT_EXISTS); |
| | | } |
| | | if (salaryCalculation.getStatus() != 0) { |
| | | throw exception(SALARY_CALCULATION_CONFIRM_FAIL); |
| | | } |
| | | salaryCalculation.setStatus(10); // 已确认 |
| | | salaryCalculation.setConfirmTime(confirmTime); |
| | | salaryCalculationMapper.updateById(salaryCalculation); |
| | | // è®°å½å¨æ |
| | | period = salaryCalculation.getPeriod(); |
| | | } |
| | | |
| | | // æ£æ¥è¯¥å¨ææ¯å¦æææ ¸ç®è®°å½é½å·²ç¡®è®¤ï¼èªå¨çæåæ¾å°è´¦ |
| | | if (period != null) { |
| | | autoGeneratePaymentIfAllConfirmed(period); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ£æ¥è¯¥å¨ææ¯å¦æææ ¸ç®è®°å½é½å·²ç¡®è®¤ï¼å¦æå
¨é¨ç¡®è®¤åèªå¨çæåæ¾å°è´¦ |
| | | */ |
| | | private void autoGeneratePaymentIfAllConfirmed(String period) { |
| | | // æ¥è¯¢è¯¥å¨ææææ ¸ç®è®°å½ |
| | | List<HrmSalaryCalculationDO> allCalculations = salaryCalculationMapper.selectListByPeriod(period); |
| | | if (CollUtil.isEmpty(allCalculations)) { |
| | | return; |
| | | } |
| | | // æ£æ¥æ¯å¦å
¨é¨å·²ç¡®è®¤ï¼ç¶æ=10ï¼ |
| | | boolean allConfirmed = allCalculations.stream() |
| | | .allMatch(c -> c.getStatus() == 10); |
| | | if (!allConfirmed) { |
| | | return; |
| | | } |
| | | // æ£æ¥æ¯å¦å·²åå¨åæ¾å°è´¦ |
| | | HrmSalaryPaymentDO existPayment = salaryPaymentMapper.selectByPeriod(period); |
| | | if (existPayment != null) { |
| | | return; |
| | | } |
| | | // èªå¨çæåæ¾å°è´¦ |
| | | generatePaymentInternal(period, allCalculations); |
| | | } |
| | | |
| | | private HrmSalaryCalculationDO validateSalaryCalculationExists(Long id) { |
| | | HrmSalaryCalculationDO salaryCalculation = salaryCalculationMapper.selectById(id); |
| | | if (salaryCalculation == null) { |
| | | throw exception(SALARY_CALCULATION_NOT_EXISTS); |
| | | } |
| | | return salaryCalculation; |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmSalaryCalculationDO> getSalaryCalculationListByPeriod(String period) { |
| | | return salaryCalculationMapper.selectListByPeriod(period); |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmSalaryCalculationDO> previewSalaryCalculation(String period, Long deptId) { |
| | | // è§£ææ ¸ç®å¨æçæ¥æ |
| | | LocalDate effectiveDate = parsePeriodToDate(period); |
| | | |
| | | // 1. è·åææå¨èåå·¥ï¼åå·¥ç¶æï¼1-å¨èï¼2-è¯ç¨ï¼ |
| | | List<HrmEmployeeDO> employees = employeeMapper.selectListByStatus(null); |
| | | // è¿æ»¤å¨èåè¯ç¨æåå·¥ |
| | | employees = employees.stream() |
| | | .filter(e -> e.getEmployeeStatus() != null |
| | | && (e.getEmployeeStatus() == 1 || e.getEmployeeStatus() == 2)) |
| | | .filter(e -> deptId == null || deptId.equals(e.getDeptId())) |
| | | .toList(); |
| | | |
| | | // 2. éåå工宿¶è®¡ç®èªé
¬ |
| | | List<HrmSalaryCalculationDO> resultList = new java.util.ArrayList<>(); |
| | | for (HrmEmployeeDO employee : employees) { |
| | | Long employeeId = employee.getId(); |
| | | |
| | | // 2.1 è·ååå·¥èªé
¬æ¡£æ¡ï¼æåå·¥IDæ¥è¯¢ï¼ |
| | | HrmEmployeeSalaryDO employeeSalary = employeeSalaryMapper.selectLatestByUserId(employeeId); |
| | | if (employeeSalary == null) { |
| | | // å¦ææ²¡æèªé
¬æ¡£æ¡ï¼ä½¿ç¨å工表ä¸çåºæ¬å·¥èµå建é»è®¤æ°æ® |
| | | employeeSalary = buildDefaultEmployeeSalary(employeeId, employee); |
| | | } |
| | | |
| | | // 2.2 è·åå工社ä¿å
¬ç§¯éæ¡£æ¡ï¼æåå·¥IDæ¥è¯¢ï¼åææ°çæçï¼ |
| | | HrmEmployeeSocialSecurityDO socialSecurity = employeeSocialSecurityMapper.selectLatestByUserId(employeeId); |
| | | // 2.3 妿æç¤¾ä¿æ¡£æ¡ï¼è·åç»å®çæ¹æ¡ |
| | | HrmSocialSecuritySchemeDO scheme = null; |
| | | if (socialSecurity != null && socialSecurity.getSocialSecuritySchemeId() != null) { |
| | | scheme = socialSecuritySchemeMapper.selectById(socialSecurity.getSocialSecuritySchemeId()); |
| | | } |
| | | |
| | | // 2.4 æå»ºæ ¸ç®è®°å½ï¼å®æ¶è®¡ç®ï¼ä¸åå¨ï¼ |
| | | HrmSalaryCalculationDO calculation = buildSalaryCalculation(period, employeeId, employee, employeeSalary, socialSecurity, scheme, effectiveDate); |
| | | resultList.add(calculation); |
| | | } |
| | | return resultList; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void saveSalaryCalculationList(List<HrmSalaryCalculationDO> calculationList) { |
| | | for (HrmSalaryCalculationDO calculation : calculationList) { |
| | | if (calculation.getId() == null) { |
| | | // æ°å¢è®°å½ï¼çææ ¸ç®åå· |
| | | String no = noRedisDAO.generateSalaryCalculationNo(); |
| | | while (salaryCalculationMapper.selectByNo(no) != null) { |
| | | no = noRedisDAO.generateSalaryCalculationNo(); |
| | | } |
| | | calculation.setNo(no); |
| | | calculation.setStatus(0); // å¾
确认 |
| | | salaryCalculationMapper.insert(calculation); |
| | | } else { |
| | | // æ´æ°å·²æè®°å½ |
| | | salaryCalculationMapper.updateById(calculation); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å
é¨çæåæ¾å°è´¦æ¹æ³ï¼ä¾èªå¨çæè°ç¨ï¼ |
| | | */ |
| | | private void generatePaymentInternal(String period, List<HrmSalaryCalculationDO> calculationList) { |
| | | // çæåæ¾å°è´¦ |
| | | String no = generatePaymentNo(); |
| | | BigDecimal totalAmount = calculationList.stream() |
| | | .map(c -> c.getActualSalary() != null ? c.getActualSalary() : BigDecimal.ZERO) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | Integer totalCount = calculationList.size(); |
| | | |
| | | HrmSalaryPaymentDO payment = HrmSalaryPaymentDO.builder() |
| | | .no(no) |
| | | .period(period) |
| | | .totalAmount(totalAmount) |
| | | .totalCount(totalCount) |
| | | .status(0) // å¾
åæ¾ |
| | | .build(); |
| | | salaryPaymentMapper.insert(payment); |
| | | |
| | | // çæåæ¾æç»ï¼ä¸æ´æ°æ ¸ç®ç¶æï¼ |
| | | for (HrmSalaryCalculationDO calculation : calculationList) { |
| | | HrmSalaryPaymentDetailDO detail = HrmSalaryPaymentDetailDO.builder() |
| | | .paymentId(payment.getId()) |
| | | .calculationId(calculation.getId()) |
| | | .userId(calculation.getUserId()) |
| | | .deptId(calculation.getDeptId()) |
| | | .actualSalary(calculation.getActualSalary()) |
| | | .status(0) // å¾
åæ¾ |
| | | .build(); |
| | | salaryPaymentDetailMapper.insert(detail); |
| | | } |
| | | } |
| | | |
| | | private String generatePaymentNo() { |
| | | String no = noRedisDAO.generateSalaryPaymentNo(); |
| | | while (salaryPaymentMapper.selectByNo(no) != null) { |
| | | no = noRedisDAO.generateSalaryPaymentNo(); |
| | | } |
| | | return no; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void revokeSalaryCalculation(List<Long> ids) { |
| | | if (ids == null || ids.isEmpty()) { |
| | | return; |
| | | } |
| | | for (Long id : ids) { |
| | | HrmSalaryCalculationDO calculation = salaryCalculationMapper.selectById(id); |
| | | if (calculation == null) { |
| | | throw exception(SALARY_CALCULATION_NOT_EXISTS); |
| | | } |
| | | // æ ¡éªç¶æå¿
é¡»æ¯å·²ç¡®è®¤(10) |
| | | if (calculation.getStatus() != 10) { |
| | | throw exception(SALARY_CALCULATION_REVOKE_FAIL); |
| | | } |
| | | // æ£æ¥æ¯å¦å·²åæ¾ï¼ç¶æ=20ï¼ |
| | | if (calculation.getStatus() == 20) { |
| | | throw exception(SALARY_CALCULATION_ALREADY_PAY); |
| | | } |
| | | // å é¤å
³èçåæ¾æç» |
| | | HrmSalaryPaymentDetailDO detail = salaryPaymentDetailMapper.selectByCalculationId(id); |
| | | if (detail != null) { |
| | | // 妿æç»å·²åæ¾ï¼ä¸å
许æ¤é |
| | | if (detail.getStatus() == 10) { |
| | | throw exception(SALARY_CALCULATION_ALREADY_PAY); |
| | | } |
| | | salaryPaymentDetailMapper.deleteById(detail.getId()); |
| | | // æ´æ°åæ¾å°è´¦çæ»éé¢åæ»äººæ° |
| | | updatePaymentStatistics(detail.getPaymentId()); |
| | | } |
| | | // æ¢å¤æ ¸ç®ç¶æä¸ºå¾
确认 |
| | | calculation.setStatus(0); |
| | | calculation.setConfirmTime(null); |
| | | salaryCalculationMapper.updateById(calculation); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°åæ¾å°è´¦çç»è®¡ä¿¡æ¯ |
| | | */ |
| | | private void updatePaymentStatistics(Long paymentId) { |
| | | HrmSalaryPaymentDO payment = salaryPaymentMapper.selectById(paymentId); |
| | | if (payment == null) { |
| | | return; |
| | | } |
| | | // éæ°è®¡ç®æ»éé¢åæ»äººæ° |
| | | List<HrmSalaryPaymentDetailDO> details = salaryPaymentDetailMapper.selectListByPaymentId(paymentId); |
| | | if (CollUtil.isEmpty(details)) { |
| | | // å¦ææ²¡ææç»äºï¼å é¤åæ¾å°è´¦ |
| | | salaryPaymentMapper.deleteById(paymentId); |
| | | return; |
| | | } |
| | | BigDecimal totalAmount = details.stream() |
| | | .map(d -> d.getActualSalary() != null ? d.getActualSalary() : BigDecimal.ZERO) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | payment.setTotalAmount(totalAmount); |
| | | payment.setTotalCount(details.size()); |
| | | salaryPaymentMapper.updateById(payment); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void deleteSalaryCalculation(Long id) { |
| | | HrmSalaryCalculationDO calculation = salaryCalculationMapper.selectById(id); |
| | | if (calculation == null) { |
| | | throw exception(SALARY_CALCULATION_NOT_EXISTS); |
| | | } |
| | | // ä»
å¾
ç¡®è®¤ç¶æå¯å é¤ |
| | | if (calculation.getStatus() != 0) { |
| | | throw exception(SALARY_CALCULATION_DELETE_FAIL); |
| | | } |
| | | salaryCalculationMapper.deleteById(id); |
| | | } |
| | | |
| | | } |
| yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryPaymentService.java
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryPaymentServiceImpl.java
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSocialSecurityConfigService.java
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSocialSecurityConfigServiceImpl.java
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSocialSecuritySchemeService.java
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSocialSecuritySchemeServiceImpl.java
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmTaxRateConfigService.java
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmTaxRateConfigServiceImpl.java
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/util/HrmAuditStatusUtils.java
yudao-module-mes/pom.xml
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/WmsStockApiImpl.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/wms/WmsTransactionApiImpl.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeSaveReqVO.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockListReqVO.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wms/approval/WmsApprovalController.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesDO.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/transfer/MesWmTransferDO.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wms/approval/WmsWarehouseApprovalConfigDO.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/stocktaking/task/MesWmStockTakingTaskResultMapper.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wms/approval/WmsWarehouseApprovalConfigMapper.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/WmStatusTransitionUtils.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesService.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultService.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskResultServiceImpl.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskService.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferService.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferServiceImpl.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wms/approval/WmsApprovalService.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wms/approval/WmsApprovalServiceImpl.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wms/approval/listener/WmsInboundStatusListener.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wms/approval/listener/WmsOutboundStatusListener.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wms/approval/listener/WmsTransferStatusListener.java
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/AdminUserCreateReqDTO.java
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java
yudao-module-wms-api/pom.xml
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsPurchaseInboundReqDTO.java
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsSalesOutboundReqDTO.java
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsStockDetailRespDTO.java
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/dto/WmsStockQueryReqDTO.java
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/stock/WmsStockApi.java
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/transaction/WmsTransactionApi.java
yudao-module-wms-api/src/main/java/cn/iocoder/yudao/module/wms/api/transaction/WmsTransactionCreateReqDTO.java
yudao-server/pom.xml |